Отображение субфайлов, загруженных с отсортированными записями базы данных

Допустим, например, у меня есть эти таблицы:

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 в третью строку субфайла, где идентификатор пользователя: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

В этом подфайле должны быть перечислены все время и время для выбранного дня и человека.

Как мне сделать эту программу????????? Особенно для первого подфайла.

2 ответа

База данных

Прежде всего, любой администратор базы данных скажет вам, что если вы создаете это с нуля, не используйте 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 для чтения данных в вашей программе. Сначала это может показаться более сложным, чем собственный ввод-вывод. Но когда вы узнаете об этом, вы увидите, что он более мощный, простой, быстрый и гибкий.

обработка

Основная концепция встраивания 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.)

Вы помещаете оператор SELECT (точнее, полный выбор) в оператор DECLARE CURSOR, который определяет, что система выдаст вам, когда вы ВЫБИРАЕТЕ из курсора. 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. Посмотрите под База данных / Ссылка. Информацию о файлах дисплея смотрите в Информационном центре в разделе Программирование / DDS / DDS для файлов дисплея,


Показать файл

Что касается вашего отображаемого файла, вам нужно будет определить как минимум два формата записи для каждого экрана субфайла - формат записи субфайла и формат записи управления субфайлом.

Запись подфайла предназначена для строки в списке. Это должно иметь SFL ключевое слово.

Запись управления подфайлом управляет экраном. Обычно он содержит заголовки экрана и заголовки столбцов для подфайла. Должно иметь SFLCTL(yoursubfilename), SFLSIZ(subfile-rows), SFLPAG(rows-per-page), нн SFLDSP, нн SFLDSPCTL, нн SFLCLR, нн SFLEND(*MORE)где nn представляет показатель кондиционирования. Как правило, вы хотите указать, что число строк подфайлов на 1 больше, чем число строк на странице. Также включите любые спецификации функциональных клавиш здесь.

Вы, вероятно, также хотите формат записи для нижней части экрана, чтобы сообщить пользователю, какие функциональные клавиши могут быть использованы. Если это так, используйте OVERLAY ключевое слово в контрольной записи подфайла.

обработка

1.) выключить SFLDSP а также SFLDSPCTL чтобы они не показывались на экране на данный момент. Включи SFLCLR включить создание пустого подфайла. Теперь ЗАПИШИТЕ запись управления подфайлом.

2.) Внутри цикла обработки строк из базы данных увеличьте номер записи подфайла и ЗАПИШИТЕ запись подфайла.

3.) Когда заполнение записей подфайлов завершено: включите SFLDSP а также SFLDSPCTL так что оба будут показаны. Выключи SFLCLR так что ваши записи подфайлов не будут стерты. Включи SFLEND так что он будет отображать "Больше..." внизу каждой страницы, кроме последней. НАПИШИТЕ свою справку. EXFMT ваша контрольная запись подфайла. Обработайте любые функциональные клавиши, как применимо.

@WarrenT дал отличный ответ, и даже если вы не предпочитаете SQL, вы можете использовать общую концепцию для загрузки и отображения подфайла. Большинство из нас узнали об этом через очень старую книгу под названием "Руководство по программированию дисплея приложений". Это не изменилось за 15 лет. Кроме того, я настоятельно призываю вас показать коллеге, как остальная часть вашей группы занимается программированием подфайлов. Есть почти наверняка проблемы стиля, которым вы хотите соответствовать.

Другие вопросы по тегам