2014-12-11 2 views
1

Факты:Как кодировать с переменной файлов Длина в Micro Focus COBOL

  1. Использование VMWARE
  2. Использование Micro Focus COBOL
  3. должны использовать Enterprise COBOL для г/OS компилировать говор
  4. Input является файловая переменная длина
  5. Попадая различные открытые ошибки

I ча кажется, не найти правильную комбинацию кода COBOL для обработки файла.

С моей программы:

SELECT SYSUT1-FILE ASSIGN TO SYSUT1 ORGANIZATION IS SEQUENTIAL 
ACCESS MODE IS SEQUENTIAL FILE STATUS IS SYSUT1-STATUS. 

FD SYSUT1-FILE DATA RECORD IS SYSUT1-RECORD RECORDING MODE is V 
    RECORD IS VARYING IN SIZE from 1 to 256 DEPENDING ON WS-RECORD-SIZE. 
01 SYSUT1-RECORD PIC X(256). 

DCB информация для файла: DS Org: PS Код Set: EBCDIC LRECL: 256 BLKSIZE: 00000 RECFM: VB

JCL:

// DLBL SYSUT1,'VDE.TAPE.PLUMW',0 
// DLBL SYSUT2,'TCP380.PLUMDATA',0 
// EXEC T3E2A380 

Обновленный код:

FD SYSUT1-FILE 
     BLOCK CONTAINS 00000 
     DATA RECORD IS SYSUT1-RECORD 
     RECORDING MODE is V 
     RECORD IS VARYING IN SIZE from 1 to 256 
     DEPENDING ON WS-RECORD-SIZE. 

    01 SYSUT1-RECORD      PIC X(256). 

Когда я использовал приведенный выше код, я получил статус 39 файла на открытии.

Затем я устал от него с использованием 252 байта и получил файл-статус-9/00041 (Коррумпированный индексный файл) на открытии.

+0

Можете вы добавить код, который вы пробовали на свой вопрос, и включить сообщения, которые вы получаете? Является ли VMWARE релевантным, вы получаете ошибки там? –

+0

Я выполняю программу в ESMAC (MICRO FOCUS) под VMWARE. Вот где я получаю ошибки открытия файла. – vealparm

+0

* MSG * T3E2A380 SYSUT1-Failure-OPEN ... * MSG * T3E2A380 File-Status-39 * MSG * T3E2A380 PROGRAM-IS-ABENDING ... – vealparm

ответ

0

Это работает:

FD SYSUT1-FILE 
    BLOCK CONTAINS 00000 
    DATA RECORD IS SYSUT1-RECORD 
    RECORDING MODE is V 
    RECORD IS VARYING IN SIZE from 1 to 252 
    DEPENDING ON WS-RECORD-SIZE. 

01 SYSUT1-RECORD      PIC X(252). 

Я только что собрали и запустить программу с, что в, чтение RECFM = VB, LRECL = 256 набора данных (вам не нужно так много нулей на BLOCK СОДЕРЖИТ , ноль равен нулю, но это не повредит).

Однако у меня нет доступа к z/VSE или к Micro Focus Workbench, эмулирующему эту ОС.

У вас есть простой, плоский последовательный файл, поэтому у вас нет коррумпированного индекса этого файла.

Вам необходимо проверить ваш файл сейчас. Можете ли вы «посмотреть» на содержимое этого файла в некотором роде? В противном случае найдите служебную программу, например SORT, и попробуйте использовать этот файл в качестве входного.

Если у вас есть сбой, попробуйте использовать другой файл VB (даже если вам нужно его сделать), на котором вы знаете, есть данные. Если это работает, попробуйте создать новый файл для вашей программы.

Если вы по-прежнему находитесь в никуда, это один из ваших сотрудников технической поддержки. При необходимости они свяжутся с Micro Focus.

Теперь ваше определение файла (SELECT и FD) работает, я могу ОТКРЫТЬ, ЧИТАТЬ и ЗАКРЫТЬ в программе COBOL.

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

Запуск z/VSE под эмуляцией микрофонов будет довольно редкими в эти дни. Я не думаю, что вы получите намного больше от SO.


Первым делом из вашей последней информации является то, что вы не используете z/OS, по крайней мере, когда вы запускаете свою программу. То есть DOS JCL, поэтому целевой ОС, вероятно, будет z/VSE. Не важно, наверное, просто стало неожиданностью. В наши дни не вижу много DOS JCL.

Как уже упоминалось, сейчас это просто. Ваш набор данных - VB, ваш LRECL - 256 (это четырехбайтовый RDW-файл 252 байта данных), и вы определили 256 байтов данных в 01 под вашим FD. Изменить что 252.

Вот что думает Enterprise COBOL IBM о файле состояния 39 (будет одинаковым для COBOL под управлением г/VSE):


ОТКР заявление было неудачным, так как конфликт был равен между фиксированными атрибутами файла и атрибутами
, указанными для этого файла в программе. Эти атрибуты включают в себя организацию файла
(последовательный, относительный или индексированный), основной ключ записи, альтернативные ключи записи , набор кодов, максимальный размер записи, тип записи (фиксированный или переменный), и блокирующий фактор .

Описание вашего фактического файла в JCL от Micro Focus не соответствует описанию файла в вашей программе. Сообщение охватывает множество ситуаций, и только знание того, что находится в вашем коде и как определяется фактический файл, может привести к разрешению.

Скорее всего, это «один файл - записи фиксированной длины, другой - записи переменной длины» или «один файл считает, что максимальная длина равна X, тогда как другая думает, что это Y».

Для максимальной длины записи помните, что, как вы уже должны были прочитать ниже, программа COBOL должна определять как максимальную длину только части данных (исключая RDW), но JCL должен определять максимальная длина включая RDW. То есть максимумы должны быть разными на четыре байта. Если LRECL не является явным в JCL, он получается из записи каталога для набора данных.

Вы должны иметь какой-то способ в своем «рабочем столе», чтобы определить характеристики файла и убедиться, что они соответствуют определению в программе (не забудьте включить RDW в программу).

Существует три способа указать COBOL, что у вас есть файл записей переменной длины. Все предполагают, что вы указали RECORDING MODE V в FD, но этого недостаточно.

Если файл содержит несколько макетов записей, по крайней мере один из которых имеет различную длину от других, то просто определение записей в FD будет указывать COBOL, что ваш файл содержит записи переменной длины.

FD .... 
01 RECORD-1 PIC X. 
02 RECORD-2 PIC XX. 

На мэйнфрейме IBM, каждая с переменной длиной записи предшествует записи Descriptor Word (RDW). Это, будучи детальностью реализации (как это достигается, не продиктовано стандартом COBOL), не входит в макет записи. В вашем фактическом файле будет LRECL (длина логической записи), которую делает, включая длину RDW (W означает Word, что означает четыре байта).

В приведенном выше примере LRECL может быть 6 (RDW + максимально возможная длина записи).

Если ваш файл содержит один тип записи, но эта запись может иметь разную длину из-за количества элементов, включенных в OCCURS, то достаточно просто включить запись-макет с OCCURS ... DEPENDING ON.

FD .... 
01 RECORD-1. 
    05 SOME-FIXED-LENGTH-DATA PIC X(200). 
    05 NUMBER-OF-ITEMS BINARY PIC 9(4). 
    05 FILLER 
     OCCURS 1 TO 10 TIMES 
     DEPENDING ON NUMBER-OF-ITEMS. 
     10 FIXED-DATA-IN-VARIABLE-AMOUNTS PIC X(10). 

Если ваши записи не имеют определенной фиксированной структуры (текст, XML, что угодно), тогда вам это нужно.

FD ... RECORD IS VARYING FROM minimum-length TO maximum-length 
     DEPENDING ON NUMBER-OF-BYTES-OF-DATA. 
01 RECORD-1      PIC X(maximum-length). 
... 
WORKING-STORAGE SECTION. 
01 NUMBER-OF-BYTES-OF-DATA BINARY PIC 9(4). 

минимальные и максимальные длины - это фактические цифры для ваших данных.

Если у вас READ этот файл, поле NUMBER OF OF BYT-DATA получит счетчик количества байтов данных в записи (исключая RDW).

Если вы хотите записать WRITE запись, вы установите NUMBER-OF-BY-OF-DATA количество байт данных, которое у вас есть перед WRITE, и все идет гладко (NUMBER-OF-BYTES-OF-DATA просто имя примера, сделайте ваше отношение к файлу).

+0

Я выполняю программу под управлением JCL Control (Micro Focus) внутри виртуальной машины (VMWARE). – vealparm

+0

Из моей программы: – vealparm

+0

@vealparm? Измените свой вопрос, чтобы добавить дополнительную информацию, как уже было запрошено, пожалуйста. –