Hallo Ralf,
ich denke, die Option mit dem Struct ist nur dafür gedacht, um zusätzliche Informationen zu einem normalen Datensatz zur Verfügung zu haben, oder wenn Datensätze komplett von einem selbst in L&L ausgegeben werden (mit PrintData).
Wir verwenden meistens, wenn wir keine richtigen Tabellen verwenden (können) die virtuellen DDs.
Dafür erzeugen wir in der DefineAllFields ein LLDo, fügen diesem die gewünschten Felder hinzu und füllen die Daten dann in der OnStartTable.
Code:
Procedure DefineAllFields
Handle hoDo
Boolean bRet
Forward Send DefineAllFields
Get CreateLLDo "Tabelle" to hoDo
Get AddField of hoDo "NummernFeld" LL_NUMERIC to bRet
Get AddField of hoDo "TextFeld" LL_TEXT to bRet
End_Procedure
Procedure OnStartTable Integer hoDDo Integer hoParentDdo Integer iTableLevel String sRelation
Variant[][] vaData
Move 1 to vaData[0][0]//NummernFeld
Move "Toller Text" to vaData[0][1]//TextFeld
...
Send SetLLDoData hoDDo vaData
End_Procedure
Im Report selbst verwenden wir dann die "Tabelle" (oder wie auch immer man sie genannt hatte), anstelle von "freier Inhalt".
DataFlex Reports hat auch ein ähnliches Konzept, dass sich Runtime DataSource nennt und ähnlich verwendet wird.
Allerdings gibt man in diesem Fall die Tabellen und Spalten bereits im Report an und diese werden dann vom "Integration Wizard" bereits zum Füllen in die "AddRDSData" Routine des Report Objektes eingefügt
Code:
// Note: The Runtime DataSource row will be rejected if:
// 1: The number of elements in the 2nd dimension does not match with the row layout
// 2: The data-type of any element in the 2nd dimension does not match, cannot be
// converted to the data-type defined in the row layout. For example: A zero date
//
Function AddRDSData String sTableName Integer iSibling Integer iLevel Returns Variant[][]
Variant[][] vData
Integer iRow
String sArt sSKUser
Number nWert
Move 0 to iRow
Case Begin
Case (iSibling = -1 and iLevel = 0 and sTableName = "Tabelle")
// ToDo: Modify the sample code to fill the RDS array for the table Tabelle
// The first dimension identifies the row, the second dimension identifies the column.
// Repeat
// Move Number to vData[iRow][0] // Name: NummernFeld, Length: 4, Datatype: Number
// Move String to vData[iRow][1] // Name: TextFeld, Length: 100, Datatype: String
// Increment iRow
// Loop
Case Break
Case End
Function_Return vData
End_Function