Как использовать API QDFRTVFD в программе RPGLE для получения заголовка в файле дисплея - PullRequest
2 голосов
/ 10 марта 2020

Как использовать API QDFRTVFD в программе RPGLE для получения заголовка в файле дисплея. Может ли кто-нибудь предоставить мне примеры RPGLE, которые используют этот API для получения заголовка из файла дисплея.

1 Ответ

4 голосов
/ 11 марта 2020

Полную документацию по этому API можно найти здесь . К сожалению, это очень сложный API, и для его полного описания даже до запрошенного вами уровня потребуется огромная стена кода, поэтому я дам вам описание того, как использовать API, с некоторыми примерами для извлечения. базовая информация, а остальное оставьте вам в качестве упражнения. Я буду использовать формат **free и приводить только отдельные примеры, поэтому ничего из этого не тестируется.

Первое, что нужно сделать, это определить все структуры данных, которые вам понадобятся в качестве основанных структур данных для описания данных, и буфер для хранения данных. Эту основанную структуру данных можно перемещать в буфере для наложения ее на данные, с которыми вы хотите работать.

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

**free
...
// Buffer
dcl-s buf           Char(32760);

// Base File Section
dcl-ds QDFFBASE     Qualified Based(pQDFFBASE);
  WDFFRETN          Int(10);
  WDFFSIZE          Int(10);
  WDFFINOF          Int(5);
  WDFFRCS           Int(5);
  WDFFDPAT          Char(1);
  WDFFFSCR          Int(5);
  WDFFSRSQ          Int(5);
  WDFFACCSID        Uns(5);
end-ds;
dcl-s pQDFFBASE     Pointer;

// Screen Size Table
dcl-ds QDFFSCRA     Qualified Based(pQDFFSCRA);
  WDFFSCIA          Int(5);
  *n                Char(4);
end-ds;
dcl-s pQDFFSCRA     Pointer;

// Sort Sequence Table
dcl-ds QDFFSSEQ     Qualified Based(pQDFFSSEQ);
  WDFFSST           Char(256);
  WDFFSSC           Uns(5);
  WDFFSSN           Char(10);
  WDFFSSL           Char(10);
  WDFFSSFL          Char(2);
  *n                Char(26);
end-ds;
dcl-s pQDFFSSEQ     Pointer;

Чтобы установить pQDFFBASE, используйте этот фрагмент:

pQDFFBASE = %addr(buf);

Вы можете дополнительно инициализировать базовый указатель pQDFFBASE с адресом buf, но вы можете сделать это только с одним указателем. Остальные рассчитываются как смещения и / или длины из этого указателя.

Для задания местоположения таблицы размеров экрана используйте:

pQDFFSCRA = pQDFFBASE + %len(QDFFBASE);

Это базовый указатель плюс длина Структура QDFFBASE, поскольку QDFFSRCA следует сразу же после этой структуры.

Чтобы установить местоположение таблицы последовательности сортировки, используйте:

pQDFFSSEQ = pQDFFBASE + qdffbase.wdffsrsq

Это базовый указатель плюс смещение (смещение) для сортировки таблица последовательности.

Может быть заманчиво просто рассчитать эти длины и смещения в вашей голове и жестко запрограммировать их в программе. Не делай этого! Если IBM изменит структуру, ваша программа может внезапно перестать работать должным образом. Это принимает несколько форм: во-первых, это может привести к sh, и теперь вам нужно определить, почему вы внезапно получаете ошибки несовместимости данных или ошибки указателя в программе, которая работала нормально. Во-вторых, и что еще более коварно, он может просто продолжать работать, потому что изменение API не привело к ошибкам несовместимости данных в полях, которые вы использовали, но вместо этого оно либо неправильно работает, либо выдает неправильный вывод.

Всегда используйте длины и смещения, указанные в возвращаемых данных с указателями, чтобы найти данные в буфере. Видите смещение к разделу заголовка файла в QDFFBASE? Используйте это.

Чтобы использовать данные в буфере, вы просто используете qdffbase.wdffsize, например, после того, как вы установили базовый указатель для структуры. Как только этот базовый указатель установлен, все элементы структуры становятся доступными. Перед установкой указателя любая попытка использовать структуру приведет к ошибке указателя.

Некоторые структуры, такие как таблица размеров экрана, имеют несколько записей в буфере. Для l oop через них вы можете использовать a для l oop следующим образом:

pQDFFSCRA = pQDFFBASE + %len(qdffbase);
for ix = 1 to qdffbase.wdffscr;
  // Do something with qdffscra.wdffscia
  pQDFFSCRA += %len(qdffscra);
endfor;

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

Чтобы вызвать программу, вам нужен только прототип:

dcl-pr QDFRTVFD  ExtPgm('QDFRTVFD');
  buffer         Char(327600) options(*varsize);
  bufferlen      Int(10) const;
  format         Char(8) const;
  qualname       Char(20) const;
  ec             Like(ec_t) options(*varsize);

Это вызывается с помощью:

QDFRTVFD(buf: %len(buf): 'DSPF0100': file: ec);

Это достаточно долго. Я оставлю вам решать, как определить полное имя файла и параметры кода ошибки.

Вам также придется приложить некоторые усилия, чтобы определить структуры, которые вы будете использовать, и спроектировать цикл для их получения.

...