Preciso transformar essa função local em uma função global!

Delphi

03/04/2017

Bom dia.

a função logo abaixo é utilizada em pelo menos 18 form´s diferentes (Clientes, fornecedores, cheques, notas, etc), a ideia é torna-la uma função global.

function tFrmCadClientes.Checa_campoCNPJCPF() : boolean;
begin
inherited;
result := true;
if checa_cgccpf ( trim (DBCNPJCPF.Text) ) = false then
begin
Application.MessageBox('CNPJ/CPF Inválido !!','Erro',MB_OK + MB_ICONERROR);
DBCNPJCPF.setfocus;
result := false;
end
else
begin
if DBCNPJCPF.text <> '00000000000000' then
begin
FDPesqCNPJCPFDuplicado.active := false;
FDPesqCNPJCPFDuplicado.ParamByName('pesqcnpjcpf').AsString := FDCadPadraoCL_CNPJ_CPF.Value;
FDPesqCNPJCPFDuplicado.ParamByName('pesqnumero').value := FDCadPadraoCL_NUMERO.value;
FDPesqCNPJCPFDuplicado.Active := True;

if FDPesqCNPJCPFDuplicadoREG_ENCONTRADOS.value > 0 then
begin
if Application.MessageBox('CNPJ/CPF já cadastrado.','Aviso',MB_OK + MB_ICONINFORMATION) = idOK then
begin
DBCNPJCPF.setfocus;
result := false;
end;

end;
end;
end;
end;
Emanuel Gonçalves

Emanuel Gonçalves

Curtidas 0

Respostas

Cleyton Caetano

Cleyton Caetano

03/04/2017

function tFrmCadClientes.Checa_campoCNPJCPF() : boolean;
begin
inherited;
result := true;
if checa_cgccpf ( trim (DBCNPJCPF.Text) ) = false then
begin
Application.MessageBox('CNPJ/CPF Inválido !!','Erro',MB_OK + MB_ICONERROR);
DBCNPJCPF.setfocus;
result := false;
end
else
begin
if DBCNPJCPF.text <> '00000000000000' then
begin
FDPesqCNPJCPFDuplicado.active := false;
FDPesqCNPJCPFDuplicado.ParamByName('pesqcnpjcpf').AsString := FDCadPadraoCL_CNPJ_CPF.Value;
FDPesqCNPJCPFDuplicado.ParamByName('pesqnumero').value := FDCadPadraoCL_NUMERO.value;
FDPesqCNPJCPFDuplicado.Active := True;
if FDPesqCNPJCPFDuplicadoREG_ENCONTRADOS.value > 0 then
begin
if Application.MessageBox('CNPJ/CPF já cadastrado.','Aviso',MB_OK + MB_ICONINFORMATION) = idOK then
begin
DBCNPJCPF.setfocus;
result := false;
end;
end;
end;
end;
end;
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

03/04/2017

function tFrmCadClientes.Checa_campoCNPJCPF() : boolean;
begin
inherited;
result := true;
if checa_cgccpf ( trim (DBCNPJCPF.Text) ) = false then
begin
Application.MessageBox('CNPJ/CPF Inválido !!','Erro',MB_OK + MB_ICONERROR);
DBCNPJCPF.setfocus;
result := false;
end
else
begin
if DBCNPJCPF.text <> '00000000000000' then
begin
FDPesqCNPJCPFDuplicado.active := false;
FDPesqCNPJCPFDuplicado.ParamByName('pesqcnpjcpf').AsString := FDCadPadraoCL_CNPJ_CPF.Value;
FDPesqCNPJCPFDuplicado.ParamByName('pesqnumero').value := FDCadPadraoCL_NUMERO.value;
FDPesqCNPJCPFDuplicado.Active := True;
if FDPesqCNPJCPFDuplicadoREG_ENCONTRADOS.value > 0 then
begin
if Application.MessageBox('CNPJ/CPF já cadastrado.','Aviso',MB_OK + MB_ICONINFORMATION) = idOK then
begin
DBCNPJCPF.setfocus;
result := false;
end;
end;
end;
end;
end;




Cleyton ??
GOSTEI 0
Cleyton Caetano

Cleyton Caetano

03/04/2017

Fica melhor pra ver o código assim!
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

03/04/2017

Legal Cleyton.

Então, a ideia é generalizar a função, os parâmetros recebem valores de dataset´s diferentes
GOSTEI 0
Mateus Ribeiro

Mateus Ribeiro

03/04/2017

Bom dia! Declara a função na sessão "PUBLIC" do seu form PRINCIPAL, e nas outras janelas você chama a função: frmPrincipal.Checa_campoCNPJCPF

Para a função poder ser chamada, o form onde ela está precisa estar criada... por isso não aconselho você fixar ela no "frmCadCliente", e sim em um form que sempre estará aberto, no caso o seu form principal!
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

03/04/2017

Bom dia! Declara a função na sessão "PUBLIC" do seu form PRINCIPAL, e nas outras janelas você chama a função: frmPrincipal.Checa_campoCNPJCPF

Para a função poder ser chamada, o form onde ela está precisa estar criada... por isso não aconselho você fixar ela no "frmCadCliente", e sim em um form que sempre estará aberto, no caso o seu form principal!


Mateus eu tenho uma Unit Funções e a ideia é colocar a função Checa_CampoCNPJCPF nessa Unit, o detalhe é que os form´s que usam essa função tem um dataset cada um com uma consulta SQL respectiva, ou seja.


Para clientes:

SELECT
    cast(count(*) as INTEGER)as Reg_Encontrados
FROM
    CLIENTES
WHERE 
    CL_CNPJ_CPF = :pesqcnpjcpf
    AND CL_NUMERO <> :pesqnumero



Para fornecedores:

SELECT
    cast(count(*)as INTEGER) as Reg_Encontrados
FROM
    FORNECEDORES
WHERE 
    F_CNPJCPF = :pesqcnpjcpf
    AND F_NUMERO <> :pesqnumero


Isso ocorre em varios outros Form´s, é possível notar que o comando SQL é o mesmo mudando apenas as tabelas e os respectivos campos.
Desse modo eu precisaria tornar a função mais genérica
GOSTEI 0
Mateus Ribeiro

Mateus Ribeiro

03/04/2017

Eu entendi, então será necessário adaptar sua função com a entrada de parâmetros!
Contudo, notei que sua função possui esses objetos "FDPesqCNPJCPFDuplicado, FDCadPadrao" engessados. Oq são eles? terão o mesmo nome em todos os forms? Bora adaptar essa tua função aí
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

03/04/2017

Sim Mateus, esses nomes se repetem


A coisa toda funciona assim

1º eu tenho form´s Padrão chamados de FrmCadPadrao, em cada form eu tenho um dataset padrão "FDCadPadrao", assim ao criar um form de cadastro de clientes eu vou herdar os detalhes do FrmCadPadrao, um desses detalhes é o dataset FDCadPadrao e como forma de organizar eu sempre uso a tabela principal de cada form nesse Dataset FDCadPadrao, assim nesse exemplo a tabela de clientes será chamada no FDCadPadrao

Exemplo

FDCadPadrao
SELECT
*
FROM
CLIENTES




2º é comum nesses form´s de cadastro utilizar outros Dataset´s, como por exemplo para acessar a tabelas de cidades. No nosso caso em questão eu tenho um dataset de mesmo nome FDPesqCNPJCPFDuplicado com comandos SQL quase idênticos.

3º pq quase idênticos ??
no form de cadastro de clientes a condição WHERE vai comparar os parâmetros aos respecitvos campos "Fields" da tabela de clientes, isso vai acontecer dentro da função Checa_campoCNPJCPF() atraves do parâmetros "pesqcnpjcpf" e "pesqnumero " .


FDPesqCNPJCPFDuplicado:----------------------------

SELECT
cast(count(*) as INTEGER)as Reg_Encontrados
FROM
CLIENTES
WHERE
CL_CNPJ_CPF = :pesqcnpjcpf
AND CL_NUMERO <> :pesqnumero
---------------------------------------------------


4º o item 3 se repete para cada um dos form´s que utilizam a função Checa_campoCNPJCPF(), cada um desses form´s também tem um dataset FDPesqCNPJCPFDuplicado, por exemplo para fornecedores, observe que a tabela é de fornecedores e os campos são F_CNPJCPF e F_NUMERO mas mantenho os mesmos parâmetros.
Desse modo a função Checa_campoCNPJCPF() no form de fornecedores seria quase idêntica a utilizada em clientes mudando apenas os campos que alimentam os parâmetros

FDPesqCNPJCPFDuplicado:----------------------------

SELECT
cast(count(*)as INTEGER) as Reg_Encontrados
FROM
FORNECEDORES
WHERE
F_CNPJCPF = :pesqcnpjcpf
AND F_NUMERO <> :pesqnumero
---------------------------------------------------


--------------------------------------------
função Checa_campoCNPJCPF() no form clientes
----------------------------------------------

function tFrmCadClientes.Checa_campoCNPJCPF() : boolean;
begin
inherited;
result := true;
if checa_cgccpf ( trim (DBCNPJCPF.Text) ) = false then
begin
Application.MessageBox('CNPJ/CPF Inválido !!','Erro',MB_OK + MB_ICONERROR);
DBCNPJCPF.setfocus;
result := false;
end
else
begin
if DBCNPJCPF.text <> '00000000000000' then
begin
FDPesqCNPJCPFDuplicado.active := false;
FDPesqCNPJCPFDuplicado.ParamByName('pesqcnpjcpf').AsString := FDCadPadraoCL_CNPJ_CPF.Value; <<<<<<<<
FDPesqCNPJCPFDuplicado.ParamByName('pesqnumero').value := FDCadPadraoCL_NUMERO.value; <<<<<<<<
FDPesqCNPJCPFDuplicado.Active := True;

if FDPesqCNPJCPFDuplicadoREG_ENCONTRADOS.value > 0 then
begin
if Application.MessageBox('CNPJ/CPF já cadastrado.','Aviso',MB_OK + MB_ICONINFORMATION) = idOK then
begin
DBCNPJCPF.setfocus;
result := false;
end;

end;
end;
end;
end;
---------------------------------------------

-------------------------------------------------
função Checa_campoCNPJCPF() no form fornecedores
-------------------------------------------------

function TFrmCadFornecedores.Checa_campoCNPJCPF() : boolean;
begin
inherited;
result := true;
if checa_cgccpf ( trim (DBCNPJCPF.Text) ) = false then
begin
Application.MessageBox('CNPJ/CPF Inválido !!','Erro', MB_OK + MB_ICONWARNING);
DBCNPJCPF.setfocus;
result := false;
end
else
begin
if DBCNPJCPF.text <> '00000000000000' then
begin
FDPesqCNPJCPFDuplicado.active := false;
FDPesqCNPJCPFDuplicado.ParamByName('pesqcnpjcpf').value := FDCadPadraoF_CNPJCPF.Value;
FDPesqCNPJCPFDuplicado.ParamByName('pesqnumero').value := FDCadPadraoF_NUMERO.value;
FDPesqCNPJCPFDuplicado.Active := True;

if FDPesqCNPJCPFDuplicadoREG_ENCONTRADOS.value > 0 then
begin
Application.MessageBox('CNPJ/CPF já cadastrado !!','Aviso', MB_OK + MB_ICONINFORMATION);
DBCNPJCPF.setfocus;
result := false;
end;
end;
end;
end;
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

03/04/2017

Alguém pode me dar uma dica ??

function Checa_campoCNPJCPF(DBEdit: TDBEdit; Dataset : TFDQuery; campoCNPJCPF, campoNumero : TStringField) : boolean;
begin
  inherited;
    result := true;
    if not checa_cgccpf (trim(DBedit.Text)) then
    begin
        Application.MessageBox('CNPJ/CPF Inválido !!','Erro',MB_OK + MB_ICONERROR);
        DBedit.setfocus;
        result := false;
    end
    else
    begin
        if DBedit.text <> '00000000000000' then
        begin
            Dataset.active := false;
            Dataset.ParamByName('pesqcnpjcpf').AsString := campoCNPJCPF.Value;
            Dataset.ParamByName('pesqnumero').value := campoNumero.value;
            Dataset.Active := True;

            if FDPesqCNPJCPFDuplicadoREG_ENCONTRADOS.value > 0 then                      <<<<<<<<<<<<<<<<<<<<<<<preciso generalizar 
            begin
                if Application.MessageBox('CNPJ/CPF já cadastrado.','Aviso',MB_OK + MB_ICONINFORMATION) = idOK then
                begin
                    DBedit.setfocus;
                    result := false;
                end;

            end;
        end;
    end;
end;




Preciso generalizar esse trecho FDPesqCNPJCPFDuplicadoREG_ENCONTRADOS na função
GOSTEI 0
Jose

Jose

03/04/2017

Você não precisa ter uma função em cada rotina/form chame-a genericamente, tipo:
If Not ChecaCnpjCpf(DbEdti1.Text) then
showMessage('CNPJ/CPF Inválido);
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

03/04/2017

// esta funçao verifica se o CNPJ ou CPF digitado já está cadastrado
function Checa_CNPJCPF_Cadastrado(DBEdit: TDBEdit; Dataset : TFDQuery; campoCNPJCPF: TStringField; campoNumero : TIntegerField): boolean;
begin
    result := true;
    if not checa_cgccpf (trim(DBedit.Text)) then
    begin
        Application.MessageBox('CNPJ/CPF Inválido !!','Erro',MB_OK + MB_ICONERROR);
        DBedit.setfocus;
        result := false;
    end
    else
    begin
        if DBedit.text <> '00000000000000' then
        begin
            Dataset.active := false;
            Dataset.ParamByName('pesqcnpjcpf').AsString := campoCNPJCPF.Value;
            Dataset.ParamByName('pesqnumero').value := campoNumero.value;
            Dataset.Active := True;

            if Dataset.RecordCount <> 0 then
            begin
                if Application.MessageBox('CNPJ/CPF já cadastrado.','Aviso',MB_OK + MB_ICONINFORMATION) = idOK then
                begin
                    DBedit.setfocus;
                    result := false;
                end;

            end;
        end;
    end;
end;



obrigado pessoal, a função ficou assim !!
GOSTEI 0
POSTAR