是否可以从CL程序中的随机文件中检索记录?

时间:2012-09-15 10:31:48

标签: ibm-midrange

假设有一个物理文件,其名称传递给参数中的CL程序。鉴于关键字段名称和值存储在文件中并将通过RCVF读入,是否可以通过这种方式从文件中检索给定记录?我想以这种方式从该记录中提取字段的值。在编译时无法确定文件名,密钥列表和相应的键值。

我目前正在为我的开发人员开发一个实用工具。在所有功能中,其中之一是从文件中检索记录并检查其中一个字段的值。有几个文件需要检查(还有更多文件要来),它们都有不同的密钥。文件名,键列表和要返回的字段都存储在控制文件中。用户将从UI中选择文件,CL(或任何其他语言)将使用现有信息来检索字段值。

正如您所看到的,用法不是直接用于商业用途,但我仍然希望尽可能低地保持未来维护的难度。

6 个答案:

答案 0 :(得分:1)

DCLF语句在编译时与文件格式相关联。

理论上你应该能够在编译时使用通用文件而OVRDBF使用LVLCHK(*NO)来做你想要的但是它会抛出 CPF0859 ,除非编译-time文件的记录长度小于覆盖的文件。如果你这样做,虽然你最终截断了编译时长度以外的任何数据。

最简单的解决方案是使用程序描述文件在RPG中执行此操作。

答案 1 :(得分:1)

我推荐REXX。 REXX中的问题很简单。

它是一种动态脚本语言,包含在操作系统中很长时间,但却被广泛忽视。它允许您轻松编写CL和SQL脚本,并根据需要动态构建语句。 REXX擅长字符串处理和解析。事实上,在REXX中,一切都是字符串,即使它也是一个数值。

您可以传入文件的名称,关键字段,键值以及要检索的列的名称。这些参数可以组合成一个SQL语句,然后你去:)

请参阅REXX ReferenceREXX 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命令中。一些让你入门的想法:

  • 声明文件
  • 检索字段信息
  • 打开文件
  • 设置密钥
  • 检索记录
  • 从文件字段
  • 设置CL变量
  • 关闭文件