GROUP および LOOP コマンドは、一連のコマンドを繰り返し実行するための 2 つの方法を提供します。 GROUP は各レコードに対して 1 つ以上のコマンドを 1 回繰り返します。 LOOP は単一レコードに対して一連のコマンドを複数回繰り返して実行し、GROUP ブロック内でのみ使用できます。
GROUP の簡単な例
請求書データのテーブル Ap_Trans があります。 このデータを使用して、請求金額の合計を計算する必要があります。
Vendor_Number | Vendor_Name | Vendor_City | Invoice_Number | Invoice_Date | Invoice_Amount | Quantity | Unit_Cost |
---|---|---|---|---|---|---|---|
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 |
この金額を計算するには、GROUP コマンドを使用します。 GROUP の各繰り返し内で次のことを実行します。
- 現在のレコードの時点で合計を計算します。
- 請求書番号、金額、日付、合計を結果テーブルに抽出します。
OPEN AP_Trans COMMENT 累計の初期値をゼロに設定 ASSIGN v_running_total = 0.00 COMMENT テーブルの各レコードを繰り返し、累計を計算して抽出 GROUP ASSIGN v_running_total = v_running_total + Invoice_Amount EXTRACT Invoice_Number, Invoice_Amount, Invoice_Date, v_running_total AS "Running total" TO results1 END
スクリプトが実行されると、GROUP ブロック内のコマンドはテーブルの各レコードに対して上から下に処理され、合計が計算され、抽出されます。 実行される GROUP コマンドを見ると、次のような仕組みになっています。
GROUP の最初の繰り返し:合計 = 0.00 + 618.30
GROUP は最初のレコードの請求金額を 0.00 の初期合計に追加し、フィールドを結果テーブルに抽出します。
Vendor_Number | Vendor_Name | Vendor_City | Invoice_Number | Invoice_Date | Invoice_Amount | Quantity | Unit_Cost |
---|---|---|---|---|---|---|---|
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 |
GROUP の 2 番目の繰り返し:合計 = 618.30 + 6705.12
GROUP は 2 番目のレコードの請求金額を新しい合計の 618.30 に追加し、フィールドを結果テーブルに抽出します。
Vendor_Number | Vendor_Name | Vendor_City | Invoice_Number | Invoice_Date | Invoice_Amount | Quantity | Unit_Cost |
---|---|---|---|---|---|---|---|
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 |
GROUP の 3 番目の繰り返し:合計 = 7323.42 + 7955.46
GROUP は 3 番目のレコードの請求金額を新しい合計 7323.42 に追加し、フィールドを毛かテーブルに抽出します。
Vendor_Number | Vendor_Name | Vendor_City | Invoice_Number | Invoice_Date | Invoice_Amount | Quantity | Unit_Cost |
---|---|---|---|---|---|---|---|
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 |
最終結果テーブル
GROUP がテーブルの最終レコードを処理した後、次の結果テーブルが作成されます。
Invoice_Number | Invoice_Amount | Invoice_Date | Running_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 |
GROUP IF を使用したさまざまな場合の処理
上記と同じ AP_Trans テーブルを使用し、3 種類の請求書の合計を計算する必要があります。
- 高額(1000.00 以上)
- 標準額(100.00 ~ 1000.00)
- 低額(100.00 未満)
GROUP コマンドは異なる場合を処理するために IF/ELSE 構造を提供します。 テストする条件式を提供し、レコードが真と評価される場合は、ブロック内のコマンドが実行されます。
場合のテスト方法
場合は上から下にテストされ、レコードは 1 つの IF/ELSE ブロックでのみ処理できます。 レコードの真に評価される最初の場合は、レコードを処理するものです。
- GROUP が最初のレコードを処理すると、最初の IF 条件に対してテストします(Invoice_Amount >= 1000)。 真と評価される場合、この場合のコードが実行され、他の場合はテストされません。
- 最初の場合が偽と評価されると、次の ELSE IF 条件 (Invoice_Amount >= 100) がテストされます。 同時に真と評価される場合、この場合のコードが実行され、他の場合はテストされません。
- いずれの IF または ELSE IF 場合が真と評価される場合、ELSE ブロックのデフォルトの場合がレコードを処理します。
メモ
レコードが複数の場合で真と評価される場合、レコードはテストする最初の IF/ELSE ブロックでのみ処理されます。 レコードは GROUP コマンド内の複数の IF/ELSE ブロックでは処理されません。
OPEN AP_Trans COMMENT 累計の初期値を設定 ASSIGN v_running_total_hi = 0.00 ASSIGN v_running_total_med = 0.00 ASSIGN v_running_total_low = 0.00 COMMENT GROUP IF を使用して、請求金額に応じて別の ASSIGN および EXTRACT コマンドを実行 GROUP IF Invoice_Amount >= 1000 ASSIGN v_running_total_hi = v_running_total_hi + Invoice_Amount EXTRACT Invoice_Number, Invoice_Amount, Invoice_Date, v_running_total_hi AS "Running total" TO results_hi ELSE IF Invoice_Amount >= 100 ASSIGN v_running_total_med = v_running_total_med + Invoice_Amount EXTRACT Invoice_Number, Invoice_Amount, Invoice_Date, v_running_total_med AS "Running total" TO results_med ELSE ASSIGN v_running_total_low = v_running_total_low + Invoice_Amount EXTRACT Invoice_Number, Invoice_Amount, Invoice_Date, v_running_total_low AS "累計" TO results_low END
スクリプトの実行時には、GROUP コマンドは各レコードの請求金額をテストします。 金額によっては、レコードは 3 つの合計(低、中、高)のいずれかを更新するために使用され、3 つの結果テーブルが生成されます。
GROUP 内の LOOP
GROUP を使用してテーブルのレコードを処理するときには、LOOP コマンドを使用して、単一のレコードに対して一連のコマンドを複数回実行できます。 LOOP は GROUP 内の繰り返し内で発生する 2 番目の繰り返しであり、指定するテスト条件が偽と評価されるまで実行されます。
LOOP を使用してフィールドを分割する
請求データを含む次のテーブルがあり、部署単位で請求金額の特定の情報を分離する必要があります。 1 つの請求書は複数の部署に関連付けることができ、部署コードがカンマ区切りでテーブルに保存されます。
Vendor_Number | Invoice_Number | Invoice_Date | Invoice_Amount | Department_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 |
請求金額を部署ごとに抽出するには
- GROUP コマンドを使用して、テーブルの各レコードを処理します。
- 各レコードに関連付けられた部署 (n) 数を計算します。
- LOOP コマンドを使用して、レコードに関連付けられた各部署のデータを抽出する操作を n 回繰り返します。
メモ
LOOP 内では v_counter 変数を増やす必要があります。 そうしない場合、WHILE テストは常に真と評価され、スクリプトは無限ループに入ります。 スクリプトに SET LOOP コマンドを含め、無限ループを防止できます。 詳細については、SET コマンドを参照してください。
COMMENT GROUP を使用すると、各部署コード フィールドのコメントをカウントし、レコードに関連付けられている部署数を特定します "LOOP" はフィールドの各コードのレコードごとに繰り返され、各コードを固有のレコードに抽出します END GROUP v_department_count = OCCURS(Department_Code,',') v_counter = 0 LOOP WHILE v_counter <= v_department_count v_dept = SPLIT(Department_Code, ',', (v_counter + 1)) EXTRACT FIELDS Invoice_Number, Invoice_Amount, v_dept AS "Department" TO result1 v_counter = v_counter + 1 END END
スクリプトが実行されると、GROUP ブロック内のコマンドは上から下にテーブルの各レコードに対して処理されます。 各レコードでは、LOOP コマンドがカンマ区切りのリストの部署コード単位で 1 回レコードに対して繰り返され、レコードを抽出します。 実行される GROUP および LOOP コマンドを見ると、次のような仕組みになっています。
GROUP の 1 番目の繰り返し:LOOP の 2 つの繰り返し
Vendor_Number | Invoice_Number | Invoice_Date | Invoice_Amount | Department_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 |
テーブルの 1 番目のレコードでは、v_department_count の値が 1 になるため、LOOP は 2 回繰り返します。
- LOOP の最初の繰り返し:
- v_counter = 0
- v_depart = CCD
次のレコードが抽出され、v_counter の値が 1 になるため、LOOP はもう一度繰り返します。
5981807 618.30 CCD - LOOP の 2 回目の繰り返し:
- v_counter = 1
- v_depart = RDR
次のレコードが抽出され、v_counter の値が 2 になるため、LOOP は繰り返さず、GROUP は次のレコードに進みます。
5981807 618.30 RDR
GROUP の 2 番目の繰り返し:LOOP の 1つの繰り返し
Vendor_Number | Invoice_Number | Invoice_Date | Invoice_Amount | Department_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 |
テーブルの 2 番目のレコードでは、v_department_count の値が 0 になるため、LOOP は 1 回繰り返します。
- v_counter = 0
- v_depart = CCD
次のレコードが抽出され、v_counter の値が 1 になるため、LOOP は繰り返さず、GROUP は次のレコードに進みます。
2275301 | 6705.12 | CCD |
GROUP の 3 番目の繰り返し:LOOP の 3 つの繰り返し
Vendor_Number | Invoice_Number | Invoice_Date | Invoice_Amount | Department_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 |
テーブルの 3 番目のレコードでは、v_department_count の値が 2 であるため、LOOP は 3 回繰り返します。
- LOOP の最初の繰り返し:
- v_counter = 0
- v_depart = CCD
次のレコードが抽出され、v_counter の値が 1 になるため、LOOP はもう一度繰り返します。
6585673 7955.46 CCD - LOOP の 2 回目の繰り返し:
- v_counter = 1
- v_depart = LMO
次のレコードが抽出され、v_counter の値が 2 になるため、LOOP はもう一度繰り返します。
6585673 7955.46 LMO - LOOP の 3 回目の繰り返し:
- v_counter = 2
- v_depart = RDR
次のレコードが抽出され、v_counter の値が 3 になるため、LOOP は繰り返さず、GROUP はテーブルの最後に達します。
6585673 7955.46 RDR
最終結果テーブル
GROUP がテーブルの各レコードを処理し、LOOP がすべての部署コードを繰り返した後、次の結果テーブルが生成されます。
Invoice_Number | Invoice_Amount | 部門 |
---|---|---|
5981807 | 618.30 | CCD |
5981807 | 618.30 | RDR |
2275301 | 6705.12 | CCD |
6585673 | 7955.46 | CCD |
6585673 | 7955.46 | LMO |
6585673 | 7955.46 | RDR |