Release Notes 2023-01-08

Version Information

OpenEdge Release

Version Information

11.7.9, 11.7.10, 11.7.11, 11.7.12, 12.2., 12.5.2

Release 11.7 #73841@2023-01-08

Security Bulletin - log4j CVE-2021-44228

Further details: log4j CVE-2021-44228

OpenEdge 12.6 support!

We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 12.6. We hereby declare OpenEdge 12.6 fully supported for the SmartComponent Library as of the release of  October 4th 2022.

OpenEdge 12.2 support!

We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 12.2. We hereby declare OpenEdge 12.2 fully supported for the SmartComponent Library as of the release of April 09th 2020.

.NET Framework Version 4.7

.NET 4.7 is not supported with OpenEdge 11.x, see: Is .NET 4.7 certified and supported for OpenEdge? 

Progress has reported severy issues with OpenEdge GUI for .NET and .NET 4.7: GUI .Net Application crashes after .Net upgrade to 4.7

When using the .NET Framework 4.7, please make sure, you upgrade to OpenEdge 11.6.4 or OpenEdge 11.7.2 or later. Also, it may be required to recompile the application on a PC running .NET Framework 4.7 when applications are also executed on a PC with .NET Framework 4.7.

Introducing the SmartComponent Library developer forum

Got questions about using the SmartComponent Library? Wish to discuss feature requests with other users of the SmartComponent Library? To facilitate networking in the growing number of SmartComponent Library users and developers, we've added a developer forum on our new home-page. The developer forum can be found at: https://www.consultingwerk.com/support/forum 

A login is required to participate in the forum. Don't be shy - create your account today!

Release Notes

Following the release of the OpenEdge 11.7 Release we have completed our testing of the SmartComponent Library on this release of Progress and are proud to announce formal support for the SmartComponent Library on OpenEdge 11.7 with the 2017-04-24 release of the SmartComponent Library. Generally we recommend customers on OpenEdge 11 to upgrade to OpenEdge 11.7 quickly. Starting the 2017-07-14 release we are supporting OpenEdge 11.7 Service Pack 1 (11.7.1).

Starting the 2015-10-09 release the Business Entity Designer will feature a start page with links to most recent release note articles on this site.

With SCL-751 we have adopted native Enums for OpenEdge 11.6. To activate this feature customers must add a definition to products.i. SCL-751 provides details for this.

With SCL-1113 we have modified the templates for SmartWindowForms and SmartTabFolderPages generated from the Business Entity Designer. We have removed the initialization of the viewer controls SmartTableIOState property (value was set to "NoDataSource" within the InitializeComponent method). Customers using their own set of templates should adopt the same fix to their templates.

OpenEdge 11.7.3 compatibility

During our tests on OpenEdge 11.7.3 we have experienced the following issues: 

  • [SCL-2216] - 11.7.3 Visual Designer disabling properties of ABL user controls

The issue has been resolved by Progress Software with hotfix 007 for OpenEdge 11.7.3.

OpenEdge 11.7.2 compatibility

During our tests on OpenEdge 11.7.2 we have experienced two issues: 

  • [SCL-2007] - Correct support for WebHandler in CcsServiceManager
  • [SCL-2008] - Closing SmartWindowForm causes crash on OpenEdge 11.7.2

We consider it mandatory for customers using OpenEdge 11.7.2 to use at least the release #44166@2017-11-27 of the SmartComponent Library. 

Due to an fix for

  • [SCL-1924] - SmartViewerControl: copy mechanism cannot cope with clob datatype

from Progress Software for in OpenEdge 11.7.2.001 we further recommend all customers to apply this hotfix as well. 

New Versions of Proparse .NET Assemblies (30 December 2018)

We have updated proparse with further enhancements in this release (see https://github.com/consultingwerk/proparse/releases/tag/4.0.1.1177). Please download the .NET Assemblies ZIP file from our ESD and replace the proparse.net.dll in your environment with the latest one. The new assembly reference is:

<assembly name="proparse.net, Version=4.0.1.1177, Culture=neutral, PublicKeyToken=cda1b098b1034b24"/>

As proparse is used by our Business Entity Generator, this new version of the proparse.net Assembly is also relevant for customers not doing GUI for .NET development and require support for parsing new ABL language constructs.

This version of proparse provides additional debug information when errors are thrown from proparse.net.dll.

New Version of the Consultingwerk.SmartComponents Assemly (09 January 2019)

To support the new SmartFilterControl and the "Filter" link between the SmartFilterControl/SmartDynamciFilterControl and a SmartBusinessEntityAdapter or SmartDatasetChildAdapter we have updated the Consultingwerk.SmartComponents.dll. The new Assembly reference is:

<assembly name="Consultingwerk.SmartComponents, Version=2.2.0.49856, Culture=neutral, PublicKeyToken=10603cb31df311b3"/>

Customers need to update this Assembly in order to compile the latest releases of the SmartComponent Library.

Hybrid Realm now using IAuthenticationService

We've updated the SmartHybridRealm class used for http authentication to leverage the IAuthenticationService. It is therefor required that for AppServers requiring http Authentication (e.g. REST or Web) the correct IAuthenticationService implementation is registered (using service.xml files).

Customers relying on the previous behavior should ensure that the Consultingwerk.SmartFramework.Authentication.AuthenticationService is regsitered as the IAuthenticationService. This implementation will auhtenticate users against the password stored in the SmartUser database table. 

When users with no Login Company set should be able to login using the SmartHybridRealm, it's required to set the Login Company Tennant Domain (similar to the field in the Login Company Maintenance) in the .restapplicationsettings / .applicationsettings, e.g.:


 "DefaultAuthenticationDomain": "consultingwerk" 

This is required as the Hydrid Realm Interface from Progress does not provide the domain name to the authentication method. 

Web Handler overview

This is an overview of the web handlers supported by this release

defaultHandler=OpenEdge.Web.CompatibilityHandler
handler1=Consultingwerk.OERA.JsdoGenericService.WebHandler.CatalogWebHandler: /Catalog/{EntityName}
handler2=Consultingwerk.OERA.JsdoGenericService.WebHandler.CatalogsWebHandler: /Catalogs/{PackageName}
handler3=Consultingwerk.OERA.JsdoGenericService.WebHandler.CountWebHandler: /Resource/{EntityName}/count
handler4=Consultingwerk.OERA.JsdoGenericService.WebHandler.ResourceSubmitWebHandler: /Resource/{EntityName}/SubmitData
handler5=Consultingwerk.OERA.JsdoGenericService.WebHandler.InvokeMethodWebHandler: /Resource/{EntityName}/{MethodName}
handler6=Consultingwerk.OERA.JsdoGenericService.WebHandler.ResourceWebHandler: /Resource/{EntityName}
handler7=Consultingwerk.OERA.JsdoGenericService.WebHandler.BusinessServicesWebHandler: /BusinessServices/{OutputFormat}/{PackageName}
handler8=Consultingwerk.Web2.WebHandler.SmartMenuWebHandler: /SmartMenu/{MenuStructureId}
handler9=Consultingwerk.Web2.WebHandler.SmartMenuStructureWebHandler: /SmartMenuStructure
handler10=Consultingwerk.Web2.WebHandler.SmartRoutesWebHandler: /SmartRoutes
handler11=Consultingwerk.Web2.Services.SmartViewsHandler.SmartGridWebHandler: /SmartViews/Grid/{EntityName}/{ViewName}/{DetailTemplate}
handler12=Consultingwerk.Web2.Services.SmartViewsHandler.SmartGridWebHandler: /SmartViews/Grid/{EntityName}/{ViewName}
handler13=Consultingwerk.Web2.Services.SmartViewsHandler.SmartGridWebHandler: /SmartViews/Grid/{CustomViewName}
handler14=Consultingwerk.Web2.Services.SmartViewsHandler.SmartViewerWebHandler: /SmartViewer/Viewer/{EntityName}/{ViewName}
handler15=Consultingwerk.Web2.Services.SmartViewsHandler.SmartViewerWebHandler: /SmartViewer/Viewer/{ObjectName}
handler16=Consultingwerk.Web2.Services.SmartViewsHandler.SmartFormWebHandler: /SmartForm/{FormTemplate}/{EntityName}/{ViewName}
handler17=Consultingwerk.Web2.Services.SmartViewsHandler.SmartFormWebHandler: /SmartForm/{FormTemplate}/{ObjectName}
handler18=Consultingwerk.Web2.WebHandler.SmartMessageWebHandler: /SmartMessage/{MessageGroup}/{MessageNumber}
handler19=Consultingwerk.Web2.WebHandler.GetImageWebHandler: /Image/{FileName}
handler20=Consultingwerk.Web2.WebHandler.SmartValueListWebHandler: /ValueList/{ValueList}
handler21=Consultingwerk.Web2.WebHandler.SmartAttachmentsWebHandler: /Attachments/{Table}/{KeyValues}
handler22=Consultingwerk.Web2.WebHandler.SmartAttachmentWebHandler: /Attachment/{Guid}
handler23=Consultingwerk.Web2.WebHandler.SessionContextWebHandler: /SessionContext
handler24=Consultingwerk.Web2.WebHandler.ContextPropertiesWebHandler: /ContextProperties/{PropertyName}
handler25=Consultingwerk.Web2.WebHandler.ContextPropertiesWebHandler: /ContextProperties
handler26=Consultingwerk.Web2.WebHandler.SessionInfoWebHandler: /SessionInfo
handler27=Consultingwerk.Web2.WebHandler.FileSearchWebHandler: /FileSearch/{FileName}
handler28=Consultingwerk.Web2.WebHandler.ExecuteAblWebHandler: /ExecuteAbl
handler29=Consultingwerk.Web2.WebHandler.SmartLanguagesWebHandler: /Languages
handler30=Consultingwerk.OERA.RestResource.RestEntitiesWebHandler: /Entities
handler31=Consultingwerk.OERA.Swagger.SwaggerWebHandler: /Swagger/{EntityName}
handler32=Consultingwerk.OERA.Swagger.SwaggerRestEntitiesWebHandler: /SwaggerEntities/{OutputType}
handler33=Consultingwerk.Web2.WebHandler.SmartTokenSecurityCheckWebHandler: /TokenSecurityCheck/{ObjectName}
handler34=Consultingwerk.Web2.WebHandler.SmartTokenSecurityCheckWebHandler: /TokenSecurityCheck
handler35=Consultingwerk.Web2.WebHandler.SmartEntityTableMappingHandler: /EntityTableMapping/{EntityName}/{TableName}/{UiTypeCodes}
handler36=Consultingwerk.Web2.WebHandler.SmartTreeRootNodeWebHandler: /SmartViews/TreeRootNode/{rootnodeid}
handler37=Consultingwerk.Web2.WebHandler.SmartTreeChildNodesWebHandler: /SmartViews/TreeChildNodes/{parentnodeid}
handler38=Consultingwerk.Web2.WebHandler.SmartSecurityCheckWebHandler: /IsRestricted/{SecurityRealmCode}/{SecurityItemGuid}
handler39=Consultingwerk.Web2.WebHandler.SmartFieldSecurityCheckWebHandler: /RestrictedFields/{TableName}
handler40=Consultingwerk.Web2.WebHandler.GetImageNamesHandler: /ImageNames
handler41=Consultingwerk.Web2.WebHandler.ExecuteQueryWebHandler: /ExecuteQuery
handler42=Consultingwerk.Web2.WebHandler.TranslationProviderWebHandler: /GetTranslation

UTF-8 based deployments available

Starting August 14th 2016 we ship our source code also as UTF-8 encoded. The ZIP files ending with _utf8.zip contain the source code encoded with that code page. The source code in the remaining archives is still encoded in ISO8859-1. Also on Github there is a new branch containing the OpenEdge 11 based source code in UTF-8.

Related article (Progress K-Base): How to get Progress Developer Studio to save in UTF-8 encoding

New Feature Documentation

Download Link

http://esd.consultingwerkcloud.com/

https://github.com/consultingwerk/SmartComponentLibrary

Overview of included tickets


Bug

SCL-3889 RestResourcesJsonReader now ignores empty restResourcesCacheFile value in .restapplicationsettings

Description:

Previously the RestResourcesJsonReader did cause errors written to the AppServer logfile when the value of the restResourcesCacheFile entry in .restapplicationsettings was referring to an invalid cache file name:

2022-12-13T14:08:47.176+0100 715374 715380 1 AS-7 ?:?:? ServiceLoa     ### Initializing Service: Consultingwerk.OERA.RestResource.RestResourceService
2022-12-13T14:08:47.207+0100 715374 715380 1 AS-7 ?:?:? RestResour     Unable to parse file "?"
2022-12-13T14:08:47.207+0100 715374 715380 1 AS-7 ?:?:? RestResour     An Consultingwerk.Exceptions.InvalidValueException has occurred:
2022-12-13T14:08:47.207+0100 715374 715380 1 AS-7 ?:?:? RestResour     Invalid value "?" for File Na



When the empty value is used for the restResourcesCacheFile we are now ignoring the value. When an invalid file name is provided, we will write a qualified error message to the AppServer logfile.

SCL-3897 GenericDictionary's Keys property may have return too large CharacterList

Description:

We have resolved an issue in the GenericDictionary implementation that was potentially causing the Keys property to return a CharacterList with too many entries. The Keys property now returns a CharacterList who’s size matches the size (Count) of the GenericDictionary.

SCL-3898 Label of field in dynamic SmartViewerControl hidden by security no longer remains visible.

Description:

We have fixed an issue where the label control associated with a field in a dynamic SmartViewerControl instance remained visible also when the control was hidden by security.

SCL-3899 MetaGrid in GUI for .NET does now hide columns that should not be visible by security

Description:

The MetaGrid in GUI for .NET now honors columns that are disabled by security.

Improvement

SCL-3391 Supporting filtering of menu functions and containers in security assignment

Description:

To better support security assignment in larger applications we’re now supporting the filtering of menu functions and containers in the security assignment by product module or object type.

SCL-3796 Implemented optional blocking of overwriting of existing records by the GenericDataImporter

Description:

When the importing of data using the GenericDataImporter previously, we have always been overwriting existing records with new data.

The ImportBusinessEntityData method of the GenericDataImporter now provides an additional LOGICAL parameter that allows to control if existing records should be overwritten or skipped during the import. The parameter may be provided through the “SkipExistingRecords” parameter passed from ANT to the import-data.p procedure:

    <!-- Import SmartDb Data -->
    <macrodef name="importBusinessEntityData">
        <attribute name="BusinessEntity" />
        <attribute name="FileName" />
        <attribute name="SkipFields" />
        <attribute name="SkipExistingRecords" />
        <attribute name="ThrowErrors" />
        <sequential>
            <PCTDynRun
                taskname="SFR-import-data"
                procedure="Consultingwerk/SmartFramework/Tools/Import/import-data.p"
                graphicalMode="false" dlcHome="${dlc}" cpinternal="${cpinternal}" cpColl="${cpcoll}" cpstream="${cpstream}"
                inputchars="32000" token="4000" stackSize="500" msgBufferSize="${Mm}" maximumMemory="65000"
                dirSize="10000" paramFile="performance.pf" quickRequest="true"
                ttBufferSize="10000" >

                <propath>
                    <pathelement path="${installroot}" />
                    <pathelement path="${installroot}/src" />
                    <pathelement path="${installroot}/SmartComponentLibrary.pl" />
                </propath>

                <DBConnectionSet refid="smartdbset" />

                <Parameter name="BusinessEntity" value="@{BusinessEntity}" />
                <Parameter name="FileName" value="@{FileName}" />
                <Parameter name="SkipFields" value="@{SkipFields}" />
                <Parameter name="SkipExistingRecords" value="@{SkipExistingRecords}" />
                <Parameter name="ThrowErrors" value="@{ThrowErrors}" />
            </PCTDynRun>

            <echo/>
        </sequential>
    </macrodef>


SCL-3831 Providing OnBeforeBrowse callback with the Consultingwerk.CefSharpSupport assembly

Description:

Through the ChromiumWebBrowserEventHelper control we’re now also providing an ability to implement the OnBeforeBrowse callback of the CefBrowser control.

We have implement support for handling this event through the Consultingwerk.Windows.CefBrowser.ICefBrowserRequestCallbackService service The method

/**
 * Purpose: Called before browser navigation
 * Notes:   If the navigation is allowed FrameLoadStart and FrameLoadEnd will be called.
 *          If the navigation is canceled LoadError will be called with an ErrorCode value of Aborted.
 * @param poBrowserParent The reference to the Control/Form that holds the CefBrowser control
 * @param poCefBrowser The reference to the CefBrowser Control
 * @param poArgs The reference to the OnBeforeBrowseEventArgs with the data for this callback
 */
method public void BeforeBrowse (poBrowserParent as System.Windows.Forms.Control,
                                 poCefBrowser as ChromiumWebBrowser,
                                 poArgs as OnBeforeBrowseEventArgs) .



A sample implementation of this method in the service looks like this:

/**
 * Purpose: Called before browser navigation
 * Notes:   If the navigation is allowed FrameLoadStart and FrameLoadEnd will be called.
 *          If the navigation is canceled LoadError will be called with an ErrorCode value of Aborted.
 * @param poBrowserParent The reference to the Control/Form that holds the CefBrowser control
 * @param poCefBrowser The reference to the CefBrowser Control
 * @param poArgs The reference to the OnBeforeBrowseEventArgs with the data for this callback
 */
method public void BeforeBrowse (poBrowserParent as System.Windows.Forms.Control,
                                 poCefBrowser as ChromiumWebBrowser,
                                 poArgs as OnBeforeBrowseEventArgs):

    if poArgs:Request:Url = "<https://www.dhl.de/de/privatkunden.html":U> then
        poArgs:CancelNavigation = true .

end method .



The poArgs instance provides access to the URL the browser is about to navigate to and allows to set the CancelNavigation property.

The ICefBrowserRequestCallbackService service is used by both the BrowserForm and BrowserControl implementations.

SCL-3832 CefSharp updated to version 107

Description:

We updated the CefSharp library we use to embed the Chromium Browser to Version 107. This includes the latest Chromium Browser engine as well as various bug and security fixes.

SCL-3861 Added new API to determine if a file was passed in via stdin to a batch mode client

Description:

Based on the discussion in https://stackoverflow.com/questions/74564182/how-to-determine-if-a-procedure-was-passed-a-file-to-standard-input-when-run-via we have added a new method to the Consultingwerk.Util.SessionHelper: InputIsRedirected

The method returns TRUE if a Progress session is started with input redirection.

SCL-3893 Added new template for a simple class file to scl-gen

Description:

We have added a new simple class file template to scl-gen. This template can for instance be used from the command-line within VS Code to generate a class.

scl-gen class MyNewClass


SCL-3895 Added OpenEdge 12.7 to ProVersion Enum

Description:

To support our testing efforts for OpenEdge 12.7, we have added OpenEdge 12.7 to ProVersion Enum

SCL-3896 Added OpenEdge 12.7 to Business Entity Designer Configuration

Description:

To support our testing efforts for OpenEdge 12.7, we have added OpenEdge 12.7 to the Business Entity Designer configuration dialog (launcher configuration).

SCL-3900 Implemented support for SecurityKey when rendering dynamic viewer or updatable browser

Description:

The rendering services for dynamic Viewer and Grid instances now assign the viewers or grids Instance Name as the SecurityKey. The SecurityKey of a TableIO target allows to assign toolbar security based on the linked table io target and not just the toolbar item (button) name.

SCL-3901 Implement support for maintaining toolbar items in dynamic forms as security items

Description:

The toolbar security item maintenance now supports maintaining toolbar items in dynamic (rendered) forms based on the name of the dynamic viewer or form as the SecurityKey.

SCL-3904 SmartViewerControl subscribing to CheckStateChanged

Description:

To better support the 3-state UltraCheckEditor the SmartViewerControl is now subscribing to the CheckStateChangedEvent instead of the CheckedChanged event to support changes made by the user. See

https://www.infragistics.com/community/forums/f/ultimate-ui-for-windows-forms/43527/threestate-ultracheckeditor-checkedchanged-event-not-firing

SCL-3905 Implemented optional failing of the GenericDataImporter when importing of data fails

Description:

When the importing of data using the GenericDataImporter failed previously, we have just been logging this to the console when executed from an ANT script (batch mode session). We are now providing the option to fail the build on import errors (e.g. data validation, unique key issues, etc.).

The ImportBusinessEntityData method of the GenericDataImporter now provides an additional LOGICAL parameter that allows to control if errors should be thrown and thus failing the import job. The parameter may be provided through the “ThrowErrors” parameter passed from ANT to the import-data.p procedure:

    <!-- Import SmartDb Data -->
    <macrodef name="importBusinessEntityData">
        <attribute name="BusinessEntity" />
        <attribute name="FileName" />
        <attribute name="SkipFields" />
        <attribute name="SkipExistingRecords" />
        <attribute name="ThrowErrors" />
        <sequential>
            <PCTDynRun
                taskname="SFR-import-data"
                procedure="Consultingwerk/SmartFramework/Tools/Import/import-data.p"
                graphicalMode="false" dlcHome="${dlc}" cpinternal="${cpinternal}" cpColl="${cpcoll}" cpstream="${cpstream}"
                inputchars="32000" token="4000" stackSize="500" msgBufferSize="${Mm}" maximumMemory="65000"
                dirSize="10000" paramFile="performance.pf" quickRequest="true"
                ttBufferSize="10000" >

                <propath>
                    <pathelement path="${installroot}" />
                    <pathelement path="${installroot}/src" />
                    <pathelement path="${installroot}/SmartComponentLibrary.pl" />
                </propath>

                <DBConnectionSet refid="smartdbset" />

                <Parameter name="BusinessEntity" value="@{BusinessEntity}" />
                <Parameter name="FileName" value="@{FileName}" />
                <Parameter name="SkipFields" value="@{SkipFields}" />
                <Parameter name="SkipExistingRecords" value="@{SkipExistingRecords}" />
                <Parameter name="ThrowErrors" value="@{ThrowErrors}" />
            </PCTDynRun>

            <echo/>
        </sequential>
    </macrodef>


SCL-3906 Assigning Name property of Controls Rendered by the SmartDynamicFilterControl

Description:

When rendering the Controls within the SmartDynamicFilterControl we are not assigning the Name property of the filtre controls to the name of the filtered field (ProBindingSource column). This will simplify accessing those controls to modify the value programmatically if needed.

To the Label Control attached to the Control we are assigning the binding source column name suffixed with “_Label”.

New Feature

SCL-3628 Introducing SystemOwned flag to certain tables in the SmartDB database

Description:

We have added a new LOGICAL field to these tables in the SmartDB database:

* SmartAttachmentRole
* SmartCommentRole
* SmartConfigurationValue
* SmartFieldSecurityItem
* SmartGenericTable
* SmartGroup
* SmartLanguage
* SmartLoginCompany
* SmartMessage
* SmartModule
* SmartProduct
* SmartSchedulerJob
* SmartSchedulerJobPlan
* SmartSecurityAssignment
* SmartSecurityObject
* SmartSecurityObjectToken
* SmartSecurityToken
* SmartToolbarSecurityItem
* SmartTranslation
* SmartUiTranslation
* SmartUser
* SmartValueList
* SmartValueListEntry
* SmartWorkflow
* SmartWorkflowActivity
* SmartWorkflowStatus
* SmartWorkflowStatusActivity
* SmartWorkflowSwimlane

Customers can use the SystemOwned flag to filter data relevant to deployments. In addition there is row-level authorization for update and delete associated to those records now. Users need to be authorized for the “SystemOwned” token to be allowed to modify or delete those records.

SCL-3845 ServiceAdapter and SmartBusinessEntityAdapter support for native ABL serialization for save changes parameter objects

Description:

In order to support the use of native ABL serialization of objects (ie classes defined with the SERIALIZABLE keyword in the CLASS statement) for saving Business Entity data, 3 new methods are added to the Consultingwerk.OERA.IServiceAdapter interface and consequently to the Consultingwerk.OERA.ServiceAdapter implementation.

The methods are named SubmitData2 and have similar signatures to the existing SubmitData methods. The major difference is that the parameter object is defined as INPUT poParameter AS Progress.Lang.Object , instead of the input Consultingwerk.ISerializable parameter in the SubmitData methods. The parameter object is returned as a return value for cases where the service returns changed values (either to the existing parameter object, or a new or different parameter object). Note that SubmitData2 returns a different instance of the parameter object to the caller than the one which as passed in. Code that relies on properties of the returned object instance need to access those from the returned reference instead of expecting that the input object gets updated.

The method signatures are below. Note that only those SubmitData methods that take a parameter object as input are overridden.

    /**
     * Purpose: Saves modified (Create, Update, Delete) data to a Business Entity
     * Notes:   It's recommended but not required to just pass a changes dataset
     *          The phContextDataset parameter is intended to be passed by-reference
     * @param pcPartition The name of the AppServer partition for this call or "" for the default partition
     * @param pcEntityName The name of the business entity
     * @param hChangesDataset INPUT-OUTPUT DATASET-HANDLE The dataset with the modifications to the submitted
     * @param pcContext INPUT-OUTPUT The context to be passed to the business entity
     * @param poParameter An optional serializable parameter object to be exchanged with the business entity
     * @param phContextDataset The handle of the context dataset for this call
     * @return The parameter object. May be updated/different from the input object
     */
    method public Progress.Lang.Object SubmitData2 (pcPartition    as character,
                                                    pcEntityName   as character,
                                                    input-output dataset-handle hChangesDataset,
                                                    input-output pcContext      as character,
                                                    poParameter                 as Progress.Lang.Object,
                                                    phContextDataset as handle) .

    /**
     * Purpose: Saves modified (Create, Update, Delete) data to a Business Entity
     * Notes:   It's recommended but not required to just pass a changes dataset
     * @param pcPartition The name of the AppServer partition for this call or "" for the default partition
     * @param pcEntityName The name of the business entity
     * @param hChangesDataset INPUT-OUTPUT DATASET-HANDLE The dataset with the modifications to the submitted
     * @param pcContext INPUT-OUTPUT The context to be passed to the business entity
     * @param poParameter An optional serializable parameter object to be exchanged with the business entity
     * @return The parameter object. May be updated/different from the input object
     */
    method public Progress.Lang.Object SubmitData2 (pcPartition as character,
                                                    pcEntityName as character,
                                                    input-output dataset-handle hChangesDataset,
                                                    input-output pcContext as character,
                                                    poParameter as Progress.Lang.Object) .

    /**
     * Purpose: Saves modified (Create, Update, Delete) data to a Business Entity
     * Notes:   It's recommended but not required to just pass a changes dataset
     * @param pcPartition The name of the AppServer partition for this call or "" for the default partition
     * @param pcEntityName The name of the business entity
     * @param hChangesDataset INPUT-OUTPUT DATASET-HANDLE The dataset with the modifications to the submitted
     * @param poParameter An optional serializable parameter object to be exchanged with the business entity
     * @return The parameter object. May be updated/different from the input object
     */
    method public Progress.Lang.Object SubmitData2 (pcPartition as character,
                                                    pcEntityName as character,
                                                    input-output dataset-handle hChangesDataset,
                                                    poParameter as Progress.Lang.Object).

    /**
     * Purpose: Saves modified (Create, Update, Delete) data to a Business Entity
     * Notes:   It's recommended but not required to just pass a changes dataset
     *          The phContextDataset parameter is intended to be passed by-reference
     * @param pcPartition The name of the AppServer partition for this call or "" for the default partition
     * @param pcEntityName The name of the business entity
     * @param hChangesDataset INPUT-OUTPUT DATASET-HANDLE The dataset with the modifications to the submitted
     * @param poParameter An optional serializable parameter object to be exchanged with the business entity
     * @param phContextDataset The handle of the context dataset for this call
     * @return The parameter object. May be updated/different from the input object
     */
     method public Progress.Lang.Object SubmitData2 (pcPartition      as character,
                                                     pcEntityName     as character,
                                                     input-output dataset-handle hChangesDataset,
                                                     poParameter      as Progress.Lang.Object,
                                                     phContextDataset as handle).



The methods validate that the input parameter objects are either defined as SERIALIZABLE or that they implement Consultingwerk.ISerializable . Parameter objects that are neither will cause a Consultingwerk.OERA.Exceptions.NoSerializableTypeException to be thrown.

A new preprocessor named {{UsePLOforSmartBusinessEntityAdapterSaveChangesParameter}} in Consultingwerk/produits.i

The Consultingwerk.SmartComponents.Implementation.SmartBusinessEntityAdapter optionally changes the datatype of its SaveChangesParameter property from Consultingwerk.ISerializable to Progress.Lang.Object, in order to support ABL-serializable parameter objects. This behaviour is controlled by a new new preprocessor named {{UsePLOforSmartBusinessEntityAdapterSaveChangesParameter}} in Consultingwerk/products.i . If the preprocessor is defined, then the SaveChangesParameter property in the SmartBusinessEntityAdapter, as well as the SaveChangesParameter property in the Consultingwerk.SmartComponents.Implementation.BeforeSubmitChangesToBackendEventArgs class are defined as Progress.Lang.Object. In the absence of this preprocessor, these properties continue to be defined as _Consultingwerk.ISerializable_.

If the SmartBusinessEntityAdapter’s PreferNativeSerialization property is TRUE (the default value) and the is {{UsePLOforSmartBusinessEntityAdapterSaveChangesParameter}} preprocesor defined , then the property value is set to the return value of the call made to the Service Adapter’s SubmitData2 or InvokeTask2 method.

SCL-3851 New Consultingwerk.Util.CodepageHelper method to remove codepage-incompatible characters from a LONGCHAR

Description:

A new static method ConvertToCodepage has been added to the Consultingwerk.Util.CodepageHelper class. This method converts an input {{LONGCHAR}} value into a specified codedpage {{LONGCHAR}} value. Any characters that cannot be converted are skipped from the new value.

SCL-3887 Providing CefSharp as a Browser UserControl

Description:

In addition to the CefSharp based Consultingwerk.Windows.CefBrowser.BrowserForm we’re now also providing the BrowserControl UserControl. The Control provides the following methods to control the browser:

* NavigateTo (URL)
* NavigateBack ()
* NavigateForward ()

and the following properties:

* Title
* Url
* CancelEnabled
* NavigateBackEnabled
* NavigateForwardEnabeld

along with events raised when those properties change.