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

Consulta não funciona


Vivendo&Aprendendo

Pergunta

Olá pessoal...

Depois de algum tempo estou de volta...

Tenho uma busca em meu sistema que faz relação em duas tabelas (Saidas e ItensSaidas). Estou usando a seguinte instrução sql para esta busca:

DmDados.Saidas.Close;
       DmDados.Saidas.SQL.Clear;
       DmDados.Saidas.SQL.Add('SELECT Distinct(ItensSaidas.CodigoSaidas), Saidas.Codigo, Saidas.DataSaida,');
       DmDados.Saidas.SQL.Add('Saidas.NPedido, Saidas.Cliente, Saidas.SolicitadoPor, Saidas.FormaPgto, Saidas.TipoPgto,');
       DmDados.Saidas.SQL.Add('Saidas.DataVencimento, Saidas.ValorRecebido, Saidas.Desconto, Saidas.Desconto2, Saidas.Troco,');
       DmDados.Saidas.SQL.Add('Saidas.ValorTotalNF, Saidas.TotalComDesconto, Saidas.TipoDesconto, Saidas.TotalItens, Saidas.ValorRestante,');
       DmDados.Saidas.SQL.Add('Saidas.TotalDesconto, ItensSaidas.CodigoSaidas, ItensSaidas.CodProduto, ItensSaidas.Descricao,');
       DmDados.Saidas.SQL.Add('ItensSaidas.Placa, ItensSaidas.LocalPlaca, ItensSaidas.Cidade,');
       DmDados.Saidas.SQL.Add('ItensSaidas.ValorUnit, ItensSaidas.ValorTotalProduto');
       DmDados.Saidas.SQL.Add('FROM Saidas INNER JOIN ItensSaidas ON Saidas.Codigo = ItensSaidas.CodigoSaidas');
       DmDados.Saidas.SQL.Add('Where Cliente Like :pCli');
       DmDados.Saidas.SQL.Add('Order By Codigo');
       DmDados.Saidas.Parameters[0].Value := EdtBusca.Text + '%';
       DmDados.Saidas.Open;

Onde DmDados é o meu Data Module. Nesta busca ele deve relacionar as duas tabelas e me mostrar as vendas e produtos daquela venda em dois grids diferentes. Até ai tudo ok.

O meu problema é que quando resolvo filtrar ou seja, quando uso essa sql ai ele pega a venda e duplica ela pelo número de produtos que esta venda tem. Tipo se a venda código 1 tiver 4 produtos ele repete a venda 1 quatro vezes no grid.

Já coloquei o Distinct mas não funciona, acho que pelo motivo da tabela ItensSaidas não ter os campos todos iguais.

Por favor alguém ai me ajude.

Grato

Alexandre

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0
O meu problema é que quando resolvo filtrar ou seja, quando uso essa sql ai ele pega a venda e duplica ela pelo número de produtos que esta venda tem. Tipo se a venda código 1 tiver 4 produtos ele repete a venda 1 quatro vezes no grid.

É exatamente isto que acontece quando se usa relacionamento entre tabelas ...

voce tem que apresentar em uma grid a venda e em outra os produtos, simplesmente usando o editor de colunas do DBGrid, quando voce dá 2 cliques sobre o DBGrid e define o campos que quer visualizar.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Jhonas...

é exatamente dessa forma que está montada minha tela (dois grids um para vendas e o outro para os itens da venda) porém quando eu faço uma busca por cliente por exemplo ele duplica os registros no grid de venda e no grid de itens da venda fica normal.

O que posso fazer para mudar isso, ou seja, para quando fazer uma busca ele apenas mostrar a venda requerida e não duplicar ela?

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0
é exatamente dessa forma que está montada minha tela (dois grids um para vendas e o outro para os itens da venda) porém quando eu faço uma busca por cliente por exemplo ele duplica os registros no grid de venda e no grid de itens da venda fica normal.

O que posso fazer para mudar isso, ou seja, para quando fazer uma busca ele apenas mostrar a venda requerida e não duplicar ela?

uma maneira seria voce tirar o grid da venda e substituir por um DBLookupComboBox1 que mostrará o codigo da venda e deixar o outro grid somente para mostrar os itens da venda.

No DBLookupComboBox1 voce define as propriedades ListSource = (seu DataSource) , o ListField = ( campo da sua tabela ' COD_Venda ' por exemplo ) e o KeyField = ( campo da sua tabela ' COD_Venda ' por exemplo )

desta maneira voce ao fazer o select da venda, voce verá no DBLookupComboBox1 o código da venda e no DBGrid os itens da venda.

existem outras formas de se fazer a mesma a coisa, depende da maneira como vai usar.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Você está tentando selecionar as saidas dos itens ao invés de os itens da saída. Por isso ele retorna várias saidas de acordo com a quantidade de itens na consulta. Já tentou selecionar os itens da saida?

DmDados.Saidas.SQL.Add('FROM Saidas INNER JOIN ItensSaidas ON Saidas.Codigo = ItensSaidas.CodigoSaidas');

Agora se você quer classificar as saídas que venderam um certo produto, você está quase lá.

Pode utilizar também um select dentro de outro. (pesquise um pouco qual forma se aplica ao seu banco).

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

  • 0
Eu preciso apenas efetuar uma busca em um edit por cliente e no grid abaixo aparecer a venda daquele cliente
Você usa uma query sobre as vendas (ou suas Saídas) para os dados deste DBGrid, onde filtra o cliente...

e em outro grid os produtos da venda selecionada no grid.
... e usa outra query para mostrar neste DBGrid os itens da venda, selecionada no 1º DBGrid, usando como parâmetro no filtro o campo de relação entre eles.

O conceito é o mesmo que este outro que já expliquei em outro tópico - dê uma olhada nele.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Micheus e os demais...

Não sei se eu expliquei de forma errada, ou se você entendeu de forma equivocada. Isso ai que você explicou em seu post eu já fiz.

A tela está totalmente funcional, com os grid e relacionamentos funcionando. Tudo certo. No 1º grid mostro as vendas e no segundo os itens (produtos) desta venda, tudo ok.

O problema aparece quando desejo consultar uma venda (por cliente, por exemplo) ai o grid de vendas que estava certo (mostrando as vendas de forma correta) começa a me mostrar vendas duplicadas (conforme o número de produtos que a venda consulta contém). Por exemplo: Se eu busco uma venda pelo nome do cliente Alexandre ai o grid de venda me mostra todas as vendas desses cliente, porém cada venda é duplicada conforme o número de registros que ela contém na tabela de itens.

Tudo está funcionando só preciso corrigir esta parte da consulta.

É isso ai.

Abraços

Alexandre

Link para o comentário
Compartilhar em outros sites

  • 0
O problema aparece quando desejo consultar uma venda (por cliente, por exemplo) ai o grid de vendas que estava certo (mostrando as vendas de forma correta) começa a me mostrar vendas duplicadas (conforme o número de produtos que a venda consulta contém). Por exemplo: Se eu busco uma venda pelo nome do cliente Alexandre ai o grid de venda me mostra todas as vendas desses cliente, porém cada venda é duplicada conforme o número de registros que ela contém na tabela de itens.
Vivendo&Aprendendo, há algum motivo específico para que naquela sua consulta (que supostamente está no primeiro DBGrid) traga as informações sobre os itens da saída, uma vez que esta informação supostamente deveria aparecer apenas no segundo DBGrid?

Se não tiver, use naquela consulta apenas os dados da tabela de saída (a master - no 1º DBGrid) e use o seu código para filtrar os itens (o detalhe - no 2º DBGrid) - faça um teste e confira o resultado (vai cair no que está no post que havia citado).

Quando você usa o distinct, que está dizendo para que seja retornado apenas uma ocorrência de toda a linha encontrada, ou seja, todos os campos são levados em conta. Assim, você terá a repetição de todos os dados de uma mesma saída quando os produtos (ou qualquer outro campo) são diferentes.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal consegui fazer da seguinte forma:

ADOItensSaidas.Close;
       ADOItensSaidas.SQL.Clear;
       ADOItensSaidas.SQL.Add('SELECT Distinct(ItensSaidas.CodigoSaidas), Saidas.Codigo, Saidas.DataSaida,');
       ADOItensSaidas.SQL.Add('Saidas.NPedido, Saidas.Cliente, Saidas.SolicitadoPor, Saidas.FormaPgto, Saidas.TipoPgto,');
       ADOItensSaidas.SQL.Add('Saidas.DataVencimento, Saidas.ValorRecebido, Saidas.Desconto, Saidas.Desconto2, Saidas.Troco,');
       ADOItensSaidas.SQL.Add('Saidas.ValorTotalNF, Saidas.TotalComDesconto, Saidas.TipoDesconto, Saidas.TotalItens, Saidas.ValorRestante,');
       ADOItensSaidas.SQL.Add('Saidas.TotalDesconto, ItensSaidas.CodigoSaidas, ItensSaidas.CodProduto, ItensSaidas.Descricao,');
       ADOItensSaidas.SQL.Add('ItensSaidas.Placa, ItensSaidas.LocalPlaca, ItensSaidas.Cidade,');
       ADOItensSaidas.SQL.Add('ItensSaidas.ValorUnit, ItensSaidas.ValorTotalProduto, ItensSaidas.NAutorizacao, ItensSaidas.Tarjetas,');
       ADOItensSaidas.SQL.Add('ItensSaidas.Visivel, ItensSaidas.Produto');
       ADOItensSaidas.SQL.Add('FROM Saidas INNER JOIN ItensSaidas ON Saidas.Codigo = ItensSaidas.CodigoSaidas');
       ADOItensSaidas.SQL.Add('Where CodProduto Like :pPla ');
       ADOItensSaidas.SQL.Add('Order By Codigo');
       ADOItensSaidas.Parameters[0].Value := EdtBusca.Text + '%';
       ADOItensSaidas.Open;
       CS := ADOItensSaidasCodigoSaidas.Value;
       DmDados.Saidas.Close;
       DmDados.Saidas.SQL.Clear;
       DmDados.Saidas.SQL.Add('SELECT * FROM Saidas');
       DmDados.Saidas.SQL.Add('Where Codigo Like :pCod ');
       DmDados.Saidas.SQL.Add('Order By Codigo');
       DmDados.Saidas.Parameters[0].Value := IntToStr(CS) + '%';
       DmDados.Saidas.Open;

Faço a busca pelo código do produto vendido por exemplo na tabela Itens ai ela me retorna o produto no 2º Grid. Uso CS que é uma variável Integer que recebe o Código da venda da tabela Itens e depois filtra a tabela vendas por este codigo para mostrar a venda no 1º Grid.

Agora funcionou, mas ainda acho que é uma "gambiarra" porém funcional.

Não entendi muito bem a explicação de vocês, mas agradeço e muito.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Faço a busca pelo código do produto vendido por exemplo na tabela Itens ai ela me retorna o produto no 2º Grid. Uso CS que é uma variável Integer que recebe o Código da venda da tabela Itens e depois filtra a tabela vendas por este codigo para mostrar a venda no 1º Grid.

Agora funcionou, mas ainda acho que é uma "gambiarra" porém funcional.

Não entendi muito bem a explicação de vocês, mas agradeço e muito.

Com certeza não está bom.

Mas, se você não conseguiu compreender mesmo o que tentei explicar no post que pus de referência, então não dá para explicar melhor.

O seu caso é exatamente o que está lá, exceto pelo nome dos dataset's. A figura 2 ilustra o que você estaria fazendo. Ao filtrar cada elemento na tabela Pedido que é mostrado no 1º DBGrid (no seu caso seria Saidas), os vários elementos da tabela Parcelas (no seu caso ItensSaidas), para aquele pedido, seriam listados no 2º DBGrid.

Boa sorte.

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,4k
×
×
  • Criar Novo...