Função que retorna valor por extenso

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
renan_pre
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Ter, 10 Abr 2007 11:08 am
Localização: São Paulo - SP
M. Renan

E aí Galera!! beleza??

Eu procurei nos tópicos mas não achei.... alguém tem uma função que retorna um valor por extenso ???
poderia disponibilizar aqui??

Valeu

Abraços
renan_pre
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Ter, 10 Abr 2007 11:08 am
Localização: São Paulo - SP
M. Renan

Galera, já encontrei num relatorio da propria empresa... só que não está no banco... ta no próprio reports...

são duas funções:

Selecionar tudo

  FUNCTION EXTENSOS(
  p_number IN NUMBER )
  RETURN VARCHAR2 IS
  BEGIN
     DECLARE
       xunidads Varchar2 ( 20 )   := ' REAIS';
       xunidade Varchar2 ( 20 )   := ' REAL';
       Centavos Varchar2 ( 20 )   := ' CENTAVOS';
       Centavo Varchar2 ( 20 )   := ' CENTAVO';
       frase Varchar2 ( 500 ) ;
       cNumber Varchar2 ( 20 ) ;
       Parte_1 Varchar2 ( 3 ) ;
       Parte_2 Varchar2 ( 3 ) ;
       Parte_3 Varchar2 ( 3 ) ;
       Parte_4 Varchar2 ( 3 ) ;
       Parte_5 Varchar2 ( 3 ) ;
       nPart NUMBER;
     Begin
       cNumber := To_Char ( p_Number, '00000000000.00' );
       Parte_1 := Substr ( cNumber, 1, 3 );
       Parte_2 := Substr ( cNumber, 4, 3 );
       Parte_3 := Substr ( cNumber, 7, 3 );
       Parte_4 := Substr ( cNumber, 10, 3 );
       Parte_5 := '0' || Substr ( cNumber, 14, 2 );
       If p_Number < 0 Then
          Frase := 'MENOS ';
       Else
          Frase := '';
       End If;
       nPart := To_Number ( Parte_1 );
       If nPart <> 0 Then
          If Parte_2  = '000' AND Parte_3 = '000'
             AND Parte_4 = '000' AND Parte_5 = '000' Then
             If nPart = 1 Then
                Frase := Frase || Retorno ( Parte_1, ' BILHAO') || xUNIDADS;
             Else
                frase := Frase || Retorno ( Parte_1, ' BILHOES') || xUNIDADS;
             End If;
          Else
             If nPart =1 Then
                Frase := Frase || Retorno ( Parte_1, ' BILHAO' );
             Else
                Frase := Frase || Retorno ( Parte_1, ' BILHOES' );
             End If;
          End If;
       End If;
       If Parte_2 <> '000' Then
          IF Length ( Frase ) > 0 Then
             Frase := Frase || ', ';
          End If;
          nPart := To_Number ( Parte_2 );
          If Parte_3 = '000' AND Parte_4 = '000'
             AND Parte_5 = '000' Then
             If nPart = 1 Then
                Frase := Frase || Retorno ( Parte_2, ' MILHAO') || xUNIDADS;
             Else
                Frase := Frase || Retorno ( Parte_2, ' MILHOES') || xUNIDADS;
             End If;
          Else
            If nPart =1 Then
               Frase := Frase || Retorno ( Parte_2, ' MILHAO');
            Else
               Frase := Frase || Retorno ( Parte_2, ' MILHOES');
            End If;
          End If;
       End If;
       If Parte_3 <> '000' Then
          IF Length ( Frase ) > 0 Then
             Frase := Frase || ', ';
          End If;
          Frase := Frase || Retorno (Parte_3, ' MIL ');
          If parte_4 = '000' Then
             Frase := Frase || xunidads;
          End If;
       End If;
       If Parte_4 <> '000' Then
          If Length ( Frase ) > 0 Then
             Frase := Frase || ', ';
          End If;
          nPart := To_Number ( Parte_4 );
          If nPart = 1 Then
             Frase := Frase || RETORNO(parte_4, xunidade );
          Else
             Frase := Frase || RETORNO(parte_4, xunidads );
          End If;
       End If;
       IF Parte_5 <> '000' Then
          nPart := To_Number ( Parte_5 );
          If Length ( Frase ) > 0 Then
             If nPart = 1 Then
                Frase := Frase || ' E ' || Retorno ( Parte_5, centavo );
             Else
                Frase := Frase || ' E ' || Retorno ( Parte_5, centavos);
             End If;
          Else
             If nPart = 1 Then
                Frase := Frase || Retorno ( Parte_5, centavo );
             Else
                Frase := Frase || Retorno ( Parte_5, centavos );
             End If;
          End If;
       End If;
       RETURN Frase;
     End;
  END;
E ...

Selecionar tudo

  FUNCTION RETORNO(
  xparametro IN CHAR ,
  xcontinuacao IN CHAR )
  RETURN VARCHAR2 IS
  BEGIN
    DECLARE
      type centena_type is table of varchar2(15)
           index by binary_integer;
      type dezena_type is table of varchar2(15)
           index by binary_integer;
      type dez_type is table of varchar2(15)
           index by binary_integer;
      type unidade_type is table of varchar2(15)
           index by binary_integer;
      rg_id_centena            centena_type;
      rg_id_dezena             dezena_type;
      rg_id_dez                dez_type;
      rg_id_unidade            unidade_type;
      errcode  NUMBER;
      xFrase VARCHAR2 ( 500 );
      x1 NUMBER;
      x2 NUMBER;
      x3 NUMBER;
      cString VARCHAR2 ( 30 );
     BEGIN
    /*----------------- Centenas -----------------*/
       rg_id_centena(1) := 'CENTO';
       rg_id_centena(2) := 'DUZENTOS';
       rg_id_centena(3) := 'TREZENTOS';
       rg_id_centena(4) := 'QUATROCENTOS';
       rg_id_centena(5) := 'QUINHENTOS';
       rg_id_centena(6) := 'SEISSENTOS';
       rg_id_centena(7) := 'SETECENTOS';
       rg_id_centena(8) := 'OITOCENTOS';
       rg_id_centena(9) := 'NOVECENTOS';
    /*----------------- Dezenas -----------------*/
       rg_id_dezena(1) := '';
       rg_id_dezena(2) := 'VINTE';
       rg_id_dezena(3) := 'TRINTA';
       rg_id_dezena(4) := 'QUARENTA';
       rg_id_dezena(5) := 'CINQUENTA';
       rg_id_dezena(6) := 'SESSENTA';
       rg_id_dezena(7) := 'SETENTA';
       rg_id_dezena(8) := 'OITENTA';
       rg_id_dezena(9) := 'NOVENTA';
    /*----------------- 11-19 -----------------*/
       rg_id_dez(1) := 'ONZE';
       rg_id_dez(2) := 'DOZE';
       rg_id_dez(3) := 'TREZE';
       rg_id_dez(4) := 'QUATORZE';
       rg_id_dez(5) := 'QUINZE';
       rg_id_dez(6) := 'DEZESSEIS';
       rg_id_dez(7) := 'DEZESSETE';
       rg_id_dez(8) := 'DEZOITO';
       rg_id_dez(9) := 'DEZENOVE';
    /*----------------- Unidades -----------------*/
       rg_id_unidade(1) := 'UM';
       rg_id_unidade(2) := 'DOIS';
       rg_id_unidade(3) := 'TRES';
       rg_id_unidade(4) := 'QUATRO';
       rg_id_unidade(5) := 'CINCO';
       rg_id_unidade(6) := 'SEIS';
       rg_id_unidade(7) := 'SETE';
       rg_id_unidade(8) := 'OITO';
       rg_id_unidade(9) := 'NOVE';
       If xParametro = '100' Then
          Return 'CEM' || xContinuacao;
       Else
          xFrase := '';
          x1 := Nvl ( To_Number ( Substr (  xParametro, 1, 1 ) ), 0 );
          x2 := Nvl ( To_Number ( Substr (  xParametro, 2, 1 ) ), 0 );
          x3 := Nvl ( To_Number ( Substr (  xParametro, 3, 1 ) ), 0 );
          If x1  <> 0 Then
             cString := rg_id_centena(x1);
             xFrase := xFrase || cString;
          End If;
          If x2 <> 0 Then
             If x1 <> 0 Then
                xFrase := xFrase || ' E ';
             End If;
             If x2 = 1 Then
                If x3 = 0 Then
                   xFrase := xFrase || 'DEZ';
                Else
                  cString := rg_id_dez(x3);
                  xFrase := xFrase || cString;
                End If;
             Else
                cString := rg_id_dezena(x2);
                xFrase := xFrase || cString;
             End If;
          End If;
          If x3 <> 0 AND x2 <> 1 Then
             If x1 <> 0 OR x2 <> 0 Then
                xFrase := xFrase || ' E ';
             End If;
             cString := rg_id_unidade(x3);
             xFrase := xFrase || cString;
          End If;
       End If;
       Return xFrase || xContinuacao;
     End;
  END;
chamar a função extensos passando o valor como parametro....

Abraços!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes