Como hemos visto en este artículo:

https://firebird21.wordpress.com/2013/07/08/poniendoles-filas-adicionales-a-las-consultas/

al resultado que obtenemos de los SELECT le podemos agregar filas adicionales, generalmente hacemos así para evitar realizar cálculos (sumas, multiplicaciones, obtención de porcentajes, etc.) en nuestro lenguaje de programación (Visual FoxPro, Visual Basic, C, C++, Delphi, etc.) porque devolvemos la consulta ya “cocinada”.

O sea que en nuestro lenguaje de programación mostramos la consulta así mismo como la recibimos, sin estar tocando algo en ella.

Eso es muy útil para asegurarnos que los resultados sean los correctos, sea quien sea el programador o el lenguaje utilizado, y que los resultados sean mostrados de manera uniforme. Eso demuestra profesionalismo.

Ahora, aquí hay otro ejemplo, es muy similar al anterior pero en este caso todas las columnas devueltas serán de tipo carácter ¿por qué? porque ninguna necesita ser de tipo numérico o de tipo fecha ya que ninguna operación se realizará sobre dichas columnas en el programa que escribamos en Visual FoxPro, Visual Basic, etc.

SET TERM ^ ;

CREATE PROCEDURE COMPRAS_AGRUPADAS2
   RETURNS(
      tcFechax VARCHAR(25),
      tcNroDoc VARCHAR(15),
      tcTotalx VARCHAR(15))
AS
   DECLARE VARIABLE lcCCF VARCHAR(10);
   DECLARE VARIABLE lcFechaTemporal VARCHAR(10);
   DECLARE VARIABLE lcNroDocTemporal VARCHAR(15);
   DECLARE VARIABLE lnTotalTemporal NUMERIC(16, 4);
   DECLARE VARIABLE lnTotalx NUMERIC(14, 4);
   DECLARE VARIABLE lnTotFec NUMERIC(14, 4);
   DECLARE VARIABLE lnTotMes NUMERIC(14, 4);
BEGIN

   lcCCF    = '01/01/1900'; -- Empezamos con una fecha que no existe en la tabla
   lnTotFec = 0;

   FOR SELECT
      CAST(CMC_FECHAX AS VARCHAR(10)),
      CMC_NRODOC,
      CMC_EXENTA + CMC_GRAV05 + CMC_IVA005 + CMC_GRAV10 + CMC_IVA010
   FROM
      COMPRASCAB
   ORDER BY
      CMC_FECHAX
   INTO
      :tcFechax,
      :tcNroDoc,
      :lnTotalx -- Variable local, no será devuelta
   DO BEGIN
      IF (lcCCF = '01/01/1900') THEN
         lcCCF = tcFechax;
      IF (tcFechax <> lcCCF) THEN BEGIN
         lcFechaTemporal  = tcFechax;
         lcNroDocTemporal = tcNroDoc;
         lnTotalTemporal  = lnTotalx;
         tcFechax = '';
         tcNroDoc = '';
         tcTotalx = '---------------';
         SUSPEND;
         tcFechax = 'Total del día: ' || lcCCF;
         tcNroDoc = '';
         tcTotalx = LPAD(CAST(FLOOR(lnTotFec) AS VarChar(15)), 15);
         SUSPEND;
         tcFechax = '';
         tcNroDoc = '';
         tcTotalx = '';
         SUSPEND;
         tcFechax = lcFechaTemporal;
         tcNroDoc = lcNroDocTemporal;
         tcTotalx = LPAD(CAST(FLOOR(lnTotalTemporal) AS VarChar(15)), 15);
         SUSPEND;
         lcCCF    = lcFechaTemporal;
         lnTotFec = lnTotalx;
      END ELSE BEGIN
         tcTotalx = LPAD(CAST(FLOOR(lnTotalx) AS VarChar(15)), 15);
         lnTotFec = lnTotFec + lnTotalx;
         SUSPEND;
      END
   END

END^

SET TERM ; ^

Y al escribir el siguiente SELECT:

SELECT
   tcFechax AS "Fecha de la Compra",
   tcNroDoc AS "Factura Nº",
   tcTotalx AS "Total Factura"
FROM
   COMPRAS_AGRUPADAS2

Esto será lo que obtendremos:

ADICIONALES3

(si haces clic en la imagen la verás más grande)

Como puedes ver es muy similar al resultado obtenido en el artículo anterior pero ahora con una estética mejorada.

En síntesis lo que hace este stored procedure es recorrer la tabla de compras, la cual está ordenada por fechas, y cada vez que se cambia la fecha (a eso se le llama “corte de control”) agregar las filas adicionales.

Desde luego que la tabla puede estar ordenada por cualquier criterio que nos interese, no necesariamente por fechas. E inclusive se pueden tener varios cortes de control (en este ejemplo se podría agregar uno por mes, entonces cada vez que finaliza un mes se muestra el total comprado en ese mes. Y uno por año, entonces cada vez que finaliza un año se muestra el total comprado en ese año.). Ya tienes la idea de como lograrlo.

Artículo relacionado:

El índice del blog Firebird21

Anuncios