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 :

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

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

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 :

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

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

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

    5981807618,30RDR

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 :

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

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

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

    65856737955,46RDR

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