CSV-Export
Grundlagen
Für den CSV-Export ist das Modul Massendaten-Server notwendig.
Für den Massendaten-Export im CSV-Format sind mehrere Möglichkeiten vorhanden:
CSV-Export über den klassischen Serienbrief als Hauptdokument (nur manuell ausführbar) (1. Generarion)
CSV-Export über einen serverseitigen Workflow (timergesteuert oder innerhalb eines anderen Workflows) (2. Generation)
CSV-Export der 3. Generation
a) CSV-Export direkt aus der Suchmaske (manuelles Anstarten)
b) CSV-Export eines Datenexports (timergesteuertes Anstarten)
CSV-Export über den klassischen Serienbrief als Hauptdokument
Die Ausführung wird über das Menü Marketing / Serienbrief gestartet. Im Wizard wählt der Anwender zunächst eine Serienbrief-Vorlage. Wählt er dabei eine, für die entsprechende Exportkonfigurationen hinterlegt sind, erscheint als nächstes deren Auswahlseite.
Hier gibt es wiederum 2 Möglichkeiten. Zum einen kann die Serienbrieferstellung auf dem Standardweg ('Serienbrief-Erstellung starten') durchgeführt werden. Zum anderen kann eine der existierenden Konfigurationen gewählt werden, um den Auftrag des CSV-Exports auf den alternativen Server zu delegieren.
Im ersten Fall gleicht der Wizard im Folgenden dem bisherigen Vorgehen. Im zweiten Fall folgt nun nur noch eine Seite, auf der der Anwender die Suchkriterien der zugrunde liegenden komplexen Suche einschränken kann. Mit Beendigung des Wizards wird der entsprechende Job an den alternativen Server delegiert und der Anwender kann nun auf seine Fertigstellung warten.
Benachrichtigung nach Fertigstellung
Die Benachrichtigung über die Fertigstellung erscheint in der Taskliste unter Offene Systemjobs.
CSV-Export über einen serverseitigen Workflow
Generierung der XML-Exportkonfiguration aus einer Suche
Um eine Konfiguration für eine Suche zu generieren, kann im Suchdialog über den Schalter Eine Export-Konfiguration für die Suche erstellen der Wizard gestartet werden. Dazu muss die erweiterte Schalterleiste aktiv sein.
Um eine Konfiguration für eine komplexe Suche zu generieren, kann in der Adminkonsole unter dem Menüpunkt Verwaltung Komplexe Suchen über den Schalter Konfiguration generieren der Wizard gestartet werden.
Wizard
Im ersten Schritt wird die Suche durchlaufen und alle Felder der Konfiguration hinzugefügt. Tritt dabei ein Problem auf, wird das auf der ersten Seite angezeigt. In diesem Beispiel selektiert die Suche keine Felder.
Im zweiten Schritt werden Format der Ausgabedatei und spezielle Werte wie Platzhalter für Binärwerte oder Wahrheitswerte festgelegt. Schlägt die Validierung dabei fehl, wird dies unmittelbar im unteren Textfeld angezeigt.
Der dritte Schritt verhält sich genau wie Schritt 2. Hier werden die Trennzeichen definiert.
Schließlich wird die generierte Konfiguration angezeigt und kann gespeichert werden.
Erläuterung der Bestandteile
ExportConfig
Attribut | Beschreibung |
---|---|
type | Gibt den Typ der Exportdatei an. Bisher wird nur "CSV" für CSV-Dateien unterstützt. |
file | Gibt den voll qualifizierten Pfad der Datei an, in die exportiert werden soll. Wird nicht explizit ein Netzwerkpfad angegeben, bezieht sich der Pfad auf den Rechner auf dem der Application-Server liegt. |
Format
Attribut | Beschreibung |
---|---|
fileFormat | Gibt das Encoding der Datei an. Beispielsweise "UTF-8" (immer ohne Byte Order Mark, http://de.wikipedia.org/wiki/Byte_Order_Mark), "CP1252" oder "ISO-8859-1" (unterstützt kein € Zeichen) |
dateFormat | Legt die Form exportierter Datumsangaben fest. Für gültige Werte siehe Extra Tabelle. |
numberGroupDigit | Gibt an mit welchem Zeichen die Ziffern gruppiert werden. Es darf nur ein Zeichen sein. Bsp.: "." macht aus "23000" gleich "23.000". |
numberDecimalSymbol | Gibt das Trennzeichen zwischen Vor- und Nachkommateil an. Es darf nur ein Zeichen sein. |
booleanTrue | Gibt den Wert an der in die Datei geschrieben wird wenn in der Datenbank der boolesche Wert "true" steht. |
booleanFalse | Gibt den Wert an der in die Datei geschrieben wird wenn in der Datenbank der boolesche Wert "false" steht. |
nullValue | Gibt den Wert an der in die Datei geschrieben wird wenn in der Datenbank der Leerwert steht, beispielsweise NULL in Oracle oder Leerstring in MSSQL. |
binary | Gibt den Wert an der in die Datei geschrieben wird wenn wenn es sich bei dem Wert um einen binären Wert, wie z.B. ein Bild handelt. |
Mögliche Datumskonfigurationen
Buchstabe | Beschreibung | Beispiel |
---|---|---|
G | Epoche | n. Chr. |
y | Jahr | 1996 oder 96 |
M | Monat im Jahr | Februar oder Feb oder 02 |
w | Woche im Jahr | 27 |
W | Woche im Monat | 2 |
D | Tag im Jahr | 189 |
d | Tag im Monat | 10 |
F | Tag der Woche im Jahr | 2 |
E | Tag der Woche | Fr oder Freitag |
a | AM/PM | PM |
H | Stunde des Tages (0-23) | 0 |
k | Stunde des Tages (1-24) | 24 |
K | Stunde in AM/PM (0-11) | 0 |
h | Stunde in AM/PM (1-12) | 12 |
m | Minute in der Stunde | 30 |
s | Sekunde in der Minute | 55 |
S | Millisekunde | 978 |
z | Generelle Zeitzone | MESZ |
Z | RFC 822 Zeitzone | +0200 |
BEISPIEL
"yyyy.MM.dd G HH:mm:ss z", "EEE, MMM d, yy", "h:mm a", "K:mm a, z", "yyyyy.MMMMM.dd GGG hh:mm aaa", "EEE, d MMM yyyy HH:mm:ss Z", "yyMMddHHmmssZ"
SeparatorFormat
Um zu verstehen wie sich die Trennzeichen auswirken, schaut man sich am Besten ein Ergebnis des Export an.
Attribut | Beschreibung |
---|---|
separator | Das Trennzeichen zwischen den einzelnen Werten, also den Feldern, die mit dem "Field"-Tag konfiguriert wurden. So ein Wert kann auch das Ergebnis einer Tabellensuche sein und dann aus mehreren mit dem "tableSeparator" getrennten und mit dem "tableLineSeparator" abgeschlossenen Werten bestehen. Darf nicht gleich einem der anderen Trennwerte sein oder einen davon enthalten. |
lineSeparator | Das Trennzeichen zwischen den einzelnen Datensätzen. Nachdem also alle in einer Konfiguration enthaltenen Werte einmal geschrieben wurden, steht dieses Trennzeichen. Darf nicht gleich einem der anderen Trennwerte sein oder einen davon enthalten. |
tableSeparator | Das Trennzeichen zwischen den einzelnen Tabellenwerten, also den Werten einer abhängigen Tabellensuche - der Trenner zwischen den Werten von geschachtelten "Field"-Tags unter einem "Field"-Tag vom Typ "TABLE". Tritt damit nur auf, wenn eine komplexe Suche verwendet wurde und muss auch nur angegeben werden, wenn ein "Field"-Tag vom Typ "TABLE" angegeben wurde. Darf nicht gleich einem der anderen Trennwerte sein oder einen davon enthalten. |
tableLineSeparator | Das Trennzeichen zwischen den einzelnen Tabellendatensätzen. Somit der Abschlusstrenner wenn alle Werte von geschachtelten "Field"-Tags unter einem "Field"-Tag vom Typ "TABLE" einmal geschrieben wurden. Darf nicht gleich einem der anderen Trennwerte sein oder einen davon enthalten. |
replaceSeparator | Der Wert mit dem Stellen in den zu exportierenden Werten ersetzt werden, die gleich dem "separator" Wert sind. Darf nicht gleich "separator" sein. |
replaceLineSeparator | Der Wert mit dem Stellen in den zu exportierenden Werten ersetzt werden, die gleich dem "lineSeparator" Wert sind. Darf nicht gleich "lineSeparator" sein. |
replaceTableSeparator | Der Wert mit dem Stellen in den zu exportierenden Werten ersetzt werden, die gleich dem "tableSeparator" Wert sind. Darf nicht gleich "tableSeparator" sein. |
replaceTableLineSeparator | Der Wert mit dem Stellen in den zu exportierenden Werten ersetzt werden, die gleich dem "tableLineSeparator" Wert sind. Darf nicht gleich "tableLineSeparator" sein. |
Field
Attribut | Beschreibung |
---|---|
name | Der Name der für das dieses Feld in die zu exportierende Datei geschrieben wird. |
aliasName | Darf nur gesetzt werden wenn "fieldType" gleich "TABLE" ist. Gibt den Alias der Tabelle an, also der Alias der entsprechenden Teilsuche der komplexen Suche (Es muss bei "TABLE" eine komplexe Suche genutzt werden). |
fieldType | Ein der Werte "TABLE" oder "SIMPLE". "TABLE" besagt, dass dieses "field" eine Tabelle darstellt und dementsprechend noch geschachtelte "field"-Tags hat. Einfache Werte oder Bestandteile einer Tabelle sollten hier "SIMPLE" stehen haben. Wenn "TABLE" gesetzt ist muss eine komplexe Suche genutzt werden. |
valueType | Einer der Werte "VALUE", "KEY" oder "DESC". Bei Nachschlagefeldern kann mit "KEY" der Schlüssel, mit "DESC" die Beschreibung und mit "VALUE" der Primärschlüssel des Nachschlagewertes selektiert werden. In allen anderen Fällen muss hier "VALUE" stehen. |
fieldName | Gibt den Attributnamen des Feldes an. Bsp.: "MatchCode.Customer". |
nullValue | Hat die selbe Wirkung wie das gleiche Attribut auf dem "Format"-Tag und überschreibt dies für dieses Feld. |
"Feld"-Tags können einfach geschachtelt werden wenn der "fieldType" gleich "TABLE" ist. Mehrfachschachtelungen sind nicht erlaubt.
Workflowaktion
Für das Einspielen von Workflows siehe das Kapitel Workflows. Die neue Workflowaktion "CSVExportAction" benötigt folgende Eingaben:
Parameter | Beschreibung |
---|---|
ComplexSearch | Wenn eine komplexe Suche genutzt werden soll, wird hier der Name der komplexen Suche angegeben. In diesem Fall darf "ExtendedSearch" nicht gefüllt werden. |
ExtendedSearch | Wenn eine einfache Suche genutzt werden soll, wird hier der Name der Suche angegeben. In diesem Fall darf "ComplexSearch" nicht gefüllt werden. |
SessionId | Hier muss immer die aktuelle SessionId übergeben werden. Diese steht in jedem Workflow zur Verfügung. |
Config | Über diesen Parameter kann der XML Code der Konfiguration für den Export direkt an die Aktion übergeben werden. Ist dies der Fall darf "PropertyMapperID" nicht gefüllt werden. |
PropertyMapperID | Wenn die Konfiguration des Exports im PropertyMapper hinterlegt wurde, wird hier der Id-Teil des Eintrags angegebenen. Wenn die Spalte ID im PropertyMapper beispielsweise den Wert "/de/cursor/jevi/common/export/ExportConfigWorker$!!$MeineId" hat, müsste hier der Teil "MeineId" angegeben werden. Ist dies der Fall darf "Config" nicht gefüllt werden. |
Über den PropertyMapper
Der folgende Workflow ist dazu gedacht, zeitgesteuert gestartet zu werden und nutzt die Aktion "CSVExportAction", um den CSV-Export anzustoßen. "SessionId" muss angegeben werden. Zusätzlich muss ENTWEDER der Plainkey einer einfachen Suche in "ExtendedSearch" ODER der Plainkey einer komplexen Suche in "ComplexSearch" angegeben werden. Wird beides oder nichts angegeben, wird die Aktion nicht ausgeführt. Hier wird eine einfache Suche genutzt und dementsprechend "ExtendedSearch" gefüllt. Da die Konfiguration im PropertyMapper hinterlegt werden soll, wird "PropertyMapperID" gefüllt.
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE WorkFlowMapping PUBLIC "workflow" "..\..\..\common\workflow\workflow.dtd">
<WorkFlowMapping WorkFlowID="MeinZeitgesteuerterWorkflow" Description="Beispielworkflow" ExecutionType="0">
<InternalDescription>
Exportiert regelmaeßig Geschaeftspartner und deren Aktivitaeten.
</InternalDescription>
<Step No="1">
<Event Name="TimerWFEvent">
<EventToContextMap>
<SimpleMapping FromName="SessionId" ToName="SessionId"/>
</EventToContextMap>
</Event>
<Conditions/>
<Actions>
<Action Name="CSVExportAction">
<ContextToActionMap>
<ValueMapping Name="SessionId">
<Parameter Name="SessionId" DataType="java.lang.String" Value=""/>
</ValueMapping>
<ValueMapping Name="ComplexSearch">
<Parameter Name="ComplexSearch" DataType="java.lang.String" Value="MeineGeschaeftspartnerComplex"/>
</ValueMapping>
<ValueMapping Name="PropertyMapperID">
<Parameter Name="PropertyMapperID" DataType="java.lang.String" Value="MeineId"/>
</ValueMapping>
</ContextToActionMap>
</Action>
</Actions>
<FollowingSteps/>
</Step>
</WorkFlowMapping>
PropertyMapper Eintrag / Konfiguration
Um den Export zu konfigurieren, muss in der Datenbank ein PropertyMapper Eintrag hinterlegt werden.
Beispiel
<ExportConfig type="CSV" file="c:\test.csv">
<Format fileFormat="UTF-8" dateFormat="dd.MM.yyyy hh:mm:ss" numberGroupDigit="." numberDecimalSymbol=","
booleanTrue="true" booleanFalse="false" nullValue="null" binary="Export fuer diesen Datentyp nicht moeglich" />
<SeparatorFormat separator=";" lineSeparator="#" tableSeparator="::" tableLineSeparator="%"
replaceSeparator="" replaceLineSeparator="" replaceTableSeparator="" replaceTableLineSeparator="" />
<Field name="MatchCode" fieldName="MatchCode.Customer" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Name1" fieldName="Name1.Customer" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="DateOfOrigin" fieldName="DateOfOrigin.Customer" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Freenumber1" fieldName="Freenumber1.Customer" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Activities" aliasName="GPAktivitaeten" fieldType="TABLE" >
<Field name="Activities_Subject" fieldName="Subject.Activity" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Activities_DelegatedTo" fieldName="DelegatedTo.Activity" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Activities_DelegatedBy" fieldName="DelegatedBy.Activity" valueType="VALUE" fieldType="SIMPLE" />
</Field>
<Field name="PersontypeKey" fieldName="PersontypeKey.Customer" valueType="KEY" nullValue="" fieldType="SIMPLE" />
</ExportConfig>
In die Datenbank geschrieben würde er unter MSSQL z.B. mit
INSERT INTO PropertyMapper (Pk, id, property, PropertyType, principal, PropertyValue, Active, CreateDate, CreateUser,
UpdateDate, UpdateUser, STATUS, WFInstanceId, RightPk, ClientNo, MassData, OfflineData)
VALUES ('SYSTEM.ExportConfig', '/de/cursor/jevi/common/export/ExportConfigWorker$!!$MeineId', '' ,'SYSTEM', '',
'<ExportConfig type="CSV" file="c:\test.csv"> <Format fileFormat="UTF-8" dateFormat="dd.MM.yyyy hh:mm:ss" numberGroupDigit="." numberDecimalSymbol="," booleanTrue="true" booleanFalse="false" nullValue="null" binary="Export fuer diesen Datentyp nicht moeglich" /> <SeparatorFormat separator=";" lineSeparator="#" tableSeparator="::" tableLineSeparator="%" replaceSeparator="" replaceLineSeparator="" replaceTableSeparator="" replaceTableLineSeparator="" /> <Field name="MatchCode" fieldName="MatchCode.Customer" valueType="VALUE" fieldType="SIMPLE" /> <Field name="Name1" fieldName="Name1.Customer" valueType="VALUE" nullValue="" fieldType="SIMPLE" /> <Field name="DateOfOrigin" fieldName="DateOfOrigin.Customer" valueType="VALUE" nullValue="" fieldType="SIMPLE" /> <Field name="Freenumber1" fieldName="Freenumber1.Customer" valueType="VALUE" nullValue="" fieldType="SIMPLE" /> <Field name="Activities" aliasName="GPAktivitaeten" fieldType="TABLE" > <Field name="Activities_Subject" fieldName="Subject.Activity" valueType="VALUE" fieldType="SIMPLE" /> <Field name="Activities_DelegatedTo" fieldName="DelegatedTo.Activity" valueType="VALUE" fieldType="SIMPLE"/> <Field name="Activities_DelegatedBy" fieldName="DelegatedBy.Activity" valueType="VALUE" fieldType="SIMPLE"/> </Field> <Field name="PersontypeKey" fieldName="PersontypeKey.Customer" valueType="KEY" nullValue="" fieldType="SIMPLE" /> </ExportConfig>',
1, GETDATE(), 'TECH_USER', GETDATE(), 'TECH_USER', NULL, '#EMPTY-KEY#', NULL, NULL, 0, 0)
Dabei ist der Eintrag /de/cursor/jevi/common/export/ExportConfigWorker$!!$MeineId
wichtig. Der Teil "MeineId" legt die Id fest, unter der die Konfiguration gefunden wird. Sie muss in der Workflowaktion angegeben werden.
Die Suche
Die angegeben Suchen müssen natürlich zur Ausführungszeit im System vorhanden sein. Für Erklärungen zum Aufbau von komplexen Suchen siehe Kapitel Verwaltung Komplexe Suchen. Für obiges Beispiel wurde die folgende komplexe Suche "MeineGeschaeftspartnerComplex" verwendet:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE CreateComplexSearch PUBLIC "ComplexSearchCreator.dtd" "ComplexSearchCreator.dtd">
<CreateComplexSearch>
<ComplexSearch Pk="2a6pd2414uaqim07ComplexSearch" PlainKey="MeineGeschaeftspartnerComplex" Description="" ParentComplexSearchPk="" CursorStandard="false" SearchType="SEARCHTYPE-EXPORT">
<ExtendedSearchMetaData PK="7neag014ud36dfvExtendedSearchMetaData" Description="Geschaeftspartner" Sequence="1" CollectorFields="Pk.Customer,CUPK;" Templates="" ReturnType="RETURN_TYPE_MAIN" AliasName="Geschaeftspartner">
<ExtendedSearch PK="28kdk4914uaaj21jExtendedSearch" PlainKey="Geschaeftspartner" Description="Geschaeftspartner" UserPrivateSearch="false" QuickSearch="false" UseCost="true" IgnoreCase="true" SubmaskOnly="false" SystemSearch="false" CursorStandard="false" UseDistinct="false" TopCount="100">
<Query>
<SubQuery operator="de.cursor.jevi.common.search.Operator$AndOperator" relationName="" entityName="Customer" subQueryInSearchResult="true" useExists="false" useOuterJoin="false" optionalQuery="false" breakQuery="false" hint="">
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>MatchCode.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>PersontypeKey.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="false" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Active.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.EqualFunction" numberOfParameters="1">
<Parameter parameterClassName="java.lang.Boolean" parameterValue="true" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Name1.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>DateOfOrigin.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Freenumber1.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Freenumber2.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Name2.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Pk.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
</SubQuery>
</Query>
</ExtendedSearch>
</ExtendedSearchMetaData>
<ExtendedSearchMetaData PK="9geklt14ud36dg2ExtendedSearchMetaData" Description="GPAktivitaeten" Sequence="2" CollectorFields="" Templates="Pk.Customer,CUPK;" ReturnType="RETURN_TYPE_DETAIL" AliasName="GPAktivitaeten">
<ExtendedSearch PK="2qci54014ucttbdvExtendedSearch" PlainKey="GPAktivitaeten" Description="GPAktivitaeten" UserPrivateSearch="false" QuickSearch="false" UseCost="false" IgnoreCase="true" SubmaskOnly="false" SystemSearch="false" CursorStandard="false" UseDistinct="false" TopCount="100">
<Query>
<SubQuery operator="de.cursor.jevi.common.search.Operator$AndOperator" relationName="" entityName="Activity" subQueryInSearchResult="true" useExists="false" useOuterJoin="false" optionalQuery="false" breakQuery="false" hint="">
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Subject.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>StartDate.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>DelegatedTo.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>DelegatedBy.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>ActTypeKey.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>ContactResult.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>DefaultOpportunity.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Priority.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>DefaultProject.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>ActStatusKey.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="false" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Active.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.EqualFunction" numberOfParameters="1">
<Parameter parameterClassName="java.lang.Boolean" parameterValue="true" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="true" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Pk.Activity</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<SubQuery operator="de.cursor.jevi.common.search.Operator$AndOperator" relationName="rCuAc" entityName="Customer" subQueryInSearchResult="true" useExists="false" useOuterJoin="false" optionalQuery="false" breakQuery="false" hint="">
<Condition searchResultField="false" listKey="false" searchField="false" deleteable="true" readOnly="false" defaultSearchValue="true">
<AttributeName>Active.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.EqualFunction" numberOfParameters="1">
<Parameter parameterClassName="java.lang.Boolean" parameterValue="true" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Pk.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.InFunction" numberOfParameters="32">
<Parameter parameterClassName="de.cursor.jevi.common.search.template.ParameterTemplate" parameterValue="Platzhalter (wird zur Laufzeit gesetzt)" />
</Function>
</Condition>
</SubQuery>
</SubQuery>
</Query>
</ExtendedSearch>
</ExtendedSearchMetaData>
</ComplexSearch>
</CreateComplexSearch>
Das Ergebnis
Diese Konfiguration würde eine Ausgabe der folgenden Art bewirken (händisch formatiert, um sie besser lesbar zu machen):
MatchCode;Name1;DateOfOrigin;Freenumber1;Activities;PersontypeKey#
CURSOR GIESSEN;CURSOR Software AG;01.06.1987 12:00:00;;Vertragsverlaengerung::EMPTY-KEY::EMPTY-KEY%;U#
CURSOR ENTWICKLUNG;CURSOR Software AG;01.06.1987 12:00:00;;;U#
ADIDAS MUENCHEN;Adidas GmbH;29.12.2002 12:00:00;;PI::EMPTY-KEY::EMPTY-KEY%;U#
ALLIANZ FRANKFURT;Allianz Versicherungsgesellschaft;29.12.2002 12:00:00;;EVI-Mailing::EMPTY-KEY::EMPTY-KEY%;U#
HEIDELBERGER DRUCK;Heidelberdruck und Co KG;29.12.2002 12:00:00;;Infos::EMPTY-KEY::EMPTY-KEY%;U#
DEUTSCHE BANK;Deutsche Bank;29.12.2002 12:00:00;;Angebot::EMPTY-KEY::EMPTY-KEY%;U#
ADAC MÜNCHEN ZENTRALE - INTERESSEN;ADAC e.V.;01.01.1955 12:00:00;;Antwort von Meyer mit Link zum VL::EMPTY-KEY::EMPTY-KEY%;U#
BMW GIESSEN - MARKTPARTNER;ASW Autohaus Süd-Würtele GmbH;01.11.1980 12:00:00;;neuer BMW 7er-Reihe::EMPTY-KEY::EMPTY-KEY%;U#
ENTEGA DARMSTADT;entega GmbH;29.11.2002 12:00:00;;;U#
SOMENTEC LANGEN;SOMENTEC Software AG;29.11.2002 12:00:00;;Vertragsverlaengerung::EMPTY-KEY::EMPTY-KEY%
Vertragsverlaengerung angenommen::EMPTY-KEY::EMPTY-KEY%;U
Die erste Zeile enthält die angegebenen Feldnamen getrennt durch den "separator" (Wert: ";") und abgeschlossen mit dem "lineSeparator" (Wert: "#"). "Activities" ist dabei die Tabellensuche die abhängig konfiguriert wurde. In den nächsten Zeilen folgen die Werte getrennt durch den "separator" und abgeschlossen mit dem "lineSeparator". Für "Activities" besteht der Wert aus den Werten der Tabellensuche getrennt durch den "tableSeparator" (Wert: "::") und abgeschlossen mit dem "tableLineSeparator" (Wert: "%"). Alle diese Werte wurden in der Konfiguration so festgelegt.
Direkte Übergabe
Hier ein weiteres Beispiel für einen Workflow. Er nutzt die Möglichkeit, die XML-Konfiguration direkt in die CSVExportAction hinein zu geben. Dazu wird in diesem Beispiel die Konfiguration in einer Notiz hinterlegt und diese anhand des Pks gesucht.
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE WorkFlowMapping PUBLIC "workflow" "..\..\..\common\workflow\workflow.dtd">
<WorkFlowMapping WorkFlowID="MyTimedWorkflow" Description="Beispielworkflow" ExecutionType="0">
<InternalDescription>
Beispielworkflow
</InternalDescription>
<Step No="1">
<Event Name="TimerWFEvent">
<EventToContextMap>
<SimpleMapping FromName="SessionId" ToName="SessionId"/>
</EventToContextMap>
</Event>
<Conditions/>
<!-- Die Suche "MeineNotiz" ausführen mit dem Pk der Notiz, in der die Konfiguration hinterlegt wurde. -->
<Actions>
<Action Name="SearchAction">
<ContextToActionMap>
<ValueMapping Name="SearchKey">
<Parameter Name="SearchKey" DataType="java.lang.String" Value="10v9fqk14vp22666ExtendedSearch"/>
</ValueMapping>
<ValueMapping Name="SessionId">
<Parameter Name="SessionId" DataType="java.lang.String" Value=""/>
</ValueMapping>
<ValueMapping Name="SearchParameter">
<Parameter Name="SearchParameter" DataType="java.lang.String" Value="32sr56614vp1ot4mNo"/>
</ValueMapping>
<ValueMapping Name="SearchField">
<Parameter Name="SearchField" DataType="java.lang.String" Value="Pk.Note"/>
</ValueMapping>
</ContextToActionMap>
</Action>
</Actions>
<FollowingSteps>
<No>2</No>
</FollowingSteps>
</Step>
<Step No="2">
<Event Name="SearchAction">
<EventToContextMap>
<SimpleMapping FromName="AttributeContainer" ToName="GefundeneNotizen"/>
<SimpleMapping FromName="Size" ToName="AnzahlGefundeneNotizen"/>
<SimpleMapping FromName="SessionId" ToName="SessionId"/>
</EventToContextMap>
</Event>
<Conditions>
<!-- Wenn die Notiz gefunden wurde... -->
<Condition Name="WFStandardCondition">
<ContextToConditionMap>
<SimpleMapping FromName="AnzahlGefundeneNotizen" ToName="value"/>
</ContextToConditionMap>
<CheckValuesMap>
<ValueMapping Name="constant">
<Parameter Name="constant" DataType="java.lang.Integer" Value="0"/>
</ValueMapping>
<ValueMapping Name="operator">
<Parameter Name="operator" DataType="java.lang.String" Value=">"/>
</ValueMapping>
</CheckValuesMap>
</Condition>
</Conditions>
<Actions>
<!-- Die Notiz aus dem Vector holen. -->
<Action Name="IterateVectorAction">
<ContextToActionMap>
<ValueMapping Name="counter">
<Parameter Name="counter" DataType="java.lang.Integer" Value="0"/>
</ValueMapping>
<ValueMapping Name="SessionId">
<Parameter Name="SessionId" DataType="java.lang.String" Value=""/>
</ValueMapping>
<ValueMapping Name="GefundeneNotizen">
<Parameter Name="vector" DataType="java.util.Vector" Value=""/>
</ValueMapping>
</ContextToActionMap>
</Action>
</Actions>
<FollowingSteps>
<No>3</No>
</FollowingSteps>
</Step>
<Step No="3">
<Event Name="SearchAction">
<EventToContextMap>
<SimpleMapping FromName="SessionId" ToName="SessionId"/>
<SimpleMapping FromName="Note.Note" ToName="Konfiguration"/>
</EventToContextMap>
</Event>
<Conditions/>
<Actions>
<!-- Den Export mit der gefundenen Konfiguration starten. -->
<Action Name="CSVExportAction">
<ContextToActionMap>
<ValueMapping Name="SessionId">
<Parameter Name="SessionId" DataType="java.lang.String" Value=""/>
</ValueMapping>
<ValueMapping Name="ExtendedSearch">
<Parameter Name="ExtendedSearch" DataType="java.lang.String" Value="MeineGeschaeftspartner"/>
</ValueMapping>
<ValueMapping Name="Konfiguration">
<Parameter Name="Config" DataType="java.lang.String" Value=""/>
</ValueMapping>
</ContextToActionMap>
</Action>
</Actions>
<FollowingSteps/>
</Step>
</WorkFlowMapping>
Die Konfiguration
Diese Konfiguration wäre beispielsweise für diesen Workflow in der Notiz zu hinterlegen:
<ExportConfig type="CSV" file="c:\test.csv">
<Format fileFormat="UTF-8" dateFormat="dd.MM.yyyy hh:mm:ss" numberGroupDigit="." numberDecimalSymbol="," booleanTrue="true" booleanFalse="false" nullValue="null" binary="Export fuer diesen Datentyp nicht moeglich" />
<SeparatorFormat separator=";" lineSeparator="#" tableSeparator="::" tableLineSeparator="%" replaceSeparator="" replaceLineSeparator="" replaceTableSeparator="" replaceTableLineSeparator="" />
<Field name="MatchCode" fieldName="MatchCode.Customer" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Name1" fieldName="Name1.Customer" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="DateOfOrigin" fieldName="DateOfOrigin.Customer" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Freenumber1" fieldName="Freenumber1.Customer" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="PersontypeKey" fieldName="PersontypeKey.Customer" valueType="KEY" nullValue="" fieldType="SIMPLE" />
</ExportConfig>
Die Suche
Die Suche "MeineNotiz" wurde zum Finden der Notiz mit der Konfiguration genutzt.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE CreateComplexSearch PUBLIC "ComplexSearchCreator.dtd" "ComplexSearchCreator.dtd">
<CreateComplexSearch>
<ExtendedSearch PK="10v9fqk14vp22666ExtendedSearch" PlainKey="MeineNotiz" Description="MeineNotiz" UserPrivateSearch="false" QuickSearch="false" UseCost="true" IgnoreCase="true" SubmaskOnly="false" SystemSearch="false" CursorStandard="false" UseDistinct="false" TopCount="100">
<Query>
<SubQuery operator="de.cursor.jevi.common.search.Operator$AndOperator" relationName="" entityName="Note" subQueryInSearchResult="true" useExists="false" useOuterJoin="false" optionalQuery="false" breakQuery="false" hint="">
<Condition searchResultField="true" listKey="false" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Note.Note</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="false" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Active.Note</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.EqualFunction" numberOfParameters="1">
<Parameter parameterClassName="java.lang.Boolean" parameterValue="true" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Pk.Note</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.EqualFunction" numberOfParameters="1">
<Parameter parameterClassName="de.cursor.jevi.common.search.template.ParameterTemplate" parameterValue="Platzhalter (wird zur Laufzeit gesetzt)" />
</Function>
</Condition>
</SubQuery>
</Query>
</ExtendedSearch>
</CreateComplexSearch>
Dies ist die im obigen Beispiel genutzte Suche "MeineGeschaeftspartner":
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE CreateComplexSearch PUBLIC "ComplexSearchCreator.dtd" "ComplexSearchCreator.dtd">
<CreateComplexSearch>
<ExtendedSearch PK="prf3v414vp2tfpmExtendedSearch" PlainKey="MeineGeschaeftspartner" Description="MeineGeschaeftspartner" UserPrivateSearch="false" QuickSearch="false" UseCost="true" IgnoreCase="true" SubmaskOnly="false" SystemSearch="false" CursorStandard="false" UseDistinct="false" TopCount="-1">
<Query>
<SubQuery operator="de.cursor.jevi.common.search.Operator$AndOperator" relationName="" entityName="Customer" subQueryInSearchResult="true" useExists="false" useOuterJoin="false" optionalQuery="false" breakQuery="false" hint="">
<Condition searchResultField="true" listKey="false" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>MatchCode.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Name1.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>PersontypeKey.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="false" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Active.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.EqualFunction" numberOfParameters="1">
<Parameter parameterClassName="java.lang.Boolean" parameterValue="true" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Freenumber1.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>DateOfOrigin.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
<Condition searchResultField="true" listKey="false" searchField="true" deleteable="true" readOnly="false" defaultSearchValue="false">
<AttributeName>Pk.Customer</AttributeName>
<Function functionClassName="de.cursor.jevi.common.search.function.NoConditionFunction" numberOfParameters="0">
<FunctionProperty functionPropertyName="TableName" functionPropertyDataType="java.lang.String" functionPropertyValue="" />
</Function>
</Condition>
</SubQuery>
</Query>
</ExtendedSearch>
</CreateComplexSearch>
Konfiguration von Feldern in Relationen
Wenn Felder von verknüpften Entitäten ausgegeben werden sollen, müssen die Felder in der Konfiguration speziell konfiguriert werden.
Gegeben ist folgende Aktivitätensuche:
Für diese soll nun eine Konfiguration zum Export aller selektierten Felder geschrieben werden. Die Ausgabe der Aktivitätenfelder ist einfach:
<ExportConfig type="CSV" file="c:\test.csv">
<Format fileFormat="UTF-8" dateFormat="dd.MM.yyyy hh:mm:ss" numberGroupDigit="." numberDecimalSymbol="," booleanTrue="true" booleanFalse="false" nullValue="null" binary="Export fuer diesen Datentyp nicht moeglich" />
<SeparatorFormat separator=";" lineSeparator="#" tableSeparator="::" tableLineSeparator="%" replaceSeparator="" replaceLineSeparator="" replaceTableSeparator="" replaceTableLineSeparator="" />
<Field name="Betreff" fieldName="Subject.Activity" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Beginn" fieldName="StartDate.Activity" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Art" fieldName="ActTypeKey.Activity" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
...
</ExportConfig>
Nun wird die Konfiguration um die Ausgabe der Felder von "Delegiert von" und "Delegiert an" erweitert:
<ExportConfig type="CSV" file="c:\test.csv">
<Format fileFormat="UTF-8" dateFormat="dd.MM.yyyy hh:mm:ss" numberGroupDigit="." numberDecimalSymbol="," booleanTrue="true" booleanFalse="false" nullValue="null" binary="Export fuer diesen Datentyp nicht moeglich" />
<SeparatorFormat separator=";" lineSeparator="#" tableSeparator="::" tableLineSeparator="%" replaceSeparator="" replaceLineSeparator="" replaceTableSeparator="" replaceTableLineSeparator="" />
<Field name="Betreff" fieldName="Subject.Activity" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Beginn" fieldName="StartDate.Activity" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Art" fieldName="ActTypeKey.Activity" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Delegiert von Nachname" fieldName="Activity+rDelegatedBy_Activity.LastName.Employee" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Delegiert von Vorname" fieldName="Activity+rDelegatedBy_Activity.FirstName.Employee" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Delegiert an Nachname" fieldName="Activity+rDelegatedTo_Activity.LastName.Employee" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Delegiert an Vorname" fieldName="Activity+rDelegatedTo_Activity.FirstName.Employee" valueType="VALUE" fieldType="SIMPLE" />
...
</ExportConfig>
Wie zu sehen, muss in den entsprechenden "fieldName"-Attributen nun die Notation <Übergeordnete Entität>+<Relation>.<Attributname> verwendet werden. An diesem Beispiel kann man sehen, warum das nötig ist: Obwohl beides Verknüpfungen zwischen den Entitäten Aktivität und Mitarbeiter sind lautet die Relationen einmal "rDelegatedTo_Activity" und einmal "rDelegatedBy_Activity". Um dies unterscheiden zu können, ist diese Notation nötig. Bei mehrfach geschachtelten Zweigen verlängert sich diese Angabe entsprechend, wie zu sehen, wenn nun die Felder von Hauptansprechpartner und dessen Geschäftspartner mit ausgegeben werden:
<ExportConfig type="CSV" file="c:\test.csv">
<Format fileFormat="UTF-8" dateFormat="dd.MM.yyyy hh:mm:ss" numberGroupDigit="." numberDecimalSymbol="," booleanTrue="true" booleanFalse="false" nullValue="null" binary="Export fuer diesen Datentyp nicht moeglich" />
<SeparatorFormat separator=";" lineSeparator="#" tableSeparator="::" tableLineSeparator="%" replaceSeparator="" replaceLineSeparator="" replaceTableSeparator="" replaceTableLineSeparator="" />
<Field name="Betreff" fieldName="Subject.Activity" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Beginn" fieldName="StartDate.Activity" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Art" fieldName="ActTypeKey.Activity" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Delegiert von Nachname" fieldName="Activity+rDelegatedBy_Activity.LastName.Employee" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Delegiert von Vorname" fieldName="Activity+rDelegatedBy_Activity.FirstName.Employee" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Delegiert an Nachname" fieldName="Activity+rDelegatedTo_Activity.LastName.Employee" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Delegiert an Vorname" fieldName="Activity+rDelegatedTo_Activity.FirstName.Employee" valueType="VALUE" fieldType="SIMPLE" />
<Field name="AP Nachname" fieldName="Activity+rDefaultContactPerson_Activity.LastName.ContactPerson" valueType="VALUE" fieldType="SIMPLE" />
<Field name="AP Vorname" fieldName="Activity+rDefaultContactPerson_Activity.FirstName.ContactPerson" valueType="VALUE" fieldType="SIMPLE" />
<Field name="GP Kurzname" fieldName="Activity+rDefaultContactPerson_Activity-ContactPerson+rCustomerKey_ContactPerson.MatchCode.Customer" valueType="VALUE" fieldType="SIMPLE" />
</ExportConfig>
Hinter das bisher bekannte <Übergeordnete Entität>+<Relation> wird nun beim Geschäftspartner getrennt mit einem "-" ein weiteres <Übergeordnete Entität>+<Relation> gehängt. Zusammen ergibt sich also <Übergeordnete Entität>+<Relation>-<Übergeordnete Entität>+<Relation>.<Attributname>.
Geschickter Aufbau von Suchen
Es sollte darauf geachtet werden, Suchen "richtig herum" aufzubauen, um die Konfiguration des Exports zu vereinfachen.
Ein Beispiel:
Man hat eine komplexe Suche auf dem Ansprechpartner.
Die Hauptsuche selektiert Ansprechpartner. Bis hier hin ist nichts Besonderes zu beachten.
Die folgende Untersuche (Typ: Tabellensuche) soll nun Aktivitäten des Ansprechpartners selektieren
und würde folgende Konfiguration nach sich ziehen:
<ExportConfig type="CSV" file="c:\test.csv">
<Format fileFormat="UTF-8" dateFormat="dd.MM.yyyy hh:mm:ss" numberGroupDigit="." numberDecimalSymbol="," booleanTrue="true" booleanFalse="false" nullValue="null" binary="Export fuer diesen Datentyp nicht moeglich" />
<SeparatorFormat separator=";" lineSeparator="#" tableSeparator="::" tableLineSeparator="%" replaceSeparator="" replaceLineSeparator="" replaceTableSeparator="" replaceTableLineSeparator="" />
<Field name="LastName" fieldName="LastName.ContactPerson" valueType="VALUE" fieldType="SIMPLE" />
<Field name="MatchCode" fieldName="MatchCode.ContactPerson" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Sex" fieldName="Sex.ContactPerson" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Activities" aliasName="Aktivitaet" fieldType="TABLE">
<Field name="Activities_Subject" fieldName="ContactPerson+rCoPeAc.Subject.Activity" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Activities_DelegatedTo" fieldName="ContactPerson+rCoPeAc.DelegatedTo.Activity" valueType="VALUE" fieldType="SIMPLE"/>
<Field name="Activities_DelegatedBy" fieldName="ContactPerson+rCoPeAc.DelegatedBy.Activity" valueType="VALUE" fieldType="SIMPLE"/>
</Field>
</ExportConfig>
Wie zu sehen müssen die Felder der Aktivität mit einem Zusatz versehen werden, der beschreibt, dass die Felder der angehängten Aktivitäten gelesen werden sollen (Aufbau: "Übergeordnete Entität+Relation").
Mit diesem alternativen Aufbau würde die Konfiguration einfacher aussehen:
<ExportConfig type="CSV" file="c:\test.csv">
<Format fileFormat="UTF-8" dateFormat="dd.MM.yyyy hh:mm:ss" numberGroupDigit="." numberDecimalSymbol="," booleanTrue="true" booleanFalse="false" nullValue="null" binary="Export fuer diesen Datentyp nicht moeglich" />
<SeparatorFormat separator=";" lineSeparator="#" tableSeparator="::" tableLineSeparator="%" replaceSeparator="" replaceLineSeparator="" replaceTableSeparator="" replaceTableLineSeparator="" />
<Field name="LastName" fieldName="LastName.ContactPerson" valueType="VALUE" fieldType="SIMPLE" />
<Field name="MatchCode" fieldName="MatchCode.ContactPerson" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Sex" fieldName="Sex.ContactPerson" valueType="VALUE" nullValue="" fieldType="SIMPLE" />
<Field name="Activities" aliasName="Aktivitaet" fieldType="TABLE">
<Field name="Activities_Subject" fieldName="Subject.Activity" valueType="VALUE" fieldType="SIMPLE" />
<Field name="Activities_DelegatedTo" fieldName="DelegatedTo.Activity" valueType="VALUE" fieldType="SIMPLE"/>
<Field name="Activities_DelegatedBy" fieldName="DelegatedBy.Activity" valueType="VALUE" fieldType="SIMPLE"/>
</Field>
</ExportConfig>
Suchen sollten also auf der Entität starten, deren Felder ausgegeben werden sollen. Bei komplexen Suchen (Suchbehältern) sollte die Verknüpfung zur Hauptsuche dann über Besitzt-Zweige hergestellt werden.
CSV-Export der 3. Generation
CSV-Export direkt aus der Suchmaske
Der Benutzer muss über das neue Aktionsrecht 'Massendatenexport ausführen' (massdata.export.permission)' verfügen. Die Option ist nur in der Standard-Suchmaske verfügbar. Im Zuge des Datenexports wird die aktuelle Suche aus dem Suchfenster ohne Berücksichtigung von Selektionsgrenzen ausgeführt. Für die Generierung der Exportdatei wird das in der Entität "Datenexporte" hinterlegte Standard-Exportformat (Neuanlage und Pflege der Datenexporte) verwendet.
Abbildung: Konfiguration des Standardformates
Bei aktivierter Protokollierung des Export von Daten (siehe hier Protokollierung des Exports von Daten) wird jeder Vorgang des Datenexports aus dem Suchfenster festgehalten.
Wenn viele Daten exportiert werden, weil keine Kriterien definiert wurden und die Prüfung der Suchkriterien vor Ausführung in den Systemeinstellungen aktiv ist, kann der Anwender die Daten trotzdem exportieren, da der ressourcenintesive Anfrage auf einem Massenserver ausgeführt wird.
Abbildung: Datexportmöglichkeit bei keinen Suchkriterien
Wenn viele Daten exportiert werden, weil zu wenig Kriterien definiert wurden und die Prüfung der Suchkriterien vor Ausführung in den Systemeinstellungen aktiv ist, kann der Anwender die Daten trotzdem exportieren, da der ressourcenintesive Anfrage auf einem Massenserver ausgeführt wird.
Abbildung: Datexportmöglichkeit bei kostenbasierter Optimierung (Oracle)
CSV-Export eines Datenexports
Beim Export ist darauf zu achten, dass der Name der Vorlage übereinstimmt.