Los comandos GROUP y LOOP ofrecen dos maneras de ejecutar una serie de comandos de manera reiterada. GROUP realiza una sola repetición de uno o más comandos con cada registro. LOOP realiza varias repeticiones de una serie de comandos con un solo registro y solo se puede usar dentro de un bloque GROUP.

Usted tiene una tabla de datos de facturas denominada Trans_Cp. Con esta información, necesita calcular un total acumulado de importes de facturas:

Número_proveedor Nombre_proveedor Ciudad_proveedor Número_factura Fecha_factura Importe_factura Cantidad Costo_unitario
11663 More Power Industries Los Angeles 5981807 2000-11-17 618,30 90 6,87
13808 NOVATECH Wholesale Des Moines 2275301 2000-11-17 6705,12 976 6,87
12433 Koro International Sheveport 6585673 2000-11-17 7955,46 1158 6,87

Para calcular este importe, utiliza el comando GROUP. Dentro de cada repetición de GROUP, usted:

  1. Calcula el total acumulado del registro actual.
  2. Extrae el número, el importe, la fecha y el total acumulado de las facturas a la tabla de resultados.
OPEN Trans_Cp
			
COMMENT ajuste el valor inicial del total acumulado en cero
ASSIGN v_total_acumulado = 0,00

COMMENT repita en cada registro de la tabla y después calcule y extraiga el total acumulado
GROUP
  ASSIGN v_total_acumulado = v_total_acumulado + Importe_factura
  EXTRACT Número_factura; Importe_factura; Fecha_factura; v_total_acumulado AS "Total acumulado" TO resultados1
END

Cuando se ejecuta el script, los comandos dentro del bloque GROUP se procesan en cada registro de la tabla, de arriba hacia abajo, y se calcula y extrae el total acumulado. Si pudiéramos observar el comando GROUP a medida que se ejecuta, se vería de este modo:

La primera iteración de GROUP: total acumulado = 0,00 + 618,30

El comando GROUP agrega el importe de la factura del primer registro al total acumulado inicial de 0,00 y extrae los campos a la tabla de resultados:

Número_proveedor Nombre_proveedor Ciudad_proveedor Número_factura Fecha_factura Importe_factura Cantidad Costo_unitario
11663 More Power Industries Los Angeles 5981807 2000-11-17 618,30 90 6,87
13808 NOVATECH Wholesale Des Moines 2275301 2000-11-17 6705,12 976 6,87
12433 Koro International Sheveport 6585673 2000-11-17 7955,46 1158 6,87

La segunda iteración de GROUP: total acumulado = 618,30 + 6705,12

El comando GROUP agrega el importe de la factura del segundo registro al nuevo total acumulado de 618,30 y extrae los campos a la tabla de resultados:

Número_proveedor Nombre_proveedor Ciudad_proveedor Número_factura Fecha_factura Importe_factura Cantidad Costo_unitario
11663 More Power Industries Los Angeles 5981807 2000-11-17 618,30 90 6,87
13808 NOVATECH Wholesale Des Moines 2275301 2000-11-17 6705,12 976 6,87
12433 Koro International Sheveport 6585673 2000-11-17 7955,46 1158 6,87

Tercera iteración de GROUP: total acumulado = 7323,42 + 7955,46

El comando GROUP agrega el importe de la factura del tercer registro al nuevo total acumulado de 7323,42 y extrae los campos a la tabla de resultados:

Número_proveedor Nombre_proveedor Ciudad_proveedor Número_factura Fecha_factura Importe_factura Cantidad Costo_unitario
11663 More Power Industries Los Angeles 5981807 2000-11-17 618,30 90 6,87
13808 NOVATECH Wholesale Des Moines 2275301 2000-11-17 6705,12 976 6,87
12433 Koro International Sheveport 6585673 2000-11-17 7955,46 1158 6,87

Tabla de resultados final

Una vez que el comando GROUP haya procesado el registro final de la tabla, usted tendrá la siguiente tabla de resultados:

Número_factura Importe_factura Fecha_factura Total_acumulado
5981807 618,30 2000-11-17 618,30
2275301 6705,12 2000-11-17 7323,42
6585673 7955,46 2000-11-17 15278,88

Con la misma tabla Trans_Cp que antes, usted necesita calcular los totales acumulados de tres tipos de facturas:

  • Valor elevado (mayor que o igual a 1000,00)
  • Valor medio (entre 100,00 y 1000,00)
  • Valor bajo (menos que 100,00)

El comando GROUP proporciona una estructura IF/ELSE para manejar los diferentes casos. Usted proporciona las expresiones condicionales para la prueba y, si un registro se evalúa como verdadero, se ejecutan los comandos dentro del bloque.

Cómo se prueban los casos

Los casos se prueban de arriba hacia abajo y un registro solo puede ser procesado por un bloque IF/ELSE. El primer caso que se evalúa como verdadero para el registro es el que lo procesa:

  1. Cuando GROUP procesa el primer registro, vuelve a probarlo con la primera condición IF (Importe_factura >= 1000). Si esta condición se evalúa como verdadera, se ejecuta el código de este caso y no se prueba ningún otro.
  2. Si el primer caso se evalúa como falso, se prueba la siguiente condición ELSE IF (Importe_factura >= 100). Del mismo modo, si esta condición se evalúa como verdadera, se ejecuta el código de este caso y no se prueba ningún otro.
  3. Por último, si ninguno de los caos IF o ELSE IF se evalúa como verdadero, el registro se procesa con el caso predeterminado del bloque ELSE.

Nota

Si un registro se evalúa como verdadero para más de un caso, el registro solo es procesado por el primer bloque IF/ELSE que lo prueba. Los registros nunca son procesados por más de un bloque IF/ELSE en un comando GROUP.

OPEN Trans_Cp

COMMENT ajuste los valores iniciales para los totales acumulados
ASSIGN v_total_acumulado_alto = 0,00
ASSIGN v_total_acumulado_medio = 0,00
ASSIGN v_total_acumulado_bajo = 0,00

COMMENT use GROUP IF para ejecutar diferentes comandos ASSIGN y EXTRACT según el importe de la factura
GROUP IF Importe_factura >= 1000
  ASSIGN v_total_acumulado_alto = v_total_acumulado_alto + Importe_factura
  EXTRACT Número_factura; Importe_factura; Fecha_factura; v_total_acumulado_alto AS "Total acumulado" TO resultados_alto
ELSE IF Importe_factura >= 100
  ASSIGN v_total_acumulado_medio = v_total_acumulado_medio + Importe_factura
  EXTRACT Número_factura; Importe_factura; Fecha_factura; v_total_acumulado_medio AS "Total acumulado" TO resultados_medio
ELSE
  ASSIGN v_total_acumulado_bajo = v_total_acumulado_bajo + Importe_factura
  EXTRACT Número_factura; Importe_factura; Fecha_factura; v_total_acumulado_bajo AS "Total acumulado" TO resultados_bajo
END

Al ejecutar el script, el comando GROUP prueba el importe de la factura de cada registro. Según el importe, el registro se utiliza para actualizar uno de los tres totales acumulados (bajo, medio o alto) y se generan tres tablas de resultados.

Al usar GROUP para procesar los registros de una tabla, puede usar un comando LOOP para ejecutar una serie de comandos varias veces en un único registro. LOOP es una segunda repetición que ocurre dentro de la repetición de GROUP y se ejecuta hasta que una condición de prueba que usted especifica se evalúa como falsa.

Uso de LOOP para dividir un campo

Usted tiene la siguiente tabla que contiene datos de facturas y necesita aislar información específica para los importes de facturas por departamento. Una factura puede estar relacionada con más de un departamento, y los códigos de los departamentos se almacenan en un formato delimitado por comas en la tabla:

Número_proveedor Número_factura Fecha_factura Importe_factura Código_departamento
11663 5981807 2000-11-17 618,30 CCD,RDR
13808 2275301 2000-11-17 6705,12 CCD
12433 6585673 2000-11-17 7955,46 CCD,LMO,RDR

Para extraer los importes de las facturas por departamento, usted:

  1. Utiliza un comando GROUP para procesar la tabla registro por registro.
  2. Calcula la cantidad de departamentos (n) asociados con cada registro.
  3. Utilice el comando LOOP para repetir n veces en el registro a fin de extraer los datos de cada departamento asociado con el registro.

Nota

Debe incrementar la variable v_recuento dentro de LOOP. Si no lo hace, la prueba WHILE siempre se evalúa como verdadera y el script entra en un bucle infinito. Puede incluir el comando SET LOOP en sus scripts para evitar estos bucles infinitos. Si desea obtener más información, consulte Comando SET.

 

COMMENT
use GROUP para contar las comas de cada campo de código de departamento como una manera de identificar la cantidad de departamentos asociados con el registro
Use "LOOP" en cada registro para recuperar cada código del campo y extraer cada código a su propio registro
END
GROUP
  v_recuento_departamentos = OCCURS(Código_departamento;',')
  v_recuento = 0
  LOOP WHILE v_recuento <= v_recuento_departamentos
    v_dept = SPLIT(Código_departamento; ','; (v_recuento + 1))
    EXTRACT FIELDS Número_factura; Importe_factura; v_dept AS "Departamento" TO result1
    v_recuento = v_recuento + 1		
  END
END

Cuando se ejecuta el script, los comandos dentro del bloque GROUP se procesan en cada registro de la tabla, de arriba hacia abajo. Para cada registro, el comando LOOP se repite en el registro una vez por código de departamento en la lista delimitada por comas y, a continuación, extrae un registro. Si pudiéramos observar los comandos GROUP y LOOP a medida que se ejecutan, se verían de este modo:

Primera reiteración de GROUP: 2 repeticiones de LOOP

Número_proveedor Número_factura Fecha_factura Importe_factura Código_departamento
11663 5981807 2000-11-17 618,30 CCD,RDR
13808 2275301 2000-11-17 6705,12 CCD
12433 6585673 2000-11-17 7955,46 CCD,LMO,RDR

Para el primer registro de la tabla, el valor de v_recuento_departamentos es 1; por lo tanto, LOOP se repite dos veces:

  1. Para la primera repetición del LOOP:
    • v_recuento = 0
    • v_dept = CCD

    Se extrae el siguiente registro y el valor de v_recuento se incrementa a 1; por lo tanto, se vuelve a repetir LOOP:

    5981807618,30CCD
  2. Para la segunda repetición de LOOP:
    • v_recuento = 1
    • v_dept = RDR

    Se extrae el siguiente registro y el valor de v_recuento se incrementa a 2; por lo tanto, no se vuelve a repetir LOOP y el comando GROUP pasa al siguiente registro:

    5981807618,30RDR

Segunda reiteración de GROUP: 1 repetición de LOOP

Número_proveedor Número_factura Fecha_factura Importe_factura Código_departamento
11663 5981807 2000-11-17 618,30 CCD,RDR
13808 2275301 2000-11-17 6705,12 CCD
12433 6585673 2000-11-17 7955,46 CCD,LMO,RDR

Para el segundo registro de la tabla, el valor de v_recuento_departamentos es 0; por lo tanto, LOOP se repite una vez:

  • v_recuento = 0
  • v_dept = CCD

Se extrae el siguiente registro y el valor de v_recuento se incrementa a 1; por lo tanto, no se vuelve a repetir LOOP y el comando GROUP pasa al siguiente registro:

2275301 6705,12 CCD

Primera reiteración de GROUP: 3 repeticiones de LOOP

Número_proveedor Número_factura Fecha_factura Importe_factura Código_departamento
11663 5981807 2000-11-17 618,30 CCD,RDR
13808 2275301 2000-11-17 6705,12 CCD
12433 6585673 2000-11-17 7955,46 CCD,LMO,RDR

Para el tercer registro de la tabla, el valor de v_recuento_departamentos es 2; por lo tanto, LOOP se repite tres veces:

  1. Para la primera repetición de LOOP:
    • v_recuento = 0
    • v_dept = CCD

    Se extrae el siguiente registro y el valor de v_recuento se incrementa a 1; por lo tanto, se vuelve a repetir LOOP:

    65856737955,46CCD
  2. Para la segunda repetición de LOOP:
    • v_recuento = 1
    • v_dept = LMO

    Se extrae el siguiente registro y el valor de v_recuento se incrementa a 2; por lo tanto, se vuelve a repetir LOOP:

    65856737955,46LMO
  3. Para la tercera repetición de LOOP:
    • v_recuento = 2
    • v_dept = RDR

    Se extrae el siguiente registro y el valor de v_recuento se incrementa a 3; por lo tanto, no se vuelve a repetir LOOP y el comando GROUP llega al final de la tabla:

    6585673795546RDR

Tabla de resultados final

Una vez que el comando GROUP procesó cada registro de la tabla y que el comando LOOP se haya repetido para todos los códigos de departamentos, usted tendrá la siguiente tabla de resultados:

Número_factura Importe_factura Departamento
5981807 618,30 CCD
5981807 618,30 RDR
2275301 6705,12 CCD
6585673 7955,46 CCD
6585673 7955,46 LMO
6585673 7955,46 RDR