Fórum Procedure retorna valores somente na primeira linha... #58490
05/07/2007
0
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
Curtir tópico
+ 0Posts
07/07/2007
Sremulador
V_ANO = :V_ANO + 1; end suspend; end end end
Gostei + 0
10/07/2007
Cabelo
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.....
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
Gostei + 0
11/07/2007
Cabelo
É 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....
Gostei + 0
11/07/2007
Cabelo
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....
Gostei + 0
14/07/2007
Emerson Nascimento
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)