Como realizar uma consulta (select) no banco de dados mysql usando o componente Zeos no delphi 7
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 ;-)
Desde já agradeço e aguardo resposta ;-)
Luiz Silva
Curtidas 0
Respostas
Ilano Frota
09/04/2018
Olá Luiz Silva, você pode fazer da seguinte forma:
Você pode, também, antes de montar a consulta, passar as condições para uma variável, tipo:
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:
No formulário de cadastro, chame a unit logo abaixo da linha IMPLEMENTATION assim:
E utilize a consulta no evento OnClick do botão, por exemplo, assim:
Pronto, é isso. Agora é escolhar a melhor forma de trabalhar. Eu sugiro a terceira.
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.
GOSTEI 0
Ilano Frota
09/04/2018
Só uma correçãozinha.<br /><br />
Para dar certo as mensagens, lá no objeto _objProdutos altere o uses de:<br /><br />
<br /><br />
<br /><br />
<br /><br />
para:<br /><br />
<br /><br />
<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 />
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 />
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 />
Outra coisa, UDados é o nome do meu DataSource, se tive criado, substitua o UDados para o nome de seu DataSource.<br /><br />
GOSTEI 0
Luiz Silva
09/04/2018
Puxa, muito obrigado! Mas esse método irá funcionar enquanto a pessoa digita o dado e no dbgrid ele vai mostrando?
GOSTEI 0
Ilano Frota
09/04/2018
Por nada Luiz! É sempre bom ajudar.
Cara, vai mostrar sim, desde que seu DBGrid esteja vinculado à query em questão. Sem problemas.
Cara, vai mostrar sim, desde que seu DBGrid esteja vinculado à query em questão. Sem problemas.
GOSTEI 0
Luiz Silva
09/04/2018
Ok, Obg pela ajuda ;-) Vou tentar aqui fazer aqui.
GOSTEI 0
Luiz Silva
09/04/2018
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 ;-)
Aguardo resposta ;-)
GOSTEI 0
Luiz Silva
09/04/2018
Recebi um e-mail que meu post foi respondido mas não consigo visualizar a resposta???
GOSTEI 0