因此,我正在尝试对 IBM i 上的代码进行现代化改造,并且正在考虑子文件和打印文件。
排除本机 I/O 操作,我可以想到三种使用嵌入式 SQL 来填充数据的方法。
- 游标获取方法
- 一页记录数的MultiOccurance数据结构
- 包含多页数据的更大的 MultiOccurance 数据结构。
最佳实践方法是什么?有什么意见吗?
因此,我正在尝试对 IBM i 上的代码进行现代化改造,并且正在考虑子文件和打印文件。
排除本机 I/O 操作,我可以想到三种使用嵌入式 SQL 来填充数据的方法。
最佳实践方法是什么?有什么意见吗?
我从来没有用数组支持子文件,但我想如果你要拥有超过 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 更多的是用于回答特定的客观问题。
可能偏离主题,因为“主要基于意见”
但是 DS 阵列....越大性能越好...