Procedure Firebird – Valor por Extenso
Nesse artigo, será descrito uma Procedure que recebe um valor numérico e retorna uma Sting com o nome por extenso.
CREATE OR 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
Code language: PHP (php)
COMO CHAMAR ?
A chamada da Procedure ocorre da seguinte forma:
SELECT * FROM NUMERO_POR_EXTENSO(158);

Fonte: