Temos uma política bastante restritiva em relação a anúncios no site. Eles nunca irão te atrapalhar!
Além disso, usamos banners para lhe informar de assuntos importantes. Os bloqueadores de anúncios impedem que esses banners sejam visualizados.
Sendo assim, para continuar, é importante que você desligue o bloqueador de anúncio e recarregue a página. Obrigado!

Valor por extenso em Procedure

Valor por extenso em Procedure

Data da última atualização: 15/11/2018

Abaixo MetaData de uma procedure que retorna por extenso um valor (em Real). Para colocar ela no banco basta colar o códino em um espaço de SQL e mandar executar que ela será criáda. Essa procedure irá funcionar nas versões do Firebird acima de 2.0, pois algumas funções só estão disponíveis a partir dessas versões. O Código original foi desenvolvido para Oracle, eu baixei pela internet, mas não lembro o nome do site, nem da pessoa que o desenvolveu, eu apenas adaptei para funcionar como procedure do Firebird. Espero que seja útil.
--
MARCOS JOSE TAMANHONI (tamanhoni-em-seek.inf.br)
Programador de Computador
SEEK - Informática Ltda

Código original alterado por Adilson Marcos Franco Pazzini, para eliminar espaços desnecessários entres os caracteres.

---------------------
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;
/* Stored procedures */
CREATE PROCEDURE "NUMERO_POR_EXTENSO" 
(
  "PE_VL_NUMERO" NUMERIC(15, 2)
)
RETURNS
(
  "PS_NUMERO_EXTENSO" VARCHAR(240)
)
AS
BEGIN EXIT; END ^

ALTER PROCEDURE "NUMERO_POR_EXTENSO" 
(
  "PE_VL_NUMERO" NUMERIC(15, 2)
)
RETURNS
(
  "PS_NUMERO_EXTENSO" VARCHAR(240)
)
AS
DECLARE EXTENSO VARCHAR(240);
DECLARE B1 INTEGER;
DECLARE B2 INTEGER;
DECLARE B3 INTEGER;
DECLARE B4 INTEGER;
DECLARE B5 INTEGER;
DECLARE B6 INTEGER;
DECLARE B7 INTEGER;
DECLARE B8 INTEGER;
DECLARE B9 INTEGER;
DECLARE B10 INTEGER; 
DECLARE B11 INTEGER;
DECLARE B12 INTEGER;
DECLARE B13 INTEGER;
DECLARE B14 INTEGER;
DECLARE L1 VARCHAR(12);
DECLARE L2 VARCHAR(3);
DECLARE L3 VARCHAR(9);
DECLARE L4 VARCHAR(3);
DECLARE L5 VARCHAR(6); 
DECLARE L6 VARCHAR(8);
DECLARE L7 VARCHAR(12);
DECLARE L8 VARCHAR(3);
DECLARE L9 VARCHAR(9);
DECLARE L10 VARCHAR(3);
DECLARE L11 VARCHAR(6);
DECLARE L12 VARCHAR(8);
DECLARE L13 VARCHAR(12);
DECLARE L14 VARCHAR(3); 
DECLARE L15 VARCHAR(9);
DECLARE L16 VARCHAR(3);
DECLARE L17 VARCHAR(6);
DECLARE L18 VARCHAR(8);
DECLARE L19 VARCHAR(12);
DECLARE L20 VARCHAR(3);
DECLARE L21 VARCHAR(9);
DECLARE L22 VARCHAR(3);
DECLARE L23 VARCHAR(6);
DECLARE L24 VARCHAR(16);
DECLARE L25 VARCHAR(3);
DECLARE L26 VARCHAR(9);
DECLARE L27 VARCHAR(3);
DECLARE L28 VARCHAR(6);
DECLARE L29 VARCHAR(17);
DECLARE VIRGULA_BI CHAR(3);
DECLARE VIRGULA_MI CHAR(3);
DECLARE VIRGULA_MIL CHAR(3);
DECLARE VIRGULA_CR CHAR(3);
DECLARE VALOR1 VARCHAR(14);
/*-- TABELA DE CENTENAS --*/
DECLARE CENTENAS CHAR(108) = 'CENTO       DUZENTOS    TREZENTOS   QUATROCENTOSQUINHENTOS  SEISCENTOS  SETECENTOS  OITOCENTOS  NOVECENTOS  ';
/*-- TABELA DE DEZENAS --*/
DECLARE DEZENAS CHAR(79) = 'DEZ      VINTE    TRINTA   QUARENTA CINQUENTASESSENTA SETENTA  OITENTA  NOVENTA  '; 
/*-- TABELA DE UNIDADES --*/
DECLARE UNIDADES CHAR(54) = 'UM    DOIS  TRES  QUATROCINCO SEIS  SETE  OITO  NOVE  ';
/*-- TABELA DE UNIDADES DA DEZENA 10 --*/
DECLARE UNID10   CHAR(81)  = 'ONZE     DOZE     TREZE    QUATORZE QUINZE   DEZESSEISDEZESSETEDEZOITO  DEZENOVE '; 
DECLARE V_IMPLEMENTAR INTEGER;
DECLARE I INTEGER;
DECLARE V_VL_INTEIRO VARCHAR(14);
begin
  EXTENSO = '';
  L1 = '';
  L2 = '';
  L3 = '';
  L4 = '';
  L5 = '';
  L6 = '';
  VIRGULA_BI = '';
  L7 = '';
  L8 = ''; 
  L9 = '';
  L10 = '';
  L11 = '';
  L12 = '';
  VIRGULA_MI = '';
  L13 = '';
  L14 = '';
  L15 = '';
  L16 = '';
  L17 = ''; 
  L18 = '';
  VIRGULA_MIL = '';
  L19 = '';
  L20 = '';
  L21 = '';
  L22 = '';
  L23 = '';
  L24 = '';
  VIRGULA_CR = ''; 
  L25 = '';
  L26 = '';
  L27 = '';
  L28 = '';
  L29 = '';
  I = 1;
  V_IMPLEMENTAR = 0;
  V_VL_INTEIRO = 0;
  
  V_VL_INTEIRO = PE_VL_NUMERO;
  V_IMPLEMENTAR = CHAR_LENGTH(V_VL_INTEIRO);
  VALOR1 = '';
  WHILE (I <= V_IMPLEMENTAR) DO
  BEGIN
    IF (SUBSTRING(V_VL_INTEIRO FROM I FOR 1) <> '.') THEN
    BEGIN
      VALOR1 = VALOR1 || SUBSTRING(V_VL_INTEIRO FROM I FOR 1); 
    END
    I = (I+1);
  END
  V_IMPLEMENTAR = (14 - CHAR_LENGTH(TRIM(VALOR1)));
  I = 0;
  WHILE (I <= V_IMPLEMENTAR) DO
  BEGIN
    IF (CHAR_LENGTH(VALOR1) < 14) THEN
    BEGIN
      VALOR1 = '0' || VALOR1;
    END
    I = (I + 1);
  END
  B1 = SUBSTRING(VALOR1 FROM 1 FOR 1);
  B2 = SUBSTRING(VALOR1 FROM 2 FOR 1);
  B3 = SUBSTRING(VALOR1 FROM 3 FOR 1);
  B4 = SUBSTRING(VALOR1 FROM 4 FOR 1);
  B5 = SUBSTRING(VALOR1 FROM 5 FOR 1);
  B6 = SUBSTRING(VALOR1 FROM 6 FOR 1); 
  B7 = SUBSTRING(VALOR1 FROM 7 FOR 1);
  B8 = SUBSTRING(VALOR1 FROM 8 FOR 1);
  B9 = SUBSTRING(VALOR1 FROM 9 FOR 1);
  B10 = SUBSTRING(VALOR1 FROM 10 FOR 1);
  B11 = SUBSTRING(VALOR1 FROM 11 FOR 1);
  B12 = SUBSTRING(VALOR1 FROM 12 FOR 1); 
  B13 = SUBSTRING(VALOR1 FROM 13 FOR 1);
  B14 = SUBSTRING(VALOR1 FROM 14 FOR 1);
  IF (PE_VL_NUMERO <> 0) THEN
  BEGIN
    IF (B1 <> 0) THEN
    BEGIN
      IF (B1 = 1) THEN
      BEGIN
        IF ((B2 = 0) AND (B3 = 0)) THEN
        BEGIN
          L5 =  'CEM'; 
        END
        ELSE
        BEGIN
          L1 = SUBSTRING(CENTENAS FROM (B1 * 12-11) FOR 12);
        END
      END
      ELSE
      BEGIN
        L1 = SUBSTRING(CENTENAS FROM (B1 * 12-11) FOR 12); 
      END
    END
    IF (B2 <> 0) THEN
    BEGIN
      IF (B2 = 1) THEN
      BEGIN
        IF (B3 = 0) THEN
        BEGIN
          L5 =  'DEZ';
        END
        ELSE
        BEGIN
          L3 =  SUBSTRING(UNID10 FROM (B3 * 9-8) FOR 9); 
        END
      END
      ELSE
      BEGIN
        L3 =  SUBSTRING(DEZENAS FROM (B2 * 9-8) FOR 9);
      END
    END
    IF (B3 <> 0) THEN
    BEGIN
      IF (B2 <> 1) THEN
      BEGIN
        L5 =  SUBSTRING(UNIDADES FROM (B3 * 6-5) FOR 6);
      END
    END
    IF ((B1 <> 0) OR (B2 <> 0)  OR (B3 <> 0)) THEN
    BEGIN
      IF ((B1 = 0 AND B2 = 0) AND (B3 = 1)) THEN 
      BEGIN
        L5 =  'UM';
        L6 =  ' BILHÃO';
      END
      ELSE
      BEGIN
        L6 =  ' BILHÕES';
      END
      IF (PE_VL_NUMERO > 999999999) THEN 
      BEGIN
/*        VIRGULA_BI = ' E ';*/
        VIRGULA_BI = '';
        IF ((B4+B5+B6+B7+B8+B9+B10+B11+B12) = 0) THEN
        BEGIN
          VIRGULA_BI = ' DE ' ;
        END 
      END
      L1 =  TRIM(L1);
      L3 =  TRIM(L3);
      L5 =  TRIM(L5);
      IF ((B2 > 1) AND (B3 > 0)) THEN
      BEGIN
        L4 = ' E ';
      END
      IF ((B1 <> 0) AND ((B2 <> 0) OR (B3 <> 0))) THEN 
      BEGIN
        L2 = ' E ';
      END
    END
  /*-- ROTINA DOS MILHOES --*/
    IF (B4 <> 0) THEN
    BEGIN
      IF (B4 = 1) THEN
      BEGIN
        IF ((B5 = 0) AND (B6 = 0)) THEN
        BEGIN
          L7 =  'CEM';
        END 
        ELSE
        BEGIN
          L7 = SUBSTRING(CENTENAS FROM (B4 * 12-11) FOR 12);
        END
      END
      ELSE
      BEGIN
        L7 = SUBSTRING(CENTENAS FROM (B4 * 12-11) FOR 12);
      END 
    END
    IF (B5 <> 0) THEN
    BEGIN
      IF (B5 = 1) THEN
      BEGIN
        IF (B6 = 0) THEN
        BEGIN
          L11 =  'DEZ';
        END
        ELSE
        BEGIN 
          L9 =  SUBSTRING(UNID10 FROM (B6 * 9-8) FOR 9);
        END
      END
      ELSE
      BEGIN
        L9 =  SUBSTRING(DEZENAS FROM (B5 * 9-8) FOR 9);
      END
    END
    IF (B6 <> 0) THEN 
    BEGIN
      IF (B5 <> 1) THEN
      BEGIN
        L11 =  SUBSTRING(UNIDADES FROM (B6 * 6-5) FOR 6);
      END
    END
    IF ((B4 <> 0) OR (B5 <> 0)  OR (B6 <> 0)) THEN
    BEGIN
      IF (((B4 = 0) AND (B5 = 0)) AND (B6 = 1)) THEN
      BEGIN
        L11 =  ' UM';
        L12 =  ' MILHÃO';
      END
      ELSE
      BEGIN
        L12 =  ' MILHÕES'; 
      END
      IF (PE_VL_NUMERO > 999999) THEN
      BEGIN
/*        VIRGULA_MI = ' E ';*/
        VIRGULA_MI = '';
        IF ((B7+B8+B9+B10+B11+B12) = 0) THEN
        BEGIN
          VIRGULA_MI = ' DE '; 
        END
      END
      L7 =  TRIM(L7);
      L9 =  TRIM(L9);
      L11 = TRIM(L11);
      IF ((B5 > 1) AND (B6 > 0)) THEN
      BEGIN
        L10 = ' E ';
      END
      IF ((B4 <> 0) AND ((B5 <> 0) OR (B6 <> 0))) THEN 
      BEGIN
        L8 = ' E ';
      END
    END
    /*-- ROTINA DOS MILHARES --*/
    IF (B7 <> 0) THEN
    BEGIN
      IF (B7 = 1) THEN
      BEGIN
        IF ((B8 = 0) AND (B9 = 0)) THEN
        BEGIN
          L17 =  'CEM';
        END
        ELSE
        BEGIN 
          L13 = SUBSTRING(CENTENAS FROM (B7 * 12-11) FOR 12);
        END
      END
      ELSE
      BEGIN
        L13 = SUBSTRING(CENTENAS FROM (B7 * 12-11) FOR 12);
      END
    END
    IF (B8 <> 0) THEN 
    BEGIN
      IF (B8 = 1) THEN
      BEGIN
        IF (B9 = 0) THEN
        BEGIN
          L17 =  'DEZ';
        END
        ELSE
        BEGIN
          L15 =  SUBSTRING(UNID10 FROM (B9 * 9-8) FOR 9); 
        END
      END
      ELSE
      BEGIN
        L15 =  SUBSTRING(DEZENAS FROM (B8 * 9-8) FOR 9);
      END
    END
    IF (B9 <> 0) THEN
    BEGIN
      IF (B8 <> 1) THEN
      BEGIN
        L17 =  SUBSTRING(UNIDADES FROM (B9 * 6-5) FOR 6);
      END
    END
    IF ((B7 <> 0) OR (B8 <> 0)  OR (B9 <> 0)) THEN
    BEGIN
      IF (((B7 = 0) AND (B8 = 0)) AND (B9 = 1)) THEN 
      BEGIN
        L17 =  'UM';
        L18 =  ' MIL';
      END
      ELSE
      BEGIN
        L18 =  ' MIL';
      END
      IF ((PE_VL_NUMERO > 999) AND ((B10+B11+B12) <> 0)) THEN 
      BEGIN
        VIRGULA_MIL  = ' E ';
      END
      L13 =  TRIM(L13);
      L15 =  TRIM(L15);
      L17 =  TRIM(L17);
      IF ((B8 > 1) AND (B9 > 0)) THEN
      BEGIN
         L16 = ' E '; 
      END
      IF ((B7 <> 0) AND ((B8 <> 0) OR (B9 <> 0))) THEN
      BEGIN
        L14 = ' E ';
      END
    END
  /*-- ROTINA DOS REAIS --*/
    IF (B10 <> 0) THEN
    BEGIN
      IF (B10 = 1) THEN
      BEGIN
        IF ((B11 = 0) AND (B12 = 0)) THEN
        BEGIN
          L19 =  'CEM';
        END
        ELSE
        BEGIN 
          L19 = SUBSTRING(CENTENAS FROM (B10 * 12-11) FOR 12);
        END
     END
     ELSE
     BEGIN
       L19 = SUBSTRING(CENTENAS FROM (B10 * 12-11) FOR 12);
     END
    END
    IF (B11 <> 0) THEN
    BEGIN
      IF (B11 = 1) THEN
      BEGIN
        IF (B12 = 0) THEN
        BEGIN
          L23 =  'DEZ';
        END
        ELSE
        BEGIN
          L21 =  SUBSTRING(UNID10 FROM (B12 * 9-8) FOR 9); 
        END
      END
      ELSE
      BEGIN
        L21 =  SUBSTRING(DEZENAS FROM (B11 * 9-8) FOR 9);
      END
    END
    IF (B12 <> 0) THEN
    BEGIN
      IF (B11 <> 1) THEN 
      BEGIN
        L23 =  SUBSTRING(UNIDADES FROM (B12 * 6-5) FOR 6);
      END
    END
    IF ((B10 <> 0) OR (B11 <> 0)  OR (B12 <> 0)) THEN
    BEGIN
      IF ((PE_VL_NUMERO > 0) AND (PE_VL_NUMERO < 2)) THEN
      BEGIN
        L23 =  'UM';
      END
      L19 =  TRIM(L19); 
      L21 =  TRIM(L21);
      L23 = TRIM(L23);
      IF ((B11 > 1) AND (B12 > 0)) THEN
      BEGIN
        L22 = ' E ';
      END
      IF ((B10 <> 0) AND ((B11 <> 0) OR (B12 <> 0))) THEN 
      BEGIN
        L20 = ' E ';
      END
    END
    IF ((PE_VL_NUMERO > 0) AND (PE_VL_NUMERO < 2))  THEN
    BEGIN
      IF (B12 <> 0) THEN
      BEGIN
        L24 = ' REAL';
      END
    END
    ELSE
    BEGIN
      IF (PE_VL_NUMERO > 1) THEN 
      BEGIN
        L24 = ' REAIS';
      END
    END
  /*-- TRATA CENTAVOS --*/
    IF ((B13 <> 0) OR (B14 <> 0)) THEN
    BEGIN
      IF (PE_VL_NUMERO > 0) THEN
      BEGIN
        IF ((B12 <> 0) OR ((B1+B2+B3+B4+B5+B6+B7+B8+B9+B10+B11+B12) <> 0)) THEN 
        BEGIN
          L25 = ' E ';
        END
      END
      IF (B13 <> 0) THEN
      BEGIN
        IF (B13 = 1) THEN
        BEGIN
          IF (B14 = 0) THEN
          BEGIN 
            L28 =  'DEZ';
          END
          ELSE
          BEGIN
            L26 =  SUBSTRING(UNID10 FROM B14*9-8 FOR 9);
          END
        END
        ELSE
        BEGIN
          L26 =  SUBSTRING(DEZENAS FROM B13*9-8 FOR 9); 
        END
      END
      IF (B14 <> 0) THEN
      BEGIN
        IF (B13 <> 1) THEN
        BEGIN
          L28 =  SUBSTRING(UNIDADES FROM B14*6-5 FOR 6);
        END
      END
      IF ((B13 <> 0)  OR (B14 <> 0)) THEN
      BEGIN
        IF (PE_VL_NUMERO = 1) THEN
        BEGIN
          L28 =  'UM';
        END
        L26 =  TRIM(L26);
        L28 = TRIM(L28); 
        IF ((B13 > 1) AND (B14 > 0)) THEN
        BEGIN
          L27 = ' E ';
        END
      END
      IF ((B1+B2+B3+B4+B5+B6+B7+B8+B9+B10+B11+B12) > 0) THEN
      BEGIN
        IF ((B13 = 0) AND (B14 = 1)) THEN 
        BEGIN
          L29 = ' CENTAVO';
        END
        ELSE
        BEGIN
          L29 = ' CENTAVOS';
        END
      END
      ELSE
      BEGIN
        IF ((B13 = 0) AND (B14 = 1)) THEN 
        BEGIN
          L29 = ' CENTAVO';
        END
        ELSE
        BEGIN
          L29 = ' CENTAVOS';
        END
      END
    END
  /*-- CONCATENAR O LITERAL --*/
    IF ((L29 = ' CENTAVO') OR (L29 = ' CENTAVOS')) THEN
    BEGIN
      VIRGULA_MIL = '';
    END
    EXTENSO = IIF(TRIM(L1)='','',TRIM(L1)||' ')||
              IIF(TRIM(L2)='','',TRIM(L2)||' ')||
              IIF(TRIM(L3)='','',TRIM(L3)||' ')||
              IIF(TRIM(L4)='','',TRIM(L4)||' ')||
              IIF(TRIM(L5)='','',TRIM(L5)||' ')||
              IIF(TRIM(L6)='','',TRIM(L6)||' ')||

              IIF(TRIM(VIRGULA_BI)='','',TRIM(VIRGULA_BI)||' ')||

              IIF(TRIM(L7)='','',TRIM(L7)||' ')||
              IIF(TRIM(L8)='','',TRIM(L8)||' ')||
              IIF(TRIM(L9)='','',TRIM(L9)||' ')||
              IIF(TRIM(L10)='','',TRIM(L10)||' ')||
              IIF(TRIM(L11)='','',TRIM(L11)||' ')||
              IIF(TRIM(L12)='','',TRIM(L12)||' ')||

              IIF(TRIM(VIRGULA_MI)='','',TRIM(VIRGULA_MI)||' ')||

              IIF(TRIM(L13)='','',TRIM(L13)||' ')||
              IIF(TRIM(L14)='','',TRIM(L14)||' ')||
              IIF(TRIM(L15)='','',TRIM(L15)||' ')||
              IIF(TRIM(L16)='','',TRIM(L16)||' ')||
              IIF(TRIM(L17)='','',TRIM(L17)||' ')||
              IIF(TRIM(L18)='','',TRIM(L18)||' ')||

              IIF(TRIM(VIRGULA_MIL)='','',TRIM(VIRGULA_MIL)||' ')||

              IIF(TRIM(L19)='','',TRIM(L19)||' ')||
              IIF(TRIM(L20)='','',TRIM(L20)||' ')||
              IIF(TRIM(L21)='','',TRIM(L21)||' ')||
              IIF(TRIM(L22)='','',TRIM(L22)||' ')||
              IIF(TRIM(L23)='','',TRIM(L23)||' ')||
              IIF(TRIM(L24)='','',TRIM(L24)||' ')||

              IIF(TRIM(VIRGULA_CR)='','',TRIM(VIRGULA_CR)||' ')||

              IIF(TRIM(L25)='','',TRIM(L25)||' ')||
              IIF(TRIM(L26)='','',TRIM(L26)||' ')||
              IIF(TRIM(L27)='','',TRIM(L27)||' ')||
              IIF(TRIM(L28)='','',TRIM(L28)||' ')||
              TRIM(L29);

              EXTENSO = TRIM(EXTENSO);
  END
  ELSE
  BEGIN
    EXTENSO = 'ZERO';
  END
  
  PS_NUMERO_EXTENSO = EXTENSO;
  SUSPEND;
  
end
 ^
SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;
Compartilhe esse artigo: