Ir para conteúdo
Fórum Script Brasil
  • 0

3 Dúvidas Simples


Carlos Rocha

Pergunta

Ola, depois de muito quebrar a cabeça deu pra aprender um pouquinho. Porem dependerei de tirar mais algumas duvidas.

1) O código abaixo esta funcionando correto até o QryClientes.Post;

Porem eu gostaria de testar tambem se eu estou editando um registro existente ou postando um novo registro.

Onde estara o erro, sendo que a alteração ou inserção é executada corretamente, porem a Mensagem de "Cadastrado com sucesso!" ou "Alteração efetuada com sucesso!", não é exibida?

QryClientes2.Close;
   QryClientes2.Sql.Clear;
   QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+'');
   QryClientes2.Open;
   if not QryClientes2.Eof then //já existe cadastro
      begin
         ShowMessage ('Já existe Cadastrado com este CPF/CNPJ!');
         Abort;
         BitBtnCancelar.Click;
         BitBtnNovo.Click;
      end
   else
      begin
         QryClientes.Post;
         if QryClientes.State in [dsInsert] then
            begin
            ShowMessage ('Cadastrado com sucesso!');
            end
         else if QryClientes.State in [dsEdit] then
            begin
            ShowMessage ('Alteração efetuada com sucesso!');
            end
      end

2) Outra coisa é o seguinte.

Numa tela simples de exibição de cliente num DBGrid à medida que vou digitando o nome, gostaria que fosse filtrando no DBGrid para que a lista fosse dimiuindo até ficar apenas o registro digitado no edit.

3) Só mais uma última coisa:

Como fazer para que, neste DBGrid, caso o campo "Tipo de Cliente" retornar "Fisica", como fazer para colocar uma mascara de CPF no campo "CPF_CNPJ" para, neste caso, mascarar o CPF?

Obrigado!

Carlos Rocha

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0
1) O código abaixo esta funcionando correto até o QryClientes.Post;

Porem eu gostaria de testar tambem se eu estou editando um registro existente ou postando um novo registro.

Onde estara o erro, sendo que a alteração ou inserção é executada corretamente, porem a Mensagem de "Cadastrado com sucesso!" ou "Alteração efetuada com sucesso!", não é exibida?

QryClientes2.Close;
        QryClientes2.Sql.Clear;
        QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+'');
        QryClientes2.Open;
        if not QryClientes2.Eof then //já existe cadastro
           begin
              ShowMessage ('Já existe Cadastrado com este CPF/CNPJ!');
              Abort;
              BitBtnCancelar.Click;
              BitBtnNovo.Click;
           end
        else
           begin
              QryClientes.Post;
              if QryClientes.State in [dsInsert] then
                 begin
                 ShowMessage ('Cadastrado com sucesso!');
                 end
              else if QryClientes.State in [dsEdit] then
                 begin
                 ShowMessage ('Alteração efetuada com sucesso!');
                 end
           end
O erro está no fato de você utilizar a propriedade State após o post. Neste momento ele não será outro que não dsBrowse! você deve salvá-lo em uma variável local antes de executar o post, para então testar essa variável em seus "if's". Eu sugeriria utilizar um case em seu lugar:
LocalState :=  QryClientes.State;
   QryClientes.Post;
   case LocalState of
     dsInsert : ShowMessage ('Cadastrado com sucesso!');
     dsEdit   : ShowMessage ('Alteração efetuada com sucesso!');
   end;
2) Outra coisa é o seguinte. Numa tela simples de exibição de cliente num DBGrid à medida que vou digitando o nome, gostaria que fosse filtrando no DBGrid para que a lista fosse dimiuindo até ficar apenas o registro digitado no edit.
você consegue isso utilizando o LIKE na query. Já tem bastante post's sobre isso aqui no forum, dê uma buscar por "LIKE" ou "autocompletar", mas vou adiantar um - Link
3) Só mais uma última coisa: Como fazer para que, neste DBGrid, caso o campo "Tipo de Cliente" retornar "Fisica", como fazer para colocar uma mascara de CPF no campo "CPF_CNPJ" para, neste caso, mascarar o CPF?
você poderia fazer isso ao pintar o DBGrid (Link), aonde você ferifica se o campo a desenhar é o cpf_cnpj, e sendo ele você faz algo como:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
   DataCol: Integer; Column: TColumn; State: TGridDrawState);
 begin
   if Column.Field.FieldName = 'CPF_CNPJ' then
     // aqui tem que colocar o campo tipo cliente da sua tabela e testar se é física
    // e estará sendo testada a linha que estiver sendo pintada, então "don't worry"
     if DBGrid1.DataSource.DataSet.FieldByName('Tipo de Cliente').Value = 'Fisica' then 
     begin
       DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top, FormatMaskText('999.999.999-99;0;', Column.Field.AsString))
       Exit;
     end;
   DefaultDrawColumnCell(Rect, DataCol, Column, State);
 end;

mas ainda tem coisas a se preocupar, como se a linha/coluna está selecionada, pois tem que utilizar a cor de fundo para esta situação.

Outra opção, é utilizar o evento OnGetText do campo CPF_CNPJ adicionado ao seu dataset (componente) ligado ao DBGrid. Acho essa melhor, mas pode ter algun efeito colateral de você utilizar este dataset para edição também.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Estou com o seguinte problema agora:

Eu peciso fazer com que num campo "DBEditCPF_CNPJ", a pessoa seja forçada a digitar todos os digitos.

Eu usei o código abaixo mas num funciona!

if DBRadioGroupTipo.Value = 'F' then
    begin
     if DBEditCPF_CNPJ.Tag = 14 then
        ShowMessage('CPF tem 11 Dígitos');
        DBEditCPF_CNPJ.SetFocus; // posiciona o cursor
        Abort; // não grava e continua editando
     end
    else if DBRadioGroupTipo.Value = 'J' then
    begin
     if DBEditCPF_CNPJ.tag = 14 then
        ShowMessage('CNPJ tem 14 Dígitos');
        DBEditCPF_CNPJ.SetFocus; // posiciona o cursor
        Abort; // não grava e continua editando
     end
Outra coisa é o seguinte: Com o código abaixo, eu populo corretamente um DBGrid através de um DBEdit. Porem eu tenho um Edit, uma comobox e um DBGrid O cara digita no Edit o nome ou cpf-cnpj e escolhe na combobox se quer consulta por nome ou CPF_CNPJ Na combobox, tem as opções: 1) Escolha 2) Nome 3) CPF_CNPJ Pra pessoa escolher qual campo da tabela sera usado para pesquisa, se Nome ou CPF_CNPJ. Porem, não existe o campo Escolha, como faço para tratar a mensagem de erro que da quando o cara não escolhe o campo?
procedure TPCli.Edit1Change(Sender: TObject);
begin
 QryClientes.Close;
 QryClientes.SQL.Clear;
 QryClientes.SQL.Add('select * from Clientes where '+ComboboxEscolha.Text+' like:vardigito order by Nome');
 QryClientes.Parambyname('vardigito').asstring:= Edit1.text +'%';
 QryClientes.Open;
end;
Ah! Só mais uma coisa, das 3 orientações anteriores que você me deu, 2 resolveram apenas 1 não deu. Adaptei o código para por mascaras no DBGrid mas está dando erro:
procedure TPCli.DBGridDadosDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn;  State: TGridDrawState);
begin
     if Column.Field.FieldName = 'CPF_CNPJ' then
       // aqui tem que colocar o campo tipo cliente da sua tabela e testar se é física
       // e estará sendo testada a linha que estiver sendo pintada, então "don't worry"
       if DBGridDados.DataSource.DataSet.FieldByName('Tipo').Value = 'F' then
       begin
        DBGridDados.Canvas.TextOut(Rect.Left+2,Rect.Top, FormatMaskText('999.999.999-99;0;', Column.Field.AsString));
        Exit;
       end
       else if DBGridDados.DataSource.DataSet.FieldByName('Tipo').Value = 'J' then
       begin
        DBGridDados.Canvas.TextOut(Rect.Left+2,Rect.Top, FormatMaskText('999\.999\.999\-99;0;_', Column.Field.AsString));
        Exit;
       end;
     DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;
o erro é:
Build
  [Error] PesqCli.pas(121): Undeclared identifier: 'FormatMaskText'
  [Error] PesqCli.pas(129): Undeclared identifier: 'DefaultDrawColumnCell'
  [Fatal Error] SaneRio.dpr(14): Could not compile used unit 'PesqCli.pas'

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Sem querer se intrometer mas assim, quanto a parte que você

quer que a pessoa digite 14 digitos pra CPNJ, a propriedade que

você está usando para recuperar quantos digitos estão no campo

.Tag está incorreto, a propriedade Tag é somente para controle

do programador, o ideal seria:

if ((DBRadioGroupTipo.Value = 'F') or  (DBRadioGroupTipo.Value = 'J')) then
if (Length(DBEditCPF_CNPJ.Text) <> 11) then
begin
  ShowMessage('CPF tem 11 Dígitos');
  DBEditCPF_CNPJ.SetFocus; // posiciona o cursor
  Abort; // não grava e continua editando
end;

Ou seja, se o comprimento do texto, ou melhor, se a contagem de

caracteres do campo DBEditCPF_CNPJ for diferente de 11 então

ele da a mensagem e aborta...

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Pois é eu fiz isso.

1) Tenho a ídea de, ao clikar no botão gravar, sejam feitas algumas considerações;

A - Uma pesquiza usando uma query auxiliar no Form que retornara todos os dados da tabela Clientes onde o Campo cPF_CNPJ seja igual ao preenchido no DBEditCPF_CNPJ.Text.

B - Depois verifica o estado da Query principal do Form:

Caso seja dsInsert, e caso o CPF ou CNPJ digitado não tenha cadastro na tabela, aí dá um Post e grava. Até aí esta ok.

Caso seja dsEdit, e caso o CPF ou CNPJ digitado seja o mesmo do cadastro na tabela, aí dá um Post e grava. Até aí esta ok, depois verifica se

o CPF ou CNPJ digitado não seja o mesmo do cadastro na tabela e não tenha cadastro na tabela, aí não Posta e aborta. Aqui está dando erro, está gravando mesmo assim.

Esse é o Código que to usando:

procedure TCClientes.BitBtnGravarClick(Sender: TObject);
begin
   QryClientes2.Close;
   QryClientes2.Sql.Clear;
   QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+'');
   QryClientes2.Open;
   if QryClientes.State in [dsInsert] then
      begin
        if not QryClientes2.Eof then //já existe cadastro
           begin
            ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!');
            Abort;
           end
      else
        begin
         QryClientes.Post;
         ShowMessage ('Cadastrado efetuado com sucesso!');
        end
    end
    else if QryClientes.State in [dsEdit] then
            begin
                if QryClientesCPF_CNPJ.Value = DBEditCPF_CNPJ.Text then
                  begin
                   QryClientes.Post;
                   ShowMessage ('Alteração efetuada com sucesso!');
                  end
                else
                  begin
                    if not QryClientes2.Eof then //já existe cadastro - Aqui está dando erro, está gravando mesmo assim.
                      begin
                         ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!');
                         Abort;
                      end
                  end
           end
end;
2) Outra coisa e que eu quero forçar o cara a digitar todos os dígitos do CPF ou CGC. To usando o código abaixo mas quando o cara não digita os digitos todos, ele anula o Post e fica aguardando o cara terminar de digitar pra liberar o Post em vez de dar mensagem, porem isso só esta acontecendo no estado dsEdit da Query. Eu usei o código abaixo mas num funciona com a query no estado dsEdit!
procedure TCClientes.QryClientesBeforePost(DataSet: TDataSet);
begin
if DBRadioGroupTipo.ItemIndex = 0 then
             begin
                if (Length(DBEditCPF_CNPJ.Text) <> 11) then
                    begin
                      ShowMessage('CPF tem 11 Dígitos');
                      DBEditCPF_CNPJ.SetFocus; // posiciona o cursor
                      Abort; // não grava e continua editando
                    end
             end
          else
             begin
                if (Length(DBEditCPF_CNPJ.Text) <> 14) then
                    begin
                      ShowMessage('CNPJ tem 14 Dígitos');
                      DBEditCPF_CNPJ.SetFocus; // posiciona o cursor
                      Abort; // não grava e continua editando
                    end
             end
end

Iteressantes que os 2 problemas acotecem no modo dsEdit.

Da uma força aí pessoal.

Oh pessoal. Da uma força ai!

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

  • 0
Na combobox, tem as opções:

1) Escolha

2) Nome

3) CPF_CNPJ

Pra pessoa escolher qual campo da tabela sera usado para pesquisa, se Nome ou CPF_CNPJ.

Porem, não existe o campo Escolha, como faço para tratar a mensagem de erro que da quando o cara não escolhe o campo?

procedure TPCli.Edit1Change(Sender: TObject);
begin
QryClientes.Close;
QryClientes.SQL.Clear;
QryClientes.SQL.Add('select * from Clientes where '+ComboboxEscolha.Text+' like:vardigito order by Nome');
QryClientes.Parambyname('vardigito').asstring:= Edit1.text +'%';
QryClientes.Open;
end;
É impressão minha, ou sua primeira opção no combo é apenas informativa (Escolha). Se for, observe que no Edit1Change você não está levando em conta esta opção e se por acaso você estiver permitindo que o usuário digite algo no Edit1 com a 1ª opção do combo selecionado, ao executar a query e o campo "Escolha" não existindo na tabela resultará em erro de execução!
Ah! Só mais uma coisa, das 3 orientações anteriores que você me deu, 2 resolveram apenas 1 não deu. Adaptei o código para por mascaras no DBGrid mas está dando erro:
procedure TPCli.DBGridDadosDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn;  State: TGridDrawState);
begin
  ...
  DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
o erro é:
Build
  [Error] PesqCli.pas(121): Undeclared identifier: 'FormatMaskText'
  [Error] PesqCli.pas(129): Undeclared identifier: 'DefaultDrawColumnCell'
  [Fatal Error] SaneRio.dpr(14): Could not compile used unit 'PesqCli.pas'
Mancada minha . O método DefaultDrawColumnCell pertence ao componente DBGrid, logo, você deve utilizar desta forma: BGridDados.DefaultDrawColumnCell(Rect, DataCol, Column, State); Outra coisa, acho que as máscaras corretas seriam CPF 999\.999\.999-99 e CNPF 99\.999\.999\/9999-99 (não estou 100% certo - confira).
... Esse é o Código que to usando:
procedure TCClientes.BitBtnGravarClick(Sender: TObject);
begin
   QryClientes2.Close;
   QryClientes2.Sql.Clear;
   QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+'');
   QryClientes2.Open;
   if QryClientes.State in [dsInsert] then
      begin
        if not QryClientes2.Eof then //já existe cadastro
           begin
            ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!');
            Abort;
           end
      else
        begin
         QryClientes.Post;
         ShowMessage ('Cadastrado efetuado com sucesso!');
        end
    end
    else if QryClientes.State in [dsEdit] then
            begin
                if QryClientesCPF_CNPJ.Value = DBEditCPF_CNPJ.Text then
                  begin
                   QryClientes.Post;
                   ShowMessage ('Alteração efetuada com sucesso!');
                  end
                else
                  begin
                    if not QryClientes2.Eof then //já existe cadastro - Aqui está dando erro, está gravando mesmo assim.
                      begin
                         ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!');
                         Abort;
                      end
                  end
           end
end;
Se você observar, o uso da lógica com os if..then..else, permitem que você não tenha que utilizar o Abort. Uma boa aplicação do Abort seria no evento BeforePost de uma tabela, aonde o processo seria interrompido, sem efetivação da gravação (após algum tipo de validação é claro). Para uma situação como esta eu recomendaria o uso de EXIT que desviará o fluxo do programa para o end final do procedimento. Veja que há diferença entre suas procedures (do help): "Abort raises a special "silent exception" which operates like any other exception, but does not display an error message to the end user. Abort will redirect execution to the end of the last try .. finally block." "Exit will cause the calling procedure to continue with the statement after the point at which the procedure was called." A título de exemplo, você pode observar que não seria necessário o uso do Abort ou mesmo do Exit:
procedure TCClientes.BitBtnGravarClick(Sender: TObject);
begin
  QryClientes2.Close;
  QryClientes2.Sql.Clear;
  QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+'');
  QryClientes2.Open;
  if QryClientes.State in [dsInsert] then
  begin
    if not QryClientes2.Eof then //já existe cadastro
      ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!');
    else
    begin
      QryClientes.Post;
      ShowMessage ('Cadastrado efetuado com sucesso!');
    end
  end else
    if QryClientes.State in [dsEdit] then
      if QryClientesCPF_CNPJ.Value = DBEditCPF_CNPJ.Text then
      begin
        QryClientes.Post;
        ShowMessage ('Alteração efetuada com sucesso!');
      end else
        if not QryClientes2.Eof then //já existe cadastro - Aqui está dando erro, está gravando mesmo assim.
          ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!');
end;

2) Outra coisa e que eu quero forçar o cara a digitar todos os dígitos do CPF ou CGC.

To usando o código abaixo mas quando o cara não digita os digitos todos, ele anula o Post e fica aguardando o cara terminar de digitar pra liberar o Post em vez de dar mensagem, porem isso só esta acontecendo no estado dsEdit da Query.

Voce está dizendo que ele está: cancelando a gravação (post); movendo o foco para o componente com o texto incompleto, mas não está mostrando a mensagem que deveria ter sido executada antes de tudo isso?

Abraços

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...