数据库
首先,任何 DBA 都会告诉您,如果您是从头开始创建的,请不要使用 DDS 来定义您的文件。从长远来看,如果使用 SQL 定义它们会更好,如下所示:
CREATE TABLE USERMAST
(UserID char(7),
UserName char(25)
);
LABEL ON TABLE USERMAST is 'User Master Table';
CREATE TABLE WORKPERIOD
(UserID char(7),
WorkDay date,
StartTime time,
EndTime time
);
LABEL ON TABLE WORKPERIOD is 'User Work Periods';
请注意,这是使用实际数据和时间字段,而不是数字字段。这使得根据需要更容易操作。运行 SQL 时,您可以指定日期和时间格式的首选项,例如 *ISO、*DMY 或 *EUR。您可以将其视为以 *ISO 格式存储,但以您希望的任何格式提供给您。
无论您的文件(表)是在 DDS 还是 SQL 中定义的,您仍然应该使用嵌入式 SQL 来读取程序中的数据。起初,它可能看起来比原生 I/O 更复杂。但是当你了解它时,你会发现它更强大、更容易、更快、更灵活。
加工
嵌入 SQL 的基本概念实际上并不复杂。您的程序在自由格式的 ILE RPG 中可能是这样的(假设这是您正在使用的):
EXEC SQL DECLARE CURSOR c1 FOR your-select-statement;
EXEC SQL OPEN c1;
do while SQLSTATUS is ok;
EXEC SQL FETCH FROM c1 INTO :var1, :var2, ... ;
if SQLSTATUS is ok;
// process data
endif;
enddo;
EXEC SQL CLOSE c1;
通过检查 的前两个字符来检查数据结尾或其他问题SQLSTATE
。'00' 表示一切正常,'01' 是警告(可能不正常),其他一切都是错误。(这比使用更容易SQLCODE
。)
你在你的 DECLARE CURSOR 语句中放置了一个 SELECT 语句(更具体地说是一个全选),它决定了当你从游标中提取时系统会给你什么。SELECT 可以做很多强大的事情。在这里,它将从两个表中获取信息并为您汇总行。如果你只是总结,它可能看起来像这样:
SELECT userid, workday, min(starttime) as firsttime, max(endtime) as lasttime
FROM workperiod
GROUP BY userid, workday
如果您只是连接两个表中的数据,它可能如下所示:
SELECT u.userid, u.username, p.workday, p.starttime, p.endtime
FROM UserMast as u
JOIN WorkPeriod as p on u.userid = p.userid
将这些放在一起的首选方法是这样的:
WITH s as
( SELECT userid, workday, min(starttime) as firsttime, max(endtime) as lasttime
FROM workperiod
GROUP BY userid, workday
)
SELECT u.userid, u.username, s.workday, s.firsttime, p.lasttime
FROM UserMast as u
JOIN WorkPeriod as p on u.userid = s.userid
ORDER BY workday descending, username
FOR INPUT ONLY
有关使用 SQL 访问数据库的更多信息,请查看IBM i 信息中心。在数据库/参考下查看。有关显示文件的信息,请查看信息中心的 Programming / DDS / DDS for Display files,
显示文件
就您的显示文件而言,您需要为每个子文件屏幕定义至少两种记录格式——一种子文件记录格式和一种子文件控制记录格式。
子文件记录用于列表中的一行。它应该有SFL
关键字。
子文件控制记录管理屏幕。它通常包含子文件的屏幕标题和列标题。它应该有SFLCTL(yoursubfilename)
, SFLSIZ(subfile-rows)
, SFLPAG(rows-per-page)
, nn SFLDSP
, nn SFLDSPCTL
, nn SFLCLR
, nn SFLEND(*MORE)
,其中 nn 表示条件指示符。您通常希望指定 subfile-rows 比 rows-per-page 多 1。还包括此处的任何功能键规格。
您可能还需要屏幕底部的记录格式,以告诉用户可以使用哪些功能键。如果是这样,请OVERLAY
在子文件控制记录上使用关键字。
加工
1.)关闭SFLDSP
并SFLDSPCTL
防止它们暂时显示在屏幕上。打开SFLCLR
以启用创建空子文件。现在写入子文件控制记录。
2.)在循环处理数据库中的行中,增加子文件记录号,并写入子文件记录。
3.) 填写子文件记录后:打开SFLDSP
,SFLDSPCTL
这样两者都会显示。关闭SFLCLR
,以免您的子文件记录被清除。打开,SFLEND
以便它将在每个页面的底部显示“更多...”,除了最后一页。写下你的立足点记录。EXFMT 你的子文件控制记录。处理任何适用的功能键。