Я никогда не копировал подфайл с массивом, хотя, полагаю, это было бы полезно, если бы у вас было более 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
, чтобы получить их в структуру данных ввода-вывода. Я также проверю переполнение подфайла rrn, если считаю, что в базе данных может быть более 9999 записей. Затем я выбрасываю сообщение subfile full
с указаниями для фильтрации набора записей.
Некоторые другие вещи, о которых вы не спрашивали, но я расскажу вам, поскольку вы спрашивали о передовых методах. Если для этого нет причины, я использую SFLCLR
для очистки подфайла и обычно загружаю весь подфайл за один раз, если не подозреваю, что будут тысячи записей. Многие из старых оптимизаций, таких как SFLNXTCHG
и загрузка по одной странице за раз, были введены в действие, потому что связь была медленной. Не столько связь по протоколу twinax, сколько контроллер рабочей станции ASCII или удаленные рабочие станции, которые часто находились на другой стороне линии связи, намного медленнее, чем twinax. Это больше не правда. Я склонен избегать тех старых хаков, предназначенных для сохранения пропускной способности, потому что они только усложняют код. Запишите все сразу, а при обработке прочитайте весь подфайл с циклом for
.
Кроме того, в будущем эти вопросы должны быть на Проверка кода , если у вас есть рабочий код, для которого вы хотите узнать о передовой практике, или, возможно, Разработка программного обеспечения , если вы больше интересуются теоретическими ответами. Переполнение стека больше для ответа на конкретные объективные вопросы.