Ir para conteúdo
  • Cadastre-se

ocerqueira

Membros
  • Total de ítens

    4
  • Registro em

  • Última visita

ocerqueira's Achievements

Newbie

Newbie (1/14)

  • First Post
  • Conversation Starter
  • Week One Done
  • One Month Later

Recent Badges

0

Reputação

  1. create or alter procedure SP_ACOMPANHA_SALDO2 ( WPA_DATA_INICIAL date, WPA_DATA_FINAL date) returns ( RET_GRUPO varchar(100), RET_DIA1 decimal(10,2), RET_DIA2 decimal(10,2), RET_DIA3 decimal(10,2), RET_DIA4 decimal(10,2), RET_DIA5 decimal(10,2), RET_DIA6 decimal(10,2), RET_DIA7 decimal(10,2), RET_DIA8 decimal(10,2), RET_DIA9 decimal(10,2), RET_DIA10 decimal(10,2), RET_DIA11 decimal(10,2), RET_DIA12 decimal(10,2), RET_DIA13 decimal(10,2), RET_DIA14 decimal(10,2), RET_DIA15 decimal(10,2), RET_DIA16 decimal(10,2), RET_DIA17 decimal(10,2), RET_DIA18 decimal(10,2), RET_DIA19 decimal(10,2), RET_DIA20 decimal(10,2), RET_DIA21 decimal(10,2), RET_DIA22 decimal(10,2), RET_DIA23 decimal(10,2), RET_DIA24 decimal(10,2)) as declare variable DATA_DISPONIVEL date; begin begin for select GRUPO, sum(iif(extract(day from s.data) = 1, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 2, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 3, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 4, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 5, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 6, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 7, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 8, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 9, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 10, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 11, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 12, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 13, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 14, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 15, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 16, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 17, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 18, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 19, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 20, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 21, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 22, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 23, PESO, 0)) as RET_DIA, sum(iif(extract(day from S.DATA) = 24, PESO, 0)) as RET_DIA from (select distinct cast(C.DTA as date) as DATA, case when UM.CODACESSOG in (3142, 3144, 3145, 3149, 6653, 6654, 6655, 7196, 7197, 7198, 7199, 7200, 7201, 7202, 7203, 7204, 7205) then 'CANTONEIRA GROSSA EQSE' when C.NOME like '%PERFIL% %IND% %GALV%' then 'TELHAS' when C.NOME like 'TUBO%' then 'TUBO' when C.NOME like '%CH% %2Q%' then 'CHAPA 2Q' when C.NOME like '%TIRA%EQSE%' then 'TIRA EQSE' when C.COD_ACESSO_G = 6002 then 'TIRA RETRABALHO' when C.NOME like '%TIRA%' then 'TIRA COMERCIAL' when UM.CODACESSOG in (3776, 2050, 1098, 1104, 1107, 1304, 1099, 1138, 1100, 1103, 1097, 3774, 3775, 1560) then 'RECORTE' when C.NOME like '%CANTONEIRA%' then 'CANTONEIRA FINA EQSE' when UM.CODACESSOG = 3702 then 'CANTONEIRA FINA EQSE' when C.NOME like 'PERFIL% %EQSE%' then 'PERFIL EQSE' when C.NOME like 'PERFIL%' then 'PERFIL EQSE' when C.NOME like 'EQSE%' then 'PERFIL EQSE' when C.NOME like '%PROMO%' then 'PERFIL EQSE' when C.NOME like '%2Q% %PERFIL%' then 'PERFIL EQSE' when C.NOME like '%PAINEL 2Q%' then 'PERFIL EQSE' else 'NAO TEM GRUPO' end as GRUPO, sum(UM.PLIQUI * C.ESTOQUE_ATU) as PESO from TB_RELATORIO_PCP C inner join ARQES01 UM on C.COD_ACESSO_G = UM.CODACESSOG where C.DTA between :WPA_DATA_INICIAL and :WPA_DATA_FINAL and extract(weekday from C.DTA) not in (0, 6) and C.NOME not like '%NAO TEM GRUPO%' group by 1, 2) S group by 1 into :RET_GRUPO, :RET_DIA1, :RET_DIA2, :RET_DIA3, :RET_DIA4, :RET_DIA5, :RET_DIA6, :RET_DIA7, :RET_DIA8, :RET_DIA9, :RET_DIA10, :RET_DIA11, :RET_DIA12, :RET_DIA13, :RET_DIA14, :RET_DIA15, :RET_DIA16, :RET_DIA17, :RET_DIA18, :RET_DIA19, :RET_DIA20, :RET_DIA21, :RET_DIA22, :ret_dia23, :RET_DIA24 do begin --V_CURRENT_DATE = V_CURRENT_DATE + 1; suspend; end --V_CURRENT_DATE = V_CURRENT_DATE + 1; -- Avança para o próximo dia end end Eu criei essa procedure, para "pivotar" as datas como colunas. Somo os pesos dos grupos, na data especifica. Criei as colunas fixas, mas para o que preciso no momento, me atende um pouco. O único problema que estou enfrentando é com dias que não tem movimentação, feriados e fins de semana, onde as colunas ficam zeradas. Queria uma forma de só considerar os dias úteis, o problema é que dentro do case passo o dia estático. Não encontrei solução melhor para isso. Eu também criei uma procedure que gera um select dinâmico que lista as datas e já retorna uma strinh com a consulta nova. Mas não sei como executar o resultado dessa procedure, por isso estou tentando esse forma. Mas ainda não desisti da outra
  2. Perdão, consegui executar com o CTE. Minha dúvida agora é outra: create or alter procedure PROC_GERA_ACOMPANHAMENTO_SALDO ( WPA_DATA_INICIAL date, WPA_DATA_FINAL date) returns ( CONSULTA_DINAMICA varchar(10000)) as begin for with SALDO as (select distinct cast(C.DTA as date) as DATA, case when UM.CODACESSOG in (3142, 3144, 3145, 3149, 6653, 6654, 6655, 7196, 7197, 7198, 7199, 7200, 7201, 7202, 7203, 7204, 7205) then 'CANTONEIRA GROSSA EQSE' when C.NOME like '%PERFIL% %IND% %GALV%' then 'TELHAS' when C.NOME like 'TUBO%' then 'TUBO' when C.NOME like '%CH% %2Q%' then 'CHAPA 2Q' when C.NOME like '%TIRA%EQSE%' then 'TIRA EQSE' when C.COD_ACESSO_G = 6002 then 'TIRA RETRABALHO' when C.NOME like '%TIRA%' then 'TIRA COMERCIAL' when UM.CODACESSOG in (3776, 2050, 1098, 1104, 1107, 1304, 1099, 1138, 1100, 1103, 1097, 3774, 3775, 1560) then 'RECORTE' when C.NOME like '%CANTONEIRA%' then 'CANTONEIRA FINA EQSE' when UM.CODACESSOG = 3702 then 'CANTONEIRA FINA EQSE' when C.NOME like 'PERFIL% %EQSE%' then 'PERFIL EQSE' when C.NOME like 'PERFIL%' then 'PERFIL EQSE' when C.NOME like 'EQSE%' then 'PERFIL EQSE' when C.NOME like '%PROMO%' then 'PERFIL EQSE' when C.NOME like '%2Q% %PERFIL%' then 'PERFIL EQSE' when C.NOME like '%PAINEL 2Q%' then 'PERFIL EQSE' else 'NAO TEM GRUPO' end as GRUPO, sum(UM.PLIQUI * C.ESTOQUE_ATU) as PESO from TB_RELATORIO_PCP C inner join ARQES01 UM on C.COD_ACESSO_G = UM.CODACESSOG where C.DTA between :WPA_DATA_INICIAL and :WPA_DATA_FINAL and C.NOME not like '%NAO TEM GRUPO%' group by 1, 2) select 'select s.grupo, ' || list(distinct 'sum(iif(extract(day from s.data) =' || extract(day from S.DATA) || ',peso, 0)) as "RET_DIA' || extract(day from S.DATA) || '"', ', ') || ' from saldo as s group by s.grupo' from SALDO as S into :CONSULTA_DINAMICA do begin suspend; end end Essa procedure, me retorna um select dinâmico para pivotar os dias do mês como colunas (retorna uma string) |DD/MM||DD/MM||DD/MM||DD/MM| GRUPO | PESO PESO | PESO | PESO GRUPO | PESO PESO | PESO | PESO GRUPO | PESO PESO | PESO | PESO A questão é que após executar esse primeiro passo, e construir o select com as colunas, eu preciso executar esse select para ter os resultados; Consigo executar ela dentro da mesma procedure ou preciso fazer de outra forma? Tentei executar na mesma procedure, salvando numa váriavel e tentando executar usando o execute statement. Mas sem sucesso
  3. with SALDO as (select cast(C.DTA as date) as DATA, case when UM.CODACESSOG in (3142, 3144, 3145, 3149, 6653, 6654, 6655, 7196, 7197, 7198, 7199, 7200, 7201, 7202, 7203, 7204, 7205) then 'CANTONEIRA GROSSA EQSE' when C.NOME like '%PERFIL% %IND% %GALV%' then 'TELHAS' when C.NOME like 'TUBO%' then 'TUBO' when C.NOME like '%CH% %2Q%' then 'CHAPA 2Q' when C.NOME like '%TIRA%EQSE%' then 'TIRA EQSE' when C.COD_ACESSO_G = 6002 then 'TIRA RETRABALHO' when C.NOME like '%TIRA%' then 'TIRA COMERCIAL' when UM.CODACESSOG in (3776, 2050, 1098, 1104, 1107, 1304, 1099, 1138, 1100, 1103, 1097, 3774, 3775, 1560) then 'RECORTE' when C.NOME like '%CANTONEIRA%' then 'CANTONEIRA FINA EQSE' when UM.CODACESSOG = 3702 then 'CANTONEIRA FINA EQSE' when C.NOME like 'PERFIL% %EQSE%' then 'PERFIL EQSE' when C.NOME like 'PERFIL%' then 'PERFIL EQSE' when C.NOME like 'EQSE%' then 'PERFIL EQSE' when C.NOME like '%PROMO%' then 'PERFIL EQSE' when C.NOME like '%2Q% %PERFIL%' then 'PERFIL EQSE' when C.NOME like '%PAINEL 2Q%' then 'PERFIL EQSE' else 'NAO TEM GRUPO' end as GRUPO, sum(UM.PLIQUI * C.ESTOQUE_ATU) as PESO from TB_RELATORIO_PCP C inner join ARQES01 UM on C.COD_ACESSO_G = UM.CODACESSOG where C.DTA between :wpa_DATA_INICIAL and :wpa_DATA_FINAL and C.NOME not like '%NAO TEM GRUPO%' group by 1, 2) select 'select s.grupo, ' ||list(distinct 'sum(iif(extract(day from s.data) =' || extract(day from s.data) || ',peso, 0)) as "'|| extract(day from s.data)||'/'||extract(month from s.data) ||'"', ', ') ||' from saldo s group by s.grupo' from SALDO s Opa, eu tenho o seguinte script que uso para pivotar as linhas de datas, para transformar elas em colunas. tive que criar um select dinâmico para contornar a limitação do firebird. O problema que estou encontrando, é encapsular essa lógica dentro de uma procedure. Pois o select dinâmico cria uma consulta com as colunas de datas, então, tenho que executar novamente esse select resultante para retornar os dados Mas não sei exatamente se o firebird não aceita CTE dentro de uma procedure, tenho pouca familiaridade com ibexpert e firebird Se alguém já passou por isso, e puder só me dar uma dica do que pesquisar para fazer dar certo, eu agradeço
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.