#file #command #ibm-midrange
#файл #команда #ibm-средний уровень
Вопрос:
Я пытаюсь скопировать все записи из файла данных (STUDMARKS) в мой физический файл (MARKS), используя команду CPYF.
A R MARKSR TEXT('Marks Records')
A STUDENTID 9S 0 COLHDG('Student' 'ID')
A COURSE_CD 6A COLHDG('Course' 'Code')
A FINAL_MARK 3S COLHDG('Final' 'Mark')
A DATERUN L COLHDG('Date' 'Run')
A K STUDENTID
A K COURSE_CD
Это то, что у меня сейчас есть в моем MARKS.pf. В файле STUDMARKS.pf-dta уже определены первые три записи, запись DATERUN заполняется датой использования.
CPYF FROMFILE(IBC233LIB/STUDMARKS) TOFILE(DS233B32/MARKS) MBROPT(*REPLACE) FMTOPT(*MAP *DROP)
Приведенная выше команда CPYF, которую я запустил после создания MARKS.pf , и после выполнения RUNQRY для просмотра всех записей я заметил, что все, кроме COURSE_CD, были заполнены. COURSE_CD полностью пустой.
Я заранее провел некоторое исследование и выполнил DSPFFD для обоих элементов, чтобы убедиться, что длина и типы записей были одинаковыми, какими они и были. Однако я заметил, что в STUDMARKS.pf-dta все записи имели длину буфера, эквивалентную длине поля. Поле STUDENTID в MARKS.pf был единственным, кто не использовал это свойство, где длина поля равна 9, но длина буфера всего 5. Я не уверен, что это причина, по которой у меня возникают такие трудности, и дело почти наверняка не в том, как я это представляю, но я занимаюсь этим уже довольно давно и, похоже, просто не могу скопировать записи от одного участника к другому.
Это невероятно расстраивает, и мы были бы очень признательны за помощь
Я сделал снимки экрана команд DSPFFD для обоих файлов
Для ШИПОВЫХ меток
И для МЕТОК
РЕДАКТИРУЮ Только сейчас, вижу орфографическую ошибку! Бьюсь головой о стол, но я почти гарантирую, что это проблема. Все ваши ответы были очень информативными и полезными, поэтому большое вам спасибо
ОТРЕДАКТИРОВАНО для других, несмотря на то, что я изменил имена при перекомпиляции программы, она не будет работать, если вы сначала не удалите файл, а ЗАТЕМ НЕ скомпилируете его. Очень неприятно, но так оно и есть…
Итак DLTF [file name]
, а затем перекомпилируйте
Комментарии:
1.
COURSE_CD is completely blank.
Учитывая то, что вы показали и описали, нет причин, по которым это должно произойти. Вероятно, элемент packed / zoned, отмеченный @JamesA, но он не должен иметь указанного эффекта. Все значения должны быть скопированы и преобразованы («сопоставлены»), поскольку типы и размеры совместимы. В частности,COURSE_CD
не должно быть пустым (и значения вSTUDENTID
должны совпадать в обоих файлах независимо от упаковки / зонирования). В вопросе чего-то не хватает.2. Проверьте журнал заданий, есть ли какие-либо диагностические сообщения.
Ответ №1:
Как отметил Джеймс, различия в длине буфера для STUDENTID обусловлены тем, что в одном файле он определен как упакованный, а в другом — как зонированный.
Это не будет иметь значения для CPYF, поскольку оба являются совместимыми числовыми, и CPYF будет сопоставляться между ними, как вы видели.
Однако это доказывает, что разница между двумя файлами заключается не только в отсутствующем поле. Используйте DSPFFD и посмотрите в post определения COURSE_ID из обоих файлов.
Готов поспорить, что либо имена разные, либо типы разные.
Ответ №2:
То, с чем вы сталкиваетесь, — это разница между упакованным десятичным полем и полем со знаком.
Скорее всего, вы забыли указать тип данных в позиции 35 спецификации DDS для STUDENTID
поля в MARKS
файле.
Например:
A STUDENTID 9S 0 COLHDG('Student' 'ID')
Data Field Buffer Buffer Field Column
Field Type Length Length Position Usage Heading
STUDENTID ZONED 9 0 9 1 Both Student
ID
A STUDENTID 9 0 COLHDG('Student' 'ID')
Data Field Buffer Buffer Field Column
Field Type Length Length Position Usage Heading
STUDENTID ZONED 9 0 5 1 Both Student
ID
A STUDENTID 9P 0 COLHDG('Student' 'ID')
Data Field Buffer Buffer Field Column
Field Type Length Length Position Usage Heading
STUDENTID PACKED 9 0 5 1 Both Student
ID
Объяснение такого поведения можно найти в справочнике DDS в разделе Тип данных для физических и логических файлов (позиция 35):
Для физических файлов, если вы не указываете тип данных или дублируете его из поля, на которое ссылается ссылка, операционная система присваивает следующие значения по умолчанию:
- A (символ), если десятичные позиции с 36 по 37 пусты.
- P (упакованное десятичное число), если десятичные позиции с 36 по 37 содержат число в диапазоне от 0 до 63.
Поскольку типы данных различны, FMTOPT(*MAP *DROP)
сообщает CPYF
команде отключить удаление и использовать по умолчанию все несовпадающие поля.
Странно то, что описание поля файла определяет поле как ЗОНИРОВАННОЕ, когда оно действительно ЗАПОЛНЕНО.
Комментарии:
1. Несмотря на то, что это была оплошность с моей стороны, вы предоставили много информации, которая, несомненно, поможет мне в будущем! Спасибо
2. Для записи (и, следовательно, для любых будущих читателей, столкнувшихся с этим вопросом), этот ответ объясняет разницу в длине буфера между двумя полями (также известными как столбцы), определенными с одинаковой точностью; но это не имеет абсолютно никакого отношения к основной проблеме, с которой столкнулся OP. На этот счет Чарльз дал правильный ответ.
Ответ №3:
Значение *DROP для параметра FMTOPT исключает похожие именованные поля, которые не имеют одинакового атрибута и относительного положения в обоих файлах. Поле COURSE_CD занимает другую позицию в принимающем файле.