Professional Documents
Culture Documents
AureaCRM - Web DeveloperGuide 13.3
AureaCRM - Web DeveloperGuide 13.3
AureaCRM - Web DeveloperGuide 13.3
Version 13.2.0
Notices
Notices
Copyright © 2004–2021. Aurea Software, Inc. (“Aurea”). All Rights Reserved. These
materials and all Aurea products are copyrighted and all rights are reserved by Aurea.
This document is proprietary and confidential to Aurea and is available only under
a valid non-disclosure agreement. No par t of this document may be disclosed in
any manner to a third par ty without the prior written consent of Aurea. The information
in these materials is for informational purposes only and Aurea assumes no respon-
sibility for any errors that may appear therein. Aurea reserves the right to revise
this information and to make changes from time to time to the content hereof without
obligation of Aurea to notify any person of such revisions or changes.
You are hereby placed on notice that the software, its related technology and services
may be covered by one or more United States (“US”) and non-US patents. A listing
that associates patented and patent-pending products included in the software,
software updates, their related technology and services with one or more patent
numbers is available for you and the general public’s access at https://markings.ip-
dynamics.ai/esw/ (the “Patent Notice”) without charge. The association of products-
to-patent numbers at the Patent Notice may not be an exclusive listing of associa-
tions, and other unlisted patents or pending patents may also be associated with
the products. Likewise, the patents or pending patents may also be associated with
unlisted products. You agree to regularly review the products-to-patent number(s)
association at the Patent Notice to check for updates.
Aurea and Aurea Software are registered trademarks of Aurea Software, Inc. in the
United States and/or other countries. Additional Aurea trademarks, including regis-
tered trademarks, are available at: https://www.aurea.com/legal/trademarks/. Jive
is a registered trademark of Jive Software, Inc. in the United States and/or other
countries. Additional Jive trademarks, including registered trademarks, are available
at: https://www.jivesoftware.com/legal/.
Table of Contents
Preface............................................................................................................6
About this documentation.....................................................................................................................6
Notation conventions.............................................................................................................................6
Aurea global support.............................................................................................................................7
Chapter 1: Introduction................................................................................8
Preface
For details, see the following topics:
Notation conventions
This document uses the following notation conventions:
Convention Meaning
Fixed-width Fixed-width font indicates code, path names, file names, envi-
ronment variable names, parameter names, command names,
machine names, URLs.
Bold Fixed- Bold Fixed-width font is used to indicate user input or to
width emphasize cer tain lines of code.
Italic Fixed-width Italic Fixed-width font indicates a placeholder for which you
must supply a value.
Bold Sans serif Bold sans serif typeface indicates the names of graphic user
interface elements such as dialog boxes, buttons, and fields.
Italic serif In text, italic serif typeface indicates the first use of an impor-
tant term. The term is defined in the glossary.
Underlined Underlined text in command lines and parameter descriptions
indicate that you only have to enter the underlined par t of the
command or parameter name. For example, if you use
the -LOGFILE parameter in a command, you only need to enter
-LOGF .
AUREA CONFIDENTIAL 6
Preface
Convention Meaning
... Three consecutive periods indicate that you can repeat the
immediately previous item. In code examples, they can be
horizontal or ver tical to indicate omissions.
Menu > Choice An angle bracket between two menu items indicates that you
should choose an item from a menu. For example, the notation
File > > Exit means: "Open the File menu and choose Exit."
>> Links to related information in other chapters or documents are
indicated using the >> symbol.
AUREA CONFIDENTIAL 7
Chapter 1: Introduction
1
Introduction
This document provides you with the information you need for customizing Aurea
CRM Web using the advanced designer features and by applying client- and/or
server-side using the provided SDKs.
There are three methods to customize and extend the functionality of Aurea CRM
Web:
1. Customize the application using Aurea CRM Designer.
2. Extend the client functionality by adding JavaScript code.
3. Extend the server-side framework by adding C# code.
The order of these methods reflects the complexity of using them – while it is rather
simple to use Aurea CRM Designer to customize the application, there may be some
specific features that cannot be implemented with this tool, and you will need to do
some JavaScript programming. In some cases - especially when you add ASPX
pages with server-side code - if you want to extend to underlying data model by
adding complex vir tual links or custom fields, or if you want to transfer data from
the server to the client in a way that is not suppor ted out-of-the-box, you may even
extend the server business logic using C# (or any other .Net programming language
you like).
The Aurea CRM Designer application itself and its mechanisms for handling config-
urations, users, and data stored in the designer database are described in the
CRM.designer chapter in the CRM.Web Administrator Guide.
With CRM.designer, you can perform simple customizations like defining field groups,
headers, menus, queries, analyses and wizards (described in the CRM.Web Admin-
istrator Guide) as well as advanced customizations as described in this document
in Advanced designer Customizations on page 10 which often only make sense in
connection with some programming.
With client-side programming you can e.g. extend the functionality of the details
control with field hooks, include project-specific record handling functions especially
in wizards, or even build your own custom pages using the existing Aurea CRM Web
framework. You can find details on the possibilities of client-side programming in
Client-Side Programming Concepts on page 32; additionally the Aurea CRM web
Client Reference (available separately as a .CHM file) provides you with a descrip-
tion of the complete client SDK.
AUREA CONFIDENTIAL 8
The server par t of the Aurea CRM web application consists of the ASP.NET applica-
tion itself and the mmObjects.dll containing the Aurea CRM business logic (plus
some additional suppor t DLL’s). You can extend both by adding additional pages
to the application or including your own business logic DLL that derives from and
extends existing classes. You can find all information you require for server-side
programming in Server-Side Programming Concepts on page 111 of this manual; and
the Aurea CRM web Server Reference (available separately as two .CHM files)
provides you with the complete server SDK of Aurea CRM web. Other Programming
Concepts on page 133 of this manual provides you with information on some special
customization topics like XML repor ts.
AUREA CONFIDENTIAL 9
Chapter 2: Advanced designer Customizations
2
Advanced designer Customizations
The following advanced customization options are available in Aurea CRM Designer:
• Page Designer on page 10: Allows you to register additional ASPX pages (or any
other content page) used in the application menu, context menus, direct buttons,
or wizards.
• Form Designer on page 13: Allows you to define custom generic forms to arrange
available controls and content on a page. You can e.g. use a generic form with
the Wizard Form page to prompt for user input, for star t pages, or with the
ShowForm page call to display content.
• Global Scripts on page 30: Allows you to add your custom JavaScript code to the
Controller window on the client.
Page Designer
All available standard pages and their parameters are registered in the Page Designer
(for detailed description of the most useful pages, see Aurea CRM Web Administra-
tion Guide).
On the designer main page, click on Page Designer to get a list of available pages.
For each page you have the standard options of adding, copying, viewing or deleting
pages.
AUREA CONFIDENTIAL 10
Page Designer
Each page defined in the Page Designer has the following attributes:
• Callable from: Defines from where the Page can be called: from the application
menu (possible only if the page does not need a record parameter), from the
context menu (which also includes the possibility to call the page from a direct
button), and/or from within Wizards (if the page is “wizard enabled”). Any
combination of these options is possible.
• Description: A description of the page, visible only in Aurea CRM Designer.
• Page ID: Not used.
• Help ID: Used when the user opens the context-sensitive help (by pressing “F1”).
• Filename: Physical Filename of the ASPX page.
Note: To display the content of an URL in Aurea CRM Web, you can use the existing
standard page “URL”.
AUREA CONFIDENTIAL 11
Chapter 2: Advanced designer Customizations
• Each page can have any number of parameters (listed in the 2nd “Query String
Arguments” section). A parameter Type is a combination of the type of element
and whether it is required or not.
The following Type parameters are available:
• Value: A text string.
• Record: A record consisting of two physical parameters: “Table” for the info
area and “Record-ID” for the record id. Note: Two additional Record types exist
for records with a fixed info area.
• Fieldgroup, Expand-Config, Search&List, HeaderGroup, Filter,
TableCaption, Treeview, Query, Form, Analysis: The name of a configuration
unit of that type (when configuring the page reference in menus etc. you may
either enter the name manually or select a unit from a combo box).
• RecordSet: A RecordSet consisting of records from one or more info areas.
• FormParam: A special structure used within wizards to pass user input from
a form to a page.
• Special: A placeholder that will be replaced by another value.
Each of the parameters listed above can be either fixed, mandatory or optional:
• Fixed: The value is defined in the Page Designer and cannot be modified in
the page call.
• Mandatory / Must: The value must be supplied in the page call.
• Optional: The value may be supplied or omitted in the page call.
• Each parameter has a Name and a Description (both visible in the Page Call),
and – depending on the type – some sor t of value.
• For each parameter you may enter a sor t number Nr.. In the Page Call, all
parameters are sor ted according to these numbers (and parameters without a
AUREA CONFIDENTIAL 12
Form Designer
number are added at the end). The most impor tant parameters for your page
should have a number, but this numbering is only used within Aurea CRM Designer
and does not influence the web application.
Whether a parameter is available depends on the context of the Page Call:
• References from the application menu (where you have no context information):
No Record, but Form or Special parameters are available.
• References from the context menu: Besides Value parameters, use the Record
parameter of the record for which the context menu is displayed. If available, you
can also use the Linked Record parameter containing the linked record from the
SearchAndList page.
• References from direct buttons: The same rules as for context menus apply. On
SearchAndList pages, the record id of the selected record from the list completes
the Record parameter.
• References within wizards: You can use each input parameter of the wizard step
and each output parameter for the optional sub-step for the Page Call. You can
also use Form parameters.
Form Designer
Generic forms can be used e.g. to define formats like the activity execution format,
in wizards to enable users to enter custom data, or to create a role-specific star t
page. Using the Form Designer, you can define and/or modify generic forms.
Examples of existing generic forms are:
• ActExecution : Used to edit Activity Execution formats. ActExecution uses the
sub-forms
AD_eMail,AD_MailMerge,AD_SMS, AD_Std,
RecordFormat,SplitChars
and
Format:Label.
• StartPage_General : Used on the star t page.
• WizForm:OJPartType and WizForm:Y1PartType : Used in the “Create New Par ticipant”
wizard for Proper ties (OJ) and Oppor tunities (Y1) in the BTB ver tical; exemplifies
how to use a form within a wizard.
• TestDataViewer : An example of a form with dependent combo boxes.
On the designer main page, click on Generic Form to see a list of all available
forms. For each form you have the standard options of adding, copying, viewing or
deleting the form.
AUREA CONFIDENTIAL 13
Chapter 2: Advanced designer Customizations
To create a new generic form, enter its name in the entry field at the bottom of the
page. From the combo box, select whether you want to create a new form or copy
an existing one and press the button.
• Mask Type: Defines the primary layout of the form - select “Standard (Tabbed)”
for a form containing several tabs or “Plain” for a single tabbed form that has no
tabs on its top.
If you are using a tabbed control (type=“Standard (Tabbed)” ), you can add
the Text displayed for the tab and set HTML attributes on the tab’s <table> element
using Attr.
A tab consists of one or many rows. Click the button next to “New Row” to add
a row.
AUREA CONFIDENTIAL 14
Form Designer
For each row you can add Row-Attributes which are applied to the corresponding
table’s <tr> HTML element. For example style=’background-color:black;’ leads
to a black background for that row.
Note: No syntax check is performed, so syntax errors can lead to a corrupt form
layout.
Each row consists of one or many cells that are arranged horizontally. Select the
cell Type from the combo box and click the button to add the cell. The different
cell types and their attributes are described in the next section Form Cells on page
15.
If you want to rearrange elements on a form, cut an element using and then paste
it at another position using . (Note: You can also use to delete an element - the
removed element is still available from the paste buffer). The element is inser ted
before the element for which the paste button was clicked. You can cut and paste
tabs, rows and cells.
If you paste a row to a tab, the row is appended at the end of the tab. If you paste
a cell on another tab, it is added at the end of the first row. If you paste a cell on
another row, it is appended at the end of that row.
Form Cells
AUREA CONFIDENTIAL 15
Chapter 2: Advanced designer Customizations
To add a cell to a form, select the desired cell type from the combo box and click
the button. The following cell types are available:
• Label to display a language-dependent fixed text.
• Text to display an editable text box (=edit field).
• Combo for a combo box filled with values downloaded from the server
(see Combo Box Values / Combo-Data-Functions on page 21).
• Check to display a check box.
• Radio to display a radio button
• Form to display a tab of a sub-form within the form (see Using Sub-Forms on
page 26 for details).
• File to display a file upload control.
• IFRAME to display an <iframe> HTML element.
• Button to display a button e.g. to send a message to the wizard engine.
• Single Listbox to display a single-selection list box (with data retrieved from the
server, analogous to Combo).
• Multi Listbox to display a multi-selection list box (with data retrieved from the
server, analogous to Combo).
• DIV Element to display an HTML <div> element (with custom contents)
• Repetetive Form to display a reccurring sub-form (not implemented in Aurea
CRM Web)
• Date to display a date input field (i.e. and editable text box containing either a
valid date or nothing).
• Query to display a query field (which you can e.g. use on star t pages to display
query results).
• Analysis to display a predefined analysis.
Note: You should always define a width & height when using analyses in generic
forms. If you omit either of these values, the default behavior is as follows: If a
width but no height is defined, then the height is automatically set to be equal to
the width. If neither width nor height are defined, a default width is calculated
(100% divided by the number of columns used in the form), and the height is set
equal to the width.
AUREA CONFIDENTIAL 16
Form Designer
• Valuename: The name of the cell. This name is used to reference the cell in
JavaScript code and to define dependencies between cells.
For radio buttons, all buttons belonging to the same group must have the same
Valuename.
• Text: A language-dependent text displayed for the following cell types:
Label, Check, Radio and Button.
For Query cells, this is the text displayed above the query results (e.g. “You have
%1 new appointments”). “%1” is replaced with the number of records.
• Func: Provides information about how to pre-fill the cell. The content of Func
depends on the cell type:
• For Combo boxes and List boxes, Func contains the server function for
downloading the combo box / list box values (see Combo Box Values / Combo-
Data-Functions on page 21).
• For Radio buttons, you can either supply the value if the radio button is checked,
or you can supply two values separated by a semicolon with a checked (first)
and unchecked (second) value. If you omit this attribute, the radio button has
no specific value in its group, but will get the value “true” or “false” depending
on its checked state.
• For Check boxes, you can supply the checked and unchecked value. Default
values are “true” and “false”. You can change the default values by entering
two values separated by a semicolon. If you only supply one value, this is the
checked value and the unchecked value is left blank.
• For IFRAMEs, Func contains the source for the <iframe> contents.
• For Forms, Func contains the name of the sub-form.
• For DIV Elements, Func contains the <div>’s ID-attribute.
AUREA CONFIDENTIAL 17
Chapter 2: Advanced designer Customizations
• For Buttons, Func contains the event number fired to the Wizard handler when
the button is clicked (if used within a wizard).
• For Query and Analysis, Func contains the name of the query / analysis. See
the Aurea CRM Web Administrator Guide (chapter “Advanced Customisations”,
sections “Filters and Queries” and “Analyses”) for a complete description on
defining a query or analysis used in the Func argument.
• For MenuLink, Func contains the name of the menu action (e.g.
ID_NET_PERSON_SEARCH) that is executed when the user clicks on the link.
• For Generic, this entry is used for parameters for the Generic Form Controls
on page 27.
• For Rep, Func may contain a variable default value for the rep: curRep, cur-
Group, curLeader, curDeputy and curSuperior (Note: in the generic form,
you must not use $ as a prefix for the default value since $ is reserved for
variables of the form).
• Span: Sets the colspan attribute of the corresponding <td> table cell.
• Hook: Allows you to provide a client JavaScript function that is called whenever
the field value is changed. If you use the Hook attribute, enter a valid function
call using the following four arguments:
• “ msg ”: the sent message - for cells the FORM_MSG_CHANGED (3)
• “ addparam ”: an additional parameter; currently 0 is passed for this message
• “ window ”: the window in which the form is displayed
• “ form ”: the form object
• Flags: Used to change the display style. Select BOLD to display text in bold
or UNDERLINE to display text underlined (for labels, check boxes and radio buttons).
If you select NO NOBR , the cell is not placed within <nobr> tags and the browser
wraps the content of this cell.
• TD-Attributes: Attributes applied to the <td> HTML element of the form’s table.
You can use more than one TD attribute.
• Item Attributes: Additional attributes applied to the item in HTML.
• Querystring: Copies the field into a Wizard Form Parameter with this value (see
section Using Forms within Wizards on page 26for details).
• Options: Allows you to define additional options - multiple options are separated
by semicolons. The content of Options depends on the cell type:
• For Combo boxes, you can set the CATCOMBO option to access the “Add Catalog
Value” feature. ENABLEDESELECT creates an empty entry in the combo box
AUREA CONFIDENTIAL 18
Form Designer
allowing users to deselect the current value. If you want to set an initial value
for a combo box, use selectedIndex=<index> .
• For Check Boxes, the ORDERS (<Ordername>) attribute enables a special sor ting
feature. When the user clicks the check box labels, all check boxes with the
same Ordername are ordered in a specific way.
• If you have an XML path set, you need two XPath expressions separated by
semicolon: the first is the standard XPath and the second is the XPath for the
order attribute in XML (which defines the order of possible channels in the “Act.
Execution” format).
• For Repetitive forms, you can define the minimum and maximum occurrence
using MIN(<number>) and MAX(<number>) . With INIT(<number>) you can define
the count of occurrences initially used. ORDER allows reordering, DELETE allows
deletion, ADD creates an “Add” button and AUTOADD adds a new occurrence
every time an occurrence is filled.
• For Query, the mode(<mode number>) parameter defines the compact display
mode:
• 1 (default): Displays a link to the Query Result page, supplying the count of
records (if defined) in the link text.
• 2 : Displays a link to the Query Result page and also a button that opens a
popup window containing the data. You can specify the width and height of
the popup window using width([pixel]) and height([pixel]) e.g.
“ width(700);height(300) ”.
• 3 : Displays only the query results data.
• 4 : Displays the link to the Query Result page and the data itself.
AUREA CONFIDENTIAL 19
Chapter 2: Advanced designer Customizations
mode(1) mode(2)
mode(3) mode(4)
AUREA CONFIDENTIAL 20
Form Designer
AUREA CONFIDENTIAL 21
Chapter 2: Advanced designer Customizations
Syntax: TABLES
• FIELDS: Displays all field names of an infarea and returns the field ID.
Syntax: FIELDS;<InfArea>
• CATFIELDS: Displays all catalog fields of an infarea and returns the field ID.
Syntax: CATFIELDS;<InfArea>
• UCATFIELDS: Displays all catalog fields of an infarea that depend on a parent
catalog, and returns the field ID.
Syntax: UCATFIELDS;<InfArea>
AUREA CONFIDENTIAL 22
Form Designer
With the CATXML function the XML definition is based on an Aurea CRM catalog.
The value attribute represents the catalog value, and the catalog text is dis-
played if no label attribute is supplied.
• SCATXML: Displays the values from an XML file that is based on an Aurea
CRM catalog which has a parent catalog.
Syntax: SCATXML;<Info Area>;<Field Id>;<UCatValue>;<Xml File>;
<XPathExpr>[{;<Parameters>}]
With the SCATXML function the XML definition is based on an Aurea CRM
catalog that has a parent catalog. The value attribute represents the catalog
value and the catalog text is displayed if no label attribute is supplied.
1. RootCatalog CAT;KP;38
2. SecondCatalog CAT;KP;161;$RootCatalog
3. ThirdCatalog XML;ms.xml;/RootCatalogs/RootCatalogs[@value={0}]/
Second-
Catalogs/Second/Catalog[@value={1}/XMLCats/XMLCat;
$RootCatalog;$SecondCatalog
1. Infoarea TABLES
2. CatField UCATFIELDS;$Infoarea
3. UCatValue UCAT;$Infoarea;$CatField
4. CatValue CAT;$Infoarea;$CatField;$UCatValue
AUREA CONFIDENTIAL 23
Chapter 2: Advanced designer Customizations
designer: Generic Form definition for the top-most three rows of the right-hand
image
AUREA CONFIDENTIAL 24
Form Designer
The labels of the tabs may either be set as the label in the TabGroup cell (semi-
colon-separated list), or as individual texts in the RowGroup cells of the rows
belonging to the tab.
If the TabGroup element has a cell hook, it is called every time a tab is changed.
Note: When using a RowGroup inside a TabGroup, those rows that belong to
the RowGroup are not counted for the number of rows that belong to the TabGroup.
Example:
As RowGroup and TabGroup elements do not change the behavior of the form but
only how the cells are arranged, all cells of all tabs are created when the form is
created (there is no tab loading on demand as e.g. for the details control).
AUREA CONFIDENTIAL 25
Chapter 2: Advanced designer Customizations
Using Sub-Forms
It is possible to use a tab from a sub-form within another form (a cell of type “Form”
is filled with the whole tab). Create a “Form” cell and enter the name of the desired
sub-form in the Func attribute. If the sub-form has more than one tab, you can select
the tab by providing the tab number (semicolon-separated) e.g. Func=myForm;2 .
The value name of the cells in the sub-form is the value name of the form cell plus
the defined value name of the cell in the sub-form.
The XML path is added with the correct separator between the two XPath expres-
sions, the same applies for the QueryString argument.
In UPDATE_DEFAULT, examples that makes use of sub-forms are “Act. Execution”
(for defining the Activity Execution format) and “Recurring” (for defining the recur-
rence pattern of an appointment).
2. “WizForm: Y1Par tType” contains a Combo box cell with Func attribute CAT;Y2;6 –
this Func attribute fills the combo box with the available par ticipation types from
the corresponding catalog.
AUREA CONFIDENTIAL 26
Form Designer
3. When the user clicks the “Save” button, event 1 (as defined in the Func attribute
of the button) is fired. An array parameter contains a key-value pair with key F6 (as
defined in the Querystring attribute of the Combo) and the selected value of the
combo box.
4. The next step of the wizard calls the WizardSave-(New) page that creates the
new record. Par t of the QueryString is the F6 parameter from the passed array
parameter - it forces the page to fill field number 6 (Par ticipation Type) with the
value selected by the user.
For details on the generic controls delivered by update, see chapter Standard
Generic Form Controls on page 64.
• Using your Own Generic Controls
AUREA CONFIDENTIAL 27
Chapter 2: Advanced designer Customizations
On the Aurea CRM Designer main page, click the “Generic Controls” button if you
want to register your own generic form controls.
To create a new control, enter the name of your form control, select type
“Generic Control” from the combo box, and click the button. Then click
the button to configure your control (or any existing control that was created
in the current configuration).
See the chapters Generic Controls Interface Functions on page 69 and Sample:
Generic Form Controls on page 71 for fur ther information on implementing your
own generic controls.
Special Forms
The generic forms listed in this chapter have a special behavior or need special
configuration when used.
FormInlineQueryParametersTemplate
This form is used to include parametered queries in another form. The following
customizations are possible:
1. MaxRows (1): Users have a combo box at their disposal to choose the number of
results returned by the query. To adjust this value, enter the name of the
AUREA CONFIDENTIAL 28
Form Designer
OrgChart
This form is used to graphically display a user’s position in the organizational hier-
archy of your company (and called in the menu action ID_NET_ORGCHART. This
generic form requires at least two parameters:
• Type=Rep, ValueName= RepKey
• Type=Generic Control | FormOrgTreeControl, Func= $RepKey
The Rep control also suppor ts a variable default value for the rep in the FUNC pa-
rameter: curRep , curGroup , curLeader , curDeputy and curSuperior .
Note: In the generic form, you must not use $ as a prefix for the default value since
$ is reserved for variables of the form
AUREA CONFIDENTIAL 29
Chapter 2: Advanced designer Customizations
Global Scripts
The global scripts section controls which JavaScript source files are included in the
Controller window, and in which order.
Note: The JavaScript code included in the Controller must be correct to ensure
that the application works without errors.
To add additional JavaScript files, enter a name, the filename (with the path relative
to the application) and the order (you should append your files at the end of the
list!). Edit the settings of your script using the button.
AUREA CONFIDENTIAL 30
Global Scripts
Filename contains the relative path and name of your file. Note that the Display-
Order determines the order in which the JavaScripts files are loaded by the controller.
If you set “not included” for Flags, your script will be loaded on demand (recommend-
ed), while setting “source” will load the script immediately when the user logs in.
The “encoded” flag is deprecated.
You can call functions of global script files in context menus and from direct buttons
(using the JScriptCall
page call), and in hook functions.
AUREA CONFIDENTIAL 31
Chapter 3: Client-Side Programming Concepts
3
Client-Side Programming Concepts
To provide the rich user interface of Aurea CRM Web, a substantial amount of client-
side code is used.
All client-side code uses Microsoft JScript V5.6 (closely related to ECMA JavaScript
V1.5) which comes with Microsoft Internet Explorer V6.0 or higher.
ActiveX controls are solely used for specific functionalities like single letter creation,
timeline and flowchar t display, and for the integration with Aurea CRM phone.
Architectural Overview
To get a better understanding of Aurea CRM Web’s client-side framework, let’s take
a closer look on its architecture: Aurea CRM Web uses a combination of a frameset
and <iframe> elements to create its overall layout.
AUREA CONFIDENTIAL 32
Architectural Overview
or
GetController().InfoBox.PostMessage(“some message”);
• Top Frame: Contains the logos and the Quick Search (if positioned in the top
frame).
• Menu Frame: In addition to the left- and the top menus, the menu frame contains
an <iframe> element hosting the worker frame.
The frameset may also contain an extra frame for the Aurea CRM phone toolbar if
this functionality is enabled.
The Worker Frame acts as a host for all web pages (details, search and list, tree
view, analysis, …) displayed by Aurea CRM Web.
Every web page contains one or more Controls that work together to provide the
page’s functionality.
Controls build the client-side user interface by dynamically creating HTML using
Microsoft Internet Explorer's Document Object Model (DOM). Each control is imple-
mented by a JavaScript class.
Samples of controls used frequently throughout Aurea CRM Web are:
• SearchControl for looking up records.
• DetailsControl for displaying detailed information about a record.
• ListControl for displaying and manipulating lists of records.
• HeaderControl for displaying captions and toolbars.
• WizardControl for guiding users through complex operations.
• ...
A complete list of controls is provided in the Aurea CRM Web Client SDK Reference.
Example: The SearchAndList page contains a SearchControl, at least one ListControl
and several HeaderControls.
AUREA CONFIDENTIAL 33
Chapter 3: Client-Side Programming Concepts
In order to provide their services, most controls require data from the server. The
controls request this data by using Aurea CRM Web's communication Channels.
Channels provide a means to transfer data to and from the web server. Every
channel opened on the client has a corresponding endpoint on the Aurea CRM Web
server. This endpoint is called a Server Channel (or the "target" of the channel),
and is implemented as a C# class (see Chapter 4 Server-Side Programming Concepts
for more details on server channels).
Since all transfer operations on a channel are asynchronous, a callback function
can be provided that is called when the requested data has arrived from the web
server.
A typical request will result in the following flow of actions:
AUREA CONFIDENTIAL 34
Adding Client Code to the Application
Summary
This chapter provided a brief overview about the client-side programming concepts,
we will go into more detail in the following sections, where you will learn how:
• to add your own code to the application.
• controls are instantiated.
• you can hook into existing controls to customize their behavior.
• you can read, update and create new records.
• to customize your own wizards.
• to customize your forms.
• to create custom pages within the Aurea CRM Web framework.
AUREA CONFIDENTIAL 35
Chapter 3: Client-Side Programming Concepts
Whenever you add a reference to a specific script in the designer (e.g. a hook
function), you can now use this namespace structure (e.g. MyCompany.Controls.My-
Control ) and the framework will automatically take care about downloading the re-
source.
If you want to use one of your resources manually within another script, you have
to call LoadType :
// load the resource MyCompany.Controls, inside the function _OnResourceLoaded
// all elements of the given scriptfile will be available
Controller.ClassFactory.LoadType("MyCompany.Controls", _OnResourceLoaded);
Normally it’s a good idea to just use an anonymous function directly in the call of
the LoadType method:
// load the resource MyCompany.Controls, inside the function _OnResourceLoaded
Controller.ClassFactory.LoadType("MyCompany.Controls", function()
{
// the resources are available now.
});
AUREA CONFIDENTIAL 36
Controls and the Control Builder
or
[HTML]
<head>
<script type="text/javascript">
Page.OnLoad = function()
{
[some JavaScript code]
}
</script>
</head>
You can build the following commonly usable controls with the Control Builder (or
manually using their JavaScript classes):
• Query Control in compact display mode (class QueryControl ).
• Search Control (class SearchControl ).
• Context Menu Control (class ListMenuControl ).
• Button Control (class ButtonControl ).
• Lists and Sub-Lists ( class ListControl ) to display records in list view; the
Favourites List and Selection List as special record lists (also implemented in
class ListControl ).
• Text Control ( class TextControl ) to display one language-dependent text.
• Header Control ( class HeaderControl ).
• Generic Form Control ( class FormControl ).
AUREA CONFIDENTIAL 37
Chapter 3: Client-Side Programming Concepts
as soon as a page (e.g. Expand Page, Treeview, SearchAndList) is loaded, the
message box is displayed.
• Local Function
Add a script containing
function OnControlBuilderFinished(oControlBuilder,bSuccess)
{ alert("Control Builder finished"); }
e.g. to the “Expanded View Page” (to do so, go to the “Page Designer”, change
the parameter ‘Scripts’ to type Value – Fixed , and then go to the desired page
call and provide the name of your JavaScript file there) after “Invalidate Cache”
you will get a message box on the Expand page.
Controller Window
The controller window is an invisible frame of the Aurea CRM Web application that
is created after the user has successfully logged in, and remains active until the
user ends the session. The controller window includes all global scripts defined in
Aurea CRM Designer.
From any window of the Aurea CRM Web application, you can access the Controller
Window using either the function getController() or the prefix Controller , e.g.
[javascript]
var sApplyText = Controller.g_sApplyButtonText;
or
var sApplyText = getController().g_sApplyButtonText;
One special JavaScript file which is included in the controller window is the ASPX
page JSConfiguration.aspx , which produces JavaScript code and includes session-
specific information for the controller:
AUREA CONFIDENTIAL 38
Controller Window
If you define your own Web Configuration parameters in Aurea CRM Designer, these
values will automatically be included in this array.
AUREA CONFIDENTIAL 39
Chapter 3: Client-Side Programming Concepts
Note: You should not access this array directly but use the utility functions described
in Info Area Functions on page 81.
Note: You should not access the g_Images array directly but use the Controller
functions, image_getFilename(sImageName) and image_getLabel(sImageName) to
retrieve the filename and display label of an image.
Details Control
AUREA CONFIDENTIAL 40
Details Control
The Details Control is displayed on the Expand page and several other pages that
show the details of a record (like the Tree View page or Dashboard page). It is de-
fined by a Field Group’s “Details Control” definition which contains the displayed
tabs and the fields on those tabs.
The easiest way to manipulate data within the Details Control is to use a Hook
Function. Simply set a hook function in Aurea CRM Designer (in the Field Details)
on any field you want to observe (see also see chapter “Field Details Function At-
tributes” in the Aurea CRM Administrator Guide). The JavaScript code must be
added to a Global Scripts on page 30, and only the function name needs to be en-
tered in the Hook Function field in designer.
The following hook example shows how to access the Details Control and alter its
content:
[JavaScript]
// This hook is set on the “Company” field (field number 2)
// Whenever the company name is changed, the first 8 letters of the field’s value
// are copied to the “Synonym” field (field number 3)
function SetSynonymHook(elSource)
{
// get the details control object
var oDetails = DetailsControl_Get(elSource);
// get previous contents of the field
var oValue = oDetails.GetValue(elSource);
var sOldValue = oValue.FieldData.fieldvalue;
// get the new contents of the field
var sNewValue = elSource.value;
// if the field value has changed, copy the first 8 characters
// to the “Synonym” field (field number 3)
if(sOldValue !== sNewValue)
{
var oFieldValues = { 3: { Value: sNewValue.substr(0, 8) }};
oDetails.SetValues(“FI”, oFieldValues);
}
}
The following example shows how to access the text values of catalogs. We will
combine a number of values to create a subject for an appointment.
[JavaScript]
// This hook is set on the “Contact” and “Status” fields of MA (numbers 0 & 1 in
BTB).
// Whenever the value of these fields changes, the text values of the two fields
// are copied to the “Subject” field (number 103 in BTB), separated by ‘-’.
function SetSubjectHook(elSource)
{
// get the details control object
var oDetails = DetailsControl_Get(elSource);
// check if we have an appointment in the detail control object
if("MA" == oDetails.GetInfoArea())
{
// create an object for retrieving the catalog texts
var oCatalogsCtrl = new CatalogsControl(window);
// retrieve the type of the appointment (field number 0)
var oTypeVal = oDetails.GetValue("MA", 0);
var sType = oCatalogsCtrl.NumericToValue(oTypeVal.FieldData.fieldinfo,
oTypeVal.Value);
// retrieve the status of the appoinmtment (field number 1)
var oStatusVal = oDetails.GetValue("MA",1);
var sStatus = oCatalogsCtrl.NumericToValue(oStatusVal.FieldData.fieldinfo,
oStatusVal.Value);
// set field “Subject” (feld number 103) to 'Type - Status'
var oFieldValues = { 103: { Value: sType + " - " + sStatus }};
AUREA CONFIDENTIAL 41
Chapter 3: Client-Side Programming Concepts
To create your own details control, you need to define a Field Group in designer
and a <div> element in an HTML/ASPX file that contains the new control:
[html]
<div ID="myDetailsContainerDiv"></div>
[JavaScript]
var oDetails = DetailsControl_Display(elCallerWindow, 'FI', sRecID,
'myDetailsContainerDiv',
'Update', null, false, 'MyFieldGroup', null);
Expand Control
The Expand Control is used to display a record. It can be configured in Aurea CRM
designer for each info area in the “Expand-Configurations” section and consists of
a details control to display the actual record, a header control, a table caption, a
context menu, a default action, an attribute list, parent relations, a breadcrumb path
and alternative expand configurations. For more details on the elements of an Expand
Configuration, please see the Aurea CRM Web Administrator Guide.
An Expand Control can be created on a custom ASPX page using JavaScript:
[JavaScript]
// Create the Expand Control
var oExpandCtrl = new Controller.ExpandControl(elCallerWindow);
// Set the Expand Configuration you want to use
// - in this case “KP” (standard Expand Configuration for persons)
oExpand.SetExpandName(“KP”);
// Set the record you want to display
oExpand.SetRecord(sInfoArea, sRecordId);
// Create the Expand Control to show the record
oExpand.Create(“ExpandDiv”, “Show”);
[html]
<div ID="ExpandDiv"></div>
AUREA CONFIDENTIAL 42
Controls for Accessing Server Data
You can find the full list of the methods available for the Expand Control object in
the Aurea CRM Web Client SDK Reference.
This following chapters provided you with a description of how to use these controls.
For a full description of the control’s classes and methods, see the Aurea CRM Web
Client SDK Reference.
Record Control
The Record Control can be used for creating, reading, modifying or deleting a single
record.
AUREA CONFIDENTIAL 43
Chapter 3: Client-Side Programming Concepts
oRecord.SetLinkInfo(LinkInfo); // optional
oRecord.SetNotifyObject(oNotify);
oRecord.New();
In the notification function, you can get the record id of the newly created record
by calling the method GetRecordId() .
In the notification function, you can get the values of the requested field indices by
calling the method
GetFieldValues() .
As a special feature, the Record Control allows you to load records that are linked
to the current record with a vir tual parent relation – if you set this relation name by
calling method SetRelationName , you get the values of the parent record. In this
case, after loading the parent record, the record id and the info area of the Record
Control will change to that of the parent record. You can get the info area and record
id using the methods GetInfoArea() and GetRecordId() .
After a successful deletion of a record, the record id is set to -1 (since the record
no longer exists). If you need to know the record id of the deleted record, use the
method GetDeletedRecordId() .
Query Control
The Query Control allows you to load and execute predefined queries as well as
define custom queries to save, execute, or display the query definition or the query
result on the screen. You would also use the Query Control to read e.g. all child
records of a given parent record.
AUREA CONFIDENTIAL 44
Controls for Accessing Server Data
The Query Control can either be created manually in JavaScript code or by the
Control Builder.
The name of the control (e.g. the name of an existing <div> element in the current
window) if a display mode is used. The parameter can be null if no display mode
is used.
sDisplayMode
The display mode – “ Compact ” for the compact display mode showing a text and the
count of records only, or “” for the design mode. This parameter is ignored if the
Query Control is not displayed.
window
The given text is displayed, the predefined query is loaded and executed and when
the count of records are returned the text is redisplayed replacing “%1” with the
rowcount (“>maxresults” if more rows exist). Instead of hard coding the text, you
may use the textinfo attribute instead of the text attribute to select a language
dependent text from Aurea CRM Designer.
<DIV id='QueryDivId' build='Query' queryname='QueryName' maxresults='10'
textinfo='[textgroupname].[textid]'>
AUREA CONFIDENTIAL 45
Chapter 3: Client-Side Programming Concepts
[…]
}
In this example you find the result values in the oResult variable, which has the
following members:
Rows An array of result rows. A result row is an array with two elements
– the first element is an array of record Ids (one for each par ticipating
AUREA CONFIDENTIAL 46
Controls for Accessing Server Data
RecordSet Control
The RecordSet Control allows you to load and access sets of records. You can either
read data from a set of records defined by their Id, or you can execute a predefined
or custom query using the query control.
AUREA CONFIDENTIAL 47
Chapter 3: Client-Side Programming Concepts
If you want to read data from an already loaded query or custom created query,
pass the query control object instead of the query name to the ExecuteQuery method.
To retrieve the number of rows returned, call the method GetRowCount; to retrieve
the data itself, create an enumerator object by calling the method CreateEnumerator.
[javascript]
var oEnumerator = oRecordSet.CreateEnumerator();
The following methods may be called for the Enumerator Object to retrieve the
data (refer to the
Aurea CRM Web Client Reference Help, RecordSet.CreateEnumerator method for
full details):
• MoveNext to move from the current row to the next row. The current row is initially
invalid, so you have to call MoveNext once to make the first row the current row.
• MoveTo to set the current row to a specific row.
• GetRecord returns a RecordControl object for the current row.
• GetRecordId returns the record Id for the current row.
• GetValues returns an array with all values of the current row.
If you want to update a field value in a set of records, use the RecordSet controls Up-
dateField method. To delete records by their Ids, use the Delete method.
RecordTree control
The RecordTree control is based on the TreeControl to display a record with its
children in a tree view. The RecordTree control is used on the treeview page and
for the Generic Tree Control within Forms.
AUREA CONFIDENTIAL 48
Form Control
Form Control
The Form Control allows you to display custom forms that are defined in the
Generic Form Designer of the Aurea CRM Designer.
Usages of the Form Control:
1. Defining Formats (e. g. the Activity Execution format) on the EditFormat page.
[javascript]
var oForm = Controller.FormControl (window, DIVName, FormName);
2. Asking the user for input to trigger custom actions within wizards.
[javascript]
oForm.SetDimensions (500,300);
To use generic forms, you can either use a standard page (like the WizardForm
page or the ShowForm page), or you may create your own instance of the form
control in your JavaScript code.
Creating a Form
Create a form with the following steps:
1. Create a new Form Control by passing the window, the name of the containing
DIV element within the window and the name of the Form to the constructor:
[javascript]
var oForm = Controller.FormControl (window, DIVName, FormName);
3. Call the Create method to display the form within the containing DIV element:
[javascript]
oForm.Create();
AUREA CONFIDENTIAL 49
Chapter 3: Client-Side Programming Concepts
After pressing the Save button, open the definition of the new action to specify the
Page Call ShowForm.
OR
form.SetHookFunction (Function.CreateDelegate(this, "MethodToBeCalled"),{});
AUREA CONFIDENTIAL 50
Form Control
The first parameter in this case is a function pointer for the hook function. The
second parameter is optional object on which the hook function will be called. If this
parameters is set the first parameter must be a function pointer rather than a string.
The hook function can be set in Jscript or in the form definition in the Aurea CRM
designer and is called when the form is initialized and every time a tab on the form
is displayed or destroyed – you can determine the reason for the hook call by the
message. See the Aurea CRM Web Client Reference Help FormControl.SetHook-
Function method for full details on the hook function.
You may also define a cell hook function for any cell on the form in the Aurea CRM
Designer to immediately react to changes of values on the form.
Accessing Form Cells on page 55 provides you with some information on how to
access cell specific information. For cell hooks the CellDefinition and CellNamespace
form proper ties will allow you to access the current cell:
[javascript]
form.CellDefinition; // static cell definition
form.CellNamespace; // namespace of the cell
A special button call-back function may be set with the SetButtonCallback method
to be called when a button on the form is clicked (this mechanism is used within
wizards to fire events on button clicks).
AUREA CONFIDENTIAL 51
Chapter 3: Client-Side Programming Concepts
For each tab, the tab definition consists of the following entries:
For each row within a tab, the row definition consists of the following entries:
AUREA CONFIDENTIAL 52
Form Control
For each cell within a row, the cell definition consists of the following entries:
AUREA CONFIDENTIAL 53
Chapter 3: Client-Side Programming Concepts
AUREA CONFIDENTIAL 54
Form Control
If a cell references a sub-form, the form definitions of these sub-forms are stored
in the sub-forms array of the form definition – each array entry defines one sub-form
with the following array entries:
AUREA CONFIDENTIAL 55
Chapter 3: Client-Side Programming Concepts
Each cell in the form has a static definition (this is the configured information that
comes from Aurea CRM Designer) and the dynamic information containing runtime
information like the current value.
To get the static cell definition of a cell from the mask definition, apply the ID en-
tries for tab, row and cell (please note that the constants are defined in the controller
and therefore must be prefixed with “Controller.” to work within the worker frame):
[javascript]
var staticFormDef = oForm.GetStaticDefinition();
var staticTabDef = oStaticFormDef[FORMDEF_TABS][id[0]];
var staticRowDef = oStaticTabDef[FORMDEF_ROWS][id[1]];
var staticCellDef = oStaticRowDef[FORMDEF_CELLS][id[2]];
If the cell is of type sub-form, you can load the sub-form and find the static definition
within the form:
[javascript]
var staticSubFormTab = oForm.GetSubFormTab(StaticCellDef[FORMCELL_FUNC]);
var staticSubFormRow = oStaticSubFormTab[FORMDEF_ROWS][id[3]];
var staticSubFormCell = oStaticSubFormTab[FORMDEF_CELLS][id[4]];
The dynamic cell information can be obtained by calling the method GetAddInfo :
[javascript]
var dynamicCellDef = oForm.GetAddInfo(id);
querystringname The querystring name (same logic for repetitive fields as for
valuename).
AUREA CONFIDENTIAL 56
Form Control
xpath The splitted XPath – xpath[0] points to the value, for special
behaviors like ordered items, a second path may be supplied
on xpath[1]
xpath.full The full XPath path, including prefix paths from parent forms
The value proper ty of the dynamic field info is not guaranteed to contain the currently
displayed value because, for performance reasons, the dynamic cell information is
updated on tab changes or when necessary.
To transfer the current value of all fields to the dynamic cell information, call the
method
GetCurrentTabValuesFromMask or UpdateFormValues
[javascript]
form.GetCurrentTabValuesFromMask();
or
form.UpdateFormValues();
You may change the value proper ty in the dynamic cell information and call
method Redraw to reflect the changes on the screen:
[javascript]
form.Redraw();
AUREA CONFIDENTIAL 57
Chapter 3: Client-Side Programming Concepts
The framework contains a star t page that can be customized to display information
which is of use to the user. The page “Star t Page” takes a form name as its input,
the user can create a form containing user defined queries to display relevant data
on login.
The default implementation of the Star t Page uses the form Startpage_General which
displays data from the queries, ThisWeeksAppointments, ThisWeeksTasks and Up-
comingToDos.
If you want to change the behavior of the star t page, you can modify the Star t-
page_General form in your configuration. You can also create a new form and a
menu entry which calls the star t page with this form as an argument, this menu entry
can then be added to the possible star t page in the Customize section.
To place a query which displays a list of the people with a bir thday today onto your
customized star t form, you should follow these steps:
1. Define a query “TodaysBir thdays” which displays the fields First Name, Surname,
DOB from the Person infoarea when DOB is equal to “$curDay” (although it is
allowed to have this query stored as Aurea CRM format for consistency, it is
recommended that you store queries that are referenced from the designer
configuration in the designer database). See the section “Queries and Filters” in
the Aurea CRM Administrator document for full details on creating queries.
2. Copy the Star tpage_General form to your configuration and place a Query Cell
on the form. Put “TodaysBir thdays” in the FUNC parameter and “record;mode(4)”
in the Options parameter of that cell.
3. Add a display name to the query cell. This text will be displayed but an occurrence
of “%1” will be ignored within the string. After the query was executed and the
count of records returned is known the count of records will replace the “%1
placeholder.
4. In the additional info 2nd parameter (it has the name “XML-PATH” in the Aurea
CRM Designer application) you may enter a max records number. If this is the
case only maxrecords + 1 records are read from the server and an eventual “%1”
placeholder is replaced by “>maxrecords” if there are more records.
If the user clicks on the linked display texts, the application will navigate to the
standard query result page for that specific query. Although it is recommended
to only place queries on the star t page that can be executed quickly, it is also
implemented that only one query at a time is executed and that the user may
leave the star t page anytime by clicking a link or using the application menu
without having to wait for the remaining query executions to be completed.
Tip: If you want your users to be able to edit the list data, you can place a Generic
List Control on page 66 (instead of a Query Control) onto the star t page. When using
a Generic List control, users can edit the data from the info area of that list directly
in the generic form.
AUREA CONFIDENTIAL 58
Form Control
AUREA CONFIDENTIAL 59
Chapter 3: Client-Side Programming Concepts
AUREA CONFIDENTIAL 60
Form Control
Star ting with service pack 4, you can include not only a list of child records in a tab
of a sub-list but “any information” using a Generic Form e.g. an analysis of the
current record or a map depicting the address. The history of a record is displayed
using this functionality, too.
You include a Generic Form in a sub-list using the ExpandChildren and/or Search-
SubList header by entering the name of a Generic Form in the new Form columns
in the desired row.
You can pass parameters to the form using SubListParams (this data is evaluated
using “eval” and set using SetParameters ).
AUREA CONFIDENTIAL 61
Chapter 3: Client-Side Programming Concepts
To find an address on the map, the fields “Street”, “Zip”, “City” and “Country” must
contain correct values.
If a Google map is integrated for a child info area that does not contain the above-
mentioned fields, the address of the of the parent company or person is used.
You can integrate a Google map using a Generic Control of type GoogleMaps in a
Generic Form. The current record is passed in the FUNC cell using $Record; .
You can then integrate this Generic Form in the ExpandChildren and/or SearchSublist
header in the Form columns. The info area (or its direct parent info area) must
contain fields with the XML names "Street", "ZipCode", "City", and "Country".
Fur thermore you need to enter a valid registration key for your Aurea CRM Web
URL (see http://code.google.com/apis/maps/signup.html) in the Web Configuration
parameter GoogleMapsKey .
AUREA CONFIDENTIAL 62
Generic Controls in Forms
AUREA CONFIDENTIAL 63
Chapter 3: Client-Side Programming Concepts
3. Add this control to the generic control of the appropriate type within Aurea CRM
Designer.
4. Add your control to a cell by selecting type “Generic”, “SubAnalysis” or
“AnalysisInput” and then selecting your custom generic control.
The following sections describe the features of the standard generic control as well
as the interfaces that must be implemented for own generic controls. The source
code of the standard generic controls may be found in file ctlFormAddOn.js that is
available in clear text.
AUREA CONFIDENTIAL 64
Generic Controls in Forms
AUREA CONFIDENTIAL 65
Chapter 3: Client-Side Programming Concepts
Note: Using the Generic List Control you can display editable lists in any generic
form (e.g. on a star t page).
AUREA CONFIDENTIAL 66
Generic Controls in Forms
Multiplexer Control
The Multiplexer Control is a control without a display state and it switches between
form cells depending on the input FUNC argument as typically produced by the
Generic Tree Control – this control can produce three types of output values:
1. record (format “<infoarea>.<recid>”)
2. list of records (format “<linkinfoarea>.<linkrecid>;<infoarea>”)
3. new record (format “<infoarea>.new.<linkinfoarea>.<linkrecid>”) – this format is
produced by the A_TreeNew menu action within Generic Tree Controls.
AUREA CONFIDENTIAL 67
Chapter 3: Client-Side Programming Concepts
The item attribute cell of the control is used to specify which cells shall be displayed
in format
<DetailsFormCellName>;<ListFormCellName>;<NewFormCellName>. The output
value of the control is the same as the input value.
The Multiplexer Control implements notification functions OnDblClick , GetCurrent-
TreeNodeConfiguration and
FormGetParentRecord Control
The FormGetParentRecord Control returns the parent record of the input record
as output. Typically this control is placed in an invisible row – the control has the
input record as first FUNC argument and the parent info area as second – and
with $<ValueName> the id of the parent record can be obtained. If you need a specific
link id for the parent info area (2nd parameter), use the syntax <info area>#<link
id> e.g. KP#2 .
Chart Control
The Chart Control allows displaying custom char ts (based on project related data)
using the same ComponentAr t char t engine that is used for Analyses.
The FUNC cell contains the char t engines data provider. The Char t control suppor ts
the following options:
• ParentSize defines that the size of the char t is taken from the parent container
of the char t control and not from the char t itself. Please note that the char t engine
needs a size to create a char t so either you set a size in the item attributes of
the char t control or the parent control must have a defined size and this option
is set.
• ChartSelector defines whether the char t control shall have a char t selector
allowing the user to select the char t type and some char t options. By default, the
the char t control has no char t selector. You may set this option with a value and
in this case the value is interpreted as form name that is used to display the char t
selector.
• ChartType defines the type of char t that is displayed – the parameter is a valid
char t type name of those configured in the char t type section of the designer.
One valid char t provider is the Controller.Charting.StaticChartProvider object,
which can be included in a generic form using the Generic Control FormExplicit-
JavascriptChartProvider. This control is included in the source shipped by update
but as it is a test control it is not registered – the control displays a textarea box
where the user may enter the data that shall be shown in the char t – and the value-
name of that control can directly be used as char tdataprovider.
AUREA CONFIDENTIAL 68
Generic Controls in Forms
MyClass.GetHtml
Returns the HTML string of the current control. The returned text
()
is placed within a table cell within the form. The HTML text should
fulfil the following needs:
• The named HTML objects should be prefixed with
the namespace of the current cell supplied by the dynamic
field info passed in the constructor. Please note that the
namespace is not valid when the constructor is called, because
the constructor call occurs during building of the dynamic field
AUREA CONFIDENTIAL 69
Chapter 3: Client-Side Programming Concepts
info, but will be available when GetHtml is called (and will not
change after that).
• You are responsible for applying the item attributes on the
appropriate HTML element ( definition[FORMCELL_ITEMATTR] of
the dynamic cell info).
• You may define the onchange handler to be automatically
called by applying the HTML produced by Form.GetOnChange-
HandlerHtml (sEvent, sNamespace) to the appropriate HTML
element. An alternate way to reflect changes of your cell to
the form is by calling the onchange-Handler explicitly.
AUREA CONFIDENTIAL 70
Generic Controls in Forms
MyClass.Clien-
[obsolete – please use method Update instead]
tRequest (oRe-
quest, bCom- Every time the dynamic FUNC argument changes, the ClientRe-
plete) quest method is called with the FUNC argument in oRequest (this
may be different to the Func proper ty of the dynamic cell info if
it was changed by a call to GetDataRequest ). You may either re-
turn an array if you don’t want the request to be passed to the
server, or you return null. The bComplete argument signals
whether the FUNC argument still contains some open arguments
(bComplete = false) or not. If bComplete is false, the request will
not be sent to the server even if you return null.
My-
[obsolete – please use method Update instead]
Class.DataToMask
(oData) Sends the Response of a FUNC request to the control – this may
either be the result of a server request, or a server request that
could be completed from the client cache, or the data returned
by the preceding call to method ClientRequest .
AUREA CONFIDENTIAL 71
Chapter 3: Client-Side Programming Concepts
2. Create a new Generic Form, and a menu entry in the application menu to display
the form.
3. Create a form cell with a headline text and one cell with a Generic List Control
displaying a maximum of 10 contact records with the filter MA.TodayRep.
AUREA CONFIDENTIAL 72
Generic Controls in Forms
AUREA CONFIDENTIAL 73
Chapter 3: Client-Side Programming Concepts
oRecord.SetFields (['$TableCaption']);
oRecord.SetLinkInfo ([[aRecord[0], aRecord[1]]]);
oRecord.Load (true);
if (IsValidRecordId(oRecord.GetRecordId()))
{
// record found
m_oAddInfo.value = sParentInfoArea + "." + oRecord.GetRecordId();
m_elCallerWindow.document.all[m_sNamespace].innerHTML = "<b><u>"
+ oRecord.GetFieldValues()[0].htmlEncode() + "</b></u>";
}
else
{
// record not found – clear control
m_oAddInfo.value = "";
m_elCallerWindow.document.all[m_sNamespace].innerHTML = "";
}
}
else
{
// request not complete – clear control
m_oAddInfo.value = "";
m_elCallerWindow.document.all[m_sNamespace].innerHTML = "";
}
m_oForm._OnChangeHandler (m_oAddInfo); // update depending cells
return []; // no server request
}
}
6. Create a Treeview Control cell that displays the tree view of the linked company
and a Details Control cell that displays the details for the linked person:
AUREA CONFIDENTIAL 74
Generic Controls in Forms
AUREA CONFIDENTIAL 75
Chapter 3: Client-Side Programming Concepts
AUREA CONFIDENTIAL 76
Generic Controls in Forms
The Analysis Category Combo displays a combo box with catalog values (all values
that can be loaded from the server into a normal combo box are possible) and if the
user selects a value within the combo box the value is used in a filter that is applied
to one or more SubAnalysis controls.
The FUNC argument configures the Analysis Category Combo:
• The first argument par t of the analysis input control contains a comma-separated
list of the name of all subanalysis controls (or the name of the control if there is
only one) that receive the additional filter (same for all analysis input controls)
• The second argument par t defines which values have to be displayed and follows
the same syntax as normal combo boxes in the FUNC argument – but with commas
instead of semicolons. Possible values are “CAT,<infoarea>,<fieldid>” for a catalog
or “ANALYSISCAT,<vir tualcategoryname>” for vir tual categories.
• The third argument par t specifies which filter shall be applied to the sub analysis.
It is comma- separated in format “<infoarea>,<uniquefieldid>,<comparer>” – for
vir tual categories the format is
“<infoarea>,<uniquefieldid>,<comparer>,<vir tualcategoryname>”.
Sample: If you want to add a country criteria to a sub analysis you may use
“CAT,FI,5” as second argument par t to display the country catalog, and “FI,5,=” as
third argument par t to define the appropriate filter.
As long as the combobox has no value the depending SubAnalyses are not displayed.
To implement your own Analysis Input Control you must implement some or all
function of the following interface:
As with Generic Controls, this returns the display
MyInputControl.GetH- html
tml() representation of the sub analysis control.
MyInputControl.On- This function is called when the HTML text returned by
Created() method GetHtml was already placed into the DOM and you
may apply changes that cannot be directly applied with HTML
text.
MyInputControl.Get- This function is called to build the Data Request (FUNC cell)
DataRequestCom- command – if you want to dynamically change the FUNC
mand() argument, you should implement this function. The
AnalysisCategoryCombo control extracts the second argument
par t and replaces commas with semicolons which forces the
form control to automatically load needed data from the
server.
MyInputCon- Returns data from the server request – the
AnalysisCategoryCombo fills
trol.DataToMask(aDa- the combobox in this method
ta)
AUREA CONFIDENTIAL 77
Chapter 3: Client-Side Programming Concepts
If the output value of your Analysis Input Control changes you should notify the form
(as with other cell types) and you also may force redraw of dependent analyses –
a sample implementation would be the onchange handler of the AnalysisCatego-
ryCombo control:
function AnalysisCategoryComboControl_OnChange ()
{
m_oAddInfo.value = m_oCombo.value; // the new value
if (m_oAddInfo.DependentAnalyses)
{
for (var i in m_oAddInfo.DependentAnalyses)
m_oForm.ComputeAnalysis (m_oAddInfo.DependentAnalyses[i]);
}
m_oForm._OnChangeHandler (m_oAddInfo);
}
AUREA CONFIDENTIAL 78
Global Functions
The inargs argument (and outargs argument, if the wizard step has a substep) is
an array with inargs[0] being the first input argument of the wizard step, inargs[1]
the second and so on.
The arguments itself are normally record arguments, that is an array with three
elements, that is the info area, the record id and the table caption if available.
A special form argument type is produced by Generic Forms listing key-value-pairs
in the following manner:
[javascript]
var arg = inargs[argnr];
arg[0] // "ARRAY"
arg[1][0…n] // Key-Value-Pairs
arg[1][n][0] // Key #n
arg[1][n][1] // Value #n
In your function you may do some synchronous or asynchronous tasks (like using
the Record control) and at the end you should call the following methods:
[javascript]
WizardEvent (0, -1); // signals that the page is loaded
WizardEvent (EventNr, EventParameter);
The first call with event number 0 signals that the current page (that is the JScriptCall
page) is loaded enables firing of events, the second call fires and event to the
server giving back the control flow to the wizard engine. You may provide the wizard
with an Event Parameter in the same structures as an input argument.
Global Functions
Theses sections provides you with information about the usability of other public
controls / functions and some mechanisms from the controller window that may be
used in your code.
AUREA CONFIDENTIAL 79
Chapter 3: Client-Side Programming Concepts
Navigating to Pages
If you want to navigate to another page in the work frame, you can use one of the
following functions (defined in the Controller):
1. Function NavigateToPage (pageName, parameters, options) navigates the work
frame to another page defined by its page name (as defined in Aurea CRM
Designer. The Parameters contain values for the page parameters, and the Options
allow to open the page in a new tab with a defined title:
[javascript]
Controller.Navigation.NavigateToPage("QueryRun",
"QueryName=myQuery&LinkInfoArea=FI&LinkRecID=23",
{CreateNewTab:{Title:"My Tab Title"}});
3. Function NavigateToStar tPage() navigates to the Star tpage set in the current
configuration.
[javascript]
Controller.Navigation.NavigateToStartPage();
Note: Do not use NavigateToUrl for your custom created aspx pages. Register
them in the webdesigner and use NavigateToPage instead.
AUREA CONFIDENTIAL 80
Global Functions
6. Function goBack() navigates the work frame to the previous page; within wizard
pages the function goBackWizard() navigates back to the page that was displayed
before the wizard was invoked.
Within wizards should be implemented by throwing events and reacting to them
in the wizard definition. However, it is possible to navigate to another page within
the wizard without throwing an event by calling function WizardNavigateTo
(pageFileName, parameters, formParameters, callFlags, wizardStep). Page-
FileName and Parameters work as with ContextNavigateTo, FormParameters al-
lows to add parameters to the query string via a form parameter, CallFlags should
be 0 (a value of 1 navigates the work frame ending the wizard), and WizardStep
ist the number of the current wizard step as passed to the original page via the
WizardStep querystring argument. The called page must fulfill all requirements
for wizard pages.
AUREA CONFIDENTIAL 81
Chapter 3: Client-Side Programming Concepts
Client Caching
If you want to cache data in the controller, you may use the client caching mechanism
implemented with the following functions:
• CachePut (key, object) puts object into the cache with cache-key key.
• CacheGet (key) returns the object that is stored in the cache with cache-key key.
• Cache_ResetCache () empties the cache.
Only objects that may be reconstructed if not in cache should be placed into the
cache as it is not guaranteed that objects placed into the cache are not deleted
later by a cache-reset called by another component.
Conversion Functions
The following conversion function implemented in the Aurea CRM Web help conver t-
ing values of specific datatypes between their display modes:
• Convert2GUIDate (mmdate) is obsolete, use DateTimeFormats.FormatDate instead.
• DateTimeFormats.FormatDate (mmdate) conver ts an 8-char-date in Aurea CRM
format (“ YYYYMMSS ”) into a display date.
• Number_FromMMString (mmstring, fDefault) is obsolete, use NumberFor-
mats.ParseNumeric instead.
Image Handling
If you want to display an image registered by name in the Aurea CRM Designer you
may use the following functions to determine the filename of the image and its display
label if needed:
• image_getFilename (sImageName) returns the filename of an image
• image_getLabel (sImageName) returns the display label of the image
AUREA CONFIDENTIAL 82
Global Functions
Due to a bug in the Internet Explorer (or exactly the WinINet component below), the
Internet Explorer may hang when too many image sources are set directly and
synchronously. Microsoft recommends to just create the <IMG> elements and set
the image sources asynchronously.
The controller provides you with some function to easily workaround this problem:
• image_RegisterObject (oIMGElement, sIMGSrc, sIMGBackground, CallerWindow)
registers sIMGSrc as source for the IMG element in oIMGElement, with is placed
in CallerWindow. The image source may be provided absolute or without the path,
in this case the image has to be placed in the style images directory.
• image_RegisterHTML (sIMGElementId, sIMGSrc, sIMGBackground, CallerWindow)
does the same but with the id of the IMG element instead of the element itself
• image_CreateHTML (sIMGSrc, CallerWindow, sAdditionalAttributes, sImageId)
returns the html code for an image and registers the image source. It is impor tant
to synchronously place this html code onto the window after a call to this function
for the image display to work properly. The optional sAdditionalAttributes are
applied to the IMG element, and you may explicitly set the image id (with
sImageId), if not, a unique id is created.
With these functions the SRC proper ty of the IMG element is not directly set – they
will be set asynchronously after a call to image_SetSources:
• image_SetSources (fCallbackFunction, oCallbackParameter) sets a timeout to
asynchronously set the image sources of all registered images. This function
returns immediately without the images being set – if you want to react on the
image loading being completed you may set a callback function with an optional
parameter and this function is called upon completion.
Select Functions
A select function allows fields to be filled with values from a record of another info
area using either Selectors.SelectRecord for reference fields or Selectors.Show-
ContextMenu for generic link fields. These Select Functions define which related
records can be selected, and how the relation is set after selecting a record.
It is also possible to specify a FormatSelect function, or functions for picking an
info area and field.
Note: Reference fields that are marked read-only in the data model definition or
in the designer via a field detail never display a record select icon in masks. However,
he administrator can override this default behavior by explicitly specifying a record
selector for such a reference field.
If a record selector function is defined and the Web Configuration parameter ShowS-
electorIfPresent is set, it is always displayed in the web (independent whether
the data model field attribute NOEDIT or the designer Field Detail Read Only is de-
fined).
AUREA CONFIDENTIAL 83
Chapter 3: Client-Side Programming Concepts
Note: User’s rights settings are only checked for that field where the Select-Function
is defined (not for the fields contained in the function).
Note: The functions RecordSelect and RecordSelectEx continue to work for reasons
of backwards compatibility, but it is not recommended to use these functions for
new projects (also because they do not provide the full feature set of the new record
selector).
The proper ties of the objects passed as parameters to Selectors.SelectRecord() are
described in the following table. Note that the parameters need to be specified in
JSON (Java Script Object Notation) syntax – for more information,
see http://www.json.org.
available RecordSelectorOptions
AUREA CONFIDENTIAL 84
Global Functions
AUREA CONFIDENTIAL 85
Chapter 3: Client-Side Programming Concepts
Examples (to improve readability, some statements are wrapped into multiple lines):
1. Linking an activity record to an appointment:
AUREA CONFIDENTIAL 86
Global Functions
2. Selecting a city for a company (and copying the values for ZIP, city, country and
area code into the corresponding fields 5, 6, 8, 15 of the company record):
Selectors.SelectRecord({ SearchFieldGroup: "OR-Link",
DetailsMapping: {5:0, 6:2, 8:5, 15:6},
SearchMapping: {5:0, 6:[2,4]}});
3. FS ver tical version - Selecting a bank account for a product (only bank accounts
linked to the same company as the product can be selected):
Selectors.SelectRecord({ DetailsMapping:
{
"SortCode": "SortCode",
"Institute":"Institute",
"Branch":"Branch",
"AcNo":"AcNo",
"BankDetailsStatNo":"StatNo",
"BankDetailsSeqNo":"SeqNo"
},
RelationName: "$Link[FI]",
AddLink: true
});
If you want to copy the text value of a catalog, prefix the field number with a ‘T’.
Important: Please note that fields used in the Select function need to be included
in the details mask i.e. you can not use fields in a Select-Function which are not
present in the mask, otherwise this function will not work correctly.
Note: For both functions the reference text is inser ted into the field before the
user saves. The reference texts for an info area are defined in Aurea CRM win in
the Configuration table (MC) - section “Data Model”, option “Reference Text” - for
more information see the Aurea CRM win Administrator manual.
AUREA CONFIDENTIAL 87
Chapter 3: Client-Side Programming Concepts
Examples:
1. Select an appointment as the generic link in a To-Do record:
a. Create a context menu (named M_MyContextMenu in this example).
b. Set the field detail Select Function of field “Link” as follows:
Selectors.ShowContextMenu("M_MyContextMenu");
c. Add a menu action with a “JScriptCall” page call to the context menu and apply
the following parameters:
Additional Parameters:
src, {LinkInfoArea: "MA", DetailsMapping:{ Link:"$TableCaption", Sub-
ject: "Subject" },
AUREA CONFIDENTIAL 88
Global Functions
Parameter Description
sInfoArea The 2 or 4-letter name of the InfoArea
displayed in the details control.
nFieldIndex The index of the field to which the format
name is copied.
nFormatType The number which represents the type of
Format.
bCurrentRepOnly If true, only formats for the current Rep
can be selected.
bAddPrivate If true, the private formats for the current
Rep will also be display.
sFilter An optional filter which can be applied to
the format search.
• The function FormatSelectMultiple allows the selection of more than one format
(the selected formats are joins in a ; separated string) and is used e.g. for selecting
a rep’s phone profiles. The function accepts the same parameters as FormatSelect ,
plus an additional last parameter: if ‘%fieldValue%’ is specified, the currently
selected formats are automatically selected in the format selection dialog. Example
for the Rep (ID) field “phone profile”: FormatSelectMulti-
ple('ID',102,48,false,true,'','%fieldValue%')
AUREA CONFIDENTIAL 89
Chapter 3: Client-Side Programming Concepts
can be written as
Selectors.SelectRecord({
InfoArea: <InfoArea>,
LinkInfoArea: <LinkInfoArea>,
DetailsMapping: {<FieldIds[0]>:<LinkFieldIds[0]>,
<FieldIds[1],<LinkFieldIds[1]>, …},
RelationName: <RelationName>,
AddLink: <AddLink>
});
The proper ties contained in parameter <Options> (if used) have to be merged
into the object passed to Selectors.SelectRecord(...) .
• Translating RecordSelectEx(...) to Selectors.SelectRecord(...)
RecordSelectEx(<InfoArea>, <SearchFieldGroup>, <SearchMapping>,
<DetailsMapping>, <Options>);
can be written as
Selectors.SelectRecord({
InfoArea: <InfoArea>,
SearchFieldGroup: <SearchFieldGroup>,
SearchMapping: <SearchMapping>,
DetailsMapping: <DetailsMapping>
});
The proper ties contained in parameter <Options> (if used) have to be merged into
the object passed to Selectors.SelectRecord(...) .
AUREA CONFIDENTIAL 90
Global Functions
If the field detail "Select-Function" is specified, an icon ( ) will appear right to the
field. Clicking this icon will - in case of the RecordSelect function - display a popup
dialog containing a SearchAndList page.
As soon as the search has been star ted, a record can be selected from the results
list.
The popup dialog will be closed and an arbitrary set of fields will be copied from
the selected record into the record display by the calling details control.
For this to work you need to pass the following parameters to the RecordSelect func-
tion:
RecordSelect( sInfoArea, sLinkInfoArea, aFieldIndices, aLinkFieldIndices,
bAddLink, oOptions);
Parameter Description
sInfoArea The 2 or 4-letter name of the info area displayed in the details
control.
sLinkInfoArea The 2 or 4-letter name of the info area from which a record
should be selected.
Note: If this parameter is left empty, it is assumed that the field
is a reference field. The reference info area defined within the
data model will be used as the value for parameter "sLinkIn-
foArea".
aFieldIndices An array of field indices of the target fields in info area "sIn-
foArea".
bAddLink Set this to true in order to link the selected record with the
record displayed in the details control.
Note: This only works if a link is defined in the Aurea CRM data
model!
AUREA CONFIDENTIAL 91
Chapter 3: Client-Side Programming Concepts
As the optional parameter "oOptions" you may pass a javascript object. Following
is a list of proper ties currently suppor ted for this object.
Parameter Description
Example:
RecordSelect(
'FI', 'KP',
[60,61], [2,3],
null,
false,
{FixedFieldIndices:[19], FixedDetailsFieldIndices: [5] });
This example will show a popup dialog that allows the user to select a person (info
area "KP"). From the selected person the fields 2 (=Lastname) and 3 (=Firstname)
will be copied into fields 60 (=FreiC1) and 61 (=FreiC2) of the company (info area
"FI") record.
In addition the user will only be able to select persons having the field 19 (=country)
set to the same value as field 5 (=country) of the company record.
The RecordSelectEx Function
The RecordSelectEx is a JavaScript function used as a possible value for the field
detail "Select-Function".
AUREA CONFIDENTIAL 92
Global Functions
Parameter Description
sSearchAndListConfig The name of the Search & List configuration which is used
to Search for and then List the records from which the se-
lected data will be copied. (Please note: the Search and
List group control is reference by Search & List configura-
tion)
Example: the following sample is used to copy fields from a City (OR) record to
Company (FI) related to City, Country, Area Code and Zip Code.
RecordSelectEx('FI','OR-Link',{5:0,7:[2,4]},{5:0,7:2,8:5,14:6})
When the icon is clicked a dialog containing a search and list control, defined by
the Search & List configuration "OR-Link" is opened. The details control values of
the fields "Country" (5) and "Zip/PC" (7) are copied to the search mask fields
"Country" (0) and "From PC" (2) and "To PC" (4) (the same value to both).
After a City is selected the values from fields "Country" (0), "From PC" (2), "City"
(5) and "Tel. Prefix" (6) are copied to the Company details control fields "Country"
(5), "Zip/PC" (7), "City" (8) and "Tel. Prefix" (14).
AUREA CONFIDENTIAL 93
Chapter 3: Client-Side Programming Concepts
If specified as
RecordSelectEx('FI','OR-Link',{5:0,7:[2,4]},{5:0,7:2,8:5,14:6},'AutoStart;DisableFilter')
the search star ts automatically and users can not select filters.
MessageBox Functions
Four functions allow the programmer to give direct feedback to the user via a mes-
sage box:
MessageBox_ShowInfo(elCallerWindow, sMessage, sButtons, fnCallback,
bFireDefaultActionOnClose, oAdditionalOptions)
MessageBox_ShowWaring(elCallerWindow, sMessage, sButtons, fnCallback,
bFireDefaultActionOnClose, oAdditionalOptions)
MessageBox_ShowError( elCallerWindow, sMessage, sButtons, fnCallback,
bFireDefaultActionOnClose, oAdditionalOptions)
MessageBox_ShowQuestion(elWindow, sMessage, sButtons, fnCallback,
bFireDefaultActionOnClose, oAdditionalOptions)
Parameter Description
AUREA CONFIDENTIAL 94
Global Functions
MessageBox_ShowInfo MessageBox_ShowWaring
MessageBox_ShowError MessageBox_ShowQuestion
Example displaying an informational message box with the text “Hello World!” like
in the top-left-most screenshot:
function Sample_MessageBoxControl(element)
{
// display an information message
MessageBox_ShowInfo(element.document.parentWindow, "Hello World!", "Ok,Cancel",
Sample_MessageBoxControl_Callback, false);
// same usage for MessageBox_ShowWarnung and MessageBox_ShowError, // with the
same parameters, the only difference is the displayed icon
}
function Sample_MessageBoxControl_Callback(oDialogResult)
{
if (oDialogResult.CommandName === "Ok")
{
// Ok Button was pressed
}
else if (oDialogResult.CommandName === "Cancel")
{
AUREA CONFIDENTIAL 95
Chapter 3: Client-Side Programming Concepts
{
alert ("The e-mail has been sent!");
};
AUREA CONFIDENTIAL 96
JScriptCall Pages
JScriptCall Pages
The JScriptCall Pages are dummy pages which can be used to execute various
types of JavaScript functions.
• JScriptCall: allows the user to call a JavaScript method which is within the
controller.
• JScriptCallLocal: allows the user to call a JavaScript method which is on the local
page.
• JScriptCallObject: allow the user to call a JavaScript method which is a member
of the given object.
The JScriptCall’s can be used from Application and Context Menus and Direct But-
tons.
The JScriptCall’s arguments are:
• FunctionName, the name the JavaScript function to be called, this argument is
required.
• InfoArea, the record which is passed to the function as the InfoArea Id and the
record Id, can be the current record, the linked record or have no value.
• InfoArea2, a second record which is passed to the function.
• RecordSet, fills record in a list where it will be stored for later use the options for
the recordset Provider:
• all
• visible
• selected
the control where the which contains the call must contain a RecordSetProvider
only JScriptCall and JScriptCallLocal contains the RecordSet argument.
• Additional, the following additional parameters can also be passed to function.
• src, the DOM element which initiated the call.
• CurrentObject, the Object from which the call was made.
• MenuObject, the Menu from which the call was made. (Menu only)
• CurrentWindow, the current Window DOM element.
• currentFrame, the current Frame DOM element.
• control, the Header Object which contains the button. (Direct Button only)
• buttonname, the name of the button clicked. (Direct Button only)
AUREA CONFIDENTIAL 97
Chapter 3: Client-Side Programming Concepts
Other Controls
This section provides you with information about additional documented controls.
2. Create the generic list and initialize it with the id of the DIV element
var genericList = new GenericList (window, "myGenericListDiv");
3. Set the headlines of the columns, the widths and the data you want to display by
calling the SetData method.
var headlines = ["Column1Header", "Column2Header", "Column3Header"]; var width
= [50,30,20];
var data = [['Row1', 3, 5], ['Row2', 6, 8], ['Row3', 7, 9], ['Row4', 1, 1]];
genericList.SetData (data, width, headlines);
4. If these data are Aurea CRM record bound, you may call the SetMenuData method
to set the info areas and record ids (if you want to display a fixed menu, use
method SetMenu instead):
var infoAreas = ['FI', 'KP'];
var recordIds = [[1,2],[6,3],[7,12],[4,9]];
genericList.SetMenuData (infoAreas, recordIds);
To get the data you want to display you may either place them directly onto your
custom page with server-side code or you implement your own channel to request
the data asynchronously.
AUREA CONFIDENTIAL 98
Other Controls
2. Do tests in inner function to avoid polution in the global namespace, place the
declaration on top of the function
var treeTypeChild1, treeTypeChild2;
3. Create a TreeControl instance and initialize it with the id of the DIV container:
var treeControl = new TreeControl ("myTreeDiv", window);
4. Create TreeNodeType instances for each node type that is displayed within the
tree, and set its proper ties and event callback functions (see below for details on
class TreeNodeType):
var treeTypeRoot = treeControl.CreateNodeType ("RootType");
treeTypeRoot.ImmediateExpand = true;
treeTypeChild1 = treeControl.CreateNodeType ("Child1");
treeTypeChild2 = treeControl.CreateNodeType ("Child2");
treeTypeRoot.OnExpand = root_expand;
treeTypeChild1.OnExpand = child1_expand;
treeTypeChild2.OnExpand = child2_expand;
5. Create an instance for the root tree element, set its proper ties and assign it to
the tree instance (the constructor needs the parent element – which is null for
the root element – the tree node type and the id of the element)
var treeElement = new TreeElement (null, treeTypeRoot, "RootElement");
treeElement.SetLabel("Root Element");
treeControl.SetRootElement (treeElement);
AUREA CONFIDENTIAL 99
Chapter 3: Client-Side Programming Concepts
The TreeNodeType instance defines the look of each assigned tree element with
these proper ties:
• HasMenu defines whether elements of this type have a menu (true) or not (false).
If this value is set to true, you may change the menu image from the standard
“ico_popupMenu.gif ” by changing the proper ty MenuImage.
• CanBeSelected defines whether elements of this type may be selected by the
user (true) or not (false).
• CanBeChecked defines whether elements of this type have a check box (true)
or not (false).
• Image defines the image when the element is collapsed; ImageExpanded defines
the image for the expanded mode.
• ImmediateExpand defines if the Node is expanded after the creation of the tree
The following event handler functions are called when an event occurs – with the
signature and their default implementation:
• OnExpand is called when the user first expands a node (the default implementation
removes the expand/ compress image signalling that this element has no children).
If the OnExpand function returns true, the element is set to be expanded and the
element is redrawn; if you don’t want this node to be expanded at the moment,
return false instead.
function TreeNodeType_OnExpand (treeElement)
{
if (!treeElement.HasChildren() || !treeElement.GetInitialExpand())
treeElement.AddChild (null);
return true;
}
• OnMenu is called when the node type has a menu (proper ty HasMenu) and the
user clicks the menu item
function TreeNodeType_OnMenu (treeElement, clickedObject)
{
return false;
}
• OnSelect is called when the node element is selected and its node type has
proper ty CanBeSelected set to true
function TreeNodeType_OnSelect (treeElement, clickedObject)
{
return false;
}
• OnCheck is called when the check box of the node element is clicked
function TreeNodeType_OnCheck (treeElement, clickedObject)
{
return false;
}
For each handler function you get the involved TreeElement instance - to get the
TreeControl instance, call the GetTreeControl method of the element, to get the
tree node type, call the GetTreeNodeType method. For all handlers but OnExpand
you also get the clicked DOM item what you may you for placing objects (like menus)
on the screen.
If your tree is not guaranteed to be small, child nodes should always be expanded
on demand in the OnExpand method – as with the standard Treeview page, where
child records are loaded from the server via a channel when the user first expands
a node.
To add elements use method AddChild as in the following example, that adds two
elements to the parent element:
function child1_expand (treeNode)
{
var treeElement = new TreeElement (treeNode, treeTypeChild2, treeNode.GetId()
+ "_0");
treeElement.SetLabel("Node: " + treeNode.GetId() + "_0");
treeNode.AddChild (treeElement);
treeElement = new TreeElement (treeNode, treeTypeChild2, treeNode.GetId() +
"_1");
treeElement.SetLabel("Node: " + treeNode.GetId() + "_1");
treeNode.AddChild (treeElement);
return true;
}
HasExpandUp() –must return true if navigation upwards should be suppor ted by the
control, otherwise false.
GetParent(oCurrentElement) – returns the parent object of the current object (or
null).
GetChildren(oCurrentElement) – returns an array of child elements of the current
node (or null).
GetObject(sId) – returns the object matching the provided ID (this method is typi-
cally used as entry point).
GetId(oCurrentElement) – returns the ID of the current element.
HasParent(oCurrentElement) – returns true if the current element has a parent ele-
ment, otherwise false.
HasChildren(oCurrentElement) – returns true if the current element has at least
one child element, otherwise false.
OnWrite(oTreeElement, oFunctions, oCurrentElement, elTD) –is called when the
current element should be displayed in the organisational tree. You need to set the
HTML content in the TableCell element passed in elTD. oTreeElement is the corre-
sponding element class of the TreeControl, oFunctions contains the JavaScript text
for the possible functions on the element (the oFunctions element always contains
the members DoubleClick and ExpandClick and, if suppor ted, also Select, Menu,
Check and LabelClick).
Note: If you want to add new options, you must not replace any of the standard
options (even if you don’t need them, in which case you can deactivate them)
because the standard options implement cer tain standard behaviors.
requiresSelectedRecord controls whether the user needs to select a record for this
option (default: true ). If requiresSelectedRecord is set to false and the user has
not selected a record, the Event-Handler is not fired (but the message is directly
displayed in the info box).
Example for deactivating an existing option and adding a new option:
Controller.Matchup.Data.Options.Option1.active = false; // do not display 1st
option
// set dialog’s width & heigth
Controller.Matchup.Data.Dialog.Height = 500;
Controller.Matchup.Data.Dialog.Width = 700;
// 7th option checked by default
Controller.Matchup.Data.InitiallyCheckedOption = 7;
// text of 7th option using custom textgroup
Controller.Matchup.Data.TextGroups.push("myOwnTextGroup");
Controller.Matchup.Data.Options.Option7 = { id:7,
text1:"Textgroups.myOwnTextGroup.TXT_myOwnTextGroup_30", text2: "", active:true};
// custom event handler
Controller.Matchup.Data.EventHandler = MatchupSampleEventHandler;
// matchupData consists of: matchupData.InfoArea, matchupData.RecordId,
matchupData.MatchupOption
function MatchupSampleEventHandler(matchupObject, matchupData) {
if (matchupData.MatchupOption == 7)
{
// my custom matchup action occured }
}
When using add-on programming to call the address check, you need to know that
the address check functionality is controlled by the Save Header button code and
not the actual Save function. Thus, you need to initialize the address checker and
then perform the check itself (passing an array containing the indices of the fields
that have been changed):
// do an address check if required
if (m_oAddressCheck === null)
m_oAddressCheck = Controller.AddressCheck.Init(m_sInfoAreaId, m_sRecordId ||
"");
if (m_oAddressCheck && m_oAddressCheck.Check(arrOfIndicesChanged))
return;
To modify a currently loaded control, you can alternatively also use detailsCon-
trol.MaskDesigner();
Since contact times are stored very differently at each customer, there is no out-of-
the-box implementation but an Event Handler needs to be implemented in the project.
When the user selects a company, person (or a record that has either as a parent)
from the search results, an event is fired which allows you to determine the contact
times. If no record in the list is selected, the calendar is displayed without contact
times.
Times that are NOT specified as contact times will be displayed in a darker color
in the calendar (using the CSS style td.calDayBarContactTime , beige in the
screenshot); times where a customer may be contacted will remain unchanged (white
in the screenshot).
You need to perform the following steps to display contact times in the day & week
planning:
1. Register the static OnCreating event handler using Controller.DayWeekPlan-
ning.OnCreating.Add(EventHandler);
2. In the event handler, which has the arguments (oSender, oArgs) , you get the
DayWeekPlanning Control (in oSender ) in which you need to register the Con-
tactViewChanged handler. If the selected record in the search result list changes,
the event ContactViewChanged is now notified about that change.
3. Implement a function which determines and returns the contact times (based on
FI/KP, the selected record, and the requested days as input arguments).
Use SetContactTime(oContactTime) to set the determined contact time of the
customer in the JSON object oContactTime (outlined in the code sketch below).
4. Last but not least, de-register ContactViewChanged in OnDisposing .
Code sketch:
function _OnDayWeekPlanningCreating(oDayWeekPlanning, oArgs)
{
oDayWeekPlanning.OnContactViewChanged.Add(_ContactViewChanged);
oDayWeekPlanning.OnDisposing.Add(_DayWeekPlanningDisposing);
};
function _DayWeekPlanningDisposing(oDayWeekPlanning, oArgs)
{
oDayWeekPlanning.OnContactViewChanged.Remove(_ContactViewChanged);
oDayWeekPlanning.OnDisposing.Remove(_DayWeekPlanningDisposing);
};
function _ContactViewChanged(oDayWeekPlanning, oArgs)
{
// oArgs:
// {
// Infoarea: "FI/KP",
// RecordId: "ValidRecordId",
// }
// ==> Custom Code to retreive the actual contact times
var oContactTime = GetContactTimeFor(oArgs.InfoArea, oArgs.RecordId);
//<== Custom Code
// oContactTime:
// {
// Monday:[{from: Controller.Collaboration.GetContactTime(9,0),
// to: Controller.Collaboration.GetContactTime(10, 0)},
// {from: Controller.Collaboration.GetContactTime(11, 0),
// to: Controller.Collaboration.GetContactTime(13, 0)},
// {from: Controller.Collaboration.GetContactTime(15, 0),
// to: Controller.Collaboration.GetContactTime(18, 0)}],
// Tuesday:[{from: Controller.Collaboration.GetContactTime(10, 0),
// to: Controller.Collaboration.GetContactTime(12, 0)}],
// Wednesday:[{from: Controller.Collaboration.GetContactTime(9, 0),
// to: Controller.Collaboration.GetContactTime(10, 0)},
// {from: Controller.Collaboration.GetContactTime(13, 0),
// to: Controller.Collaboration.GetContactTime(22, 0)
//}
oDayWeekPlanning.SetContactTime(oContactTime);
};
// hook the static "OnCreating" event of the DayWeekPlanning
//
Controller.Collaboration.DayWeekPlanning_OnCreating.Add(_OnDayWeekPlanningCreating);
oParameters.AutoSearch = false;
oParameters.HeaderType = "SerialEntry";
oParameters.HeaderName = "MUSerialEntry";
oParameters.MenuName = "M_Sample";
oParameters.FormName = "Sample";
oParameters.ShowSearch = true;
oParameters.SaveHandler = elWindow.SampleSerialEntry.OnSave;
oParameters.SelectChangeHandler =
elWindow.SampleSerialEntry.OnSelectChange;
oParameters.ListCustomData = "FilterType@+#Sample@+#SortOrder@+#None";
oSE.SetParameters(oParameters)
// add serial entry to DIV element (in this example named SETest)
var elContainer = elWindow.document.getElementById
(oForm.GetAddInfo(oForm.GetIdOfValueName("SETest")).Namespace);
oSE.Create(elContainer);
}
}
2. Add your JavaScript file to the controller scripts (either globally or – preferred –
using code).
3. Create a Generic Form (named SETest in this example), and call your initialization
function in the form’s Hook-Function: GetController().<Functionname e.g.
InitSE>(msg,param,window,form); . Add a DIV element to a form row, and adding
the Valuename used in the JavaScript code (in this example SETest ).
4. Add a menu action using the “ShowForm” page call where you call your newly
designed form. Make sure to include the file containing the serial entry Save
handler which is specified in the ‘Scripts’ parameter of the A_Sample menu action
for Samples (or the A_MeetingSPP menu action for Meeting CP) - Pages/bc/Sam-
pleSaveHandler.js (or Pages/bc/MeetingSPPSaveHandler.js ) - in the Scripts
parameter.
Example: The following steps are necessary if you want to display planned appoint-
ments in bold and missed appointments in grey italic font for an tree view that con-
tains appointments:
1. Create a file tree_test.js and copy it to the /ClientScripts folder.
2. Add the Javascript file to the parameter “Scripts” of the menu action’s A_Ex-
pandTree TreeViewPage page call.
{
if( args.TreeElement.InfoArea=="MA")
{
var record = new Controller.RecordControl (window,
args.TreeElement.InfoArea);
record.SetRecordId (args.TreeElement.RecId);
var statusFieldId=1;
record.SetFieldIndices([statusFieldId]);
/* Field 1 == "Status" */
record.Load(true);
var values= record.GetFieldValues();
if(values)
{
var statusValue = values[0];
if (statusValue==0)
/* scheduled */
args.TreeElement.SetHtmlLabel("<b>"+args.TreeElement.GetLabel()+"</b>");
else
if (statusValue==2)
/* missed */
args.TreeElement.CssClassCell="Tab_Must";
}
}
}
}
Introduction
The server par t of the application consists of several components, which are located
in different assemblies:
Component Description
name
mmObjects Contains the core Aurea CRM business logic including user han-
dling, database access, rights and more. It has no dependency
on the Aurea CRM Web component and has no access to the Aurea
CRM Designer database.
mmObjectsXX XX stands for BB, FS or BC and represents the ver tical implemen-
tation of mmObjects which it’s derived from.
mmUtilities Common utilities which can be used for all different kind of prob-
lems.
mmChannels Handles the channel output from the server to the client.
update.web The web application itself. It uses all the above components.
While not mandatory, update advises you to use C# as the language of choice simply
because all the following server samples are written in C#. The next chapters intro-
duce the basic access the data via the business object, interpreting data from the
client and sending results to the client and later ways to customize your application
are described.
Note: mmSOI is also included in the SDK reference, but you can not use that with
Aurea CRM Web.
you must have a valid login with a user name and password to get an instance
of mmICoreContext (the “core context”).
• The mmBusinessObject class is the base class for all business objects – it has
a fixed info area and either defines a template to query for data (having no record
id) or it defines exactly one record (having a record id). Instances of this class
are not created directly but from the object factory of the mmCore instance called
by the core context so that you get the corresponding subclass for the requested
info area.
• Instances of the mmCondition class define criteria to filter records. mmCondition
are created from an mmBusinessObject and have an internal tree structure defining
the filter that shall be applied when querying for data.
• The mmContainer class combines several mmBusinessObject instances with
defined relations to build a complex query.
In the following sections you will find detailed descriptions of these classes and
code samples how to use them.
Note: Aurea CRM Web does not explicitly instance one subclass of update.web -
which subclass is used is defined by the configuration.xml (the type attribute of the
mmCore node). This subclass is created by the mmActivator class and Aurea CRM
Web passes the mmCore node of the configuration.xml file to the Initialize function:
<mmCore type="update.bb.mmObjects.mmCoreBB,update.mmObjectsBB">
[… configuration information …]
</mmCore>
Initializing the mmCore class is a rather costly operation, because it initializes some
data model information and does some consistency checks – if one of these checks
fails, the Initialize function will throw an exception – these initialization tasks are:
1. Initializing the log file
2. Initialize settings from the passed xml
3. Initialize possible error texts
4. Initialize the wrapper for the business logic DLLs – there is one wrapper per
ver tical and per database (Oracle and SQL).
5. Loads the meta info and checks its consistency.
6. Loads special needed user accounts from the configured UserData xml file – the
WWW user and the super user – and creates core contexts for those users (this
step will fail if the users do not exist in the Aurea CRM database or are not
correctly configured, or if the password information is incorrect. This file has to
be an encrypted and can be generated with the mmObjectsConfig utility which is
provided by update.
7. Initializes the custom fields defined by the custom fields xml
8. Initializes the custom links defined by the custom links xml
9. Creates the business object map and logs it to the logfile
10.Sets Logon Filters to customize the application logon process
11.Sets Event Handlers
If the configuration does not contain configuration data, default values are applied.
The CoreContext is a session-specific (and user-specific) interface to the mmCore
functions. To be able to access data you have to create a CoreContext. This object
ties all action with a user.
[C#]
mmICoreContext oCoreContext = mmPortal.Current.Core.CreateCoreContextInstance();
oCoreContext.Login("MyUser","
MyPassword",mmLanguages.Code.eng,LoginOptions.FullLogin);
…
oCoreContext.Logout();
OR
// when using mmObjects
bool mmICoreContext.IsAuthenticated(Username,Password);
You can either supply the Aurea CRM user namer in Username (and the corresponding
password in Password ), or you can specify mmCore.AutoSignInUserPrefix+<Window-
sUserName> in Username and provide the user’s Wondows Domain in Password .
If you want to call the credentials check via JavaScript, you can do so using the
following syntax:
[JavaScript]
var response = Controller.Xml.InvokeServerMethod("chAdministration", "IsLoggedIn",
{ userName:"<Name>", passWord:"<Pwd>" });
if (response.Success)
{
// ...
}
The field “Company” from the company with record id 1 was read. The content value
can now be accessed with the GetData and SetData methods.
The Update method modifies data of this record in the database:
[C#]
string sCompanyName = boCompany.GetData(mmCompany.FieldIds.Company);
if (sCompanyName=="update")
{
boCompany.SetData(mmCompany.FieldIds.Company,"New name of update");
boCompany.Update();
}
All values in the fields are strings; you can use some mmUtilities methods to get
the proper representation before storing into the database.
In some cases you will not have the id of the record for which you need data, so
you will need to use the mmBusinessObject instance with its second meaning – as
template for a query with some conditions.
The class mmCondition offers a simple solution to extend the mmBusinessObject
and using it as a template for searching. An mmCondition is tied to an InfoArea and
can only be used in conjunction with an mmBusinessObject of the corresponding
InfoArea. Basically an mmCondition compares a field to a value like “Last-
Name=Smith”.
[C#]
mmCondition oCondition = boPerson.CreateCondition(mmPerson.FieldIds.Lastname,
mmCompareOperator.Equal,"Smith
");
Use the Find method to get a collection with matching results. The found business
objects have those fields read, which were set visible in the template.
mmCollection aResults = boPerson.Find(10,0);
The variable aResults contains the first 10 matching companies (or less if there are
less than 10 matches).
[C#]
mmBusinessObject boFirstCompany = aResult[0] as mmBusinessObject;
Each business object in the result set has its RecordId set. Hence each result can
be used for fur ther actions.
If there are more results, you can specify the result set window by using the second
parameter of Find: nSkipRecords. This parameter tells Find to skip a number of re-
sults. To query the results 11 to 25 simply use the following statement:
[C#]
mmCondition oFirstCondition = boPerson.CreateCondition(mmPerson.FieldIds.FirstName,
mmCompareOperator.Equal,"John");
mmCondition oSecondCondition = boPerson.CreateCondition(mmPerson.FieldIds.LastName,
mmCompareOperator.Equal,"Smith");
mmCondition oCombinedCondition = mmCondition.LinkCondition(mmLinkOperator.And,
FirstCondition,oSecondCondition);
boCompany.SetCondition(oCombinedCondition);
mmCollection aResults = boCompany.Find(10,0);
An alternate way to combine mmCondition instances is with operators “|” (for OR)
and “&” (for AND):
[C#]
mmBusinessObject boCompany =
oCoreContext.CreateObject(InfoAreaIds.Company) as mmBusinessObject;
boCompany.RecordId = RecordId.FromInt64(1);
mmBusinessObject boPerson =
oCoreContext.CreateObject(InfoAreaIds.Person) as mmBusinessObject;
boPerson.SetVisible(mmPerson.FieldIds.FirstName,mmPerson.FieldIds.LastName);
mmCollection aResults = boPerson.Find(mmBusinessObjectLink.From(boCompany),10,0);
Thus complex conditions can be create and applied to query the needed results.
Another way to get data is to use the build in data model. The data model describes
how business objects are linked to each other. For example persons are always
linked to one company. In other words there’s a 1:N relation between company and
person. To get the persons of a company the following code can be used:
[C#]
mmBusinessObject boCompany =
oCoreContext.CreateObject(InfoAreaIds.Company) as mmBusinessObject;
boCompany.RecordId = RecordId.FromInt64(1);
mmBusinessObject boPerson =
oCoreContext.CreateObject(InfoAreaIds.Person) as mmBusinessObject;
mmCondition oCondition = boPerson.CreateCondition(mmPerson.FieldIds.LastName,
mmCompareOperator.Equal,"A*");
boPerson.SetCondition(oCondition);
boPerson.SetVisible(mmPerson.FieldIds.FirstName,mmPerson.FieldIds.LastName);
mmCollection aResults = boPerson.Find(mmBusinessObjectLink.From(boCompany),10,0);
This query gets the first ten persons (first name and surname) of the company with
record id 1. It is possible to use both the template and the link in combination. So
getting the first ten person having a surname star ting with an A and are linked to
the company with record id 1 looks like:
[C#]
mmBusinessObject boCompany =
oCoreContext.CreateObject(InfoAreaIds.Company) as mmBusinessObject;
boCompany.RecordId = RecordId.FromInt64(1);
mmBusinessObject boPerson =
oCoreContext.CreateObject(InfoAreaIds.Person) as mmBusinessObject;
mmCondition oCondition = boPerson.CreateCondition(mmPerson.FieldIds.LastName,
mmCompareOperator.Equal,"A*");
boPerson.SetCondition(oCondition);
boPerson.SetVisible(mmPerson.FieldIds.FirstName,mmPerson.FieldIds.LastName);
mmCollection aResults = boPerson.Find(mmBusinessObjectLink.From(boCompany),10,0);
It is also possible to use the link in the opposite direction to get the company of a
given person.
[C#]
mmBusinessObject boCompany =
oCoreContext.CreateObject(InfoAreaIds.Company) as mmBusinessObject;
mmBusinessObject boPerson =
oCoreContext.CreateObject(InfoAreaIds.Person) as mmBusinessObject;
boPerson.RecordId = RecordId.FromInt64(1);
mmCollection aResults = boCompany.Find(mmBusinessObjectLink.From(boPerson),1,0);
mmBusinessObject boCompanyOfPerson = aResults[0] as mmBusinessObject;
The link between two business objects can also be use for creating records, like
adding a person to a company:
[C#]
mmBusinessObject boCompany =
oCoreContext.CreateObject(InfoAreaIds.Company) as mmBusinessObject;
boCompany.RecordId = RecordId.FromInt64(1);
mmBusinessObject boPerson =
oCoreContext.CreateObject(InfoAreaIds.Person) as mmBusinessObject;
boPerson.SetData(mmPerson.FieldIds.FirstName,"Joe");
boPerson.SetData(mmPerson.FieldIds.LastName,"Average");
boCompany.NewChild(boPerson);
If you want to definie conditions on hierarchical catalogs, there are two possiblities:
[C#]
Prequisites:
int nParentCatalogId = ..., nChildCatalogFieldId = ...;
int nParentCatalogValue = ..., nChildCatalogValue = ...;
mmBusinessObject bo = ....;
Method 1:
bo.CatalogsAreNumeric = true;
bo.SetData(nParentCatalogFieldId, nParentCatalogValue.ToString());
mmCondition oCondProd = bo.CreateCondition(nChildCatalogFieldId,
mmCompareOperator.Equal,
mmCondition.FormatCatalogConditionValue(nChildCatalogValue));
Method 2:
mmCondition oCondProd = bo.CreateCondition(nChildCatalogFieldId,
mmCompareOperator.Equal,
mmCondition.FormatCatalogConditionValue(nChildCatalogValue,
nParentCatalogValue));
Containers
Even though the mechanisms of links and conditions already allow very complex
queries, it is sometimes necessary to operate with results containing different In-
foAreas like getting all persons who are working in a company with a revenue about
100k and haven’t been contacted this year. As this query can not be implemented
in one step with the introduced methods, mmObjects offers the mmContainer class
for complex queries with heterogeneous results.
In the previous section conditions were introduced and how to get homogeneous
results. If business object are linked they can be joined in a single query. For example
if you seek companies with revenue greater than 100k your code would look like
this:
[C#]
mmBusinessObject boCompany =
oCoreContext.CreateObject(InfoAreaIds.Company) as mmBusinessObject;
boCompany.SetVisible(mmCompany.FieldIds.Company, mmCompany.FieldIds.Country,
mmCompany.FieldIds.City);
mmCondition oCondition = boCompany.CreateCondition(mmCompany.FieldIds.Revenue,
mmCompareOperator.Greater,"10000);
boCompany.SetCondition(oCondition);
mmCollection aResults = boCompany.Find(10,0);
And if you need persons who were not contacted this year use the following code:
[C#]
mmBusinessObject boPerson =
oCoreContext.CreateObject(InfoAreaIds.Person) as mmBusinessObject;
mmCondition oCondition = boPerson.CreateCondition(mmPerson.FieldIds.LastContact,
mmCompareOperator.Less,"20040101");
boPerson.SetCondition(oCondition);
boPerson.SetVisible(mmPerson.FieldIds.FirstName,mmPerson.FieldIds.LastName);
mmCollection aResults = boPerson.Find(10,0);
Now it is possible to combine these two queries into a single one which returns the
persons not contacted this year and are from a company with more than 100k rev-
enue:
[C#]
mmBusinessObject boCompany =
oCoreContext.CreateObject(InfoAreaIds.Company) as mmBusinessObject;
boCompany.SetVisible(mmCompany.FieldIds.Company,mmCompany.FieldIds.Country,
mmCompany.FieldIds.City);
mmCondition oCondition = boCompany.CreateCondition(mmCompany.FieldIds.Revenue,
mmCompareOperator.Greater,"100000");
boCompany.SetCondition(oCondition);
mmBusinessObject boPerson =
oCoreContext.CreateObject(InfoAreaIds.Person) as mmBusinessObject;
boPerson.SetVisible(mmPerson.FieldIds.FirstName,mmPerson.FieldIds.LastName);
mmCondition oCondition = boPerson.CreateCondition(mmPerson.FieldIds.LastContact,
mmCompareOperator.Less,"20040101");
boPerson.SetCondition(oCondition);
mmContainer oContainer = mmContainer.With(oCoreContext,boCompany,boPerson);
mmCollection aResults = oContainer.Find(10,0);
Each item in the result set represents a result line containing business objects. The
first pair of this example can be retrieved in the following manner:
[C#]
mmCollection aFirstResultLine = aResults[0] as mmCollection;
mmBusinessObject boFirstCompany = aFirstResultLine[0] as mmBusinessObject;
mmBusinessObject boFirstPerson = aFirstResultLine[1] as mmBusinessObject;
Note that in this example a company may be found several times in the result as
each result line always contains a complete set of business object. The result can
be seen as a table.
While the example showed a container with two business objects, the container is
not limited by the number of business objects. It is not only possible to combine a
container with a business object but also join two containers. This offers a vast
number of all kinds of queries, which can executed with mmObjects.
Note: If the field ID’s are not defined they can be replaced with the index number
of the field (e.g. mmPerson.FieldIds.FirstName, 3). A list of the field numbers for
all info areas can be found in the Field Groups section of each info area in the de-
signer.
To use one of these events you have to create a class which implements the
mmIBusinessObjectEventsHandlerV7 interface. The interface contains only two
methods:
[C#]
void RegisterEvents(XmlNode oNode, mmIBusinessObjectEventsV7 oEvents);
void UnregisterEvents(mmIBusinessObjectEventsV7 oEvents);
Use these to register and unregister your events like in this example:
[C#]
public class MyEventHandler : mmIBusinessObjectEventHandlerV7
{
public MyEventHandler()
{
}
public void RegisterEvents(XmlNode oNode, mmIBusinessObjectEventsV7 oEvents)
{
oEvents.PostRead +=
new EventHandler<mmBusinessObjectChangeEventArgs>(OnPostRead);
}
public void UnregisterEvents(mmIBusinessObjectEventsV7 oEvents)
{
oEvents.PostRead -=
new EventHandler<mmBusinessObjectChangeEventArgs>(OnPostRead);
}
public void OnPostRead(object sender, mmBusinessObjectChangeEventArgs args)
{
… Do something after Reading the object
}
}
The args variable contains the business object on which the action is being carried
out and it can be manipulated as the user requires. It can be access using code
similar to the following:
[C#]
public void OnPostRead(object sender, mmBusinessObjectChangeEventArgs args)
{
mmCompany boCompany = (mmCompany)args.BusinessObject;
// set field Email1 to contain a new value
boCompany.SetData( mmCompany.FieldIds.E_mail1, “any_email@some_domain.com”);
}
So far no connection between the handler and the business object has been estab-
lished. The easiest way to accomplish this is to add a simple entry into the configu-
ration XML in the mmCore section.
<EventHandler>
…
<Event type="MyNamespace.MyEventHandler, MyAssembly" infoArea="FI" />
</EventHandler>
This entry automatically registers the event handler for the InfoArea Company during
the initialization of mmObjects.
Please remember that while simple and powerful, some events like PostRead for
Company or Person are raised very often and can cause performance issues if used
improperly.
Custom Fields
You can add custom fields to any InfoArea, should the free fields are not sufficient
enough. They behave like normal fields with the exception that they’re ignored when
loading or saving and that rights cannot be changed at runtime.
Note: Aurea CRM will log a warning if a field name in an infoarea is duplicated.
The warning will be in the following format:
Duplicated field name is found on info area 'XX'. Field name is 'XX' and field id is
'XX'. Please use unique xml names in your info area model.
Again adding a custom field is simply nothing more that inser ting a section into the
CustomFields XML.
<class name="KP">
<customfield index="305001" name="SpecialName">
<length>30</length>
<fieldtype>C</fieldtype>
<label>Spezieller Name</label>
<label language="1">Special Name</label>
<mustfield>false</mustfield>
<catalognumber>-1</catalognumber>
<catalogparentfield>-1</catalogparentfield>
<viewright>true</viewright>
<newright>false</newright>
<updateright>false</updateright>
<deleteright>false</deleteright>
<newcatalogright>false</newcatalogright>
</customfield>
</class>
You can use the Business Object Events on page 119 to read and store the values
of custom field in foreign databases or other applications.
[C#]
public class MyCore : mmCoreBB
{
protected override void RegisterObjects()
{
base. RegisterObjects();
RegisterObject(InfoAreaIds.Person, typeof(MyPerson));
}
}
If you derive your business object class from a less specific parent class (like mm-
Person or even mmBusinessObject for persons), you will deactivate any business
logic that was and will be implemented in the standard implementation; so although
that is not forbidden – at least for the moment – it is highly recommended to derive
your business object classes from the most specific available parent class.
Custom Links
Custom Links are a method of linking info areas together where no actual link exists
in the database model. This feature is used in the standard BTB version to implement
project hierarchies (where OJ records are put in a parent-child relation), but they
may also be used to define additional links between different info areas.
boAppointment.GetData(MAFields[1]));
DestinationRecord.SetCondition(condition);
// read all parent records (should be just one)
mmCollection colResult = DestinationRecord.Find(1,0);
if (null == colResult || 0 >= colResult.Count) return null;
// returning the resulting business object
if (colResult[0] is mmCollection)
return ((mmCollection)colResult[0])[0] as mmBusinessObject;
else
return colResult[0] as mmBusinessObject;
}
else return null;
}
return base.GetRelatedBusinessObject(sRelation);
}
Note: Please be aware that both types of links are only available within mmObjects
– and therefore are not available in most other applications of update as they are
not based on mmObjects. They will also NOT be available with Impor t/Expor t and
for the migration, so you should use these links only if you reviewed the business
case behind that and consider them really necessary. As these limitations are by
design, they will also exist with future versions.
However, you may configure Aurea CRM Web to create records that are custom-
linked (this is not done by a mmObjects feature but by the configuration of the New
page with Copy Fields), to configure parent (Expand Page) and child (Search-And-
List) navigation in context menus, to display this relation in tree views and dash-
boards, and to display this relation in sub lists of the Expand Page and the Search-
And-List page.
• The mmDesignerDBAccess class is the base class for all classes that have
ADO.net access to the web.designer database. This class contains static
connection information that is initialized from the settings in the Configuration.xml
file when the application star ts. The connection information consists of the
database type (Oracle ODP or SQL Server), an ADO connection string, an optional
file path with the information whether all xml configuration files shall be written
to this path (which slows down the application but is impor tant for tracing
information) or not, and the information whether data shall be loaded from the
database or from the file path.
• Several Xml loader classes which implement a method to load data from the
designer database and return an XmlDocument object. These loader classes are
internal and therefore inaccessible.
• The config class mmQueryConfig. This class uses the mmXmlLoader classes to
load data from the designer database into an xml structure and interpret this xml
to transform the data into a native structure.
If you want to load a Query from the database, you may just instantiate an mm-
QueryConfig class:
[C#]
mmQueryConfig oQueryConfig = new mmQueryConfig(sQueryName, sInfoArea,
nFormatType, oConfiguration);
This is not the recommended way to access such objects within the Aurea CRM
Web application because this would always result in an access to the designer
database – the recommended way is to use the get functions implemented in
the mmPor tal object. These functions use the standard application cache to cache
those objects so if a requested object was already loaded before, it is returned
from the application cache without any database access:
[C#]
mmQueryConfig oQueryConfig = mmPortal.Current.ConfigurationCore.GetQueryConfig
(sQueryName, sInfoArea, nFormatType, oConfiguration);
• The modification classes, all derived from the abstract base class mmDBModify.
Theses classes provide write access to some areas of the designer database
(List configuration with class mmDBModifyField, queries and filters with class
mmDBModifyQuery, analyses with class mmDBModifyAnalysis, Web Configuration
parameters with class mmDBModifyWebConfig and default user settings with
class mmDBModifyDefaultUserSettings). These classes automatically create sub
configurations on the demand if defined and invalidate par ts of the application
cache so that changes are immediately applied (at least as long as they are not
cached at client-side).
[C#]
string sExportType = oConfiguration["ExportType"];
PostRead Called after a record has been read using its Id.
chList PostRead Called after the list data has been retrieved.
chRead- PreRead Called before a set of records is read using their Ids.
List
Channel events are similar to the events available in mmObjects. The main difference
is that mmObjects events are called on a lower tier and are therefore often not aware
of the context in which the application calls them. Channel hooks on the other hand
are raised at very specific locations within the application and therefore can leverage
all the information available at these locations.
Depending on what you are trying to achieve, both channel hooks and mmObjects
events may provide viable solutions. But keep in mind that mmObjects events are
usually called more frequently and therefore may be subject to performance problems.
The following code snippet shows how to hook event chDetails.PostRead:
[C#]
… // hook the channel event
chDetails.PostRead += chDetails_OnPostRead
…
void chDetails_OnPostRead(object sender, chDetailsEventArguments args)
{
…
}
Note: Previous versions of Aurea CRM Web provided another approach for
integrating custom. This approach involved the creation of a custom channel factory.
Due to the fact that Aurea CRM Web suppor ts only one channel factory, a race
condition can emerge from multiple plug-ins each requiring its own channel factory!
Whereas this approach is still available, we do not recommend using it for new
implementations.
On the client-side you can call this channel using the following javascript snippet:
[javascript]
XmlRequest.BeginInvoke(
"MyChannel.SayHelloTo",
// [channel name].[channel method name]
{ sName: "John Doe" },
// Parameters function(sender, args) { alert(args.Response.Say); });
If your channel method requires many or a variable number of parameters you may
also access the parameters using mmServerChannel’s proper ty “Params”:
[C#]
public class MyChannel : mmServerChannel
{
[ChannelMethod]
public void SayHelloTo(mmIChannelFeedWriter oWriter)
{
string sName = this.Params["Name"];
oWriter.Write("Salute", string.Format("Hello, {0}!", sName)}
}
}
Clients can call channels overriding “OnFeed” using the following JavaScript snippet:
//[javascript]
var oChannel = OpenChannel(window);
oChannel.SetData("Name", "John Doe");
oChannel.Submit(OnComplete, "MyChannel", null);
...
function OnComplete(elWindow, oChannel)
{
var oResponse = oChannel.GetResponse();
alert(oResponse.Say);
}
In order to have your plug-in loaded during the star tup of Aurea CRM Web, you have
to register it in the <Plugins> section of the <mmPortal> section in Configuration.xml
using the syntax <PlugIn type="TypeName,AssemblyName"/> :
...
<mmPortal>
...
<Plugins>
...
<Plugin type="MyPlugInNamespace.MyPlugIn,MyPlugInAssembly"/>
...
</Plugins>
...
</mmPortal>
...
Once configured, Aurea CRM Web will attempt to load the plug-in and call its method
“Load”. At the time Aurea CRM Web calls method “Load” the channel factory has
not been created yet, therefore we need to defer the registration of the custom
channel to the time when Aurea CRM Web has been fully initialized. This can be
done by registering an event handler for mmPor tal’s “Initialized” event as shown
below:
//[C#]
using update.web.Framework;
...
class MyPlugin : mmIPluginEx
{
public void Load(mmPortal portal, XmlNode nodeConfig)
{
// This method gets called by the framework during the early stages // of the
startup, therefore most of the properties on "portal" are // not yet initialized
portal.Initialized += OnPortalInitialized;
// note: nodeConfig points to XML element <PlugIn />
}
...
private void OnPortalInitialized(object oSender, EventArgs oArgs)
{
// Now that mmPortal is fully initialized, you are able to // register your
custom channel(s)
mmPortal portal = (mmPortal)oSender;
// portal’s property "ServerChannelFactory" now points to the // channel factory
You can register as many channels you want. If you choose to register a custom
channel with the same name as an existing channel, your channel will replace the
existing channel.
Please refer to the Developer Reference for Details on class BaseWorkPage and
underlying suppor t classes of the Aurea CRM Web assembly and the mmObjects
assembly.
A vir tual info area is by default mapped to the same type as its physical info area.
That means that a vir tual info area based on “FI” is mapped to mmBBCompany , not
to mmBusinessObject . It is possible to define an explicit subclass of mmBusinessOb-
ject for vir tual info areas.
Note: If EmitNativeFormat is specified, the output has changed with SP4: fields of
type date will no longer contain a time por tion, fields of type time will no longer
contain a date por tion, and Boolean fields are now emitted as “t” and “f ” instead of
“true” and “false”.
Export.Encoding
UTF-8 … the expor t will be encoded using UTF-8.
UTF-16 … the expor t will be encoded using UTF-16.
Note: The name of any encoding suppor ted by the .NET framework can be used
here.
Export.ContentDisposition
inline …Microsoft Internet Explorer will try to display the repor t results in the current
browser window.
attachment (default)… Microsoft Internet Explorer will ask the user to save the repor t
results or open them in a separate window.
Export.Xml.FatClientCompatible
true … XML Expor t uses an Aurea CRM win compatible schema.
false (default) … XML Expor t uses the Aurea CRM Web schema.
Export.Xml.EmitConfiguration
true … the XML element <Configuration/> containing the configuration (e.g. of the
Field Group or the Tree View) will be included with the XML expor t. This allows
formatting a repor t’s output based on the Field Details in the field group.
false (default) … no configuration data will be included with the XML expor t.
Export.Xml.EmitNativeFormat
true … all expor ted field values will be formatted in an XML compliant format:
Date YYYY-MM-DD
Time HH:MM
Boolean t or f
false (default) … all expor ted field values will be formatted according to the users'
locale settings (stored as Web Configuration Parameters in the user’s configuration).
Export.Xml.EmitInvariantFormat
true … all expor ted field values will be formatted using Aurea CRM’s internal culture
invariant representation.
Date YYYYMMDD
Time HHMM
Boolean 1 or 0
false (default) … all expor ted field values will be formatted according to the users
locale settings (stored as Web Configuration Parameters in the users configuration).
Export.Xml.EmitCatalogs
true … the XML elements <Catalogues/> and <Languages /> will be included with
the XML expor t.
<Catalogues> contains all values of all catalogs used in the expor ted data. The
catalog values will be included in 2 languages: the user’s catalog language and the
catalog base language. The core catalog IDs are also emitted.
Information about the fixed catalogs used in a repor t is emitted in an XML node
analogous to variable catalogs (with the difference that values of fixed catalogs are
output only in the current language).
false (default) … no catalogs will be included with the XML expor t.
Export.Xml.EmitConditions
true … when expor ting query results, this options will include the conditions (=filters)
used when executing the query. The filters will be emitted in XML element <Condi-
tions/> . Variable conditions like $curDay, $curRep etc. are replaced with their ac-
tual value.
Export.Xml.EmitLinks
true … for every record, a hyperlink and a title for this link will be included with
the XML expor t. The titles are formatted using the default Table Caption for the
record’s info area, e.g.
<field_link tableshort="FI">http://.../ </field_link>
Note: Expor ting hyperlinks for a large number of records can significantly increase
the amount of time your repor t requires for processing. update thus suggests only
using this option if it is really required.
Export.Xml.NamesOption
Short … the emitted XML will contain shor ter XML-attribute and –tag names. If your
repor ts get very large, this options helps to reduce the document size (but has the
disadvantage that the XML is much less readable).
Every other value than Short will result in the default names being used.
Important: The standard XSL transformations delivered with Aurea CRM web
do not work when this option is enabled.
tables ts extKey e
table t catalogs cs
tablename tn langid li
fields fs field_link fl
field f field_ref fr
fid fi value v
fieldtype ft fieldlabel fl
catNo cn tablelabel tl
Export.Xml.Variables
true … the XML element <Variables/> will be included with the XML expor t. <Vari-
ables> contains all the variables that are valid for the currently logged in user.
false (default) … no variables will be included with the XML expor t.
Export.Xml.EmitCoreFieldIndices
true … an attribute fidcore (shor t notation: fic ) containing the “core” field number
is emitted in the XML for the <row/> and <fields/> tags. The “core” catalog ids are
emitted as well. The “core” info area shor tcuts tableshortcore are also emitted to
allow the creation of core repor ts.
Export.Xml.EmitOnlyCoreFields
true … only fields having a “core” id will included in the XML. The “core” info area
shor tcuts
tableshortcore are also emitted to allow the creation of core repor ts.
Export.Xml.EmitPhysicalInfoAreaIds
Relevant if you use Generalization/Specialization aka Vir tual Info Areas
true … the expor ted XML always contains the physical info area id.
false (default) … the expor ted XML contains the actual info area id, which would
be the vir tual info area id if applicable.
Example for EmitPhysicalInfoAreaIds false (default XML expor t):
<field tableshort="VDOC" tablename="Doctor" fieldno="2" fieldname="Company"
…>
Note: If you want the same settings for all repor ts, but do not want to specify this
parameter every time, you can also create a Web Configuration parameter of type
“character” named Export.Xml.EmitPhysicalInfoAreaIds and define its value
as true.
For expor t you have to create a direct button whose name star ts with “Direct Expor t”,
for repor ts your direct button’s name has to star t with “Direct XslRepor t”.
You have to select a page call of type “Custom” for the direct button. This page call
has one parameter named Custom which will contain all your expor t options.
For XML expor ts, the options are to be formatted as a comma separated list of
key/value pairs using the syntax
Key=Value, e.g. Export.Xml.FatClientCompatible=true,Export.Xml.EmitCata-
logs=true
For XML repor ts, the options have to be enclosed in square brackets and the Custom
field star ts with the name of the XSL transformation, e.g. ExportListHtml[Export.En-
coding=UTF-16] .
Note: If the button “Direct XslRepor t Excel” is used and it contains the
parameter EmitXmlNativeFormat=true , data types are correctly mapped from Aurea
CRM to Microsoft Excel: numerical fields (long, shor t, float) are mapped to ‘Number’
in Excel, date fields to ‘DateTime’ and logical fields to ‘Boolean’. All other types of
fields are passed as strings (also time fields, since Excel’s XML format does not
suppor t time without date).
The “Custom” page call, which can be used to generate a parameterized repor t from
the QueryRun page, also suppor ts the complete repor t object instead of just the
repor t name, for example
{XslTransforms: "ExportCSV", Caption: "some heading text", ExportFatClient-
Compatible: true, ContentDisposition: "inline", Target: "WorkFrame"} .
The XSL transformations are - by default - stored in the web installation’s directory
in /Data/Reports/XSLT/ .
The location of the directory can be changed by adding the following elements
(marked bold) to your
<update.net>
...
<mmPortal>
...
<!-- reporting configuration -->
<mmReports>
...
<XSLTPath>Data/Reports/XSLT</XSLTPath>
...
</mmReports>
...
By default the XSL transformations will be loaded on first use and cached from then
on. While developing new XSL transformations this can become cumbersome, be-
cause Aurea CRM Web would have to be restar ted for each change to the XSL
transformation. Therefore the XSL transformation cache can be turned off using the
following element (again marked bold and located in "Configuration.xml"):
<update.net>
...
<mmPortal>
...
<!-- reporting configuration -->
<mmReports>
...
<!-- True to enable caching for XSLT-Transforms -->
<CacheXslTransforms>False</CacheXslTransforms>
...
</mmReports>
...
There are no constraints on the XSL transformations you create for XSL repor ting,
as long as they are valid transformations according to the W3C XSL Transformations
(XSLT) Version 1.0 recommendation located at http://www.w3.org/TR/xslt
However, you should add a "media-type" attribute to your <xsl:output> element.
Aurea CRM Web will look for this attribute and modify the content-type of the HTTP-
Stream sent to the client (Microsoft Internet Explorer). Without setting the media-
type the OS on the client-computer will not be able to determine the correct applica-
tion for opening the repor t.
<xsl:output method="xml" encoding="UTF-8" media-type="application/msword" />
Note: The media-type will also be used to alter the file extension of the filename
transferred to the client. For security reasons the client-application (Microsoft Internet
Explorer) will use the file extension rather than the HTTP content-type to determine
the application used to open a file. As a result all content-types and file extensions
must be known (hence entered into the registry) to your Aurea CRM Web server.
The following code sample sketches how to execute a repor t named “MyCustomRe-
por t” on data returned by the public query “MyQuery”. Please note that the repor t
option FatClientCompatible is set to True using attribute Action .
var oQuery = new Controller.QueryControl(...);
oQuery.SetQueryName("MyQuery", false /* false for public queries */);
// load the query using LoadQueryDefinition(...)
// skipped for clarity
// prepare the report options
var oExport =
{
MaxResults: -1 // include **ALL** records in the result
,Export: { Type: "XML" // the export should emit XML
,Params: { XslTransforms: "MyCustomReport" } }
// we want fat-client-compatible XML export format
,Action: "Export.Xml.FatClientCompatible=True"
};
// finally execute the report
oQuery.Export(oExport);
Depending of what you want to expor t (search & list, query, details, tree view), the
JavaScript code required to perform the expor t differs.
The Aurea CRM Web SP4+ installation includes a sample page samples/ex-
port.html that demonstrates how the various types of expor ts can be initiated using
JavaScript code.
On the client-side you call the channel as usual, with one simple twist (the additional
call of SetAutoClose):
var channel = Controller.OpenChannel(window);
channel.SetData(....) channel.SetAutoClose(true);
// tell the channel to leave result processing to the browser
channel.Submit(null, "chMyReport", null);
You can specify the following in the „Additional Parameters“ (values except
Booleans need to be enclosed by double quotes, values are separated by colon):
• queryName
• isPrivateQuery (true or false)
• repor tName
• contentDisposition (optional)
• target (optional)
• expor tFatClientCompatible (true or false) (optional)
• tableCaption (optional)
Example: To call a MS Word repor t from a company that contains all persons of
the company plus their main interest, you’d use:
Function QueryControl.ReportLinked, InfoArea Record,
Additional Parameters "KPs_in_FI",true,"ExportListWordml"
2. You can influence the text and behavior of the “Execute” button for parameterized
queries:
• In the „QueryRun“ Page Call, specify the name of the desired Direct Button in
the AlternateExecuteDirectButton parameter (e.g. Direct XslReport Excel to
directly star t an MS Excel expor t when the user clicks on “Execute”)
• In Generic Forms, provide the name of the desired Direct Button by
providing ExecuteButton(<button name>) in the “Option” column (e.g. Execute-
Button(Direct XslReport Excel) ).
Note: This setting is ignored for queries that do not contain parameters (i.e. such
queries are simply executed ‘as normal’ and the results list displayed).
These parameters cannot be modified directly in the XSL, but can be overridden by
the format definition or by parameters of the page call e.g. by providing {stylesheet:
'<style sheet name>'} . Parameters provided via the page call always take prece-
dence over parameters defined in the XSL or in the format.
Note: If your repor t format has the “Output link” option checked, you need to make
sure that the Configuration (MC) entry for “Links | web URL” is filled accordingly.
You can control whether a repor t is generated only in memory or as a file (in
web.data\session\repor t.xml) by defining these Web Configuration parameters:
• ReportMemoryThreshold (type: Character): defines the maximum size in KB that
is used for in-memory generation (default: 256 KB)
• ReportAlwaysInMemory (type: Boolean): if checked, a repor t is never generated
as a file (and when a repor t exceeds the limit specified in ReportMemoryThreshold ,
the repor t creation is abor ted with an error message).
Compared to repor ts running in Aurea CRM win, the following restrictions apply in
Aurea CRM Web:
• The placeholders $userdir and $installDir cannot be used.
• The style sheets always need to be located in Data\Repor ts\XSLT.
• You cannot use variable conditions in the transfer field format.
• The “Save as file” option is not suppor ted (repor ts in web are always executed
synchronously and the displayed).
• The “Save transformation to file” options are not suppor ted.
• The “Transfer to spreadsheet” options are not suppor ted.
• The creation of PDF repor ts as described in the Aurea CRM win User manual
(chapter “PDF Repor t”) is not suppor ted.
• If the XslTransforms parameter is set in the page call, the provided transformation
is always applied last.
The ExportParams parameter does not suppor t any EmitXX options, these need to
be set directly in the format.