小编Mik*_*ica的帖子

如何避免服务程序中出现意外的过程名称冲突?

使用来自著名的学概念IBM红纸在RPG异常和错误处理,我已经写了一个服务程序QGPL/ERRFUNC实现像可重用的错误功能Assert,Throw,ThrowMsg,Rethrow,和GetErrorMsg.我一直在几个不同的程序中使用它们,并且它们一直运行良好.

刚才,我Throw在RPG ILE程序中使用了该函数,该程序还静态调用access与IFS文件系统上的流文件一起使用的C风格函数.该程序将无法使用"为符号Throw多次提供定义"的绑定错误进行编译.据我所知,使用编译时你不能绑定细节CRTBNDRPG的命令,但我无法评论我的H DFTACTGRP(*NO)规格,然后编译使用CRTRPGMOD,随后CRTPGM与附加参数DETAIL(*EXTENDED).这将打印出一个广泛的列表,列出了编译器在确定静态绑定到哪些过程时所查看的所有过程名称.这揭示了"投掷"的双重定义.在72页面列表的深处,QJVAJNI引用了IBM提供的服务程序(Java Native Interface),它包含一个名为"Throw"的导出过程.

现在最简单的解决方法就是简单地重命名我的"Throw"程序,修改并重新编译我的服务程序,然后修改并重新编译引用它的所有程序.我可能会遵循这个解决方案,但这种行为引发了一些令人不安的问题:

  1. 为什么C风格的IFS函数使用Java本机接口来完成其工作?我看到的像服务计划进口QC2IFSQC2POSIX那完全意义的上下文.看起来IBM在这里引入了一个我们不得不忍受的意外依赖.我确定它是引用它的C服务程序之一,QJVAJNI因为当我注释掉access函数调用时,QJVAJNI不会引用它.QJVAJNI服务程序的引用可能是多层深度,这意味着导入导入的导入.

  2. 为什么粘合剂通过服务程序导入如此彻底地递归?绑定器看起来像遍历每个服务程序使用的每个导入,无论该程序是否使用该导入以及绑定的子过程.这有必要吗?是否可以递归检查每个级别使用的导入?有没有办法改变这种行为?

  3. 如果对于上述两个问题没有什么可以做的,这是否意味着为了保证绑定始终有效(特别是对于"通用"函数,如错误处理),必须确保没有任何其他导出过程在同一台机器上的任何地方?我不知道任何像名称空间这样的设施可以缓解这个问题.据我所知,ILE编译器不使用其他平台在这种情况下可能使用的任何方法,如重载或名称修改.开始"非正式命名空间"是一种很好的做法,就像我可以看到一些C导出(例如_C_NEU_IFS_feof)以防止名称冲突一样?或者,有没有办法在发布服务程序之前搜索计算机上的所有导出过程以查找所需的名称?

  4. IBM红皮书的作者是ILE编程领域的一些重量级人物.他们像我一样命名了他们推荐的出口之一"投掷"(尽管有不同的参数列表).他们遇到了类似的问题吗?他们有不同的方法来解决名称冲突吗?

我发现有*DUPPROC一个可以指定的选项CRTPGM,但我不确定这是个好主意.文档说"当允许多个重复过程时,与导入请求匹配的指定模块和服务程序列表中的第一个导出过程是所选的过程." 你能确定哪个符号将成为列表中的第一个吗?订单是否严格定义?

rpgle ibm-midrange static-binding

7
推荐指数
1
解决办法
290
查看次数

我在哪里可以获得像 IROTVIEW 这样的运行对象表查看器?

曾几何时,Windows SDK(或 Visual Studio)有一个名为 IROTVIEW 的工具,用于枚举运行对象表 (ROT)

我现在在哪里可以得到这个工具?

com ole running-object-table

5
推荐指数
1
解决办法
4869
查看次数

您可以使用RPG将其他行附加到打印机文件吗?

有没有一种方法可以在打印机文件的末尾附加其他行?我用于创建打印机文件的大多数技术(RPG O规范,写入外部定义的文件)都会使您每个程序只有一个输出文件。我想在一个程序或过程中写一些行,然后让另一个程序或过程打开文件并写其他行。

特定的用例是具有一个“订单标题”,该“订单标题”对于多个报表是相同的,而下面的行项目数据是特定于报表的。我想我可以将所有这些都保存在一个大型程序中,而报表的变体位于单独的RPG子例程中,但是我喜欢从多个不同程序中调用通用标头的模块化,并且将来可能还会有其他报告。

系统的体系结构可能会阻止这种技术,因为我不清楚如何保持文件打开并通过它,或者如何打开已经放入出队列的关闭文件。我过去曾经使用过CPYSPLF,虽然我可能可以使用它来读取以前编写的内容,但是创建一个文件,关闭它,将其复制到QTEMP,读取它,然后将其重新写入另一个文件中似乎毫无意义。然后删除第一个打印机文件。也许还有其他我没有想到的方法。

rpgle ibm-midrange

2
推荐指数
1
解决办法
79
查看次数

Rpgle双字节问题

以下代码有问题: -

C                   eval      aaCHNO=%ucs2('0000000000')        
C**                 move      w_Chano       aaCHNO              
C                   Evalr     aaCHNO= %ucs2(%editc(w_Chano:'X'))
Run Code Online (Sandbox Code Playgroud)

定义:

AACHNO            Char(10) CCSID(1200)  
W_CHANO           Packed(6,0)  
Run Code Online (Sandbox Code Playgroud)

在AACHNO期待: - 0000123456但得到'bbbb123456'其中b =空白为什么?

我如何得到我想要的结果?欢呼,杰姆鲁格

rpgle ibm-midrange

1
推荐指数
1
解决办法
97
查看次数

如何让RPGLE程序将SQL警告和错误写入作业日志?

好像我记得编写一个使用嵌入式SQL的RPG程序,只要发生SQL警告或错误,它就会向交互式用户作业日志写入消息.我没有明确写出来; 它默认记录.

我现在写的程序没有进行此日志记录,虽然我知道我可以引起类似警告01003和错误02000,并使用SQLState变量读取它们.

我不认为我想象这种行为.是否有我忘记设置的H spec关键字,我调用程序的方式(使用CALL交互式),我编写SELECT INTO语句的方式(静态而不是动态)?我对其他想法感到茫然.

rpgle embedded-sql db2-400 ibm-midrange

0
推荐指数
1
解决办法
121
查看次数