リレーショナル・データベース
目 次


ユーザーから見たAS/400の最大の特長は、ファイルの操作性のよさにあります。
この操作性のよさは、AS/400に標準装備されたデータベース・ファイルが
リレーショナル・データベース(RDB)であることからきています。

リレーショナル・データベースは操作性はよいものの、CPUやメモリーの資源を食うのが難点でした。
AS/400では最初からリレーショナル・データベースの操作を念頭においてファームウエアから
設計され、その処理に高いパフォーマンスを発揮しています。


リレーショナル・データベースとはなんぞや

直訳すれば、関係データベース。何かわかったようなわからないような言葉です。
RDBは1960年代にコッドらによって提唱された集合論を基本とした理論に基づくデータベースです。
特長はファイルをスカラー(単一要素)の集合体として、「リレーション」の形に整理してデータベースにしようというものです。
relationは数学用語でtableと同義語だそうで、平たくいえば、「テーブル」型データベースということです。

それまでにあった階層構造型のデータベースや、ネットワーク構造型のデータベースが、一度構築すると、
とてもソフトウエアとはいい難いほどの、がちがちのものになっていたのに対し、リレーショナル・データベースは
いかにも柔構造で、使い勝手のよさを持っていました。
しかし、CPUやメモリーの資源を大量に必要とするところから、大型の汎用機ですら採用に二の足を踏む状態でした。
このリレーショナル・データベースをハードウエア設計段階から考慮にいれ実現させたのがAS/400です。

リレーショナル・データベースとは何ぞや・・・。わかりやすくいえば、

テーブル型のデータベースである

といえます。
AS/400でこれを具体的に実現するのが、物理ファイルと論理ファイルです。



物理ファイルと論理ファイル

AS/400のデータベース・ファイルは、物理ファイルと論理ファイルに大別されます。


物理ファイル

物理ファイルは,実際に(物理的に)データ・レコードを収容しているデータベース・ファイルで す。
データ・レコードは物理ファイル・メンバーにまとめられ,各メンバーにはそのデータに対する独自の
アクセス・パスがあります。
特に指定しなければ、1つのデータベース・ファイルは1つのメンバーからなります。
物理ファイルは、ソースファイルに入っている、データ記述仕様 (以下DDSと略す)から、CRTPFコマンドに
よって作成されます。たとえば、得意先マスターがM420というメンバー名で、WRKLIBというライブラリーの
QDDSSRCというソース・ファイルに入っているとして、

CRTPF FILE(WRKLIB/M420)  SRCFILE(WRKLIB/QDDSSRC)

のように、コマンドを入力します。
ここで、WRKLIBはファイルM420の登録されているライブラリーの名で、適当につけたものです。
ライブラリーは、パソコンやUNIXマシンでのディレクトリーまたはフォルダーに相当します。
汎用機関係では、VSAMカタログあるいは、VSAMスペースと考えれば理解しやすいでしょう。
上記例で、「WRKLIB/」はライブラリー名による修飾です。WRKLIB/M420の意味は、
「WRKLIBに登録されたファイルM420」となります。
ファイルのライブラリー名による修飾は省略できます。省略すると、システムはライブラリーリストという
一覧表の中にあるライブラリーの中を順にさがし、最初に見つけたファイルが、該当のファイルとなります。


物理ファイルのDDS

物理ファイルのDDSは、ソースファイルのメンバーとして、ファイルレベル、レコードレベル、
フィールドレベルの3つのレベルに分けて記述されます。

一般的な様式は次の通りです。固定カラムの記述様式です。
1~5桁 パンチカード時代のSEQ№用です。今は使用されません。
6桁 仕様書コードAを記述します。
7桁 その行全体を注釈とするとき、*を入れます。
17桁 レコードレコード様式名のときR、キー指定のときKとします。
19~28桁 レコードレベルのときはレコード様式名。フィールドレベルのときはフィールド名
30~34桁 フィールドの長さ
35桁 フィールドのデータタイプ。
S:ゾーン10進数。P:パック10進数。A:英数字。J:2バイトコード文字専用フィールド。
O:2バイトコード文字との混用フィールド
36~37桁 数値のとき、小数以下ののけた数を指定。最大31
45桁~ 各種機能キーワード項目を記述する。(フリーフォーマット)

例:得意先マスター(M420)のDDS
...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
    A* ID   : M420                                                   
    A* NAME : 得意先マスターファイル                                 
    A* KEY  : 得意先№                                               
    A*---------------------------------------------------------------
    A                                      UNIQUE                    
    A*                                                               
    A          R M420R                     TEXT(' 得意先マスター ')  
    A* データフィールド                                              
    A            TKDEL          1A         COLHDG(' 状態フラグ ')    
    A            TKTKNO         5A         COLHDG(' 得意先№ ')      
    A            TKNMKJ        42O         COLHDG(' 得意先名 ')      
    A            TKNMKN        20A         COLHDG(' 得意先カナ ')    
    A            TKTEL         12A         COLHDG(' 電話番号   ')    
    A            TKGYSH         2A         COLHDG(' 業種コード ')    
    A            TKFLG          1A         COLHDG(' フラグ     ')    
    A            TKUR\         11S 0       COLHDG(' 売上実績額 ')    
    A* キーフィールド                                                
    A          K TKTKNO                    


ファイルレベルの記述

DDSの最初に記述します。上の例では、UNIQUEがこれに相当します。
UNIQUEはキーに重複がないことを記述します。


レコードレベルの記述

17桁目をとします。データベース・ファイルのレコード様式名では、ファイル名+Rのように
命名するケースが多いようです。45桁からのTEXTはそのレコード様式の注釈です。


フィールドレベルの記述

名前のタイプ(17桁目)をブランクにすると、フィールドレベルの記述になります。
フィールドレベルの記述では、以下のようにフィールド名、フィールドの桁数、データタイプ、小数以下の桁数、
使用目的、カラム見出し(COLHDG)などを記述します。
フィールド名 RPG-IIIで使用する場合を考慮する場合は6桁までの長さにします。
RPGⅣやCOBOLではさらに長い桁数が使用できます。
プログラムではファイル仕様書で、外部記述を使用すると指示するだけで、
このフィールドを使用できます。
フィールドの桁数 文字列フィールドの場合RPG-IIIの場合256バイトまでとします。
RPG-IVやCOBOLではさらに長い桁数が使用できます。
ゾーン10進数、パック10進数の場合31桁までです
データのタイプ 下記説明を参照してください。
小数以下の桁数 0~31桁です。
COLHDG カラムヘディング。フィールド項目の見出しを記述します。
QUERYプログラムやDFUで検索処理をしたり、
簡易更新画面を作成するときに利用されます。

データのタイプ
タイプコード データタイプ
パック10進データ
ゾーン10進データ
2進データ
浮動小数点データ
文字データ
日付データ
時刻データ
刻スタンプ
16進データ
DBCS 専用データ
DBCS択一データ
DBCS混用データ
DBCSグラフィックス・データ


キーの記述

キーの記述をするには17桁目をとし、キーとするフィールド名を記述します。複数個記述できます。
キーとするフィールド名は、先にデータ・フィールド名として記述されていなければなりません。


DDSの入力

DDSの入力/編集はユーティリティSEU(SOURCE ENTRY UTILITY)で入力します。
SEUをスタートさせるには、STRSEUコマンドを入力します。

STRSEU  SRCFILE(ライブラリー名/QDDSSRC)  SRCMBR(メンバー名)

例: STRSEU  SRCFILE(WRKLIB/QDDSSRC)  SRCMBR(M420)

パラメータの順が正しいときは、キーワードを省略できます。


STRSEU  WRKLIB/QDDSSRC  M420

次のような画面が表示されます。
(入力を終了した状態を示しています。ここでは入力方法については説明しません。)
  桁 . . . . . :    1  71            編集                        WRKLIB/QDDSSRC 
 SEU==>                                                                    M420 
        *****************  データの始め  ************************************** 
0001.00      A*---------------------------------------------------------------  
0002.00      A* ID    : M420                                                    
0003.00      A* NAME  : 得意先マスター                                          
0004.00      A*---------------------------------------------------------------  
0005.00      A                                      UNIQUE                      
0006.00      A          R M420R                                                 
0007.00      A* データ                                                          
0008.00      A            TKSTS          1          COLHDG(' 状態 ')            
0009.00      A            TKTKNO         5A         COLHDG(' 得意先№ ')        
0010.00      A            TKNMKJ        42O         COLHDG(' 得意先名 ')        
0011.00      A            TKNMKN        20A         COLHDG(' 得意先カナ名 ')    
0012.00      A            TKTEL         12A         COLHDG(' TEL ')          
0013.00      A            TKGYO          2A         COLHDG(' 業種№ ')          
0014.00      A            TKFLAG         1A         COLHDG(' フラグ ')          
0015.00      A            TKUR\         11S 0       COLHDG(' 売上実績 ')        
0016.00      A* キー                                                            
0017.00      A          K TKTKNO   


物理ファイルの生成

DDSの記述が終わると物理ファイルの生成を行います。生成するには次のようにコマンドを入力します。

CRTPF    FILE(ライブラリー名/ファイル名)   SRCFILE(ライブラリー名/ソースファイル名)

特に指定しないと、物理ファイルは
初期レコード数 . . . . . . . 10000
増分レコード数 . . . . . . . 1000
最大増分値 . . . . . . . . . . 3
として作成されます。
つまり、レコードは10000件までは無条件に追加できます。10000件をこえての書き込みのとき、
操作員に、増分1000件だけ増やしてよいか、問い合わせメッセージが送られます。
問い合わせはは3回まで繰り返されます。
上記の値は生成時、あるいは、後からCHGPFコマンドで変更も可能です。
10000件を無制限にすることもできます。


生成したファイルの確認等のコマンド
ファイルの持っている情報を表示確認するためのコマンドには、次のようなものがあります。
物理ファイルの仕様 DSPFD FILE(ライブラリー名/ファイル名)
レコード様式の確認 DSPFFD FILE(ライブラリー名/ファイル名)
物理ファイルのレコードの表示 DSPPFM FILE(ライブラリー名/ファイル名)
物理ファイルのレコードクリア CLRPFM FILE(ライブラリー名/ファイル名)
物理ファイルの削除 DLTF FILE(ライブラリー名/ファイル名)
ファイルのDFU更新画面(例参照) UPDDTA FILE(ライブラリー名/ファイル名)

例:M420のDFU画面
下図において、得意先№から、売上実績額までの見出しがCOLHDGで指定された見出しです。
ファイル中のデータ処理                         モード  . . :    変更 
  様式   . . . . :   M420R                         ファイル  . :   M420  
                                                            
 得意先№ :   11111                                                   
 状態フラグ :                                                         
 得意先名 :    得意先11                                             
 得意先カナ : トクイサキ11                                                 
 電話番号 :   03-1111-1111                                            
 業種コード :                                                         
 フラグ :                                                             
 売上実績額 :       11000                                             
                                


論理ファイル

論理ファイルは,1つまたは複数の物理ファイルに入っているデータ・レコードを
プログラムに渡す方法を記述するファイルです。
実際のデータ・レコードは、論理ファイルと関連した物理ファイルに収容されており、論理ファイルにはありません。
汎用機関係のVSAMで、インデックス、あるいは、代替インデックスというのが、ほぼ論理ファイルに相当します。
論理ファイルはソースファイルに入っているDDSを元に、CRTLFコマンドによって作成します。
たとえば、WRKLIBのQDDSSRCに、M420を基礎とする論理ファイルM420L01のDDSが準備されている
として、これから論理ファイルM420L01を作成するときは、

CRTLF   FILE(WRKLIB/M420L01)   SRCFILE(WRKLIB/QDDSSRC)

のようにコマンド入力します。

このとき、論理ファイルの生成には、基礎となる物理ファイルの情報が使用されるので、その物理ファイルが
生成時点で、ライブラリーの中に存在していなければなりません。


得意先カナ名順の論理ファイルのDDSサンプルを以下に示します。
 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
     A* ID   : M420L01                                                
     A* NAME : 得意先マスターファイル L01 カナ名順                    
     A* KEY  : 得意先カナ名 (TKNMKN)                                  
     A*---------------------------------------------------------------
     A          R M420R                     TEXT(' 得意先マスター ')  
     A                                      PFILE(M420)               
     A*
     A* キーフィールド                                                
     A          K TKNMKN                                

説明

R :  M420R レコード様式名です。
PFILE(M420) : 基礎となる物理ファイル(M420)を指定しています
K :  TKNMKN キーフィールドとして、カナ名(TKNMKN)を指定しています。
注 : キーがカナ順となることにより、同じカナ名がでてくることがありうるので、UNIQUEの
    指定がないことに注意して下さい。

注 :  データフィールドの定義の記述はありませんが、省略すると、全てのフィールドを含むものとされます。

このDDSをCRTLFコマンドで生成すると、得意先カナ名順の論理ファイルができあがります。
この論理ファイルM420L01はプログラムからは、レコードの順が違うだけで、物理ファイルと
まったく同じに見えます。
即ち、カナ順の一覧を作表をする場合、カナ順にソートをするという独立した処理は不要です。
このことはシステムを設計する上で大変重要な事柄です。ソート処理がなくなることにより
システム全体の効率を実質的に、2倍近く向上させます。

リレーション

リレーショナル・データベースのリレーションとは、データレコードをプログラムに渡す方法と考えてください。
リレーションには、SORT(整列)、SELECT(抽出)、PROJECT(投影)、JOIN(連結)の4種があります。

SORT(整列)

先のサンプルででてきたカナ名順のように、特定キーの順序でプログラムにデータを渡します。
指定するキーは、業種順、カナ名順、電話番号順のように複数個でも許されます。また、キーのフィールドが
1個所にかたまっている必要もありません。

SELECT(選択)

ファイルを構成するレコードの中から、特定の条件にあうレコードだけを、選択してプログラムに渡します。
たとえば、請求日付フィールドの日付が、0のものだけを選択するような場合に使用します。
また、拡張としてOMIT(除外)もあります。さらに、SELECTとOMITの組合せも可能です。

例-1:SELECT(選択)
     A*--------------------------------------------------------------- 
     A* ID    : M420L11                                                
     A* NAME  : 得意先マスター(カナ順)                               
     A* SELEC : 通常のもののみ   (TKSTS = ' ')                      
     A*--------------------------------------------------------------- 
     A          R M420R                                                
     A                                      PFILE(M420)                
     A* キー                                                           
     A          K TKNMKJ                                               
     A* 選択                                                           
     A          S TKSTS                     COMP(EQ ' ')        
    
この例では、状態コード(TKSTS)がブランクのもののみ選択しています。
業務的には、通常状態のもののみ選択した論理ファイルのつもりです。

取引業務においてトラブルがあって、取引を停止したような得意先であっても、過去データによる
分析を行うような場合には、得意先マスターには該当の得意先データが必要であるようなことがあります。
このような場合に備えて、状態がブランクのものは通常、それ以外は、無効または、廃止データ
するというような取決めが、なされているものとします。


例-2: OMIT(除外)の例
     A*--------------------------------------------------------------- 
     A* ID    : M420L12                                                
     A* NAME  : 得意先マスター                                         
     A* OMIT  : 3 ~ 9 を除外                                          
     A*--------------------------------------------------------------- 
     A          R M420R                                                
     A                                      PFILE(M420)                
     A* キー                                                           
     A          K TKNMKN                                               
     A* 除外                                                           
     A          O TKSTS                     RANGE('3' '9')             
     A*                                            
この例では、状態コードが3から9の範囲のものを除外しています。


PROJECT(投影)

レコードの中の特定のフィールドだけをプログラムに渡します。
それ以外のフィールドはプログラムから見えません。

例-1:PROJECTの例
     A*---------------------------------------------------------------  
     A* ID    : M420L21                                                 
     A* NAME  : 得意先マスター                                          
     A* SELEC : 通常のもののみ   IFEQ TKSTS > ' '                       
     A*---------------------------------------------------------------  
     A          R M420R                                                 
     A                                      PFILE(M420)                 
     A* データ                                                          
     A            TKSTS          1          COLHDG(' 状態 ')            
     A            TKNMKN        20A         COLHDG(' 得意先カナ名 ')    
     A            TKNMKJ        42O         COLHDG(' 得意先名 ')        
     A            TKTEL         12A         COLHDG(' TEL ')          
     A* キー                                                            
     A          K TKNMKN                                                
     A* 選択                                                            
     A          S TKSTS                     COMP(GT ' ')      
この例では、状態、カナ名、得意先名、電話番号のみのPROJECTで、かつ、カナ順、状態が通常でないものを
選択した論理ファイルとなっています。
キーおよび選択に使用するフィールドは、PROJECTされたフィールドとして選択されていなければなりません。


JOIN(連結)

二つ以上のファイルについて、共通のキーをつなぎ役として、ジョイントした形のレコードをプログラムに渡します。
一般にファイルの設計では、正規化を行い、得意先名は得意先マスターに持ち、売上明細ファイルには、
得意先コードだけとします。得意先名を重複して持つような設計は行いません。
しかし、売上一覧表のような帳票を作成しようとする場合には、売り上げ明細情報に加えて、得意先名も必要に
なってきます。(逆正規化
このようなとき、両方のファイルに共通な、得意先コードを仲立ちとした、得意先名入りの売上明細ファイルが
JOINファイルです。

例:売上明細ファイル(F520)と得意先マスター(M420)のJOINファイル
     A*---------------------------------------------------------------
     A* ID    : F520J01                                               
     A* NAME  : 売上&得意先ファイル                                  
     A*---------------------------------------------------------------
     A          R F420R                     JFILE(F520  M420)         
     A          J                           JOIN( 1       2)          
     A                                      JFLD(UDTKNO TKTKNO)        
     A* データ                                                        
     A* F520より                                                          
     A            UDDNNO                                              
     A            UDGYNO                                              
     A            UDTKNO                                              
     A            UDHNNO                                              
     A            UDHNSU                                              
     A            UDTANK                                              
     A            UDURDT                                              
     A            UDSEDT                                              
     A* M420より                                                           
     A            TKNMKJ                 
     A            TKNMKN                 
     A            TKTEL                  
     A* キー ( 伝票№+行№)            
     A          K UDDNNO                 
     A          K UDGYNO    

*JOINファイルも論理ファイルの1種なので、CRTLFコマンドで生成します。

注:物理ファイルを基礎とする論理ファイルが存在するときは、基礎となった物理ファイルは削除できません。
削除する場合は、その物理ファイルを基礎としている論理ファイルを全て削除した後、その物理ファイルを
削除します。



DDSの入力

つぎのコマンドで入力します。詳しくは、別ページで解説します。

STRSEU   WRKLIB/QDDSSRC  メンバー名


論理ファイルの生成

論理ファイルの生成には、次のようにコマンドを入力します。

CRTLF   FILE(ライブラリー名/ファイル名)   SRCFILE(ライブラリー名/ソースファイル名)

このとき、基礎となる物理ファイルが、ライブラリーリストのライブラリーに存在してなければなりません。



論理ファイルのメンテナンス属性

ファイルのレコードが変更されたとき、当然アクセス・パスもメンテナンスされなければなりません。
従って、物理ファイルに関連する論理ファイルが多くなればなるほど、ワークロードも重くなるので、
使用する場面に応じて、その属性がいくつか用意されています。


*IMMED

メンバー中のレコードの変更,メンバーへのレコードの追加,またはメンバーからのレコードの
削除が行なわれるたび に,アクセス・パスが更新されます。
メンテナンス属性は生成のときに、MAINTパラメータを特に指定しないでおくと、*IMMEDに
なります。*IMMEDを指定してもかまいません。

CRTLF  FILE(QTEMP/M420L01)  SRCFILE(QTEMP/QDDSSRC)


*REBLD

ファイル・メンバーがオープンされるたびにアクセス・パスは完全に再作成されます。オープン
された後は、物理ファイルが更新されると、該当の論理ファイルもメンテナンスされます。
アクセス・パスはメンバーがクローズされるまで維持され,メンバーがクローズされると削除
されます。
生成のCL:MAINTパラメータで、*REBLDを与えます。

CRTLF  FILE(QTEMP/M420L01)  SRCFILE(QTEMP/QDDSSRC)  MAINT(*REBLD)

*DLY

アクセス・パスの保守は,その論理ファイル・メンバーがオープンされるまで延期されます。
その後,ファイルが最後にオープンされた以降に追加,削除,または変更されたレコードに
ついてのみアクセス・パスが変更されます。
生成のCL:MAINTパラメータで、*DLYを与えます。

CRTLF  FILE(QTEMP/M420L01) SRCFILE(QTEMP/QDDSSRC) MAINT(*DLY)

注:
ファイルがオープンされている間は,基礎となるファイル・メンバーに対して変更が行われると
このパラメーターの指定が何であっても、オープンされたファイル自身のメンバー のアクセス・パスに
ただちに反映されます。


*IMMEDと*REBLDでの処理時間などの違い
上記M420に、0件、11111件、99999件のレコードがあるとき、M420L01の大きさは下記の通りです。
件数 *REBLD  *IMMED
24,576 (バイト)  24,576(バイト)
11111 24,576 360,448
99999 24,576 2,629,632
ローディング時間 23秒 30秒
ローディング時間はAS/400のMODEL170でバージョンV4.3.0で99999件のときの値です。
*IMMEDの場合、レコードの追加のたびにアクセス・パスのメンテナンスが行われるので、
少し時間が多くなっていることがわかると思います。


コマンドのまとめ
CRTPF PF生成
CRTLF LF生成
DSPFD ファイル記述の表示
DSPPFM 物理ファイルのレコード表示
CLRPFM 物理ファイルのレコードをクリア(0件にする)
CHGPF 物理ファイルの変更
DSPDBR 物理ファイルを基礎としている論理ファイルを調べるを調べる。
例:物理ファイルを基礎としている論理ファイルを調べる
    0/03/24               データ・ベース関連の表示                         
 DSPDBR コマンド入力                                                       
    ファイル . . . . . . . . . . . . . . . . . : FILE       M420           
      ライブラリー . . . . . . . . . . . . . . :            *LIBL          
    メンバー . . . . . . . . . . . . . . . . . : MBR        *NONE          
    レコード様式 . . . . . . . . . . . . . . . : RCDFMT     *NONE          
    出力 . . . . . . . . . . . . . . . . . . . : OUTPUT     *              
  仕様                                                                     
    ファイルのタイプ . . . . . . . . . . . . . :             物理          
    ファイル . . . . . . . . . . . . . . . . . :            M420           
      ライブラリー . . . . . . . . . . . . . . :            WRKLIB          
      メンバー . . . . . . . . . . . . . . . . :            *NONE          
      レコード様式 . . . . . . . . . . . . . . :            *NONE          
      従属ファイルの数 . . . . . . . . . . . . :                5          
  指定した ファイル に従属する ファイル                                            
    従属ファイル          ライブラリー       従属性       JREF     制約         
       M420L01            WRKLIB        データ                  
       M420L11            WRKLIB        データ                  
       M420L12            WRKLIB        データ                  
       M420L21            WRKLIB        データ                  
       F520J01            WRKLIB        データ            2     


データのローディング

できあがったファイルへデータをローディングする方法は、次の3種があります。

1.プログラムでデータを書き込む。
2.DFUと呼ばれるユーティリティを使ってデータを書き込む。
3.ソースファイルにカラム様式をあわせた形のデータを作って、ソース変換のオプションをつけてコピーする。

1.2.は別ページで記述することにし、3.の方法について説明します。

3.のソースファイルにカラム様式をあわせた形のデータを作って、ソース変換のオプションをつけてコピーする方法は
前のシステムから移行するなど、大量のデータをローデングする場合に適しています。

手順は次のようにします。

手順1.物理ファイルはパックやバイナリーのデータ・タイプを使用しないで設計ておきます。
手順2.ファイルのレコード長さを収容できるだけのソースファイル(SRCPF)を作成する。
ソースファイルの最大レコード長さは、240バイトです。
内部的にタイムスタンプと順序№のために12バイト使用するので、実際に使用できるのは、228バイトまでです。
手順3.ファイルの様式にあわせ、SEUでデータを入力(あるいは編集)します。
このとき、物理ファイルのキー順にしておきます。(サンプル参照)

SEUによる入力
 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 0
 11110 得意先110・・・・・・・・・・・・・; トクイサキ110-----------;03-1111-11000001 00000010000 
 11111 得意先111・・・・・・・・・・・・・; トクイサキ111-----------;03-1111-11111111 00000011000
 11112 得意先112・・・・・・・・・・・・・; トクイサキ112-----------;03-1111-11222222 00000212000 
 11113 得意先113・・・・・・・・・・・・・; トクイサキ113-----------;03-1111-11223333 00000212000
 11114 得意先114・・・・・・・・・・・・・; トクイサキ114-----------;03-1111-11334444 00003313000

手順4.CPYFコマンドで物理ファイルにコピーします。このとき、追加のパラメータでレコード様式フィールドの
マップを*CVTSRCとします。
これはソースファイルからの変換コピーのパラメータで、順序№・タイムスタンプのフィールドをコピー対象と
しないことを指示します。
この指定は、CPYFのプロンプト画面でF10を押し、の追加のパラメータを指定して行うことができます。(下図)

                             ファイル・コピー  (CPYF)                          
                                                                               
  選択項目を入力して,実行キーを押してください。                               
                                                                               
  FROM ファイル   . . . . . . . . > QDATSRC        名前                        
    ライブラリー  . . . . . . . .     WRKLIB       名前 , *LIBL, *CURLIB       
  TO ファイル   . . . . . . . . . > M420           名前 , *PRINT               
    ライブラリー  . . . . . . . .     WRKLIB       名前 , *LIBL, *CURLIB       
  FROM メンバー   . . . . . . . .   M420           名前,総称* , *FIRST, *ALL 
  TO メンバー または ラベル  . . . . .   *FIRST         名前 , *FIRST, *FROMMBR     
  レコードの置換えまたは追加  . .   *ADD          *NONE, *ADD, *REPLACE...     
  ファイル作成  . . . . . . . . .   *NO           *NO, *YES                    
  印刷形式  . . . . . . . . . . .   *CHAR         *CHAR, *HEX                  
                                                                               
                   追加のパラメーター                                          
                                                                               
  レコード 様式 フィールド の マップ . . . > *CVTSRC       *NONE, *NOCHK, *CVTSRC...    
                                                                               
                                                                               
                                                                               
                                                                         終り  


SEUで入力や編集できるのは文字タイプだけです。
パック10進数や、2進数データが使用されているファイルへのローディングは次のように工夫します。

第1段階.パックのフィールド、バイナリーのフィールドともフィールド名は同じで、データのタイプを
       ゾーン10進数にした物理ファイルを仮ファイルとして作成し、上記方法でデータをローディングします。
第2段階.このファイルから目的のファイルに、コピーします。このとき、追加のパラメータでレコード様式
      フィールドのマップを*MAP,*DROPとしてコピーします。

つまり、つぎのようにします。


QDATSRC
--(*CVTSRC)--> 仮ファイル --(*MAP *DROP)--> 目的ファイル

*MAP,*DROPオプションによる第2段階のコピーは、フィールド名さえ一致していれば、
その順序は入れ替わっていてもかまいません。たとえば、フィールドがA,B,C,D,Eのレイアウトの
ファイルを新しく、E,D,C,B,Aの順のレイアウトにしても、このコピーだけで、新ファイルに引越しできます。

2005年、あるプロジェクトで、80万件のレコードの複写が2分ほどの時間ででした。
機種は当時の下位から2番目の機種です。
現在はさらにスピードアップされているものと思われます。


ファイル/レコードの排他制御

データベースはデータを一元管理するものなので、ファイルあるいはレコードの割り振りにおいて、
互いに相手が自分の排他制御した(以下ロックということにします。)ファイル、あるいはレコードの
空きを待ち会う、いわゆるデッド・ロックが発生する可能性があります。
例えば、プログラム1と2があり、それぞれレコードAとBを占有使用するとします。
プログラム1はレコードA,Bの順に、プログラム2はレコードB,Aの順にロックするものとします。
このような場合、それぞれのプログラムが最初のレコードをロックして、次に残りのレコードをロックしに
行った場合は、互いに、相手は自分がロックしているレコードの空きを待ち、自分は相手がロックしている
レコードの明きを待ち会うことになります。ファイルレベルでも同じことは発生します。

AS/400では、レコードレベルの場合でも、ファイルレベルの場合でも、最大待機時間の設定が
可能で、この時間を過ぎるとデッド・ロックが発生した可能性ありとして、応答を要求してきます。
ユーザーは再試行あるいはキャンセルなどの応答を返すことによって、デッドロック状態が継続
することを防ぐことができます。

ファイル・レベルの場合、占有の割り振りはALCOBJコマンドで行いますが、一般にファイル・レベルの
待機時間はない(すなわち0秒)ので割り振りができなかった場合、すぐにCPF1002のメッセージが
表示されます。

 メッセージ . . :    オブジェクト M420 を割り振ることができない。        
 回復手順--オブジェクト M420 を割り振ることができません。オブジェクト  
   が使用可能な時に, ALCOBJ コマンドをやり直してください。            
       


レコードレベルのロック

ファイル・レベルのロック機能は他のシステムでもそなえていますが、レコード・レベルのロック機能を
備えたシステムはあまりありません。

AS/400では、更新モード(変更もしくは削除が可能なモード)であるレコードを読み取り
すると、自動的にそのレコードがロックされた状態になって、他からの割り振りが禁止されます。
レコードを更新するとそのロックは解除されます。

例えば、以下のように得意先№をキーとしてマスターを更新しようとする場合、ファイルは更新モード
(COBOLではI/O、RPGではUタイプ)でOPENします。

 RM420       変更              得意先マスター更新            0/10/30  15:45:43 
                                                                               
  得意先№  11111                                                              
                                                                               
  得意先名   一番星運送株式会社                                                
  カナ名称  イチバンボシウンソウカブ                                               
  TEL    03-1111-1122                                                       
  担当営業  1122                                                               
  売上実績      44,014,000                                                     
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
 F12= 取消                                                                     
                                                                               

この例では、ファイルがOPENされただけのの時点では、まだなにもロックはかかっていませんが、
上記のように読み取りしてかつ未更新の状態では、同じキー(ここでは11111)のレコードに
ついてはロック状態になっています。
このとき、他の端末で同一レコードを更新しようとするとレコードの割振り待ちになり、最大待機時間を
すぎると、前述のメッセージが表示されます。
待機時間内に更新を終えるか、更新をとりやめる(すなわち他のキーのレコードのアクセスをする)と
そのレコードに対するロックはとけて、いままで待っていたほうの画面のプログラムが該当の
レコードを読み取りでき、同様の更新のための画面にかわります。

レコードレベルの場合は標準の最大待機時間は60秒で、RPGでは次のようなメッセージが表示されます。

                         プログラム・メッセージの表示                          
                                                                               
 QSYS のサブシステム QINTER のジョブ 094368/ISHIOKA/QPADEV000M が 00/10/30 09  
 (R C G S D F) RM420 11600 は M420 にレコードを割り振ることができない。        
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
  応答を入力して,実行キーを押してください。                                   
    応答 . . .                                                                 
                                                                               
                                                                               
 F3= 終了    F12= 取消し                                                       
                                                                               

このメッセージに対して返す応答としては、次のようなものがあります。

R -- 入力操作のやり直し。
D -- RPG 定様式ダンプの作成。
S -- システム・ダンプの作成。
G -- *GETIN からの処理の続行。
C -- 取消し。
F -- 全定様式ダンプの作成。

COBOLの場合も同様で、LNR7207のメッセージが表示されます。

メッセージ . . : (C D F G) ライブラリー 'QTEMP' のプログラム 'RM420' で入
出力操作が正常に実行されなかった。

このメッセージに対して返す応答としては、次のようなものがあります。

C -- 定様式ダンプは取られない。
D -- COBOL 識別名のダンプが取られる。
F -- COBOL 識別名とファイル情報のダンプが取られる。
G -- 次の COBOL ステートメントからプログラムを続行する。


DFUの場合

AS/400にはデータファイル・ユーティリティという汎用機などにはみられない、DFUというサービス・
プログラムがあります。マスターファイルの更新などは専用のプログラムをつくらなくても、
十分まにあう機能をもっています。この場合もRPGやCOBOLの場合と同じです。
DFUの場合はレコードを画面に呼出すところまではできますが、更新をしようとすると、
   「このレコードは他のプログラムで使用中です」
のメッセージが表示され更新はできません。

ロックの確認

上記ロックがかかっていることは、WRKACTJOBコマンドでオプション5(処理)で確認できます。

                              ジョブ・ロックの処理                              
                                                          システム :   S1234567 
 ジョブ :   QPADEV000W     ユーザー :   ISHIOKA        番号 :   094756          
                                                                                
 ジョブ状況 :   ACTIVE                                                          
                                                                                
 オプションを入力して,実行キーを押してください。                               
   5= ジョブ・メンバー・ロックの処理   8= オブジェクト・ロックの処理            
                                                                                
                              オブジェクト                    メンバー                 
 OPT  オブジェクト    ライブラリー     タイプ       ロック       状況    ロック                  
      ISHIOKA     QSYS        *USRPRF    *SHRRD    HELD                         
      MAIN        QSYS        *MENU      *SHRNUP   HELD                         
                                         *SHRNUP   HELD                         
      M420        WRKLIB      *FILE-PHY  *SHRRD    HELD   YES                   
      KKKLIB      QSYS        *LIB       *SHRRD    HELD                         
      QDUIGRAP    QSYS        *FILE-DSP  *SHRNUP   HELD                         
      QEVX        QSYS        *LIB       *SHRRD    HELD                         
      QGMHGSD     QSYS        *PNLGRP    *SHRNUP   HELD                         
      QGPL        QSYS        *LIB       *SHRRD    HELD                         
                                                                       続く ... 
 F3= 終了   F5= 最新表示   F10=ジョブ・レコード・ロック の表示   F11=スレッド・データ の表示   
 F12= 取消し   F16=ジョブ・メニュー                                                   
                                                                                




目次へ

(C)COPYRIGHT ISHIOKA KATSUHIDE 2000-2010