En este artículo ya habíamos visto que actualmente (versión 2.5.2) el Firebird no dispone de funciones nativamente pero que fácilmente podemos simular que sí las tiene.

https://firebird21.wordpress.com/2014/04/20/usando-un-stored-procedure-como-una-funcion/

Ahora, veremos un ejemplo práctico de como usar una función.

Ejemplo. Obteniendo la parte gravada y el impuesto

El Gobierno cobra un impuesto por cada venta que se realiza en el país. El valor monetario de ese impuesto se calcula como un porcentaje sobre lo que se le cobra al cliente. Por lo tanto:

PrecioVenta = ImporteGravado + Impuesto     (1)

Como el Impuesto es siempre un porcentaje sobre el ImporteGravado entonces la fórmula es:

Impuesto = ImporteGravado * PorcentajeImpuesto / 100     (2)

Y reemplazando la fórmula del Impuesto en (1) obtenemos:

PrecioVenta = ImporteGravado + ImporteGravado * PorcentajeImpuesto / 100     (3)

Que también podemos escribir como:

PrecioVenta = ImporteGravado * (1 + PorcentajeImpuesto / 100)     (4)

En una tabla llamada FACTURAS tenemos guardado el PrecioVenta y también el PorcentajeImpuesto y lo que queremos hallar es:

  1. El ImporteGravado
  2. El Impuesto

 Para ello, escribimos el siguiente stored procedure seleccionable:

CREATE PROCEDURE DISCRIMINAR_VENTA(
   tnPrecioVenta NUMERIC(12, 2),
   tnPorcentaje  NUMERIC(5, 2))
RETURNS(
   ftnGravado  NUMERIC(12, 2),
   ftnImpuesto NUMERIC(12, 2))
AS
BEGIN

   -- tnPrecioVenta = ftnGravado * (1 + tnPorcentaje / 100)

   ftnGravado = tnPrecioVenta / (1 + tnPorcentaje / 100);

   ftnImpuesto = ftnGravado * tnPorcentaje / 100;

   SUSPEND;

END;

Al cual podemos llamar de esta forma:

SELECT
   F.FAC_MONTOX,
   D.ftnGravado,
   D.ftnImpuesto,
   D.ftnGravado + D.ftnImpuesto
FROM
   FACTURAS F
LEFT JOIN
   DISCRIMINAR_VENTA(F.FAC_MONTOX, F.FAC_PORIVA) D
      ON 1 = 1

Desde luego que F.FAC_MONTOX y D.ftnGravado + D.ftnImpuesto deben ser idénticos, se escribió a ambos solamente para comprobar lo evidente.

En este caso tenemos una tabla llamada FACTURAS, dentro de la cual tenemos una columna llamada FAC_MONTOX donde guardamos el precio de venta y una columna llamada FAC_PORIVA donde guardamos el porcentaje del impuesto.

Al llamar a la función DISCRIMINAR_VENTA obtenemos la parte gravada y el impuesto que corresponden a cada venta realizada.

Artículos relacionados:

Usando un stored procedure como una función

El índice del blog Firebird21

 

Anuncios