Ajuda com query

Delphi

24/04/2008

Senhores, a query abaixo mostra os itens, a venda e a forma de pagamento. Acontece que eu vendi 4 itens, nessa query, em duas formas de pagamento somente. O que eu gostaria de fazer, se for possível, é trazer os meus 4 itens e somente duas as duas formas, e não repetisse para os outros 2 itens restantes. Se eu vender 10 itens em uma única forma de pagamento, exemplo dinheiro, essa query me lista os dez itens(correto) e dez vezes a palavra dinheiro, qundo eu gostaria de vir somente uma vez e as demais virem nula. tem como? Abaixo a minha query. Delphi 2007, Firebird 2, DBexpress.

SELECT TB_SAC_NF_ITEM.NU_CX, TB_SAC_NF_ITEM.NU_NF, TB_SAC_NF_ITEM.SR_NF, TB_SAC_NF_ITEM.NU_SEQ_ITEM, TB_SAC_NF_ITEM.CD_PROD, TB_SAC_NF_ITEM.DESCRICAO , TB_SAC_NF_PAGAMENTO.CD_F_PAG, TB_SAC_NF_PAGAMENTO.VL_PAG, TB_SAC_FORMA_PAGTO.DESCRICAO ´FORMA´, TB_SAC_NF_ITEM.QT_ITEM, TB_SAC_NF_ITEM.VL_ITEM, (TB_SAC_NF_ITEM.QT_ITEM*TB_SAC_NF_ITEM.VL_ITEM) AS TOTAL, CASE TB_SAC_NF_ITEM.ST_CANC WHEN 0 THEN ´NAO´ WHEN 1 THEN ´SIM´ END ST_CANC FROM TB_SAC_NF_CAPEADOR, TB_SAC_NF_ITEM, TB_SAC_NF_PAGAMENTO, TB_SAC_FORMA_PAGTO WHERE TB_SAC_NF_ITEM.NU_CX = TB_SAC_NF_CAPEADOR.NU_CX AND TB_SAC_NF_PAGAMENTO.NU_CX = TB_SAC_NF_CAPEADOR.NU_CX AND TB_SAC_NF_PAGAMENTO.NU_NF = TB_SAC_NF_CAPEADOR.NU_NF AND TB_SAC_FORMA_PAGTO.CD_F_PAG = TB_SAC_NF_PAGAMENTO.CD_F_PAG AND TB_SAC_NF_ITEM.NU_NF = TB_SAC_NF_CAPEADOR.NU_NF AND TB_SAC_NF_ITEM.SR_NF = TB_SAC_NF_CAPEADOR.SR_NF AND TB_SAC_NF_CAPEADOR.NU_CX = 1 AND TB_SAC_NF_ITEM.SR_NF = ´D2´ AND TB_SAC_NF_CAPEADOR.NU_NF = 1378 ORDER BY TB_SAC_NF_ITEM.NU_NF, TB_SAC_NF_ITEM.NU_SEQ_ITEM



Paulo

Paulo

Curtidas 0

Respostas

Tiagotecchio

Tiagotecchio

24/04/2008

tentou com uma stored procedure? Se vc utilizar o for..into..do com um contador dá pra fazer tranquilo.


GOSTEI 0
Paulo

Paulo

24/04/2008

Como assim?


GOSTEI 0
Tiagotecchio

Tiagotecchio

24/04/2008

Simples: crie uma stored procedure com base na query que vc está fazendo. Para isso vc terá que usar um for..into..do com suspend para retornar todas as linhas da query. Até aí é fácil. A única dificuldade é colocar um contador e uma variável para diferenciar a descrição da forma de pagamento.


GOSTEI 0
Tiagotecchio

Tiagotecchio

24/04/2008

Segue um exemplo:
CREATE PROCEDURE SP_TESTE (
    parametro integer)
returns (
    codigo integer,
    descricao varchar(60),
    estado varchar(2))
as
declare variable aux_str varchar(20);
declare variable aux_uni integer;
begin
     AUX_STR = ´´;
     FOR SELECT CODIGO,
                DESCRICAO,
                COALESCE(ESTADO,´´)
           FROM TABCIDADE
          /*WHERE CODIGO = :PARAMETRO*/
           ORDER BY ESTADO, CODIGO
           INTO :CODIGO,
                :DESCRICAO,
                :ESTADO
     DO
     BEGIN
          if (AUX_STR <> ESTADO) then
          BEGIN
              AUX_STR = ESTADO;
              --ESTADO = AUX_STR;
          END
          ELSE
          BEGIN
             ESTADO = ´´;
          END
          suspend;
     END
END



GOSTEI 0
Tiagotecchio

Tiagotecchio

24/04/2008

E o resultado é esse:
---------------------------------
CODIGODESCRICAOESTADO
---------------------------------
1CAXIAS DO SULRS
2PELOTAS
3FLORIANÓPOLIS
8FLORES DA CUNHA
235SÃO BORJA
4NOVO HAMBURGOSC
5LAGOA VERMELHA
6CANGUCU
7MARMELEIRO
18SANTIAGOSP
29QUATRO BARROS
38NOVA BASSANO
---------------------------------



GOSTEI 0
POSTAR