Отображение субфайлов, загруженных с отсортированными записями базы данных
Допустим, например, у меня есть эти таблицы:
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 лет. Кроме того, я настоятельно призываю вас показать коллеге, как остальная часть вашей группы занимается программированием подфайлов. Есть почти наверняка проблемы стиля, которым вы хотите соответствовать.