Regroupement et exécution de boucles
Les commandes GROUP et LOOP fournissent deux façons d'exécuter une série de commandes plusieurs fois. GROUP effectue une seule itération d'une ou plusieurs commandes sur chaque enregistrement. LOOP accomplit plusieurs itérations d'une série de commandes sur chaque enregistrement, et peut seulement être utilisée à l'intérieur d'un bloc GROUP.
Exemple simple de Groupe
Voici une table de données de facture appelée Trans_Cf. À l'aide de ces données, vous devez calculer un total cumulé de montants facturés :
| Numéro_fournisseur | Nom_Fournisseur | Numéro_Facture | Date | Montant |
|---|---|---|---|---|
| 11663 | More Power Industries | 5981807 | 2000-11-17 | 618,30 |
| 13808 | NOVATECH Wholesale | 2275301 | 2000-11-17 | 6705,12 |
| 12433 | Koro International | 6585673 | 2000-11-17 | 7955,46 |
Pour calculer ce montant, il vous faut utiliser la commande GROUPE. À l'intérieur de chaque itération de GROUPE, vous :
- Calculez le total cumulé à partir de l'enregistrement actuel.
- Importez le numéro de la facture, le montant, la date et le total cumulé dans une table de résultats.
OPEN Ap_Trans
COMMENT set the initial value of running total to zero END
ASSIGN v_running_total = 0.00
COMMENT iterate over each record in the table and then calculate and extract the running total END
GROUP
ASSIGN v_running_total = v_running_total + Amount
EXTRACT Invoice_Number, Amount, Date, v_running_total AS "Running total" TO results1
END
Lorsque le script est exécuté, les commandes dans le bloc Groupe sont traitées sur chaque enregistrement de la table, du haut vers le bas, et le total cumulé est calculé et extrait. Si l'on pouvait décrire Groupe pendant son exécution, la procédure ressemblerait à ceci :
Première itération de Groupe : total cumulé = 0,00 + 618,30
GROUPE ajoute le montant de la facture du premier enregistrement au total cumulé initial de 0,00 et extrait les champs dans la table de résultats :
| Numéro_fournisseur | Nom_Fournisseur | Numéro_Facture | Date | Montant |
|---|---|---|---|---|
| 11663 | More Power Industries | 5981807 | 2000-11-17 | 618,30 |
| 13808 | NOVATECH Wholesale | 2275301 | 2000-11-17 | 6705,12 |
| 12433 | Koro International | 6585673 | 2000-11-17 | 7955,46 |
Deuxième itération de GROUPE : total cumulé = 618,30 + 6705,12
Le bloc Groupe ajoute le montant de la facture du deuxième enregistrement au nouveau total cumulé de 618,30 et extrait les champs dans la table de résultats :
| Numéro_fournisseur | Nom_Fournisseur | Numéro_Facture | Date | Montant |
|---|---|---|---|---|
| 11663 | More Power Industries | 5981807 | 2000-11-17 | 618,30 |
| 13808 | NOVATECH Wholesale | 2275301 | 2000-11-17 | 6705,12 |
| 12433 | Koro International | 6585673 | 2000-11-17 | 7955,46 |
Troisième itération de GROUPE : total cumulé = 7323,42 + 7955,46
Le bloc Groupe ajoute le montant de la facture du troisième enregistrement au nouveau total cumulé de 7323,42 et extrait les champs dans la table de résultats :
| Numéro_fournisseur | Nom_Fournisseur | Numéro_Facture | Date | Montant |
|---|---|---|---|---|
| 11663 | More Power Industries | 5981807 | 2000-11-17 | 618,30 |
| 13808 | NOVATECH Wholesale | 2275301 | 2000-11-17 | 6705,12 |
| 12433 | Koro International | 6585673 | 2000-11-17 | 7955,46 |
Table des résultats finales
Une fois que GROUP a traité le dernier enregistrement de la table, vous obtenez la table de résultats suivante :
| Numéro_Facture | Montant | Date | Total |
|---|---|---|---|
| 5981807 | 618,30 | 2000-11-17 | 618,30 |
| 2275301 | 6705,12 | 2000-11-17 | 7323,42 |
| 6585673 | 7955,46 | 2000-11-17 | 15278,88 |
Gérer différents incidents à l'aide de GROUP IF
À l’aide de la même table Ap_Trans que précédemment, vous avez maintenant besoin de calculer les totaux cumulés pour trois types de facture :
- Valeur élevée (supérieure ou égale à 1000,00)
- Valeur moyenne (entre 100,00 et 1000,00)
- Valeur faible (moins de 100,00)
La commande Groupe fournit une structure IF/ELSE pour gérer différents cas. Vous fournissez des expressions conditionnelles à tester, et si un enregistrement est évalué à vrai, la commande à l'intérieur du bloc s'exécute.
Comment les incidents sont testés
Les incidents sont testés de haut en bas et un enregistrement ne peut être traité que par un bloc IF/ELSE. Le premier incident à être évalué comme vrai pour l'enregistrement est celui qui traite l'enregistrement :
- Quand la commande GROUP traite le premier enregistrement, elle le teste avec la première condition IF (Amount >= 1000). Si este test es evaluado como verdadero, el código para este caso es elegido y ningún otro caso es probado.
- Si le premier cas est évalué sur faux, la condition ELSE IF suivante est testée (Amount >= 100). De même, si ce test est évalué à vrai, le code pour ce cas est choisi et aucun autre cas n'est testé.
- Enfin, si aucun des cas IF ou ELSE IF n'est évalué sur vrai, le cas par défaut dans le bloc ELSE traite l'enregistrement.
Note
Si un enregistrement est évalué à vrai pour plusieurs cas, l'enregistrement est uniquement traité par le premier bloc IF/ELSE qui l'a testé. Les enregistrements ne sont jamais traités par plusieurs blocs IF/ELSE dans une commande GROUPE.
OPEN Ap_Trans
COMMENT set initial values for running totals END
ASSIGN v_running_total_hi = 0.00
ASSIGN v_running_total_med = 0.00
ASSIGN v_running_total_low = 0.00
COMMENT use GROUP IF to run different ASSIGN and EXTRACT commands depending on invoice amount END
GROUP IF Amount >= 1000
ASSIGN v_running_total_hi = v_running_total_hi + Amount
EXTRACT Invoice_Number, Amount, Date, v_running_total_hi AS "Running total" TO results_hi
ELSE IF Amount >= 100
ASSIGN v_running_total_med = v_running_total_med + Amount
EXTRACT Invoice_Number, Amount, Date, v_running_total_med AS "Running total" TO results_med
ELSE
ASSIGN v_running_total_low = v_running_total_low + Amount
EXTRACT Invoice_Number, Amount, Date, v_running_total_low AS "Running total" TO results_low
END
Lorsque le script est exécuté, la commande GROUP teste le montant de la facture pour chaque enregistrement. En fonction du montant, l'enregistrement est utilisé pour mettre à jour l'un des trois totaux cumulés (faible, moyen, élevé) et trois tables de résultats sont produites.
LOOP à l'intérieur d'un Groupe
Lorsque vous utilisez Groupe pour traiter les enregistrements d'une table, vous pouvez utiliser une commande LOOP pour exécuter une série de commandes sur un même enregistrement plusieurs fois. LOOP est une deuxième itération se produisant à l'intérieur d'une itération de Groupe ; la commande s'exécute jusqu'à ce qu'une condition de test que vous avez spécifiée soit évaluée comme fausse.
Utiliser LOOP pour fractionner un champ
La table suivante contient des données de facture et vous avez besoin d'isoler certaines informations pour des montants de facture par service. Une facture peut être reliée à plusieurs services et les codes des services sont enregistrés dans un format séparé par une virgule dans la table :
| Numéro_fournisseur | Numéro_Facture | Date | Montant | Dept_Code |
|---|---|---|---|---|
| 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 |
Pour extraire les montants de facture par service, vous :
- Utilisez une commande GROUP pour traiter la table, enregistrement par enregistrement.
- Calculez le nombre de services (n) associé à chaque enregistrement.
- Utilisez la commande LOOP pour effectuer une itération sur l'enregistrement x fois afin d'extraire les données pour chaque service associé à l'enregistrement.
Note
Vous devez augmenter la variable v_counter à l'intérieur de LOOP. Sinon, le test WHILE est toujours évalué sur vrai et le script entre dans une boucle infinie. Il est possible d'inclure une commande SET LOOP dans vos scripts pour vous prémunir contre les boucles infinies. Pour plus d’informations, consultez la rubrique Commande SET LOOP.
COMMENT
Use GROUP to count commas in each department code field as a way of identifying how many departments are associated with the record
"LOOP" over each record for each code in the field, with each iteration of the loop extracting the record with a single code to the result1 table
END
GROUP
v_department_count = OCCURS(Dept_Code,',')
v_counter = 0
LOOP WHILE v_counter <= v_department_count
v_dept = SPLIT(Dept_Code, ',', (v_counter + 1))
EXTRACT FIELDS Invoice_Number, Amount, v_dept AS "Department" TO result1
v_counter = v_counter + 1
END
END
Lorsque le script est exécuté, les commandes dans le bloc GROUPE sont traitées sur chaque enregistrement de la table, de haut en bas. Pour chaque enregistrement, la commande LOOP effectue une itération sur l'enregistrement une fois par code de service dans la liste délimités par une virgule, puis extrait un enregistrement. Si l'on pouvait décrire GROUP et LOOP pendant leur exécution, la procédure ressemblerait à ceci :
Première itération de GROUP : 2 itérations de LOOP
| Numéro_fournisseur | Numéro_Facture | Date | Montant | Dept_Code |
|---|---|---|---|---|
| 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 |
Pour le premier enregistrement dans la table, la valeur v_department_count est 1 donc LOOP effectue deux itérations :
- Pour la première itération de LOOP :
- v_compteur = 0
- v_depart = CCD
L'enregistrement suivant est extrait et la valeur v_counter est augmentée de 1, c'est pourquoi LOOP effectue une nouvelle itération :
5981807 618,30 CCD - Pour la deuxième itération de LOOP :
- v_compteur = 1
- v_depart = RDR
L'enregistrement suivant est extrait et la valeur v_counter est augmentée de 2, c'est pourquoi LOOP n'effectue plus d'itération et que GROUP passe à l'enregistrement suivant :
5981807 618,30 RDR
Deuxième itération de GROUP : 1 itération de LOOP
| Numéro_fournisseur | Numéro_Facture | Date | Montant | Dept_Code |
|---|---|---|---|---|
| 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 |
Pour le deuxième enregistrement dans la table, la valeur de v_department_count est 0, donc LOOP effectue une seule itération :
- v_compteur = 0
- v_depart = CCD
L'enregistrement suivant est extrait et la valeur v_counter est augmentée de 1, c'est pourquoi LOOP n'effectue plus d'itération et que GROUP passe à l'enregistrement suivant :
| 2275301 | 6705,12 | CCD |
Troisième itération de GROUP : 3 itérations de LOOP
| Numéro_fournisseur | Numéro_Facture | Date | Montant | Dept_Code |
|---|---|---|---|---|
| 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 |
Pour le troisième enregistrement dans la table, la valeur v_department_count est 2 donc LOOP effectue trois itérations :
- Pour la première itération de LOOP :
- v_compteur = 0
- v_depart = CCD
L'enregistrement suivant est extrait et la valeur v_counter est augmentée de 1, c'est pourquoi LOOP effectue une nouvelle itération :
6585673 7955,46 CCD - Pour la deuxième itération de LOOP :
- v_compteur = 1
- v_depart = LMO
L’enregistrement suivant est extrait et la valeur v_compteur est augmentée de 2, c’est pourquoi LOOP effectue une nouvelle itération :
6585673 7955,46 LMO - Pour la troisième itération de LOOP :
- v_compteur = 2
- v_depart = RDR
L'enregistrement suivant est extrait et la valeur v_counter est augmentée de 3, c'est pourquoi LOOP n'effectue plus d'itération et que GROUP atteint la fin de la table :
6585673 7955,46 RDR
Table des résultats finales
Une fois que Groupe a traité chaque enregistrement de la table, et que LOOP a itéré à travers tous les codes de service, vous obtenez la table de résultats suivante :
| Numéro_Facture | Montant | Département |
|---|---|---|
| 5981807 | 618,30 | CCD |
| 5981807 | 618,30 | RDR |
| 2275301 | 6705,12 | CCD |
| 6585673 | 7955,46 | CCD |
| 6585673 | 7955,46 | LMO |
| 6585673 | 7955,46 | RDR |