如何从RPG程序创建新的文件成员?

时间:2012-06-01 14:42:50

标签: api ibm-midrange rpgle

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

  1. 使用QCMDEXC拨打ADDPFM
  2. 编写一个CL程序,调用ADDPFM并从RPG调用
  3. 第一个涉及将一个必须由QCMDEXC解析的命令拼凑在一起,这听起来并不合适(我知道,这里的扩展部分不是调用,而是成员的创建) - 但令我困扰的是,我发现它并不简单,但相反却难以理解而且不是很美观。

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

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

    由于

2 个答案:

答案 0 :(得分:4)

无法从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”。

答案 1 :(得分:0)

举一个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

请注意,这根本没有错误处理。如果是,例如文件allready包含该名称的成员,您的程序将转储。根据需要添加监控或不同的错误处理。