0

因此,我正在尝试对 IBM i 上的代码进行现代化改造,并且正在考虑子文件和打印文件。

排除本机 I/O 操作,我可以想到三种使用嵌入式 SQL 来填充数据的方法。

  1. 游标获取方法
  2. 一页记录数的MultiOccurance数据结构
  3. 包含多页数据的更大的 MultiOccurance 数据结构。

最佳实践方法是什么?有什么意见吗?

4

2 回答 2

2

我从来没有用数组支持子文件,但我想如果你要拥有超过 9999 条记录,这将是一种有用的技术。相反,我总是从游标中读取它。事实上,混合 SQL 和过程使得填充子文件非常容易。如果对您有意义,您甚至可以使用多记录提取。这是一个简单的例子(单条记录获取):

dcl-proc LoadSubfile;
  dcl-pi *n;
    keyFields       Type;
  end-pi;

  dcl-ds sflin        LikeRec(sfl: *Input) Inz;

  ClearSubfile();
  OpenCursor(keyFields);
  dow FetchCursor(record);
    eval-corr sflin = record;
    PopulateHidden(sflin);
    rrn += 1;
    write sfl sflin;
  enddo;
  CloseCursor();
  rrnMax = rrn;
end-proc;

这里有一些没有定义的东西,例如FetchCursor()返回一个 Indicator = *On 如果一个记录被返回。并PopulateHidden()填充子文件记录中的隐藏字段。我在可编辑的子文件中使用隐藏来保存可以更改的字段的原始值。我将子文件字段定义为与记录字段相同,以便我可以eval-corr将它们放入 IO 数据结构中。如果我相信数据库中可能有超过 9999 条记录,我还将检查子文件 rrn 是否溢出。然后我抛出一条subfile full消息,指示过滤记录集。

其他一些你没有问的事情,但我会告诉你,因为你问了最佳实践。除非有避免的原因,否则我使用SFLCLR清除子文件,并且我一般一次加载整个子文件,除非我怀疑会有数千条记录。由于通信速度很慢,许多旧的优化(例如SFLNXTCHG一次加载单个页面)都已到位。与其说是双轴通信,不如说是 ASCII 工作站控制器或远程工作站,它们通常位于通信线路的另一端,比双轴慢得多。这不再是真的。我倾向于避免那些旨在保留带宽的旧技巧,因为它们只会使代码复杂化。for一次写整个东西,在处理时,用循环读取整个子文件。

此外,将来,如果您有工作代码并且想了解最佳实践,这些问题应该放在Code Review上,或者如果您对理论答案更感兴趣,可能会出现在软件工程上。Stack Overflow 更多的是用于回答特定的客观问题。

于 2018-07-03T11:27:41.863 回答
1

可能偏离主题,因为“主要基于意见”

但是 DS 阵列....越大性能越好...

于 2018-07-02T14:43:32.667 回答