我需要为我的RPG程序中的现有物理文件创建一个新成员。我知道有两种方式,我必须说,我不喜欢这两种方式:
QCMDEXC
拨打ADDPFM
ADDPFM
并从RPG调用第一个涉及将一个必须由QCMDEXC
解析的命令拼凑在一起,这听起来并不合适(我知道,这里的扩展部分不是调用,而是成员的创建) - 但令我困扰的是,我发现它并不简单,但相反却难以理解而且不是很美观。
第二个使用已编译的程序,因此不涉及仲裁和解析。此外,它在您的RPG代码中看起来并不可怕,因为它只是一个正常的过程调用。但我必须创建一个额外的外部程序,需要转移到我的RPG程序将被使用的所有系统。它也与我的美学感有冲突,为了进行一次api调用而创建了额外的源和二进制文件。
有没有办法直接调用api,没有QCMDEXC
?或者也许是另一种为PF创建新成员的RPGish方式?谷歌对我毫无帮助..
由于
答案 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包含该名称的成员,您的程序将转储。根据需要添加监控或不同的错误处理。