0

例如,假设我有这些表:

USRMF(主要物理文件)

User ID   User Name  
A00001    SAMUEL
A00002    ADAM

USRTS

user id   date   time in    time out
A000001   080812 084555     104545 
A000001   080812 120800     150000
A000001   080812 170000     180000
A000001   090812 084555     104545
A000001   090812 170000     180000
A000002   080812 084555     104545 
A000002   080812 120800     150000
A000002   080812 170000     190000
A000002   090812 084555     104545
A000002   090812 170000     190000

我的子文件应该看起来像这样:

Option:  5-display

OPT   User ID   User Name  Date   TimeIn  TimeOut
 _    A000001   SAMUEL     090812 084555  180000
 _    A000002   ADAM       090812 084555  190000
 _    A000001   SAMUEL     080812 084555  180000
 _    A000002   ADAM       080812 084555  190000

*此子文件显示每个用户和日期的摘要数据:第一次进入和最后一次退出。该名称应从其他数据库表 (USRMF) 中读取,并且应按考勤卡日期排序。

如果用户将选项 5 放在子文件的第三行,其中用户 id:A000001 用户名:samuel 和日期 090812,则将显示下一个子文件屏幕。

OPT   User ID   User Name  Date   TimeIn  TimeOut
 _    A000001   SAMUEL     080812 084555  104545 
 _    A000001   SAMUEL     080812 120800  150000
 _    A000001   SAMUEL     080812 170000  180000

该子文件应列出所选日期和人员的所有进出时间。

我该怎么做这个程序????????? 特别是对于第一个子文件.???????

4

2 回答 2

5

数据库

首先,任何 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.)关闭SFLDSPSFLDSPCTL防止它们暂时显示在屏幕上。打开SFLCLR以启用创建空子文件。现在写入子文件控制记录。

2.)在循环处理数据库中的行中,增加子文件记录号,并写入子文件记录。

3.) 填写子文件记录后:打开SFLDSPSFLDSPCTL这样两者都会显示。关闭SFLCLR,以免您的子文件记录被清除。打开,SFLEND以便它将在每个页面的底部显示“更多...”,除了最后一页。写下你的立足点记录。EXFMT 你的子文件控制记录。处理任何适用的功能键。

于 2012-08-12T16:03:05.173 回答
0

@WarrenT 提供了一个很好的答案,即使您不喜欢 SQL,您也可以使用一般概念来加载和显示子文件。我们大多数人学习的方式是通过一本非常古老的书,叫做Application Display Programming guide。15年没变。除此之外,我强烈建议您让一位同事向您展示您小组的其他成员如何进行子文件编程。几乎可以肯定,您想要遵守的风格问题。

于 2012-08-13T14:00:49.657 回答