1

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

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

如您所见,使用并非直接用于业务,但我仍然希望将以后的维护难度保持在尽可能低的水平。

4

6 回答 6

1

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

从理论上讲,您应该能够在编译时使用通用文件并OVRDBF执行LVLCHK(*NO)您想要的操作,但除非编译时文件的记录长度小于被覆盖的文件,否则它将抛出CPF0859 。如果你这样做,尽管你最终会截断超过编译时间长度的任何数据。

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

于 2012-09-15T16:28:21.570 回答
1

另一种动态方法是将文件名和关键字段名称作为变量传递到 QM 查询中。这可以通过 CL 完成,或者在 REXX 中更简单。

我对动态文件名使用通用 QM 查询,并使用动态数量的分组字段。

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 也会帮助您 ;-)

于 2012-09-17T05:30:15.457 回答
1

您希望将答案返回给您的 CL 程序。现在让我们假设您正在寻找的答案类型可以适合单个返回类型,比如说数字,但字符可以实现为备用接口。

您可以拥有一个 SQL ILE RPG 程序,该程序根据输入参数动态地准备其 SQL 语句,其中包括文件名、要使用的列名等。

于 2012-09-23T21:14:43.330 回答
1

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

它是一种动态脚本语言,多年来一直包含在操作系统中,但被广泛忽视。它允许您轻松编写 CL 和 SQL 脚本,如果您愿意,可以动态构建语句。REXX 擅长字符串处理和解析。事实上,在 REXX 中,一切都是字符串,即使它也是一个数值。

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

请参阅REXX 参考REXX 程序员指南

创建一个具有 type 的源成员REXX,并且不编译,而是使用STRREXPRC.

不是 REXX 命令或计算结果为字符串的语句在外部命令环境中执行。默认情况下,该环境是 CL,但您可以使用ADDRESS其他环境,尤其是 SQL。

于 2012-09-15T16:57:12.970 回答
0

听起来好像您想在 CL 中编写 DSPDTA。

CL 几乎没有实现这一点所需的一切,但 CL 很容易通过您编写的命令进行扩展。为此,编写几个 RPG 程序(以满足您的同事)来实现您需要的文件 I/O 功能。将这些 RPG 程序包装在您编写的 CL 命令中。一些帮助您入门的想法:

  • 声明文件
  • 检索字段信息
  • 打开文件
  • 设置密钥
  • 检索记录
  • 从文件字段设置 CL 变量
  • 关闭文件
于 2012-09-19T13:45:42.687 回答
0

是的,但为什么要这样做?根本问题是 CL 不适用于数据库操作,而像 RPG 这样的语言却是。当涉及到完全动态的文件操作时,RPG 和 CL 都有一个缺点:它们是强类型语言。这意味着您需要提前声明要从文件返回的数据类型。这对于真正的动态文件 I/O 来说有点问题。这个问题的经典答案(编译时未知的文件)是编写一个为您创建处理程序的工具。

为工具(可以而且应该是您编写的 CL 命令!)提供文件名、密钥结构、要检索的字段等,然后该工具使用适当的 API 从文件中提取字段定义,然后继续开始实际编写 CL 源代码,然后编译它,然后为您调用。据推测,这些不同文件中的字段或多或少会发生一些标准的业务处理;该工具也应该这样写。

于 2012-09-17T17:38:09.483 回答