Fórum Como Relacionar tres tabelas ? #264057

04/01/2005

0

Bom dia a todos do forum, estou prescisando de uma ajuda de vcs.
Estou com o seguinte problema presciso montar um relatorio que traga o resumo de Ordem de producao Agrupado pelo codigo do produto.
Tenho tres tabelas : PRODUTO, ITEMPEDIDO, ORDEMPRODUCAO
PRODUTO: CodProduto, Nome, Estoque
ITEMPEDIDO: CodItemPedido, CodProduto, Qtde, Data
ORDEMPRODUCAO: CodOrdemProducao, CodItemPedido, Qtde, Data

A Tabela OrdemProducao ela é gerada os registro qdo e emitido um pedido com base no itens .

Como posso montar uma SQL q mostre assim no Grid :
CodProduto-------Produto------------QuantidadeProduzida
001 COLA 1000
005 TAMPA 500

Lembrando q este relatorio tem q ser baseada na Tabela ORDEMPRODUCAO. Bom muito obrigado pela atencao !!!
Estou com usando Delphi 7, e interbase, IBQuery


Walter Faria

Walter Faria

Responder

Posts

04/01/2005

Martins

vc poderia montar uma JOIN, isso resolveria o seu problema, ou então, montar uma view com os campos q deseja, com isso vc poderia trabalhar com ela no Delphi como se fosse uma tabela, mas, acho a inner join a melhor opção!


Responder

Gostei + 0

04/01/2005

Vinicius2k

Colega,

Creio que o melhor caminho sejam joins, como dito pelo Martins, e se eu tiver entendido corretamente a lógica da consulta e de seus relacionamentos, a instrução seria essa:
select
  P.CODPRODUTO,
  P.NOME,
  sum(O.QTDE) as QTDE_PRODUZIDA
from
  ORDEMPRODUCAO O
left join
  ITEMPEDIDO I on (O.CODITEMPEDIDO = I.CODITEMPEDIDO)
left join
  PRODUTO P on (I.CODPRODUTO = P.CODPRODUTO)
group by
 1, 2


Espero ter ajudado...
T+


Responder

Gostei + 0

04/01/2005

Walter Faria

Entao, Vicius fiz a minha query da forma q vc me postou:
Pois esta funcionando quase certo, so q a Somatorio de producao estao vindo com valores incorretos. Veja o meu codigo e ve se esta com algo errado :

select
P.CODPRODUTO,
P.NOME,
Sum(O.Quantidade) as QTDE_PRODUZIDA
from
ORDEMPRODUCAO O
Inner join
PRODUTO P on (O.CODPRODUTO = P.CODPRODUTO)
Where O.DataEntrega Between :Inicio AND :Final
group by
P.CodProduto, P.Nome


Entao a somatorio de producaoes tem q ser relacionadas ao periodo que estipular como parametro. para executar esta query esta assim no Button

IBQuery1.Close;
IBQuery1.ParamByName(´Inicio´).AsDate:= edtInicio.Date;
IBQuery1.ParamByName(´Final´).AsDate:= edtFinal.Date;
IbQuery1.Open;

***OBS : Com estes mesmo codigo eu so trocando a funcao SUM por COUNT ela conta a quantidade exata de registro do codigo.

Obrigado pela atencao....


Responder

Gostei + 0

04/01/2005

Vinicius2k

Walter,

Eu não compreendi algumas coisas :

1. Na estrutura que vc passou inicialmente vc tinha 3 tabelas. Onde está a ITEMPEDIDO nesta instrução ?

2. Na tabela ORDEMPRODUCAO, originalmente, não havia a coluna CODPRODUTO... vc alterou a estrutura para que ela utilizasse apenas duas tabelas?
Se vc tiver alterado a estrutura das tabelas, a instrução também deve ser alterada, mas apenas no que diz respeito aos relacionamentos (um join a menos)...

3. Vc está usando INNER JOIN, então cuidado... se não houver correspondencia exata entre as duas tabelas o registro não é considerado... o que lhe levou a utilizar o INNER ?

4. Qual o tipo de dado da coluna DATAENTREGA na tabela ORDEMPRODUCAO ( Date ou TimeStamp) ? E qual o tipo de controle usado para informar a data para o parametro -- edtInicio e edtFinal -- (TDateTimePicker, TDateEdit, Etc...) ?

Se vc me esclarecer estes pontos, talvez eu possa lhe ajudar melhor...
T+


Responder

Gostei + 0

04/01/2005

Walter Faria

Vinicius, ta certo !!!

1º Eu no inicio iria usar tres tabelas, porem eu alterei a estrutura da tabela e agora vou usar apenas 2 tabelas para este meu relatorio. Na tabela ORDEMPRODUCAO existe sim o campo CODPRODUTO.

2º Agora por postar o codigo usando INNER JOIN foi q estava testando e coloquei pra fazer um teste, eu acabei mandando com o INNER JOIN.

3º O Campo DATAENTREGA da tabela ORDEMPRODUCAO = TimeStamp
O componente q estou usando como parametro é o = TDateTimePicker


Entao é isto, se vc poder me ajudar estou aguardando . Valeu !!!


Responder

Gostei + 0

04/01/2005

Vinicius2k

Humm...
Bem, com a alteração na estrutura a query fica mais ´simples´ e eu diria que não há possibilidade de erro na instrução... já que os relacionamentos e foram simplificados...

Meu palpite, é que o problema está justamente aqui :
3º O Campo DATAENTREGA da tabela ORDEMPRODUCAO = TimeStamp O componente q estou usando como parametro é o = TDateTimePicker


1. Vendo os dados da tabela ORDEMPRODUCAO diretamente por uma ferramenta de administração, observe se nos registros o campo DATAENTREGA está armazenando data e hora. Se sim, seu filtro terá de desconsiderar a hora armazenada para trabalhar corretamente, ou vc informar também a hora no filtro...
Para desconsiderar a hora no filtro utilize :
where cast(O.DATAENTREGA as date) between :inicio and :final

Se vc deseja considerar a hora no filtro, não é necessário alterar a SQL, mas precisa informar um parametro DateTime (.AsDateTime ao invés de AsDate), mas terá que ajustar a hora do TDateTimePicker e não somente a data.

2. É preciso ter um certo cuidado ao utilizar TDateTimePicker, pois ele salva em suas propriedades a data e hora em que foi adicionado ao form, e a hora pode estar sendo um problema neste caso. Sete-a para 00:00:00, pois ao contrário do que sugere, a propriedade Date não salva apenas a Data e sim Data e Hora. Coloque um DateTimePicker em um form e faça um teste :
ShowMessage(DateTimeToStr(DateTimePicker1.Date));


Verifique estes pontos, pois creio que o problema está nos valores que estão sendo passados para os parametros do WHERE.

T+


Responder

Gostei + 0

05/01/2005

Walter Faria

Vinicius, analisei os pontos q vc me pediu , e o componente TDateTimePicker estava mesmo considerando a Data/hora, dai eu coloquei a propriedade para 00:00:00 e no parametro coloquei AsDateTime. E agora sim ta beleza.
Muito obrigado , mesmo.... pelas dicas !!!


valeu...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar