Erinnerungssystem mit Klassenformeln
Informationen
- Kategorien: Kernel | Erinnerungsfunktion
- Version: EA.12338
- Veröffentlichungsdatum: Donnerstag, 20. Juni 2019
- Entwickler: Eiteljörge
- Benötigt Datenbankänderung: Ja
- Betreff: Erinnerungssystem über Klassenformeln implementierbar
Beschreibung
Das Filtern der Entities vom Erinnerungssystem kann nun auch in Klassenformel erfolgen. Dafür wurden die Events onEvent_AlertNew und onEvent_AlertUpdate eingeführt.
Zur Implementierung siehe Beispielcode für die Klassenformeln und den Filtern. Lese auch die Dokumentation Alters.txt.
Mit dem Event AlertNew kann eine Entity-Liste mit neuen Erinnerungsobjekten durch Filtern erstellt werden. Die Signatur ist
int onEvent_AlertNew( string $sAlertId, time $LastScanTime, time $TimeWindowStart, time $TimeWindowEnd, int $MandantList[], int $ScopeList[], byref entitylist $EntityList )
Der Parameter $sAlertId liefert den Namen des pit-Registry Key der Erinnerungsklasse.
Über den Parameter $EntityList liefert man eine Entity-Liste mit den neuen Erinnerungsobjekten zurück.
Der Rückgabewert ist entweder 1, wenn eine Entity-Liste geliefert wird, oder 0.
Die Werte $LastScanTime, $TimeWindowStart und $TimeWindow sind Werte von Erinnerungssystem, welche für das Filtern benötigt werden. Die Klassenformel ersetzt den internen Filter
(
$ATTRIBUTE_TIMEWINDOW > $TimeWindowStart
AND
$ATTRIBUTE_TIMEWINDOW <= $TimeWindow
)
OR
:ModificationDate > $LastScanTime
Ab DEV 15042, EA 15046, R22 15048 ändert sich der interne Filter zu:
( $ATTRIBUTE_TIMEWINDOW > $TimeWindowStart AND $ATTRIBUTE_TIMEWINDOW <= $TimeWindow ) OR ( :ModificationDate > $LastScanTime AND $ATTRIBUTE_TIMEWINDOW <= $TimeWindow )
Die Parameter $MandantList[] und $ScopeList[] sind die für den Alert gültigen Mandaten und Scopes. Sie sind mit dem Filter anzuwenden, z.B.
GetEntitylistByCombinedFilters( ..., $MandantList, $ScopeList, ...);
Durch den Programmkode
$EntityList = GetEntitylistByCombinedFilters( $sFilterList, $nFlags, $MandantList, $ScopeList, "LastScanTime", $LastScanTime, "TimeWindowStart", $TimeWindowStart, "TimeWindowEnd", $TimeWindowEnd );
kann eine Entity-Liste erstellt werden, wobei die Filterparameter an die Filter übergeben werden.
Mit dem Event AlertUpdate kann eine Entity-Liste mit angezeigten Erinnerungsobjekten durch Filtern erstellen. Dafür bekommt die Klassenformel eine Liste mit allen Entities-IDs, welche aktuell in der Anzeige sind. Diese Entities werden per Filter gesucht ( ID ist in (ID1, ID2,...) ), aber dieser Filter wird mit mit dem externen Filters mit AND verknüpft. Dadurch können Entities wegfallen. Diese werden dann von der Lister der Erinnerungen entfernt. Die Signatur ist
int onEvent_AlertUpdate( string $sAlertId, entityid $EntityIdList[], byref entitylist $EntityList )
Der Parameter $sAlertId liefert den Namen des pit-Registry Key der Erinnerungsklasse.
Über den Parameter $EntityList liefert man eine Entity-Liste mit schon erfassten Erinnerungsobjekten zurück.
Der Rückgabewert ist entweder 1, wenn eine Entity-Liste geliefert wird, oder 0.
Der Parameter $EntityIdList enthält die IDs aller angezeigten Objekte.
Achten Sie darauf, dass sie an der Funktion GetEntitylistBy oder GetEntitylistByCombinedFilters die Flags so setzen, dass sie mit den gewünschten Mandanten filtern.
Dokumente
Beispielcode
Beispiel für Klassenformel onEvent_AlertNew
===========================================
int onEvent_AlertNew(
string $sAlertId,
time $LastScanTime,
time $TimeWindowStart,
time $TimeWindowEnd,
int $MandantList[],
int $ScopeList[],
byref entitylist $EntityList )
{
var string $sRegistryKey;
var string $sFilter;
var string $sTimeWindowFilter;
var string $sFilterList[];
var int $nFlags;
var string $sValue;
// Nur Event verarbeiten, wenn wir die Alert-Klasse selber behandeln wollen.
//
if ($sAlertId == "DeviceBuy")
{
$nFlags = 0;
// Pfad des pit-Registry-Keys zusammenbauen.
//
$sRegistryKey = "System\\Config\\Alert\\" + $sAlertId;
// Parameter FILTER von pit-Registry lesen.
//
// Wir erwarten einen gültigen Filter.
// Ansonsten wirft die Funkton GetEntitylist eine Exception.
//
$sFilter = GetPitRegistrySetting( $sRegistryKey, "FILTER" ); // Dateiname enthält auch die Dateierweiterung '.flt'
// Flags
//
$nFlags = $nFlags + #System.GetEntityList.Flags.SpecificMandantList;
$nFlags = $nFlags + #System.GetEntityList.Flags.SpecificScopeList;
// Dateipfad des Time Window and Modification Filter erstellen,
// mit
// (
// $ATTRIBUTE_TIMEWINDOW > TimeWindowStart
// AND
// $ATTRIBUTE_TIMEWINDOW <= TimeWindowEnd
// )
// OR
// :ModificationDate > LastScanTime
//
ReSize( $sFilterList, 1 );
$sTimeWindowFilter = "AlertTimeWindow.flt"; // Dateiname vom Time Window and Modification Filter
$sFilterList[0] = GetPath( #System.File.Area.System, #System.File.Section.Filter, StrCat("system\\", $sTimeWindowFilter), "", #System.File.Mode.Read );
// Dateipfad des in pit-Registry konfiguriert Filters erstellen.
//
ReSize( $sFilterList, 2 );
$sFilterList[1] = GetPath( #System.File.Area.System, #System.File.Section.Filter, StrCat("system\\", $sFilter), "", #System.File.Mode.Write );
// Enities einlesen.
//
$EntityList = GetEntitylistByCombinedFilters
(
$sFilterList,
$nFlags,
$MandantList,
$ScopeList,
"LastScanTime", $LastScanTime,
"TimeWindowStart", $TimeWindowStart,
"TimeWindowEnd", $TimeWindowEnd
);
// Die Klassenformel liefert eine Entity-Liste. pit-FM soll nicht selbst Entities einlesen.
//
return 1;
}
// Standardbearbeitung ausführen. pit-FM ermittelt selbst eine Entity-Liste.
//
return 0;
}
Beispiel für Klassenformel onEvent_AlertUpdate
==============================================
int onEvent_AlertUpdate(
string $sAlertId,
entityid $EntityIdList[],
byref entitylist $EntityList )
{
var string $sRegistryKey;
var string $sFilter;
var string $sEntityIdFilter;
var string $sFilterList[];
var int $nFlags;
var string $sValue;
// Nur Event verarbeiten, wenn wir die Alert-Klasse selber behandeln wollen.
//
if ( $sAlertId == "DeviceBuy" )
{
// Pfad des pit-Registry-Key zusammenbauen.
//
$sRegistryKey = "System\\Config\\Alert\\" + $sAlertId;
// Filter von pit-Registry lesen.
//
// Wir erwarten einen gültigen Filter.
// Ansonsten wirft die Funkton GetEntitylist eine Exception.
//
$sFilter = GetPitRegistrySetting( $sRegistryKey, "FILTER" ); // mit Dateierweiterung '.flt'
// Entities einlesen, wenn ein Filter konfiguriert ist.
//
$nFlags = 0;
// SCAN_ALL_READABLE_CLIENTS von pit-Registry lesen.
//
$sValue = GetPitRegistrySetting( $sRegistryKey, "SCAN_ALL_READABLE_CLIENTS" );
$sValue = MakeLower( $sValue );
if ( $sValue == "true" ) { $nFlags = $nFlags + #System.GetEntityList.Flags.AllUserReadableClients; }
// SCAN_ALL_READABLE_SCOPES von pit-Registry lesen.
//
$sValue = GetPitRegistrySetting( $sRegistryKey, "SCAN_ALL_READABLE_SCOPES" );
$sValue = MakeLower( $sValue );
if ( $sValue == "true" ) { $nFlags = $nFlags + #System.GetEntityList.Flags.AllUserReadableScopes; }
// Spezifizieren zwei Filters.
//
ReSize( $sFilterList, 2 );
// Dateipfad des ID Filter erstellen,
// mit
// :ID enthält in EntityIdList"
//
$sEntityIdFilter = "AlertUpdate.flt"; // Dateiname vom dem von Hand angelegtem Filter
$sFilterList[0] = GetPath( #System.File.Area.System, #System.File.Section.Filter, StrCat("system\\", $sEntityIdFilter), "", #System.File.Mode.Read );
// In pit-Registry konfiguriert Filter
$sFilterList[1] = GetPath( #System.File.Area.System, #System.File.Section.Filter, StrCat("system\\", $sFilter), "", #System.File.Mode.Read );
// Enities einlesen.
//
$EntityList = GetEntitylistByCombinedFilters( $sFilterList, $nFlags, "EntityIdList", $EntityIdList );
// Die Klassenformel liefert eine Entity-Liste. pit-FM soll nicht selbst Entities einlesen.
//
return 1;
}
// Standardbearbeitung ausführen. pit-FM ermittelt selbst eine Entity-Liste.
//
return 0;
}
Beispiel für Filter AlertTimeWindow.xml
=======================================
<?xml version="1.0" encoding="UTF-8"?><PitXmlSerializing version="1">
<CPitFmFrontend_Filter Class="VT_Inventar" id="ref-1">
<PrintName>AlertTimeWindow</PrintName>
<EditPrivilegeLevel>0</EditPrivilegeLevel>
<ExecutePrivilegeLevel>0</ExecutePrivilegeLevel>
<EntityFilters count="1">
<CPitFmFrontend_EntityFilter Class="VT_Inventar">
<AttributeFilters count="1">
<CPitFmFrontend_AttributeFilter Class="VT_Inventar" Attribute="Kaufdatum">
<ValueFilters count="1">
<CPitFmFrontend_ValueFilter version="5" bNot="false" Operator="10">
<Value1 datatype="time" Null="false">2019-06-06T16:30:00</Value1>
<Value2 datatype="time" Null="false">2019-06-06T16:30:00</Value2>
<SubValueFilters count="2">
<CPitFmFrontend_ValueFilter version="5" bNot="false" Operator="2">
<Value1 datatype="time" Null="false">2019-06-06T16:32:00</Value1>
<Value2 datatype="time" Null="false">2019-06-06T16:32:00</Value2>
<FilterExpression>?TimeWindowStart</FilterExpression>
</CPitFmFrontend_ValueFilter>
<CPitFmFrontend_ValueFilter version="5" bNot="false" Operator="5">
<Value1 datatype="time" Null="false">2019-06-06T16:32:00</Value1>
<Value2 datatype="unknown" Null="true"/>
<FilterExpression>?TimeWindowEnd</FilterExpression>
</CPitFmFrontend_ValueFilter>
</SubValueFilters>
</CPitFmFrontend_ValueFilter>
</ValueFilters>
</CPitFmFrontend_AttributeFilter>
</AttributeFilters>
</CPitFmFrontend_EntityFilter>
</EntityFilters>
<ParameterList count="2">
<CPitFm_FilterParameter version="1" Flags="0" DefaultValueType="0" IsValueList="false">
<Name>TimeWindowStart</Name>
<Prompt>
<German>TimeWindowStart</German>
</Prompt>
<TypeAttributeClass>VT_Inventar</TypeAttributeClass>
<TypeAttribute>Kaufdatum</TypeAttribute>
<DefaultValue datatype="unknown" Null="true"/>
<Value datatype="unknown" Null="true"/>
<bFilterAlwaysActive>0</bFilterAlwaysActive>
<bDisableChangeTree>0</bDisableChangeTree>
<bDisableChangeFilter>0</bDisableChangeFilter>
<bDisableCreateNew>0</bDisableCreateNew>
</CPitFm_FilterParameter>
<CPitFm_FilterParameter version="1" Flags="0" DefaultValueType="0" IsValueList="false">
<Name>TimeWindowEnd</Name>
<Prompt>
<German>TimeWindowEnd</German>
</Prompt>
<TypeAttributeClass>VT_Inventar</TypeAttributeClass>
<TypeAttribute>Kaufdatum</TypeAttribute>
<DefaultValue datatype="unknown" Null="true"/>
<Value datatype="unknown" Null="true"/>
<bFilterAlwaysActive>0</bFilterAlwaysActive>
<bDisableChangeTree>0</bDisableChangeTree>
<bDisableChangeFilter>0</bDisableChangeFilter>
<bDisableCreateNew>0</bDisableCreateNew>
</CPitFm_FilterParameter>
</ParameterList>
<ClassFormulaList count="0"/>
</CPitFmFrontend_Filter>
</PitXmlSerializing>
Beispiel für Filter AlertUpdate.xml
===================================
<?xml version="1.0" encoding="UTF-8"?><PitXmlSerializing version="1">
<CPitFmFrontend_Filter Class="VT_Inventar" id="ref-1">
<PrintName>EntityIdList</PrintName>
<EditPrivilegeLevel>0</EditPrivilegeLevel>
<ExecutePrivilegeLevel>0</ExecutePrivilegeLevel>
<EntityFilters count="1">
<CPitFmFrontend_EntityFilter Class="VT_Inventar">
<AttributeFilters count="1">
<CPitFmFrontend_AttributeFilter Class="VT_Inventar" Attribute="ID">
<ValueFilters count="1">
<CPitFmFrontend_ValueFilter version="5" bNot="false" Operator="14">
<Value1 datatype="entityidarray" Null="false">
<Version>1</Version>
</Value1>
<Value2 datatype="unknown" Null="true"/>
<FilterExpression>?EntityIdList</FilterExpression>
</CPitFmFrontend_ValueFilter>
</ValueFilters>
</CPitFmFrontend_AttributeFilter>
</AttributeFilters>
</CPitFmFrontend_EntityFilter>
</EntityFilters>
<ParameterList count="1">
<CPitFm_FilterParameter version="1" Flags="0" DefaultValueType="0" IsValueList="true">
<Name>EntityIdList</Name>
<Prompt>
<German>EntityIdList</German>
</Prompt>
<TypeAttributeClass>VT_Inventar</TypeAttributeClass>
<TypeAttribute>ID</TypeAttribute>
<DefaultValue datatype="unknown" Null="true"/>
<Value datatype="unknown" Null="true"/>
<bFilterAlwaysActive>0</bFilterAlwaysActive>
<bDisableChangeTree>0</bDisableChangeTree>
<bDisableChangeFilter>0</bDisableChangeFilter>
<bDisableCreateNew>0</bDisableCreateNew>
</CPitFm_FilterParameter>
</ParameterList>
<ClassFormulaList count="0"/>
</CPitFmFrontend_Filter>
</PitXmlSerializing>