[migration]
### API Changes
#### Added Constants
* com.inet.report.Engine
  * EXPORT_BMP
  * EXPORT_GIF
  * EXPORT_JPG
  * EXPORT_PNG
* com.inet.report.FormulaField
  * TREAT_NULL_AS_NULL
  * TREAT_NULL_BY_DEFAULT
  * TREAT_NULL_BY_EXCEPTION

#### Added Methods
* com.inet.report.Field
  * duplicate(String)
* com.inet.report.FormulaField
  * checkContext()
  * duplicate()
  * getNullBehavior()
  * setNullBehavior(int)
* com.inet.report.PromptField
  * duplicate(String)
* com.inet.report.SQLField
  * duplicate(String)
* com.inet.report.SummaryInfo
  * getThumbnail()
  * setThumbnail(Image)
* com.inet.report.SummaryField
  * duplicate(String)
* com.inet.report.TableSource
  * getDatabaseField(int)

#### Methods and Constants deprecated as of Version 9
The following list includes the methods that are deprecated in version 9 and should
no longer be used. Please consult the API documentation of the individual methods
for more information about newer methods to use instead.

* com.inet.report.Datasource
  * setup(String)
  * setup(DataSourceConfiguration)
* com.inet.report.RDC
  * saveEngine(PrintWriter, Engine)

#### Removed deprecated Methods and Constants
The following methods had been deprecated for longer than 2 major versions and
have now been entirely removed in version 9 of i-net Crystal-Clear.

* com.inet.report.AbstractLineElement
  * getExtentToBottomOfSectionWhenPrinting()
* com.inet.report.AbstractValueElement
  * getDateFirstSeperator()
  * setDateFirstSeperator(String)
  * getDateFirstSeperatorFormula()
  * setDateFirstSeperatorFormula(FormulaField)
  * getDatePrefixSeperator()
  * setDatePrefixSeperator(String)
  * getDatePrefixSeperatorFormula()
  * setDatePrefixSeperatorFormula(FormulaField)
  * getDateSecondSeperator()
  * setDateSecondSeperator(String)
  * getDateSecondSeperatorFormula()
  * setDateSecondSeperatorFormula(FormulaField)
  * getDateSuffixSeperator()
  * setDateSuffixSeperator(String)
  * getDateSuffixSeperatorFormula()
  * setDateSuffixSeperatorFormula(FormulaField)
  * getDateTimeSeperator()
  * setDateTimeSeperator(String)
  * getDateTimeSeperatorFormula()
  * setDateTimeSeperatorFormula(FormulaField)
  * getDayOfWeekSeperator()
  * setDayOfWeekSeperator(String)
  * getDayOfWeekSeperatorFormula()
  * setDayOfWeekSeperatorFormula(FormulaField)
  * getDecimalSeperatorsSymbol()
  * setDecimalSeperatorsSymbol(String)
  * getDecimalSeperatorsSymbolFormula()
  * setDecimalSeperatorsSymbolFormula(FormulaField)
  * getHourMinuteSeperator()
  * setHourMinuteSeperator(String)
  * getHourMinuteSeperatorFormula()
  * setHourMinuteSeperatorFormula(FormulaField)
  * getMinuteSecondSeperator()
  * setMinuteSecondSeperator(String)
  * getMinuteSecondSeperatorFormula()
  * setMinuteSecondSeperatorFormula(FormulaField)
  * getThousandSeperatorsSymbol()
  * setThousandSeperatorsSymbol(String)
  * getThousandSeperatorsSymbolFormula()
  * setThousandSeperatorsSymbolFormula(FormulaField)
  * getUseThousandSeperators()
  * setUseThousandSeperators(boolean)
  * getUseThousandSeperatorsFormula()
  * setUseThousandSeperatorsFormula(FormulaField)
* com.inet.report.BorderProperties
  * getBottomLineStyleFormel()
  * getTopLineStyleFormel()
* com.inet.report.Chart
  * CUSTOM_NUMER_FORMAT
  * getSort()
  * setdataValuesMinMax(double, double)
  * setSort(int)
* com.inet.report.ChartFormatProperties
  * getDateFirstSeperator()
  * setDateFirstSeperator(String)
  * getDateFirstSeperatorFormula()
  * setDateFirstSeperatorFormula(FormulaField)
  * getDatePrefixSeperator()
  * setDatePrefixSeperator(String)
  * getDatePrefixSeperatorFormula()
  * setDatePrefixSeperatorFormula(FormulaField)
  * getDateSecondSeperator()
  * setDateSecondSeperator(String)
  * getDateSecondSeperatorFormula()
  * setDateSecondSeperatorFormula(FormulaField)
  * getDateSuffixSeperator()
  * setDateSuffixSeperator(String)
  * getDateSuffixSeperatorFormula()
  * setDateSuffixSeperatorFormula(FormulaField)
  * getDateTimeSeperator()
  * setDateTimeSeperator(String)
  * getDateTimeSeperatorFormula()
  * setDateTimeSeperatorFormula(FormulaField)
  * getDayOfWeekSeperator()
  * setDayOfWeekSeperator(String)
  * getDayOfWeekSeperatorFormula()
  * setDayOfWeekSeperatorFormula(FormulaField)
  * getDecimalSeperatorsSymbol()
  * setDecimalSeperatorsSymbol(String)
  * getDecimalSeperatorsSymbolFormula()
  * setDecimalSeperatorsSymbolFormula(FormulaField)
  * getHourMinuteSeperator()
  * setHourMinuteSeperator(String)
  * getHourMinuteSeperatorFormula()
  * setHourMinuteSeperatorFormula(FormulaField)
  * getMinuteSecondSeperator()
  * setMinuteSecondSeperator(String)
  * getMinuteSecondSeperatorFormula()
  * setMinuteSecondSeperatorFormula(FormulaField)
  * getThousandSeperatorsSymbol()
  * setThousandSeperatorsSymbol(String)
  * getThousandSeperatorsSymbolFormula()
  * setThousandSeperatorsSymbolFormula(FormulaField)
  * getUseThousandSeperators()
  * setUseThousandSeperators(boolean)
  * getUseThousandSeperatorsFormula()
  * setUseThousandSeperatorsFormula(FormulaField)
* com.inet.report.CrossTab
  * getColTotalOnLeft()
* com.inet.report.CrossTabCell
  * setHeightByFieldElements()
  * setWidthByFieldElement(int)
* com.inet.report.DatabaseTables
  * addSproc(String, String[], int[])
  * addSproc(String, String, String[], int[])
  * addSqlSource(String)
  * addSqlSource(String, String)
  * getDistinct()
  * getPassword()
  * getUser()
  * setCatalog(String)
  * setColumnNames(String, String[])
  * setColumnTypes(String, int[])
  * setDistinct(boolean)
  * setDll(String)
  * setHost(String)
  * setPassword(String)
  * setSchema(String)
  * setURL(String)
  * setUser(String)
* com.inet.report.Element
  * getBottomLineStyleFormel()
  * getToolTipsTextFormel()
  * getTopLineStyleFormel()
  * getWebSiteAddressFormel()
  * setWebSiteAddressFormula(FormulaField)
* com.inet.report.Engine
  * getCatalog()
  * getConnection()
  * getDll()
  * getHost()
  * getPassword(int)
  * getPasswords()
  * getSchema()
  * getURL()
  * getUser(int)
  * getUsers()
  * setDll(String)
  * setHost(String)
  * setPassword(String, int)
  * setPasswords(Vector)
  * setSql(String, boolean)
  * setURL(String)
  * setUser(String, int)
  * setUsers(Vector)
* com.inet.report.Fields
  * addDatabaseField(String)
  * addSortField( field, String)
* com.inet.report.FormulaField
  * checkFormula(String, boolean, Engine, Field, Object, boolean)
* com.inet.report.GeneralProperties
  * getToolTipsTextFormel()
* com.inet.report.HyperlinkProperties
  * getWebSiteAddressFormel()
  * setWebSiteAddressFormula(FormulaField)
* com.inet.report.JavaBean
  * getBeanProperty(String)
* com.inet.report.LineProperties
  * getExtentToBottomOfSectionWhenPrinting()
* com.inet.report.SortField
  * setSortDirectionFormula(String)
* com.inet.report.TableSource
  * setColumnName(int idx, String)
  * setColumnType(int, int)
* com.inet.report.ValueProperties
  * getDateFirstSeperator()
  * setDateFirstSeperator(String)
  * getDateFirstSeperatorFormula()
  * setDateFirstSeperatorFormula(FormulaField)
  * getDatePrefixSeperator()
  * setDatePrefixSeperator(String)
  * getDatePrefixSeperatorFormula()
  * setDatePrefixSeperatorFormula(FormulaField)
  * getDateSecondSeperator()
  * setDateSecondSeperator(String)
  * getDateSecondSeperatorFormula()
  * setDateSecondSeperatorFormula(FormulaField)
  * getDateSuffixSeperator()
  * setDateSuffixSeperator(String)
  * getDateSuffixSeperatorFormula()
  * setDateSuffixSeperatorFormula(FormulaField)
  * getDateTimeSeperator()
  * setDateTimeSeperator(String)
  * getDateTimeSeperatorFormula()s
  * setDateTimeSeperatorFormula(FormulaField)
  * getDayOfWeekSeperator()
  * setDayOfWeekSeperator(String)
  * getDayOfWeekSeperatorFormula()
  * setDayOfWeekSeperatorFormula(FormulaField)
  * getDecimalSeperatorsSymbol()
  * setDecimalSeperatorsSymbol(String)
  * getDecimalSeperatorsSymbolFormula()
  * setDecimalSeperatorsSymbolFormula(FormulaField)
  * getHourMinuteSeperator()
  * setHourMinuteSeperator(String)
  * getHourMinuteSeperatorFormula()
  * setHourMinuteSeperatorFormula(FormulaField)
  * getMinuteSecondSeperator()
  * setMinuteSecondSeperator(String)
  * getMinuteSecondSeperatorFormula()
  * setMinuteSecondSeperatorFormula(FormulaField)
  * getThousandSeperatorsSymbol()
  * setThousandSeperatorsSymbol(String)
  * getThousandSeperatorsSymbolFormula()
  * setThousandSeperatorsSymbolFormula(FormulaField)
  * getUseThousandSeperators()
  * setUseThousandSeperators(boolean)
  * getUseThousandSeperatorsFormula()
  * setUseThousandSeperatorsFormula(FormulaField)
* com.inet.report.schedule.Scheduler
  * getEmailPassword()
  * setEmailPassword(String)
  * getEmailPop3Host()
  * setEmailPop3Host(String)
  * getEmailSender()
  * setEmailSender(String)
  * getEmailSmtpHost()
  * setEmailSmtpHost(String)
  * getEmailUser()
  * setEmailUser(String)

### URL parameters are disallowed by default
Since version 9, for security reasons, only the following parameters are allowed by default in the report URL: "prompt", "init" and "sproc". To use other parameters in the report URL, like "datasource", it could be necessary to unlock them in the [Configuration Manager](https://docs.inetsoftware.de/reporting/help/security-report-url-parameter) before using it.

It is always possible to set values for all parameters in the [checkProperties method](https://docs.inetsoftware.de/reporting/help/report-customization) on the server side. Java code samples showing this you can find in the "samples" directory of the documentation (if installed).

### Evaluation Time of Formulas
The evaluation time of formulas has been changed in version 9 in order to provide better performance as well as be more consistent. The formula functions "WhileReadingRecords" and "WhilePrintingRecords” now have a slightly different effect on when the formula is evaluated, as well as on how the formula can be used.

If you use an older configuration with i-net Crystal-Clear version 9, then it is necessary to set the Compatibility Level to "compliant to version 9.x" to use the new behavior of "WhileReadingRecords" formulas. If you create a new configuration with version 9, then "compliant to version 9.x" is the default value.
* All formulas specified as "WhileReadingRecords” that are used in the report are now executed:
  * for each record
  * after all records are sorted and filtered but
  * before the rendering of the first section begins.
* Variables used in formulas with the WhileReadingRecords evaluation time are not reset before the rendering starts so that the variables can be used in formulas with WhilePrintingRecords evaluation time, also.
* Summaries, grouping and sorting are also computed prior to rendering, making it impossible to summarize or group on a "while printing" formula.
* Formulas which include a summary can not have their evaluation be specified as "while reading" since the summary will not be computed until after computing the "while reading" records.

Because of the modified behavior it might be necessary to update your reports using the WhileReadingRecords function so that you get the same result as with previous i-net Crystal-Clear versions. It is unfortunately necessary to do this behavior modification because the old behavior was incorrect.

In order to figure out which reports need modification, we provide a tool called **EvaluationTimeChecker** with our Java source code samples (see: directory samples.formula) that can be installed during the setup, which will point you to any reports you might have which will have any changed behavior in version 9. For backwards compatibility, you have in the Configuration Manager the property "Compatibility Level". Please set the value to "compliant to version 8.x" to keep the old formula evaluation time behavior.

Note that if two formulas have the same evaluation time, they are evaluated in the order they were created. Say you have two "before reading" formulas in your report header – the first one you created will be evaluated before the second one, even if the second one is positionally above the first.

### Underlay Following Sections
The algorithm for "Underlay Following Sections" was rewritten to implement the correct definition. This can change the output of your reports if you were affected by bugs in the old implementation. One benefit is that you can now design reports with watermarks without any problems. If you want to create a watermark then you need only to add a first section to the report/page header and enable "Underlay Following Sections" for this section. You should place the image either in the report or the page header depending on if you want one watermark per report
or one per page.

### Improved Report File Format
Since version 9, i-net Crystal-Clear uses a zipped file format for the report templates (.rpt), similar to the OpenDocument zip file format. This new report file format was a prerequisite for new features like the Report Preview and translation resources per report. With this format the performance has been improved especially for large reports, because the file size is smaller and it is faster. Also, with this format we are open for further additions to the report templates.


[migration:de]
### API-Änderungen
#### Konstanten hinzugefügt
* com.inet.report.Engine
  * EXPORT_BMP
  * EXPORT_GIF
  * EXPORT_JPG
  * EXPORT_PNG
* com.inet.report.FormulaField
  * TREAT_NULL_AS_NULL
  * TREAT_NULL_BY_DEFAULT
  * TREAT_NULL_BY_EXCEPTION

#### Hinzugefügte Methoden
* com.inet.report.Field
  * duplicate(String)
* com.inet.report.FormulaField
  * checkContext()
  * duplicate()
  * getNullBehavior()
  * setNullBehavior(int)
* com.inet.report.PromptField
  * duplicate(String)
* com.inet.report.SQLField
  * duplicate(String)
* com.inet.report.SummaryInfo
  * getThumbnail()
  * setThumbnail(Image)
* com.inet.report.SummaryField
  * duplicate(String)
* com.inet.report.TableSource
  * getDatabaseField(int)

#### Methoden und Konstanten, die ab Version 9 veraltet sind
Die folgende Liste enthält die Methoden, die in Version 9 veraltet sind und
nicht mehr verwendet werden sollten. Bitte konsultieren Sie die API-Dokumentation der einzelnen Methoden
für weitere Informationen über neuere Methoden, die stattdessen verwendet werden sollten.

* com.inet.report.Datasource
  * setup(String)
  * setup(DataSourceConfiguration)
* com.inet.report.RDC
  * saveEngine(PrintWriter, Engine)

#### Entfernte veraltete Methoden und Konstanten
Die folgenden Methoden waren schon länger als 2 Hauptversionen veraltet und
wurden nun in Version 9 von i-net Crystal-Clear vollständig entfernt.

* com.inet.report.AbstractLineElement
  * getExtentToBottomOfSectionWhenPrinting()
* com.inet.report.AbstractValueElement
  * getDateFirstSeperator()
  * setDateFirstSeperator(String)
  * getDateFirstSeperatorFormula()
  * setDateFirstSeperatorFormula(FormulaField)
  * getDatePrefixSeperator()
  * setDatePrefixSeperator(String)
  * getDatePrefixSeperatorFormula()
  * setDatePrefixSeperatorFormula(FormulaField)
  * getDateSecondSeperator()
  * setDateSecondSeperator(String)
  * getDateSecondSeperatorFormula()
  * setDateSecondSeperatorFormula(FormulaField)
  * getDateSuffixSeperator()
  * setDateSuffixSeperator(String)
  * getDateSuffixSeperatorFormula()
  * setDateSuffixSeperatorFormula(FormulaField)
  * getDateTimeSeperator()
  * setDateTimeSeperator(String)
  * getDateTimeSeperatorFormula()
  * setDateTimeSeperatorFormula(FormulaField)
  * getDayOfWeekSeperator()
  * setDayOfWeekSeperator(String)
  * getDayOfWeekSeperatorFormula()
  * setDayOfWeekSeperatorFormula(FormulaField)
  * getDecimalSeperatorsSymbol()
  * setDecimalSeperatorsSymbol(String)
  * getDecimalSeperatorsSymbolFormula()
  * setDecimalSeperatorsSymbolFormula(FormulaField)
  * getHourMinuteSeperator()
  * setHourMinuteSeperator(String)
  * getHourMinuteSeperatorFormula()
  * setHourMinuteSeperatorFormula(FormulaField)
  * getMinuteSecondSeperator()
  * setMinuteSecondSeperator(String)
  * getMinuteSecondSeperatorFormula()
  * setMinuteSecondSeperatorFormula(FormulaField)
  * getThousandSeperatorsSymbol()
  * setThousandSeperatorsSymbol(String)
  * getThousandSeperatorsSymbolFormula()
  * setThousandSeperatorsSymbolFormula(FormulaField)
  * getUseThousandSeperators()
  * setUseThousandSeperators(boolean)
  * getUseThousandSeperatorsFormula()
  * setUseThousandSeperatorsFormula(FormulaField)
* com.inet.report.BorderProperties
  * getBottomLineStyleFormel()
  * getTopLineStyleFormel()
* com.inet.report.Chart
  * CUSTOM_NUMER_FORMAT
  * getSort()
  * setdataValuesMinMax(double, double)
  * setSort(int)
* com.inet.report.ChartFormatProperties
  * getDateFirstSeperator()
  * setDateFirstSeperator(String)
  * getDateFirstSeperatorFormula()
  * setDateFirstSeperatorFormula(FormulaField)
  * getDatePrefixSeperator()
  * setDatePrefixSeperator(String)
  * getDatePrefixSeperatorFormula()
  * setDatePrefixSeperatorFormula(FormulaField)
  * getDateSecondSeperator()
  * setDateSecondSeperator(String)
  * getDateSecondSeperatorFormula()
  * setDateSecondSeperatorFormula(FormulaField)
  * getDateSuffixSeperator()
  * setDateSuffixSeperator(String)
  * getDateSuffixSeperatorFormula()
  * setDateSuffixSeperatorFormula(FormulaField)
  * getDateTimeSeperator()
  * setDateTimeSeperator(String)
  * getDateTimeSeperatorFormula()
  * setDateTimeSeperatorFormula(FormulaField)
  * getDayOfWeekSeperator()
  * setDayOfWeekSeperator(String)
  * getDayOfWeekSeperatorFormula()
  * setDayOfWeekSeperatorFormula(FormulaField)
  * getDecimalSeperatorsSymbol()
  * setDecimalSeperatorsSymbol(String)
  * getDecimalSeperatorsSymbolFormula()
  * setDecimalSeperatorsSymbolFormula(FormulaField)
  * getHourMinuteSeperator()
  * setHourMinuteSeperator(String)
  * getHourMinuteSeperatorFormula()
  * setHourMinuteSeperatorFormula(FormulaField)
  * getMinuteSecondSeperator()
  * setMinuteSecondSeperator(String)
  * getMinuteSecondSeperatorFormula()
  * setMinuteSecondSeperatorFormula(FormulaField)
  * getThousandSeperatorsSymbol()
  * setThousandSeperatorsSymbol(String)
  * getThousandSeperatorsSymbolFormula()
  * setThousandSeperatorsSymbolFormula(FormulaField)
  * getUseThousandSeperators()
  * setUseThousandSeperators(boolean)
  * getUseThousandSeperatorsFormula()
  * setUseThousandSeperatorsFormula(FormulaField)
* com.inet.report.CrossTab
  * getColTotalOnLeft()
* com.inet.report.CrossTabCell
  * setHeightByFieldElements()
  * setWidthByFieldElement(int)
* com.inet.report.DatabaseTables
  * addSproc(String, String[], int[])
  * addSproc(String, String, String[], int[])
  * addSqlSource(String)
  * addSqlSource(String, String)
  * getDistinct()
  * getPassword()
  * getUser()
  * setCatalog(String)
  * setColumnNames(String, String[])
  * setColumnTypes(String, int[])
  * setDistinct(boolean)
  * setDll(String)
  * setHost(String)
  * setPassword(String)
  * setSchema(String)
  * setURL(String)
  * setUser(String)
* com.inet.report.Element
  * getBottomLineStyleFormel()
  * getToolTipsTextFormel()
  * getTopLineStyleFormel()
  * getWebSiteAddressFormel()
  * setWebSiteAddressFormula(FormulaField)
* com.inet.report.Engine
  * getCatalog()
  * getConnection()
  * getDll()
  * getHost()
  * getPassword(int)
  * getPasswords()
  * getSchema()
  * getURL()
  * getUser(int)
  * getUsers()
  * setDll(String)
  * setHost(String)
  * setPassword(String, int)
  * setPasswords(Vector)
  * setSql(String, boolean)
  * setURL(String)
  * setUser(String, int)
  * setUsers(Vector)
* com.inet.report.Fields
  * addDatabaseField(String)
  * addSortField( field, String)
* com.inet.report.FormulaField
  * checkFormula(String, boolean, Engine, Field, Object, boolean)
* com.inet.report.GeneralProperties
  * getToolTipsTextFormel()
* com.inet.report.HyperlinkProperties
  * getWebSiteAddressFormel()
  * setWebSiteAddressFormula(FormulaField)
* com.inet.report.JavaBean
  * getBeanProperty(String)
* com.inet.report.LineProperties
  * getExtentToBottomOfSectionWhenPrinting()
* com.inet.report.SortField
  * setSortDirectionFormula(String)
* com.inet.report.TableSource
  * setColumnName(int idx, String)
  * setColumnType(int, int)
* com.inet.report.ValueProperties
  * getDateFirstSeperator()
  * setDateFirstSeperator(String)
  * getDateFirstSeperatorFormula()
  * setDateFirstSeperatorFormula(FormulaField)
  * getDatePrefixSeperator()
  * setDatePrefixSeperator(String)
  * getDatePrefixSeperatorFormula()
  * setDatePrefixSeperatorFormula(FormulaField)
  * getDateSecondSeperator()
  * setDateSecondSeperator(String)
  * getDateSecondSeperatorFormula()
  * setDateSecondSeperatorFormula(FormulaField)
  * getDateSuffixSeperator()
  * setDateSuffixSeperator(String)
  * getDateSuffixSeperatorFormula()
  * setDateSuffixSeperatorFormula(FormulaField)
  * getDateTimeSeperator()
  * setDateTimeSeperator(String)
  * getDateTimeSeperatorFormula()s
  * setDateTimeSeperatorFormula(FormulaField)
  * getDayOfWeekSeperator()
  * setDayOfWeekSeperator(String)
  * getDayOfWeekSeperatorFormula()
  * setDayOfWeekSeperatorFormula(FormulaField)
  * getDecimalSeperatorsSymbol()
  * setDecimalSeperatorsSymbol(String)
  * getDecimalSeperatorsSymbolFormula()
  * setDecimalSeperatorsSymbolFormula(FormulaField)
  * getHourMinuteSeperator()
  * setHourMinuteSeperator(String)
  * getHourMinuteSeperatorFormula()
  * setHourMinuteSeperatorFormula(FormulaField)
  * getMinuteSecondSeperator()
  * setMinuteSecondSeperator(String)
  * getMinuteSecondSeperatorFormula()
  * setMinuteSecondSeperatorFormula(FormulaField)
  * getThousandSeperatorsSymbol()
  * setThousandSeperatorsSymbol(String)
  * getThousandSeperatorsSymbolFormula()
  * setThousandSeperatorsSymbolFormula(FormulaField)
  * getUseThousandSeperators()
  * setUseThousandSeperators(boolean)
  * getUseThousandSeperatorsFormula()
  * setUseThousandSeperatorsFormula(FormulaField)
* com.inet.report.schedule.Scheduler
  * getEmailPassword()
  * setEmailPassword(String)
  * getEmailPop3Host()
  * setEmailPop3Host(String)
  * getEmailSender()
  * setEmailSender(String)
  * getEmailSmtpHost()
  * setEmailSmtpHost(String)
  * getEmailUser()
  * setEmailUser(String)

### URL-Parameter sind standardmäßig nicht erlaubt
Seit Version 9 sind aus Sicherheitsgründen standardmäßig nur noch die folgenden Parameter in der Berichts-URL erlaubt: "prompt", "init" und "sproc". Um andere Parameter in der Berichts-URL zu verwenden, wie z.B. "datasource", kann es notwendig sein, diese im [Configuration Manager] (https://docs.inetsoftware.de/reporting/help/security-report-url-parameter) freizuschalten, bevor sie verwendet werden.

Es ist immer möglich, Werte für alle Parameter in der [checkProperties-Methode](https://docs.inetsoftware.de/reporting/help/report-customization) auf der Server-Seite zu setzen. Java-Code-Beispiele, die dies zeigen, finden Sie im Verzeichnis "samples" der Dokumentation (falls installiert).

### Auswertungszeit von Formeln
Die Auswertungszeit von Formeln wurde in der Version 9 geändert, um eine bessere Performance und mehr Konsistenz zu erreichen. Die Formelfunktionen "WhileReadingRecords" und "WhilePrintingRecords" haben nun einen etwas anderen Einfluss darauf, wann die Formel ausgewertet wird und wie die Formel verwendet werden kann.

Wenn Sie eine ältere Konfiguration mit i-net Crystal-Clear Version 9 verwenden, dann ist es notwendig, die Kompatibilitätsebene auf "konform zu Version 9.x" zu setzen, um das neue Verhalten von "WhileReadingRecords"-Formeln zu nutzen. Wenn Sie eine neue Konfiguration mit Version 9 erstellen, ist "compliant to version 9.x" der Standardwert.
* Alle als "WhileReadingRecords" angegebenen Formeln, die im Bericht verwendet werden, werden nun ausgeführt:
  * für jeden Datensatz
  * nachdem alle Datensätze sortiert und gefiltert wurden, aber
  * bevor das Rendern des ersten Abschnitts beginnt.
* Variablen, die in Formeln mit der Auswertungszeit WhileReadingRecords verwendet werden, werden vor Beginn des Renderings nicht zurückgesetzt, so dass die Variablen auch in Formeln mit der Auswertungszeit WhilePrintingRecords verwendet werden können.
* Zusammenfassungen, Gruppierungen und Sortierungen werden ebenfalls vor dem Rendering berechnet, so dass es unmöglich ist, eine Zusammenfassung oder Gruppierung in einer Formel "während des Druckens" vorzunehmen.
* Bei Formeln, die eine Zusammenfassung enthalten, kann die Auswertung nicht als "während des Lesens" angegeben werden, da die Zusammenfassung erst nach der Berechnung der "während des Lesens"-Datensätze berechnet wird.

Aufgrund des geänderten Verhaltens kann es erforderlich sein, Ihre Berichte mit der Funktion WhileReadingRecords zu aktualisieren, damit Sie das gleiche Ergebnis wie mit früheren i-net Crystal-Clear-Versionen erhalten. Es ist leider notwendig, diese Verhaltensänderung vorzunehmen, da das alte Verhalten nicht korrekt war.

Um herauszufinden, welche Berichte geändert werden müssen, stellen wir ein Tool namens **EvaluationTimeChecker** mit unseren Java-Quellcode-Beispielen zur Verfügung (siehe: Verzeichnis samples.formula), das während des Setups installiert werden kann und Sie auf alle Ihre Berichte hinweist, die in der Version 9 ein geändertes Verhalten aufweisen werden. Für die Abwärtskompatibilität haben Sie im Konfigurationsmanager die Eigenschaft "Kompatibilitätsebene". Bitte setzen Sie den Wert auf "kompatibel zu Version 8.x", um das alte Formelauswertungszeitverhalten beizubehalten.

Beachten Sie, dass zwei Formeln, die die gleiche Auswertungszeit haben, in der Reihenfolge ausgewertet werden, in der sie erstellt wurden. Angenommen, Sie haben zwei "Vor dem Lesen"-Formeln in Ihrem Berichtskopf - die erste, die Sie erstellt haben, wird vor der zweiten ausgewertet, auch wenn die zweite über der ersten steht.

### Unterlegen von nachfolgenden Abschnitten
Der Algorithmus für "Unterlegen nach Abschnitten" wurde umgeschrieben, um die korrekte Definition zu implementieren. Dadurch kann sich die Ausgabe Ihrer Berichte ändern, wenn Sie von Fehlern in der alten Implementierung betroffen waren. Ein Vorteil ist, dass Sie nun ohne Probleme Berichte mit Wasserzeichen erstellen können. Wenn Sie ein Wasserzeichen erstellen möchten, müssen Sie lediglich einen ersten Abschnitt zum Bericht/Seitenkopf hinzufügen und für diesen Abschnitt "Folgende Abschnitte unterlegen" aktivieren. Sie sollten das Bild entweder im Bericht oder im Seitenkopf platzieren, je nachdem, ob Sie ein Wasserzeichen pro Bericht
oder eines pro Seite.

### Verbessertes Berichtsdateiformat
Seit Version 9 verwendet i-net Crystal-Clear ein komprimiertes Dateiformat für die Berichtsvorlagen (.rpt), ähnlich dem OpenDocument zip-Dateiformat. Dieses neue Berichtsdateiformat war eine Voraussetzung für neue Funktionen wie die Berichtsvorschau und Übersetzungsressourcen pro Bericht. Mit diesem Format wurde die Leistung insbesondere bei großen Berichten verbessert, da die Dateigröße kleiner und schneller ist. Außerdem sind wir mit diesem Format offen für weitere Ergänzungen zu den Berichtsvorlagen.
