ocerqueira Postado 22 Fevereiro Compartilhar Postado 22 Fevereiro 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 Link para o comentário Compartilhar em outros sites More sharing options...
Moderadores Juliomar Marchetti Postado 22 Fevereiro Moderadores Compartilhar Postado 22 Fevereiro como assim não aceita CTE Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Link para o comentário Compartilhar em outros sites More sharing options...
ocerqueira Postado 27 Fevereiro Autor Compartilhar Postado 27 Fevereiro 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 Link para o comentário Compartilhar em outros sites More sharing options...
ocerqueira Postado 27 Fevereiro Autor Compartilhar Postado 27 Fevereiro Em 22/02/2024 at 15:49, Juliomar Marchetti disse: como assim não aceita CTE Consegui usar o CTE, erro de sintaxe. Obrigado Link para o comentário Compartilhar em outros sites More sharing options...
Moderadores Juliomar Marchetti Postado 4 Março Moderadores Compartilhar Postado 4 Março Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico. Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Link para o comentário Compartilhar em outros sites More sharing options...
Recommended Posts