AS400 cpyf не копирует символьную запись

#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 для обоих файлов

Для ШИПОВЫХ метокСнимок экрана с метками-шипами 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 занимает другую позицию в принимающем файле.