EntityList-Aggregation
Informationen
- Kategorien: Kernel
- Version: EA.11761
- Veröffentlichungsdatum: Montag, 11. März 2019
- Entwickler: Schulze
- Benötigt Datenbankänderung: Nein
- Betreff: EntityList-Aggregation
Beschreibung
Für die Ausführung von Aggregat-Funktionen auf der Datenbank wurden für die Klassenformeln [1] und im Webservice [2] jeweils eine Funktion bereitgestellt:
[1] GetAggregatedValues [2] SelectEntityListAggregation
Zur Verfügung stehen Sum, Avg, Max, Min und Count.
In beiden Funktionen muss obligatorisch eine Klasse und ein Filter angegeben werden. Optional kann eine oder mehrere Gruppierungen vorgegeben werden.
Der Filter in [1] wird als Datei vorgegeben, Filter-Parameter können zur Laufzeit beim Funktionsaufruf übergeben werden. Die Auswahl-Möglichkeiten für dei Aggregat-Funktionen stehen als Symbolische Konstanten unter #System.Database.AggregationFct zur Verfügung. Die Ergebnisse werden spaltenweise in den entsprechenden Arrays zurückgegeben.
Der Filter in [2] wird analog wie in der Funktion SelectEntityListHandle als Liste mit einem oder mehreren von BaseFilter- abgeleiteten Instanzen (SimpleClassFilter, ServerFileFilter, ExtendedFilter) angegeben. Zusätzlich kann in [2] noch eine Where-Klausel (SqlCondition) mitgegeben werden. Die Ergebnisse werden zeilenweise in Records zurückgegeben.
Bilder
Beispielcode
// Klassenformel (Fat-Client)
oncallfunction
{
var int $nRow, $arrValueCount_Hourly_wage[];
var double $arrValueAvg_Hourly_wage[], $arrValueMax_Hourly_wage[];
var date $arrValueMin_Employed_from[];
var string $arrGroupGender[], $arrGroupTitle[];
var string $sMsg;
GetAggregatedValues(
// Class
descr_of(::Employee),
// Aggregations
#System.Database.AggregationFct.Count, descr_of(:Hourly_wage), $arrValueCount_Hourly_wage,
#System.Database.AggregationFct.Avg, descr_of(:Hourly_wage), $arrValueAvg_Hourly_wage,
#System.Database.AggregationFct.Max, descr_of(:Hourly_wage), $arrValueMax_Hourly_wage,
#System.Database.AggregationFct.Min, descr_of(:Employed_from), $arrValueMin_Employed_from,
// Group By Clauses
#System.Database.Aggregation.GroupBy, descr_of(:ref_salutation.Name), $arrGroupGender,
#System.Database.Aggregation.GroupBy, descr_of(:ref_title.Name), $arrGroupTitle,
// Filter File
GetPath( #System.File.Area.System, #System.File.Section.Filter,"System\\EmployeeHourlyWage", "flt", #System.File.Mode.Read )
); // end GetAggregatedValues
// Ausgabe
$sMsg = "ref_salutation.Name|ref_title.Name|Hourly_wage|Hourly_wage|Hourly_wage|Employed_from\n";
$sMsg = $sMsg + "GroupBy |GroupBy |Count |Avg |Max |Min\n";
$sMsg = $sMsg + "------------------------------------------------------------------------------------\n";
for ( $nRow=0; $nRow<GetSize($arrGroupGender); $nRow++ )
{
$sMsg = $sMsg + StrFormat( "{0,-19}|{1,-14}|{2,-11}|{3,-11}|{4,-11}|{5,-13}\n",
$arrGroupGender[$nRow],
$arrGroupTitle[$nRow],
$arrValueCount_Hourly_wage[$nRow],
$arrValueAvg_Hourly_wage[$nRow],
$arrValueMax_Hourly_wage[$nRow],
$arrValueMin_Employed_from[$nRow] );
}
MessageBox( $sMsg );
}
// C# (Webservice-Client)
void SelectEntityListAggregation(Session s, ModelClient svc)
{
var request = new SelectEntityListAggregationRequest
{
SessionID = s.Id,
RequestData = new EntityListAggregationRequest
{
// class
Classname = "Employee",
// filter
FilterList = new List<BaseFilter>
{
new SimpleClassFilter{ Classname = "Employee" }
},
// sql, optional
SqlCondition = "Active=1",
// aggregation
AggregationDescriptorList = new List<EntityAggregationDescriptor>
{
new EntityAggregationDescriptor
{
AttributeName = "Hourly_wage",
AggregationFunction = EntityAggregationDescriptor.AGGREGATIONFUNCTION.eCount
},
new EntityAggregationDescriptor
{
AttributeName = "Hourly_wage",
AggregationFunction = EntityAggregationDescriptor.AGGREGATIONFUNCTION.eAvg
},
new EntityAggregationDescriptor
{
AttributeName = "Hourly_wage",
AggregationFunction = EntityAggregationDescriptor.AGGREGATIONFUNCTION.eMax
},
new EntityAggregationDescriptor
{
AttributeName = "Employed_from",
AggregationFunction = EntityAggregationDescriptor.AGGREGATIONFUNCTION.eMin
}
},
// group by, optional
GroupByDescriptorList = new List<String>
{
"ref_salutation.Name",
"ref_title.Name"
}
}
};
// call
var response = svc.SelectEntityListAggregation(request);
// printing result...
// columns
string sColumnInfo = "", sColumnInfo2 = "";
var columnLengthList = new Dictionary<int, int>();
foreach (var column in response.Result.Columns)
{
columnLengthList.Add(columnLengthList.Count, column.AttributeName.Length);
string sFormat = "{0,-" + column.AttributeName.Length.ToString() + "}|";
sColumnInfo += string.Format(sFormat, column.AttributeName);
sColumnInfo2 += string.Format(sFormat, column.AggregationFunction);
}
Console.WriteLine(sColumnInfo);
Console.WriteLine(sColumnInfo2);
// boundary columns/rows
sColumnInfo = "-";
int nRowPrintingSize = columnLengthList.Select(x => x.Value).Sum() + columnLengthList.Count;
sColumnInfo = sColumnInfo.PadRight(nRowPrintingSize, '-');
Console.WriteLine(sColumnInfo);
// fetched data
foreach (var record in response.Result.Records)
{
string sRecordInfo = "";
int nCol = 0;
foreach (var item in record)
{
sRecordInfo +=
string.Format("{0,-" + columnLengthList[nCol++].ToString() + "}|",
string.IsNullOrEmpty(item.ToString()) ? "n.v." : item.ToString());
}
Console.WriteLine(sRecordInfo);
}
}