Skip to main content

2024.1

· 44 min read

The 2024.1 release of the Thinkwise Platform features the introduction of model enrichments. Model enrichments are actions that automate parts of your manual workflows. You can use them to kick-start the work on your application before you start with manual fine-tuning.

We have also enhanced the merging process by introducing reciprocal merging. This allows you to merge a branch to its origin and continue working in the branch without having to manually merge the origin back to the branch. To prevent branches from being archived or deleted, we have introduced branch protection.

For the Universal GUI, we have added support for screen configuration preferences. Users can now, for example, select another screen type, and reorder or hide detail screens. You can read more about this in the Universal GUI release notes in the Thinkwise Community.

This release also includes 10 Community ideas representing 123 votes. One community idea that received many votes requested a double-click task that is bound to a specific column. This enhancement significantly improves the user experience by allowing each column in a grid to start a different process or handle specific data.

tip

Questions or suggestions about the release notes? Let us know in the Thinkwise Community!.

Contents


Upgrade notes

SQL Server and .NET Framework support

The Thinkwise Platform requires SQL Server 2019.

.NET Framework requirements:

ComponentMinimum .NET version
Windows GUI4.7
Web GUI4.7.2
Indicium6.0
Indicium Basic4.7.2

Re-generate model definition

After every platform upgrade, always re-generate the definition of your work model before you start developing it (menu Deployment > Creation > tab Generate definition). This applies changes in the base models to your work model.

Note: if you are using nested base models, re-generate all base models below the highest level before you re-generate the work models.

Breaking

Web GUI end-of-life

breaking Web GUI

In accordance with our lifecycle policy, the Web GUI is no longer supported. The Thinkwise Platform version 2023.3 is the last version to support the Web GUI. For more information, see the blog post on the Thinkwise Community.

tip

The Universal GUI is the Web GUI's successor. It matches the Web GUI's functionality and more.

Processes - Support for task and report display types

breaking Windows GUI

The task and report display types that have been set in the model are now taken into account for the Windows GUI. With the Display type setting, you can now influence how the task or report is available to your user. The following states are supported:

  • Hidden - It is not visible on the screen but can be started with a keyboard shortcut, a double-click task, or a process flow.
  • Overflow - It is only shown in the ribbon menu and the overflow menu, not in the button bar.
  • Normal - The standard behavior that applies to all other cases.

The setting Display type can be found here:

  • For tasks: menu Processes > Tasks > tab Tasks > tab Default/Variants > Table tasks > tab Form > tab Table task > group Model settings
  • For reports: menu Processes > Reports > tab Reports > tab Default/Variants > Table reports > tab Form > tab Table report > group Model settings
Verify the display types

Your applications may show tasks and reports differently after upgrading to 2024.1. Verify the display types for tasks and reports after upgrading.

We have changed the validations accordingly to prevent unneeded validation messages. When the task/report display type is Hidden or Overflow, it will no longer result in a validation message for the following validations:

Validations
  • Table with a report uses a detail screen type without a report component
  • Table with a report uses a main screen type without a report component
  • Table variant with a report uses a detail screen type without a report component
  • Table variant with a report uses a main screen type without a report component
  • Table with a task uses a detail screen type without a task component
  • Table with a task uses a main screen type without a task component
  • Table variant with a task uses a detail screen type without a task component
  • Table variant with a task uses a main screen type without a task component

Business logic - New parameter for default logic

breaking new Universal GUI as of release 2024.1.11

We have added a new parameter to the Default logic concept. It is called @auto_commit, and it enables you to initiate a commit without requiring the user to press Execute in the task pop-up or the Save button in the form. When you set @auto_commit = 1 in the Default logic code, the GUI will execute the commit based on the object to which the Default logic is assigned.

To add this parameter, re-generate and deploy your Default logic.

Check your Default logic

As of this release, a validation is in place to check if your logic already includes a parameter called auto_commit. If that is the case, review your code and rename the parameter.

Model enrichments

Introduction to model enrichments

Model enrichments are actions that automate parts of your manual workflows. They can jump-start the work on your application before you start doing manual fine-tuning.

tip

Use a model enrichment instead of a dynamic model if you do not want your actions to be executed during every generation.

The Software Factory comes with a number of ready-made model enrichments. For more information, see Available model enrichments. We will add more in the future.

In addition, you can build your own enrichments. For example:

  • A subroutine for an API connection that always contains a few standard parameters as well as a few extra that can be added manually.
  • Base tables that always comply with a certain format.
  • Prefilters that are often used in the entire system.
  • Check if values and units are always on the same line; if not, correct that if needed..
  • Formatting name and address details in a consistent way.

Use a model enrichment

The Software Factory comes with a number of ready-made model enrichments. You can find them in the menu Enrichment > Model enrichments. In the execution overview, you will find an instruction or explanation specific for that enrichment.

We will show you how to use the model enrichment Create sample model data with AI. This enrichment swiftly generates a sample data model using AI. It uses the application description that you provide to create a diagram with tables, columns, and references.

  1. Select the enrichment Create sample model data with AI.

    Enrichments list Enrichments list

  2. Execute the task Create enrichment run . The focus changes to the tab Run enrichment.

  3. Add a description of the data model that you want to create. Other enrichments require different input.

  4. Execute the task Generate model updates

  5. Select the model updates you want to execute from the list.

Model updates Model updates

  1. Execute the task Execute model updates .

Once all the updates have been performed, the enrichment run is closed.

If any actions remain open, you will be prompted whether to close the run or to execute additional actions. To continue, you can select and execute all the actions that have not been completed yet. The enrichment run ends when all the actions have been executed or when you end it manually.

You cannot rerun a closed enrichment run. To execute it again, Cancel it in the tab Select enrichment.

Types of model enrichments

MOdel enrichments can be model-driven, data-driven, or AI-powered. Or a combination of those.

A model-driven enrichment will query the model and then create (potential) model updates. It can be used to check, for example, the consistency in your application. You can re-run it on demand.

A data-driven enrichment prompts you for a runtime configuration when you start it. It queries the database to load the information required to present the model updates. Examples of this type of enrichment include generating missing indexes, creating mock data based on table content, and deriving control types and elements from data in the database.

An AI-powered enrichment uses the configured generative AI provider of the Software Factory to retrieve information from a large language model. Examples include generating descriptions, translations, comments, etc.

An AI-powered and a data-driven enrichment

Available model enrichments

The following model enrichments are available in the Software Factory:

GroupNameDescription
Data modelCreate a sample data model with AISwiftly generate a sample data model using AI. The provided application description will be used to create a diagram with tables, columns, and references.
Data modelSuggest unique indexes when the data is uniqueReads all non-primary key columns of tables and suggests a unique index when the data is unique.
FunctionalityTemplate summarizationSummarizes control procedure templates that do not yet have a description. Using AI, the summary will be generated based on the inspected code.
User interfaceTranslate all untranslated objectsUses generative AI to update the translations of untranslated objects.
User interfaceCreate prefilters for checkboxesGenerates prefilters for columns that use a checkbox domain.
User interfaceCreate prefilters for image combo'sGenerates prefilters for every column that uses an image combo domain.
Unit testCreate mock data table from test databaseReads the contents of a given table and converts it into a mock data set that can be used for unit tests.
Universal GUICreate breakpoint screen typesFacilitates the transformation to the Universal GUI by creating breakpoints for specific situations.
Universal GUIDecolorize all SVG icons that contain a black fill colorFacilitates the transformation to the Universal GUI by removing the fill color of icons, making them suitable for dark and light modes.
Universal GUITurn on 'Include the label width' settingFacilitates the transformation to the Universal GUI by enabling the Include the label width setting, making forms look more like Windows GUI forms.
UpcyclerSet controls (EMAIL, CHECKBOX, URL, CALCULATOR)Uses data from the product database and inspects the model to suggest controls to use.
UpcyclerChange Yes or No fields into BIT fieldsReads the contents of all tables and finds true/false data to convert into BIT.
UpcyclerSet Combo controls on foreign keysReads all tables equal to or below the given threshold. Then creates suggestions to change the foreign key lookup control and the default table lookup control to Combo (sorted).
UpcyclerShow row count in grids on first visible columnProvides the user with the number of records in a grid for the first visible column.
UpcyclerSet display column for every tableSets a display column for every table.
UpcyclerInclude every lookup column in combined filterIncludes every column that is a lookup in the combined filter.
UpcyclerSet main screentypes of tablesSets the main screen type to master_detail, hierarchy, or master_detail_vertical based on the number of visible columns.
UpcyclerHide technical primary key fieldsHides primary key columns when they are plain technical numbers without significant value for the user.
UpcyclerSet group labels in forms and gridsProvides structure and groups similar fields using grid group labels and form group labels.
UpcyclerSet column widths in gridsReads all tables that are not empty to determine suitable grid column widths.

Create a model-driven enrichment

You can create your own model enrichments in the menu Enrichment > Model enrichments > tab Maintenance. A model-driven enrichment is the basic process for all types of enrichments.

Follow these steps to create a model enrichment, they apply to all types:

  1. In the tab Form > Enrichment, enter a title and instruction for your enrichment.

  2. Select a group. You can use one of the available groups or create your own using the lookup.

  3. If necessary for your enrichment, add user input parameters in the tab Parameters. The values for these parameters must be provided when using the enrichment. For example, if you create an enrichment that adds a new prefilter, you could include the prefilter name in a parameter. Parameters can have default values. A default query can even fill them. Parameters can be Mandatory and Multiline.

  4. Add a template in the tab Templates. You can use model update parameters in the description of a template. This allows you to see which action is being performed. For example, an enrichment that adds a prefilter to records if they are between a certain start date and end date might have the following description: 'Add prefilter for table @tab_id'.

Example template

This is an enrichment that adds a new prefilter:

-- Create prefilter
insert into tab_prefilter
(
model_id,
branch_id,
tab_id,
tab_prefilter_id,
type_of_prefilter,
insert_user,
insert_date_time,
update_user,
update_date_time
)
values
(
@model_id,
@branch_id,
@tab_id,
@tab_prefilter_id,
0,
dbo.tsf_user(),
sysdatetime(),
dbo.tsf_user(),
sysdatetime()
)
  1. Now, create a model update query in the tab Form > Model update. When you create a new one, an example query is added to the tab Model update.
Example model update query

-- Available variables
-- @model_id - Name of the current model
-- @branch_id - Name of the current branch
-- @enrichment_id - Name of the current enrichment
-- Additional user input variables will also be available

/*
insert into #model_update
(
model_update_id,
template_id,
default_active,
order_no,
parent_model_update_id
)
select
'@enrichment_id',
'@enrichment_id',
1,
10,
null

insert into #model_update_parmtr
(
model_update_id,
parmtr_id,
parmtr_value
)
select
'@enrichment_id',
'TAB',
tab_id
from tab
where model_id = @model_id
and branch_id = @branch_id
and tab_id = 'example'
*/
  • Add the potentially executed updates to the table #model_update.
  • The table #model_update_parmtr contains the parameters that are used by the template.
  • The column parent_model_update_id can be used to set dependencies between model updates. If set, the model update can only be selected when the parent update is also selected. If the parent_model_update_id is set but does not refer to an actual model update, the dependency will be ignored.
  • It is possible to use is_truthy to validate truthy input, such as true, yes, and 1. A value is considered truthy if it is not literally true but is evaluated as true. If you are adding parameters to your enrichments that accept true or false values, use this function to validate the input. It will return 1 for truthy input or 0 otherwise. For example: set @no_yes = is_truthy(@parmtr_value)
tip

You can also use the is_truthy function in any other query running on the Software Factory database, such as the dynamic model and control procedure code.

Where relevant, the screens have unlink generated object and show history tasks. The tab Maintenance has copy and rename tasks for both enrichments and enrichment groups.

Create a data-driven enrichment

A data-driven enrichment follows the same steps as the model-driven enrichment. In addition, to make it a data-driven enrichment, you must mark it as Data-driven in the menu Enrichment > Model enrichments > tab Maintenance > tab Form. This activates the tab Database code. It contains a query field with instructions on how to set up the database query. When constructing this query, you can use generic variables (@model_id, @branch_id, @enrichment_id) and any user variables specific to the enrichment.

The database query allows you to retrieve a temporary table of key-value pairs from the database. The pairs can be raw values, such as table_id as the key and a counter as the value, or a JSON object as the key and a JSON object as the value for more complex use cases.

You can use the key-value pairs in the subsequent AI-powered step or in the step that prepares the model updates. These steps are built with knowledge of the contents of the key-value structure.

Create a data-driven enrichment

Create an AI-powered enrichment

An AI-powered enrichment follows the same steps as the model-driven enrichment. In addition, to make it an AI-powered enrichment, you must mark it as AI-powered in the menu Enrichment > Model enrichments > tab Maintenance. This activates the tab AI completion prompts. It contains a query field with instructions on how to set up the AI query. When constructing this query, you can use generic variables (@model_id, @branch_id, @enrichment_id), in addition to the temporary key-value table retrieved from the database, if applicable.

You can use the AI query to create a temporary table with key-prompt pairs. This query can also access the model. The prompts are then executed using the generative AI provider. The subsequent query that prepares the model updates can use the completions for each key retrieved from the generative AI provider.

Create an AI-powered enrichment

New and changed in the Software Factory

Models - Protected branches

new

In this release, we have introduced branch protection. This prevents branches from being archived or deleted. This feature is particularly useful for managing branches with indefinite lifetimes, such as release branches. Temporary branches, such as feature branches, should retain the ability to be archived or deleted after merging.

note

Deleting a model still results in the removal of all associated branches.

When you upgrade to this release, the branches named MAIN, RELEASE, and DEVELOP are automatically protected. If you use other names for these branches or if you want to protect more branches, you can set the protection yourself: go to the menu Models > Model Overview > tab Branch > tab Form and select the checkbox Protected. You can disable this setting if you want to archive or delete a branch.

A branch is also automatically protected when it is used as an origin for another branch. You can remove its protected status after all of its branches have been deleted.

When a branch is protected, a lock icon is displayed in the Branch diagram, making it easy to identify protected branches.

A branch diagram with protected branches

Models - Reciprocal merging

new

Previously, after merging a branch to its origin, you had to manually merge the origin back to the branch to continue working in the branch. Now, we have integrated this reciprocal merging into the merge process. When you start the merge session, you are given a choice of what to do with the branch after it is merged back into its origin.

In the menu Models > Merging > tab Merging the following options are available when you select the task Create merge session :

  • Keep working in branch, perform reciprocal merge - Select this option to continue working in the branch. Your changes will be merged into the origin, and the origin changes will be merged into your branch. In the future, you can merge into the origin again. If your branch is protected, this is the only option available.
  • Archive branch automatically after merge - Select this option if you have finished working in a branch after the merge. Your changes will be merged back into the origin.
  • Archive branch manually at a later point in time - Select this option if you have finished working in a branch after the merge. Use it only to keep the branch intact for information purposes. You can continue working in the branch, but this is strongly discouraged. The branch requires a merge from the origin before you can merge it back to the origin. Also, there is a chance that some changes made in the origin between the two merge sessions will not be propagated properly to the branch.

If you choose to archive the branch when you create a merge session, you can choose whether or not to actually archive it when you execute the branch.

Keep working in a branch or archive it

When you do a reciprocal merge, the changes from the branch are merged into the origin and vice versa. The two Merge impact overviews show the impact on both the origin and the branch.

Conflict resolution may affect both branches. You can read this in the information that is provided when you select a conflict resolution.

Information about the conflict resolution you selected

Models - Thinkwise base models merged into one base model per RDBMS

change

To reduce the number of base models required for working models, we have merged the BSR, UG, and MODEL INFO base models into the DB base model. For each respective RDBMS, only the DB base model remains, which contains all the necessary objects for creating models and deploying applications.

In short, the changes are as follows:

  • SQLSERVER_BSR, SQLSERVER_UG, SQLSERVER_MODEL_INFO have been merged into SQLSERVER_DB
  • ORACLE_BSR, ORACLE_UG, ORACLE_MODEL_INFO have been merged into ORACLE_DB
  • DB2_BSR, DB2_UG, DB2_MODEL_INFO have been merged into DB2_DB

Models - Thinkwise verification base models moved to the Thinkstore

change

Some base models named verification are not actually base models. They check the data that you want to upgrade to see if the checks and foreign keys can be applied. For this reason, we have moved them to the Thinkstore.

This concerns the following base models:

  • DB2_VERIFICATION
  • ORACLE_VERIFICATION
  • SQLSERVER_VERIFICATION

Models - SMTP email provider authentication

change

The fields User name and Password are no longer mandatory when configuring an SMTP email provider. This change allows you to send emails on an internal server without authentication.

note

In all other cases, we strongly recommend using a password.

You can configure an email provider in the Software Factory, in the menu Models > Models Overview > tab Branches > tab Email providers.

Processes - Cell-based double-click tasks

Community idea new Windows GUI Universal GUI as of release 2024.1.11

A Community idea with many votes requested a double-click task that is tied to a specific column. This enhancement greatly improves the user experience by allowing each column in a grid to start a different process or handle specific data.

To enable this feature, go to the menu User Interface > Subjects > tab Default > tab Links > tab Tasks > group Model settings. Check the Double click on record checkbox to activate the Double click column field. Here, select a column from the table. You can override this column selection in a table variant or leave it blank. This changes the cell-based double-click task to a row-based double-click task in the specific table variant and vice versa.

Processes - Custom screens obsolete

change

The functionality for custom screens (menu Processes > Custom Screens) was no longer used. Therefore, we have removed the menu item and all related screens from the Software Factory.

Process flows - Variant name in Design screen

Community idea change

For some process actions (menu Processes > Process flows/Subflows > tab Process actions) you can select a variant:

  • Open document
  • Start task
  • Start report
  • Generate report

Previously, this variant name was not shown on the Design tab, which could be confusing when using multiple variants for the same object in a process flow. Now, the variant name is also displayed in the diagram.

A process action with a variant

Process flows - New parameters for Email connector

new

In the process action Email Connector, we have introduced three new optional input parameters that were missing compared to the old SMTP connector:

  • From address - The email address to use as the email's sender. If not specified, it defaults to the From address of the specified email provider.
  • From name - The display name of the email sender. If not specified, it defaults to the From name of the specified email provider.
  • Message encoding - Specifies how your email message should be processed. If not specified, the default ASCII encoding will be used.

Process flows - Validation for process step name length

new

We have introduced a new validation to check the length of process step names in process procedures to ensure that they do not exceed the maximum limit of 128 characters. The reason for this is that process procedures that contain steps with longer names cannot be used on a SQL Server database.

If you receive a validation message about this, you should shorten the name.

Process flows - Open document as modal document

Community idea new Universal GUI as of release 2024.1.11

The process action Open document allows you to open a (new) document for a user. We have introduced a new option that allows you to open a document as a modal document. This means that no interaction with the underlying application is possible until the user closes the document. This is similar to the behavior of a task pop-up or export window.

We have renamed the parameter Open as floating document to Open as. We have also renamed the existing options and added a new one:

  • Document (previously: No)
  • Floating window (previously: Yes)
  • Modal document (new)

Open document as modal document

Process flows - New connector: Extract JSON Data

new Indicium

We have introduced a new process action: Extract JSON Data. You can use it to extract specific data from a JSON object without relying on process application logic. This connector is useful in several scenarios:

  • In addition to HTTP connectors and application connectors to extract relevant information from JSON data received from other systems.
  • When processing JSON files or other JSON data used by your application.

Using JSONPath, a query language for JSON, the extracted data can be written directly to a process variable.

Input parameters
  • Input - The JSON value containing the data to be extracted. For example:

    {
    "result": {
    "id": 1,
    "name": "John Doe",
    "email": "john@doe.com"
    },
    "status": {
    "code": 200,
    "message": "OK"
    }
    }

  • JSON Path - The JSONPath expression to load the data. Note that JSONPath is case sensitive. For more information about its syntax and capabilities, see JSONPath. For example, to extract the email: $.result.email

  • Always return JSON array - Optional. Deactivated by default, so single literal results will be unescaped, non-JSON text, and single JSON object results will not have an array wrapper. Multiple matches will always be a JSON array. If the input varies, the JSONPath may result in both single values and multiple values, we recommend setting this to Yes to maintain a consistent response format and avoid problems downstream in the processing chain.

    • Yes extract_json_array_yes
    • No (default) extract_json_array_no
Output parameters
  • Status code: 0 Successful
    -1 Unsuccesful (Unknown)
    -2 Unsuccesful (No input was provided)
    -3 Unsuccesful (No JSON Path was provided)
    -4 Unsuccesful (Input was invalid JSON)
    -5 Unsuccesful (JSONPath was invalid)
  • Output - The extracted literal value, JSON object, or JSON array

Extract JSON Data connector

Data - Word wrap for multiline control

Community idea new Universal GUI

You can now enable word wrap in the grid for a domain using the control Multiline. This feature was already available automatically in the form. Word wrap ensures that text continues on the next line when the right margin is reached.

You can enable this feature in the menu Data > Domain > tab Form > tab Domain > group User Interface.

Word wrap enabled for a Multiline domain

Business logic - Exclude columns from handler logic

Community idea new

You could already let the Software Factory automatically generate the update and insert statements for a handler. However, there may be situations where you do not want to automatically update every column, such as trace columns. For this reason, you can now exclude columns from the default statements.

The new settings can be found in the group Include in default handler statement and can be set separately for insert and update. To edit them, go to the menu User Interface > Subjects > tab Subjects > tab Default/Variants > tab Columns > tab Performance.

You cannot clear the checkbox for the insert handler in the following cases:

  • The column is a primary key
  • The column is a mandatory field without a default value

Note that you must re-generate the handler control procedure after updating the checkbox before the changes become visible.

Verify your dynamic model

This change may break your dynamic model if you use select * into #col from col because these are newly added columns in the table col. Make sure to verify your dynamic model code and add the new columns if needed. To prevent any future mainentance regarding new columns, rewrite the select * into #col from col statement to select the columns needed for the Dynamic model code.

handlers Include or exclude columns in handlers

Business logic - Filter for assigned templates

Community idea change

In the menu Business logic > Functionality > tab Assigning > tab Assigned templates, we have activated the Filter . As a result, you can easily filter on a template assignment or part of a name.

Filter for assigned templates

Quality - AI code review improvements

change

In the 2023.3 Thinkwise Platform release, we introduced the AI code review. We have further improved this feature. Previously, all the results were added to one single comment. Now, each review result gets its own comment. This makes it easier to address specific feedback.

Each result gets its own comment

Quality - Unit test improvement

new

When maintaining a unit test, you may want to view its linked control procedure for extra context or maintenance purposes.

To support this, we have added a new task to the Unit tests screen (menu Quality > Unit tests). It is called Go to control procedure in Functionality and its keyboard shortcut is Alt+C. It opens the object in the Control procedure tab of the Functionality screen. This is only possible if the unit test has a linked control procedure.

Similar tasks are already available on other screens, such as Deploy and Code overview.

note

The task Copy unit test now uses the shortcut Ctrl+Alt+C instead of Alt+C.

Go from the unit test to the control procedure

Quality - Enhancements for mock datasets

change

We have made some improvements to the mock data in unit tests.

The first one is the addition of a new column (Mock data) on the Unit tests screen (menu Quality > Unit tests > tab List). It indicates that the unit test uses mock data. You can use this column to see if a failed unit test uses mock data. A failure could mean that the mock dataset needs maintenance.

Another change is that now, only columns with a default value (query) can use a Fallback value as a column value.

In addition, we have changed some validations for mock datasets. If primary key columns have a default value (query) configured, it is not necessary to include them in a mock dataset. To reflect this, we have changed the code and consequence for two validations:

  • A primary key column is not included in the columns of a mock dataset
  • A primary key column has been marked to use a fallback value in a mock dataset

Note that after the upgrade, some previously successful unit tests can fail if you have situations where the value was '' (empty string) because the inserted record now contains a null value instead of an empty string.

Quality - Change to hiding validation messages

change

Hiding a validation message is now always within the scope of your current branch and will no longer be merged into other branches.

This includes hiding a validation message indefinitely or temporarily (up to a point in time) for a branch. We have updated the task names and tooltips to reflect this change in behavior.

To hide a validation message, go to the menu Quality > Validations > tab Validation > tab Validation messages > task Hide message for this branch .

User interface - Translations

change

The Translation management role already allowed access to the translation features in the Software Factory but did not allow access to the tab Translation objects. We have now made this screen available as well. It gives a translator access to, for example, exporting and importing translation objects and their translations.

The translation screens are available in the menu User interfaces > Translations.

note

Translators are not allowed to create new translation objects.

Deployment - Improved performance when synchronizing

change

We have made some optimizations to improve the performance when synchronizing an extremely large set of variant columns to IAM.

Deployment - Added parameter to automated synchronization script

change

To allow synchronization scripts to be written to an alternate path, we have added the nullable parameter model_vrs_name to the task add_job_to_sync_to_disk.

  • When given a value via the API, the synchronization script will be written to, for example, \\server\base_path\model\model_vrs_name.
  • Without a value, the script is written to ...\branch.

Deployment - Model version extracted for database

change

In the rare event that a model version corresponding to the version rolled out to a database has been deleted, it would be impossible to upgrade the database because the model version could not be extracted. Now, when the model version is read from the database but does not exist in the model, the Software Factory automatically generates a model version based on the extracted model version. This ensures, for example, that smart upgrades work properly.

For more information on smart upgrades, see Generation methods.

Generic - Improved check for unused objects

Community idea new change

The Software Factory provides many features to help identify and manage unused items.

We have made the following changes to clarify that even though an object is no longer used in the model, it may still be used in custom code:

  • All prefilters for detecting unused items have been renamed to Not used in model (instead of Not used). A tooltip provides additional clarification.
  • Existing validations have been renamed to [Object] not used in model (instead of [Object] not used).

We also added a new validation to identify unused messages. It is not active by default. Unlike the other not used in model prefilters, messages are often not used in the model but in template code. However, querying the template code can take a long time and cost a lot of performance. We recommend executing (Run selection) this validation at a convenient moment. For the same reason, we have not added a prefilter for unused messages to the screen Messages.

Validation for an unused message

Generic - Description fields for variants and references

Community idea change

To improve usability and solve some inconsistencies, we have added Description as a field or task parameter in several places.

Descriptions for variants

To provide a clear understanding of the purpose of a variant, we have added a Description field to the following screens:

  • User interface > Subjects > Variants
  • Processes > Tasks > Variants
  • Processes > Reports > Variants

To be able to provide a description while creating a variant, we have added a Description parameter to the following tasks:

  • User interface > Subjects > task Create table variant
  • Processes > Tasks > task Create task variant
  • Processes > Reports > task Create report variant
Descriptions for lookup references

To provide a clear understanding of the purpose of a lookup reference, we have added a Description field to the following screens:

  • Processes > Tasks > Task look-ups
  • Processes > Reports > Report look-ups
Descriptions for references

To be able to provide a description while creating or modifying a reference, we have added a Description parameter to the following tasks:

  • Data > Data model > References > task Create reference
  • Data > Data model > References > task Modify reference
  • Data > Data model > Tables > References (details) > task Create detail reference
  • Data > Data model > Tables > References (details) > task Modify reference
  • Data > Data model > Tables > References (look-ups) > task Create look-up reference
  • Data > Data model > Tables > References (look-ups) > task Modify reference
  • User interface > Subjects > Links > Details > task Create detail reference
  • User interface > Subjects > Links > Look-ups > task Create look-up reference
  • Processes > Tasks > task Create look-up reference
  • Processes > Tasks > Task look-ups > task Create reference
  • Processes > Tasks > Task look-ups > task Modify reference
  • Processes > Reports > task Create look-up reference
  • Processes > Reports > Report look-ups > task Create reference
  • Processes > Reports > Report look-ups > task Modify reference

Fixed in the Software Factory

Objects in active conflicts

When examining active conflicts, certain objects lacked a proper object description and displayed an empty string instead. This issue was only observed with objects associated with validation messages, such as "approved" or "assigned". Now, the last column containing data is displayed, and empty strings are no longer included.

Role rights for menu items retained

When trying to change a menu group, an error could occur due to existing role rights, preventing the group from being changed. Now, these role rights are preserved when changing a menu group. They are automatically applied to the new group/item combination.

Error when adding parameters for a unit test

If you had a table task or table report with the same name as a column in that table, you would get an error (due to primary key violation) when adding parameters to a unit test for this table. This has been fixed.

New and changed in the Intelligent Application Manager

Performance - Optimized user interface views

change Universal GUI

When launching an end product created with the Thinkwise Platform, the model is loaded using interface views. For the Universal GUI, we have optimized the loading performance for large sets of these views. This significantly improves the model loading time for larger applications.

Users - Migration of classic user preferences

new Universal GUI

Our user interfaces used to have different types of user preferences that were configured per exact navigation location in the UI, per path. For example, sorting invoice lines under Customer > Invoices > Invoice lines would not be shared with Invoices > Invoice lines. On the other hand, user-defined prefilters and cube views would be shared for all occurrences of a subject in the UI and across all occurrences of variants of a subject in the UI. Because of that, the user-defined prefilter Pending invoices (created in the table Invoice) would also appear in the Paid invoices variant of the Invoice table.

This behavior will remain as-is for the previous generation user interfaces. However, user preferences for user interfaces that use Indicium (at the moment, the Universal GUI) are moving away from path-based user preferences to user preferences per model object or model object variant. This results in user preferences being shared among all occurrences of a subject in the UI. User-defined prefilters and user-defined cube views are stored per model object or model object variant and are no longer automatically shared across all variants.

Migration of classic user preferences

A one-time migration of the classic structure to the new structure will be performed automatically during the IAM upgrade.

A main administrator can repeat this migration process later if you are still using a previous-generation UI. The task for re-migration is available in two places:

  • menu Advanced: Administration > Re-migrate user preferences - In the popup, the re-migration can be limited to a tenant, user, or user group, and to a model, branch, and application.
  • menu Authorization > Applications/Users/User groups - Quickly select a set of applications, users, or user groups to re-migrate.
warning

Any previously migrated (or created) path-based user preferences for the chosen users will be removed to make room for the migration of model-based user preferences.

Note that classic, path-based user preferences cannot always be migrated 1-to-1 to the new structure. If a conflict occurs, the migration will choose the most relevant path, favoring user preferences configured for more accessible paths over nested paths that are deeper in detail and lookup structures.

Re-migrate User Preferences Re-migrate User Preferences

Both the new user preferences data as well as the classic user preferences data can be found in the menu Authorization > Users > User Preferences.

User Preferences data Location of the user preferences data

Users - Improved prefilters for active and inactive users

change

The prefilters showing active active users or inactive inactive users users did not consider the fields Begins on and Ends on. We have improved these prefilters so that a user is now considered inactive if the Begins on date has not yet arrived or if the Ends on date has passed.

Users - Expanded rights for user administrators

change

We have expanded the rights for users with the role User administrator. In the menu Authorization > Users > tab Form, they are now authorized to add or change:

  • The password expiration policy if change is allowed (in the group Password)

    Password expiration policy

  • The option to allow fallback to email (when the Login verification is Password and TOTP token > field Allow fallback to email)

    Allow fallback to email

  • The option to select an identity provider for OpenID (when the Authentication is External > field Identity provider)

    Identity provider

Generic - No granted rights to Public role

Community idea

The Intelligent Application Manager now deploys without assigning rights to the Public role, a default SQL Server role. This change ensures that data and objects in the IAM database remain inaccessible during the upgrade and can only be accessed by users with a SQL Server role that grants sufficient rights after the upgrade. Any previously granted rights to the Public role are automatically revoked during the upgrade to version 2024.1.

Fixed in the Intelligent Application Manager

Accurate access type display in effective rights overviews

Application administrators will now see the accurate access type for Column rights, Task parameter rights, and Report parameter rights in the following locations:

  • menu Authorization > Users > tab Effective user rights
  • menu Authorization > User groups > tab Effective group rights

Previously, in certain cases where users were granted access to columns or parameters through different roles with different access levels, the access type was displayed incorrectly.

Note that the visual error in this overview did not affect the actual effective user- and user group rights granted to the API, UI, and database roles.

Clarified authentication precedence for email address

Universal GUI

A user can log in to the Thinkwise Platform using their user ID or registered email address. The same email address may exist for two user accounts, once as a user ID and once as an email address. When such an email address was verified during authentication, the Thinkwise Platform would verify the authentication credentials against either one of these user accounts.

To make this more deterministic, the Thinkwise Platform now always prefers the user ID over the email address. If the user logs in with an email address, the Thinkwise Platform will select the user account that matches based on the user ID over the user account that matches based on the email address.

Application claims for tenants

It was not possible to delete a tenant because of related application claims. To preserve the history of application claims, they can now exist without a valid tenant.

Data model changes

Data model changes for the Software Factory and IAM meta-models are listed here. This overview can be used as a reference to fix dynamic control procedures, dynamic model code or custom validations after an upgrade.

Changes Software Factory

Table changes

Changes
SF - From tableSF - To table
-enrichment
-enrichment_grp
-enrichment_parmtr
-enrichment_run
-enrichment_run_ai_data
-enrichment_run_db_data
-enrichment_run_log
-enrichment_run_parmtr
-enrichment_template
-model_update
-model_update_parmtr
process-
process_tag-
role_process-

Column changes

Changes
SF - From tableSF - From columnSF - To tableSF - To columnMandatoryDefault value
branch-branchprotected10
col-colinput_insert_handler11
col-colinput_update_handler11
delta_action-delta_actionreciprocal_apply0-
dom-domword_wrap10
list_bar_itemprocess_idlist_bar_item---
merge_conflict-merge_conflictmerge_delta_type0-
merge_conflict-merge_conflictmerge_delta_action_id0-
merge_sessionarchive_branchmerge_session---
merge_session-merge_sessionmerge_strategy00
modelnotification_email_addressmodel---
module_itemprocess_idmodule_item---
process_actionauto_commitprocess_actionauto_confirm10
report_ref-report_refref_description0-
report_variant-report_variantreport_variant_description0-
tab_task-tab_taskgrid_double_click_col_id0-
tab_variant-tab_varianttab_variant_description0-
tab_variant_task-tab_variant_taskapply_grid_double_click_col10
tab_variant_task-tab_variant_taskgrid_double_click_col_id0-
task_ref-task_refref_description0-
task_variant-task_varianttask_variant_description0-
test_caseprocess_idtest_case---
tileprocess_idtile---

Changes Intelligent Application Manager

Table changes

Changes
IAM - From tableIAM - To table
-usr_pref_col
-usr_pref_cube_view
-usr_pref_cube_view_constant_line
-usr_pref_cube_view_field
-usr_pref_cube_view_field_conditional_layout
-usr_pref_cube_view_field_filter
-usr_pref_cube_view_field_total
-usr_pref_model_tab_prefilter_status
-usr_pref_model_tab_variant_prefilter_status
-usr_pref_tab
-usr_pref_tab_cube
-usr_pref_tab_detail
-usr_pref_tab_prefilter
-usr_pref_tab_prefilter_col
-usr_pref_tab_variant
-usr_pref_tab_variant_col
-usr_pref_tab_variant_cube
-usr_pref_tab_variant_detail
-usr_pref_tab_variant_prefilter
-usr_pref_tab_variant_prefilter_col
-usr_pref_variant_cube_view
-usr_pref_variant_cube_view_constant_line
-usr_pref_variant_cube_view_field
-usr_pref_variant_cube_view_field_conditional_layout
-usr_pref_variant_cube_view_field_filter
-usr_pref_variant_cube_view_field_total
process-
role_process-
usr_grp_pref_tab_prefilter_statususr_grp_pref_path_tab_prefilter_status
usr_pref_colusr_pref_path_col
usr_pref_cubeusr_pref_classic_cube
usr_pref_cube_viewusr_pref_classic_cube_view
usr_pref_cube_view_constant_lineusr_pref_classic_cube_view_constant_line
usr_pref_cube_view_fieldusr_pref_classic_cube_view_field
usr_pref_cube_view_field_conditional_layoutusr_pref_classic_cube_view_field_conditional_layout
usr_pref_cube_view_field_filterusr_pref_classic_cube_view_field_filter
usr_pref_cube_view_field_totalusr_pref_classic_cube_view_field_total
usr_pref_model_tab_prefilter_statususr_pref_path_model_tab_prefilter_status
usr_pref_refusr_pref_path_ref
usr_pref_screen_componentusr_pref_path_screen_component
usr_pref_tabusr_pref_path_tab
usr_pref_tab_prefilterusr_pref_classic_tab_prefilter
usr_pref_tab_prefilter_colusr_pref_classic_tab_prefilter_col
usr_pref_tab_prefilter_statususr_pref_path_tab_prefilter_status
write_back_up_typewrite_back_usr_pref_type

Column changes

Changes
IAM - From tableIAM - From columnIAM - To tableIAM - To columnMandatoryDefault value
col-colword_wrap0-
gui_appl_pref_colpathgui_appl_pref_col---
gui_appl_pref_report_parmtrpathgui_appl_pref_report_parmtr---
gui_appl_pref_task_parmtrpathgui_appl_pref_task_parmtr---
list_bar_itemprocess_calllist_bar_item---
list_bar_itemprocess_idlist_bar_item---
module_itemprocess_idmodule_item---
module_itemprocess_callmodule_item---
process_actionauto_commitprocess_actionauto_confirm10
tab_task-tab_taskgrid_double_click_col_id0-
tab_variant_task-tab_variant_taskgrid_double_click_col_id0-
tileprocess_idtile---
tileprocess_calltile---
usr_generalwrite_back_up_type_idusr_generalwrite_back_usr_pref_type_id11