最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

a.7. 2000年問題 其の添

[ Previous ] [ HOME ] [ Upper ] [ Next ]


いよいよ、フィールドの検索を開始した。

手順(試行錯誤)

まず、すべてのファイルのフィールドを、DSPFFDで、OUTFILEに作成した。じつは、簡単なツールを作ってあって、OUTFILEから、さらに別ファイルにデータができます。これは、フィールドが、数字でも、文字でも、ひとつのフィールドにセットするようにしたのです。というのも、文字フィールドの桁数の場合、バイト数で長さが分かるのですが、パック数字の場合、実バイト数が、このバイト数に入ってしまい、数字としての桁数は、別個のフィールドに入っているのです。そこで、RPGで、どちらも、フィールド長なるフィールドに落としたのです。

そして、QRYで、このファイルを検索しました。最初は、LIKE ’%年%'をしたりしてました。(漢字検索の時は、%も漢字の%にすること。)でもそのうち、この「LIKE関数にセットすべき値」をざっと検索しよう、と考え出しました。そこで、桁数を2,4,6,7,8,9までの数字と文字を検索して、表示された、データを目で確認していきました。えらく疲れましたが、その結果、次のようなものが、「LIKE関数」に与えるべき物と分かってきました。厳密ではなく、やや、幅のある選択になります。

フィールド名

カラムヘディング

データタイプ

桁数

%DAT%

%DAT%

P

2

%YY%

%YMD%

S

4

-Y

%YEAR%

L

6

%YM%

%YR%

A

7

%DT%

%日%

8

%YYMM%

%年%

9

%YEAR%

%YY/MM/DD%

10

%YR%

%YER%

%YMD%

%世紀%

%YER%

-D

%CENT%

ここで、%xxx%は、このxxxを含む文字列を意味して、-XはXで終わる文字列です。

「しまった」と思ったこと

  • 画面ファイルと印刷装置ファイルのフィールドを見るのをわすれた。(もう、つかれた)
  • ファイル作成当時にワークフィールドを予備につくって、(WRKFLD1とか、WRKFLG1などと、よくやりますよね)、ここに、日付をセットした場合、フィールド名も、また、(リコンパイルしない限り)、カラムヘディングも反映しない。(DDSソースには、きちんと、「XXXXとして使用」と入力しているが。)よって、上記の検索ではヒットできない。
  • また、ダウンロードファイルも、エクセルに渡す時、20バイトくらいのフィールドを連番みたいに作成している。これは、第一レコードに、エクセル用の各列のタイトルを文字で入れているため。本体となる、第2レコード以降に含まれる数字データも、この20バイトの文字フィールドにセットして、「DIF形式」なら、数字として渡せるので、ユーザーは喜ぶ。でも、いま、私は悲しむ。

でも、今のところこれくらいです。ワークフィールドは、必ず、カラムヘディングかテキストに、使用目的を入力しているので、全ファイルをどこかのライブラリーにリコンパイルすれば、分かります。

日付に関するコマンドは?

次に、コマンドで、日付に関するものを調べた。

最初、DSPMSGDでQCPFMSGをスプール(*FULLではなく、*BASICで)にして、「日付」で検索して、MSGIDをメモに書き出し、CDマニュアルの「モニター可能メッセージ」で検索した。(遠回りだったが、結構勉強になった。「できないこと」はあまりマニュアルに出てないが、エラーメッセージを見ると分かるのです。2000年問題とは関係ないけど。) その後、CLコマンドのマニュアル(上下)を、DATEで検索してみた。

その結果、次のものが候補にあがった。これらは、むしろ、6桁のままでなくてはいけないかもしれない。OSのバージョンによるのでしょう。

CLP

CVTDAT

OPNQRYF

DSPSYSVAL

CHGSYSVAL

RTVSYSVAL

CHGJOB

SAVCHGOBJ

DLTDLO

RTVJOBA

SBMJOB

APYJRNCHG

ADDJOBSCDE

CHGJOBD

ジュリアンデートの年(最初の2バイト)

世紀の判定

FNDSTRPDMのバッチ処理オプション

ご存知の方は、ご存知でしょうが(あたり前か)、FNDSTRPDMをバッチで投入する時のオプションで、検索結果のソースメンバーをファイルに落とすことができます。(もちろんスプールにして、それを物理ファイルにして、内部記述のRPGで読み込んで、ファイルを作る手もあります。でも、面倒ですよね。) 最初は、分からなかったのですが、たとえばOPTIONに*CPYとすると、対話型モードのみ有効で、バッチ投入すると、エラーになります。この件は、マニュアルには、ちょっとだけ出てました。

6.6.1 バッチ・モードでの他のオプションの処理

「ストリングの探索」画面からバッチ・モードで他のオプションを処理するには、次のようにしてください。

1. ユーザー定義オプションを実行するのに必要なコマンドを呼び出す、ユーザー定義オプションを作成します。
2. 「ストリングの探索」画面のオプション・プロンプトにこのユーザー定義オプションを選択して、バッチ処理に投入します。

要は、自分でオプション定義をして、それを指定しろ、ということです。

そこで、STRPDMのオプション9で,ユーザー定義オプションをセットしてみました。CPYSRCFで &L/&Fのメンバー&Nを固定的に或ソースファイルに複写するオプションを、B1としてました。そして、FNDSTRPDMのOPTIONにB1をいれて、プロンプトは*NOPROMPTにして、FNDSTRPDMをバッチ投入したら、ちゃんと検索した内容をソースコピーしてくれていた。

私が、ほしいのは、ソースリストではなく、該当したソースメンバー名なので、このやり方では、ディスクがもったいない。そこで、

  1. CRTPFでレコード長1バイト、MAXMBRS(*NOMAX)のファイルを作成。(レコード長は最短で。資源を大切に。)
  2. ユーザー定義オプションで、ADDPFMで上記のファイルに、メンバー名を&N、テキストを&Xとして、メンバー追加する設定をした。
  3. FNDSTRPDMで検索したい文字列や、上記のユーザー定義オプションをOPTIONにセットして、SBMJOB。検索したい文字列を変えて、何度実行しても、同じメンバー名はできないので、重複しない。
  4. ジョブ終了したら、上記のファイルのメンバーリストを、DSPFD *MBRLISTでOUTFILEに作る。

これで、検索した結果を、ファイルに簡単に落とせます。これを元に、さらに、検索を続けることも可能です。(これ専用のCLPを作るのでしょうが。)上記該当フィールドを、これで検索してみようと思っています。本当は、RPGのSCAN命令で、やろうかと思ったのですが、この方が楽です。でも、検索内容のレコード印刷は、スプールにするしか手はないようです。残念。

QRYで、最初に書いたLIKE関数で出てくるフィールド名をファイルに落とし、それを、順次読み込んで、このFNDSTRPDMで、該当するRPGをだそう、というわけです。はたして、うまくいくでしょうか?むむむ

ところで、IBMの2000年対応のウェッブで、見たのですが、Application Development Services/400のApplication Dictionary Serviceって使った人いますか?便利なのかな?

それから、依然メールでいただいたのですが、日付の表現形式についても、上記のIBMのWWWで確認しておきましょう。結構、いい資料です。YYYY/MM/DDという形式は、ISOもJISにもなく、YYYY-MM-DDが、ISOとJISとのことです。あの資料作ってくれた方々、ありがとうございました。この件、社内回覧しとくべきかな。でも、RPGの編集コードYは相変わらず、9999/99/99の形式ですね。

続く...


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

Ads by TOK2