Store procedure Función en Letras SAP HANA

de las funciones mas comunes que se tienen en los Sp son tener opciones fáciles en HanaStudio las cuales se puedan tener para una búsqueda formateada o para consumir para algun reporte dentro de cristal es la opcion de devolver un monto ya sea en millones o sea en miles o en centavos es algo estar convirtiendo cuando se puede crear un mandar a llamarlo lo unico que se necesita es monto y la moneda para que devuelva el monto pero a letras es una opcion sencilla lista para ejecutarse de manera que ustedes deseen.

tan simple como copy paste execute en tu Hana Studio

CREATE PROCEDURE  "SBO_FUNCION_MontoEnLetras" 

( 
IN Monto decimal, 
IN CodigoMoneda nvarchar(3), 
OUT MontoEnLetras nvarchar(254) 
)  

 
LANGUAGE SQLSCRIPT 
AS 
lnEntero integer; 
lcRetorno nvarchar(512); 
lnTerna integer; 
lcMiles nvarchar(512); 
lcCadena nvarchar(512); 
lnUnidades integer; 
lnDecenas integer; 
lnCentenas integer; 
lnFraccion integer; 
DescripcionMoneda nvarchar(20); 
DescripcionMonedaCentavos nvarchar(20); 


BEGIN  
MontoEnLetras:='';  
Select T0."ChkName", T0."Chk100Name" 
into DescripcionMoneda, DescripcionMonedaCentavos 
From "OCRN" T0 
Where T0."CurrCode"=:CodigoMoneda; 

 
lnEntero := CAST(:Monto AS integer); 
lnFraccion := (:Monto - :lnEntero) * 100; 
lcRetorno := ''; 
lnTerna := 1; 
WHILE (:lnEntero > 0) DO 

  

 -- Recorro terna por terna 
    lcCadena := ''; 
    lnUnidades := MOD(:lnEntero,10); 
    lnEntero := CAST((:lnEntero/10) AS integer); 
    lnDecenas := MOD(:lnEntero,10); 
    lnEntero := CAST((:lnEntero/10) AS integer); 
    lnCentenas := MOD(:lnEntero,10); 
    lnEntero := CAST((:lnEntero/10) AS integer); 

 

    -- Analizo las unidades 
    Select  
    (CASE  
      WHEN :lnUnidades = 1 AND :lnTerna = 1 AND :CodigoMoneda IS NULL THEN 'UN0 ' || :lcCadena 
      WHEN :lnUnidades = 1 AND :lnTerna = 1 AND :CodigoMoneda IS NOT NULL THEN 'UN ' || :lcCadena 
      WHEN :lnUnidades = 1 AND :lnTerna <> 1 THEN 'UN ' || :lcCadena 
      WHEN :lnUnidades = 2 THEN 'DOS ' || :lcCadena 
      WHEN :lnUnidades = 3 THEN 'TRES ' || :lcCadena 
      WHEN :lnUnidades = 4 THEN 'CUATRO ' || :lcCadena 
      WHEN :lnUnidades = 5 THEN 'CINCO ' || :lcCadena 
      WHEN :lnUnidades = 6 THEN 'SEIS ' || :lcCadena 
      WHEN :lnUnidades = 7 THEN 'SIETE ' || :lcCadena 
      WHEN :lnUnidades = 8 THEN 'OCHO ' || :lcCadena 
      WHEN :lnUnidades = 9 THEN 'NUEVE ' || :lcCadena 
      ELSE :lcCadena 
    END) 
    into lcCadena 
    From DUMMY; 

    
    -- Analizo las decenas 

    Select 
    (CASE 
      WHEN :lnDecenas = 1 THEN 
        CASE :lnUnidades 
          WHEN 0 THEN 'DIEZ ' 
          WHEN 1 THEN 'ONCE ' 
          WHEN 2 THEN 'DOCE ' 
          WHEN 3 THEN 'TRECE ' 
          WHEN 4 THEN 'CATORCE ' 
          WHEN 5 THEN 'QUINCE ' 
          ELSE 'DIECI' || :lcCadena 
        END 

      WHEN :lnDecenas = 2 AND :lnUnidades = 0 THEN 'VEINTE ' || :lcCadena 
      WHEN :lnDecenas = 2 AND :lnUnidades <> 0 THEN 'VEINTI' || :lcCadena 
      WHEN :lnDecenas = 3 AND :lnUnidades = 0 THEN 'TREINTA ' || :lcCadena 
      WHEN :lnDecenas = 3 AND :lnUnidades <> 0 THEN 'TREINTA Y ' || :lcCadena 
      WHEN :lnDecenas = 4 AND :lnUnidades = 0 THEN 'CUARENTA ' || :lcCadena 
      WHEN :lnDecenas = 4 AND :lnUnidades <> 0 THEN 'CUARENTA Y ' || :lcCadena 
      WHEN :lnDecenas = 5 AND :lnUnidades = 0 THEN 'CINCUENTA ' || :lcCadena 
      WHEN :lnDecenas = 5 AND :lnUnidades <> 0 THEN 'CINCUENTA Y ' || :lcCadena 
      WHEN :lnDecenas = 6 AND :lnUnidades = 0 THEN 'SESENTA ' || :lcCadena 
      WHEN :lnDecenas = 6 AND :lnUnidades <> 0 THEN 'SESENTA Y ' || :lcCadena 
      WHEN :lnDecenas = 7 AND :lnUnidades = 0 THEN 'SETENTA ' || :lcCadena 
      WHEN :lnDecenas = 7 AND :lnUnidades <> 0 THEN 'SETENTA Y ' || :lcCadena 
      WHEN :lnDecenas = 8 AND :lnUnidades = 0 THEN 'OCHENTA ' || :lcCadena 
      WHEN :lnDecenas = 8 AND :lnUnidades <> 0 THEN 'OCHENTA Y ' || :lcCadena 
      WHEN :lnDecenas = 9 AND :lnUnidades = 0 THEN 'NOVENTA ' || :lcCadena 
      WHEN :lnDecenas = 9 AND :lnUnidades <> 0 THEN 'NOVENTA Y ' || :lcCadena 
      ELSE :lcCadena 
    END) 
    into lcCadena 
    From DUMMY; 

    -- Analizo las centenas 

    Select 
    (CASE --CENTENAS  
      WHEN :lnCentenas = 1 AND :lnUnidades = 0 AND :lnDecenas = 0 THEN 'CIEN ' || :lcCadena 
      WHEN :lnCentenas = 1 AND NOT(:lnUnidades = 0 AND :lnDecenas = 0) THEN 'CIENTO ' || :lcCadena 
      WHEN :lnCentenas = 2 THEN 'DOSCIENTOS ' || :lcCadena 
      WHEN :lnCentenas = 3 THEN 'TRESCIENTOS ' || :lcCadena 
      WHEN :lnCentenas = 4 THEN 'CUATROCIENTOS ' || :lcCadena 
      WHEN :lnCentenas = 5 THEN 'QUINIENTOS ' || :lcCadena 
      WHEN :lnCentenas = 6 THEN 'SEISCIENTOS ' || :lcCadena 
      WHEN :lnCentenas = 7 THEN 'SETECIENTOS ' || :lcCadena 
      WHEN :lnCentenas = 8 THEN 'OCHOCIENTOS ' || :lcCadena 
      WHEN :lnCentenas = 9 THEN 'NOVECIENTOS ' || :lcCadena 
      ELSE :lcCadena 
    END) 
    into lcCadena  
    From DUMMY; 

 
    -- Analizo la terna 

    SELECT  
    (  
    CASE  
      WHEN :lnTerna = 1 THEN :lcCadena 
      WHEN :lnTerna = 2 AND (:lnUnidades + :lnDecenas + :lnCentenas <> 0) THEN :lcCadena || ' MIL ' 
      WHEN :lnTerna = 3 AND (:lnUnidades + :lnDecenas + :lnCentenas <> 0) AND  
        :lnUnidades = 1 AND :lnDecenas = 0 AND :lnCentenas = 0 THEN :lcCadena || ' MILLON ' 
      WHEN :lnTerna = 3 AND (:lnUnidades + :lnDecenas + :lnCentenas <> 0) AND 
        NOT (:lnUnidades = 1 AND :lnDecenas = 0 AND :lnCentenas = 0) THEN :lcCadena || ' MILLONES ' 
      WHEN :lnTerna = 4 AND (:lnUnidades + :lnDecenas + :lnCentenas <> 0) THEN :lcCadena || ' MIL MILLONES ' 
      ELSE '' 
    END) 
    into lcCadena  
    From DUMMY; 

 
    -- Armo el retorno terna a terna 
    lcRetorno := :lcCadena  || :lcRetorno; 
    lnTerna := :lnTerna + 1; 
END WHILE; 

If :lnTerna = 1  Then 
    lcRetorno := 'CERO'; 
End if; 
 IF :CodigoMoneda IS NULL  
 Then 
MontoEnLetras:=RTRIM(:lcRetorno) || ' CON ' || LTRIM(LEFT(CAST(:lnFraccion as nvarchar),2)) || '/100'; 
 Else   
MontoEnLetras:=RTRIM(:lcRetorno) || ' ' || :DescripcionMoneda || ' CON ' || LTRIM(LEFT(CAST(:lnFraccion as nvarchar),2)) || '/100 ' || :DescripcionMonedaCentavos; 
End if; 

  
Select :MontoEnLetras 
From DUMMY;  

END; 

 

 

 

 

 

 

 

 

 

 

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *