Skip to main content
Skip table of contents

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:

  1. CSV-Export über den klassischen Serienbrief als Hauptdokument (nur manuell ausführbar) (1. Generarion)

  2. CSV-Export über einen serverseitigen Workflow (timergesteuert oder innerhalb eines anderen Workflows) (2. Generation)

  3. 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
<?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

XML
<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

SQL
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
<?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):

CODE
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
<?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:

XML
 <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
<?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":

CODE
<?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:

CODE
<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:

XML
<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:

XML
 <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:

XML
<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:

XML
 <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.

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.