Fórum Query com mais de um sum relacionando tabelas #338021
19/02/2007
0
:arrow: Uso [b:9f21643087]Delphi 6 + Interbase 6 + IBQuery[/b:9f21643087]
A ideia é cadastrar uma receita e ter quantos igredientes quiser, então estou treinando o mestre / detalhe com multiplas tabelas
Bom vou organizar aqui... tenham paciencia :)
[b:9f21643087]MReceita[/b:9f21643087] (Tabela master)
-------------
IDMRECEITAINTEGERNOT NULL - PK
NOMERECEITAVARCHAR(100)NOT NULL
IDTIPOPRATOINTEGER NOT NULL - FK (tabela tipoprato)
PREPAROVARCHAR(5000)NOT NULL
[b:9f21643087]DReceita[/b:9f21643087] (Tabela Detalhe)
-------------
IDDRECEITAINTEGERNOT NULL - PK
IDMRECEITAINTEGERNOT NULL - FK (tabela MReceita)
IDIGREDIENTEINTEGERNOT NULL - FK (tabela Igrediente)
IDTIPOQUANTIDADEINTEGER NOT NULL - FK (tabela TipoQuantidade)
QUANTIDADEVARCHAR(10)NOT NULL
[b:9f21643087]Igrediente[/b:9f21643087] (Tabela Detalhe) (Cadastro dos igredientes)
-------------
IDIGREDIENTEINTEGER NOT NULL - FK (tabela DReceita)
IGREDIENTEVARCHAR(100)NOT NULL
[b:9f21643087]TipoQuantidade[/b:9f21643087] (Tabela Detalhe) (ex: colher, pitada, xicara, litro..)
-------------
IDTIPOQUANTIDADEINTEGER NOT NULL - FK (Tabela DReceita)
TIPOQUANTIDADEVARCHAR(100)NOT NULL
:arrow: A ideia do projeto é o usuario ficar livre e poder fazer do jeito dele.
:arrow: Bom a minha duvida é: Eu tenho um relatorio onde eu escolheria as receitas e no final do relatorio preciso saber
- Quanto de cada igrediente eu preciso comprar
ex do relatorio
Nome da receita: Macarrão
Igredientes | Quantidade | Tipo quantidade
Cebola | 1 | unidade
Alho | 30 | gramas
Tomate | 4 | xicaras
Nome da receita: Panqueca
Igredientes | Quantidade | Tipo quantidade
Cebola | 2 | unidade
Tomate | 2 | xicaras
Leite | 500 | ml
No final do relatorio queria algo assim
Cebola => 3 unidades
Alho => 30 gramas
Tomate => 6 xicaras
Leite => 500 ml
Deu para entender? :)
Desculpa o post gigante é para tentar explicar da melhor forma possivel
Corcos
Curtir tópico
+ 0Posts
19/02/2007
Pestana_
você quer saber a qtde de cada igrediente a ser comprado? o campo QUANTIDADE da tabela DReceita não informaria isso pra você?
aguardo,
flw.
Gostei + 0
19/02/2007
Emerson Nascimento
de qualquer forma, vai aí uma solução em que você utilizaria duas instruções: uma para o relatório em si e outra para o resumo.
select mr.NomeDaReceita, i.Ingrediente, dr.Quantidade, tq.TipoQuantidade from MReceita mr left join DReceita dr on (dr.IDMReceita = mr.IDMReceita) left join Ingrediente i on (i.IDIngrediente = dr.IDIngrediente) left join TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade) order by mr.NomeReceita
agora, para o resumo, faça:
select i.IDIngrediente, i.Ingrediente, sum(dr.Quantidade) QuantidadeTotal, tq.TipoQuantidade from DReceita dr left join Ingrediente i on (i.IDIngrediente = dr.IDIngrediente) left join TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade) group by i.IDIngrediente, i.Ingrediente, tq.TipoQuantidade order by i.Ingrediente
Gostei + 0
19/02/2007
Corcos
:seta: [b:0b558c5baf]Eu uso o QuickReport mesmo[/b:0b558c5baf]
O select que eu to usando para o relatorio é esse, e esta funcionando 100¬, o que eu quero é só o somatorio no final
Em nenhuma tabela eu guardo o total por igrediente, por isso preciso de um sum na tabela DReceita onde é FK para a tabela igrediente.
Ou seja, preciso pegar as receitas da semana, dentro dessas receitas tem os igredientes e somar todos os igredientes (agrupando eles).
Gostei + 0
19/02/2007
Corcos
Gostei + 0
19/02/2007
Corcos
Valeu mesmo pela força
Gostei + 0
19/02/2007
Corcos
Fiz o relatorio e ficou super show!
Agora veio outra questão, como eu poderia montar tipo um grid, onde eu selecionado os pratos ele gere a receita somente dos que eu selecionei.
Como eu colocaria um where com varias receitas selecionadas?
vcs indicam um dbgrid ou um list mesmo
Gostei + 0
19/02/2007
Emerson Nascimento
sua instrução poderá ser condicionada assim:
where idreceita/nomereceita in (lista de receitas)
de modo que, dependendo do caso, seja montada da seguinte forma:
[b:0f908cf018]where idmreceita in (2, 14, 5, 9) [/b:0f908cf018]//no caso de IDs
ou
[b:0f908cf018]where nomereceita in (´MACARRONADA´, ´ARROZ DOCE´, ´BATATA SAUTE´)[/b:0f908cf018] // no caso de escolher por nome
a exibição fica a seu critério, mas acho que um grid não seria a melhor opção nesse caso.
Gostei + 0
19/02/2007
Corcos
[b:471c1e3df7]FrmPesqReceita[/b:471c1e3df7]
- Eu tenho um grid ou qualquer componente para exibir todas as receitas cadastradas(o que vcs indicam).
- O usuario vai escolhendo as receitas que vai utilizar
- Clica em ok e gera o relatorio com os igredientes que essas receitas utilizam, fazendo uma lista de compras.
Essa sua query funciona show de bola
Mas preciso trazer somente os igredientes das receitas selecionadas, ai fica a duvida onde e como vou fazer isso
Seria mais ou menos assim? Mas como vou fazer um where se eu não sei a quantidade de receitas... :)
select
i.IDIgrediente,
i.Igrediente,
sum(dr.Quantidade) QuantidadeTotal,
tq.TipoQuantidade
from
DReceita dr
where
[color=indigo:471c1e3df7][b:471c1e3df7] i.iDIgrediente = :VarID1 and
i.iDIgrediente = :VarID2[/b:471c1e3df7][/color:471c1e3df7]
left join
Igrediente i on (i.IDIgrediente = dr.IDIgrediente)
left join
TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade)
group by
i.IDIgrediente,
i.Igrediente,
tq.TipoQuantidade
order by
i.Igrediente
Valeu de novo pela ajuda, quando eu terminar vou disponibilizar o fonte para a galera poder consultar e treinar tb... :)
Gostei + 0
19/02/2007
Emerson Nascimento
select i.IDIgrediente, i.Igrediente, sum(dr.Quantidade) QuantidadeTotal, tq.TipoQuantidade from DReceita dr left join Igrediente i on (i.IDIgrediente = dr.IDIgrediente) left join TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade) where i.iDMReceita = :VarID1 or i.iDMReceita = :VarID2 group by i.IDIgrediente, i.Igrediente, tq.TipoQuantidade order by i.Igrediente
ou
select i.IDIgrediente, i.Igrediente, sum(dr.Quantidade) QuantidadeTotal, tq.TipoQuantidade from DReceita dr left join MReceita mr on (mr.IDMReceita = dr.IDMReceita) left join Igrediente i on (i.IDIgrediente = dr.IDIgrediente) left join TipoQuantidade tq on (tq.IDTipoQuantidade = dr.IDTipoQuantidade) where mr.NomeReceita in (´MACARRAO´, ´PANQUECA´) group by i.IDIgrediente, i.Igrediente, tq.TipoQuantidade order by i.Igrediente
Gostei + 0
19/02/2007
Corcos
O problema é que posso escolher quantas receitas quiser, como vou por no [b:13fc506bb7]where [/b:13fc506bb7]uma quantidade infinita de condições de escolha, conseguiu entender?
Eu posso escolher 1 ou 30 receitas para gerar a lista de compras, vou ter que declarar 30 variaveis e assim limitar o número de receitas escolhidas?
Funciona assim, tem um grid, e o usuario vai segurando ctrl e escolhendo as receitas, vamos dar exemplo que ele escolheu 12 receitas, quando ele da o ok, gera o relatorio com a sua query, mas preciso dos igrediente somente dessas receitas que foram selecionadas
Conseguiu entender?
Desculpa estar enchendo o saco com o assunto :) é que eu realmente por não conhecer profudamente o delphi/sql não sei :(
Gostei + 0
21/02/2007
Corcos
Como eu conheço pouco SQL fica complicado tentar imaginar como..
Emerson fez essa query que esta ok.
Eu preciso agora que ela procure na tabela MReceita o campo DataCompra quando ele fica nulo
Eu tentei assim
Só que ele da erro, alguem tem ideia de como montar isso?
Gostei + 0
21/02/2007
Corcos
Fiz uns testes e usei a logica do Emerson e funcionou
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)