RPG III: как переопределить массив как отдельные поля, как вы можете в COBOL - PullRequest
0 голосов
/ 05 ноября 2011

в RPG III мне нужно хранить огромный массив в файле. Максимальная длина поля равна 256, поэтому я определил файл с 16 полями по 250 символов в каждом. Есть ли способ поместить 1000 значений массива в 16 полей без перемещения? Точно так же, как ОПРЕДЕЛЯЕТ в КОБОЛЕ?

массив в программе:

 E                    MPDV     1000  4   

Спецификация файла:

 D000001                                           1   4 WRPMOD 
 D000002                                           5 254 W01PDV 
 ... etc. until     
 D000017                                        37554004 W16PDV   

В Коболе я бы написал:

 01 MPDV-TOP.
     03 MPDV-ARR OCCURS 1000.
        05 MPDV PIC X(4).
  01 WRPREC REDEFINES MPDV-TOP.
     03 W01PDV PIC X(250).
     .... ETC. UNTIL
     03 W16PDV PIC X(250).

Читая файл, я получаю массив MPDV со своими значениями и со значениями в MPDV, я могу записать файл.

мое решение выглядит так: дополнительный массив

    E                    MPX        16250               MPDV REDEF   

и много ходов:

C                     MOVELMMEMOD    WRPMOD    
C                     MOVEAMPDV      MPX       
C                     MOVELMPX,1     W01PDV    
C                     MOVELMPX,2     W02PDV    
.... etc until
C                     MOVELMPX,16    W16PDV  
C                     WRITEWRPASM         

и наоборот для чтения.

Ответы [ 2 ]

4 голосов
/ 05 ноября 2011

Используйте Структура данных для наложения отдельных полей в главное поле:

IMPDV        DS                                      
I                                        1 250 W01PDV
I                                      251 500 W02PDV
I                                      501 750 W03PDV
                      . . .
I                                     37514000 W16PDV

Для получения дополнительной информации я рекомендую следующие ресурсы:

Информационный центр IBM i
Руководство программиста ILE RPG
Справочник по языку ILE RPG

Safari Books Online
Modern RPG IV Language

0 голосов
/ 07 ноября 2011

РПГ III? Куда, куда, намного лучше использовать RPG IV. На самом деле.

В RPG III метод структуры данных является хорошим. Есть другой способ решения проблемы. Определите файл более реалистично. Вместо произвольных размеров «кусков» массива определите каждое поле. Например, допустим, мы говорим о недельных показателях продаж и хотим сохранить ценность многих недель. Определите продажи каждой недели как отдельный столбец в таблице вместо того, чтобы просто составлять 250-байтовые символьные поля, которые фактически не отражают данные, хранящиеся в них.

В приведенном ниже примере я запрограммировал файл, но тот же метод работает и для внешних файлов. Я сделал только 10 столбцов, но вы можете увидеть, как это работает. В файле базы данных фактически определены подлинные столбцы. Это означает, что пользователи запросов, пользователи SQL (ODBC ... веб-приложения?) Могут получить доступ к фактическим данным, не прибегая к гимнастике приведения (substring ()).

Способ работы состоит в том, что определения в таблице базы данных копируются в структуру данных. В RPG структуры данных совместно используют хранилище, поэтому все, что вы определяете в столбцах с 1 по 10, может быть переназначено в другое поле, определенное в столбцах 1-10. Здесь мы отображаем весь массив продаж поверх отдельных столбцов продаж. Любое изменение ARY, 1 автоматически изменит WEEK01 и наоборот, потому что хранилище является общим - это точно такое же хранилище.

 E                    ARY        10 10 0              
 IDUMMY   AA  01                                      
 I                                        1  100WEEK01
 I                                       11  200WEEK02
 I                                       21  300WEEK03
 I                                       31  400WEEK04
 I                                       41  500WEEK05
 I                                       51  600WEEK06
 I                                       61  700WEEK07
 I                                       71  800WEEK08
 I                                       81  900WEEK09
 I                                       91 1000WEEK10
 I            DS                                      
 I                                        1  100WEEK01
 I                                       11  200WEEK02
 I                                       21  300WEEK03
 I                                       31  400WEEK04
 I                                       41  500WEEK05
 I                                       51  600WEEK06
 I                                       61  700WEEK07
 I                                       71  800WEEK08
 I                                       81  900WEEK09
 I                                       91 1000WEEK10
 I                                        1 100 ARY    
...