Formeln werden in der Konfiguration als Strings erfasst. Damit diese erkannt werden können erhalten Sie das Attribut [CriteriaProperty].

Als Eingabeelemente ist es sinnvoll ein Memofeld [MemoControl] zu nutzen. Für Bedingungen kann der Bedingungseditor [FilterEditorPropertyControl] genutzt werden.

Für die Syntaxüberprüfung für .Net Formeln stehen in der Klasse CriteriaOperatorHelper die Methoden CompileExpression zur Verfügung (Siehe Kapitel). Beim Kompilieren wird die Formel validiert, so dass es zur Laufzeit nahezu keine Fehler mehr geben kann. Bei einem Validierungsfehler kommt eine Exception.

Für die Validierung von Formeln, die in Datenbankabfragen genutzt werden sollen, steht ValidateDBCriteria zur Verfügung. Die Methode validiert nach bestem Wissen und Gewissen, indem sie eine minimale SQL-Query auf das Ergebnis absetzt. Die Validierung ist allerdings nicht in allen Fällen vollständig, da DevExpress bestimmte Prüfungen erst zur Laufzeit durchführt.

public static CriteriaOperator ValidateDBCriteria(Type ormType, Type targetType, string criteriaString)

Validiert den Criteria String und gibt Criteria Objekte zurück.

  • ormType Die Datentabelle, auf der die Formel ausgeführt werden soll. Hier muss null übergeben werden, wenn keine Testabfrage gewünscht ist.
  • targetType Erwarteter Datentyp der Rückgabe
  • criteriaString Die Formel
  • Rückgabe: Eine Exception oder die Criteria Objekte

Beispiel für .NET Formel

[MemoControl]
[CriteriaProperty]
public string ReadOnlyDefinition
{
    get => _ReadOnlyDefinition;
    set => PropertyHelper.SetWithInvalidate(ref _ReadOnlyDefinition, value, ref _ReadOnlyPredicate);
}
private string _ReadOnlyDefinition;

Cache mit kompilierter Version der Formel, generische Datentypen ggf. anpassen:

public Func<OrmBase, bool> ReadOnlyPredicate => PropertyHelper.GetOrCreate(ref _ReadOnlyPredicate, () =>
    {
        if (string.IsNullOrWhiteSpace(ReadOnlyDefinition))
            return orm => false;
        return CriteriaOperatorHelper.CompileExpression<OrmBase, bool>(this.GetOrmDataSourceContext(), ReadOnlyDefinition);
    });
private object _ReadOnlyPredicate;

Validierung beim Speichern durch erzwungenes Kompilieren:

public override List<ValidationModel> IsValid(ConfigurationBase configuration, EnumDesignerValidationState validationState)
{
    return base.IsValid(configuration, validationState)
        .AddErrorOnException(nameof(ReadOnlyDefinition), this, () => _ = ReadOnlyPredicate);
}

Nutzung der Formel im Code:

public virtual bool IsEditable(object bindObject)
{
    return /* ... && */ !ReadOnlyPredicate(bindObject as OrmBase); // Benutzung der compilierten Formel
}

Beispiel für Datenbank-Formeln (z.B. Ansichten)

[CriteriaProperty]
[FilterEditorPropertyControl(rawNames: true)]
public string DataFilter
{
    get => _DataFilter;
    set => PropertyHelper.SetWithInvalidate(ref _DataFilter, value, ref _DataFilterCriteria)
}
private string _DataFilter;

Cache mit validierter Version:

public CriteriaOperator GetDataFilterCriteria(bool extendedValidation)
{
    return PropertyHelper.GetOrCreate(ref _DataFilterCriteria, () =>
    {
        if (string.IsNullOrEmpty(DataFilter))
            return CriteriaOperatorBuilder.True;
        return extendedValidation
            ? CriteriaOperatorHelper.ValidateDBCriteria(this.GetOrmDataSourceContext(), typeof(bool), DataFilter);
            : CriteriaOperatorHelper.ParseDBCriteria(DataFilter);
    });
}
private object _DataFilterCriteria;

Validierung beim Speichern:

public override List<ValidationModel> IsValid(ConfigurationBase configuration, EnumDesignerValidationState validationState)
{
    return base.IsValid(configuration, validationState)
        .AddErrorOnException(nameof(DataFilter), this, () => GetDataFilterCriteria(true));
}

Verwendung der gecachten Formel:

var records = Api.ORM.Query(control.OrmDataSource, session)
    .Fit(control.GetDataFilterCriteria(false));