1

パラメーターで CL プログラムに名前が渡される物理ファイルがあるとします。キー フィールド名と値がファイルに保存され、RCVF 経由で読み込まれる場合、この方法でファイルから特定のレコードを取得することは可能ですか? この方法で、そのレコードからフィールドの値を抽出したいと考えています。ファイルの名前、そのキー リスト、および対応するキー値は、コンパイル時に決定できません。

私は現在、仲間の開発者向けのユーティリティに取り組んでいます。すべての機能のうちの 1 つは、ファイルからレコードを取得し、フィールドの 1 つの値をチェックすることです。チェックする必要のあるファイルがいくつかあり (さらに多くのファイルが追加されます)、それらはすべて異なるキーを持っています。ファイル名、それらのキー リスト、および返されるフィールドは、すべて制御ファイルに保存されます。ユーザーは UI からファイルを選択し、CL (またはその他の言語) は既存の情報を使用してフィールド値を取得します。

ご覧のように、直接のビジネス利用ではありませんが、今後のメンテナンスの難易度は出来るだけ低く抑えたいと思っています。

4

6 に答える 6

1

REXXをお勧めします。あなたの問題はREXXでは単純です。

これは、OSに長年含まれている動的なスクリプト言語ですが、広く見過ごされてきました。CLとSQLの両方を簡単にスクリプト化して、必要に応じてステートメントを動的に作成できます。REXXは、文字列の処理と構文解析に優れています。実際、REXXでは、数値であってもすべてが文字列です。

ファイルの名前、キーフィールド、キー値、および取得する列の名前を渡すことができます。これらのパラメータを組み合わせてSQLステートメントを作成すると、すぐに使用できます:)

REXXリファレンスおよびREXXプログラマーズガイドを参照してください。

タイプが、であるソースメンバーを作成し、REXXコンパイルされませんが、で解釈されSTRREXPRCます。

REXXコマンドではないステートメント、または文字列に評価されるステートメントは、外部コマンド環境で実行されます。デフォルトでは、その環境はCLですが、ADDRESS他の環境、特にSQLを使用することもできます。

于 2012-09-15T16:57:12.970 に答える
1

ステートメントは、DCLFコンパイル時にファイル形式に関連付けられます。

OVRDBF理論的には、コンパイル時に汎用ファイルを使用して、必要な処理を実行できるはずですが、コンパイル時のファイルのレコード長がオーバーライドされたファイルよりも短い場合を除いて、 CPF0859LVLCHK(*NO)がスローされます。これを行うと、コンパイル時の長さを超えて存在するデータが切り捨てられることになります。

最も簡単な解決策は、プログラム記述ファイルを使用してRPGでこれを行うことです。

于 2012-09-15T16:28:21.570 に答える
1

CL プログラムに応答を返す必要があります。ここでは、探している回答の型が単一の戻り値の型、たとえば数値に収まると仮定しましょう。ただし、文字は代替インターフェイスとして実装できます。

ファイル名、使用する列名などを含む入力パラメーターに基づいて、SQL ステートメントを動的に PREPARE する SQL ILE RPG プログラムを作成できます。

于 2012-09-23T21:14:43.330 に答える
1

もう 1 つの動的な方法は、ファイル名とキー フィールド名を変数として QM クエリに渡すことです。これは、CL を介して行うことも、REXX で簡単に行うこともできます。

動的なファイル名に対して汎用の QM クエリを使用し、動的な数のグループ化フィールドを使用します。

SELECT  &FLDS, int(count(*)) AS TALLY
  FROM  &FILE                             
  GROUP BY &FLDS                          
  ORDER BY &FLDS                          

このクエリは、私が作成した VALUES というコマンドの基になっています。このコマンドは、ファイル内の特定のフィールド (複数可) の値と、それが発生する頻度を一覧表示します。

VALUES FILE(CUSTMAST) FLDS('CTYPE') 
VALUES FILE(CUSTMAST) FLDS('CSTATE, CTYPE')

最初のコマンドは、CUSTMAST テーブル内の CTYPE のすべての値を表示します。次は、各状態で各タイプがいくつ発生するかを示しています。

問題は、どのように答えを CL に返すかです。画面に結果を表示するだけで満足している場合は、これで問題ありません。または、出力をファイルに送信することもできます。しかし、この方法でも REXX が役に立ちます ;-)

于 2012-09-17T05:30:15.457 に答える
0

DSPDTA を CL で書きたいようです。

CL には、これを実現するために必要なほとんどすべてが欠けていますが、CL は、作成するコマンドで簡単に拡張できます。そのためには、必要なファイル I/O 機能を実装する RPG プログラムを (同僚を満足させるために) いくつか作成してください。これらの RPG プログラムを、作成する CL コマンドでラップします。開始するためのいくつかのアイデア:

  • ファイルを宣言する
  • フィールド情報の取得
  • ファイルを開く
  • キーを設定
  • レコードを取得する
  • ファイル フィールドから CL 変数を設定する
  • ファイルを閉じる
于 2012-09-19T13:45:42.687 に答える
0

はい、しかし、なぜそうしたいのですか?根本的な問題は、RPG のような言語がデータベース操作を意図しているのに対し、CL はデータベース操作を意図していないことです。完全に動的なファイル操作に関しては、RPG と CL の両方に欠点があります。それらは厳密に型指定された言語です。これは、ファイルから返すデータ型を事前に宣言する必要があることを意味します。これは、真に動的なファイル I/O ではちょっとした問題です。この問題 (コンパイル時にファイルがわからない) に対する古典的な答えは、処理プログラムを作成するツールを作成することです。

ファイル名、キー構造、取得するフィールドなどをツール (ユーザーが作成する CL コマンドにすることができます) に提供すると、ツールは適切な API を使用してファイルからフィールド定義を抽出し、次に進みます。実際に CL ソースを記述し、それをコンパイルして CALL します。おそらく、これらの異なるファイルのフィールドで発生する多かれ少なかれ標準的なビジネス処理があります。ツールもそれを書き込む必要があります。

于 2012-09-17T17:38:09.483 に答える