2014-02-20 3 views
5

Я читал около 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.

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

ответ

3

Структуры данных РПГ представляют собой карты памяти. Они определяют способ группировки и перекрытия переменных определенным образом в памяти. Вот почему, если вы 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; 

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

+0

Интересно, если не может быть способом сделать это без явного указания каждого подпола (* материал * и * режущего *) во вторичных структурах данных (например. * BoxCosts *). Было бы неплохо, если бы производные структуры данных автоматически унаследовали любые поля, добавленные к оригиналу. Возможно, это еще одна работа для «умных» тетрадей. – WarrenT

+0

Спасибо, что помогли мне понять мои варианты. Есть так много, чтобы учиться и так мало примеров того, что я пытаюсь сделать ... очень сложно думать за пределами ООП (для меня все равно). –

2

Вы можете выполнить свою задачу, если хотите использовать 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' 
); 
+0

Конечно, если вы хотите * метод * наследования, это будет более жесткая гайка, чтобы взломать, lol. Может, когда-нибудь, да? – WarrenT

+0

В настоящий момент это чувствует * бит * оптимистично ...Благодарю вас за ваш ответ, хотя я и не подумал об этом. –

+0

Может быть, немного оптимистично. Затем снова Бьярне Страуструп снял его с помощью C, поэтому мы * могли бы сказать, почему не с RPG? У нас есть способы имитации элементарных характеристик классов, таких как инкапсуляция процедур (методов) и структур данных в служебную программу. Наследование, вероятно, является следующей ключевой функцией, и, как вы только что видели, мы можем (вроде) сделать это с помощью структур данных. Методы будут следующими. Отражение может быть приятным. Я не думаю, что эти вещи неизбежно недостижимы, если мы вложим в это мысли и усилия. – WarrenT

Смежные вопросы