A function was so far:


CREATE OR REPLACE FUNCTION TRAVA_INADIMPLENTES ( PDIAS_VENCIDO INTEGER, PUND_LOCAL VARCHAR(3), PCNPJ VARCHAR(18) ) RETURNS BOOLEAN AS
  $$
  DECLARE
     SPERMITE_BLOQUEIO VARCHAR(1);
     INRO_REGISTROS INTEGER;
     --
     RDAT RECORD;
  BEGIN
     IF ( PCNPJ = '' ) THEN

        FOR RDAT IN
SELECT TIPO_DOC AS FAT_DOCUMENTO, FIL_ORIG AS FAT_EMISSORA, FATURA AS FAT_NUMERO, ANO AS FAT_ANO, PARCELA AS FAT_PARCELA, CGC AS COD_CLIENTE
           FROM CTAS_RECEBER
           WHERE ( STATUS NOT IN ( 'CA', 'CO' ) ) AND ( DT_PAGTO IS NULL )
             AND ( ( CURRENT_TIMESTAMP - DT_VENCTO ) >= PDIAS_VENCIDO )
           ORDER BY DT_VENCTO, TIPO_DOC, FIL_ORIG, FATURA, ANO
        LOOP
           SELECT PERMITE_PROTESTO
           FROM CLIENTES
           WHERE CGC = RDAT.COD_CLIENTE
           INTO SPERMITE_BLOQUEIO;

           IF (SPERMITE_BLOQUEIO = 'T') THEN
              --
              UPDATE CLIENTES
SET INADIMPLENTE = 'T', OPERADOR = 'BLOQUEIO AUTOMATICO', DT_ALTERACAO = CURRENT_TIMESTAMP
              WHERE CGC = RDAT.COD_CLIENTE;
              --
              INSERT INTO HIST_COBRANCA
VALUES ( RDAT.FAT_DOCUMENTO, RDAT.FAT_EMISSORA, RDAT.FAT_NUMERO, RDAT.FAT_ANO, RDAT.FAT_PARCELA, CURRENT_TIMESTAMP, PUND_LOCAL, 'BLOQUEIO AUTOMATICO DE INADIMPLENTE', 'BLOQUEIO AUTOMATICO', CURRENT_TIMESTAMP );
           END IF;
        END LOOP;
     ELSE
        FOR RDAT IN
SELECT TIPO_DOC AS FAT_DOCUMENTO, FIL_ORIG AS FAT_EMISSORA, FATURA AS FAT_NUMERO, ANO AS FAT_ANO, PARCELA AS FAT_PARCELA, CGC AS COD_CLIENTE
           FROM CTAS_RECEBER
           WHERE ( STATUS NOT IN ( 'CA', 'CO' )) AND ( DT_PAGTO IS NULL )
             AND ( ( CURRENT_TIMESTAMP - COB.DT_VENCTO ) >= PDIAS_VENCIDO )
             AND ( CGC = PCNPJ )
           ORDER BY DT_VENCTO, TIPO_DOC, FIL_ORIG, FATURA, ANO
        LOOP
SELECT PERMITE_PROTESTO
           FROM CLIENTES
           WHERE CGC = RDAT.COD_CLIENTE
           INTO SPERMITE_BLOQUEIO;

           IF ( SPERMITE_BLOQUEIO = 'T' ) THEN
              --
              UPDATE CLIENTES
SET INADIMPLENTE = 'T', OPERADOR = 'BLOQUEIO AUTOMATICO', DT_ALTERACAO = CURRENT_TIMESTAMP
              WHERE CGC = RDAT.COD_CLIENTE;
              --
              SELECT COUNT( FAT_NUMERO )
              FROM HIST_COBRANCA
WHERE ( FAT_DOCUMENTO = RDAT.FAT_DOCUMENTO ) AND ( FAT_EMISSORA = RDAT.FAT_EMISSORA ) AND ( FAT_NUMERO = RDAT.IFAT_NUMERO ) AND ( FAT_ANO = RDTA.SFAT_ANO ) AND ( FAT_PARCELA = IFAT_PARCELA ) AND ( DTA_LANCAMENTO = CURRENT_TIMESTAMP )
              INTO INRO_REGISTROS;
              --
              IF ( INRO_REGISTROS = 0 ) THEN
                 INSERT INTO HIST_COBRANCA
VALUES ( RDAT.FAT_DOCUMENTO, RDAT.FAT_EMISSORA, RDAT.FAT_NUMERO, RDAT.FAT_ANO, RDAT.FAT_PARCELA, CURRENT_TIMESTAMP, PUND_LOCAL, 'BLOQUEIO AUTOMATICO DE INADIMPLENTE', 'BLOQUEIO AUTOMATICO', CURRENT_TIMESTAMP );
              END IF;
              --
           END IF;
        END LOOP;
     END IF;
RETURN TRUE;
  END;
  $$
  LANGUAGE 'PLPGSQL';


Thank you all for help,

Paulo Santana
O2 Tecnologia em Sistemas

Hélder M. Vieira escreveu:
Boa tarde.
> acusado o seguinte erro "sintax error at or near "SELECT" at character
> 487", e infelizmente não conseguimos achar o que esta errado, dai peço
Refiz todo o texto, p.f. experimente e diga se resultou. Algumas das alterações que fiz são meramente estilísticas, outras têm a ver com questões gramaticais. As mais significativas são: 1. Transcrição para minúsculas. Do ponto de vista dos comandos plpgsql julgo que é indiferente, mas o uso de maiúsculas para nomear objectos no Postgres não é vantajoso 2. Declaração de parâmetros. Os alias já não são necessários, os parâmetros podem ser utilizados por nome em vez de $1, $2, etc...
2. Correcção das estruturas if .. then .. end if
3. Reformulação dos ciclos for .. in .. loop .. end loop, que passam a usar uma variável de tipo registo ( declarada como 'rdat record' ) 4. Supressão de alias nos select e update, uma vez que não há join envolvidos Cumprimentos, Hélder M. Vieira

create or replace function trava_inadimplentes ( pdias_vencido integer, pund_local varchar(3), pcnpj varchar(18) ) returns boolean as
   $$
   declare
      spermite_bloqueio varchar(1);
      inro_registros integer;
      --
      rdat record;
   begin
      if ( pcnpj = '' ) then
for rdat in
            select tipo_doc as sfat_documento ,
                   fil_orig as sfat_emissora  ,
                   fatura   as ifat_numero    ,
                   ano      as sfat_ano       ,
                   parcela  as ifat_parcela   ,
                   cgc      as scod_cliente
            from ctas_receber
where ( status not in ( 'ca', 'co' ) ) and ( dt_pagto is null )
              and ( ( current_timestamp - dt_vencto ) >= pdias_vencido )
            order by dt_vencto, tipo_doc, fil_orig, fatura, ano
         loop
            select permite_protesto
            from clientes
            where cgc = rdat.scod_cliente
            into spermite_bloqueio;
            if (spermite_bloqueio = 't') then
               --
               update clientes
               set inadimplente = 't'                   ,
                   operador     = 'bloqueio automatico' ,
                   dt_alteracao = current_timestamp
               where cgc = rdat.scod_cliente;
               --
               insert into hist_cobranca
values ( rdat.sfat_documento, rdat.sfat_emissora, rdat.ifat_numero, rdat.sfat_ano, rdat.ifat_parcela, current_timestamp, pund_local, 'bloqueio automatico de inadimplente', 'bloqueio automatico', current_timestamp );
            end if;
         end loop;
else for rdat in
            select tipo_doc as sfat_documento ,
                   fil_orig as sfat_emissora  ,
                   fatura   as ifat_numero    ,
                   ano      as sfat_ano       ,
                   parcela  as ifat_parcela   ,
                   cgc      as scod_cliente
            from ctas_receber
            where ( status not in ( 'ca', 'co' )) and ( dt_pagto is null )
and ( ( current_timestamp - cob.dt_vencto ) >= pdias_vencido )
              and ( cgc = pcnpj )
            order by dt_vencto, tipo_doc, fil_orig, fatura, ano
         loop
select permite_protesto
            from clientes
            where cgc = scod_cliente
            into spermite_bloqueio;

            if ( spermite_bloqueio = 't' ) then
               --
               update clientes
               set inadimplente = 't'                   ,
                   operador     = 'bloqueio automatico' ,
                   dt_alteracao = current_timestamp
               where cgc = scod_cliente;
               --
               select count( fat_numero )
               from hist_cobranca
               where ( fat_documento  = rdat.sfat_documento )
                 and ( fat_emissora   = rdat.sfat_emissora )
                 and ( fat_numero     = rdat.ifat_numero )
                 and ( fat_ano        = rdta.sfat_ano )
                 and ( fat_parcela    = ifat_parcela )
                 and ( dta_lancamento = current_timestamp )
               into inro_registros;
               --
               if ( inro_registros = 0 ) then
                  insert into hist_cobranca
values ( rdat.sfat_documento, rdat.sfat_emissora, rdat.ifat_numero, rdat.sfat_ano, rdat.ifat_parcela, current_timestamp, pund_local, 'bloqueio automatico de inadimplente', 'bloqueio automatico', current_timestamp );
               end if;
               --
            end if;
end loop; end if;
      return true;
   end;
   $$
   language 'plpgsql';



__________ Information from ESET NOD32 Antivirus, version of virus signature database 4016 (20090417) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com



__________ Information from ESET NOD32 Antivirus, version of virus signature 
database 4016 (20090417) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com

Reply via email to