Skip to main content

2024.3

· 63 min read

The 2024.3 release of the Thinkwise Platform introduces Personal Access Tokens (PATs) as an option to enhance security. PATs are a secure way for users to allow external parties to connect with your application. Some advantages of PATs are that user credentials are not shared, access can be limited to specific resources, and access can be revoked without changing the user's password.

Customized reports are now possible thanks to a new parameter property in the Software Factory and the ability to override the default report file in IAM.

Other highlights in IAM include environment interaction logs (to monitor the configuration of your environment), and security checks (to verify the data accessibility of your application).

We also made quite a number of quality-of-life improvements, including performance enhancements, better merging capabilities, UI/UX updates for unit tests, and new options in code search.

This release includes 16 Community ideas, representing 221 votes.

tip

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

2024.2

· 62 min read

Hello everyone,

This release features the further integration of AI-powered model enrichments in the Software Factory. We have added new generic model enrichments and model enrichments specifically designed for a seamless transition to the Universal GUI. Many of the generic model enrichments have been made available as tasks on the screens where they can be of immediate use. The AI code review has been improved, and is now also available as a task.

An important visual change is that we have restructured the default menu in the Software Factory. It now contains a new menu group, Integration & AI, that allows easy access to screens that were previously only available as a tab in a branch. In IAM, the tabs in the menu item Applications have been restructured as well.

Another new feature in the Software Factory is the columnstore index support. A columnstore index offers substantial data compression, resulting in improved query performance. A powerful use case for columnstore indexes is storing LLM embeddings.

We have also introduced a new process flow connector: Web connection. It is an enhanced and re-usable version of the HTTP connector.

One of the new features in IAM is the support for public OpenID Connect clients in the client apps. This allows two types of clients: confidential and public.

This release includes 9 Community ideas representing 104 votes. For a full overview of all the new features and changes, please read the release notes below.

Thinkwise Platform version 2024.2

Upgrade notes

System requirements

For a full overview, see the System requirements.

  • The Thinkwise Platform requires SQL Server 2019.
  • For AI-powered enrichments, use the latest AI models for the best results. For OpenAI, we recommend GPT 4 or up.
  • .NET Framework requirements:
warning

Indicium now requires .NET 8.0.

ComponentMinimum .NET version
Windows GUI4.7
Indicium8.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

Activate setting for the Windows GUI

Windows GUI

This update introduces the model setting Mimic Windows GUI (classic) for smoke tests. For more information, see Quality - Setting for smoke tests for the Windows GUI.

Activate setting

If you use the Windows GUI, it is necessary to activate this setting.

This check is not necessary if you only use the Universal GUI.

change Windows GUI

The terminology related to ‘filter’, ‘find’, and ‘search’ in the Windows GUI, Software Factory, and IAM has been updated. This change brings about a more logical and consistent use of these terms. An additional advantage is that it facilitates a smoother transition for users moving from the Windows GUI to the Universal GUI.

Inform your users

When you generate your application and synchronize it to IAM, these changes are also applied to your application. Inform your users about the new terminology.

Changes in the Windows GUI

OldNew
Above the menu: Filter (CTRL + Q)Menu search (CTRL + Q)
Above the grid: Filter (CTRL + G)Search (CTRL + G)

Changes in the Software Factory

OldNew
In the menu User interface > Subjects > tab Data:
tab: Combined filterSearch. This includes the underlying column:
column: In combined filterIncl. in search
tab: SearchFind. This includes the underlying columns:
column: Visible in searchVisible in find
column: Search conditionFind condition
column: Search order noFind order no. This includes three tasks:
task: Move search column upMove find column up
task: Move search column downMove find column down
task: Renumber the searchRenumber the find
In the menu User interface > Subjects > tab Settings > tab Permissions > group Data:
checkbox: SearchFind
In the ribbon
Remove filterClear all filters

New translations in the Subjects screen New translations in the Subjects screen

Validations

  • The texts for validations mentioning combined filter have been rewritten to mention search instead.
  • The texts for validations mentioning search have been rewritten to mention find instead.

Changed screen types

change

To enable a smooth transition to the Universal GUI, we have changed the availability of the action bar in some screen types.

Check your model

The following screen types have been changed in the base model SCREEN_TYPES. They no longer have a default action bar:

  • chart
  • chart_horizontal
  • chart_no_field
  • cube
  • cube_horizontal
  • cube_no_fields
  • hierarchy_no_filter
  • master_detail_no_filter
  • pivot_grid
  • pivot_grid_horizontal
  • pivot_grid_no_field

This change impacts your work model after the first definition generation.

'Field in next column' support for the Universal GUI

new Universal GUI

The form- and parameter setting Field in next column now affects the Universal GUI. This change may affect existing configured forms, task- and report pop-ups. You can find this setting in the Software Factory in the menu User interface > Subjects > tab Default/Variants > tab Components > tab Form.

The setting Field in next column moves an existing group to a new form column, but only if available form columns exist. Availability depends on the horizontal width and other settings, such as the maximum number of form columns. If the field cannot move to a new column, there will be no visual indication that the group is separated.

A form field that is marked with Field in next column will act as a form group without a header, keeping subsequent fields together vertically:

  • In a form or form section without groups, these fields would previously be spread horizontally within the form or form section. Now, they will remain together vertically.
  • In a form or form section with groups, these fields would previously always remain in their form group. Now, they will move to a new form column, space permitting.

Additionally, when a field is marked with Field no. of positions further = 0 and with Field in next column, it will no longer be placed next to its predecessor. Instead, it will occupy a new position in the form and follow the rules mentioned in this topic.

Review your settings
  • Check your existing configured forms, task- and report pop-ups.
  • We have also updated the setting Next group. If no label or icon is specified for the group, the Universal GUI adds an empty position to the form. This empty space clearly separates the new group from the previous one, even if they are vertically placed in the same form column. If this is not intended, use Field in next column instead to create a new group without the empty position as a separator.
  • A rare occurrence is when Field in next column is set, but the entire preceding group is visually hidden. In the previous generation GUIs, the label and icon of this group would be 'inherited' by the field marked with Field in the next column. In the Universal GUI, the label and icon of the preceding group will be removed. This is intentional. To facilitate a seamless transition from previous generation GUIs, we have added the enrichment Retain group label and icon for fully hidden form groups. It transfers the Field in next column setting to the hidden form field that introduces the group.

Process flows - Process action input/output views with nullable primary key

fix Universal GUI

When using the Universal GUI to work with the Software Factory, the input and output views of process actions would raise an error about a nullable primary key column.

We have introduced new smoke test steps to check this specific scenario with your own views. These steps inspect views to identify any records with a NULL primary key column.

Run the smoke tests

Run the smoke tests to see if you need to make any changes.

Authorization - Added 'Web connections' to 'Copy application' task

breaking new

In this release, we have added Web connections to the Software Factory and IAM. For more information, see Process flows - Web connection.

When you copy an application within IAM, you can now include all overridden properties of web connections. You can do this by selecting the checkbox Web connections in the task Copy application (menu Authorization > Applications > tab List). If this checkbox is not selected, the new application will not contain any overridden web connection properties of the copied application.

Update post-synchronization calls

If you execute the task create_gui_appl_from_gui_appl from post-synchronization/deployment code, in CI/CD tooling or anywhere else, update the call with the new parameter copy_gui_appl_web_connection and give it either the value True or False.

  • menu Deployment > Synchronization to IAM > tab Post synchronization code
  • menu Deployment > Deployment package > tab Post synchronization code

copy application Web connections in the task 'Copy application'

Model enrichments

Prompt chaining for AI-powered model enrichments

new

AI-powered enrichments now support more advanced prompting techniques by enabling prompt chaining. This functionality is used in the default model enrichments, and you also have the option to implement it in your custom enrichments.

What is prompt chaining?

By default, an enrichment contains a single set of prompts that the generative AI completes. With prompt chaining activated, additional prompts can be introduced based on the completion of earlier prompts. This feature enables the breakdown of complex tasks into smaller steps.

When running an enrichment, the completion prompt query will be re-executed after a completion. The completion prompt query has access to the temporary table #pc_data (key, completion) which contains all completions of all earlier cycles.

The model update query can access the completions of all prompt chain cycles. Because of this, the keys used for the prompts must be unique for all prompt chain cycles in a run. Re-using a key will result in errors.

To use prompt chaining in your own enrichments, select the checkbox Prompt chaining enabled in the menu Enrichment > Model Enrichments > tab Maintenance > tab Form > tab Enrichment.

You need to specify the prompts for all cycles in the same completion prompt query. To organize the prompt completion code for different cycles, use the variable @pc_cycle. It indicates the current prompt chaining cycle, starting at 1.

Example of prompt chaining

Here is an example of an AI enrichment that generates a system message based on a message translation. You want the message ID to be snake case, which is challenging to derive directly from the message translation. Instead, you can first have the AI summarize the text and then generate an ID based on the summary:

if @pc_cycle = 1
begin
-- Summarize the user input to a handful of words
insert into #ai_data
(
"key",
"prompt"
)
values
(
'prep_summarize',
concat('Summarize the following text to one to three words: ', @input)
)
end

if @pc_cycle = 2
begin
-- Turn the summarized words into a camel_case variable
insert into #ai_data
(
"key",
"prompt"
)
select
'message_id',
concat('Provide a snake_case property name for the following word(s): ', completion)
from #pc_data
where "key" = 'prep_summarize'
end

You need to specify the number of cycles for an enrichment in advance. A cycle can also be completed without a prompt, for example, when a step is skipped via an enrichment parameter. In such cases, the process will move on to the next cycle.

New model enrichments

new
tip

For AI-powered enrichments, use the latest AI models for the best results. For OpenAI, we recommend GPT 4 or up.

In this release, we have added new model enrichments.

  • Generate application logic based on natural language business rules - This enrichment is AI-powered. In its parameters you can enter a natural language business rule that tells the enrichment when and where the rule should occur and what should happen. The enrichment will derive the logic concept and the model object and create a logic template. It can generate Default, Layout, Context, Trigger, and Handler logic.

  • Add comments to code with AI - This enrichment is AI-powered. Adding comments to code is essential for understanding its functionality. This enrichment adds comments to a specific control procedure. It uses AI to comprehend your code and includes comment lines where needed. Comments will be added to control procedure code, template code, and dynamic model code, as applicable.

  • Set up a drag-drop link - Sets up a drag-drop link between two tables by creating the background task, settings, and functionality structure. The task is pre-populated to display a 'Todo: fill with logic' message to remind you to enter code for what needs to happen on a drag and drop action.

  • Role creation based on a table variant - After entering a role name, a table name, and a specific variant, this enrichment determines which rights must be granted to ensure that the variant is fully accessible. The role includes all objects for which rights can be set up, including menus, tasks, reports, columns, etc.

    note

    If the role name already exists, the first suggested model update will be to revoke the existing rights. You can deselect this, but this can result in more access rights for the role than intended.

  • Role creation based on a process flow - After entering a role name and a specific process flow, this enrichment determines which rights must be granted to ensure that the process flow and all objects to which it links are fully accessible. The role includes all objects for which rights can be set up, including menus, tasks, reports, columns, etc.

    note

    If the role name already exists, the first suggested model update will be to revoke the existing rights. You can deselect this, but this can result in more access rights for the role than intended.

New model enrichments for the transition to the Universal GUI

new
tip

For AI-powered enrichments, use the latest AI models for the best results. For OpenAI, we recommend GPT 4 or up.

To support a seamless transition from previous generations of user interfaces to the Universal GUI, we have added new model enrichments:

  • Add the Universal platform - Creates the platform Universal. It also adds a default theme for the Universal GUI, which is similar to the Windows GUI theme.

  • Remove obsolete platforms - Removes the two platforms that are no longer supported: Web and Mobile. In addition, it removes themes, menus, configurations, and process flows that were only used for the removed platforms. You can also choose to remove the Windows platform. Note that the Windows platform is still supported. Use this enrichment only to remove platforms other than Universal.

  • Update tree page size - Automatically updates the page size of all hierarchical trees to an acceptable value for displaying the tree in the Universal GUI.

  • Keep ungrouped form fields vertically aligned - The Universal GUI keeps form fields in form groups together vertically when repositioning fields in the form columns based on available horizontal space. The exception is when fields are neither in a group nor marked to be allowed in a new form column. These ungrouped fields spread across the available form columns. This maximizes vertical space usage but results in a different visual experience than the tabbed forms that focus on filling horizontal space. This enrichment updates the first such fields to be allowed in a new form column, causing subsequent fields to stay together vertically as a virtual group.

  • Field height limitation - In previous GUI generations, the setting Field height in positions for form fields could be set to very large values. The GUIs limited this value based on the available space of the tabbed form. However, the Universal GUI uses a scrollable (vertical) form that respects any configured value for Field height in positions. This enrichment adjusts extreme values for this setting to a suitable value compatible with a scrollable form.

  • Show default cube view - In previous GUI generations, default cube views were always shown, even if the setting Show cube view was deactivated. However, the Universal GUI respects the deactivated setting and will not show the default cube view. This enrichment adjusts the setting to show the cube view. If you do not want this, you can also change the default cube view for this cube.

  • Set up a card list configuration - This enrichment sets up a basic card list configuration for each table that has more than three visible columns in the card list. The configuration is based on the following columns:

    • The look-up value of the table. It will be shown without a label
    • If present: an image or icon
    • If present: the first checkbox or combo from the grid. It will be shown with a label

    Additional columns in the table will be hidden in the card list. This enrichment does not modify the card list setup for variants. These were made intentionally, so the enrichment should not modify these settings.

  • Update message options - When configuring messages and their corresponding options for the Windows GUI, the most common practice is to model the affirmative message option (for example, 'yes') on the left side, and the negative option (for example, 'no') on the right side on a screen. In the Universal GUI this is exactly the opposite because of different standards in web and desktop applications. This enrichment updates the message options so the negative option is positioned on the left side and the affirmative option on the right side. Any other options will be modelled in between. You can select which model updates need to be executed.

  • Set the display type to hidden for drag-drop tasks - When drag-drop tasks are used in your application, there is usually no need for visible buttons in the user interface. This enrichment sets the display type for drag-drop tasks to hidden.

  • Set the display type to Icon only for tasks and reports - Sets the display type to match the way tasks and reports used to be shown in the Windows GUI. You can set the display type for tasks and reports, which determines how they are displayed in the GUI. By default, new tasks and reports are set to Icon + text. The Universal GUI honors this setting. However, the Windows GUI does not support the textual part and only shows the icon. This means the display type would change for the end user when your application switches from the Windows GUI to the Universal GUI. To mimic the behavior of the Windows GUI, this enrichment sets the display type to Icon for all tasks and reports that are set as Icon + text or Text only.

  • Show tab icons - Ensures that your tab icons are displayed like in the Windows GUI. In the Classic theme used in the Windows GUI, there is an option to show or hide tab icons. However, this setting is not available in the Universal theme, where tab icons are hidden by default. This enrichment adds the extended property ShowTabIcons if tab icons are set to be shown in the Classic theme that is linked to the platform Windows. This achieves the same behavior in the Universal GUI as in the Windows GUI.

  • Turn off auto-introduced search - Excludes the search bar from the introduced action bar for all affected screen types. Every screen in the Universal GUI automatically gets an action bar, and every action bar automatically introduces a search bar if search settings are configured for the table. This may not be desired, so with this enrichment, you can make sure that the search bar is excluded in those cases.

  • Set the keybinding schema to Classic - Adds the ability to select 'Classic' navigation for using Enter to move from field to field. The Universal GUI uses web-oriented hotkeys for navigation. This means that it supports using Tab to move from field to field. The Enter key is used to create line breaks in multiline fields. This enrichment adds an extended property called keybindings that changes the keybinding schema to ‘Classic’. If set to 'Classic', you can use Enter to move from field to field in forms.

  • Set the default page size for pagination - Sets the page size so pagination is available in the Universal GUI. If you move to the Universal GUI without a page size configured, there will be no pagination.

  • Show or hide the default action bar - With this enrichment, you can configure the presence of the default action bar. This is determined by the screen components a screen type has. If at least one of the chosen components is available in a screen type, the default action bar will be enabled. If not, the default action bar will be turned off. Screen types with a modeled action bar are excluded from this enrichment. Also generated screen types will not be modified.

  • Move tasks and reports to the overflow menu - In the Windows GUI, tasks and reports are not visible when their respective bars are not included in the screen type. Users need to access them by navigating through the ribbon or by opening the context menu. In the Universal GUI, tasks and reports are shown by default in the action bar, alongside the CRUD actions. This enrichment ensures that tasks and reports are placed in the overflow menu if the assigned screen type for the subject does not contain a task bar or a report bar.

AI-powered model enrichments as tasks

new

In the previous release, we have started adding AI-powered model enrichments to the Software Factory. As you can read in these release notes, we have added many more to this release and will continue doing so. So far, the AI-powered model enrichments were only available in the menu Enrichment > Model enrichments. They remain available there but in this release we have started making them available as tasks on the screens where they can be of immediate use.

The following AI-powered model enrichments are now available on other Software Factory screens:

  • Create AI-generated data model - Available in the menu Data > Data model. Similar to the enrichment process, you will be prompted to provide a description of your desired data model. Upon execution, the data model will be created. The AI will generate a diagram with tables, references, and new domains as required.

    note

    The model enrichment in the menu Enrichment > Model enrichments has more options. It allows you to select the specific tables, columns, and references to be created, and you can choose which steps to execute.

    AI generated model A description and a generated model

  • Translate using AI - Available in the menu User interface > Translations. This task is only available if your branch contains two or more languages, and at least one translation.

  • Generate table description with AI - Available in the menu Data > Data model > Tables. The selected table will be used as input for the enrichment. The table description will be filled with an AI-generated table description.

  • Generate application logic with AI - Available in the following locations:

    • Business Logic > Functionality
    • Data > Data model > tab Tables
    • User Interface > Subjects

    If you enter a description of the desired control procedure, the AI automatically derives the logic concept, the model object, and creates a logic template. It can generate Default, Layout, Context, Trigger and Handler logic.

  • Add comments to code with AI - Available in the following locations:

    • menu Business logic > Functionality (only for Assignment "SQL")
    • menu Business logic > Functionality > tab Templates
    • menu Dynamic model > tab Control procedure

    Depending on the selected control procedure or template, the code is updated to include comments.

  • Summarize template with AI - Available in the menu Business Logic > Functionality > tab Templates. The selected template will be used as input for the enrichment. The template description will be filled with an AI-generated template description based on the code of this template.

Model enrichments as tasks

new

We have made a start with replacing tasks with model enrichments in the Software Factory. In this release, we have replaced one task:

  • Create cube - This model enrichment replaces the task Create cube in the menu User Interface > Business Intelligence. You can customize the cube based on the selected table and choose what you want to execute exactly, which was not possible with the task.

Indication for generation by AI

new

When objects or code are generated using the AI-powered features of the Software Factory, the field Modified by is set to "Generative AI". This user will replace the "AI Code review" user that we introduced earlier. The history screens that can be opened with the tasks Show history in most screens will show clearly when a record was inserted or updated by AI with the following icon:

Generated by AI Generated by AI as part of the history

New and changed in the Software Factory

Process flows - New connector: Web connection

new

To communicate with any service or third party online, HTTP connectors were already available to send and retrieve data. However, despite all its capabilities, reusing the HTTP connector is not always easy and and altering its parameters requires writing logic.

For this reason, we have introduced a new process flow connector: Web connection. It is an enhanced and re-usable version of the HTTP connector. It stores information such as the base URL, (encrypted) authentication details, endpoints, and much more within the model (menu Integration & AI > Web connections).

You can also define parameters for use across the web connection or endpoints, facilitating dynamic field settings. Using curly brackets { }, you can add parameters to many settings. For example, you could create a Web connection parameter user_name and use it in the Username field by entering the value {user_name} there. The parameter is part of the input of the Web connection process action. The value that is set for the parameter user_name is then passed to the Username field, so the field can be filled dynamically.

Settings

Web connection settings (only web connection parameters allowed):

  • Base URL
  • Username
  • Password
  • Bearer token
  • API key name
  • API key value

Endpoint settings:

  • Path
  • Body type
  • Content type
  • Form fields
    • Name
    • Value
  • Query string parameters
    • Name
    • Value
  • Request headers
    • Name
    • Value

It is possible to override the Web connection settings:

  • In the Software Factory, you can override the Web connection settings for a specific runtime configuration (menu Maintenance > Runtime configurations > tab Web connections).
  • In IAM, you can override the settings for applications (menu Authorization > Applications > tab General settings > tab Web connections). This enables, for example, dynamic usage of web connections for different tenants.

Models - Merge changes into an arbitrary branch

Community idea new

It is now possible to merge a branch into an arbitrary branch (menu Models > Merging). You could use this, for example, when you are developing two different releases (each with their own release branch and develop branches) and need to merge changes from one release into the other.

During this process, the Software Factory determines an origin branch and point in time that are shared between the source and target branch. The merge session identifies all changes from the origin up to the current state of the source branch. This set of changes is then merged into the target branch and may include changes that were made before the source branch was created. For example, when HOTFIX_A is merged into DEVELOP, it will include all changes between MAIN 1.00 and the current HOTFIX_A branch.

To allow for merge sessions that involve source and target branches that are not the origin branch, we have renamed various elements in the screens. Instead of referring to the 'origin' and the 'branch' in the overview of actions and conflicts, in detail tabs, and conflict resolution texts, these UI elements now always refer to the 'source' and 'target' branch instead.

note
  • These types of merges are not shown in the branch diagram.
  • Data migration settings in the source branch will not be migrated to the target branch, as they are probably incompatible with all the existing data migrations in the target branch.

arbitrary branch Merge changes from an arbitrary branch

Models - Branch switch confirmation

Community idea new

When switching your active branch in the Software Factory (menu Models > Switch branch), you have to confirm a message that all open documents will be closed. This ensures that new documents are opened in the branch to which you are switching.

If you are familiar with this process, you may no longer want to get this message each time you switch branch. For this reason, we have added the option Always. If you select it, the message will no longer open.

You can revert this option in the menu Maintenance > Users > tab Form > checkbox Branch switch confirmation.

Confirm closing documents Confirm closing of documents when switching active branch

Models - Trace columns handled differently in a merge

change

Previously, when preparing and executing a merge session, the trace values of the objects were not always updated. For this reason, we have made some changes that make tracing the last person who updated an object much easier.

Note: A reciprocal merge has a minor limitation. If a value changes automatically due to a merge, the update user will be the person who executed the merge. This occurs, for example, when the absolute order number changes because columns have been added to the same table in both the origin and the branch. They cannot have the same number and will be recalculated when the merge is executed.

Models - Features available in new menu group

change

In IAM, we have enhanced the layout for the screen Applications (menu Authorization). For more information, see Applications - Enhanced screen overview.

In accordance with this enhancement, we have also added a tab General settings to the branche overview in the Software Factory (menu Models > Model overview > tab Branches).

In addition to this, we have updated the menu structure in the Software Factory. Certain features are more easily accessible now. They require fewer clicks to open. Opening them is also less error-prone, because they are opened in the context of your working branch automatically. These features remain available in the General settings tab, but have also become available through the menu. The menu now includes the following:

  • A new menu group Integration & AI has been introduced. This menu group is home to the following menu items:

    • Web connections
    • Email providers
    • File storage locations
    • OAuth servers
    • Generative AI
    • AutoML

    These features are all presented within the context of the current model/branch, making it easier to set up the values for each integration within the right context.

  • Since we have added AutoML to the menu group Integration & AI, the menu group Machine Learning has become obsolete and has been removed.

  • The menu group Enrichments has been moved to underneath Deployment, with the new menu group Integration & AI in between these two.

General settings General settings overview for branches

Data - Columnstore index support

new SQL Server

We have enhanced the Software Factory's support for creating indexes by introducing the option to generate columnstore indexes.

What are columnstore indexes?

A columnstore index is a type of index used in relational database management systems (RDBMS) to optimize the storage and retrieval of data in tables. Unlike traditional row-based indexes that store data in rows, a columnstore index stores data in columns. They offer substantial data compression, leading to a significant reduction in required storage space. This results in improved query performance due to reduced I/O requirements when executing queries that involve scanning and aggregating large volumes of data, typically in analytical and reporting workloads.

A columnstore index can be clustered or non-clustered. You can find both options as two new index types when creating an index in the Software Factory, in the menu Data > Data model > tab Tables > tab Indexes. If you are using SQL Server 2022 or later, you can specify an order column to improve performance.

Use case for columnstore indexes

Columnstore indexes include internal optimizations, such as SIMD and AVX-512 instructions, allowing SQL Server to compare millions of vector values in under a second. This enables semantic search within an application.

A powerful use case for columnstore indexes is storing LLM embeddings. This can be used for various purposes, such as:

  • Semantic searching in your application
  • Similarity matching of cases
  • Retrieval Augmented Generation (RAG): providing subject-related data in an AI-chat

Think about a system with a large number of emails. Each email has a subject and a text. The aim is to be able to quickly find relevant emails for various inquiries. To achieve this, the following steps are necessary:

  • Generate an embedding for each email
  • Store the embedding in a vector store

Generally, the vector store for emails would be modeled as a separate table:

table email_vector_store
(
email_id,
vector_value_id,
vector_value
)

The table uses a clustered columnstore index.

For each email, the LLM Embedding connector generates an embedding based on the subject and email body. Store the resulting embedding for an individual email as follows:

insert into email_vector_store
(
email_id,
vector_value_id,
vector_value
)

select
@email_id,
cast(e.[key] as int) as vector_value_id,
cast(e.[value] as float) as vector_value
from openjson(@embedding) e

This process is performed for each stored email in the system. Once the vector store is populated with email data, a semantic similarity search is possible. An example of this search involves finding relevant emails based on a natural-language search query by the user.

The search query can be converted into an embedding through the LLM Embedding connector and is then processed as follows:

-- Turn the search query embedding into a temporary table
select
cast([key] as int) as [vector_value_id],
cast([value] as float) as [vector_value]
into #search_embedding
from openjson(@search_embedding)

-- Find the 10 most comparable emails
-- https://platform.openai.com/docs/guides/embeddings/which-distance-function-should-i-use
select top (10)
e.email_id,
sum(v1.[vector_value] * v2.[vector_value]) as score
from email_vector_store e
join #search_embedding s
on s.vector_value_id = e.vector_value_id
order by score desc

Columnstore index support

Data - Advise to update two domain controls

change

We have added a validation to warn you if you are using the domain controls File link or Folder link in your applications, so you can refactor them with alternatives.

These controls are especially suited for desktop applications where all users can access a file or folder from the same environment. In a 3-tier architecture and Azure, files can be in a different location where users cannot link to directly. Moreover, browser applications cannot access desktop files. So, replacing the domain controls with alternatives makes your application more suitable for use in a 3-tier architecture (with the Universal GUI) and Azure.

Refactor File link and Folder link domain controls
  • Instead of File link, consider using File upload (for both uploads and downloads). Ensure that Indicium has access.
  • Instead of Folder link, you can use what is most suitable for your situation. Some examples:
    • Remove the control entirely, converting it into a freely editable text field. In that case, the GUI no longer checks whether the path exists.
    • Use a process flow for upload/download.
    • Use a Copy to clipboard control, users can then use the link on the clipboard to go to the right environment themselves and access the folder.

We have also refactored these domain controls in the Software Factory. For more information, see Deployment - Open generated files.

Data - More options for copying columns to another table

Community idea new

We have added more options to the copy task in the tab Copy columns (menu Data > Data model > tab Tables > tab Columns > tab Copy columns). When copying columns from another table, you can now also select identity-related settings (Identity, Seed, Increment) and the setting Mandatory. This offers greater control over the desired outcome of the new column. For example, if you select Mandatory to include in your copy, it copies the setting (mandatory or not) from its source.

Mandatory and Identity settings Mandatory and Identity settings

User interface - Validations for prefilter groups

new

We have added new validations to alert you of prefilter groups that have been set up incorrectly. This applies to groups for all three types of prefilters (main, detail, and lookup) in the default tables and table variants.

You can set prefilter groups in the menu User interface > Subjects > tab Subjects > tab Data > tab Prefilter.

User interface - Menu designer converted into a tree-based visualization

change

To make the Software Factory suitable for use with the Universal GUI, the menu designers (known as modelers) have been replaced with a Tree component. Because this is a native screen component, menus can be visualized and maintained once the Software Factory uses the Universal GUI. The functionality of the menu designer has been retained. Groups and items can be moved using drag-drop.

For list bar and tiles menus:

  • Groups can be dragged onto other groups. The groups are put before the group on which they were dropped.
  • Items can be dragged onto other groups or items of other groups. The items are moved to the group where they were dropped.
  • Items can be dragged and dropped inside their current group. The items are put before the item on which they were dropped.

For tree menus, it is slightly different:

  • Groups can be dragged onto other groups. The groups are put before the group on which they were dropped within the parent groups. Groups will not be moved.
  • Groups can be dragged onto items in other groups. The groups are moved to the parent group of the item on which the row was dropped.
  • Items can be dragged onto other groups or items of other groups. The items are moved to the group where the row was dropped.
  • Items can be dragged and dropped inside their current group. The items are put before the item on which they were dropped.

Example of a list bar menu

User interface - Grouping icons

Community idea new

Icons are an essential part of any model. They are kept in the icon repository, in the menu User interface > Icons. For large models, the icon repository can contain hundreds of icons, each appearing in one or more locations.

To facilitate better organization, we have added the ability to group icons. The tab Form now contains a field Icon group where you can specify the group to which the icon belongs. You can create a new group in the field's lookup.

Icon groups Icon groups

User interface - Moved translation tasks

change

The tasks Generate translation objects and Delete unused translation objects have been moved one level higher on the screen (menu User interface > Translations). You can now find them above the grid with the languages.

Translation tasks Moved translation tasks

User interface - Removed the limitation on 100% field position width

change Universal GUI

Previously, fields on the same line would always equal 100% even when the field width would indicate otherwise. We removed this limitation, allowing fields on the same line to exceed 100% of the available width. This allows the Universal GUI to better scale sets of fields.

This change requires Universal GUI version 2024.1.14 or higher.

You can set the Field width in the menu User interface > Subjects > tab Default/Variants > tab Settings > tab General > group Form.

Community idea new

It is now possible to use wildcards in a code search (menu Business logic > Code search). This allows for more complex searches with specified conditions while maintaining flexibility. The possible wildcard options are:

  • % - Matches any string of zero or more characters. It can find a match on one word or on multiple words, as long as they appear in the same line, consist of the search string and appear in that specific order.
  • _ - Matches any single character.
  • [...-...] - Matches any single character within the specified range ([a-f], [0-4]) or set ([abcdef], [01234])
  • [^...] - Matches any single character not within the specified range ([^a-f], [^0-4]) or set ([^abcdef], [^01234])

Code search using wildcards Code search using wildcards

Community idea new

The Software Factory now remembers your 5 most recent code searches, allowing you to quickly switch between them. This applies not only to the search string itself, but also to its corresponding search options.

  • For quick selection, the combo box shows the sorted order number (latest on top) and the historical search string.

    Code search combo box Code search combo box

  • For additional information, the lookup pop-up shows a grid containing the corresponding search options for each historical search string.

    Code search lookup Code search lookup

Quality - Improved AI code review

change

Reviewing code by a generative AI provider was already available. Now, we have further enhanced this functionality by improving its results and adding an AI code review task to several convenient locations.

Activating an automatic AI code review has remained the same: in the menu Quality > Code review > tab Code review, execute the task Ready for review and select the option Review by AI. The Software Factory executes the AI code review in the background.

Additionally, you can request an AI code review manually if a control procedure is in review with the new task Review template code with AI . This task is available in the following locations:

  • Quality > Code review
  • Business logic > Functionality > Code review

AI code review A task to start the AI code review

Quality - Smoke test success in the Quality dashboard

Community idea change

In the Quality dashboard, we have replaced the measurement of Process test success with Smoke test success.

Smoke tests with status Warning are considered successful for the quality dashboard ratings, as this can only occur due to a query timeout. You can currently not prevent this.

The calculation for the number of stars for smoke tests and the impact on the summarized branch quality is the same as the calculation for the process tests; it shows the percentage of available smoke tests with a successful result. The quality improves if more tests are successful.

Smoke test success in the Quality dashboard

Quality - Setting for smoke tests for the Windows GUI

new Windows GUI

The Indicium service tier now supports expression fields in prefilters for smoke tests.

However, if you are not using Indicium (i.e. the Windows GUI), expression fields in prefilters are not supported. So, if you run a smoke test for the Windows GUI, you want it to fail for prefilters with expression fields.

To enable this, a new checkbox is available in the menu Model overview > Branches > tab Model settings. It is called Mimic Windows GUI (classic) and is cleared by default. Only select it if you are using the Windows GUI for your applications.

note

Do not select this setting if you are using the Universal GUI. The Universal GUI is a 3-tier user interface that supports prefilters with expression fields. Enabling this setting will lead to false negatives in your smoke tests, or prevent the use of expression fields in your prefilters.

Quality - SQL analysis removed

change

Last year, we introduced the AI code review feature. Consequently, the SQL code analysis has become outdated and has been removed from the Software Factory. Previously, it was available in the following locations:

  • menu Quality > Code review > tab Code analysis
  • menu Model content > Program objects > tab SQL analysis

Deployment - Open generated files

change

As of this release, we no longer use the domain controls File link and Folder link in the Software Factory and IAM. For more information about the reasons for this change, see Advise to update two domain controls.

These domain controls were used in the following screens:

  • menu Deployment > Creation > tab Generate source code - If you run the task Generate source code with Write to storage activated, the result screen shows folder locations.
  • menu Deployment > Synchronization to IAM > tab Synchronization - If you run the task Synchronize to storage, the result screen shows the location of the synchronization file.
  • menu Deployment > Deployment package > tab Deployment package - If you run the task Create deployment package, the result screen shows the location of the deployment package.

Previously, you could open the folders or file directly from the Software Factory. Now, a button Copy to clipboard is available instead. You can use it to copy and paste the link to where the files are available, for example, in the file explorer or an AWS bucket.

Deployment - Estimated duration

new

We have added an estimated duration to some Deployment screens:

  • menu Deployment > Creation > tab Generate definition
  • menu Deployment > Synchronization to IAM > tab Synchronization

The estimate shows the remaining amount of time based on the average of all previous successful processes.

Estimated duration Estimated duration

Deployment - Duration for synchronization steps

new

In the screen Synchronization to IAM (menu Deployment), you can now see the duration of every step in the process and all individual steps when generating synchronization scripts. This helps visualize what tasks the process is performing and how many steps remain.

Do note that some scripts take longer to generate than others. This can be because of the amount of data or that the underlying process takes more time to calculate all the necessary values, such as calculating the effective rights for (variant) columns.

Duration of synchronization steps

Dynamic model - Trace columns filled for staged strategy

change

Previously, the person generating the code was usually not the same as the one who initiated the change, so adding the first person to the trace columns made no sense. And since we introduced system flows for generating code, the pool user is the one who generates.

When generating dynamic model procedures with the strategy Delete, you can specify your own value for the trace columns. However, when using the strategy Staged, the trace columns were not filled.

This has been changed and now the Software Factory also fills the trace columns for all the temporary tables that are used, but only when the data is new or has actually changed.

  • When the dynamic model creates a record, the insert and update trace fields are filled.
  • When the dynamic model updates a record, the update trace fields are also updated.

Maintenance - Retention plan for unit test results

new

The Software Factory saves unit test results for all executed unit tests in the menu Quality > Unit tests. However, a large part of the unit test result information is usually not important enough to store for a longer period of time. Similarly to how jobs are cleaned up, we have introduced a new setting named Unit test retention (in days) in the menu Maintenance > Configuration > group Environment settings. The default value is 14 (days).

Every day at 8:00 PM UTC, the Software Factory removes the unit test result information based on the value of this setting. The clean-up process removes all related data for unit test results that exceed the retention period. Only the most recent run and the last successful run within the context of a model/branch combination will be retained.

Generic - More 'go to' options

Community idea new

We have added more 'go to' options to the Software Factory:

  • Go to model rights - With this task, you can navigate from different objects to the Model rights overview (menu Access Control > Model rights > tab Model rights).

    It is available for the following objects:

    • Table (menu Data > Datamodel > Tables) and (menu User interface > Subjects)
    • Menu (menu User Interface > Menu)
    • Process flow (menu Processes > Process flows)
    • Subflow (menu Processes > Subflows)
    • Task (menu Processes > Tasks)
    • Report (menu Processes > Reports)
    • Subroutine (menu Business Logic > Subroutines)
  • Go to the mock data - With this task, when you add mock data to a unit test, you can navigate directly to the data set. It is available in the menu Quality > Unit tests > tab Form > tab Mock data.

  • Go to [Object] - With these tasks, you can navigate to different objects from the menu Business Logic > Functionality > tab Deploy.

    The following tasks are available:

    • Go to Tasks
    • Go to Data model
    • Go to Process actions
    • Go to Subroutines
    • Go to Reports
new

It is now possible to navigate directly to the documentation and the release notes for the Software Factory. The new menu group Documentation contains two menu items:

This keeps the documentation accessible when working in the Software Factory in a 3-tier environment.

Generic - New validations

new

We added 3 validations to detect that an object uses a shortcut with a reserved Shift code value 'Shift'. The validations apply to prefilters, tasks and reports.

  • In the Windows GUI, the Shift code value 'Shift' is reserved for typing capitals and shift numeric keys. This makes it impossible to use it for activating the object using the shortcut.
  • In the Universal GUI, the Shift code value 'Shift' is reserved for activating the object using the shortcut. This makes it impossible to use it for typing capitals and shift numeric keys.

Fixed in the Software Factory

Models - Branch diagram improvements

The branch diagram did not show reciprocal merging correctly. This has been fixed, along with various color-related enhancements.

Branch diagram improvements Reciprocal merging in the branching diagram

Models - Disallowed removal of model settings

It was possible to delete the model settings of a branch in the Software Factory (menu Models > Model overview > tab Branches > tab Model settings). However, deleting these settings would cause several processes to fail. We have disabled the delete option.

Models - Open sole active branch if 'Remember selected branch' is not selected

When a user only has one branch within a model set as their own (My models ), the task pop-up Switch branch would always use the last user session when opening the Software Factory regardless of the setting Remember selected branch. This was unintended and has been resolved. Now:

  • If the checkbox Remember selected branch is cleared, the model and branch selection will be preset to the sole active model and branch that are linked to your user rather than the last user session.
  • If the checkbox Remember selected branch is selected, the model and branch used in the last session will be preset.

Models - Resolved merging base models into work model dependencies

When a base model supplied a table and a column and had the look-up display column set up for a reference, the trigger code would set the look-up display column of the table before the actual column was added to the work model. This has been corrected.

Process flows - Start and stop included in copy

new

When adding a new process flow and using the Copy button to create another process flow, the process actions Start and Stop were not added. This has been fixed. They are now always added when adding new process flows.

Data - Rebuild table now also results in recreating constraints in 'Smart upgrade'

When executing a smart upgrade (menu Deployment > Creation), constraints on a table selected for rebuilding were not recreated when the table was recreated. This has been fixed.

All references with the setting Check integrity selected (menu Data > Data model > tab References > tab Form) will be recreated during the smart upgrade if the table has been marked for rebuilding in the data migration (menu Data > Data migration).

Business logic - ROWGUID columns not allowed in handlers by Indicium

ROWGUID columns are now excluded from the generated statements for insert handlers and update handlers, as Indicium does not allow them to be used in these handlers. If such handlers containing ROWGUID columns were already present in your database, they will be marked as modified during the next smart upgrade.

User interface - Selected font for updated conditional layout

When updating a conditional layout with a new font that has different bold or italic configuration than the configured font, these settings would not override the existing ones. This has been fixed.

Access Control - Role simulation in the Software Factory with Always on prefilters

When you simulated a role in the Software Factory and that role had the setting Always on activated, the Software Factory ignored that setting. In IAM, it was used correctly. This led to a difference between simulated roles in the Software Factory and IAM. The Software Factory now correctly listens to the Always on setting.

Deployment - Slashes in relative paths

We resolved an issue where relative paths for code files and program objects had to contain a backslash for writing code files to disk, writing program objects to disk, and deployment package processes. These relative paths can now contain zero or more back or forward slashes.

Deployment - 'Deselect all code files task' excluded code file DB

Previously, the task Deselect all code files (menu Deployment > Creation > tab Execute source code) would also deselect the code file DB. The Software Factory automatically selects this code file if the database does not exist. Manually deselecting this code file is not allowed. This was already disabled in the list, and now it is also no longer possible with the task Deselect all code files.

Quality - Numeric with no decimals in unit test

A unit test could lead to unexpected results if you used a domain with data type Numeric without decimals, like 2,0 (2 = total length, 0 = no decimals). For example, if you expected '3' as output, the unit test would fail because the value returned by Indicium was '3.0'. Now, the Software Factory converts '3.0' to '3' to match the expected outcome.

note

If you used workarounds to solve this problem, you can remove them. They are no longer necessary.

Specification - Data in Work overview

Windows GUI

The menu item Work overview (menu Specification) opened without data. This has been fixed by ensuring that the prefilter Work items is always enabled when opening the screen.

Generic - Improved support for Oracle

Oracle
note

Oracle uses packages instead of program objects. To generate and execute a single package for Oracle, select the checkbox Fixed file in the menu Models > Model content > tab Code files > tab List > tab Code file.

We have improved the support for Oracle in the following screens:

  • Functionality (menu Business logic > Functionality > tab Deploy)
  • Code overview (menu Business logic > Code overview)

These screens now include a tab page Package for the entire package of which the program object is a part.

We have also renamed some tasks to better reflect their nature:

Old nameNew name
Generate selected program objectsGenerate selected
Execute all program objectsExecute all
Execute selected program objectsExecute selected

The changes allow you to generate and execute a single package (code file) instead of a program object:

  • The tasks Generate control procedure and Generate selected assemble the package code.
  • The tasks Execute all and Execute selected execute the package on the database instead of the program object.

Additionally, the processes Create and Data migration are now similar to the ones for SQL Server.

New and changed in the Intelligent Application Manager

Client applications - Support for public OpenID Connect clients

new

You can now mark a client application as a public client (menu Client apps > Client applications > tab Form > tab Client application). This is only possible under the following conditions:

  • The client application supports OpenID Connect, and the Grant type is "Authorization code".
  • The client application has no secrets. If there are secrets, this option is not available.

If Public client is selected, it is no longer possible to add secrets (the tab page is disabled).

note

All clients that do not currently have secrets will automatically be marked as public clients when you upgrade to this version of IAM.

This feature allows two types of OpenID clients:

  • Confidential clients - Clients that can keep their secrets confidential. They can authenticate themselves to the authorization server.
  • Public clients - Clients that cannot use registered client secrets, such as applications running in a browser or native apps on a device.

Public client

Applications - Enhanced screen layout

change

The screen Application in IAM (Authorization > Applications) contains a lot of detail tabs. To improve the overview, we have created four main tab groups on this screen:

  • General settings - new
  • Authorization settings - new
  • Preferences - was already present
  • Analysis - was already present

These main groups each contain detail tabs. This distribution corresponds to the task Copy application we updated in a previous release.

Since the Software Factory's branche overview (Models > Model overview > tab Branches) contains mostly the same tabs as the tab General settings in IAM, its layout has been changed, too. In addition, many tabs have been moved to a new menu group, Integration & AI. See Models - Features available in new menu group for more information.

authorization tabs New tab: Authorization settings

Applications - Available languages for user preferences

Community idea change Universal GUI

We have updated the list of languages available to users to pick from via user preferences in the Universal GUI (profile menu > User preferences). They can no longer choose from all the languages known in the environment but only from languages configured for applications that users can access via a menu (menu Authorization > Applications > tab General settings > tab Translations).

Users - Pool user allowed to add users

change

Unauthorized users are not allowed to add users to IAM. The pool user, used by Indicium to communicate with IAM, was also not authorized to add users unless it was designated as a main administrator.

This has been changed. All database users with sufficient rights, including pool users, can now add users to IAM. This facilitates the automatic creation of users in IAM.

Users - Enhanced screen layout

new Universal GUI

We have changed the layout of the screen Users in IAM (menu Authorization > Users). The changes improve the overview and provide clearer context for the tasks. Recommendation-related tasks and most user preference-related tasks have been moved to their respective detail tabs. Additionally, the task Clean up unused preferences has been relocated to the menu Optimization.

Furthermore, the CRUD buttons are no longer shown alongside the tasks in the action bar. This further enhances the cleanliness of the user interface on this screen.

note

While user preference-related tasks are placed on the first tab Global, they impact not only global user preferences but all user preferences. We have adjusted the translation to reflect this.

old The old action bar

new The new action bar and some of the relocated tasks

Users - Removed "Begins on" and "Ends on" fields for Main administrator

change

We have removed the fields Begins on and Ends on from the screen Main administrators (menu Authorization > Users > tab Administrators) because these fields are editable by the main administrator anyway. When a row is inserted, the user is now considered a main administrator until the row is removed.

We have also changed how the fields Begins on and Ends on are handled for a user. When these fields are edited, the fields Begins on and Ends on in related tables, such as User groups and Administrator screens, are no longer updated. This means that a user will not be able to access any application if the Ends on date and time has passed. The set dates for the user are now leading.

Generic - Delete tasks hidden in IAM

change

In both the Software Factory and IAM, the delete tasks have already been technically replaced by handlers. In the Software Factory, they also have been hidden in the user interfaces. Objects can be deleted using the regular CRUD delete button. We have now implemented the same in IAM.

In certain cases, the delete task remains accessible because it deletes more than one single item:

  • menu Analysis > Recommendations - delete removes all unused recommendations with a specific recommendation type.
  • menu Settings > Global translations - delete removes the language tag and all global translations linked to it.
  • Advanced menu > Administration > Role sets - delete removes all role sets without roles.

Generic - Improved role lookup reference performance

new

To improve the checking of rights in underlying views for Indicium, we have added new tables to IAM to store the granted lookup references for each role. This eliminates the need for expensive queries to check granted lookup references for each role. The result is improved performance.

During the upgrade, the data for these tables will be automatically created based on the data in IAM for each of your models and branches. These tables will receive updated information when you synchronize your branches from the Software Factory.

new

In IAM, the menu group Documentation already exists. It contains the menu item Documentation. We have added a new menu item to this group: Release notes. Here, you can select the release notes for the version you need.

Fixed in the Intelligent Application Manager

Reload application in Indicium after changes in email or generative AI providers

If you made changes to email providers or generative AI providers, IAM now tells Indicium to refresh the application where the changes were made. Before, this had to be done manually, which was not always possible in production or due to lack of access.

Ensure email is mandatory when copying a user with TOTP

When a user uses TOTP (time-based one-time password), the email address is mandatory. However, this mandatory state was not enforced when copying a user with TOTP. This enforcement has been added to the copy task.

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
role_refrole_tab_detail
sql_analysis_issue-
-icon_grp
-process_action_web_connection_endpoint_parmtr_input_parmtr
-process_action_web_connection_parmtr_input_parmtr
-web_connection
-web_connection_configuration
-web_connection_endpoint
-web_connection_endpoint_form_field
-web_connection_endpoint_output_parmtr
-web_connection_endpoint_parmtr
-web_connection_endpoint_query_string_parmtr
-web_connection_endpoint_request_header
-web_connection_parmtr
code_guideline-
master_prompt-
-code_search_history

Column changes

Changes

SF - From tableSF - From columnSF - To tableSF - To columnMandatoryDefault value
code_search-code_searchuse_wildcards1-
model_vrs-model_vrsmodel_vrs_type
usr-usrset_branch_close_all_documents_confirmation11
conflict_resolvement_typeorigin_applyconflict_resolvement_typesource_branch_apply
conflict_resolvement_typebranch_applyconflict_resolvement_typetarget_branch_apply1-
definition_generation-definition_generationestimated_duration_seconds
definition_generation-definition_generationhas_error10
icon-iconicon_grp_id
merge_conflictorigin_delta_typemerge_conflictsource_branch_delta_type
merge_conflictorigin_delta_action_idmerge_conflictsource_branch_delta_action_id
merge_conflictbranch_delta_typemerge_conflicttarget_branch_delta_type1-
merge_conflictbranch_delta_action_idmerge_conflicttarget_branch_delta_action_id1-
merge_conflict_typeorigin_action_typemerge_conflict_typesource_branch_action_type
merge_conflict_typebranch_action_typemerge_conflict_typetarget_branch_action_type1
merge_conflict_type_resolvement_typebranch_conflict_resolvement_explanationmerge_conflict_type_resolvement_typeconflict_resolvement_explanation
merge_conflict_type_resolvement_typeorigin_conflict_resolvement_explanationmerge_conflict_type_resolvement_typereciprocal_conflict_resolvement_explanation
merge_sessionmerge_directionmerge_session-
merge_sessionmerge_from_branch_idmerge_sessionsource_branch_id1-
merge_sessionmerge_into_branch_idmerge_sessiontarget_branch_id1-
model_vrsmerge_from_branch_idmodel_vrssource_branch_id
model_vrsmerge_into_branch_idmodel_vrstarget_branch_id
pending_change_loggai_review_statuspending_change_log-
process_action-process_actionweb_connection_id
process_action-process_actionweb_connection_endpoint_id
process_action_output_parmtr-process_action_output_parmtrweb_connection_id
process_action_output_parmtr-process_action_output_parmtrweb_connection_endpoint_id
process_action_output_parmtr-process_action_output_parmtrweb_connection_endpoint_output_parmtr_id
sync_run-sync_runestimated_duration_seconds
enrichment_grp-enrichment_grpenrichment_grp_description0-
generate_sync_scripts_step-generate_sync_scripts_stepstart_date_time0-
generate_sync_scripts_step-generate_sync_scripts_stepfinish_date_time0-
generate_sync_scripts_step-generate_sync_scripts_stepduration_seconds0-
sf_configuration-sf_configurationunit_test_result_retention014

Changes Intelligent Application Manager

Table changes

Changes

IAM - From tableIAM - To table
-role_report_look_up
-role_report_variant_look_up
-role_tab_look_up
-role_tab_variant_look_up
-role_task_look_up
-role_task_variant_look_up
role_refrole_tab_detail
-iam_web_connection
-sf_web_connection
-web_connection_endpoint
-web_connection_endpoint_form_field
-web_connection_endpoint_output_parmtr
-web_connection_endpoint_parmtr
-web_connection_endpoint_query_string_parmtr
-web_connection_endpoint_request_header
-web_connection_parmtr

Column changes

Changes

IAM - From tableIAM - From columnIAM - To tableIAM - To columnMandatoryDefault value
role_tab_variant_detaildetail_tab_idrole_tab_variant_detail---
process_action-process_actionweb_connection_id--
openid_client-openid_clientpublic_client10
process_action-process_actionweb_connection_endpoint_id0-
usr_root_adminbegin_onusr_root_admin---
usr_root_adminend_onusr_root_admin---

Questions or suggestions?

tip

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

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

2023.3

· 50 min read

The highlight of this release is the introduction of generative AI in the Software Factory. We have added four Large Language Model connectors that you can use in your system flows. This opens a world of new possibilities.

Of course, we have also implemented AI in the Software Factory. The first use is for reviewing control procedures. You can decide whether you want to use it or not, to support a human review.

An important change in this release is that we have improved the merging process and its screens.

Below, you can read about all the improvements and additions, including 8 Community ideas representing 111 votes.

tip

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

2023.2

· 89 min read

The 2023.2 release of the Thinkwise Platform includes many improvements and additions. One of the most visible changes is that we have revised the Result tab in the Functionality screen. An example of a new feature is, that you can now mark a column or domain for optimistic locking, which prevents users from editing the same record at the same time.

Because we value your input, this release also includes 29 community ideas representing 390 votes. One idea that received many votes was a Branch diagram for your models in the Software Factory. It provides a graphical overview of all the branches inside the model and how they interact. Another popular Community idea was to add the Match any (OR) option to the prefilters. This allows you to set up combinations of prefilters that were not possible before.

2023.1

· 73 min read
Update

Update February 17, 2023 - Added information about OAuth connectors.

We are very excited to announce version 2023.1 of the Thinkwise Platform.

This release contains a major change in version control that affects a large part of the Software Factory. Make sure you carefully read all release notes for this change, as mentioned under the topics Breaking and A new way of version control.

2022.2

· 52 min read

We are very excited to announce version 2022.2 of the Thinkwise Platform.

This release contains so many new and improved features! For example, handler procedures for replacing GUI actions, OpenID provider registration and user provisioning, new process flow actions and connectors, improved file storage handling, time zone support, and a lot more.

Here is an overview of everything new, changed, and fixed. Make sure to check out the breaking changes.

2022.1

· 30 min read

The 2022.1 release of the Thinkwise Platform features a lot of additions and improvements, and a large number of feature requests and tickets have been addressed.

2021.3

· 37 min read

The 2021.3 release of the Thinkwise Platform features a lot of additions and improvements, and a large number of feature requests and tickets have been addressed.

2021.2

· 34 min read

The 2021.2 release of the Thinkwise Platform features a lot of additions and improvements, and a large number of feature requests and tickets have been addressed.

2021.1

· 38 min read

The 2021.1 release of the Thinkwise Platform features a lot of improvements and additions, and over 50 feature requests and issues have been addressed. The most important changes are listed in this post.

2020.2

· 39 min read

The 2020.2 release of the Thinkwise Platform features a lot of improvements and additions, and about 100 feature requests, ideas and issues have been addressed. The most important changes are listed in this post.

2020.1

· 19 min read

The 2020.1 release of the Thinkwise Platform features a lot of improvements and additions, and over 50 feature requests and issues have been addressed. The most important changes are listed in this post.

2019.2

· 18 min read

The 2019.2 release of the Thinkwise Platform features a lot of improvements and additions, and over 70 feature requests and issues have been addressed. The most important changes are listed in this post. A complete list of all changes can be found in the Thinkwise Community Portal.

2019.1

· 22 min read

The 2019.1 release of the Thinkwise Platform features a lot of improvements and additions, and over 100 feature requests and issues have been addressed. The most important changes are listed in this post. A complete list of all changes can be found in the Thinkwise Community Portal.

2018.3

· 18 min read

The 2018.3 release of the Thinkwise Platform features a lot of improvements and additions, and over 100 feature requests and issues have been addressed. The most important changes are listed in this post. A complete list of all changes can be found in the Thinkwise Community Portal.

2018.2

· One min read

The 2018.2 release of the Thinkwise Platform features a lot of improvements and additions. An overview of all changes can be found in the Thinkwise Community Portal.

2018.1

· One min read

Version 2018.1 of the Thinkwise Platform contains a lot of technical and functional changes. A complete list of all changes can be found in the Thinkwise Community Portal.