The second form of DICTIONARY is a value type with the structure parameter specifying the RECORD structure of the data. This data type usage allows you to specify a DICTIONARY as a child dataset, similar to the way DATASET may be used to define a child dataset. This may also be used to pass a DICTIONARY as a parameter.
Example:
ColorCodes := DATASET([{'Black' ,0 },
{'Brown' ,1 },
{'Red' ,2 },
{'Orange',3 },
{'Yellow',4 },
{'Green' ,5 },
{'Blue' ,6 },
{'Violet',7 },
{'Grey' ,8 },
{'White' ,9 }], {STRING color,UNSIGNED1 code});
ColorCodesDCT := DICTIONARY(ColorCodes,{Color,Code}); //multi-field key
ColorCodeDCT := DICTIONARY(ColorCodes,{Color => Code}); //payload field
CodeColorDCT := DICTIONARY(ColorCodes,{Code => Color});
//mapping examples
MapCode2Color(UNSIGNED1 code) := CodeColorDCT[code].color;
MapColor2Code(STRING color) := ColorCodeDCT[color].code;
OUTPUT(MapColor2Code('Red')); //2
OUTPUT(MapCode2Color(4)); //'Yellow'
//Search term examples
OUTPUT('Green' IN ColorCodeDCT); //true
OUTPUT(6 IN CodeColorDCT); //true
OUTPUT(ROW({'Red',2},RECORDOF(ColorCodes)) IN ColorCodesDCT); //multi-field key, true
//multi-field payload examples
rec := RECORD
STRING10 color;
UNSIGNED1 code;
STRING10 name;
END;
Ds := DATASET([{'Black' ,0 , 'Fred'},
{'Brown' ,1 , 'Seth'},
{'Red' ,2 , 'Sue'},
{'White' ,3 , 'Jo'}], rec);
DsDCT := DICTIONARY(DS,{color => DS});
OUTPUT('Red' IN DsDCT); //true
DsDCT['Red'].code; //2
DsDCT['Red'].name; //Sue
//inline DCT examples
InlineDCT := DICTIONARY([{'Black' => 0 , 'Fred'},
{'Brown' => 1 , 'Sam'},
{'Red' => 2 , 'Sue'},
{'White' => 3 , 'Jo'} ],
{STRING10 color => UNSIGNED1 code,STRING10 name});
OUTPUT('Red' IN InlineDCT); //true
InlineDCT['Red'].code; //2
InlineDCT['Red'].name; //Sue
InlineDCT['Red']; //Red 2 Sue
//Form 2 examples -- parameter passing
MyDCTfunc(DICTIONARY({STRING10 color => UNSIGNED1 code,STRING10 name}) DCT,
STRING10 key) := DCT[key].name;
MyDCTfunc(InlineDCT,'White'); //Jo
MyDCTfunc(DsDCT,'Brown'); //Seth
See Also: DATASET, RECORD Structure, INDEX, IN Operator