Table of Contents

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

EntityList-Aggregation

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);
    }
}