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
Função que retorna valor por extenso
-
- 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:
E ...
chamar a função extensos passando o valor como parametro....
Abraços!
são duas funções:
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;
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;
Abraços!
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes