exportaFuncaoGeradorCalculo.plsql 17.2 KB
/*
    **********************************************************************************
    *                                                                                *
    * @package URBEM CNM - Soluções em Gestão Pública                                *
    * @copyright (c) 2013 Confederação Nacional de Municípos                         *
    * @author Confederação Nacional de Municípios                                    *
    *                                                                                *
    * O URBEM CNM é um software livre; você pode redistribuí-lo e/ou modificá-lo sob *
    * os  termos  da Licença Pública Geral GNU conforme  publicada  pela Fundação do *
    * Software Livre (FSF - Free Software Foundation); na versão 2 da Licença.       *
    *                                                                                *
    * Este  programa  é  distribuído  na  expectativa  de  que  seja  útil,   porém, *
    * SEM NENHUMA GARANTIA; nem mesmo a garantia implícita  de  COMERCIABILIDADE  OU *
    * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral do GNU *
    * para mais detalhes.                                                            *
    *                                                                                *
    * Você deve ter recebido uma cópia da Licença Pública Geral do GNU "LICENCA.txt" *
    * com  este  programa; se não, escreva para  a  Free  Software Foundation  Inc., *
    * no endereço 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.       *
    *                                                                                *
    **********************************************************************************
*/
/*
* Script de função PLPGSQL
*
* URBEM Soluções de Gestão Pública Ltda
* www.urbem.cnm.org.br
*
* $Revision: 26768 $
* $Name$
* $Author: gris $
* $Date: 2007-11-13 17:27:22 -0200 (Ter, 13 Nov 2007) $
*
* Casos de uso: uc-00.00.00
*/
CREATE OR REPLACE FUNCTION public.exporta_funcao(intCodfuncao     INTEGER
                                                ,intCodmodulo     INTEGER
                                                ,intCodbiblioteca INTEGER
                                                ,varNomenovo      VARCHAR
                                                ,bolExportaBanco  BOOLEAN)
RETURNS TEXT AS $$
DECLARE
   recFuncao         Record;
   recCorpofn        Record;
   recFnreferencia   Record;
   recVariavel       Record;
   recParamentro     Record;

   varAux            VARCHAR;
   varNomevelho      VARCHAR;
   varComando        VARCHAR;
   varNomecorpopl    VARCHAR;
   varReturn         VARCHAR;

   varPegaProxCod    VARCHAR;
   varPegaAtuaCod    VARCHAR;
   varCodmodulo      VARCHAR := BTrim(To_Char(intCodmodulo    ,'99999'));
   varCodbiblioteca  VARCHAR := BTrim(To_Char(intCodbiblioteca,'99999'));

   txtcomentario     TEXT;
   txtcorpopl        TEXT;
   txtcorpoln        TEXT;
BEGIN
   varAux          := '';
   varNomevelho    := '';
   varNomecorpopl  := '';
   txtcomentario   := '';
   txtcorpopl      := '';
   txtcorpoln      := '';
   varComando      := '';
   varReturn       := '';

   varPegaProxCod  :=                  '(SELECT (Max(cod_funcao)+1)'                         ;
   varPegaProxCod  := varPegaProxCod ||  ' FROM administracao.funcao'                        ;
   varPegaProxCod  := varPegaProxCod || ' WHERE cod_modulo     = ' || varCodmodulo           ;
   varPegaProxCod  := varPegaProxCod || '   AND cod_biblioteca = ' || varCodbiblioteca || ')';

   varPegaAtuaCod  :=                  '(SELECT Max(cod_funcao)'                             ;
   varPegaAtuaCod  := varPegaAtuaCod ||  ' FROM administracao.funcao'                        ;
   varPegaAtuaCod  := varPegaAtuaCod || ' WHERE cod_modulo     = ' || varCodmodulo           ;
   varPegaAtuaCod  := varPegaAtuaCod || '   AND cod_biblioteca = ' || varCodbiblioteca || ')';

   SELECT INTO recFuncao
               funcao.cod_funcao
             , funcao.cod_modulo
             , funcao.cod_biblioteca
             , BTrim(To_Char(funcao.cod_tipo_retorno, '99999')) AS cod_tipo_retorno
             , funcao.nom_funcao
          FROM administracao.funcao LEFT JOIN administracao.funcao_externa ON
                                              (administracao.funcao.cod_funcao     = administracao.funcao_externa.cod_funcao AND
                                               administracao.funcao.cod_modulo     = administracao.funcao_externa.cod_modulo AND
                                               administracao.funcao.cod_biblioteca = administracao.funcao_externa.cod_biblioteca)
         WHERE administracao.funcao.cod_funcao     = intCodfuncao
           AND administracao.funcao.cod_modulo     = intCodmodulo
           AND administracao.funcao.cod_biblioteca = intCodbiblioteca
           AND administracao.funcao_externa.cod_funcao IS NOT NULL;


   IF NOT FOUND THEN
      varAux := ' Cod Função: ' || intCodfuncao  || ' Cod Modulo: ' || intCodmodulo || ' Cod Biblioteca: ' || intCodbiblioteca;
   ELSE

      varComando := ' INSERT INTO administracao.funcao ( cod_modulo
                                                       , cod_biblioteca
                                                       , cod_funcao
                                                       , cod_tipo_retorno
                                                       , nom_funcao)
                                                VALUES ('|| varCodmodulo                                                 ||'
                                                       ,'|| varCodbiblioteca                                             ||'
                                                       ,'|| varPegaProxCod                                               ||'
                                                       ,'|| recFuncao.cod_tipo_retorno                                   ||'
                                                       ,'|| quote_literal(COALESCE( varNomenovo, recFuncao.nom_funcao )) ||'
                                                       );
                    ';

      IF bolExportaBanco THEN
         EXECUTE varComando;
      ELSE
         varReturn := varReturn || varComando || '\n' ;
      END IF;

      -- Dados da tabela administracao.funcao_externa correspondentes a funcao
      SELECT comentario
           , corpo_pl
           , corpo_ln
        INTO txtcomentario
           , txtcorpopl
           , txtcorpoln
        FROM administracao.funcao_externa
       WHERE administracao.funcao_externa.cod_funcao     = intCodfuncao
         AND administracao.funcao_externa.cod_modulo     = recFuncao.cod_modulo
         AND administracao.funcao_externa.cod_biblioteca = recFuncao.cod_biblioteca
           ;


      txtcorpopl := REPLACE(txtcorpopl,'''','''''''');
      txtcorpopl := REPLACE(txtcorpopl,'\\','\\\\');


      -- Altera o nome da função no campo corpo_pl
      IF varNomenovo IS NOT NULL THEN
         varNomevelho := SUBSTR(txtcorpopl, 1, (POSITION('(' IN  txtcorpopl)-1));
         varNomecorpopl:= 'FUNCTION ' || REPLACE (txtcorpopl, varNomevelho, varNomenovo);
      ELSE
         varNomecorpopl := txtcorpopl;
      END IF;

      -- Insere dados da função clone na tabela administracao.funcao_externa
      varComando := 'INSERT INTO administracao.funcao_externa( cod_modulo
                                                             , cod_biblioteca
                                                             , cod_funcao
                                                             , comentario
                                                             , corpo_pl
                                                             , corpo_ln
                                                             )
                                                      VALUES ('|| varCodmodulo                    ||'
                                                             ,'|| varCodbiblioteca                ||'
                                                             ,'|| varPegaAtuaCod                  ||'
                                                             ,'|| quote_literal( txtcomentario  ) ||'
                                                             ,'|| quote_literal( varNomecorpopl ) ||'
                                                             ,'|| quote_literal( txtcorpoln     ) ||'
                                                             );
                    ';

      IF bolExportaBanco THEN
         EXECUTE varComando;
      ELSE
         varReturn := varReturn || varComando || '\n' ;
      END IF;


      -- Insere dados na tabela corpo_funcao_externa
      FOR recCorpofn IN SELECT cod_modulo
                             , cod_biblioteca
                             , cod_funcao
                           , cod_linha
                           , nivel
                           , linha
                        FROM administracao.corpo_funcao_externa
                        WHERE cod_funcao     = intcodfuncao
                          AND cod_modulo     = intCodmodulo
                          AND cod_biblioteca = intCodbiblioteca
      LOOP

         varComando:= 'INSERT INTO administracao.corpo_funcao_externa ( cod_modulo
                                                                      , cod_biblioteca
                                                                      , cod_funcao
                                                                      , cod_linha
                                                                      , nivel
                                                                      , linha)
                                                               VALUES ('|| varCodmodulo                                  ||'
                                                                      ,'|| varCodbiblioteca                              ||'
                                                                      ,'|| varPegaAtuaCod                                ||'
                                                                      ,'|| BTrim(To_Char(recCorpofn.cod_linha, '99999')) ||'
                                                                      ,'|| quote_literal( recCorpofn.nivel )             ||'
                                                                      ,'|| quote_literal( recCorpofn.linha )             ||'
                                                                      );
                      ';

         IF bolExportaBanco THEN
            EXECUTE varComando;
         ELSE
            varReturn := varReturn || varComando || '\n' ;
         END IF;

      END LOOP;

      -- Insere dados na tabela funcao_referencia
      FOR recFnreferencia IN SELECT cod_modulo_externa
                                 , cod_biblioteca_externa
                                 , cod_funcao_externa
                                 , cod_modulo
                                 , cod_biblioteca
                                 , cod_funcao
                              FROM administracao.funcao_referencia
                              WHERE administracao.funcao_referencia.cod_funcao_externa     = intcodfuncao
                                AND administracao.funcao_referencia.cod_modulo_externa     = intCodmodulo
                                AND administracao.funcao_referencia.cod_biblioteca_externa = intCodbiblioteca
      LOOP
         varComando := 'INSERT INTO administracao.funcao_referencia ( cod_modulo_externa
                                                                    , cod_biblioteca_externa
                                                                    , cod_funcao_externa
                                                                    , cod_funcao
                                                                    , cod_biblioteca
                                                                    , cod_modulo
                                                                    )
                                                             VALUES ('|| BTrim(To_Char(recFnreferencia.cod_modulo_externa, '99999'))     || '
                                                                    ,'|| BTrim(To_Char(recFnreferencia.cod_biblioteca_externa, '99999')) || '
                                                                    ,'|| varPegaAtuaCod                                                  || '
                                                                    ,'|| BTrim(To_Char(recFnreferencia.cod_funcao, '99999'))             || '
                                                                    ,'|| BTrim(To_Char(recFnreferencia.cod_biblioteca, '99999'))         || '
                                                                    ,'|| BTrim(To_Char(recFnreferencia.cod_modulo, '99999'))             || '
                                                                    );
                       ';




         IF bolExportaBanco THEN
            EXECUTE varComando;
         ELSE
            varReturn := varReturn || varComando || '\n' ;
         END IF;

      END LOOP;

      -- Insere dados na tabela variavel
      FOR recVariavel IN SELECT cod_modulo
                           , cod_biblioteca
                           , cod_funcao
                           , cod_variavel
                           , cod_tipo
                           , nom_variavel
                           , valor_inicial
                        FROM administracao.variavel
                        WHERE cod_funcao     = intcodfuncao
                           AND cod_modulo     = intCodmodulo
                           AND cod_biblioteca = intCodbiblioteca
      LOOP
         varComando := 'INSERT INTO administracao.variavel ( cod_modulo
                                                           , cod_biblioteca
                                                           , cod_funcao
                                                           , cod_variavel
                                                           , cod_tipo
                                                           , nom_variavel
                                                           , valor_inicial
                                                           )
                                                    VALUES ('|| BTrim(To_Char(recVariavel.cod_modulo, '99999'))     || '
                                                           ,'|| BTrim(To_Char(recVariavel.cod_biblioteca, '99999')) || '
                                                           ,'|| varPegaAtuaCod                                      || '
                                                           ,'|| BTrim(To_Char(recVariavel.cod_variavel, '99999'))   || '
                                                           ,'|| BTrim(To_Char(recVariavel.cod_tipo, '99999'))       || '
                                                           ,'|| quote_literal( recVariavel.nom_variavel  )          || '
                                                           ,'|| quote_literal( recVariavel.valor_inicial )          || '
                                                           );
                       ';


         IF bolExportaBanco THEN
            EXECUTE varComando;
         ELSE
            varReturn := varReturn || varComando || '\n' ;
         END IF;

      END LOOP;

      -- Insere dados na tabela paramentro
      FOR recParamentro IN SELECT cod_modulo
                              , cod_biblioteca
                              , cod_funcao
                              , cod_variavel
                              , ordem
                           FROM administracao.parametro
                           WHERE cod_funcao     = intcodfuncao
                              AND cod_modulo     = intCodmodulo
                              AND cod_biblioteca = intCodbiblioteca
      LOOP
         varComando := 'INSERT INTO administracao.parametro ( cod_modulo
                                                            , cod_biblioteca
                                                            , cod_funcao
                                                            , cod_variavel
                                                            , ordem)
                                                     VALUES ('|| BTrim(To_Char(recParamentro.cod_modulo, '99999'))     || '
                                                            ,'|| BTrim(To_Char(recParamentro.cod_biblioteca, '99999')) || '
                                                            ,'|| varPegaAtuaCod                                        || '
                                                            ,'|| BTrim(To_Char(recParamentro.cod_variavel, '99999'))   || '
                                                            ,'|| BTrim(To_Char(recParamentro.ordem, '99999'))          || '
                                                            );
                       ';

         IF bolExportaBanco THEN
            EXECUTE varComando;
         ELSE
            varReturn := varReturn || varComando || '\n' ;
         END IF;

      END LOOP;

   END IF;

   RETURN varReturn;

END;

$$ LANGUAGE plpgsql;

--SELECT public.exporta_funcao(25,12,1,'CalculaIPTU2008Alagoinhas'  ,false);
--SELECT public.exporta_funcao(2,33,1, NULL ,false);
--DROP FUNCTION public.exporta_funcao(INTEGER, INTEGER, INTEGER, VARCHAR, BOOLEAN);