Расширить шаблонную структуру данных (наследование)

Я читал о LIKEDS, TEMPLATE и BASED, пытаясь определить, есть ли способ создавать шаблоны структуры данных (прототипы) с наследованием. У меня есть:

D costs           DS                  QUALIFIED TEMPLATE
D  material                      6  0
D  cutting                       6  0
D  ...etc...

D boxCosts        DS                  LIKEDS(costs)
D  folding                       6  0
D  ...etc...

D posterCosts     DS                  LIKEDS(costs)
D  laminating                    6  0
D  ...etc...

Где я хочу, чтобы boxCosts выглядел так:

boxCosts:
  material
  cutting
  folding
  etc. (no laminating, this isn't a poster)

Есть ли способ получить этот тип шаблона структуры данных? Я знаю, что мог бы сделать:

D boxCosts        DS                  
D  common                             LIKEDS(costs)
D  folding                       6  0
D  ...etc...

Но это создает иерархию, когда мне нужна плоская структура.

Возможно, я мог бы сделать это с помощью тетради, но я не знаю, будет ли хуже иметь тетрадь только для тех частей структуры данных, которые я хочу в своем собственном файле, или иметь потенциально сложную условную тетрадь для всего приложения. что есть небольшая область для копирования этой информации...? Шаблоны настолько близки к тому, что я хочу, что я подозреваю, что просто что-то упускаю.

Если вам интересно, ошибка компиляции, которую я получаю при попытке создать унаследованную структуру данных, как я показал, это RNF3703: The subfield or parameter definition is not specified within a group. в первой спецификации D под ключевым словом LIKEDS.

Спасибо за чтение.


person Sarah Kemp    schedule 20.02.2014    source источник


Ответы (2)


Структуры данных RPG — это карты памяти. Они определяют способ группировки и перекрытия переменных определенным образом в памяти. Вот почему, если вы LIKEDS() получаете иерархию - компилятор копирует иерархию из шаблона в место назначения.

Есть по крайней мере один способ сгладить структуру:

 d costs           ds                  template
 d  t_material                    6s 0
 d  t_cutting                     6s 0

 d box           e ds                  extname(boxcosts) prefix(t_) template

 d boxCosts        ds                  qualified
 d  material                           like(t_material)
 d  cutting                            like(t_cutting)
 d  folding                            like(t_folding)

   boxCosts.cutting = 1;
   boxCosts.folding = 2;

Первая структура определена в программе; второй основан на файле. Я сделал это только для того, чтобы показать два разных способа определения подполей.

person Buck Calabro    schedule 21.02.2014
comment
Интересно, не существует ли способа сделать это без явного указания каждого подполя (материал и резка) во вторичных структурах данных (например, boxCosts< /я>). Было бы неплохо, если бы производные структуры данных автоматически наследовали любые поля, добавленные к оригиналу. Может, это очередная работа для умных прописей. - person WarrenT; 04.03.2014
comment
Спасибо, что помогли мне понять мои варианты. Так много нужно узнать и так мало примеров того, что я пытаюсь сделать... очень сложно мыслить вне ООП (во всяком случае, для меня). - person Sarah Kemp; 05.03.2014

Вы можете достичь своей цели, если хотите использовать SQL для решения проблемы. Хотя структуры данных ILE RPG не имеют наследования, таблицы SQL могут имитировать это.

CREATE TABLE costs
(material    num(6,0)  
,cutting     num(6,0)  
);

CREATE TABLE boxCosts
(      LIKE  costs  
,folding     num(6,0)
,sealing     num(6,0)
);

CREATE TABLE postrCosts
(      LIKE  costs
,laminating  num(6,0)
);

Если все, что вас волнует, это имена полей и определения, этот метод может подойти, и все, что вам нужно для использования этих структур в RPG, будет

D boxCosts      E DS                  EXTNAME(boxCosts)

D posterCosts   E DS                  EXTNAME(postrCosts)

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

CREATE TABLE costs
(material    num(6,0)  
,cutting     num(6,0)  
);

LABEL ON COLUMN costs
(material    text is 'Material Costs'
,cutting     text is 'Cutting Costs'
);

CREATE TABLE boxCosts as
(SELECT * 
     FROM costs
) with no data
;
ALTER TABLE boxCosts 
  ADD COLUMN folding  num(6,0)
  ADD COLUMN sealing  num(6,0)
;
LABEL ON COLUMN boxCosts 
(folding     text is 'Folding Costs'
,sealing     text is 'Folding Costs'
);
person WarrenT    schedule 03.03.2014
comment
Конечно, если вы хотите наследование method, это будет более крепкий орешек, лол. Может быть, когда-нибудь, да? - person WarrenT; 04.03.2014
comment
На данный момент это кажется немного оптимистичным... спасибо за ваш ответ, я не подумал об этом. - person Sarah Kemp; 05.03.2014
comment
Возможно, немного оптимистично. Затем снова Бьерн Страуструп справился с C, так что мы могли сказать, почему не с RPG? У нас есть способы имитации элементарных свойств классов, например, инкапсуляция процедур (методов) и структур данных в сервисную программу. Наследование, вероятно, является следующей ключевой возможностью, и, как вы только что видели, мы можем (вроде) сделать это со структурами данных. Методы будут следующими. Отражение может быть хорошим. Я не думаю, что эти вещи обязательно недостижимы, если мы приложим к этому некоторые мысли и усилия. - person WarrenT; 05.03.2014
comment
Интерфейсы @WarrenT уже доступны в RPG, см. github.com/OSSILE/ OSSILE/tree/master/code_examples/rpg/ . Использование этой техники для наследования методов — это еще один шаг вперед. - person Mihael; 12.09.2017