Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

André Luiz Cezar

Conexão ADO + Delphi 7 ( retorno da tabela)

Recommended Posts

Bom dia galera,
Sou novo aqui no Fórum e comecei agora com programação em Delphi e SQL...

Seguinte, tenho um banco de dados e preciso realizar algumas consultar nele para retornar nos meus Edits no Evento Click do Botão.

Qual a sintaxe correta levanto em conta as conversões para String já?

Preciso fazer tudo isso? (Não esta completo o código)

procedure TForm2.Button1Click(Sender: TObject);
begin
//Fecha a Query
dm_dados.ADOPRO_PRODUTO.Close;
dm_dados.ADOEMP_PESSOA.Close;
dm_dados.ADOPDV_EMBALAGEM.Close;
dm_dados.ADOPDV_EMBALAGEMITEM.close;
dm_dados.ADOSUL_ETQEXPEDICAO.Close;

//Limpar o conteúdo da propriedade SQL
dm_dados.ADOPRO_PRODUTO.SQL.Clear;
dm_dados.ADOEMP_PESSOA.SQL.Clear;
dm_dados.ADOPDV_EMBALAGEM.SQL.Clear;
dm_dados.ADOPDV_EMBALAGEMITEM.SQL.Clear;
dm_dados.ADOSUL_ETQEXPEDICAO.SQL.Clear;

dm_dados.ADOPRO_PRODUTO.SQL.Add('select * from pro_produto where pro_codigo ='+quotedstr(Edit1.Text));
Edit2.Text:=dm_dados.ADOPRO_PRODUTOPRO_Descricao.Text;

dm_dados.ADOPRO_PRODUTO.Open;




Só que por exemplo..

tenho a tabela SUL_ETQEXPEDICAO e preciso que seje adicionado o código da pesquisa da Tabela PRO_PRODUTO e o CNPJ da Tabela EMP_PESSOA..tem como?


Se não fui muito claro, me avisem.. meu primeiro post em Forum!
Obrigado desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos por partes... você quer pesquisar os dados gravados no seu BD de que maneira, via SQL? A primeira coisa que vou recomendar, é que não use o select *, use select campoA, campoB... melhora a performance e acelera o retorno do seu sql... agora, se o que quer é apenas fazer uma consulta e pegar os dados pra jogar numa tela, não tem muito mistério... é só fazer algo assim:

 

 

//Função genérica para executar pesquisas sql que cria um TADOQuery em runtime e realizar a pesquisa sql passada como parâmetro
Function PesquisaSQL( sSql: String ):TADOQuery;
var Query: TADOQuery;

begin
   try
      Query := TADOQuery.Create(Application);
      Query.Connection := ConexaoTeste; //Substitua pelo seu TADOConnection
      with Query do
      begin
         SQL.Clear;
         SQL.Add(sSql); //Aqui estamos passando para o TADOQuery o select que queremos utilizar
         Open;
      end;
      Result := Query; //Aqui retornamos o TADOQuery criado com o retorno da consulta (todos os dados)
   except
     on E: Exception do
     begin
        ShowMessage('Erro durante a execução da pesquisa: ' + E.Message);
        Result := nil;
     end;
   end;
end;

 

Usando a função acima para carregar um combobox, via método genérico:

 

 

Procedure CarregaCombobox (var cb :TComboBox; sSql : String);
var Query : TADOQuery; //Query criado em runtime pela função anterior
begin
   cb.Items.Clear;
   try
      Query := PesquisaSQL(sSql);
      if Query <> nil then
      with Query do
      begin
         First;
         while not Eof do
         begin
            cb.Items.Add(Fields[0].AsString); //Aqui estou pegando o 1° valor do sql (no caso, único pelo select que executei)
            Next;
         end;
      end;
   except
     on E: Exception do
        showmessage('Erro durante a captura das databases do SQL Server. Erro: ' + E.message);
   end;
end;

 

Para carregar o combobox, no caso, iria usar apenas o seguinte comando:

 

CarregaCombobox( cbDatabases, 'SELECT upper(name) as bases FROM master..sysdatabases ORDER BY name');

 

Se tiver mais dúvidas, posta ai!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos por partes... você quer pesquisar os dados gravados no seu BD de que maneira, via SQL? A primeira coisa que vou recomendar, é que não use o select *, use select campoA, campoB... melhora a performance e acelera o retorno do seu sql... agora, se o que quer é apenas fazer uma consulta e pegar os dados pra jogar numa tela, não tem muito mistério... é só fazer algo assim:

 

 

//Função genérica para executar pesquisas sql que cria um TADOQuery em runtime e realizar a pesquisa sql passada como parâmetro
Function PesquisaSQL( sSql: String ):TADOQuery;
var Query: TADOQuery;

begin
   try
      Query := TADOQuery.Create(Application);
      Query.Connection := ConexaoTeste; //Substitua pelo seu TADOConnection
      with Query do
      begin
         SQL.Clear;
         SQL.Add(sSql); //Aqui estamos passando para o TADOQuery o select que queremos utilizar
         Open;
      end;
      Result := Query; //Aqui retornamos o TADOQuery criado com o retorno da consulta (todos os dados)
   except
     on E: Exception do
     begin
        ShowMessage('Erro durante a execução da pesquisa: ' + E.Message);
        Result := nil;
     end;
   end;
end;

 

Usando a função acima para carregar um combobox, via método genérico:

 

 

Procedure CarregaCombobox (var cb :TComboBox; sSql : String);
var Query : TADOQuery; //Query criado em runtime pela função anterior
begin
   cb.Items.Clear;
   try
      Query := PesquisaSQL(sSql);
      if Query <> nil then
      with Query do
      begin
         First;
         while not Eof do
         begin
            cb.Items.Add(Fields[0].AsString); //Aqui estou pegando o 1° valor do sql (no caso, único pelo select que executei)
            Next;
         end;
      end;
   except
     on E: Exception do
        showmessage('Erro durante a captura das databases do SQL Server. Erro: ' + E.message);
   end;
end;

 

Para carregar o combobox, no caso, iria usar apenas o seguinte comando:

 

CarregaCombobox( cbDatabases, 'SELECT upper(name) as bases FROM master..sysdatabases ORDER BY name');

 

Se tiver mais dúvidas, posta ai!

 

Maravilha Chrnos, acho que estou começando a pegar o espirito da coisa! rs

 

Seguinte...

Só que nesse programinha, tenho a seguinte disposição de componentes:

 

Edit para digitar o código + Botão Pesquisar

Dai tenho vários outros Edits que gostaria que retornassem o conteúdo da tabela pesquisado pelo código no Edit1.

 

Ex.:

 

edit1.text := (pesquisa do código) --> Aqui eu faço o Select PRO_CODIGO from PRO_PRODUTO where PRO_CODIGO =' + quotedstr(Edit1.Text). Certo?

 

Dai retorna abaixo

edit2.text := descricao

edit3.text := desenho

...

 

Preciso fazer algum tratamento dos dados que vão para o Edit?

 

*Consigo dar print da telinha do programa aqui no Fórum?

 

 

Obrigado desde já pela ajuda!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... se você olhar a minha função genérica de pesquisa, ela está pronta para executar qualquer select que você informar a ela... o que eu te recomendo é você filtrar no seu select que campos quer pegar, até pra facilitar na hora de passar pros componentes visuais na tela...

 

De resto, vai ter que fazer algo como eu fiz na chamada da função carrega combo... considerando que não vá montar uma query dinâmica como montei e usar uma já existente e configurada, o que precisaria usar é o seguinte....

 

 

if Query <> nil then      
with Query do      
begin
    SQL.Clear;
    SQL.Add(sSql); //Aqui estamos passando para o TADOQuery o select que queremos utilizar
    Open;     
    First;         
    while not Eof do         
    begin            
           edit1.text := Fields[0].AsString; //Aqui estou pegando o 1° valor do sql e jogando no edit
           edit2.text := Fields[1].AsString; //Aqui estou pegando o 2° valor do sql e jogando no edit
           edit3.text := Fields[2].AsString; //Aqui estou pegando o 3° valor do sql e jogando no edit
           Next;         
    end;      
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Então... se você olhar a minha função genérica de pesquisa, ela está pronta para executar qualquer select que você informar a ela... o que eu te recomendo é você filtrar no seu select que campos quer pegar, até pra facilitar na hora de passar pros componentes visuais na tela...

 

De resto, vai ter que fazer algo como eu fiz na chamada da função carrega combo... considerando que não vá montar uma query dinâmica como montei e usar uma já existente e configurada, o que precisaria usar é o seguinte....

 

 

if Query <> nil then      
with Query do      
begin
    SQL.Clear;
    SQL.Add(sSql); //Aqui estamos passando para o TADOQuery o select que queremos utilizar
    Open;     
    First;         
    while not Eof do         
    begin            
           edit1.text := Fields[0].AsString; //Aqui estou pegando o 1° valor do sql e jogando no edit
           edit2.text := Fields[1].AsString; //Aqui estou pegando o 2° valor do sql e jogando no edit
           edit3.text := Fields[2].AsString; //Aqui estou pegando o 3° valor do sql e jogando no edit
           Next;         
    end;      
end;

 

Chrnos muito obrigado pela ajuda!

 

Me auxiliou bastante e estou conseguindo desenvolver minha programação.

 

 

Tenho apenas mais uma duvida até o momento sobre códigos...

 

No Form, tenho alguns componentes como DBEdit, DBLookupComboBox, que são preenchidos com minha pesquisa.

Gostaria que após concluir o preenchimento, no Evento Click do Botao "Cadastrar", essas informações fossem cadastradas em outra Tabela.

 

Como seria a sintaxe de atribuição do componente para com a tabela?

 

Obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso, sua pesquisa preenche os dados e vai gravar em outra tabela os dados que estão na tela? Simples... você vai montar o script como montaria o de pesquisa, mas agora de inserção, e em vez do open, vai usar o ExecSQL... há duas formas: em uma você monta todo o script de insert manualmente, na outra você passa parâmetros...

 

Com parâmetros, ficaria assim:

 

 

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(´insert into Tabela values(:Codigo, :Texto)´);
ADOQuery1.Parameters.ParamByName(´codart´).Value := dbEdit1.text;
ADOQuery1.Parameters.ParamByName(´Texto´).Value :=Texto;
ADOQuery1.ExecSQL;

 

Escrevendo o sql ficaria algo assim:

 

 

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Insert Into Teste values (2,"Igor","Rua Teste");');
ADOQuery1.EXECSQL;

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

No caso, sua pesquisa preenche os dados e vai gravar em outra tabela os dados que estão na tela? Simples... você vai montar o script como montaria o de pesquisa, mas agora de inserção, e em vez do open, vai usar o ExecSQL... há duas formas: em uma você monta todo o script de insert manualmente, na outra você passa parâmetros...

 

Com parâmetros, ficaria assim:

 

 

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(´insert into Tabela values(:Codigo, :Texto)´);
ADOQuery1.Parameters.ParamByName(´codart´).Value := dbEdit1.text;
ADOQuery1.Parameters.ParamByName(´Texto´).Value :=Texto;
ADOQuery1.ExecSQL;

 

Escrevendo o sql ficaria algo assim:

 

 

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Insert Into Teste values (2,"Igor","Rua Teste");');
ADOQuery1.EXECSQL;

 

Tentei esse código:
dm_dados.ADOSUL_ETQEXPEDICAO.Close;
dm_dados.ADOSUL_ETQEXPEDICAO.SQL.Clear;
dm_dados.ADOSUL_ETQEXPEDICAO.SQL.Add('Insert into SUL_ETQEXPEDICAO ');
//dm_dados.ADOSUL_ETQEXPEDICAO.SQL.Add(' (CodigoProduto, Descricao, Desenho, CodigoCliente, Cliente, Data, QtdEmbalagem, CodigoBarra, Destino, CodigoEmbalagem)' );
dm_dados.ADOSUL_ETQEXPEDICAO.SQL.Add('values ');
dm_dados.ADOSUL_ETQEXPEDICAO.SQL.Add(':CodigoProduto, :Descricao, :Desenho, :CodigoCliente, :Cliente, :Data, :QtdEmbalagem, :CodigoBarra, :Destino, :CodigoEmbalagem)');
dm_dados.ADOSUL_ETQEXPEDICAO.Parameters.ParamByName('CodigoProduto').Value := DBLookupComboBox1.KeyValue;
dm_dados.ADOSUL_ETQEXPEDICAO.Parameters.ParamByName('Descricao').Value := DBEdit2.Text;
dm_dados.ADOSUL_ETQEXPEDICAO.Parameters.ParamByName('Desenho').Value := DBEdit3.Text;
dm_dados.ADOSUL_ETQEXPEDICAO.Parameters.ParamByName('CodigoCliente').Value := DBLookupComboBox2.KeyValue;
dm_dados.ADOSUL_ETQEXPEDICAO.Parameters.ParamByName('Cliente').Value := DBEdit5.Text;
dm_dados.ADOSUL_ETQEXPEDICAO.Parameters.ParamByName('Data').Value := DBEdit6.Text;
dm_dados.ADOSUL_ETQEXPEDICAO.Parameters.ParamByName('QtdEmbalagem').Value := DBEdit7.Text;
dm_dados.ADOSUL_ETQEXPEDICAO.Parameters.ParamByName('CodigoBarra').Value := DBEdit11.Text;
dm_dados.ADOSUL_ETQEXPEDICAO.ExecSQL;
//dm_dados.ADOSUL_ETQEXPEDICAO.Close;
//dm_dados.ADOSUL_ETQEXPEDICAO.Open;
Application.MessageBox('Dados inseridos com sucesso!', 'Inclusão bem sucedida.', MB_ICONINFORMATION + MB_OK);
Ao executar, deu erro: 'Objeto parameter definido incorretamente. As informações são inconsistentes ou incompletas'
Alguma atribuição errada?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma coisa que vi de cara no seu código, é que usou o execsql e depois o open.... nunca use os dois, ou é um ou é o outro... o open é usado para comandos que retornam dados do BD (selects), o ExecuteSQL é para operações que inserem dados sem retorno de recordsets... outra coisa: está faltando um "(" após o values no seu sql.

 

 

Uma dica: seria bom você começar a debugar o código e localizar o momento que ocorre o erro e tentar entender as mensagens de erro. E sempre rever seu sql para ter certeza que ele não está sendo montado de forma incorreta. :natalwink:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostaria de agradecer o tempo e a paciência em me ajudar Chrnos!

Realmente foram erros de iniciante! rsrs

Consegui terminar de realizar os cadastros com sua ajuda!

 

Aprendi a debugar e verificar se as variáveis estavam armazenando corretamente... show!

 

Obrigado mesmo!

 

 

 

Agora, tenho outra dúvida sobre como mandar imprimir direto o que esta nos componentes

Precisaria abrir outro tópico?

 

tem como imprimir direto dos componentes apos uma consulta via sql? ou tenho que gerar algum relatório antes?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai entra a questão do que você está pensando em gerar... se é um relatório, você pode gerar usando componentes próprios do delphi para isso (como o quickreport), você poderia gerar um arquivo TXT, um arquivo CSV, um XML, um .DOC... seria mais fácil pra ajudar você postar o que quer fazer pra tentar orientar, pois há N formas de se gerar relatórios...

 

Agora, partindo do princípio que quer apenas criar um relatório básico, talvez esse link o ajude.... é um tutorial bem simples de uso feito no Planeta Delphi para o quickreport. http://www.planetadelphi.com.br/dica/6261/criando-relat%C3%B3rio-no-delphi---quickreport

 

Em outro post feito aqui mesmo no fórum também já foi comentado sobre isto: http://forum.imasters.com.br/topic/286178-resolvidocriar-relatrios-no-delphi/

 

Uma dica: há inúmeros sites na web que trazem códigos e explicações detalhadas sobre este tipo de assunto... talvez seja uma boa idéia tentar pesquisar neles sobre este tipo de situação e, na dúvida, procurar o fórum para tratar do ponto em que está empacado. :natalwink:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.