Regroupement et exécution de boucles
Les commandes GROUP et LOOP fournissent deux façons d'exécuter des séries 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 GROUP
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 | Ville_fournisseur | Numéro_Facture | Date_Facture | Montant_Facture | Quantité | Coût_unitaire |
---|---|---|---|---|---|---|---|
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 |
Pour calculer ce montant, il vous faut utiliser la commande GROUP. À l'intérieur de chaque itération de GROUP, 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 Trans_Cf COMMENT définit la valeur initiale du total cumulé sur zéro ASSIGN v_running_total = 0,00 COMMENT itère sur chaque enregistrement de la table, puis calcule et extrait le total cumulé GROUP ASSIGN v_running_total = v_running_total + Montant_Facture EXTRACT No_Facture, Montant_Facture, Date_Facture, v_running_total AS "Cumul" TO résultats1 END
Lorsque le script est exécuté, les commandes dans le bloc GROUP 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 GROUP pendant son exécution, la procédure ressemblerait à ceci :
Première itération de GROUP : total cumulé = 0,00 + 618,0
GROUP 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 | Ville_fournisseur | Numéro_Facture | Date_Facture | Montant_Facture | Quantité | Coût_unitaire |
---|---|---|---|---|---|---|---|
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 |
Deuxième itération de GROUP : total cumulé = 618,30 + 6705,12
Le bloc GROUP 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 | Ville_fournisseur | Numéro_Facture | Date_Facture | Montant_Facture | Quantité | Coût_unitaire |
---|---|---|---|---|---|---|---|
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 |
Troisième itération de GROUP : total cumulé = 7323,42 + 7955,46
Le bloc GROUP 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 | Ville_fournisseur | Numéro_Facture | Date_Facture | Montant_Facture | Quantité | Coût_unitaire |
---|---|---|---|---|---|---|---|
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 |
Table de résultats finale
Une fois que GROUP a traité le dernier enregistrement de la table, vous obtenez la table de résultats suivante :
Numéro_Facture | Montant_Facture | Date_Facture | 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 cas à l'aide de GROUP IF
À l'aide de la même table Trans_Cf, 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 GROUP fournit une structure IF/ELSE pour gérer différents cas. Vous fournissez des expressions conditionnelles à tester, et si un enregistrement est évalué sur vrai, la commande à l'intérieur du bloc s'exécute.
Comment les cas sont testés
Les cas sont testés de haut en bas et un enregistrement ne peut être traité que par un bloc IF/ELSE. Le premier cas à être évalué sur 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 (Montant_Facture >= 1000). Si ce test est évalué sur vrai, le code pour ce cas est choisi et aucun autre cas n'est testé.
- Si le premier cas est évalué sur faux, la condition ELSE IF suivante est testée (Montant_Facture >= 100). De même, si ce test est évalué sur 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.
Remarque
Si un enregistrement est évalué sur 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 GROUP.
OPEN Trans_Cf COMMENT définit les valeurs initiales des totaux cumulés ASSIGN v_running_total_hi = 0,00 ASSIGN v_running_total_med = 0,00 ASSIGN v_running_total_low = 0,00 COMMENT utilise GROUP IF pour exécuter différentes commandes ASSIGN et EXTRACT en fonction du montant de la facture GROUP IF Montant_Facture >= 1000 ASSIGN v_running_total_hi = v_running_total_hi + Montant_Facture EXTRACT No_Facture, Montant_Facture, Date_facture, v_running_total_hi AS "Total cumulé" TO results_hi ELSE IF Montant_Facture >= 100 ASSIGN v_running_total_med = v_running_total_med + Montant_Facture EXTRACT No_Facture, Montant_Facture, Date_facture, v_running_total_med AS "Total cumulé" TO results_med ELSE ASSIGN v_running_total_low = v_running_total_low + Montant_Facture EXTRACT No_Facture, Montant_Facture, Date_facture, v_running_total_low AS "Total cumulé" TO results_low END
Lorsque le script est exécuté, la commande GROUP teste le montant de facture pour chaque enregistrement. En fonction du montant, l'enregistrement est utilisé pour mettre à jour l'un des trois totaux cumulé (faible, moyen, élevé) et trois tables de résultats sont produites.
LOOP à l'intérieur d'un GROUP
Lorsque vous utilisez GROUP 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 GROUP ; 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_Facture | Montant_Facture | Code_Département |
---|---|---|---|---|
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 effctuer une itération sur l'enregistrement x fois afin d'extraire les données pour chaque service associé à l'enregistrement.
Remarque
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 section Commande SET.
COMMENT utilisez GROUP pour compter les virgules dans chaque champ de code de service afin d'identifier le nombre de services associés à l'enregistrement exécutez "LOOP" sur chaque enregistrement pour chaque code dans le champ, en extrayant chaque code dans son propre enregistrement ENDGROUP v_department_count = OCCURS(Code_Département;',') v_counter = 0 LOOP WHILE v_counter <= v_department_count v_dept = SPLIT(Code_Département; ',', (v_counter + 1)) EXTRACT FIELDS No_Facture, Montant_Facture, v_dept AS "Service" TO result1 v_counter = v_counter + 1 END END
Lorsque le script est exécuté, les commandes dans le bloc GROUP 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ées 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_Facture | Montant_Facture | Code_Département |
---|---|---|---|---|
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_counter = 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_counter = 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_Facture | Montant_Facture | Code_Département |
---|---|---|---|---|
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 v_department_count est 0 donc LOOP effectue une seule itération :
- v_counter = 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_Facture | Montant_Facture | Code_Département |
---|---|---|---|---|
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_counter = 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_counter = 1
- v_depart = LMO
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 LMO - Pour la troisième itération de LOOP :
- v_counter = 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 de résultats finale
Une fois que GROUP a traité chaque enregistrement de la table, et que LOOP a itéré tous les codes de service, vous obtenez la table de résultats suivante :
Numéro_Facture | Montant_Facture | 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 |