Durch Einsatz von zusätzlichen Objektzfiltern können Datenmengen, die von dem SOG Active Skin "ObjectSelector" Control geliefert werden in einem nachgelagerten Lauf zusätzlich gefiltert werden. Über diese zusätzliche Filterung können z.B. Datenwerte geprüft werden, die erst berechnet oder zusammengesetzt werden müssen, oder es können Daten aus Objekt-Referenzen zur Filterung verwendet werden.
Der Anwender sieht einen solchen Objektfilter einfach als zusätzliches Datenfeld, dass er wie die normalen "SQL" Datenfelder als Abfragebegriff verwenden kann.
Zur Implementierung solcher zusätzlicher Filter muss in der betroffenen Klassen eine Funktion eingeführt werden, und mit dem Attribute "SOGSelectionAttribute" als Objektfilter bekannt gegeben werden.
Beispiel aus der Klasse "Aufgaben.cs" zur Verwendung in der Funktion "AufgabenSuche":
[SOGSelection(typeof(string))]
[InputPrompt("ZusatzGesamt")]
public bool FilterZusatzGesamt( SOGObjectFilterItem filter )
{
string txt = ZusatzGesamt.Replace("\n", " ").TrimEnd( ' ' );
return filter.CompareToValue( txt );
}
Die Filterfunktion muss einen Parameter vom Typ "SOGObjectFilterItem" definieren. Zur Laufzeit wird in diesem Filter-Item die vom Benutzer definiert Vergleichsbedingung, sowie die vom Benutzer eingegebenen Werte übermittelt.
Um einen Vergleich durchzuführen stehen in der SOGObjectFilterItem-Klasse die Funktionen "CompareToValue" bzw. "CompareToValueList" zur Verfügung. Diese Funktionen liefern jeweils "true" oder "false" zurück, je nachdem ob die vom Benutzer definierte Bedingung auf den Vergleichsbegriff zutrifft, oder nicht.
In dem obigen Beispiel wird die Filterbedingung auf die Summe aller "zusatz"-Zeilen angewand, die dazu vorher in einen einzigen, durch Leerstellen getrennten String gewandelt werden. Für den Benutzer ergibt sich ein gewisser Unterschied, wenn die folgende Funktion implementiert und genutzt wird:
[SOGSelection(typeof(string))]
[InputPrompt("Zusatz")]
public bool FilterZusatz( SOGObjectFilterItem filter )
{
ArrayList txt = new ArrayList();
for ( int i=0; i<m_zusatz.Length; i++ )
txt.Add( m_zusatz[i] );
return filter.CompareToValueList( txt );
}
In dieser Implementierung werden die Zeilen einzeln als Werte-Liste an den Item-Filter übergeben. Der Unterschied besteht nun darin, dass eine Bedingung "= 08" in der ersten Implementierung nur dann wahr ist, wenn genau in der 1. Zusatzzeile der Text "08" steht, und alle anderen Zusatzzeilen leer sind. In der zweiten Implementierung trifft die gleiche Bedingung immer dann zu, wenn eine der Zusatzzeilen nur den Text "08" enthält, unabhängig davon, was in den anderen Zeilen steht.
Übergabe von weiteren Parametern aus Masken an Objektfilter
Wenn ein Objektfilter auf Parameter reagieren soll, die über Dialogmasken einstellbar sein sollen, steht hierzu folgende Möglichkeit zur Verfügung:
Implementieren Sie eine Datenklasse oder ein Interface für die Kapselung der zu übergebenden Parameter.
Implementieren Sie die virtuelle Funktion "GetSqlSelectorParameter" in Ihrer Dialogklasse.
Fügen Sie eine Instanz Ihrers Parameter-Objektes der Liste der Paramter in der Eigenschaft "Parms" des Übergabeparamters "e" vom Typ SOGGetSqlSelectorEventArgs der Funktion ""GetSqlSelectorParameter" hinzu.
Verwenden Sie die Funktion "GetParms" des "SOGObjectFilterItem" "filter" in der Implementierung des Objektfilters um diese Parameter zu erhalten.
// In der Dialogklasse:
override public void GetSqlSelectorParameter(object sender, SOGGetSqlSelectorEventArgs e)
{
e.Parms.Add( new MyParameter( x, y, z ) );
}
// Im Objectfilter:
public bool FilterZusatz( SOGObjectFilterItem filter )
{
MyParameter para = (MyParameter) filter.GetParms( typeof(MyParameter) );
if ( para!=null )
{
....;
}
}