Skip to main content
Skip table of contents

CSV export

Basics

The module Mass data server is needed for the CSV export.

There are several options for mass data exports in CSV format:

  1. CSV export via the classic serial letter as a main document (can only be done manually) (1st generation)

  2. CSV export via a server-side workflow (timer-controlled or as part of another workflow) (2nd generation)

  3. 3rd generation CSV export
    a) CSV export directly from the search mask (manual start)
    b) CSV export of a data export (timer-controlled start)

CSV export via the classic serial letter as main document

Execution is initiated via the menu Marketing / Serial letter. The user selects a serial letter template in the wizard. Should the user select a template for which relevant export configurations are saved, then their selection page will be displayed next.

There are 2 options here as well. The serial letter creation can be done with the default method ('Start creation of serial letter'). Alternatively, one of the existing configurations can be selected to delegate the CSV export order to an alternative server.

When the first method is used, the wizard will continue with the usual procedure. When the second method is used, then only one more mask page will appear, where the user can limit the search criteria of the complex search on which the procedure is based. The relevant job is delegated to an alternative server when the wizard closes and the user can now wait for job completion.

Notification after completion

The user will be notified of the completion of the task in the task list under Open system jobs.

CSV export via a server-side workflow

XML export configuration generation from within a search

The user clicks the button Create export configuration for search in the search dialog to start the wizard and configure a Search The extended toolbar must be active.


The user clicks the button Generate configuration in the admin console under the menu item Manage complex searches to generate the configuration for a complex search.

Wizard

In the first step, the search is executed and all fields for the configuration are added. A notification will appear on the first page if any problems occur. In this example, the search selects no fields.


In the second step, the format of the output file and special values like placeholders for binary values or logical values are specified. Should validation fail, then a notification will appear immediately in the text field below.

The third step behaves exactly like step 2. This is where the separators are defined.

Finally, the generated configuration is displayed and can now be saved.

Explanation of the components

ExportConfig

Attribute

Description

type

Specifies the export file type. To date, only "CSV" was supported for CSV files.

file

Specifies the qualified file path for the export. The path refers to the machine of the application server if no explicit network path is provided.

Format

Attribute

Description

fileFormat

Specifies the encoding of the file. E.g. "UTF-8" (always without byte order mark, http://de.wikipedia.org/wiki/Byte_Order_Mark), "CP1252" or "ISO-8859-1" (does not support € character)

dateFormat

Specifies the format for exported date information. See table 'Extra' for valid values.

numberGroupDigit

Specifies the symbols used for grouping numerals. This must only be one symbol. Example: "." changes "23000" to "23.000".

numberDecimalSymbol

Specifies the separator between the integer and the decimals. This must only be one symbol.

booleanTrue

Specifies the value written to the file if the database contains the Boolean value "true".

booleanFalse

Specifies the value written to the file if the database contains the Boolean value "false".

nullValue

Specifies the value written to the file if the database contains an empty value,e.g. NULL in Oracle or empty string in MSSQL.

binary

Specifies the value written to the file if the value is a binary value, e.g. a picture.

Possible date configurations

Letter

Description

Example

G

Epoch

after Christ

y

Year

1996 or 96

M

Month in the year

February or Feb or 02

w

Week in the year

27

W

Week in the month

2

D

Day in the year

189

d

Day in the month

10

F

Day in the week of the year

2

E

Day in the week

Fr or Friday

a

AM/PM

PM

H

Hour of the day (0-23)

0

k

Hour of the day (1-24)

24

K

Hour in AM/PM (0-11)

0

h

Hour in AM/PM (1-12)

12

s

Minute in the hour

30

s

Second in the minute

55

S

Millisecond

978

z

General time zone

CEST

Z

RFC 822 time zone

+0200

EXAMPLE

"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

It is best to look at the export result to get an understanding of how the separators work.

Attribute

Description

separator

The separator between individual values, e.g.he fields that were configured with the "Field" tag. Such a value can also be the result of a table search and can consist of multiple values separated by the 'tableSeparator' and completed with the 'tableLineSeparator'. It must not be the same as one of the other separator values or contain one of those.

lineSeparator

The separator between the individual datasets. This separator will therefore be set after all values contained in a configuration are written one time. It must not be the same as one of the other separator values or contain one of those.

tableSeparator

The separator between the individual table values, i.e. the values of a related table search - the separator between the values of nested "Field" tags under the "Field" tag of type "TABLE". Occurs only if a complex search was used and must only be stated if a "Field" tag of type "TABLE" was specified. It must not be the same as one of the other separator values or contain one of those.

tableLineSeparator

The separator between the individual table datasets. The final separator, once all values of nested "Field" tags under a "Field" tag of type "TABLE" were written one time. It must not be the same as one of the other separator values or contain one of those.

replaceSeparator

The value with which positions in the values for export will be replaced, which are equal to the "separator" value. Must not be equal to "separator".

replaceLineSeparator

The value with which positions in the values for export will be replaced, which are equal to the "lineSeparator" value. Must not be equal to "lineSeparator".

replaceTableSeparator

The value with which positions in the values for export will be replaced, which are equal to the "tableSeparator" value. Must not be equal to "tableSeparator".

replaceTableLineSeparator

The value with which positions in the values for export will be replaced, which are equal to the "tableLineSeparator" value. Must not be equal to "tableLineSeparator".

Field

Attribute

Description

name

The name written to the file for export for this field.

aliasName

Must only be set if "fieldType" is equal to "TABLE". Specifies the alias of the table, i.e. the alias of the relevant partial search of the complex search (a complex search must be used for "TABLE").

fieldType

One of the values "TABLE" or "SIMPLE". "TABLE" means that this "field" represents a table and therefore possesses nested "field" tags. Simple values or components of a table should have the value "SIMPLE" here. A complex search must be used if the value "TABLE" is set.

valueType

One of the values "VALUE", "KEY" or "DESC". In lookup fields, "KEY" allows the selection of the key, "DESC" the description and "VALUE" the primary key of the lookup value. In all other cases, this must be "VALUE".

fieldName

Specifies the attribute name of the field. Example: "MatchCode.Customer".

nullValue

Has the same effect as the same attribute in the "Format" tag and overwrites it for this field.

"Field" tags can be simply nested if the "fieldType" is equal to "TABLE". Multiple nesting is not permitted.

Workflow action

See chapter Workflows for information on how to upload workflows. The new workflow action "CSVExportAction" needs the following input:

Parameter

Description

ComplexSearch

This is where the name of the complex search is entered if a complex search is to be used. In this case, "ExtendedSearch" must not be filled.

ExtendedSearch

This is where the name of the simple search is entered if a simple search is to be used. In this case, "ComplexSearch" must not be filled.

SessionId

This is where the current SessionId must be provided. This ID is available in every workflow.

Config

The XML code of the configuration can be forwarded directly to the action via this parameter. In this case, "PropertyMapperID" must not be filled.

PropertyMapperID

This is where the ID part of the entry is stated if the export configuration was saved in the PropertyMapper. This is where the part "MyId" must be provided if the column "ID" in the PropertyMapper has the value of e.g. "/de/cursor/jevi/common/export/ExportConfigWorker$!!$MyId". In this case, "Config" must not be filled.

About the PropertyMapper

The following workflow is designed to be started with timer control and uses the action "CSVExportAction" to initiate the CSV export. "SessionId" must be provided. Additionally, EITHER the PlainKey of a simple search must be stated in "ExtendedSearch" OR the PlainKey of a complex search in "ComplexSearch". The action will not be executed if none of these or both are stated. In this case, a simple search is used and "ExtendedSearch" is therefore filled. Since the configuration is to be saved in PropertyMapper, "PropertyMapperID" is also filled.

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 entry / configuration

A PropertyMapper entry must be saved in the database to configure the export.

Example

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 the database it would be written under MSSQL, e.g. with

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)


Here, the entry /de/cursor/jevi/common/export/ExportConfigWorker$!!$MyId is important. The part "MyId" specifies the Id under which the configuration can be found. It must be stated in the workflow action.

The stated searches must, of course, be available in the system at the time of execution. See chapter Manage complex searches for explanations of the structure of complex searches. The complex search "MeineGeschaeftspartnerComplex" was used for the above example:

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

This configuration would effect an output as follows (manually formatted for better legibility):

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

The first line contains the stated field names, separated by the "separator" (value: ";") and ended with the "lineSeparator" (value: "#"). "Activities" is the dependently configured table search. Next follow lines with values separated with the "separator" and ended with the "lineSeparator". For "Activities", the value consists of the table search values, separated by the "tableSeparator" (value: "::") and ended with the "tableLineSeparator" (value: "%"). All these values were specified in the configuration this way.

Direct forwarding

Here is another example for a workflow. It utilizes the option of forwarding the XML configuration directly into "CSVExportAction". In this example, the configuration is saved in a note and searched for based on the Pk.

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

The following configuration would be saved for the workflow in the note:

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

The search "MyNote" was used to find the note containing the configuration.

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>


This is the search "MeineGeschaeftspartner" used for the above example:

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>
Configuring fields in relations

Fields that are supposed to be output by related entities must be especially configured in the configuration.

The following activity search is given:

A configuration for the export of all selected fields must now be written. Outputing the activity fields is easy:

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>

The configuration will now be extended to include the output of the fields "Delegated from" and "Delegated to":

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>


As we can see, the notation <Parent entity>+<Relation>.<Attribute name> must be used in the relevant "fieldName" attributes. This example shows why that is necessary: Although both links between the entities are "Activity" and "Employee", the relations are once "rDelegatedTo_Activity" and once "rDelegatedBy_Activity". This notation is needed to allow differentiation. This statement gets longer for multiply nested branches as we see here if the fields of the main contact person and his business partner are also output:

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>

We now add another <Parent entity>+<Relation> after the previous <Parent entity>+<Relation> separated by a "-" for the business partner. Together this results in <Parent entity>+<Relation>-<Parent entity>+<Relation>.<Attribute name>.

Clever search structure

Make sure to construct searches the "right way around" to simplify the export configuration.

An example:
We have a complex search for a contact person.

The main search selects the contact person. Nothing important to look out for up to here.

The subsequent subsearch (type: table search) should now select activities of the contact person

and would result in the following configuration:

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>

As we can see, the fields of the activity must receive an addition that describes that the fields of the appended activities should be read (structure: "Parent entity+Relation").

This alternative structure would simplify the configuration:

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>

Searches should be started in the entity, whose fields are to be output. In the case of complex searches (search containers), the link to the main search should then be established via the "Owns" branches.

3rd generation CSV export

CSV export directly from the search mask

The user must have the new action right 'Start export of mass data' (massdata.export.permission)'. This option is only available in the standard search mask. The current search do not include selection limits is executed from within the search dialog as part of the data export. The default export format (Data export creation and maintenance) saved in the entity "Data exports" is used for the generation of the export file.

Figure: Default format configuration


Every data export activity from within the search mask is logged (see Logging the data export), provided the log function is active.

Where large amounts of data are exported, because no criteria were defined and Check search criteria is active in the system preferences, the user can still do the export, as the resource-intensive request is executed on a mass data server.

Figure: Data export options where no search criteria are set


Where large amounts of data are exported, because too few criteria were defined and Check search criteria is active in the system preferences, the user can still do the export, as the resource-intensive request is executed on a mass data server.

Figure: Data export options with cost-based optimization (Oracle)

CSV export of a data export

Ensure that the template name matches for the export.

JavaScript errors detected

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

If this problem persists, please contact our support.