Versions Compared


  • This line was added.
  • This line was removed.
  • Formatting was changed.


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

Image RemovedImage Added

Announcing the SmartFramework ERD Designer


SCL-2302 java.lang.ArrayIndexOutOfBoundsException when generation a Business Entity


Customers have reported sporadic Proparse related issues when generating or re-generating Business Entities from the Business Entity designer.

As we could not reproduce those issues, we've implemented additional details in the error messages raised by Proparse. A new version of the has been released for this purpose.

Customers are recommended to upgrade to this version.

SCL-2406 Data Field import of existing Business Entity caused X and Y attributes of existing instances to be reset


We have resolved an issue with the CreateDataFields method of the SmartRepositoryService. The issue has caused the X and Y (and other) attributes of existing instances of existing Data Fields to be reset by the import. The issue is fixed now.

SCL-2498 Business Entity method FetchRelatedRecords was hiding original error


Errors thrown from the FetchRelatedRecords method of the Business Entity (such as when the method was called with an empty buffer) were not thrown to the caller due to an issue with attempting to stop the second Business Entity instance. This issue has been fixed now so that the original error of the method call is now thrown to the caller.


SCL-1686 Business Entity Designer: Add capability to regenerate calculated fields


The Business Entity Designer has been enhanced with the ability to regenerate calculated fields in the RetrieveData method of the Business Entity - similar to the ability to regenerate validation code.

The generated calculated fields will be generated within annotations

Code Block


SCL-2479 Implemented support for default column filters in the poFetchDataRequest:Queries


We have implemented support for default column filters in the FetchDataRequest argument of the Data Access FetchData, FetchDataByKeyTable and CountResultRecord methods. The default column filters are references as ANT style variables in the Query String:

* ${LanguageIsocodeend}
* ${LanguageKey}
* ${UserKey}
* ${UserName}
* ${UserFullName}
* ${CurrentWeek}
* ${LastWeek}
* ${CurrentMonth}
* ${LastMonth}
* ${CurrentYear}
* ${LastYear}
* ${Today}
* ${Yesterday}
* ${Tomorrow}

And example query string may look like this:

Code Block
oRequest = NEW FetchDataRequest ("eSmartUser", 'for each eSmartUser where eSmartUser.UserName = "$~{UserName}"') .

We also support date ranges through the default column filters, e.g.

Code Block
oRequest = NEW FetchDataRequest("*", 'for each eOrder where eOrder.CustNum = 1 and eOrder.OrderDate = "$~{LastYear}"') .

will execute the following query:

No Format
for each eOrder where eOrder.CustNum EQ "1" and eOrder.OrderDate >= "1/1/2017" and eOrder.OrderDate <= "31/12/2017"

The actual processing of the variables in the query string is performed by the Consultingwerk.OERA.IProcessFetchDataRequestVariablesQueryWalker service. This service can be overridden. Developers can implement support for additional variables in the query string by overriding this method, e.g. by using a CASE Statement. The OTHERWISE branch of the CASE Statement should call the SUPER method.

Code Block
     * Purpose: Replaces a single variable in a Query Expression
     * Notes:   This method is intended to be overridden for customization purposes.
     *          When the child class has matched a variable name it is not expected
     *          To call super. When this method here receives an unknown variable name,
     *          an error will be thrown
     * @param pcVariableName The name of the varialbe
     * @param poQueryExpression The query expression
    METHOD PROTECTED VOID ProcessVariable (pcVariableName AS CHARACTER,
                                           poQueryExpression AS QueryExpression):


SCL-2491 Added switch to disable deletion of r-code in setup.xml


We've added a new optional switch to the SmartDB upgrade and migration routine ( ) that allows to disable the deletion of r-code when schema changs have been loaded using the script. The new switch is

Code Block
-D delete-rcode="false"


SCL-2493 now part of the ESD deployment


The file containing the C# source code of our .NET assemblies is now part of the deployments on the ESD website.

SCL-2497 Improved performance of Menu Security Maintenance screen


Majority of time spend when opening the menu security maintenance for a large number of users or menu items was spend by rendering the tree node cells and not fetching the data from the backend. This time has been improved (up to 6 times) now, especially by changing the way how images for the tree node cells are handled.

SCL-2504 Included SmartFramework Angular Menu Structure into deployment


As we've started implementing an official Angular application for the maintenance of the SmartFramework data, we are now deploying the Menu Structures for those forms.

New Feature

SCL-2155 Swagger support for invokable method on RESTful resource URI's


The Swagger implementation for the RESTful Business Entities does now also support RESTful methods (

SCL-2274 Support for JSON Configuration file with SmartUnit


The SmartUnit start procedure Consultingwerk/SmartUnit/runtest.p now supports an additional PCTRun parameter: JsonConfigFile

When this parameter is set, the AVM session executing SmartUnit will be initialized using a JSON Configuration file ( ).

SCL-2413 New function to replace an Object Instance in the Repository Object Master Designer


The Repository Object Master Designer now provides a new function which allows the designer to replace an existing object instance with a new master. This function verifies compatibility of existing links and removed instance attributes not applicable to the new object master. Compatible instance attributes (e.g. X and Y) remain.

The functionality can be accessed using a button in the Ribbon.

The functionality is based on an API in the SmartRepositoryService.

SCL-2471 Repository support for Angular Grid virtual scrolling


The Smart Framework Repository does now provide the rowHeight and detailRowHeight attributes required for the virtual scrolling feature of the angular Grid component. To use the virtual scrolling, the scrollable attribute needs to be set to _virtual_.

SCL-2483 Implemented ability ot override ConfigurationProvider with -param parameters


The ConfigurationProvider now supports overriding the contents of the .applicationsettings or .restapplicationsettings JSON file/document using the -param startup parameter of the OpenEdge session.

No Format
The -param parameter is expected to contain value in the form of -param @setting1=value1,@setting2=value2 
 The -param parameter may contain other settings as well. Settings not starting with the @ sign will be ignored by the ConfigurationProvider class. So a startup settings of -param @authenticationDb=sports2000 will override the setting from the JSON file


SCL-2490 Implemented a general purpose ValueObjectCache


The class Consultingwerk.Framework.Base.ValueObjectCache provides caching functionality for value objects. The cache will be initialized using the maximum cache age in seconds. The cache supports storing object instances under a CHARACTER key value and provides methods to retrieve an object from the cache based on the CHARACTER key value and to query if an object is cached.

Code Block
DEFINE VARIABLE oCache AS ValueObjectCache NO-UNDO .

oCache = NEW ValueObjectCache (5) .

oCache:StoreObject ("42", NEW CharacterHolder("Test 42")) .
oCache:StoreObject ("43", NEW CharacterHolder("Test 43")) .

We have also implemented a new scaffolding template to generate strong typed variants of the ValueObjectCache. See for details.

SCL-2496 Method ViewHideColumns() of RenderedBrowseControl is now PUBLIC


The method ViewHideColumn() of the WinKit RenderedBrowseControl is now public. This method allows to synchronize the column width and order in the RenderedBrowseControl with the underlying Progress BROWSE widget. This is useful when the existing application contains functionality to manage the browse view.

SCL-2500 Implemented FetchRepositoryObject authorization


The FetchRepositoryObject method of the SmartRepositoryService does now support authorization. A new Security Realm "SOM" protecting Smart Object Master records has been implemented for this purpose.

SCL-2501 Implemented JSON Export for Angular Form, Viewer and Grid in the Repository Object Master form


The Repository Object Master Maintenance form now supports exporting the Angular JSON definition of a repository layout to a file. The functionality is available using a button in the Ribbon.

SCL-2503 Usability improvements in Security Maintenance Screens


We've implemented a few minor usability improvements in the Security Maintenance screens.


SCL-1926 Upgraded Swagger RESTful and JSDO services to Swagger Version 3


We have upgraded our Swagger implementation for the RESTful and the JSO based interface to version 3 of the Open API specification.

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