Fórum Comando Union... #60884

22/09/2009

0

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


Spleen

Spleen

Responder

Posts

22/09/2009

Afarias

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:


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+


Responder

Gostei + 0

22/09/2009

Spleen

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.


Responder

Gostei + 0

22/09/2009

Afarias

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+


Responder

Gostei + 0

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

Aceitar