Como realizar uma consulta (select) no banco de dados mysql usando o componente Zeos no delphi 7

09/04/2018

81

Olá, sou iniciante em programação e novo no fórum. Gostaria de saber como realizo um select (consulta) no banco de dados mysql por meio do componente zeos no delphi 7 pelo ID e pelo NOME do produto de uma tabela de cadastro de produtos no bd. A pessoa escolha através de um combo box se ela quer pesquisar por código ou nome ai no edit a frente digita o que quer pesquisar. Ai gostaria que no dbgrid já aparece o dado enquanto ela vai digitando. Não consegui achar nenhum tutorial pois estou usando o zeos e querendo que a pesquisa seja realizada por código e nome. Estou desenvolvendo um software para o tcc.
Desde já agradeço e aguardo resposta ;-)
Luiz Silva

Luiz Silva

Responder

Posts

09/04/2018

Ilano Frota

Olá Luiz Silva, você pode fazer da seguinte forma:

With SeuComponenteZeos Do
Begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT ID, NOME FROM SUA_TABELA');

      If SEU_COMBOBOX.ItemIndex = 0 Then
      SQL.Add('WHERE ID = ' + EDIT1.Text)
      Else
            If SEU_COMBOBOX.ItemIndex = 1 Then
            SQL.Add('WHERE NOME = ' + QuotedStr(EDIT1.Text));

      SQL.Add('ORDER BY NOME');
      Open;
End;


Você pode, também, antes de montar a consulta, passar as condições para uma variável, tipo:

Var
pParametro : String;
begin

If SEU_COMBOBOX.ItemIndex = 0 Then
pParametro = ' ID = ' + EDIT1.Text
Else
      If SEU_COMBOBOX.ItemIndex = 1 Then
      pParametro =' NOME = ' + QuotedStr(EDIT1.Text);

With SeuComponenteZeos Do
Begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT ID, NOME FROM SUA_TABELA');
      If Trim(pParametro) <> '' Then SQL.Add('WHERE ' + Trim(pParametro));
      SQL.Add('ORDER BY NOME');
      Open;
End;

end;


Outra forma seria criar um objeto e chamá-lo no seu form. Dessa forma, é muito melhor, pois facilitará sua manutenção e você poderá utilizar a mesma consulta para toda a aplicação. Por exemplo, crie uma Unit e copie o código abaixo, modificando os campos e variáveis para sua realidade:

unit _objProdutos;

interface

Uses
  SysUtils, Classes, ZConnection, ZSqlProcessor, DB, ZAbstractRODataset,
  ZAbstractDataset, ZDataset, UDados;

function ConsultaProduto(pQuery : TZQuery; pParametro : String; pOrdem : String) : String;
function IncluirProduto(pQuery : TZQuery; pCodigo : String; pNome : String; pObs : String) : String;
function AlteraProduto(pQuery : TZQuery; pID : Integer; pCodigo : String; pNome : String; pObs : String) : String;

implementation



function ConsultaProduto(pQuery : TZQuery; pParametro : String; pOrdem : String) : String;
begin
  Try

    With pQuery Do
    Begin
      Close;
      SQL.Clear;
      SQL.Add(' SELECT ID, CODIGO, NOME, OBSERVACAO ');
      SQL.Add(' FROM TBPRODUTO ');
      If pParametro <> '' Then SQL.Add(' WHERE ' + pParametro + ' ');
      If pOrdem <> '' Then SQL.Add(' ORDER BY ' + pOrdem + '; ') Else SQL.Add(' ORDER BY CODIGO; ');
      Open;
    End;

  Except
    On E: Exception Do
    Begin
      ShowMessage('Ocorreu um erro ao tentar consultar registros na tabela:' + #13 + #13 + E.Message);
    End;

  End;

end;


function IncluirProduto(pQuery : TZQuery; pCodigo : String; pNome : String; pObs : String) : String;
begin
  ConsultaProduto(pQuery, ' CODIGO = '+ QuotedStr(pCodigo), '');
  Try

  If pQuery.RecordCount = 0 Then
  Begin
    With pQuery Do
    Begin
      Close;
      SQL.Clear;
      SQL.Add(' INSERT INTO TBPRODUTO (CODIGO, NOME, OBSERVACAO) VALUE (');
      SQL.Add(QuotedStr(Trim(pCodigo)) + ', ');
      SQL.Add(QuotedStr(Trim(pNome)) + ', ');
      If Trim(pObs) <> '' Then SQL.Add(Quoted(pObs)) Else SQL.Add('NULL');
      SQL.Add(');');
      ExecSQL;
    End;
  End
  Else
    If pQuery.RecordCount > 0 Then
    Begin
      ShowMessage('Este registro já foi cadastrado.');
    End;

  Except
    On E: Exception Do
    Begin
      ShowMessage('Ocorreu um erro ao tentar incluir registros na tabela:' + #13 + #13 + E.Message);
    End;

  End;

end;


function AlteraProduto(pQuery : TZQuery; pID : Integer; pCodigo : String; pNome : String; pObs : String) : String;
begin
  ConsultaProduto(pQuery, ' ID <> ' + IntToStr(pID) + ' AND CODIGO = '+ QuotedStr(pCodigo), '');
  Try

  If pQuery.RecordCount = 0 Then
  Begin
    With pQuery Do
    Begin
      Close;
      SQL.Clear;
      SQL.Add(' UPDATEO TBPRODUTO SET ');
      SQL.Add(' CODIGO = ' + QuotedStr(Trim(pCodigo)) + ', ');
      SQL.Add(' NOME = ' + QuotedStr(Trim(pNome)) + ', ');
      If Trim(pObs) <> '' Then SQL.Add(' OBSERVACAO = ' + Quoted(pObs)) Else SQL.Add(' OBSERVACAO = NULL');
      SQL.Add(' WHERE ID = ' + IntToStr(pID));
      ExecSQL;
    End;
  End
  Else
    If pQuery.RecordCount > 0 Then
    Begin
      ShowMessage('Este registro já foi cadastrado.');
    End;

  Except
    On E: Exception Do
    Begin
      ShowMessage('Ocorreu um erro ao tentar incluir registros na tabela:' + #13 + #13 + E.Message);
    End;

  End;

end;


end.


No formulário de cadastro, chame a unit logo abaixo da linha IMPLEMENTATION assim:

implementation
  Uses _objProdutos;

{$R *.dfm}


E utilize a consulta no evento OnClick do botão, por exemplo, assim:

If SEU_COMBOBOX.ItemIndex = 0 Then
ConsultaProduto(SUA_QUERY_ZEOS,  ' ID = ' + EDIT1.Text, 'NOME')
Else
      If SEU_COMBOBOX.ItemIndex = 1 Then
      ConsultaProduto(SUA_QUERY_ZEOS,  ' NOME = ' + Quoted(EDIT1.Text), 'NOME');


Pronto, é isso. Agora é escolhar a melhor forma de trabalhar. Eu sugiro a terceira.
Responder

09/04/2018

Ilano Frota

Só uma correçãozinha.<br /><br />
Para dar certo as mensagens, lá no objeto _objProdutos altere o uses de:<br /><br />
<br /><br />
Uses<br /><br />
  SysUtils, Classes, ZConnection, ZSqlProcessor, DB, ZAbstractRODataset,<br /><br />
  ZAbstractDataset, ZDataset, UDados;
<br /><br />
<br /><br />
para:<br /><br />
<br /><br />
Uses<br /><br />
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,<br /><br />
  ZConnection, ZSqlProcessor, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, UDados;
<br /><br />
<br /><br />
Outra coisa, UDados é o nome do meu DataSource, se tive criado, substitua o UDados para o nome de seu DataSource.<br /><br />
Responder

10/04/2018

Luiz Silva

Puxa, muito obrigado! Mas esse método irá funcionar enquanto a pessoa digita o dado e no dbgrid ele vai mostrando?
Responder

10/04/2018

Ilano Frota

Por nada Luiz! É sempre bom ajudar.
Cara, vai mostrar sim, desde que seu DBGrid esteja vinculado à query em questão. Sem problemas.
Responder

10/04/2018

Luiz Silva

Ok, Obg pela ajuda ;-) Vou tentar aqui fazer aqui.
Responder

21/04/2018

Luiz Silva

Olá. Consegui compilar o código usando a primeira sugestão, no entanto parece que para o NOME ele não está mostrando no DBGRID e estou usando o zquery do zeos que mostra consulta todos os dados da tabela quando uso ele no meu código ele limpa a propriedade SQL desse zquery não mostrando mais os dados no dbgrid quando não quero mais pesquisar entende?. Tentei usar uma outra zquery que chamei de Zacao no entanto simplesmente não funciona. Já fiz algumas tentativas mas não deu certo (sou iniciante) Alguma sugestão? Já tive um belo progresso pois agora já está mostrando pelo código. Coloquei um speed button e digitei o código que você me passou.

Aguardo resposta ;-)
Responder

21/04/2018

Luiz Silva

Recebi um e-mail que meu post foi respondido mas não consigo visualizar a resposta???
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários,
consulte nossa política de privacidade.

Aceitar