假设有一个物理文件,其名称传递给参数中的CL程序。鉴于关键字段名称和值存储在文件中并将通过RCVF读入,是否可以通过这种方式从文件中检索给定记录?我想以这种方式从该记录中提取字段的值。在编译时无法确定文件名,密钥列表和相应的键值。
我目前正在为我的开发人员开发一个实用工具。在所有功能中,其中之一是从文件中检索记录并检查其中一个字段的值。有几个文件需要检查(还有更多文件要来),它们都有不同的密钥。文件名,键列表和要返回的字段都存储在控制文件中。用户将从UI中选择文件,CL(或任何其他语言)将使用现有信息来检索字段值。
正如您所看到的,用法不是直接用于商业用途,但我仍然希望尽可能低地保持未来维护的难度。
答案 0 :(得分:1)
DCLF
语句在编译时与文件格式相关联。
理论上你应该能够在编译时使用通用文件而OVRDBF
使用LVLCHK(*NO)
来做你想要的但是它会抛出 CPF0859 ,除非编译-time文件的记录长度小于覆盖的文件。如果你这样做,虽然你最终截断了编译时长度以外的任何数据。
最简单的解决方案是使用程序描述文件在RPG中执行此操作。
答案 1 :(得分:1)
我推荐REXX。 REXX中的问题很简单。
它是一种动态脚本语言,包含在操作系统中很长时间,但却被广泛忽视。它允许您轻松编写CL和SQL脚本,并根据需要动态构建语句。 REXX擅长字符串处理和解析。事实上,在REXX中,一切都是字符串,即使它也是一个数值。
您可以传入文件的名称,关键字段,键值以及要检索的列的名称。这些参数可以组合成一个SQL语句,然后你去:)
请参阅REXX Reference和REXX Programmer's Guide
创建类型为REXX
的源成员,但未编译,但使用STRREXPRC
进行解释。
不是REXX命令或计算为字符串的语句是在外部命令环境中执行的。默认情况下,该环境是CL,但您可以ADDRESS
其他环境,尤其是SQL。
答案 2 :(得分:1)
另一种动态方法是将文件名和键字段名称作为变量传递到QM查询中。这可以通过CL完成,或者在REXX中更容易完成。
我对动态文件名使用通用QM查询,动态数量为group by字段。
SELECT &FLDS, int(count(*)) AS TALLY
FROM &FILE
GROUP BY &FLDS
ORDER BY &FLDS
此查询是我创建的命令(称为VALUES)的基础,该命令列出了某个文件中给定字段(或多个字段)的值,以及它发生的频率。
VALUES FILE(CUSTMAST) FLDS('CTYPE')
VALUES FILE(CUSTMAST) FLDS('CSTATE, CTYPE')
第一个命令显示CUSTMAST表中CTYPE的所有值。接下来显示每种状态中每种类型的数量。
困难在于你如何将任何答案都还给你的CL。如果您对在屏幕上显示结果感到满意,这很好。或者您可以将输出定向到文件。但即使在这种方法中,REXX也会帮助你;-)
答案 3 :(得分:1)
您希望将答案返回给CL程序。我们现在假设您正在寻找的答案类型可以适合单个返回类型,例如数字,但字符可以实现为备用接口。
您可以拥有一个SQL ILE RPG程序,该程序根据输入参数动态PREPARE其SQL语句,其中包括文件名,要使用的列名等等。
答案 4 :(得分:0)
是的,但为什么会这样呢?基本问题是CL不是用于数据库操作,而是像RPG这样的语言。在完全动态的文件操作方面,RPG和CL都有缺点:它们是强类型语言。这意味着您需要声明要从文件提前返回的数据类型。这对于真正动态的文件I / O来说有点问题。这个问题的经典答案(编译时未知的文件)是编写一个为您创建处理程序的工具。
使用文件名,密钥结构,要检索的字段等提供工具(可以并且应该是您编写的CL命令!)然后该工具使用适当的API从文件中提取字段定义然后继续实际编写CL源,然后编译然后为你调用。据推测,这些不同文件中的字段会发生或多或少的标准业务处理;该工具也应该写出来。
答案 5 :(得分:0)
听起来好像你想在CL中编写DSPDTA。
CL缺少实现此目的所需的几乎所有内容,但CL很容易使用您编写的命令进行扩展。为此,编写几个RPG程序(以满足您的同事),实现您需要的文件I / O功能。将这些RPG程序包装在您编写的CL命令中。一些让你入门的想法: