Release Notes 2024-02-19

Version Information

OpenEdge Release

Version Information

11.7.17, 12.2, 12.7, 12.8

Release 11.7 #79266@2024-02-19

Security Bulletin - log4j CVE-2021-44228

Further details: log4j CVE-2021-44228

OpenEdge 12.8 support!

We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 12.8. We hereby declare OpenEdge 12.8 fully supported for the SmartComponent Library as of the release of  January 15th 2024.

OpenEdge 12.7 support!

We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 12.7. We hereby declare OpenEdge 12.7 fully supported for the SmartComponent Library as of the release of  May 10th 2023.

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.

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: 

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.

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

We have updated proparse with further enhancements in this release (see Please download the .NET Assemblies ZIP file from our ESD and replace the in your environment with the latest one. The new assembly reference is:

<assembly name=", Version=, Culture=neutral, PublicKeyToken=cda1b098b1034b24"/>

As proparse is used by our Business Entity Generator, this new version of the 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

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=, 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

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

Overview of included tickets


SCL-4313 MemberTableViewerControl of Business Entity Designer now consistently asking to rename before-table


When renaming a temp-table in the Business Entity Designer, the property viewer is now consistently asking if the before table should be renamed as well.

SCL-4379 Resolved potential issue in RestResourceService's GetClassNames method


In situations where the .annotation files have been out of sync with renamed or moved Business Services the RestResourceService GetClassNames method might have failed as it was returning the reference to the previously handled Progress.Lang.Class when checking for the left over .annotation file. This issue is fixed now.

SCL-4381 Dynamic Browsers: FilterRow is no longer scrolling out of view


In some situations the FilterRow of a dynamic SmartDataBrowser (MetaGrid in the repository) was scrolling out of view with the rows of the Grid. This issue is resolved now.


SCL-3719 Dataset Cache Service implemented


The SmartComponent Library supports developer-controlled caching of ProDataSets using the Consultingwerk.SmartFramework.System.SmartCache.ISmartCacheService . Developers may choose to save a dataset in the SmartCacheService, and retrieve it at a later time. Cached datasets persist across AVM sessions and application restarts, and are available until they expire.

For more details, see the

SCL-3873 Implement service interface for listing all known Business Entities for InMyData integration


Implement service interface for InMyData integration in Consultingwerk/OERA/Integrations/InMyData/getDataServiceList.p . This service interface returns a temp-table containing the names of all classes that can be found in the application that implement the Consuiltingwerk.OERA.IBusinessEntity interface. The procedure accepts a username and password for a (typically) system user.

The service interface’s parameters are defined as follow.

define input        parameter pcUserName    as character no-undo.
define input        parameter pcPassword    as character no-undo.

define output parameter table for ttDataServices.

The schema for the ttDataServices temp-table is

define temp-table ttDataServices no-undo
    field ServiceName as character
    index ServiceName is unique primary ServiceName

SCL-3874 Implement service interface for Business Entity schema retrieval for InMyData integration


Implement service interface for InMyData integration in Consultingwerk/OERA/Integrations/InMyData/getDataServiceSchema.p . The service interface takes the name of a Business Entity. The procedure also accepts a username and password for a (typically) system user.

The service interface returns an empty ProDataSet that is the schema for the Business Entity.

The parameters are defined as follows.

define input        parameter pcUserName    as character no-undo.
define input        parameter pcPassword    as character no-undo.

define input  parameter pcEntityName as character no-undo.
define output parameter dataset-handle phDataset .

SCL-3875 Implement service interface for Business Entity data retrieval for InMyData integration


Implement service interface for InMyData integration in Consultingwerk/OERA/Integrations/InMyData/getDataServiceData.p . The service interface takes the name of a Business Entity, a query string and a series of batching/paging paramteters. The query string may be empty. The context value that is returned from a call should be used as an input to a subsequent call, allowing the retrieval of batches of data. The procedure also accepts a username and password for a (typically) system user.

The service interface returns a ProDataSet containing data, and a flag indicating whether there is more data available for the query (ie whether this is the last batch of data).

The parameters are defined as follows.

define input        parameter pcUserName    as character no-undo.
define input        parameter pcPassword    as character no-undo.

define input        parameter pcEntity      as character no-undo.
define input        parameter pcQuery       as character no-undo.
define input        parameter piStopAfter   as integer   no-undo.
define input        parameter piBatchSize   as integer   no-undo.
define input-output parameter pcContext     as character no-undo.
define       output parameter plMoreRecords as logical   no-undo.
define       output parameter dataset-handle phDataSet.

SCL-4277 Single datasets returned from invokable methods may exclude the dataset


If a invokable method is annotated to return only a single ProDataset, the ProDataset name may be excluded from the returned JSON object by adding {{:no-envelope}} to the dataset name in the {{response}} annotation value.

For example {{response="dsCustomer:no-envelope"}} will return properties for the temp-tables only.

This value is ignored for cases where multiple datasets are returned, or when the return value is also returned.

For more information, see

SCL-4292 Implement new IFileUploadService


The Consultingwerk.Web2.Services.FileUpload.IFileUploadService interface and Consultingwerk.Web2.Services.FileUpload.FileUploadService implementation are a service that extracts uploaded files (file names and contents) from an HTTP request.

interface Consultingwerk.Web2.Services.FileUpload.IFileUploadService:
     * Purpose: Parses a request for uploaded file(s) and context
     * Notes:
     * @param poRequest The IWebRequest instance
     * @return The uploaded files and any context
    method public IFileUploadResult ParseFileUpload (poRequest as IWebRequest).
end interface.

The files and context are returned as an implementation of the Consultingwerk.Web2.Services.FileUpload.IFileUploadResult interface.

interface Consultingwerk.Web2.Services.FileUpload.IFileUploadResult:
     * Purpose: Context/identifier about the request used to upload these files.
     * Notes:   Typically <http-method>:<relative-url> ; might be a header value
    define public property Request as character no-undo
     * Purpose: Context about the request used to upload these files.
     * Notes:
    define public property Context as JsonConstruct no-undo
     * Purpose: An array of file names. These may be empty (though not unknown).
     * Notes:
    define public property FileName as character extent no-undo
     * Purpose: An array of MIME types of the files; defaults to application/octet-stream
     * Notes:
    define public property FileType as character extent no-undo
     * Purpose: An array of binary data representing the files.
     * Notes:
    define public property FileData as IMemptrHolder extent no-undo
end interface.

Request format

The files must be uploaded using a PUT or POST request as standard multipart/form-data , with at least one part. This part contains the file being uploaded; the file name must be priovided using a Content-Disposition header with a fileName or fileName* parameter (per [ HTTP/Headers/Content-Disposition | HTTP/Headers/Content-Disposition ]). There may be multiple files uploaded in a single request.; each should have their own part. Filenames are not unique, although duplicate file names should be avoided.

An additional, optional, part contains context for the upload. This part should have a Content-Disposition header with a name=context parameter value. The data in the part must be JSON; the structure and content of this context data is left to the application.

SCL-4327 Implemented support for returning records of a single temp-table only


If a invokable method is annotated to return only a single ProDataset, a single temp-table may be returned from the dataset. The response attribute value will have the form dataset-name:table-name as in the example below.

@RestMethod (address="/Orders/{OrderNum}/GetItemOnly",
@ParameterSchema (datasetname="dsOrder", schemafile="Consultingwerk/SmartComponentsDemo/OERA/Sports2000/dsOrder.xsd").
method public void GetOnlyItems (input-output dataset dsOrder,
                                 poParameter as IntegerHolder):
end method.

The table data will be returned as an array of objects (records) without a table name envelope. If no records are available, an empty JSON array is returned.

This attribute value can be modified to add :first which returns the first record as a JSON object. Again, there is no table name envelope. If there are no records in the table, an empty JSON object is returned.

An attribute value of {{response="dsOrder:eItem:first"}} for the same endpoint would return just the single record.

This value is ignored for cases where multiple datasets are returned, or when the return value is also returned.

For more information, see

SCL-4355 Implement support for rendering the WebClassList property on a Button field into classList JSON setting


The rendering of Buttons for Angular viewers (JSON markup) now supports rendering the WebClassList property from the Repositor yin the to the classList attribute of the JSON markup of the Button component.

SCL-4359 ConfigurationProvider now includes the json filename to an error when a parsing error occurs


When the ConfigurationProvider fails to parse a JSON file, we’re not including the name of that JSON file in the error message for easier analysis of the issues.

The feature is based on a new method ParseFile in the JsonHelper that handles the error accordingly.

SCL-4360 Added flex-group class options in the WebClassList-Values property for viewer fields


We have added the CSS style class names

* group-linked-field - used to mark the group that contains the field as a “flex-group“
* flex-0-field - the field will take only the maximum necessary space to be displayed (ex. the “CHR(3)“ button field)
* flex-1-field - the field will extend in the available space (ex. the “Lookup Values“ text field)
* no-label-bottom-aligned - used for bottom aligning the fields with no label (ex. the “CHR(3)“ button)

to the list of proposed values of the WebClassList property of fields in a MetaViewer.

SCL-4361 Proparse TreeViewForm now opens .p/.cls/.w file when opened in editor


When opening ABL source code in the ProparseTreeViewForm, the tool now also opens the file in an embedded ABL procedure editor.

SCL-4365 BufferDataSource now supporting a local buffer


A BufferDataSource can now be initialized with the handle of an existing database or temp-table buffer. Previously the component was always creating a new dynamic buffer object handle.

SCL-4368 Improved error handling when initializing REST methods


We have improved error handling during the initialization of REST methods. Class files with more or less empty .annotation files are no longer causing issues during the initialization.

And issues during the initialization now log the class name causing the issue in the PASOE log file for simpler analysis.

SCL-4369 StringHelper:SplitText now supports leaving white spaces in the resulting text parts


We have implemented a SplitText2 method which leaves trailing white-space characters (space, line-break, …) in the text segments returned.

SCL-4385 All business services invoked during the startup of a PASOE session are now invoked during the ServiceManager


We have observed a few calls to Business Services invoked during a typical PASOE session startup being made through the Service Adapter - instead of using the Service Manager or directly invoking the Business Service.

This has been fixed now.

SCL-4386 Business Entity Designer now showing work directory in window title


To simplify distinction of multiple running instance of the Business Entity Designer, the tool is now showing the working directory in the Window title.

SCL-4387 When Business Entity Name is changed, Business Entity Designer now prompts developer if other components should be updated


When a developer changes the name of a Business Entity in the Business Entity Designer, the tool now prompts if other components (Data Access class, Dataset, …) should also be renamed to match the new name of the Business Entity.

SCL-4390 SmartPanelController now exposes reference to UltraToolbarController instance


We have added a property named ToolbarsManager to the SmartPanelController class. This property now gives direct access to the UltraToolbarsManager instance within the SmartPanelController.

SCL-4391 DynamicControlGroupLogic and DynamicFormLogic now provide access to SmartPanelController instances


We have added a method GetSmartPanelControllerInstance to the DynamicControlGroupLogic and DynamicFormLogic base classes. This method allows to retrieve a typed reference to a SmartPanelController in a Form.

New Feature

SCL-4307 Implemented RcodeInfo and RcodeInfoHelper classes


The Consultingwerk.Util.RcodeInfo.RcodeInfo class represents an rcode file. It provides a rcode-version-safe mechanism for querying an rcode file’s information. If an invalid file name (i.e. cannot be found on disk) is provided, or the extension of the file is not .r , an exception is thrown from the constructor.

The class has the following properties

* FileName: The rcode file name, as provided to the constructor
* RcodeVersion: The rcode version. Only rcode files with versions from OpenEdge 10.0 and later are supported.
* IsClass: TRUE if the rcode represents a OOABL type. Will always be FALSE for OpenEdge 10 rcode
* CrcValue: The CRC value of the rcode
* SignatureValue; The digest of the rcode, if it exists in the rcode.

The Consultingwerk.Util.RcodeInfoHelper class’s GetRcodeInfo() method provides a means to obtain a RcodeInfo instance for a given file name. The GetRcodeInfo() method takes file names that have a .cls, .r, .w, .p or .r extension.

SCL-4363 Implements StringHelper Method SplitText for splitting long texts


The StringHelper:SplitText method supports splitting a long text into an array of text segments of a given length. The methods intends to find the optimal length for each resulting text line by looking for the right-most text separating character (e.g. space, comma, new-line, etc.).

SCL-4366 Allow Validator implementation to update values shown in the ComplexInputPrompt Dialog


An extension has been implemented to the ComplexInputPrompt Dialog. The Validator instance (when used) can now modify property values of the parameter object and those values will be displayed in the dialog while the dialog is shown.


SCL-4380 StartupParameterAppServerServiceManager now support secondary AppServer connection for async calls


The StartupParameterAppServerServiceManager now supports a second AppServer connection referenced as “async” to support asynchronous calls to the AppServer backend. This second connection is opened using the same connection parameters as the regular AppServer connection intended for synchronous calls.