• 検索結果がありません。

ランダム・アクセス :

ドキュメント内 rbafopdf.ps (ページ 81-99)

結合論理ファイルのセットアップ

ケース 5: ランダム・アクセス :

この結合論理ファイルの例は、ランダム・アクセス読み取り操作のレコードを返します。

ここで、結合論理ファイルが、66ページの『例 1: 2 つの物理ファイルの結合』のように、指定されてい るものとします。結合論理ファイルにはキー・フィールドを定義していることに注意してください。

PF1 と PF2 には、以下のレコードがあるとします。

18. 物理ファイル 1 (PF1)

Employee number Name

235 Anne

440 Doug

500 Mark

729 Sue

997 Tim

19. 物理ファイル 2 (PF2)

Employee number Salary

235 1700.00

440 950.50

729 1400.90

984 878.25

997 331.00

997 555.00

PF2 では、レコード 500 のレコードがありません。レコード 984 は PF2 にのみ存在し、 997 のレコー ドが重複しています。

プログラムは、以下のレコードを得ます。

論理ファイルの Nbr フィールドに対してプログラムから 235 の値が与えられると、システムは以下のレ コードを提供します。

Employee number Name Salary

235 Anne 1700.00

論理ファイルの Nbr フィールドに対してプログラムから 500 の値が与えられ、さらに JDFTVAL キーワ ードを指定していると、システムは以下のレコードを提供します。

Employee number Name Salary

500 Mark 0000.00

注: 結合論理ファイルに JDFTVAL キーワードが指定されていない場合、2 次ファイルに一致レコードが ないため、500 の値に対するレコードは見つかりません。

論理ファイルの Nbr フィールドに対してプログラムから 984 の値が与えられると、レコード 984 は基本 ファイルにないため、システムは何のレコードも提供せず、レコードなしの例外が発生します。

論理ファイルの Nbr フィールドに対してプログラムから 997 の値が与えられると、システムは以下のレ コードのうち 1 つを戻します。

Employee number Name Salary

997 Tim 331.00

または

Employee number Name Salary

997 Tim 555.00

プログラムにどちらのレコードが返されるかは予測できません。どのレコードを返すかを指定するために は、結合論理ファイルに JDUPSEQ キーワードを指定します。

注:

1. ランダム・アクセスでは、アプリケーション・プログラマーは、PF2 に重複レコードが存在する可能性 があることを知っていなければなりません。また、プログラムが重複キーのあるレコードに対して複数 回の読み取り操作を確実に行うようにしなければなりません。プログラムで順次アクセスが使用されて いる場合には、2 回目の読み取り操作で 2 つ目のレコードが入手されます。

2. JDUPSEQ キーワードを指定すると、システムは結合論理ファイルに対して別個のアクセス・パスを作

成することができます (この理由は、共用することができる既存のアクセス・パスを見つけ出すことは ほとんど不可能に近いためです)。JDUPSEQ キーワードを省略すると、システムは別のファイルのアク セス・パスを共用することができます。(この場合、システムは PF2 のアクセス・パスを共用できま す。)

関連資料:

76ページの『例 3: 2 次ファイル内の重複レコードの読み取り』

この例は、結合論理ファイルが、重複文字列の結合 (JDUPSEQ) DDS キーワードの指定に基づいて 2 次フ ァイル内の重複レコードを読み取る方法を示しています。

2: 複数のフィールドを使用したファイル結合:

2 つのファイルを結合するために、複数の結合フィールドを指定することができます。この例では、 論理 ファイルと 2 つの物理ファイルのフィールドを示します。

結合論理ファイル (JLF) には、 Part number (部品番号)、 Color (色)、 Price (価格)、および Quantity on hand (在庫量) フィールドがあります。物理ファイル 1 (PF1) には Part number、 Color、 Price、 Vendor (ベンダー) が含まれ、物理ファイル 2 (PF2) には Part number、 Color、 Quantity on hand、および

Warehouse (倉庫) が含まれます。これらのファイルのデータ記述仕様 (DDS) を次に示します。

JLF

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R JOINREC JFILE(PF1 PF2)

A J JOIN(PF1 PF2)

A JFLD(PTNBR PTNBR)

A JFLD(COLOR COLOR)

A PTNBR JREF(PF1)

A COLOR JREF(PF1)

A PRICE

A QUANTOH

A PF1

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R REC1

A PTNBR 4

A COLOR 20

A PRICE 7 2

A VENDOR 40

A PF2

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R REC2

A PTNBR 4

A COLOR 20

A QUANTOH 5 0

A WAREHSE 30

A

物理ファイルには、以下のレコードがあるとします。

20. 物理ファイル 1 (PF1)

Part number Color Price Vendor

100 Black 22.50 ABC Corp.

100 White 20.00 Ajax Inc.

120 Yellow 3.75 ABC Corp.

20. 物理ファイル 1 (PF1) (続き)

Part number Color Price Vendor

187 Green 110.95 ABC Corp.

187 Red 110.50 ABC Corp.

190 Blue 40.00 Ajax Inc.

21. 物理ファイル 2 (PF2)

Part number Color Quantity on hand Warehouse

100 Black 23 ABC Corp.

100 White 15 Ajax Inc.

120 Yellow 102 ABC Corp.

187 Green 0 ABC Corp.

187 Red 2 ABC Corp.

190 Blue 2 Ajax Inc.

ファイルを順次に処理すると、プログラムは以下のレコードを受け取ります。

22. 結合論理ファイル (JLF)

Part number Color Price Quantity on hand

100 Black 22.50 23

100 White 20.00 15

120 Yellow 3.75 102

187 Green 110.95 0

187 Red 110.50 2

190 Blue 40.00 2

注: 部品番号 190 で色が Blue (青) のレコードはプログラムでは使用できません。理由は、2 次ファイル の共用フィールドで一致レコードが見つからないからです。JDFTVAL を指定していないので、レコードは 戻されません。

3: 2 次ファイル内の重複レコードの読み取り:

この例は、結合論理ファイルが、重複文字列の結合 (JDUPSEQ) DDS キーワードの指定に基づいて 2 次フ ァイル内の重複レコードを読み取る方法を示しています。

物理ファイルと結合論理ファイルのデータ記述仕様 DDS を以下に示します。

JLF

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R JREC JFILE(PF1 PF2)

A J JOIN(PF1 PF2)

A JFLD(NAME1 NAME2)

A JDUPSEQ(TELEPHONE)

A NAME1

A ADDR

A TELEPHONE

A PF1

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R REC1

A NAME1 10

A ADDR 20

A PF2

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R REC2

A NAME2 10

A TELEPHONE 8

A

物理ファイルには以下のレコードがあります。

23. 物理ファイル 1 (PF1)

Name Address

Anne 120 1st St.

Doug 40 Pillsbury

Mark 2 Lakeside Dr.

24. 物理ファイル 2 (PF2)

Name Telephone

Anne 555–1111

Anne 555–6666

Anne 555–2222

Doug 555–5555

結合論理ファイルは以下のレコードを戻します。

25. 結合論理ファイル (JLF)

Name Address Telephone

Anne 120 1st St. 555–1111

Anne 120 1st St. 555–2222

Anne 120 1st St. 555–6666

Doug 40 Pillsbury 555–5555

プログラムは Anne の使用可能なレコードをすべて読み取り、それから Doug、Mark へと続きます。Anne には 1 つの住所しかありませんが、電話番号は 3 つあります。そのため、Anne のレコードは 3 つ返さ れることになります。

Anne のレコードは、電話番号で昇順に分類されます。これは、キーワード・パラメーターとして

*DESCEND を指定していない限り、 JDUPSEQ キーワードが昇順に分類するからです。以下に DDS で

*DESCEND を使用した例を示します。

JLF

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R JREC JFILE(PF1 PF2)

A J JOIN(PF1 PF2)

A JFLD(NAME1 NAME2)

A JDUPSEQ(TELEPHONE *DESCEND)

A NAME1

A ADDR

A TELEPHONE

A

JDUPSEQ で *DESCEND を指定すると、以下のようなレコードが戻されます。

26. 結合論理ファイル (JLF)

Name Address Telephone

Anne 120 1st St. 555–6666

Anne 120 1st St. 555–2222

Anne 120 1st St. 555–1111

Doug 40 Pillsbury 555–5555

注: JDUPSEQ キーワードは、キーワードが指定されている結合仕様に対してのみ適用されます。

関連資料:

87ページの『例 10: 複合結合論理ファイル』

この例では、さらに複雑な結合論理ファイルを示します。

4: 属性が異なる結合フィールドの使用:

この例では、属性 (長さ、データ・タイプ、および小数点以下の桁数) が異なる場合に結合フィールドを処 理する方法を示します。

たとえば、76ページの『例 3: 2 次ファイル内の重複レコードの読み取り』 のように、Name1 フィール ドは物理ファイル PF1 にある長さ 10 文字の文字フィールドであり、物理ファイル PF2 にある長さ 10 文字の文字フィールド Name2 に結合することができます。Name1 と Name2 のフィールドは同じ特性を持 っているため、結合フィールドとして簡単に使用することができます。

異なる長さの文字タイプ・フィールドも、フィールドの再定義をしなくても結合フィールドとして使用する ことができます。たとえば、PF1 の Name1 フィールドが 10 文字の長さで、PF2 の Name2 フィールドが 15 文字の長さである場合に、どちらかのフィールドを再定義しなくても、これらのフィールドを結合フィ ールドとして使用することができます。

以下に示すのは、結合フィールドが同じ属性を持っていない例です。どちらの物理ファイルにも、従業員番 号フィールドがあります。物理ファイル PF1 の Nbr フィールドと物理ファイル PF2 の Nbr フィールド は、どちらも 34 列で指定しているように長さが 3 です。しかし、PF1 ファイルではフィールドはゾーン 10 進数であり (35 列に S)、PF2 ファイルではフィールドはパック 10 進数です (35 列に P)。これらの フィールドを結合フィールドとして用いて 2 つのファイルを結合するためには、同じ属性を持つようにど ちらか一方あるいは両方のフィールドを再定義しなければなりません。

以下に、論理ファイルと物理ファイルのフィールドの例を示します。

結合論理ファイル (JLF) には、 Employee number (従業員番号)、 Name (名前)、 Salary (給与) フィール ドがあります。物理ファイル 1 (PF1) には、Employee number (ゾーン) および Name が含まれます。物理 ファイル 2 (PF2) には、Employee number (パック) および Salary が含まれます。これらのファイルのデ ータ記述仕様 (DDS) を次に示します。

JLF

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R JOINREC JFILE(PF1 PF2)

A J JOIN(PF1 PF2)

A JFLD(NBR NBR)

A NBR S JREF(2)

A NAME

A SALARY

A PF1

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R REC1

A NBR 3S 0 <-Zoned

A NAME 20

A K NBR

A PF2

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R REC2

A NBR 3P 0 <-Packed

A SALARY 7 2

A K NBR

A

注: この例では、論理ファイルの Nbr フィールドは PF2 からコピーしたものです。これは、JREF(2) が指 定されているからです。物理ファイル名を指定する代わりに、JREF キーワードで相対ファイル番号を指定 することができます。この例では、2 が PF2 を示しています。

PF1 ファイルと PF2 ファイルの Nbr フィールドは、結合フィールドとして使用されているため、同じ属 性を持っていなければなりません。この例では同じ属性を持っていません。したがって、どちらか一方また は両方を再定義して、同じ属性を持つようにしなければなりません。この例では、2 つの従業員番号フィー ルドの属性の違いを解決するために、JLF の Nbr フィールド (PF2 ファイルからのもの) がゾーン 10 進 数として再定義されています (JLF の 35 列に S)。

5: レコード様式に現れないフィールドの記述:

非入出力フィールド (38 列で N と指定) は、入力も出力も行わないものとして結合論理ファイルで使用す ることができます。非入出力フィールドはレコード様式には含まれません。この例では、レコード様式には 現れることのないようなフィールドを記述する方法を説明します。

結合論理ファイルを使用するプログラムは非入出力フィールドを見ることも読み取ることもできません。非 入出力フィールドはレコード様式には含まれません。非入出力フィールドはキー・フィールドにはできませ んし、結合されたファイルの選択/除外ステートメントにも使用できません。非入出力フィールドは結合フ

ィールド (JFLD キーワードを使用して結合仕様レベルで指定) に使用することができます。このフィール

ドは、結合を可能にするためにのみレコード・レベルで再定義されるもので、プログラムでは必要とされま せん。

次の例では、プログラムは在庫部品の説明、価格、および在庫量を読み取ります。部品番号自身は、部品の レコードをまとめるため以外は必要ではありません。しかし、部品番号は異なった属性となっているので、

最低 1 つは再定義しなければなりません。

結合論理ファイル (JLF) には、 Description (説明)、 Price (価格)、および Quantity on hand (在庫量) フ ィールドがあります。物理ファイル 1 (PF1) には Description および Part number (部品番号) があり、物 理ファイル 2 (PF2) には Part number、 Price、および Quantity on hand があります。これらのファイル のデータ記述仕様 (DDS) を次に示します。

JLF

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R JOINREC JFILE(PF1 PF2)

A J JOIN(PF1 PF2)

A JFLD(PRTNBR PRTNBR)

A PRTNBR S N JREF(1)

A DESC

A PRICE

A QUANT

A K DESC

A PF1

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R REC1

A DESC 30

A PRTNBR 6P 0

A PF2

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

A R REC2

A PRTNBR 6S 0

A PRICE 7 2

A QUANT 8 0

A

PF1 では、Prtnbr フィールドはパック 10 進数フィールドですが、PF2 では、Prtnbr フィールドはゾーン 10 進数フィールドです。結合論理ファイルでは、これらを結合フィールドとして使用します。PF1 の

Prtnbr フィールドは、フィールド・レベルで 35 列に S と指定することで、ゾーン 10 進数フィールドに

再定義されます。JREF キーワードはフィールドがどの物理ファイルからコピーされたものかを識別しま

ドキュメント内 rbafopdf.ps (ページ 81-99)