Полную документацию по этому 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);
Это достаточно долго. Я оставлю вам решать, как определить полное имя файла и параметры кода ошибки.
Вам также придется приложить некоторые усилия, чтобы определить структуры, которые вы будете использовать, и спроектировать цикл для их получения.