3

我需要为我的 RPG 程序中的现有物理文件创建一个新成员。我知道两种方法,我必须说,我都不喜欢:

  1. 用来QCMDEXC打电话给ADDPFM
  2. 编写一个 CL 程序,ADDPFM从 RPG 调用和调用它

第一个涉及将一个必须解析的命令组合在一起,该命令QCMDEXC听起来并不高效(我知道,这里的扩展部分不是调用,而是成员的创建)——但真正困扰我的是什么它,是我不觉得它直截了当,但相反很难理解,也不是很美。

第二个使用编译程序,因此不涉及连接和解析。此外,它在您的 RPG 代码中看起来并不那么可怕,因为它只是一个正常的过程调用。但是我必须创建一个额外的外部程序,需要将其转移到我的 RPG 程序将在其上使用的所有系统。它也有点与我的审美冲突,创建一个额外的源代码和二进制文件只是为了做一个 api 调用。

有没有办法直接调用api,没有QCMDEXC?或者也许是另一种为 PF 创建新成员的 RPGish 方式?谷歌对我一点帮助都没有。。

谢谢

4

2 回答 2

5

无法从 RPG 中直接创建物理文件成员。

您列出的选项很好。另一个是 system() API。如果这是一个新的应用程序,尽量避免多个成员;他们不是 SQL 的朋友。传统的多成员应用程序在调用 RPG 之前使用包装器 CL 来处理 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 程序中进行操作系统级别的工作。如果您愿意,可以编写一个特定的 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 回答