Skip to main content

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.

Upgrade notes

SQL Server and .NET Framework support

The Software Factory version 2020.1 will no longer officially support SQL Server 2012 and SQL Server 2014. The official minimum supported version of SQL Server will be 2016.

Version 2020.1 of the Software Factory will leverage temporal tables. This immediately brings the minimum required version of SQL Server to 2016 upon release. The Deployment Center will prevent installation or upgrade of the Software Factory to version 2020.1 when the SQL Server version is below 2016 or the database compatibility of the Software Factory database is below SQL Server 2016.

The Intelligent Application Manager, Indicium service tier and the GUI's will not immediately leverage SQL Server 2016 features with the upcoming 2020.1 release. Existing products will continue to work on SQL Server 2012 and SQL Server 2014 for now.

For more information about this change, see https://community.thinkwisesoftware.com/blogs-21/end-of-sql-server-2012-2014-support-820.

The required .NET Framework support remains the same as in the 2019.2 version.

For more information about supported technologies, see the Thinkwise Lifecycle Policy.


Projects

Requirements and Design

A lot of improvements and features have been added to the Requirements and Design module.

Kanban board

The display of the Kanban board has been improved by using cards that can be dragged & dropped.

Possibility to sort in Specification module

In the following subjects in module Specification it is now possible to sort the objects:

  • business processes
  • features
  • iterations
  • requirements
  • work

You can change the order per subject by entering a Sequence no in the form. For now, it is not possible to change sequence numbers with drag and drop.

Specification review improvements

Baselines can again be defined. A baseline does not have to match the time of creation but can also be defined for an arbitrary point in time.

The baseline can be used in specification review. Stakeholders reviewing the specifications can now be configured to view the specifications at a baseline or point in time. Furthermore, specific business processes, features or iterations can now be selected for review for a stakeholder.

Comments can be added during specification review by stakeholders. Comments now have a status flow.

Work linking and history

Work can now be attributed to a certain project version. The history of any object in the model can now be viewed using Ctrl-H. When showing the history of any object throughout project versions, the related work will be shown.

Work can be distributed over project versions in advance. Planned project versions can be specified for work, and be created on demand by clicking the checkboxes.


Software Factory

New

[BREAKING CHANGE] Domain element sorting

For each domain with elements, one can choose between lexical ordering (by translation) and order by order number. Dropdowns and sorting in the grid both honor this new setting. This means it will be a breaking change for domains where both orders are different.

Best performance will be to match the order of database values with the order as defined by the order number, and then choosing to order by order number. Clients then omit the case statement from generated select SQL queries.

Automatically map process variables

Process variables are now automatically mapped on input/output parameters or columns.

![](assets/2020_1_automatically map process variables.png)

Choose upgrade type when deploying your end product

It is now possible to choose if the deployment package should perform a full upgrade or a smart upgrade.

Conditional layout for disabled program objects

It can occur that a program object is not enabled, but does have an template assignment because of the control procedure code. In this case the program object will be highlighted red, in the same way as with Static assignments.

Continue on error during code group execution

The developer is now presented with three options when an error occurs during code group execution in the generator.

The option to continue execution of the code group causing the error has been added. When chosen, code execution will continue with the next statement.

Skipping the code group which caused the error and aborting execution will work the same as before.

Data conversion: columns

You can now also find an overview of all the (changed) columns in Data conversion. These columns are not in the context of a table.

Disable a task when no row is selected: setup for SF and IAM

It is now to possible to specify that a table task should be hidden when there is no data shown in the screen. This can occur when there really is no data present or when a (pre)filter has no data for output. This way, no functionality needs to be written in a context procedure to hide the task for the table.

For this reason, the following validation has also been added in the GUI definitions group: Task without linked parameters is disabled for table when screen is empty.

OpenID configuration

OpenID can be configured in IAM. OpenID allows you to use an existing account to sign in to multiple websites, without needing to create new passwords. These websites can be configured in OpenID clients.

You may choose to associate information with your OpenID that can be shared with the websites you visit, such as a name or email address. With OpenID, you control how much of that information is shared with the websites you visit. This information can be set as OpenID resources.

With OpenID, your password is only given to IAM, IAM then confirms your identity to the websites you visit. Other than IAM, no website ever sees your password, so you don’t need to worry about an unscrupulous or insecure website compromising your identity.

Set Control Procedure status from Review back to Development

A new task has been added to the functionality screen that changes the status of control procedures in review back to development. This allows for canceling the review status when more development is needed. The changelog and any comments will still be available.

System flow scheduling - SF

The execution of process flows can be planned. Multiple schedules for a process flow can be defined in the Software Factory. These are then synchronized to the Intelligent Application Manager where the application manager can choose the desired schedule. Indicium then asks IAM which process flows are planned to be executed. Because the execution is done by Indicium, the process flow may not contain any user actions, since no user interface is used. In the Software Factory there are validations to prevent this or other faulty model settings, for example there may not be multiple start nodes in the flow.

Task and subroutine description

Added a description field for tasks and subroutines.

Task to switch assignment for a control procedure

Two tasks have been created to switch the assignment of a control procedure:

  • Static to dynamic: control procedure code will be generated to add the program objects, program object items and program object item parameters.
  • Dynamic to static: the control procedure code will be deleted, the static assignments will be added.

When switching from static to dynamic, the control procedure code will look like this:

Temporal table support

From SF 2020.1 it is possible to set up temporal tables in the SF. Currently this is only supported for SQL Server. In the future there will be determined if this support should be expanded for DB2 and Oracle.

For this reason, the following validations have also been added in the Datamodel group: Table name is reserved for a system version table and Column name is reserved for a system version table.

Temporarily approve validations

Validation messages can now be temporarily approved. This can be done for the whole branch or the next project version.

Unit test triggers

Unit Test has been expanded with the possibility to test triggers. Triggers can be tested for insert, update and delete. The input values are used to set the input for the insert and update and the row filter values are used in the where clause. The Unit Test is performed within a transaction and end with a rollback after the unit test has been performed. Within this transaction, an assertion query can be performed to check whether the trigger has done what it was supposed to do. When creating a Unit Test for triggers, an example assertion query is shown by default.

Changed

  • Default value of conditions for prefilter columns and conditional layout conditions - Prefilter columns have now a default condition that is equal to instead of contains. This is because equal to is faster than contains (which will result in a like). The same applies for conditional layout conditions for tasks, reports and tables.
  • Description when copying a project version - It is now possible to directly fill the project version description when using the Copy project version task, which saves a lot of unnecessary clicks after the project version has been copied.
  • Default height for HTML and RTF fields - Both HTML and RTF fields now have a standard height of 5 lines.
  • Start journal after table upgrade - The smart upgrade now turns on the journalling when at least 1 table is included in the upgrade.
  • CLR assembly creation - The CLR assembly codegroup will first completely drop all assemblies and dependencies before creating the assemblies to avoid conflicting dependencies.
  • Label and icon for form groups - With form groups, the label and icon are emptied when you uncheck the box. Similar behavior has now also been applied to the grid, and to the form and grid of the tab / task / report variant.
  • Sorting for tiles - Tiles are now sorted the same as list bar items and module items.
  • Unit test - Create unit test in functionality modeler - Unit Tests can be created in the functionality modeler. Because the control procedure templates can be assigned to multiple program objects the Unit Test will be linked with the control procedure id. A Unit Test can be bound to every program object in the model, not just the assigned program objects.
  • Unit test - Show message for aborted unit tests - When a unit test is aborted due a error and this was not expected or when a unit test is not aborted while this was expected, a message is thrown to let the developer know whats wrong with the unit test execution.

Fixed

  • Auto copy domain properties - Fixed domain properties not getting copied correctly for task and report parameters when the domain id was autofilled.
  • Data anonimyzation is incorrect with multiple unique items - Fixed a situation where data anonymization would incorrectly assume the chosen data set had enough unique values when the table contained a unique constraint on one or more of the columns.
  • File storage in base projects - Configuring file storage in a base project will now copy that configuration to all linked projects.
  • Comparisment always shows branch and merge - In merge sessions a Comparison tab page is shown. In some cases this tab page would show a base or snapshot version instead of the trunk or the branch. Now the trunk and the branch version are always shown.
  • Conversion errors in Anonymize data - Conversion errors in Anonymize data task are now solved
  • Performance of synchronization to IAM script - Formatted the XML in the sync script so that each row is 1 block, and every value in that row begins on a new line. The script opens quickly again and is a lot more readable.
  • Synchronization host - Only when the host cannot be retrieved from the sync history, and the field is empty in the task, the host from the default runtime configuration will be used. It is now no longer incorrectly overwritten.
  • Unit test fixes - The following fixed have been made:
    • Button types can be used with unit test.
    • Task parameters can be defined and not be used by the task (stored procedure) itself. These parameters should not be used when executing the stored procedure.
    • The return values for BIT datatypes or converted from false and true to 0 or 1 for consistency.
    • Numeric values are no longer rounded to a int when using mock data.
    • Expected messages should not be deleted when the message is deleted.

Intelligent Application Manager

New

Delete user group user

A task is created to remove the link between users and user groups:

  • From user group perspective: remove multiple users from the user group
  • From user perspective: remove the user from multiple user groups

Application preferences in IAM

The concept of application preferences has been introduced. It is now possible to hide columns, task parameters and report parameters application wide. This therefore applies to all users in all user groups.

System flow scheduling - IAM

When a process flow consists only of actions that do not require user input, Indicium can perform this itself. We call this a system flow. For system flows, one or more schedules can be made in the Software Factory. The application manager can set in IAM which schedule is active for a system flow. Indicium retrieves this schedule and executes the desired system flow.

Changed

  • Innovation fee report end date selection and extra info - The user can now pick an end date, and extra info (amount of current active users) is added to the report.

Fixed

No fixes were made for IAM.


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

SF - From tableSF - To table
-future_project
-future_project_vrs
-specification_baseline
-unit_test_col_filter
-unit_test_type
-unit_test_type_fixed_parmtr
-unit_test_type_object
-usr_business_process
-usr_feature
-usr_iteration
-validation_msg_approved_branch
-validation_msg_approved_project_vrs
printer_type-

Column changes

SF - From tableSF - From columnSF - To tableSF - To column
business_process-business_processorder_no
business_process_comment-business_process_commentcomment_status
business_process_comment-business_process_commentpoint_in_time
dom-domsort_order_elemnt
execution_run-execution_runupgrade_method
feature-featureorder_no
iteration-iterationorder_no
printerprinter_type_idprinter-
process_flow-process_flowdefault_schedule_id
project_vrs-project_vrsprevious_project_id
project_vrs-project_vrsprevious_project_vrs_id
requirement-requirementorder_no
requirement-requirementorder_no_in_business_process
requirement-requirementorder_no_in_feature
requirement-requirementorder_no_in_iteration
requirement_comment-requirement_commentcomment_status
requirement_comment-requirement_commentpoint_in_time
role_taballow_dragging_fields_grantedrole_tabdragging_fields_granted
subroutine-subroutinesubroutine_desc
tab-tabuse_system_versioning
tab_task-tab_taskenable_tab_task_when_empty
task-tasktask_desc
unit_test-unit_testtype_of_object
unit_testprog_object_idunit_test-
unit_testobject_idunit_test-
unit_testprog_object_type_idunit_testunit_test_type_id
unit_test_col_inputprog_object_idunit_test_col_input-
unit_test_col_inputobject_idunit_test_col_input-
unit_test_col_outputprog_object_idunit_test_col_output-
unit_test_col_outputobject_idunit_test_col_output-
unit_test_col_typeprog_object_idunit_test_col_type-
unit_test_col_typeobject_idunit_test_col_type-
unit_test_data_setprog_object_idunit_test_data_set-
unit_test_fixed_parmtr_inputprog_object_idunit_test_fixed_parmtr_input-
unit_test_fixed_parmtr_outputprog_object_idunit_test_fixed_parmtr_output-
unit_test_msgprog_object_idunit_test_msg-
unit_test_process_step_inputprog_object_idunit_test_process_step_input-
unit_test_process_step_inputobject_idunit_test_process_step_input-
unit_test_process_step_outputprog_object_idunit_test_process_step_output-
unit_test_process_step_outputobject_idunit_test_process_step_output-
unit_test_process_variable_inputprog_object_idunit_test_process_variable_input-
unit_test_process_variable_inputobject_idunit_test_process_variable_input-
unit_test_process_variable_outputprog_object_idunit_test_process_variable_output-
unit_test_process_variable_outputobject_idunit_test_process_variable_output-
unit_test_ref_outputprog_object_idunit_test_ref_output-
unit_test_ref_outputobject_idunit_test_ref_output-
unit_test_report_parmtr_inputprog_object_idunit_test_report_parmtr_input-
unit_test_report_parmtr_inputobject_idunit_test_report_parmtr_input-
unit_test_report_parmtr_outputprog_object_idunit_test_report_parmtr_output-
unit_test_report_parmtr_outputobject_idunit_test_report_parmtr_output-
unit_test_report_parmtr_typeprog_object_idunit_test_report_parmtr_type-
unit_test_report_parmtr_typeobject_idunit_test_report_parmtr_type-
unit_test_resultprog_object_idunit_test_result-
unit_test_result_assertionprog_object_idunit_test_result_assertion-
unit_test_result_mismatchprog_object_idunit_test_result_mismatch-
unit_test_result_msgprog_object_idunit_test_result_msg-
unit_test_result_msgmsgunit_test_result_msgactual_msg
unit_test_result_parmtrprog_object_idunit_test_result_parmtr-
unit_test_result_parmtr_typeprog_object_idunit_test_result_parmtr_type-
unit_test_tab_report_outputprog_object_idunit_test_tab_report_output-
unit_test_tab_report_outputobject_idunit_test_tab_report_output-
unit_test_tab_task_outputprog_object_idunit_test_tab_task_output-
unit_test_tab_task_outputobject_idunit_test_tab_task_output-
unit_test_task_parmtr_inputprog_object_idunit_test_task_parmtr_input-
unit_test_task_parmtr_inputobject_idunit_test_task_parmtr_input-
unit_test_task_parmtr_outputprog_object_idunit_test_task_parmtr_output-
unit_test_task_parmtr_outputobject_idunit_test_task_parmtr_output-
unit_test_task_parmtr_typeprog_object_idunit_test_task_parmtr_type-
unit_test_task_parmtr_typeobject_idunit_test_task_parmtr_type-
usr-usruse_specification_authorization
usr-usrspecification_point_in_time
work-workorder_no
work-workorder_no_in_requirement
work-workorder_no_in_business_process
work-workorder_no_in_feature
work-workorder_no_in_iteration
work-workplanned_project_id
work-workplanned_project_vrs_id
work_comment-work_commentcomment_status
work_comment-work_commentpoint_in_time
work_log-work_logplanned_project_id
work_log-work_logplanned_project_vrs_id
work_status-work_statusinactive

Changes Intelligent Application Manager

Table changes

IAM - From tableIAM - To table
-gui_appl_pref_col
-gui_appl_pref_report_parmtr
-gui_appl_pref_task_parmtr
-iam_process_flow
-openid_client
-openid_client_default_resource_transl
-openid_client_post_logout_redirect
-openid_client_redirect
-openid_client_resource
-openid_client_secret
-openid_resource
-openid_resource_claim
-openid_resource_claim_value_usr
-openid_resource_claim_value_usr_grp
-openid_resource_transl
-process_flow_schedule
-process_flow_schedule_log
process_flowsf_process_flow
process_flow_schedule-
process_flow_schedule_log-

Column changes

IAM - From tableIAM - From columnIAM - To tableIAM - To column
elemnt-elemntsort_order_elemnt
role_taballow_dragging_fields_grantedrole_tabdragging_fields_granted
tab_task-tab_taskenable_tab_task_when_empty
usr_grp-usr_grpusr_grp_resource_claim_priority