A resposta que o Vinícius me enviou ajudou muito só que estou tendo
problemas com ||, ele dá erro de typecast
ERROR:  operator is not unique: unknown || date at character 199
Em outras funções em que utilizo o || ocorre o mesmo problema.
Abaixo segue um exemplo de função:

CREATE OR REPLACE FUNCTION "public"."acumula_fatura" (portadores_port
integer, tipotitulos_tptitulo integer, data_limite date, coduniop integer)
RETURNS numeric AS
$body$
/* New function body */
declare
       rfaturatmp RECORD;
       rfaturatmpdet RECORD;
       rclitit record;
       rMesFat record;
       squery varchar;
       sQMesFat varchar;
       i integer;
begin
     squery := 'select * from vfaturatmp where (vfaturatmp.status = ''S'')
and (vfaturatmp.ntitulo <> '''') and ((vfaturatmp.nfatura = '''') or
(vfaturatmp.nfatura is null)) and (vfaturatmp.dtvencto <=
'''||"data_limite"||''')';
     if "portadores_port" <> 0 then
        squery := squery||' and (vfaturatmp.clientesfat_portadores_port =
'||"portadores_port"||')';
     end if;
     if "tipotitulos_tptitulo" <> 0 then
        squery := squery||' and (vfaturatmp.clientesfat_tipotitulos_tptitulo
= '||"tipotitulos_tptitulo"||')';
     end if;
     squery := squery|| ' order by dtvencto';
     Raise notice '%', sQuery;
     i := 0;

 sQMesFat := 'select max(dtvencto)as dt,clientesfat_codcli from vfaturatmp
where (vfaturatmp.status = ''S'') and (vfaturatmp.ntitulo <> '''') and
((vfaturatmp.nfatura = '''') or (vfaturatmp.nfatura is null)) and
(vfaturatmp.dtvencto <= '''||"data_limite"||''')';
     if "portadores_port" <> 0 then
        sQMesFat := sQMesFat||' and (vfaturatmp.clientesfat_portadores_port
= '||"portadores_port"||')';
     end if;
     if "tipotitulos_tptitulo" <> 0 then
        sQMesFat := sQMesFat||' and
(vfaturatmp.clientesfat_tipotitulos_tptitulo =
'||"tipotitulos_tptitulo"||')';
     end if;
     sQMesFat := sQMesFat||' group by clientesfat_codcli';
     Raise notice '%', sQMesFat;

     for rMesFat IN EXECUTE sQMesFat loop
        raise notice '%-%',rMesFat.clientesfat_codcli,lpad(extract(month
from rMesFat.dt + interval '1 month' ),2,'0')||'/'||extract(year from
rMesFat.dt + interval '1 month');
         update clienteplanopreco set mesfat = lpad(extract(month from
rMesFat.dt + interval '1 month' ),2,'0')||'/'||extract(year from rMesFat.dt
+ interval '1 month')
            where clientes_codcli = (select * from
fatura_para(rMesFat.clientesfat_codcli,0)) and dtcanc is null;



     end loop;

     --raise exception 'chegou aqui';

     FOR rfaturatmp IN EXECUTE squery loop
         insert into fatura values
                (rfaturatmp.filial_nfilial,
                "coduniop",
                rfaturatmp.ntitulo,
                rfaturatmp.clientesfat_codcli,
                rfaturatmp.clientesfat_coddep,
                rfaturatmp.vlrliquido,
                rfaturatmp.vlrbruto,
                rfaturatmp.vlrdesc,
                rfaturatmp.vlrmulta,
                rfaturatmp.vlracresc,
                rfaturatmp.dtemissao,
                rfaturatmp.dtvencto,
                null,
                null,
                null,
                rfaturatmp.vlrirrf,
                rfaturatmp.vlrimpostos,
                null,
                1,
                extract(day from date (CAST(rfaturatmp.dtvencto AS DATE))),
                rfaturatmp.vlrdesc,
                rfaturatmp.vlracresc,
                rfaturatmp.clientesfat_tipotitulos_tptitulo,
                rfaturatmp.clientesfat_portadores_port);
         --atualizando mes de faturamento

         for rfaturatmpdet in select * from faturatmpdet where
faturatmpdet.faturatmp_clientesfat_codcli = rfaturatmp.clientesfat_codcli
and faturatmpdet.faturatmp_clientesfat_coddep =
rfaturatmp.clientesfat_coddep and faturatmpdet.faturatmp_dtvencto =
rfaturatmp.dtvencto loop
             --gerando faturadet
             select clientes.categoriascliente_codcateg,
clientes.categoriascliente_subcateg, clientes.grupos_codgrupo from clientes
where clientes.codcli = rfaturatmpdet.clientes_codcli and clientes.coddep =
0 into rclitit;

             insert into faturadet values (
                    nextval('faturadet_codfaturadet_seq'),
                    rfaturatmp.filial_nfilial,
                    rfaturatmp.ntitulo,
                    null,
                    rfaturatmpdet.clienteplanopreco_planos_codplano,
                    rfaturatmpdet.qtde,
                    rfaturatmpdet."clienteplanopreco_valor_vlrbruto",
                    rfaturatmpdet.vlracresc,
                    rfaturatmpdet.vlrdesc,
                    rfaturatmpdet.vlrliquido,
                    rfaturatmpdet."clienteplanopreco_valor_vlrbruto",
                    0,
                    0,
                    rfaturatmpdet.vlrtaxaimplanta,
                    1,
                    rfaturatmp.numnf,
                    'N',
                    null,
                    rfaturatmpdet.clienteplanopreco_vendedores_codven,
                    rfaturatmpdet.clienteplanopreco_vendedores_codsup,
                    rfaturatmpdet.clienteplanopreco_vendedores_codger,
                    null,
                    null,
                    rclitit.categoriascliente_codcateg,
                    rclitit.categoriascliente_subcateg,
                    rclitit.grupos_codgrupo,
                    "coduniop",
                    rfaturatmpdet.clienteplanopreco_planos_codplano,
                    rfaturatmpdet.clientes_codcli,
                    rfaturatmpdet.clientes_coddep,
                    rfaturatmpdet.flag_taxaimplanta
                    );

             RAISE NOTICE '    det é %', rfaturatmpdet.faturatmp_dtvencto;
         end loop;



         RAISE NOTICE 'fat e %', rfaturatmp.ntitulo;
         i := i +1;
         insert into contareceber values (
                rfaturatmp.filial_nfilial,
                "coduniop",
                rfaturatmp.ntitulo,
                null,
                null,
                null,
                rfaturatmp.clientesfat_portadores_port,
                rfaturatmp.clientesfat_codcli,
                rfaturatmp.clientesfat_coddep,
                rfaturatmp.clientesfat_tipotitulos_tptitulo,
                rfaturatmp.ntitulo,
                rfaturatmp.filial_nfilial,
                "coduniop",
                rfaturatmp.dtemissao,
                rfaturatmp.dtvencto,
                null,
                rfaturatmp.clientesfat_grupos_codgrupo,
                null,
                rfaturatmp.vlracresc,
                rfaturatmp.vlrdesc,
                'N',
                now(),
                null,
                null,
                false,
                rfaturatmp.vlrliquido,'C',null,rfaturatmp.parcela);




         delete from faturatmp where faturatmp.clientesfat_codcli =
rfaturatmp.clientesfat_codcli and faturatmp.clientesfat_coddep =
rfaturatmp.clientesfat_coddep and faturatmp.dtvencto = rfaturatmp.dtvencto;
     end loop;



     return i;
end
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a