Comando Union...
Bom, sou usuário intermediário em firebird e trabalho com a parte de relatórios de uma empresa de sistemas..
E indo direto ao assunto, não sei usar o comando Union e to precisando de algo do tipo pra desenvolver uma query.
Eu tenho uma procedure que retorna a posição do estoque caso o usuário queira saber a quantidade em estoque de um determinado produto em uma determinada data.
E agora eu eu preciso listar a movimentação de estoque do usuário. Pra isso eu defini duas datas, e preciso que quando o usuário definir a data inicial, mostre a quantidade em estoque daquela data pra eu ir somando a cada entrada que aconteceu até a data final e diminuindo pra cada saída. e então mostrar analíticamente as transações de um determinado produto durante um intervalo ´X´ de tempo. Espero ter sido específico :)
Aí vai a forma com que eu estou fazendo a query que está óbviamente errada.
A query de baixo ta certa, ta executando direitinho, oque eu quero é pegar a quantidade da de cima:
SELECT NR_QTD NR_QTD_INI FROM PRC_POSICAO_ESTOQUE(:vDATA)
UNION
SELECT E.CD_ENT, E.CD_PRD, DS_PRD, NR_QTD, DS_NAT_OPE, DH_ENT FROM ENTRADAS_ITENS E
LEFT JOIN ENTRADAS T ON (T.CD_ENT = E.CD_ENT)
LEFT JOIN PRODUTOS P ON (P.CD_PRD = E.CD_PRD)
WHERE (DH_ENT >= :vDATA) AND (DH_ENT <= :vDATA2)
ORDER BY CD_PRD
E indo direto ao assunto, não sei usar o comando Union e to precisando de algo do tipo pra desenvolver uma query.
Eu tenho uma procedure que retorna a posição do estoque caso o usuário queira saber a quantidade em estoque de um determinado produto em uma determinada data.
E agora eu eu preciso listar a movimentação de estoque do usuário. Pra isso eu defini duas datas, e preciso que quando o usuário definir a data inicial, mostre a quantidade em estoque daquela data pra eu ir somando a cada entrada que aconteceu até a data final e diminuindo pra cada saída. e então mostrar analíticamente as transações de um determinado produto durante um intervalo ´X´ de tempo. Espero ter sido específico :)
Aí vai a forma com que eu estou fazendo a query que está óbviamente errada.
A query de baixo ta certa, ta executando direitinho, oque eu quero é pegar a quantidade da de cima:
SELECT NR_QTD NR_QTD_INI FROM PRC_POSICAO_ESTOQUE(:vDATA)
UNION
SELECT E.CD_ENT, E.CD_PRD, DS_PRD, NR_QTD, DS_NAT_OPE, DH_ENT FROM ENTRADAS_ITENS E
LEFT JOIN ENTRADAS T ON (T.CD_ENT = E.CD_ENT)
LEFT JOIN PRODUTOS P ON (P.CD_PRD = E.CD_PRD)
WHERE (DH_ENT >= :vDATA) AND (DH_ENT <= :vDATA2)
ORDER BY CD_PRD
Spleen
Curtidas 0
Respostas
Afarias
22/09/2009
Pelo q entendi, UNION não vai resolver para vc.
UNION apenas realiza a união de conjuntos de tuplas (linhas) com atributos (colunas) iguais.
O q vc deseja pode ser realizado no cliente (código do seu relatório) a partir dos dados dos SELECTS apresentados ou no servidor com um Stored Procedure.
De qualquer forma, vc pode com UNION ter os registros da posição inicial de cada produto + as movimentações, só precisa ajustar os atributos, de forma que teria algo assim:
Veja que tudo q fiz foi dispor os atributos no 1º select semelhante ao 2º select (mesma quantidade, mesmo tipo, na sequência) -- ordenado pelo 2º atributo do conjunto resultante
T+
UNION apenas realiza a união de conjuntos de tuplas (linhas) com atributos (colunas) iguais.
O q vc deseja pode ser realizado no cliente (código do seu relatório) a partir dos dados dos SELECTS apresentados ou no servidor com um Stored Procedure.
De qualquer forma, vc pode com UNION ter os registros da posição inicial de cada produto + as movimentações, só precisa ajustar os atributos, de forma que teria algo assim:
SELECT ´000´, CD_PRD, DS_PRD, NR_QTD, ´POSICAO´, DH_POSICAO FROM PRC_POSICAO_ESTOQUE(:vDATA) UNION SELECT E.CD_ENT, E.CD_PRD, DS_PRD, NR_QTD, DS_NAT_OPE, DH_ENT FROM ENTRADAS_ITENS E LEFT JOIN ENTRADAS T ON (T.CD_ENT = E.CD_ENT) LEFT JOIN PRODUTOS P ON (P.CD_PRD = E.CD_PRD) WHERE (DH_ENT >= :vDATA) AND (DH_ENT <= :vDATA2) ORDER BY 2
Veja que tudo q fiz foi dispor os atributos no 1º select semelhante ao 2º select (mesma quantidade, mesmo tipo, na sequência) -- ordenado pelo 2º atributo do conjunto resultante
T+
GOSTEI 0
Spleen
22/09/2009
Valeu cara, vc resolveu um dos meus problemas que era entender o Union.. O outro é que parece que não vai funcionar mesmo..
Eu não queria ter que criar uma procedure pq pra atualizar nos clientes fica mais trabalhoso. Então tudo que eu puder fazer de forma mais tranquila, fica melhor.
Mas acho que vai ter que ser na procedure mesmo.
Vlw pela atenção, abraço.
Eu não queria ter que criar uma procedure pq pra atualizar nos clientes fica mais trabalhoso. Então tudo que eu puder fazer de forma mais tranquila, fica melhor.
Mas acho que vai ter que ser na procedure mesmo.
Vlw pela atenção, abraço.
GOSTEI 0
Afarias
22/09/2009
Bom, não desejando usar um SP, vc pode:
1) fazer no código da aplicação/relatório (nesses casos é o q eu costumo fazer)
2) se estiver usando FB 2.1, vc pode usar EXECUTE BLOCK. Assim vc tem todo o poder de um procedimento, sem ter q criá-lo na base de dados (já q vc deseja por alguma razão evitar isto)
T+
1) fazer no código da aplicação/relatório (nesses casos é o q eu costumo fazer)
2) se estiver usando FB 2.1, vc pode usar EXECUTE BLOCK. Assim vc tem todo o poder de um procedimento, sem ter q criá-lo na base de dados (já q vc deseja por alguma razão evitar isto)
T+
GOSTEI 0