BA.Core.CriteriaOperators.CriteriaOperatorBuilder

In der Klasse befindet sich eine Sammlung verschiedener Methoden zum Erstellen komplexer Criteria Operator auf Objekt Basis. Beispielsweise für den Zugriff auf Auswahllisten, Gemeinsame Spalten, Relationen, etc.
Wird eine entsprechende String Repräsentation benötigt kann diese mit Hilfe von ToString() auf den Objekten abgerufen werden.

Feldwert

Um auf einen Feldwert zuzugreifen [FeldName]

public static OperandProperty GetField(string fieldName)

Zeitzonen

Die Zeiten werden in BA-Datensätzen als UTC Wert abgespeichert. Sollen diese Werte in Formeln genutzt werden, müssen diese in die aktuelle Zeitzone umgewandelt werden.

public static CriteriaOperator GetDateWithTimeZone(CriteriaOperator operand)

Auswahllistenwert einer Einzelauswahl

Um den Auswahllistenwert einer Einzelauswahl zu erhalten, gibt es verschiedene Methoden

public static CriteriaOperator GetEnumSingleDisplayable(string fieldName, string language = null)

Übersetzung des Wertes

  • fieldName Der Auswahllistenfeldname im aktuellen Datensatz
  • language Optional: Sprache der Übersetzung
public static CriteriaOperator GetEnumSingleColor(string fieldName)

Farbwert des Wertes

  • fieldName Der Auswahllistenfeldname im aktuellen Datensatz
public static CriteriaOperator GetEnumSingleImage(string fieldName)

Bild des Wertes

  • fieldName Der Auswahllistenfeldname im aktuellen Datensatz
public static CriteriaOperator GetEnumSingle(string fieldName, CriteriaOperator selector, MasterEnum masterEnum = null)

Zugriff auf beliebige Felder des Wertes

  • fieldName Der Auswahllistenfeldname im aktuellen Datensatz
  • selector Eine Formel, die auf den Auswahllistenwert ausgeführt wird.
  • masterEnum Optional: Wird benötigt, wenn in der Formel auf Felder zugegriffen wird, die speziell für eine Auswahlliste ist.

Auswahllistenwerte einer Mehrfachauswahl

Der Umgang mit mehrfachen Werten in Formelsprache ist nicht trival und man sollte sich auf die Verwendung der BA eigenen Funktion BAContainsEnumValue beschränken.

Free Joins für Datenbankabfragen

Die Free Joins in Datenbankabfragen sind sehr komplex, daher stehen in dieser Library eine Reihe Methoden zur Verfügung, um dies zu vereinfachen. Benötigt werden diese, wenn man zum Beispiel eine Spalte für Ansichten implementieren möchte.

Auswahllistenwerte einer Mehrfachauswahl

In Formeln für Datenbankabfragen ist es eventuell trotzdem notwendig, die Joins auf alle Werte zu nutzen. Dies ist beispielsweise der Fall, wenn man eine eigene Spalte für die Mehrfachgruppierung in Ansichten implementieren möchte, Dazu stehen hier eine Reihe von Methoden zur Verfügung.

  • GetEnumMultiDisplayable
  • GetEnumMultiColor
  • GetEnumMultiImage

Die Basis Zugriffsmethode ist GetEnumMulti, sie liefert den entsprechenden Free Join als JoinOperand zurück.

public static CriteriaOperator GetEnumMulti(string fieldName, Guid masterGuid, CriteriaOperator selector, bool onlyRelations = false)
  • fieldName Der Auswahllistenfeldname im aktuellen Datensatz
  • masterGuid Guid der Auswahlliste
  • selector Eine Formel, die auf die Auswahllistenwerte ausgeführt wird.
  • onlyRelations Optional: True, falls man die Relationsdatensätze haben möchte. In dem Fall wird der selector auf diese Sätze ausgeführt.

Teil-Datensätze

Für den Zugriff auf Teil-Datensätze steht die zentrale Methode GetSubRecords zur Verfügung.

public static JoinOperand GetSubRecords(OrmSubRecordField subRecordField, int position = -1, Guid? uniqueKey = null, Aggregate aggregator = Aggregate.Single, CriteriaOperator aggregatedExpression = null)
  • subRecordField Das Steuerelement für Teil-Datensätze aus der Datentabellenkonfiguration
  • position Optional: SortOrder Index des gewünschten Satzes
  • uniqueKey Optional und alternativ zu position: Eindeutiger Schlüssel des Teil-Datensatzes. Dies kann nur genutzt werden, wenn die Verwendung des Teil-Datensatzes in der Datentabelle dies unterstützt.
  • aggregator Optional: Aggregate Typ. Beispielsweise Aggregate.Single oder Aggregate.Exist
  • aggregatedExpression Optional: Formel die auf die Sätze der Aggregation ausgeführt wird. Default ist [This], was den Datensatz selbst zurückliefert.

Beispiel:

OrmSubRecordField subRecordField = (OrmSubRecordField)Api.Config.OrmEntity(EnumDataSourceExtension.MyDataTable).GetField(nameof(OrmMyDataTable.SubDatas));
OperandProperty fieldProperty = new OperandProperty(nameof(OrmSubDataTable.TextField));
JoinOperand subRecordSortOrder0 = CriteriaOperatorBuilder.GetSubRecords(subRecordField, position: 0, aggregatedExpression: fieldProperty);

Relationen

Um die komplexen Relation-Joins zur vereinfachen, verwendet man die folgenden beiden Methoden. Eine für den Zugriff von Ziel zur Quelle und eine für den umgekehrten Fall.

public static JoinOperand GetSourcesJoin(bool onlyPrimary, EnumRelationType relationType, Guid? relationCategory, IEnumerable<Guid> sourceTypes = null, bool onlyRelations = false, Aggregate aggregator = Aggregate.Single, CriteriaOperator aggregatedExpression = null)

Um auf die Quellen einer Relation zuzugreifen, steht diese Methode zur Verfügung.

  • onlyPrimary Flag ob nur der primären Relation gefolgt werden soll. Dies muss auf true gesetzt sein, wenn man nur einen Datensatz erwartet.
  • relationType Der Relationstyp
  • relationCategory Die Relationskategorie
  • sourceTypes Optional: Ergebnis wird auf bestimmte Typen eingeschränkt. Ist es nur ein Typ, dann kann aggregatedExpression auch konkrete Felder dieses Typs beinhalten.
  • onlyRelations Optional: Bei True geht der Join nur bis zur OrmRelation und nicht zu den Datensätzen selbst. Dann wird aggregatedExpression auch auf die Relationsdatensätze ausgeführt.
  • aggregator Optional: Aggregate Typ. Beispielsweise Aggregate.Single oder Aggregate.Exist
  • aggregatedExpression Optional: Formel die auf die Sätze der Aggregation ausgeführt wird. Default ist [This], was den Datensatz selbst zurückliefert.
public static JoinOperand GetTargetsJoin(EnumRelationType relationType, Guid? relationCategory, IEnumerable<Guid> targetTypes = null, bool onlyRelations = false, Aggregate aggregator = Aggregate.Single, CriteriaOperator aggregatedExpression = null)

Um auf die Ziele einer Relation zuzugreifen, steht diese Methode zur Verfügung.

  • relationType Der Relationstyp
  • relationCategory Die Relationskategorie
  • targetTypes Optional: Ergebnis wird auf bestimmte Typen eingeschränkt. Ist es nur ein Typ, dann kann aggregatedExpression auch konkrete Felder dieses Typs beinhalten.
  • onlyRelations Optional: Bei True geht der Join nur bis zur OrmRelation und nicht zu den Datensätzen selbst. Dann wird aggregatedExpression auch auf die Relationssätze ausgeführt.
  • aggregator Optional: Aggregate Typ. Beispielsweise Aggregate.Single oder Aggregate.Exist
  • aggregatedExpression Optional: Formel die auf die Sätze der Aggregation ausgeführt wird. Default ist [This], was den Datensatz selbst zurückliefert.

Hierarchie-Relationen

Falls eine Relation Hierarchisch ist, können diese Hilfsmethoden verwendet werden, um beispielsweise den obersten und den nähsten Datensatz zu erhalten.

public static JoinOperand GetHierarchyPrimarySourceJoin(EnumRelationType relationType, Guid? relationCategory, EnumPrimaryHierarchyRelationSourceSelector hierarchyRelationSourceSelector, int levelCount = 0, GuidSet sourceTypes = null, bool onlyRelations = false, Aggregate aggregator = Aggregate.Single, CriteriaOperator aggregatedExpression = null)

Die Methode wird verwendet, um garantiert nur einen Datensatz zu erhalten, indem dem primären Weg gefolgt wird.

  • relationType Der Relationstyp
  • relationCategory Die Relationskategorie
  • hierarchyRelationSourceSelector Hierüber wird definiert, was in der Hierarchie ermittelt werden soll.
  • levelCount Optional: Wird nur benötigt, falls der Wert von hierarchyRelationSourceSelector, den Level benötigt.
  • sourceTypes Optional: Ergebnis wird auf bestimmte Typen eindeschränkt. Ist es nur ein Typ, dann kann aggregatedExpression auch konkrete Felder dieses Typs beinhalten.
  • onlyRelations Optional: Bei True geht der Join nur bis zur OrmHierarchyRelationBase basierten Tabelle und nicht zu den Datensätzen selbst. Dann wird aggregatedExpression auch auf die Relationssätze ausgeführt.
  • aggregator Optional: Aggregate Typ. Beispielsweise Aggregate.Single oder Aggregate.Exist
  • aggregatedExpression Optional: Formel die auf die Sätze der Aggregation ausgeführt wird. Default ist [This], was den Datensatz selbst zurückliefert.
public static JoinOperand GetHierarchySourcesJoin(bool onlyPrimary, EnumRelationType relationType, Guid? relationCategory, EnumHierarchyRelationSourceSelector hierarchyRelationSourceSelector, int levelCount = 0, IEnumerable<Guid> sourceTypes = null, bool onlyRelations = false, Aggregate aggregator = Aggregate.Single, CriteriaOperator aggregatedExpression = null)

Die Methode wird verwendet, um in der Hierarchie bestimmte Quellen zu finden.

  • onlyPrimary Flag ob nur der primären Relation gefolgt werden soll. Dies muss auf true gesetzt sein, wenn man nur einen Datensatz erwartet.
  • relationType Der Relationstyp
  • relationCategory Die Relationskategorie
  • hierarchyRelationSourceSelector Hierüber wird definiert, was in der Hierarchie ermittelt werden soll.
  • levelCount Optional: Wird nur benötigt, falls der Wert von hierarchyRelationSourceSelector, den Level benötigt.
  • sourceTypes Optional: Ergebnis wird auf bestimmte Typen eingeschränkt. Ist es nur ein Typ, dann kann aggregatedExpression auch konkrete Felder dieses Typs beinhalten.
  • onlyRelations Optional: Bei True geht der Join nur bis zur OrmHierarchyRelationBase basierten Tabelle und nicht zu den Datensätzen selbst. Dann wird aggregatedExpression auch auf die Relationssätze ausgeführt.
  • aggregator Optional: Aggregate Typ. Beispielsweise Aggregate.Single oder Aggregate.Exist
  • aggregatedExpression Optional: Formel, die auf die Sätze der Aggregation ausgeführt wird. Default ist [This], was den Datensatz selbst zurückliefert.

Zugriff auf das Benutzerprofil

Diese Methode erzeugt einen Join der auf das Benutzerprofil des aktuellen Benutzers verweist.

public static JoinOperand GetCurrentUserProfile(CriteriaOperator selector = null)
  • selector Eine Formel, die auf dem Benutzerprofil ausgeführt wird.

Filter

Für Abfragen benötigt man Filter, um die korrekten Datensätze zu erhalten.

Temporary Key Filter

Der wichtigste Filter ist der Temporary Key Filter, um temporäre Datensätze auszuschließen.

public static CriteriaOperator ApplyTemporaryKeyFilter(CriteriaOperator criteria = null, Guid? temporaryKey = null)

Aktiv Filter

Um beispielsweise nur aktive Datensätze zu erhalten, muss dieser Filter gesetzt werden.

public static CriteriaOperator ApplyActiveFilter(CriteriaOperator criteria, EnumEntryActiveState activeState)

Datensatzfilter

Abfragen sollten möglichste immer auf die gewünschten Typen eingeschränkt werden, falls globale Abfragen erstellt. Dazu dient diese Methode

public static CriteriaOperator ApplyObjectTypeFilter(CriteriaOperator criteria, Guid dataSourceGuid, CriteriaOperator selector = null)

Leserechte

Um die Leserechte zu berücksichtigen, muss dieser Filter gesetzt werden.

public static CriteriaOperator ApplyReadPermissions(CriteriaOperator criteria, Type queryOrmType, GuidSet dataSources = null, bool doNotAddOrmTypeCheck = false)