Ir para conteúdo

POWERED BY:

Arquivado

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

flavioavilela

[Resolvido] abrir query com vários dados depois de um while

Recommended Posts

galera, boa tarde...

estou tentando fazer uma consulta sql e já estou até perdendo a paciencia..

segue abaixo um exemplo do que estou precisando, mas que nao está dando certo...

dm.qryquantidade_itens_vendidos.First;

	dm.qrydetalhe_produtos_vendidos.close;
	dm.qrydetalhe_produtos_vendidos.sql.Clear;
	while not dm.qryquantidade_itens_vendidos.Eof do
	  begin
		with dm.qrydetalhe_produtos_vendidos do
		  begin
			sql.Add('select Produtos.Codigo_Produto, Produtos.Nome, Produtos.Qtde_Maxima, Produtos.Qtde_Minima, Produtos.Estoque_Risco, Produtos.Qtde_Estoque from Produtos');
			sql.Add('where Produtos.Codigo_Produto = :Produto');
			Parameters.ParamByName('Produto').Value:= DM.qryquantidade_itens_vendidos.FieldByName('Codigo_Produto').AsString;
		  end;
		  dm.qryquantidade_itens_vendidos.Next;
	  end;
	  dm.qrydetalhe_produtos_vendidos.open;

ou seja, essa query qryquantidade_itens_vendidos tem umas informações sobre produtos vendidos... e essa qrydetalhe_produtos_vendidos vai pegar todos os produtos que estão na qryquantidade_itens_vendidos, pegar os seus dados na tabela de produtos e jogar para a query detalhe_produto_vendidos que consequentemente está ligada a um dbgrid que irá mostrar os dados........ só que, quando eu dou um .open, ele abre pra mim apenas o último registro, e nao todos....

como faria pra resolver isso? pegar os produtos da 1 query e pegar seus dados na tabela de produtos e jogar pra outra query e quando eu abrisse, abrisse com todos os dados:????

espero que tenham entendido oq quero dizer rsrsrs....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu problema está em não saber utilizar os comandos sql meu amigo... da forma como está fazendo, você está gerando um laço de repetição para carregar todos os dados referentes a apenas 1 código de produto por vez, ao invés de todos os registros que você quer. Porque? Simples... uma query não acumula registros... a cada vez que dá um close e um open, ela refaz a consulta que você programou nela e carrega os dados, sem ficar os acumulando ... ou seja, você está pesquisando 10 itens diferentes para, no final, ter apenas o da última consulta que mandou executar.

 

Seu problema é mais fácil de resolver com uma simples consulta usando inner join na tabela que tem os itens vendidos... supondo que o nome da sua tabela seja TB_ITENS_VENDIDOS, você poderia trocar sua sql por esta (e retirar o while tb).

 

SELECT P.Codigo_Produto, P.Nome, P.Qtde_Maxima, P.Qtde_Minima, P.Estoque_Risco, P.Qtde_Estoque 
From Produtos P
INNER JOIN TB_ITENS_VENDIDOS (P.Codigo_Produto = IV.Codigo_Produto)
WHERE IV.Codigo_Venda = 10

Tente adaptar a select acima para o seu código e vai ver que é simples.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

certo... entendi agora...

só que, pra entender melhor, é o seguinte: nesse seu where, você colocou um valor exporadico né, no meu caso, eu já tenho uma query ligada a um dbgrid... nesse momento, essa query já está me listando todos os produtos que vendi, então foi por isso que eu fiz o while pois, a cada item do dbgrid que já está aberto, ele passa como parametro o codigo do produto, então, meu where é o código do produto, entendeu...??? mesmo assim, nao preciso do while???

Compartilhar este post


Link para o post
Compartilhar em outros sites

A questão é: como você seleciona os produtos da sua primeira query? Essa é a chave que vai usar para montar o where. Coloque os dois selects que usa aqui e te ajudo a montar.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

obrigado amigo, pela sua compreenção e disposição em me ajudar... lá vai a 1 query...

 

with dm.qryquantidade_itens_vendidos do
	begin
	  close;
	  sql.Clear;
	  sql.add('select Itens_Venda.Codigo_Produto, Itens_Venda.Nome_Produto, sum(Itens_Venda.Sub_Total) from Itens_Venda, Venda');
	  sql.Add('where Itens_Venda.N_Pedido = Venda.N_Pedido and Venda.Data_Pedido between :Data_Inicial and :Data_Final Group By Codigo_Produto, Nome_Produto');
	  Parameters.ParamByName('Data_Inicial').Value:= StrToDateTime(EdtData_Inicial.Text);
	  Parameters.ParamByName('Data_Final').Value:= StrToDateTime(EdtData_Final.Text);
	  open;
	end;

e a segunda foi essa já que só adaptei para o inner join... que ficou igual a sua

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem uma coisa que devo observar a respeito da sua query: se você tiver dois ou mais pedidos de venda no mesmo período selecionado, como você vai saber qual item é de qual pedido sem exibir o número do pedido? Com base nesta pergunta, fiz uma alteração na sua sql inicial:

 

SELECT V.N_PEDIDO, IV.CODIGO_PRODUTO, IV.NOME_PRODUTO, SUM(IV.SUB_TOTAL) 
FROM VENDA V
INNER JOIN ITENS_VENDA IV ON (V.N_PEDIDO = IV.N_PEDIDO) 
WHERE V.DATA_PEDIDO BETWEEN :DATA_INICIAL AND :DATA_FINAL 
GROUP BY V.N_PEDIDO, IV.CODIGO_PRODUTO, IV.NOME_PRODUTO

E, com base nessa alteração, montei a sql que precisaria usar para listar os dados de todos os produtos de um pedido:

 

SELECT P.CODIGO_PRODUTO, P.NOME, P.QTDE_MAXIMA, P.QTDE_MINIMA, P.ESTOQUE_RISCO, P.QTDE_ESTOQUE
FROM VENDA V
INNER JOIN ITENS_VENDA IV ON (V.N_PEDIDO = IV.N_PEDIDO) 
INNER JOIN PRODUTOS P ON (IV.CODIGO_PRODUTO = P.CODIGO_PRODUTO)
WHERE V.N_PEDIDO = :PEDIDO

Agora, se o número do pedido não for necessário, você pode fazer assim a segunda query, para pegar os dados de todos os produtos do 1° grid:

 

SELECT P.CODIGO_PRODUTO, P.NOME, P.QTDE_MAXIMA, P.QTDE_MINIMA, P.ESTOQUE_RISCO, P.QTDE_ESTOQUE
FROM VENDA V
INNER JOIN ITENS_VENDA IV ON (V.N_PEDIDO = IV.N_PEDIDO) 
INNER JOIN PRODUTOS P ON (IV.CODIGO_PRODUTO = P.CODIGO_PRODUTO)
WHERE V.DATA_PEDIDO BETWEEN :DATA_INICIAL AND :DATA_FINAL 
GROUP BY P.CODIGO_PRODUTO, P.NOME, P.QTDE_MAXIMA, P.QTDE_MINIMA, P.ESTOQUE_RISCO, P.QTDE_ESTOQUE

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok meu amigo... para mim, acho que seria mais viavel a 3 query, pois, na consulta em questão, nao me importo em saber ql n do pedido ou a data do pedido.. queor apenas um total geral de tudo, independente do pedido, apenas no período informado... já vou fazer o teste agora, e já já posto o resultado...

desde já, obrigado pela sua ajuda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

adaptei ao meu código aqui e da uma msg de erro: 'O nome de correlação IV' ou 'P' ou 'V' 'está especificado várias vezes em uma clausula FROM'....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posta o código que você montou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

select P.Codigo_Produto, P.Nome, P.Qtde_Maxima, P.Qtde_Minima, P.Estoque_Risco, P.Qtde_Estoque from Produtos P, Venda V, Itens_Venda IV

inner join Itens_Venda IV on (V.N_Pedido = IV.N_Pedido)

inner join Produtos P on(IV.Codigo_Produto = P.Codigo_Produto)

where V.Data_Pedido between :Data_Inicial and :Data_Final group by P.Codigo_Produto, P.Nome, P.Qtde_Maxima, P.Qtde_Minima, P.Estoque_Risco, P.Qtde_Estoque

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código que você montou no seu from está errado!!! Quando se usa inner join, você já está dizendo a sql que vai usar as tabelas que estão ali citadas entre o inner join e o on ... não se usa inner join tabela1 com from tabela, tabela1.

 

Forma errada:

 

from Produtos P, Venda V, Itens_Venda IV
inner join Itens_Venda IV on (V.N_Pedido = IV.N_Pedido)
inner join Produtos P on(IV.Codigo_Produto = P.Codigo_Produto)

Forma correta:

 

from Venda V
inner join Itens_Venda IV on (V.N_Pedido = IV.N_Pedido)
inner join Produtos P on(IV.Codigo_Produto = P.Codigo_Produto)

Dê uma estudada nos comandos sql ... principalmente nos INNER JOIN e LEFT JOIN, que com certeza você irá utilizar muito no futuro.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

No problems, estamos ai pra ajudar... mas pensa naquela questão que te falei: se o cliente quiser saber quais itens pertencem a quais pedidos, nesta select que montou não terá como mostrar isso a ele.

 

[]'s

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.