[GROUPED] [LINKCOUNTED] [STREAMED] DATASET( struct )
This form is only used as a Value Type for passing parameters, specifying function return types, or defining a SET OF datasets. If GROUPED is present, the passed parameter must have been grouped using the GROUP function. The LINKCOUNTED and STREAMED keywords are primarily for use in BEGINC++ functions or external C++ library functions.
Example:
MyRec := {STRING1 Letter};
SomeFile := DATASET([{'A'},{'B'},{'C'},{'D'},{'E'}],MyRec);
//Passing a DATASET parameter
FilteredDS(DATASET(MyRec) ds) := ds(Letter NOT IN ['A','C','E']);
//passed dataset referenced as "ds" in expression
OUTPUT(FilteredDS(SomeFile));
//*****************************************************************
// The following example demonstrates using DATASET as both a
// parameter type and a return type
rec_Person := RECORD
STRING20 FirstName;
STRING20 LastName;
END;
rec_Person_exp := RECORD(rec_Person)
STRING20 NameOption;
END;
rec_Person_exp xfm_DisplayNames(rec_Person l, INTEGER w) :=
TRANSFORM
SELF.NameOption :=
CHOOSE(w,
TRIM(l.FirstName) + ' ' + l.LastName,
TRIM(l.LastName) + ', ' + l.FirstName,
l.FirstName[1] + l.LastName[1],
l.LastName);
SELF := l;
END;
DATASET(rec_Person_exp) prototype(DATASET(rec_Person) ds) :=
DATASET( [], rec_Person_exp );
DATASET(rec_Person_exp) DisplayFullName(DATASET(rec_Person) ds) :=
PROJECT(ds, xfm_DisplayNames(LEFT,1));
DATASET(rec_Person_exp) DisplayRevName(DATASET(rec_Person) ds) :=
PROJECT(ds, xfm_DisplayNames(LEFT,2));
DATASET(rec_Person_exp) DisplayFirstName(DATASET(rec_Person) ds) :=
PROJECT(ds, xfm_DisplayNames(LEFT,3));
DATASET(rec_Person_exp) DisplayLastName(DATASET(rec_Person) ds) :=
PROJECT(ds, xfm_DisplayNames(LEFT,4));
DATASET(rec_Person_exp) PlayWithName(DATASET(rec_Person) ds_in,
prototype PassedFunc,
STRING1 SortOrder='A',
UNSIGNED1 FieldToSort=1,
UNSIGNED1 PrePostFlag=1) := FUNCTION
FieldPre := CHOOSE(FieldToSort,ds_in.FirstName,ds_in.LastName);
SortedDSPre(DATASET(rec_Person) ds) :=
IF(SortOrder='A',
SORT(ds,FieldPre),
SORT(ds,-FieldPre));
InDS := IF(PrePostFlag=1,SortedDSPre(ds_in),ds_in);
PDS := PassedFunc(InDS); //call the passed function parameter
FieldPost := CHOOSE(FieldToSort,
PDS.FirstName,
PDS.LastName,
PDS.NameOption);
SortedDSPost(DATASET(rec_Person_exp) ds) :=
IF(SortOrder = 'A',
SORT(ds,FieldPost),
SORT(ds,-FieldPost));
OutDS := IF(PrePostFlag=1,PDS,SortedDSPost(PDS));
RETURN OutDS;
END;
//define inline datasets to use.
ds_names1 := DATASET( [{'John','Smith'},{'Henry','Jackson'},
{'Harry','Potter'}], rec_Person );
ds_names2 := DATASET( [ {'George','Foreman'},
{'Sugar Ray','Robinson'},
{'Joe','Louis'}], rec_Person );
//get name you want by passing the appropriate function parameter:
s_Name1 := PlayWithName(ds_names1, DisplayFullName, 'A',1,1);
s_Name2 := PlayWithName(ds_names2, DisplayRevName, 'D',3,2);
a_Name := PlayWithName(ds_names1, DisplayFirstName,'A',1,1);
b_Name := PlayWithName(ds_names2, DisplayLastName, 'D',1,1);
OUTPUT(s_Name1);
OUTPUT(s_Name2);
OUTPUT(a_Name);
OUTPUT(b_Name);