GARANTIR DESCONTO

Fórum Procedure retorna valores somente na primeira linha... #58490

05/07/2007

0

Colegas..

tenho a seguinte Procedure

CREATE PROCEDURE RELATORIO_FATURAMENTO(
    I_MES_INICIAL INTEGER,
    I_ANO INTEGER)
RETURNS (
    C_COD_GRUPO CHAR(2),
    C_COD_SUB_GRUPO CHAR(2),
    C_SUM_MES_1 FLOAT,
    C_SUM_MES_2 FLOAT,
    C_SUM_MES_3 FLOAT,
    C_SUM_MES_4 FLOAT,
    C_SUM_MES_5 FLOAT,
    C_SUM_MES_6 FLOAT,
    C_SUM_MES_7 FLOAT,
    C_SUM_MES_8 FLOAT,
    C_SUM_MES_9 FLOAT,
    C_SUM_MES_10 FLOAT,
    C_SUM_MES_11 FLOAT,
    C_SUM_MES_12 FLOAT)
AS
DECLARE VARIABLE V_I INTEGER;
DECLARE VARIABLE V_MES INTEGER;
DECLARE VARIABLE V_ANO INTEGER;
begin
    V_MES = :I_MES_INICIAL;
    V_ANO = :I_ANO;
    for select Distinct (Substring(C_COD_OBRA from 1 for 2)),
                        (Substring(C_COD_OBRA from 6 for 2))
        from  NF0100
        into  :C_COD_GRUPO, :C_COD_SUB_GRUPO
    do
    begin
        V_I = 1;
        while (:V_I <= 12) do
        begin
            if (:V_I = 1) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_1;
            end
            else if (:V_I = 2) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_2;
            end
            else if (:V_I = 3) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_3;
            end
            else if (:V_I = 4) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_4;
            end
            else if (:V_I = 5) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_5;
            end
            else if (:V_I = 6) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_6;
            end
            else if (:V_I = 7) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_7;
            end
            else if (:V_I = 8) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_8;
            end
            else if (:V_I = 9) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_9;
            end
            else if (:V_I = 10) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_10;
            end
            else if (:V_I = 11) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_11;
            end
            else if (:V_I = 12) then
            begin
                select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                        NUMERIC(15, 2))
                from   NF0100
                where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                       (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                       Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                       Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
                into   :C_SUM_MES_12;
            end
            V_I = :V_I + 1;
            V_MES = :V_MES + 1;
            if (:V_MES > 12) then
            begin
                V_MES = 1;
                V_ANO = :V_ANO + 1;
            end
        end
        suspend;
    end
end


Ela só traz os valores de soma da primeira linha, isto é só de um grupo...

Dos outros traz zerado...

C_COD_GRUPOC_COD_SUB_GRUPOC_SUM_MES_1.......
EHHC000003887450500000
EHHS0000000000
ESST0000000000
SDPE0000000000
SRRL0000000000



Se eu mudar a ordenação para DESC, ela também só traz os valores da primeira linha, só que agora é o último grupo..

C_COD_GRUPOC_COD_SUB_GRUPOC_SUM_MES_1   ..........
SRRL00000  7393,66      000         0
SDPE0000000000
ESST0000000000
EHHS0000000000
EHHC0000000000


O que está errado ?????


Cabelo

Cabelo

Responder

Posts

07/07/2007

Sremulador

o problema esta no suspend; você deve coloca antes do end

               V_ANO = :V_ANO + 1; 
            end 
         suspend; 
        end 
   end 
end



Responder

Gostei + 0

10/07/2007

Cabelo

Colega...

Também achei que fosse este o problema...

Então testei da foma que vc respondeu... aí o que acontece é que ele irá mostrar linha a linha dentro do while... e o que eu quero é mostrar o faturmaneto de todos os meses por grupo e sub-grupo de serviço...

Portanto o suspend deve ficar fora deste end que você indicou...

As linhas estão aparecendo, o problema é que está tudo zerado... mas existe valores cadastrados para todos os grupos....

Parece que o select é que não está retornado os valores corretamente...
Só é retornado valores na primeira linha do grupo e sub-grupo...

nas outras os valores ficam zerados, se eu inverter a ordenação do select a última linha se torna a primeira linha certo... então... aí retorna somente os valores na primeira linha novamente... só que a primeira linha agora era a última linha que retornava zerado.....


Responder

Gostei + 0

10/07/2007

Emerson Nascimento

CREATE PROCEDURE RELATORIO_FATURAMENTO(
    I_MES_INICIAL INTEGER,
    I_ANO INTEGER)
RETURNS (
    C_COD_GRUPO CHAR(2),
    C_COD_SUB_GRUPO CHAR(2),
    C_SUM_MES_1 FLOAT,
    C_SUM_MES_2 FLOAT,
    C_SUM_MES_3 FLOAT,
    C_SUM_MES_4 FLOAT,
    C_SUM_MES_5 FLOAT,
    C_SUM_MES_6 FLOAT,
    C_SUM_MES_7 FLOAT,
    C_SUM_MES_8 FLOAT,
    C_SUM_MES_9 FLOAT,
    C_SUM_MES_10 FLOAT,
    C_SUM_MES_11 FLOAT,
    C_SUM_MES_12 FLOAT)
AS
DECLARE VARIABLE V_I INTEGER;
DECLARE VARIABLE V_MES INTEGER; -- creio não ser necessária
DECLARE VARIABLE V_ANO INTEGER;
DECLARE VARIABLE C_SUM FLOAT;
begin
    -- V_MES = :I_MES_INICIAL; -- creio não ser necessário
    V_ANO = :I_ANO;

    for select Distinct (Substring(C_COD_OBRA from 1 for 2)),
                        (Substring(C_COD_OBRA from 6 for 2))
        from  NF0100
        into  :C_COD_GRUPO, :C_COD_SUB_GRUPO
    do
    begin
        V_I = 1; -- aqui é 1 mesmo? não deveria ser i_mes_inicial?

        C_SUM_MES_1 = 0;
        C_SUM_MES_2 = 0;
        C_SUM_MES_3 = 0;
        C_SUM_MES_4 = 0;
        C_SUM_MES_5 = 0;
        C_SUM_MES_6 = 0;
        C_SUM_MES_7 = 0;
        C_SUM_MES_8 = 0;
        C_SUM_MES_9 = 0;
        C_SUM_MES_10 = 0;
        C_SUM_MES_11 = 0;
        C_SUM_MES_12 = 0;

        while (:V_I <= 12) do
        begin
            select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                    NUMERIC(15, 2))
            from   NF0100
            where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                   (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                   Extract(Month from C_DATA_FATURAMENTO_NF) = :V_I and -- troquei V_MES por V_I
                   Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
            into   :C_SUM;

            if (:V_I = 1) then
               C_SUM_MES_1 = :C_SUM;
            else
            if (:V_I = 2) then
               C_SUM_MES_2 = :C_SUM;
            else
            if (:V_I = 3) then
               C_SUM_MES_3 = :C_SUM;
            else
            if (:V_I = 4) then
               C_SUM_MES_4 = :C_SUM;
            else
            if (:V_I = 5) then
               C_SUM_MES_5 = :C_SUM;
            else
            if (:V_I = 6) then
               C_SUM_MES_6 = :C_SUM;
            else
            if (:V_I = 7) then
               C_SUM_MES_7 = :C_SUM;
            else
            if (:V_I = 8) then
               C_SUM_MES_8 = :C_SUM;
            else
            if (:V_I = 9) then
               C_SUM_MES_9 = :C_SUM;
            else
            if (:V_I = 10) then
               C_SUM_MES_10 = :C_SUM;
            else
            if (:V_I = 11) then
               C_SUM_MES_11 = :C_SUM;
            else
            if (:V_I = 12) then
               C_SUM_MES_12 = :C_SUM;

            V_I = :V_I + 1;
        end
        suspend;
    end
end



Responder

Gostei + 0

11/07/2007

Cabelo

Bom dia Emerson...

É o seguinte... ainda não testei seu post...

mas tenho que usar uma variável... pois se o mes não for o mes 1, preciso incrementar o ano...

se o mes inicial for 7 por exemplo... tenho que fazer os calculos até o mes 6 do outro ano...

só funciona sua procedure, no ano, se o mês incial for 1... por isso preciso da variável..

senão.. ele traria os dados errados....


Responder

Gostei + 0

11/07/2007

Cabelo

Emerson...

Valeu pela ajuda...

resolví o problema..

CREATE PROCEDURE RELATORIO_FATURAMENTO(
    I_MES_INICIAL INTEGER,
    I_ANO INTEGER)
RETURNS (
    C_COD_GRUPO CHAR(2),
    C_COD_SUB_GRUPO CHAR(2),
    C_SUM_MES_1 FLOAT,
    C_SUM FLOAT,
    C_SUM_MES_2 FLOAT,
    C_SUM_MES_3 FLOAT,
    C_SUM_MES_4 FLOAT,
    C_SUM_MES_5 FLOAT,
    C_SUM_MES_6 FLOAT,
    C_SUM_MES_7 FLOAT,
    C_SUM_MES_8 FLOAT,
    C_SUM_MES_9 FLOAT,
    C_SUM_MES_10 FLOAT,
    C_SUM_MES_11 FLOAT,
    C_SUM_MES_12 FLOAT)
AS
DECLARE VARIABLE V_I INTEGER;
DECLARE VARIABLE V_MES INTEGER;
DECLARE VARIABLE V_ANO INTEGER;
begin
    for select Distinct (Substring(C_COD_OBRA from 1 for 2)),
                        (Substring(C_COD_OBRA from 6 for 2))
        from  NF0100
        into  :C_COD_GRUPO, :C_COD_SUB_GRUPO
    do
    begin
        V_MES = :I_MES_INICIAL;
        V_ANO = :I_ANO;
        V_I = 1;

        C_SUM_MES_1 = 0;
        C_SUM_MES_2 = 0;
        C_SUM_MES_3 = 0;
        C_SUM_MES_4 = 0;
        C_SUM_MES_5 = 0;
        C_SUM_MES_6 = 0;
        C_SUM_MES_7 = 0;
        C_SUM_MES_8 = 0;
        C_SUM_MES_9 = 0;
        C_SUM_MES_10 = 0;
        C_SUM_MES_11 = 0;
        C_SUM_MES_12 = 0;

        while (:V_I <= 12) do
        begin
            select Cast(Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0) as
                    NUMERIC(15, 2))
            from   NF0100
            where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                   (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                   Extract(Month from C_DATA_FATURAMENTO_NF) = :V_MES and
                   Extract(Year from C_DATA_FATURAMENTO_NF) = :V_ANO
            into   :C_SUM;

            if (:V_I = 1) then
               C_SUM_MES_1 = :C_SUM;
            else
            if (:V_I = 2) then
               C_SUM_MES_2 = :C_SUM;
            else
            if (:V_I = 3) then
               C_SUM_MES_3 = :C_SUM;
            else
            if (:V_I = 4) then
               C_SUM_MES_4 = :C_SUM;
            else
            if (:V_I = 5) then
               C_SUM_MES_5 = :C_SUM;
            else
            if (:V_I = 6) then
               C_SUM_MES_6 = :C_SUM;
            else
            if (:V_I = 7) then
               C_SUM_MES_7 = :C_SUM;
            else
            if (:V_I = 8) then
               C_SUM_MES_8 = :C_SUM;
            else
            if (:V_I = 9) then
               C_SUM_MES_9 = :C_SUM;
            else
            if (:V_I = 10) then
               C_SUM_MES_10 = :C_SUM;
            else
            if (:V_I = 11) then
               C_SUM_MES_11 = :C_SUM;
            else
            if (:V_I = 12) then
               C_SUM_MES_12 = :C_SUM;

            V_I = :V_I + 1;
            V_MES = :V_MES + 1;
            if (:V_MES > 12) then
            begin
                V_MES = 1;
                V_ANO = :V_ANO + 1;
            end

        end
        suspend;
    end 
end


era só colocar as variáveis v_mes e v_ano dentro do While.....

como disse anteriormente, preciso delas pois na ´virada´ de ano, não conseguiria trazer os dados, já que o mes inicial nem sempre será janeiro, ou mês 1

muito obrigado a todos pela ajuda....


Responder

Gostei + 0

14/07/2007

Emerson Nascimento

faça um teste com esta versão.
diferenças:
- a versão anterior executa um loop (while), que faz o select ser executado 12 vezes (e possivelmente alguma vez de forma desnecessária, visto que pode não ter havido movimento num determinado mês).

- esta versão utiliza [i:75378c9ed2]for select[/i:75378c9ed2] que executa a instrução apenas 1 vez, já trazendo todos os registros conforme o intervalo desejado (12 meses a partir do mes/ano informado)

veja se há alguma melhora em termos de performance. se não houver melhora, utilize a sua versão mesmo.

CREATE PROCEDURE RELATORIO_FATURAMENTO (
    I_MES_INICIAL INTEGER,
    I_ANO INTEGER)
RETURNS (
    C_COD_GRUPO CHAR(2),
    C_COD_SUB_GRUPO CHAR(2),
    C_SUM_MES_1 FLOAT,
    C_SUM_MES_2 FLOAT,
    C_SUM_MES_3 FLOAT,
    C_SUM_MES_4 FLOAT,
    C_SUM_MES_5 FLOAT,
    C_SUM_MES_6 FLOAT,
    C_SUM_MES_7 FLOAT,
    C_SUM_MES_8 FLOAT,
    C_SUM_MES_9 FLOAT,
    C_SUM_MES_10 FLOAT,
    C_SUM_MES_11 FLOAT,
    C_SUM_MES_12 FLOAT)
AS
DECLARE VARIABLE V_I INTEGER;
DECLARE VARIABLE V_MES INTEGER;
DECLARE VARIABLE MES_FINAL NUMERIC(10,2);
DECLARE VARIABLE ANO_FINAL NUMERIC(10,2);
DECLARE VARIABLE C_SUM FLOAT;
begin
    MES_FINAL = I_MES_INICIAL + 11;
    ANO_FINAL = I_ANO;

    if (MES_FINAL > 12) then
    begin
        MES_FINAL = MES_FINAL - 12;
        ANO_FINAL = ANO_FINAL + 1;
    end

    for select Distinct (Substring(C_COD_OBRA from 1 for 2)),
                        (Substring(C_COD_OBRA from 6 for 2))
        from  NF0100
        into  :C_COD_GRUPO, :C_COD_SUB_GRUPO
    do
    begin
        C_SUM_MES_1 = 0;
        C_SUM_MES_2 = 0;
        C_SUM_MES_3 = 0;
        C_SUM_MES_4 = 0;
        C_SUM_MES_5 = 0;
        C_SUM_MES_6 = 0;
        C_SUM_MES_7 = 0;
        C_SUM_MES_8 = 0;
        C_SUM_MES_9 = 0;
        C_SUM_MES_10 = 0;
        C_SUM_MES_11 = 0;
        C_SUM_MES_12 = 0;

        for select Coalesce(SUM(C_VLR_TOTAL_PAGAR_NF), 0.00),
                   Extract(Month from C_DATA_FATURAMENTO_NF)
            from   NF0100
            where  (Substring(C_COD_OBRA from 1 for 2)) = :C_COD_GRUPO and
                   (Substring(C_COD_OBRA from 6 for 2)) = :C_COD_SUB_GRUPO and
                   ( (Extract(Year from C_DATA_FATURAMENTO_NF)+
                     (Extract(Month from C_DATA_FATURAMENTO_NF)/100.00))
                    between
                     (:I_ANO + (:I_MES_INICIAL / 100.00)) and
                     (:ANO_FINAL + (:MES_FINAL / 100.00)) )
            group by
                   Extract(Month from C_DATA_FATURAMENTO_NF),
                   Extract(Year from C_DATA_FATURAMENTO_NF)
        into  :C_SUM, :V_MES
        do
        begin
            V_I = 12 - (MES_FINAL - V_MES);

            if (V_I > 12) then
               V_I = V_I - 12;
    
            if (:V_I = 1) then
                C_SUM_MES_1 = :C_SUM;
            else
            if (:V_I = 2) then
                C_SUM_MES_2 = :C_SUM;
            else
            if (:V_I = 3) then
                C_SUM_MES_3 = :C_SUM;
            else
            if (:V_I = 4) then
                C_SUM_MES_4 = :C_SUM;
            else
            if (:V_I = 5) then
                C_SUM_MES_5 = :C_SUM;
            else
            if (:V_I = 6) then
                C_SUM_MES_6 = :C_SUM;
            else
            if (:V_I = 7) then
                C_SUM_MES_7 = :C_SUM;
            else
            if (:V_I = 8) then
                C_SUM_MES_8 = :C_SUM;
            else
            if (:V_I = 9) then
                C_SUM_MES_9 = :C_SUM;
            else
            if (:V_I = 10) then
                C_SUM_MES_10 = :C_SUM;
            else
            if (:V_I = 11) then
                C_SUM_MES_11 = :C_SUM;
            else
            if (:V_I = 12) then
                C_SUM_MES_12 = :C_SUM;
        end

        suspend;
    end
end



Responder

Gostei + 0

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

Aceitar