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:
CSV export via the classic serial letter as a main document (can only be done manually) (1st generation)
CSV export via a server-side workflow (timer-controlled or as part of another workflow) (2nd generation)
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.
![](../../../__attachments/69240766/SerialDocumentWizard_SelectConfigPage.png?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
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.
![](../../../__attachments/69240766/SerialDocumentWizard_EditSearchPage.png?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
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.
![](../../../__attachments/69240766/ExportConfigurationButton1%5B1%5D.jpg?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
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.
![](../../../__attachments/69240766/ExportConfigurationButton2%5B1%5D.jpg?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
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.
![](../../../__attachments/69240766/ExportConfigStep1%5B1%5D.jpg?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
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.
![](../../../__attachments/69240766/ExportConfigStep2%5B1%5D.jpg?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
The third step behaves exactly like step 2. This is where the separators are defined.
![](../../../__attachments/69240766/ExportConfigStep3%5B1%5D.jpg?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
Finally, the generated configuration is displayed and can now be saved.
![](../../../__attachments/69240766/Logi.png?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
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 |
m | 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 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
<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
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.
Search
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 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):
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 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:
<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 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:
<?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:
![](../../../__attachments/69240766/Aktivit%C3%A4tensuche_und_Teilnehmer%5B1%5D.jpg?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
A configuration for the export of all selected fields must now be written. Outputing the activity fields is easy:
<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":
<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:
<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.
![](../../../__attachments/69240766/APundAktSuche%5B1%5D.jpg?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
The main search selects the contact person. Nothing important to look out for up to here.
![](../../../__attachments/69240766/APSuche%5B1%5D.jpg?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
The subsequent subsearch (type: table search) should now select activities of the contact person
![](../../../__attachments/69240766/Suche1%5B1%5D.jpg?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
and would result in the following configuration:
<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").
![](../../../__attachments/69240766/Suche2%5B1%5D.jpg?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
This alternative structure would simplify the configuration:
<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.
![](../../../__attachments/69240766/KonfigurationExportformate.png?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
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.
![](../../../__attachments/69240766/KeineKriterienDatenexport.png?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
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.
![](../../../__attachments/69240766/KostenbasierteOptimierungDatenexport.png?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
Figure: Data export options with cost-based optimization (Oracle)
CSV export of a data export
Ensure that the template name matches for the export.
![](../../../__attachments/69240766/DatenexportAndTimer.png?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)