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 :

  1. Calculez le total cumulé à partir de l'enregistrement actuel.
  2. 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 :

  1. 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é.
  2. 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é.
  3. 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 :

  1. Utilisez une commande GROUP pour traiter la table, enregistrement par enregistrement.
  2. Calculez le nombre de services (n) associé à chaque enregistrement.
  3. 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 :

  1. 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 :

    5981807618,30CCD
  2. 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 :

    5981807618,30RDR

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 :

  1. 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 :

    65856737955,46CCD
  2. 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 :

    65856737955,46LMO
  3. 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 :

    65856737955,46RDR

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
Guide de création de scripts ACL 14.1