COMO PREENCHER UM DBGrid com DADOS DO BD?

Delphi

05/01/2013

Boa Tarde

pessoar estou tentando PREENCHER UM DBGrid com DADOS DO BD mas o codigo não da certo?
arguem pode me dar uma dica?
ja tentei varias codigos ma sem sucesso...


Obrigardo!!!
Elisangela Silva

Elisangela Silva

Curtidas 0

Respostas

André Celestino

André Celestino

05/01/2013

Olá, Elisângela.
Pra Preencher a DBGrid com os dados de uma tabela, basta ligar a propriedade DataSource do DBGrid em um Dataset.
Por exemplo, você tem um Dataset (ClientDataSet ou Query) com os dados da tabela. Ligue este componente a um DataSource, e em seguida a DBGrid neste DataSource. Os dados já serão exibidos automaticamente.
GOSTEI 0
Elisangela Silva

Elisangela Silva

05/01/2013

Olá, Elisângela.
Pra Preencher a DBGrid com os dados de uma tabela, basta ligar a propriedade DataSource do DBGrid em um Dataset.
Por exemplo, você tem um Dataset (ClientDataSet ou Query) com os dados da tabela. Ligue este componente a um DataSource, e em seguida a DBGrid neste DataSource. Os dados já serão exibidos automaticamente.



Ola Amigo correto seu raciocinio mas o que eu quero é:
Bom, o que eu quero na verdade é fazer que medida que eu realizar a busca no banco, ou seja, digitar o codigo do cliente que quero no Edit1 e clicar no botão pesquisar,então o DBgrid seja preenchido somente com os dados deste cliente.
eu até tenho o select pronto mas o erro ocorre na hora de inserir os dados no DBGrid.

Se alguem puder dar uma dica...

Obrigado
GOSTEI 0
Lucas Chagas

Lucas Chagas

05/01/2013

Olá tudo certo?

Pelo que eu entendi você quer que ao digitar o sistema busque na base os dados. É isso?

Se for no edit1 use o evento "onChange", nele vc irá repassar ao componente de pesquisa no banco o parâmetro da pesquisa, assim atualizando o seu grid.

A query deve ter na sua sintaxe filtro do campo pelo like.

Caso resolva não remontar toda vez a query, pode através do clientdataset utilizar um locate e ele posiciona no primeiro registro posicionado.

Boa sorte abraços.
GOSTEI 0
Elisangela Silva

Elisangela Silva

05/01/2013

Olá tudo certo?

Pelo que eu entendi você quer que ao digitar o sistema busque na base os dados. É isso?

Se for no edit1 use o evento "onChange", nele vc irá repassar ao componente de pesquisa no banco o parâmetro da pesquisa, assim atualizando o seu grid.

A query deve ter na sua sintaxe filtro do campo pelo like.

Caso resolva não remontar toda vez a query, pode através do clientdataset utilizar um locate e ele posiciona no primeiro registro posicionado.

Boa sorte abraços.



Ok Obrigado pela dica ...mas o select da pesquisa eu ja fiz usando like e sem usar o like ambos funcionam quando testo pelo iboconsole mas no delphi o que esta dando eerrro não é o select é na hora de inserção dos dados no grid...engraçado que estou fazendo dois exercicios simultaneamente e testei este pedaço de codigo:
DBGridPedidos.Columns[0].FieldName := 'NUMEROPEDIDO';
DBGridPedidos.Columns[1].FieldName := 'CLIENTE' ;
DBGridPedidos.Columns[2].FieldName := 'DATAPEDIDO' ;
DBGridPedidos.Columns[3].FieldName := 'FORMAPAGTO' ;


em um deu certo mas em outro da o seguinte erro:

List index out of bounds(1)


mais uma vez obrigado pelas respostas...
GOSTEI 0
Daniel Santos

Daniel Santos

05/01/2013

É, olhando esse codigo da pra ver quem tem alguma coisa muito errada! o certo é voce postar o projeto inteiro para ter uma visao geral.
GOSTEI 0
Wellington Menezes

Wellington Menezes

05/01/2013

Informe a instrução SQL que vc está usando
GOSTEI 0
Elisangela Silva

Elisangela Silva

05/01/2013

Bom dia Pessoal,
segue o código, se alguem puder ajudar.


if EditPedido.Text = '' then
    begin
    Showmessage('Digite o numero do pedido');
    EditPedido.SetFocus;
    exit;
    end;
  try

    with DM.SQLConnPedidos do begin
    DM.qryPedidos.Close;
    DM.qryPedidos.SQL.Clear;
    DM.qryPedidos.SQL.Add (' SELECT ');
    DM.qryPedidos.SQL.Add (' NUMEROPEDIDO,  ');
    DM.qryPedidos.SQL.Add (' CLIENTE, ');
    DM.qryPedidos.SQL.Add (' DATAPEDIDO,  ');
    DM.qryPedidos.SQL.Add (' FORMAPAGTO  ');
    DM.qryPedidos.SQL.Add (' FROM PEDIDOS ');
    if(EditPedido.Text <> '') then
    begin
      DM.qryPedidos.SQL.Add('WHERE NUMEROPEDIDO LIKE' + QuotedStr(EditPedido.Text));      
    end;
      
    
    DM.qryPedidos.Open;
    end;
    
    DBGridPedidos.Columns[0].FieldName := 'NUMEROPEDIDO';
    DBGridPedidos.Columns[1].FieldName := 'CLIENTE'  ;
    DBGridPedidos.Columns[2].FieldName := 'DATAPEDIDO' ;
    DBGridPedidos.Columns[3].FieldName := 'FORMAPAGTO' ; 
    
    
      except
     
      on E:Exception do
        ShowMessage(E.Message);
      end;


Obrigado
GOSTEI 0
Elisangela Silva

Elisangela Silva

05/01/2013

alguem para ajudar
GOSTEI 0
André Celestino

André Celestino

05/01/2013

Elisângela, se o campo NUMEROPEDIDO for numérico, então não é preciso utilizar o QuotedStr, já que essa função envolve o valor em aspas.
Outra observação: já que o número do pedido é um valor exato, então ao invés de LIKE, utilize o sinal de igual mesmo ( = ):

DM.qryPedidos.SQL.Add('WHERE NUMEROPEDIDO = ' + EditPedido.Text); 
GOSTEI 0
Elisangela Silva

Elisangela Silva

05/01/2013

Elisângela, se o campo NUMEROPEDIDO for numérico, então não é preciso utilizar o QuotedStr, já que essa função envolve o valor em aspas.
Outra observação: já que o número do pedido é um valor exato, então ao invés de LIKE, utilize o sinal de igual mesmo ( = ):

DM.qryPedidos.SQL.Add('WHERE NUMEROPEDIDO = ' + EditPedido.Text); 



fiz o que vc falou mas o erro esta aqui qdo executo

DBGridPedidos.Columns[0].FieldName := 'NUMEROPEDIDO';
DBGridPedidos.Columns[1].FieldName := 'CLIENTE' ;
DBGridPedidos.Columns[2].FieldName := 'DATAPEDIDO' ;
DBGridPedidos.Columns[3].FieldName := 'FORMAPAGTO' ; 
GOSTEI 0
Elisangela Silva

Elisangela Silva

05/01/2013

mensagem do erro:
List index out of bounds(1)
GOSTEI 0
André Celestino

André Celestino

05/01/2013

Você está tentando acessar algum índice de coluna que não existe.
Experimente comentar essas 4 linhas e ver se funciona.

Caso funcionar, verifique a quantidade de colunas que são retornadas.
GOSTEI 0
Landerson Santos

Landerson Santos

05/01/2013

Elisangela tente fazer o seguinte, não passe para o dbgrid os nomes dos campos como está fazendo... (apenas para testar)
O seu select, caso o campo numero do pedido seja numérico vc deve passar o com
... NUMPEDIDO = ' + edit1.text;

Após isso apenas no evento o click do seu buton de um ClientDataset.OPEN; (acredito eu que vc esteja usando um ClientDataset)

Com isso o dbgrid vai abrir, mesmo que vazio, caso de vc estar digitando um pedido que não exista.
GOSTEI 0
Landerson Santos

Landerson Santos

05/01/2013

Olá Elisangela... Acho que fazendo assim funciona...


if EditPedido.Text = '' then
    begin
    Showmessage('Digite o numero do pedido');
    EditPedido.SetFocus;
    exit;
    end;
  try

    with DM.SQLConnPedidos do begin
    DM.qryPedidos.Close;
    DM.qryPedidos.SQL.Clear;
    DM.qryPedidos.SQL.Add (' SELECT ');
    DM.qryPedidos.SQL.Add (' NUMEROPEDIDO,  ');
    DM.qryPedidos.SQL.Add (' CLIENTE, ');
    DM.qryPedidos.SQL.Add (' DATAPEDIDO,  ');
    DM.qryPedidos.SQL.Add (' FORMAPAGTO  ');
    DM.qryPedidos.SQL.Add (' FROM PEDIDOS ');
    if(EditPedido.Text <> '') then
    begin
      DM.qryPedidos.SQL.Add('WHERE NUMEROPEDIDO LIKE' + QuotedStr(EditPedido.Text));      
    end;
    
    //Aqui vamos definir que o dataset do datasource é o dataset da sua query
    DATASOURCE1.DATASET := DM.qryPedidos; 

    //Aqui vamos garantir que seu dbgrid está com o datasource associado
    DBGridPedidos.datasource := DATASOURCE1

  
    
    DM.qryPedidos.Open;

    end;
    // Comentamos essas linhas aqui abaixo
{
    DBGridPedidos.Columns[0].FieldName := 'NUMEROPEDIDO';
    DBGridPedidos.Columns[1].FieldName := 'CLIENTE'  ;
    DBGridPedidos.Columns[2].FieldName := 'DATAPEDIDO' ;
    DBGridPedidos.Columns[3].FieldName := 'FORMAPAGTO' ; 
 }   
    
      except
     
      on E:Exception do
        ShowMessage(E.Message);
      end;


Confirme por favor.
GOSTEI 0
Elisangela Silva

Elisangela Silva

05/01/2013

Ola


tentando assim da esse erro:
Operation not allowed on a unidirectional dataset
GOSTEI 0
Elisangela Silva

Elisangela Silva

05/01/2013

Amigos Valeu pelas dicas, mas consegui resolver Sozinha, através de vários teste.Consegui fazer e funcionou.
Vou postar o Código alguem pode ter a mesma dúvida...
Este é o código que funcionou:

if EditPedido.Text = '' then
begin
Showmessage('Digite o numero do pedido');
EditPedido.SetFocus;
exit;
end;
try

with DM.SQLConnPedidos do begin
DM.qryPedidos.Close;
DM.qryPedidos.SQL.Clear;
DM.qryPedidos.SQL.Add (' SELECT ');
DM.qryPedidos.SQL.Add (' NUMEROPEDIDO, ');
DM.qryPedidos.SQL.Add (' CLIENTE, ');
DM.qryPedidos.SQL.Add (' DATAPEDIDO, ');
DM.qryPedidos.SQL.Add (' FORMAPAGTO ');
DM.qryPedidos.SQL.Add (' FROM PEDIDOS ');
if(EditPedido.Text <> '') then
begin
DM.qryPedidos.SQL.Add('WHERE NUMEROPEDIDO LIKE' + QuotedStr(EditPedido.Text));
end;


DM.qryPedidos.Open;
end;

DBGridPedidos.Columns[0].FieldName := DM.qryPedidos.FieldByName('NUMEROPEDIDO').AsString;
DBGridPedidos.Columns[1].FieldName := DM.qryPedidos.FieldByName('CLIENTE').AsString ;
DBGridPedidos.Columns[2].FieldName := DM.qryPedidos.FieldByName('DATAPEDIDO').AsString;
DBGridPedidos.Columns[3].FieldName := DM.qryPedidos.FieldByName('FORMAPAGTO').AsString;


except

on E:Exception do
ShowMessage(E.Message);
end;


GOSTEI 0
Alisson Santos

Alisson Santos

05/01/2013

Só uma dica, sempre que trabalhar com esse tipo de consulta, trabalhe com um dataset para armazenar as informações para recuperar, pois quando você passou para as colunas os valores de um dataset não retornou o erro.
GOSTEI 0
Thiago Jesus

Thiago Jesus

05/01/2013

Elisângela, estou desenvolvendo um sistema orientado a objetos no XE. Tenho uma Classe chamada TContasPagarDAO, onde uso
o método abaixo para fazer a pesquisa no banco, e listar o resultado direto no meu ClientDataSet.
Essa é uma forma de implementar a pesquisa.


procedure TContasPagarDAO.PesquisaDescricao(ContasPagarModel : TContasPagarModel);
 var
  command : TDBXCommand;
  reader : TDBXReader;
  parametro : TDBXParameter;
begin
 try
   try
     
     // abre a conexao com o Banco e passa o Comando SQL
     conexao := TDBXConnectionFactory.GetConnectionFactory.GetConnection('SuaConexao','Usuario','Senha');
     command := conexao.CreateCommand;
     command.Text := 'SELECT * FROM CONTAS_A_PAGAR WHERE UPPER(CON_DESCRICAO) LIKE UPPER(?)';

     // parametro Descrição
     parametro := command.CreateParameter;
     parametro.DataType := TDBXDataTypes.WideStringType;
     parametro.Name := 'pDescricao';
     command.Parameters.AddParameter(parametro);
     command.Parameters.Parameter[0].Value.SetWideString('%' + ContasPagarModel.Descricao + '%');

     // Prepara o Comando e Executa no Banco
     command.Prepare;
     reader := command.ExecuteQuery;

      // Copia o Resultado da consulta para um ClientDataSet
       if Assigned(reader) then
        begin
          TDBXDataSetReader.CopyReaderToClientDataSet(reader, dm_dados.cds_contaspagar);
        end;

   except on e: Exception do
    begin
      raise Exception.Create('Não foi possível realizar a pesquisa' + E.Message);
    end;

   end;
 finally
  FreeAndNil(conexao);
  FreeAndNil(command);
  FreeAndNil(reader);
 end;

end;





GOSTEI 0
Thiago Jesus

Thiago Jesus

05/01/2013

Espero que possa ajudar também.
GOSTEI 0
Elisangela Silva

Elisangela Silva

05/01/2013

Só uma dica, sempre que trabalhar com esse tipo de consulta, trabalhe com um dataset para armazenar as informações para recuperar, pois quando você passou para as colunas os valores de um dataset não retornou o erro.


gostei da sua idéia ma scomo faria isso? poderia me dar um exemplo?
GOSTEI 0
Elisangela Silva

Elisangela Silva

05/01/2013

Elisângela, estou desenvolvendo um sistema orientado a objetos no XE. Tenho uma Classe chamada TContasPagarDAO, onde uso
o método abaixo para fazer a pesquisa no banco, e listar o resultado direto no meu ClientDataSet.
Essa é uma forma de implementar a pesquisa.


procedure TContasPagarDAO.PesquisaDescricao(ContasPagarModel : TContasPagarModel);
 var
  command : TDBXCommand;
  reader : TDBXReader;
  parametro : TDBXParameter;
begin
 try
   try
     
     // abre a conexao com o Banco e passa o Comando SQL
     conexao := TDBXConnectionFactory.GetConnectionFactory.GetConnection('SuaConexao','Usuario','Senha');
     command := conexao.CreateCommand;
     command.Text := 'SELECT * FROM CONTAS_A_PAGAR WHERE UPPER(CON_DESCRICAO) LIKE UPPER(?)';

     // parametro Descrição
     parametro := command.CreateParameter;
     parametro.DataType := TDBXDataTypes.WideStringType;
     parametro.Name := 'pDescricao';
     command.Parameters.AddParameter(parametro);
     command.Parameters.Parameter[0].Value.SetWideString('%' + ContasPagarModel.Descricao + '%');

     // Prepara o Comando e Executa no Banco
     command.Prepare;
     reader := command.ExecuteQuery;

      // Copia o Resultado da consulta para um ClientDataSet
       if Assigned(reader) then
        begin
          TDBXDataSetReader.CopyReaderToClientDataSet(reader, dm_dados.cds_contaspagar);
        end;

   except on e: Exception do
    begin
      raise Exception.Create('Não foi possível realizar a pesquisa' + E.Message);
    end;

   end;
 finally
  FreeAndNil(conexao);
  FreeAndNil(command);
  FreeAndNil(reader);
 end;

end;








ok Obrigado
GOSTEI 0
POSTAR