Ir para conteúdo
  • Cadastre-se

dev botao

Como utilizar CTE em uma procedure no firebird 2.5


Recommended Posts

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

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

Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.