3

RPGプログラムで既存の物理ファイルの新しいメンバーを作成する必要があります。私は2つの方法を知っています、そして私はどちらも好きではないと言わなければなりません:

  1. QCMDEXCに電話をかけるために使用するADDPFM
  2. ADDPFMRPGから呼び出して呼び出すCLプログラムを作成します

1つ目は、パフォーマーには聞こえない、解析する必要のあるコマンドをまとめることですQCMDEXC(ここでの拡張部分は呼び出しではなく、メンバーの作成です)。それは、私がそれを簡単に見つけられないということですが、それどころか、従うのが難しく、あまり美的ではありません。

2つ目はコンパイル済みプログラムを使用するため、連結や解析は必要ありません。また、通常のプロシージャ呼び出しは1つだけなので、RPGコードではそれほどひどく見えません。ただし、追加の外部プログラムを作成する必要があります。これは、RPGプログラムが使用されるすべてのシステムに転送する必要があります。また、私の美的感覚とは矛盾し、1回のAPI呼び出しを行うためだけに追加のソースとバイナリを作成します。

なしでAPIを直接呼び出す方法はありQCMDEXCますか?それとも、PFの新しいメンバーを作成する別のRPG風の方法ですか?グーグルは私にはまったく役に立たなかった。

ありがとう

4

2 に答える 2

5

RPG内から物理ファイルメンバーを直接作成する方法はありません。

あなたがリストしたオプションは良いです。もう1つはsystem()APIです。これが新しいアプリの場合は、複数のメンバーを避けるようにしてください。彼らはSQLと友達ではありません。従来のマルチメンバーアプリは、ラッパーCLを使用して、RPGを呼び出す前にADDPFMとOVRDBFを処理します。

PGM &month
DCL &month *char 3
DCL &mbr *char 10
chgvar &mbr ('SALES' *cat &month)
addpfm sales &mbr
monmsg...
ovrdbf sales mbr(&mbr)
call RPG_PGM
endpgm

明らかに、RPGのより最近のバージョンでは、F仕様でオーバーライドを行うことができます。しかし、RPG内から直接ファイルメンバーを操作する方法はまだありません。私はsystem()またはQCMDEXCのプロシージャラッパーを作成し、それをサービスプログラムに入れて、RPGプログラム内からOSレベルの作業を実行できるようにする傾向があります。必要に応じて、特定のADDPFMプロシージャを記述し、その「API」を呼び出します。

于 2012-06-01T16:32:58.100 に答える
1

解決策の例を挙げQCMDEXCます。メンバーを作成するために RPG プログラム内で何らかの方法が必要なだけで、追加の (CL-) プログラムを追加したくない場合、これはその仕事をする簡単な解決策です:

crt_mbr次のようなプロシージャを作成できます。

 Pcrt_mbr          B
 D                 PI
 D lib                           10A   value
 D file                          10A   value
 D mbr                           10A   value
 Dqcmdexc          PR                  extpgm('QCMDEXC')
 D str                          200a   options(*varsize) const
 D len                           15P 5 const
 Dcmd              S            200A
 Dlen              S             15P 5
  /free
   cmd = 'ADDPFM FILE('+%trimr(lib)+'/'+%trimr(file)+') ' +
         'MBR(' + %trimr(mbr) +')';
   len = %len(%trimr(cmd));
   qcmdexc(cmd: len);
  /end-free
 Pcrt_mbr          E

v7 では次のようになります。

dcl-proc crt_mbr;
  dcl-pi *n;
    lib    char(10) value;
    file   char(10) value;
    mbr    char(10) value;
  end-pi;

  dcl-pr qcmdexc  extpgm('QCMDEXC');
    str    char(200) options(*varsize) const;
    len    packed(15:5) const;
  end-pr;

  dcl-s cmd    char(200) inz('');
  dcl-s len    packed(15:5) inz(0);

  cmd = 'ADDPFM FILE(' + %trimr(lib) + '/' + %trimr(file) + ')' +
        ' MBR(' + %trimr(mbr) + ')';
  qcmdexc(cmd: %len(%trimr(cmd)));
end-proc;

プログラムの最初にプロトタイプを追加する必要がある場合があります (リリースによって異なります)。

 Dcrt_mbr          PR
 D lib                           10A   value
 D file                          10A   value
 D mbr                           10A   value

プログラムで呼び出すことができることを知ってください:

/free
 ...
 crt_mbr('MY_LIB': 'MY_FILE': 'NEW_MEMBER');
 ...
/end-free

これにはエラー処理がまったくないことに注意してください。たとえば、ファイルにその名前のメンバーがすでに含まれている場合、プログラムはダンプします。必要に応じて、監視または別のエラー処理を追加します。

于 2013-02-21T17:57:55.727 に答える