Release Notes 2026-05-26
Version Information
OpenEdge Release | Version Information |
|---|
OpenEdge Release | Version Information |
|---|---|
11.7.21, 12.2.19, 12.8.9, 12.8.11, 13.0.0 | Release 11.7 #89208@2026-05-26 |
Retirement of OpenEdge 11.7
OpenEdge 11.7 has been retired by Progress Software on April 1st 2025. In consequence we urge all customers still using OpenEdge 11 to upgrade to OpenEdge 12.2 or 12.8 as soon as possible.
We are intending to drop the official support of the SmartComponent Library for OpenEdge 11.7 during the second half of the year 2025. We will then no longer ensure that new features of the framework will be usable with OpenEdge 11.7
Customers that are concerned by this intention, should reach out to us as soon as possible, so that we can discuss about a solution.
OpenEdge 13.0 support!
We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 13.0. We hereby declare OpenEdge 13.0 fully supported for the SmartComponent Library as of the release of February 15th 2026.
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.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.
PASOE / OEMANAGER VS Code Extension
Our first VS Code extension is available in the VS Code marketplace: https://marketplace.visualstudio.com/items?itemName=ConsultingwerkApplicationModernizationSolutionsLtd.oemanager
The extension supports developers with PASOE related routine tasks during development:
checking agent or session status
trimming the PASOE agents
restarting a new agent vai the ping request
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.
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:
|
|---|
|
|---|
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" |
|---|
"DefaultAuthenticationDomain": "consultingwerk" |
|---|
This is required as the Hydrid Realm Interface from Progress does not provide the domain name to the authentication method.
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
Inner join support added for ProDataSet fill operations
Inner-join support for ProDataset fill operations
A new UseInnerJoins property is available on Consultingwerk.OERA.IFetchDataRequest (and on the FetchDataRequest / FetchDataAccessRequest implementations). When set to TRUE, the DataAccess:FetchData call switches to an inner-join data-source path that fills the ProDataset's temp-tables with strict inner-join semantics across the dataset's relations.
Usage
DEFINE VARIABLE oRequest AS Consultingwerk.OERA.FetchDataRequest NO-UNDO.
ASSIGN oRequest = NEW Consultingwerk.OERA.FetchDataRequest
("eCustomer,eOrder,eOrderLine":U,
/* per-table filters, CHR(1) delimited */
"Customer.Country = 'USA'":U
+ CHR(1) +
/* eOrder filter (empty when no filter on this level) */
"":U
+ CHR(1) +
/* eOrderLine filter */
"OrderLine.Itemnum = 5":U) .
ASSIGN oRequest:UseInnerJoins = TRUE .
entity:FetchData (oRequest, OUTPUT DATASET dsCustomerOrder BY-REFERENCE) .Passing filters for child and grand-child tables
The Queries property of IFetchDataRequest carries a CHR(1)-delimited list of WHERE expressions, one entry per temp-table in the order declared by the dataset. The entries reference the source-buffer fields of each level (e.g. Customer.Country = 'USA', OrderLine.Itemnum = 5).
When UseInnerJoins = TRUE, the framework validates that the Business Entity has more than one temp-table, that Queries has more than one CHR(1)-delimited entry, and that at least one entry beyond the first is non-empty (i.e. at least one child / grand-child filter is supplied). A Consultingwerk.Exceptions.InvalidParameterValueException is thrown otherwise.
Parent table filtered by child / grand-child predicates
With UseInnerJoins = TRUE the top-level temp-table is populated only with rows that have at least one matching descendant satisfying the deeper filters. For example, with the filters shown above, only customers from the USA who have at least one order containing an order-line with Itemnum = 5 end up in eCustomer. The descendant levels (eOrder, eOrderLine) are likewise pruned to those rows reachable through the inner-join chain.
For the top-level fill the framework pivots the data-source query so the outer iteration is driven by the deepest filtered level (most selective predicate) and walks the relation chain back up to the top temp-table via FIRST joins on the source-buffer foreign keys. Descendant fills inherit the parent's current-row context through the dataset's data-relation so each cascade step matches only the parent's children.
Index optimisation via foreign-key indexes
When a child or grand-child fill has both a relation-foreign-key predicate and an additional user filter, the OpenEdge optimiser may otherwise pick an index alphabetically and miss the foreign-key index. The framework now inspects each child temp-table's relation foreign-key fields via BUFFER:INDEX-INFORMATION and forces the matching FK index via a USE-INDEX hint in the prepared query, ensuring the cascade walks the relation index rather than an unrelated filter index. The outer-most table in the pivoted query carries no USE-INDEX hint so the optimiser can pick the natural index for the most selective predicate.
Custom property sheets supported in the Object Master and Object Instance Attributes editors
Added a new Custom Property Sheet toolbar button to ObjectMasterAttributesUserControl and ObjectInstanceAttributesUserControl. When the current object master or instance defines a CustomPropertySheetDesktop attribute (a fully-qualified GUI for .NET class name implementing the new ICustomPropertySheetDialog interface), the configured dialog is instantiated via DYNAMIC-NEW and launched modally; it can edit the live attribute values temp-table in place. Reference property sheets MetaBusinessEntityLookupPropertySheet, MetaDataSourcePropertySheet and MetaBusinessEntityComboBoxPropertySheet are provided in the Consultingwerk.Windows.Framework.Repository.PropertySheets namespace.
Authorization for workflow status transitions via the new SWF Smart Workflow Status Activities security realm
Added a new security realm SWF: Smart Workflow Status Activities backed by Consultingwerk.SmartFramework.Workflow.WorkflowSecurityRealmService. Security items are sourced from WorkflowBusinessEntity activities and keyed by the workflow activity GUID. WorkflowEngine:PerformDefaultWorkflowStatusActivity and WorkflowEngine:ValidateStatusTransition now consult ISecurityService and raise WorkflowActivityNotAuthorizedException (an IHttp403Exception) when the user is not authorized to perform the activity. The SmartSecurityRealm record that registers the realm has to be created manually by the customer.
SplitContainer instances in a MetaControlGroup now persist the splitter position in the user profile
SplitContainer controls hosted inside a MetaControlGroup now store and restore their splitter position via the user profile, matching the behavior already available for SplitContainer controls placed directly on a Form.
RestServerSessionActivator now supports authentication without a login company
The RestServerSessionActivator has been enhanced to support user authentication when no login company (domain) is provided. When a Client Principal is issued without a domain name and only a single matching user exists in the SmartDB, that user is now automatically assumed during session initialization. This simplifies authentication scenarios in deployments where companies are not used or where the login is unique across the SmartDB. No changes required in customer code.
New LaunchFormUiAction plus FormClosing and FormClosed SSEH events for server-driven form launches
Added a new LaunchFormUiAction (form name, modal flag, optional FormParameter as JsonObject or ParameterObject) that any server-side event handler can return; the front end launches the form via SmartFormFactory, integrating with the new modal form API. Two new SSEH events FormClosing and FormClosed are now supported on SmartWindowForm, and EventHandlerParameter carries DialogResult (Consultingwerk Enum), FormParameter and the FormResponse introduced in SCL-5256. The Angular EventDispatcherService accepts these three properties from the client.
New CloseFormUiAction allows server-side event handlers to close the current form
Added a new CloseFormUiAction in the CommonUi package that can be returned by any server-side event handler to close the current form. For non-modal forms the action is always processed last in the UiControl response (navigating to the home route for non-MDI windows); for modal forms the FormResult (JSON, returned to the caller) and the DialogResult (per the DialogResultEnum) can be set on the action.
SmartDB Management Web Application can now display JIRA ticket title and status
The SmartDB Management Web Application can now optionally call into JIRA to display the ticket title and status next to each detected ticket reference. The feature is configurable via the JIRA base URL and an API key; when a customer does not opt in, the additional columns are hidden so installations that do not use JIRA are unaffected. The product documentation has been updated to describe the new configuration options.
SmartDB Manager now terminates automatically when the last browser tab is closed
The SmartDB Manager Node.js process now shuts down cleanly when the user closes the last browser tab or window hosting its UI, removing the need to kill the process manually. A WebSocket lifecycle with a ping/pong heartbeat tracks open clients, survives page reloads and short network interruptions via a brief grace timer, and exits the process within roughly 10 seconds when no client remains. Opening multiple tabs is supported — shutdown fires only when the last tab is gone — and the existing SIGINT/SIGTERM handlers continue to terminate the process immediately. No changes required in customer code.
Added: Export and import repository data buttons in the SmartDB Management Web Application
The SmartDB Management Web Application now provides buttons to invoke the export-repository-data and import-repository-data scripts directly from the UI. Script locations are configurable through the SmartDB Manager configuration so installations with varying script paths are supported. Script output is streamed live to the UI over the existing WebSocket connection, and the final exit code is displayed once execution completes so developers can immediately see success or failure. Safeguards prevent concurrent runs and require confirmation before an import to avoid accidental data loss.
Moved IHasTabDataSourceCount interface to Consultingwerk.SmartComponents.Interfaces namespace
The interface IHasTabDataSourceCount has been moved from Consultingwerk.Windows.Framework.Repository.Rendering to Consultingwerk.SmartComponents.Interfaces. This resolves compile errors on SmartWindowForm in slim deployments that exclude Consultingwerk.Windows.Framework. Customers must manually delete the old interface files (IHasTabDataSourceCount.cls and .r) from their local working copy and update any fully-qualified references to use the new namespace, or rely on 'using Consultingwerk.SmartComponents.Interfaces.* from propath.'. A full rebuild (clean + build-all) is recommended after updating.
Fixed: Recently launched forms in MainMenu ExplorerBar are now stored and restored from the user profile again
Fixed a regression where the MainMenu ExplorerBar Recent group entries were no longer persisted to the user profile (Windows Registry) via the SettingsService Menu Function LRU key. Recently launched menu functions are now correctly written on use and restored on the next application start. No changes required in customer code.
Fixed: Static Names Generator no longer removes static name references when r-code is missing but the .cls source still exists
Fixed the Static Names Generator (Consultingwerk/Studio/StaticNamesGenerator/scl-sng-generator.p) so that during regeneration it now also considers the existing static names class source code and the presence of the corresponding .cls source file before removing a name. Adding new names still relies on r-code (to verify the IBusinessService interface), but existing entries are preserved when their source file is still present even without r-code. No changes required in customer code.
Resolved 69 SonarQube VariableOverflow lint issues by using DataTypeHelper conversion methods
Replaced 69 risky implicit data-type conversions across the SmartComponent Library with the appropriate methods on the Consultingwerk.Util.DataTypeHelper class (LongcharToCharacter, DecimalToInteger, Int64ToInteger). One INTEGER() to INT64 assignment was changed to use INT64() instead. This eliminates potential runtime overflow and 32kb truncation risks reported by SonarQube under rule eu.rssw.antlr.proparse.checks.VariableOverflow. No changes required in customer code.
Fixed: Multiple stored views for the same ProfileKey can now be saved without an 'eSmartUserProfile already exists' error
Aligned the eSmartUserProfile temp-table index OwnerProfileTypeKey (OwnerGuid, ProfileType, ProfileKey) with the non-unique definition of the underlying SmartUserProfile database table, removing the unique constraint that caused errors 132 and 11878 when storing a second SmartDataBrowserView for the same ProfileKey on both desktop and web clients. No changes required in customer code.
New Business Entity Designer plug-in sorts and aligns USING statements in generated files
Added a desktop plug-in FormatUsingPlugin and a server plug-in FormatUsingServerPlugin (sharing an abstract base class with the formatting logic) that subscribe to the Business Entity generator's Write File event. After a file is written, the plug-ins ensure the USING statements at the top of the file are alphabetically sorted and their 'from <propath>.' phrases are vertically aligned, fixing the file in place if necessary. Both variants are registered in the Business Entity Designer settings XML file.
Fixed: Swagger generation no longer raises SysError 3135 for Business Tasks that publish REST methods
Fixed a SysError 'Invalid handle (3135)' in SwaggerHelper:GetBusinessEntityDescriptor that occurred when SwaggerRestEntitiesGenerator:ProcessBusinessTasks processed a class inheriting from Consultingwerk.OERA.BusinessTask (which implements ISupportsRestMethods but is not a Business Entity). Consultingwerk.OERA.ServiceInterface:InvokeMethod now guards the call to oBusinessEntity:GetClass() with a valid-object check, so Swagger / OpenAPI document generation completes for Business Tasks that expose @RestMethod endpoints. No changes required in customer code.
OwnerType property added to the StoredViews response so the front end can distinguish user-owned and group-owned views
The GET /Entities/SmartFramework/UserProfiles/StoredViews response now includes an OwnerType property with the value 'User' or 'Group' for each saved view. The front end can use this to pick the appropriate icon (for example fa-solid fa-user vs. fa-solid fa-user-group) without hard-coding icon information in the backend. Scope: SmartFramework, UserProfiles/StoredViews endpoint and Business Entity.
New SmartFormFactory:LaunchModalForm method standardizes returning data from modal forms
Added a new public static method LaunchModalForm to SmartFormFactory that displays static GUI for .NET and repository-based forms modally via ShowDialog and accepts a poFormParameter (JsonObject or ParameterObject). BaseForm exposes a new SetFormResponse method together with a read-only FormResponse property. LaunchModalForm returns a new FormResult instance (located in the same package as BaseForm) carrying the FormParameter, the form response and the DialogResultEnum value derived from the .NET DialogResult.
FormParameter from a launched form is now forwarded to all SSEH invocations originating in that form
When a form is launched with a FormParameter (e.g. via the new LaunchFormUiAction), the form retains the parameter for its entire lifetime, and every server-side event handler call triggered from the form or from any contained control (SmartDataViewer, SmartDataGrid, SmartToolbar, SmartBusinessEntityAdapter, ...) now includes the FormParameter in the payload. The backend SSEH dispatching/handling infrastructure exposes the FormParameter to event handler implementations so they can use the calling context for their decisions.
Repository rendering of MetaForms now supports the FormClosing and FormClosed events (Angular and GUI for .NET)
Extended Repository rendering of MetaForms so that the new FormClosing and FormClosed form lifecycle events are wired up and dispatched at runtime by both the Angular MetaForm renderer and the GUI for .NET MetaForm renderer, including invocation of any configured server-side event handlers.
JsonHelper:AddSetPropertyValue now offers overloads for all common ABL data types
Added new overloads of Consultingwerk.Util.JsonHelper:AddSetPropertyValue for the ABL data types integer, int64, decimal, date, datetime, datetime-tz and logical. Each overload follows the existing character variant: it asserts the JsonObject and property name, then either Adds the property to the JsonObject or Sets it depending on whether the property already exists.
Fixed: INewFieldHandler:HandleNewField now receives the temp-table field name in all call sites
Fixed an inconsistency in BusinessEntityDatasetController:InitializeExistingField that passed the database field name to INewFieldHandler:HandleNewField instead of the temp-table field name, causing handlers that locate eField by FieldName (such as SampleNewFieldHandler) to raise 'eField record not on file' (138) when a single field was dropped onto an existing temp-table. The method now passes the temp-table field name, aligning with the other call sites in the class. No changes required in customer code.
SSEH events now carry a FormContext property between SmartWindowForm and the backend
All server-side event handler events now support a FormContext state property on SmartWindowForm (typically a JsonObject or JsonSerializable). The value is sent to the backend in EventHandlerParameter, and the front end can receive an updated or replaced FormContext from the backend via the UiControl response. The Angular EventDispatcherService supports the same flow.
New SSEH event ModalFormClosed invoked on the parent form when a modal form returns
Added a new server-side event handler ModalFormClosed that is invoked on the parent form whenever a modal form launched via SmartFormFactory:LaunchModalForm closes. The FormResult of the modal form is passed to the backend SSEH, allowing the parent form's backend logic to react to the outcome of the modal interaction.
Event-specific interfaces added for EventHandlerParameter to clarify which properties apply per server-side event
Introduced individual interfaces in the CommonUi package (such as IClickEventHandlerParameter and IFormClosingEventHandlerParameter) that expose only the properties of EventHandlerParameter actually populated by the front end when raising the corresponding server-side event. EventHandlerParameter implements all of these interfaces, so SSEH backend methods can declare their parameter as the relevant interface type and rely on an IDE-discoverable contract for the properties available for that event.
Smart attachment binary data can now be exported and imported via the generic data exporter
The generic data exporter and importer have been extended to include the actual binary content of Smart attachments alongside the attachment records. Attachments now survive an export/import round-trip and are preserved by the versioning strategy, where previously only the raw attachment metadata records were exported and the binary content was lost.
BatchGenerator: Additional fields can now map a database field to a custom temp-table field name
Extended the Business Entity Designer's BatchGenerator AddAdditionalFields parsing to support the new syntax <temptablefieldname>=<databasetable>.<dbfieldname> alongside the existing <databasetable>.<dbfieldname> format. Mixed lists are supported. When the new form is used, the supplied name is passed through CreateField and assigned to eField:FieldName; otherwise existing behavior is preserved.
McpServiceLoader services file is now configurable via the McpServicesFiles static property
Added a new static property McpServicesFiles on Consultingwerk.SmartFrameworkMcpServer.McpServiceLoader, allowing callers to configure which services XML file(s) are loaded without modifying the class. McpServiceLoader:LoadServices now uses ServiceLoader:LoadFromFiles, so multiple comma-separated XML files can be specified — for example to load custom services alongside the defaults via McpServiceLoader:McpServicesFiles = McpServiceLoader:McpServicesFiles + ',MyPlugins/services.xml'.
Fixed: Repository Object Master Designer no longer raises a query preparation error when the search is cancelled
Fixed a runtime error in the Repository Object Master Designer that occurred when the user cancelled the initial search, originating in ObjectMasterDataAccess:InsertToDataSourceQuery via the CountRecordsBusinessTask. The designer now opens cleanly when the search dialog is cancelled. No changes required in customer code.
MCP server: Optional temp-table name parameter added to create-businessentity.p and add-temptable.p
Added an optional temp-table name parameter to the MCP server procedures create-businessentity.p and add-temptable.p. The value is passed through to BatchGenerator via new public method overloads, allowing callers to control the name of the initial or additional temp-table in a generated Business Entity. Existing BatchGenerator signatures remain unchanged; when the parameter is omitted, the default naming behavior is preserved.
Fixed: FormatUsingPlugin now handles generated files with lines longer than 32000 characters
Fixed an issue in AbstractFormatUsingPlugin:FormatUsingStatements that caused regeneration of Business Entities to fail with error 12371 (Attempt to update data exceeding 32000) when a generated source file contained a line longer than 32000 characters. The implementation now streams through the longchar content using index/substring instead of the character-bound entry() function. No changes required in customer code.
Setup: SCL1920 pre/post delta loads now honor the -Donline switch for fully online SmartDB upgrades
The Convert-SCL-1920 target in Setup/setup.xml now honors the -Donline=true switch for both SCL1920/delta_pre.df and SCL1920/delta_post.df delta loads, matching the existing OnlineLoadSchema / OfflineLoadSchema dispatch used by the main LoadSchema target. When running the upgrade with -Donline=true, all three delta load steps (main, pre and post) now perform online schema changes via PCTLoadSchema with onlineChanges=true and callbackClass=rssw.pct.AbstractLoadCallback against a running SmartDB. When run without -Donline (or with -Donline=false), all three steps continue to perform offline schema changes as before. The conversion procedure (Setup/SCL1920/convert.p) between the pre and post delta loads is unaffected, and commitWhenErrors=true continues to apply to the pre/post steps.
update-smartdb-schema.cmd now supports an online switch and detects active SmartDB connections instead of hanging silently
The update-smartdb-schema.cmd script now supports a -Donline=true switch, mirroring Setup/setup.xml. When invoked in online mode, the script routes PCTLoadSchema with onlineChanges=true and callbackClass=rssw.pct.AbstractLoadCallback so schema changes can be applied against a running SmartDB instance. When the online switch is not in effect, the script additionally checks for active SmartDB connections (using the same approach as the init-branch script) and produces a clear, actionable message when the database is in use, instead of buffering indefinitely. Developers can opt into the online flow by passing -Donline=true; otherwise the script verifies the database is free before performing the schema update.
New validation methods IsMandatory and IsMandatoryWhenChanged added to Consultingwerk.OERA.Validate
Two new validation methods have been added to the Consultingwerk.OERA.Validate class. IsMandatory rejects the unknown value (?) for all data types, the empty string for Character and longchar fields, and zero for Integer, Int64 and Decimal fields. IsMandatoryWhenChanged applies the same checks only for newly created rows (ROW-CREATED) or for ROW-MODIFIED rows where the field value differs between the after-buffer and the before-buffer, supporting the 'mandatory for new' use case where existing records may not be cleared but may keep their original empty value. Both methods return error message 108, consistent with the existing IsNotNullOrEmpty method, and a new IsMandatory entry has been added to the ValidationDefaultMessages class.