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.
Un ejemplo sencillo de 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:
- Calcula el total acumulado del registro actual.
- 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 |
Manejo de diferentes casos con GROUP IF
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:
- 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.
- 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.
- 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.
LOOP dentro de un comando GROUP
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:
- Utiliza un comando GROUP para procesar la tabla registro por registro.
- Calcula la cantidad de departamentos (n) asociados con cada registro.
- 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:
- 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:
5981807 618,30 CCD - 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:
5981807 618,30 RDR
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:
- 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:
6585673 7955,46 CCD - 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:
6585673 7955,46 LMO - 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:
6585673 795546 RDR
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 |