<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.onqpr.com/pa/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=TeeHiet</id>
	<title>QPR ProcessAnalyzer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.onqpr.com/pa/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=TeeHiet"/>
	<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php/Special:Contributions/TeeHiet"/>
	<updated>2026-06-29T18:57:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Release_Notes&amp;diff=28548</id>
		<title>QPR ProcessAnalyzer Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Release_Notes&amp;diff=28548"/>
		<updated>2026-06-17T14:26:40Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all new features and fixed issues for each QPR ProcessAnalyzer release.&lt;br /&gt;
&lt;br /&gt;
==Next Release: QPR ProcessAnalyzer 2026.5 (release during the week starting 22 June)==&lt;br /&gt;
[[Next_Release_Roadmap|See roadmap for next release features and fixes]]&lt;br /&gt;
&lt;br /&gt;
==Current Release: QPR ProcessAnalyzer 2026.4 (build 10956) (released 20.5.2026)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2026_4.pdf QPR_ProcessAnalyzer_2026_4.pdf]&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* [[QPR_ProcessAnalyzer_BPMN_Editor#Opening_and_Saving_a_Diagram_in_the_Repository|BPMN diagrams stored in QPR EnterpriseArchitect]] can be opened and saved in QPR ProcessAnalyzer BPMN editor for conformance analysis. (B-09041)&lt;br /&gt;
* Added setting [[PA_Configuration_database_table#:~:text=AIAgentDefaultModelName|AIAgentDefaultModelName]] to define AI Agent&#039;s default LLM in dashboards, and updated &amp;quot;gpt-5.4&amp;quot; as default when OpenAIDefaultModelName setting is not defined. (B-09039)&lt;br /&gt;
* Implemented OAuth refresh tokens grace period, and limited MCP tool names to 50 characters. (B-09090)&lt;br /&gt;
* In object-centric flowchart, [[Object-Centric_Flowchart#Object-centric_flowchart_general_settings|object types can be hidden and shown]] with an toggle button, and flowchart flow routing has been improved to avoid label overlapping. (B-09042)&lt;br /&gt;
* [[QPR_ProcessAnalyzer_Table|Table]] header margins have been adjusted to fit more text, and column filter menu icon is shown only when hovering header. (B-09032)&lt;br /&gt;
* Expression language API is available to move filters to different model, and added functions [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#:~:text=CreateScript|CreateScript]] for project, and [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Script|Modify]] and [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Script|DeletePermanently]] for script objects. (B-09006)&lt;br /&gt;
* Datatables foreign keys are maintained consistent when datatable columns are renamed and deleted, and datatables are renamed, moved and deleted. (B-09035)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Listing scripts was slow when there were lot of script and operation logs. (D-14875)&lt;br /&gt;
* Error message returned from MCP tool call includes now actual exception message. (D-14870)&lt;br /&gt;
* Filtering Case and Event attribute profiling presets with decimal type of attributes didn&#039;t work in Snowflake models. (D-14866)&lt;br /&gt;
* Fixed issue where AI Agent did not provide any response for an eventlog with zero cases. (D-14835)&lt;br /&gt;
* Variation filter showed &amp;quot;undefined&amp;quot; in place of the variation order number when filtered variations were not in the eventlog. (D-14857)&lt;br /&gt;
* Improved error message in situation when model doesn&#039;t have the case or event attribute used by a chart filter. (D-14865)&lt;br /&gt;
* Improved model validation to detect when connection to the source tables in Snowflake is not valid. (D-14837)&lt;br /&gt;
* &amp;quot;Datatable with given name already exists in project&amp;quot; error message had localization missing. (D-14838)&lt;br /&gt;
&lt;br /&gt;
===Other improvements===&lt;br /&gt;
* Frontend components have been updated. (B-09063)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2026.3.1 (build 10941) (released 30.4.2026)==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* MCP tools support [[Create_MCP_Tools#MCP_Tool_Settings|input parameters, structured output]], MCP metadata, and OAuth in Windows deployments. (B-09048)&lt;br /&gt;
* MCP supports [[PA_Configuration_database_table#:~:text=ClientCredentials|OAuth client credentials flow]], refresh tokens, and rate limiting. (B-09080)&lt;br /&gt;
* [[Data_Schema_Dialog|Data schemas]] consisting of datatables and relations can be visualized and modified using ER diagrams. (B-09023)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Business calendar related model properties could not be shown in chart settings. (D-14858)&lt;br /&gt;
* Fixed unclear error when Snowflake connection string keys was removed when project was imported. (D-14833)&lt;br /&gt;
&lt;br /&gt;
===Other improvements===&lt;br /&gt;
* Backend components have been updated. (B-09064)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2026.3 (build 10933) (released 13.04.2026)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2026_3.pdf QPR_ProcessAnalyzer_2026_3.pdf]&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* QPR ProcessAnalyzer acts as [[QPR_ProcessAnalyzer_as_MCP_Server|MCP server]] supporting MCP tools implemented using scripts with OAuth and API key authentication. (B-09004)&lt;br /&gt;
* [[Object-centric_Process_Mining_Model#Configure_object-centric_model|Units for each object type]] can be specified in object-centric models. (B-08992)&lt;br /&gt;
* [[PA_Configuration_database_table#:~:text=DefaultColorPalette|Charts color palette]] can be changed globally to easily manage consistent visual layout. (B-08993)&lt;br /&gt;
* [[External_Content|External content component]] url supports tags refering to dashboard variables to show dynamically changing web page. (B-08998)&lt;br /&gt;
* [[QPR_ProcessAnalyzer_Project_Workspace#Exporting_Project|Project export and import]] using files support public filters stored in models. (B-09007)&lt;br /&gt;
* [[QPR_ProcessAnalyzer_KPI_Card|KPI Card]] shows null value label when data has no rows, and table and chart show &amp;quot;No data&amp;quot; message. (B-08999)&lt;br /&gt;
* [[QPR_MEA_Integration|QPR MEA web service]] operations can be called using QPR ProcessAnalyzer expression language. (B-09030)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Flowchart had flows missing if shown flows were beyond the top-500 flows. (D-14848)&lt;br /&gt;
* Expression filter rules with greater/less than criteria were incorrectly applied as equal filters when editing chart filters. (D-14852)&lt;br /&gt;
* Table column filter dialog was not entire visible in narrow table located in the bottom of screen. (D-14783)&lt;br /&gt;
* Opening Scripts tab in Workspace was slow when there were scripts with long script log. (D-14670)&lt;br /&gt;
* Fixed issue where object-centric model queries sometimes gave inconsistent results. (D-14854)&lt;br /&gt;
* Snowflake query gave &amp;quot;invalid identifier&amp;quot; error when there were two measures with same cases going though event measure filter. (D-14845)&lt;br /&gt;
* Filter rules drag-and-drop didn&#039;t work between expressions in the same chart. (D-14850)&lt;br /&gt;
* Better error message is shown when invalid value is specified to dashboard aspect ratio flex, chart margin, dashboard margin, external content border width, or external content border corner radius. (D-14805)&lt;br /&gt;
* Improved error message when object-centric model perspective doesn&#039;t have the object type correctly defined. (D-14795)&lt;br /&gt;
* Reduced project properties dialog minimum height to fit for smaller screens. (D-14834)&lt;br /&gt;
* Updated NLTK to version 3.9.3. (D-14829)&lt;br /&gt;
&lt;br /&gt;
* Frontend components have been updated. (B-09028)&lt;br /&gt;
* Backend components have been updated. (B-09027)&lt;br /&gt;
&lt;br /&gt;
==Additional release for QPR ProcessAnalyzer 2026.2 (build 10910) (released 16.3.2026)==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* Filters report in System reports shows also other users&#039; private filters for admins. (B-09017)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Filter rules were lost when saving a filter with &amp;quot;Cases with specific events&amp;quot;, &amp;quot;Cases starting with&amp;quot; or &amp;quot;Cases ending to&amp;quot; rules. (D-14847)&lt;br /&gt;
* Fixed issue where object-centric models sometimes gave &amp;quot;Object &amp;lt;cachetablename&amp;gt; does not exist or not authorized&amp;quot; error. (D-14797)&lt;br /&gt;
* ExtractSap function didn&#039;t work with QPR ScriptLauncher when using secret for storing SAP password. (D-14813)&lt;br /&gt;
* Variation stepper incorrectly skipped steps when going down when variation count is maximum. (D-14844)&lt;br /&gt;
* Improved error message when creating model from filter fails. (D-14811)&lt;br /&gt;
* System dashboard names were incorrectly translated twice. (D-14841)&lt;br /&gt;
* AI Assistant had one translation missing. (D-14840)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2026.2 (build 10897) (released 2026-02-26)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2026_2.pdf QPR_ProcessAnalyzer_2026_2.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
Snowflake user-defined functions (UDF) used by QPR ProcessAnalyzer have been updated to use Python 3.13. Some of the old versions of the functions use Python 3.9 which has been deprecated by Snowflake. Although the old versions are not anymore used by QPR ProcessAnalyzer, they are not automatically deleted and thus Snowflake may send notifications about existing deprecated functions. It&#039;s recommended to remove the old functions which are following:&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES_V2&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES_V3&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES_V4&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES_V5&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES_V6&lt;br /&gt;
* QPRPA_UDF_BPMN_CONFORMANCE_VIOLATIONS_FLOWS&lt;br /&gt;
* QPRPA_UDF_BPMN_CONFORMANCE_VIOLATIONS_FLOWS_V2&lt;br /&gt;
* QPRPA_UDF_BPMN_CONFORMANCE_VIOLATIONS_FLOWS_V3&lt;br /&gt;
* QPRPA_UDF_BPMN_IS_CONFORMANT&lt;br /&gt;
* QPRPA_UDF_BPMN_IS_CONFORMANT_V2&lt;br /&gt;
* QPRPA_UDF_BPMN_IS_CONFORMANT_V3&lt;br /&gt;
* QPRPA_UDTF_CLUSTER&lt;br /&gt;
* QPRPA_UDTF_CLUSTER_V2&lt;br /&gt;
* QPRPA_UDTF_CLUSTER_V3&lt;br /&gt;
* QPRPA_UDTF_CLUSTER_V4&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* Fully conformant [[QPR_ProcessAnalyzer_BPMN_Editor#Auto-creating_BPMN_Diagram_from_Eventlog|BPMN diagrams]] can be created from eventlogs with proper layout and identifying exclusive and parallel gateways. (B-08900)&lt;br /&gt;
* [[Object-Centric_Flowchart|Object-centric flowchart]] flows visibility can be controlled with a stepper based on top variations, and start and end symbols can be hidden for each event type. (B-08987)&lt;br /&gt;
* Added preset for object-centric flowchart, and improved Process Discovery dashboard usage for object-centric models. (B-08863)&lt;br /&gt;
* Viewer users can [[Filtering_in_QPR_ProcessAnalyzer#Saving_filters|save private filters]] for personal use. (B-08920)&lt;br /&gt;
* [[Chart_On-screen_Settings|On-screen settings]] support static and dynamic case/event attribute values selection, and [[Chart_Linked_Settings|linked settings]] can bind to on-screen settings. (B-08814)&lt;br /&gt;
* [[AI_Root_Causes|AI root causes analysis]] related error situations are easier to resolve with easier to understand error messages. (B-08997)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Histogram chart did not show at all and gave a JavaScript error. (D-14801)&lt;br /&gt;
* When chart with multiple series was sorted by measure, some datapoints were not shown when visible X-axis was limited by zooming or Custom layout settings. (D-14793)&lt;br /&gt;
* Disabled filter rules were incorrectly applied for the shown items in the filter rule editing dialog. (D-14791)&lt;br /&gt;
* If there were more than one Range filter components in dashboard, periods menu incorrectly affected all of them. (D-14818)&lt;br /&gt;
* List of event types in object-centric flowchart settings didn&#039;t open if there were object types linked to none events. (D-14798)&lt;br /&gt;
* Snowflake flowchart root causes analysis gave &amp;quot;SQL compilation error&amp;quot; when run with case duration criteria. (D-14790)&lt;br /&gt;
* Term &amp;quot;Second&amp;quot; when meaning time unit was translated incorrectly in French. (D-14803)&lt;br /&gt;
* OpenTelemetry metrics were not sent to Prometheus correctly. (D-14804)&lt;br /&gt;
* Opening script editor by url didn&#039;t show project path and also javascript error appeared to console. (D-14794)&lt;br /&gt;
* Fixed issue where case attribute prediction failed when using more than one iteration. (D-14789)&lt;br /&gt;
* SQLDataFrame with several append operations had performance issue. (D-14772)&lt;br /&gt;
* Null coalescing operators didn&#039;t work correctly in chaining in expression language. (D-14762)&lt;br /&gt;
* Native app could not call procedure if project referred to other database and schema. (D-14749)&lt;br /&gt;
* Trying to create script with duplicate name gave unclear error: Cannot insert duplicate key row in object &#039;dbo.PA_SCRIPT&#039; with unique index &#039;PA_SCRIPT_UNIQUE_NAME_IN_PROJECT&#039;. (D-14784)&lt;br /&gt;
* BPMN editor popup menu was partly hidden behind other chart components. (D-14345)&lt;br /&gt;
* When going to context menu report from BPMN editor, &amp;quot;Operation was cancelled by a user&amp;quot; was given when query was in progress. (D-14807)&lt;br /&gt;
* BPMN editor tooltips measure descriptions didn&#039;t disappear at all. (D-14809)&lt;br /&gt;
* Presets benchmarking didn&#039;t work for models without case attributes. (D-14822)&lt;br /&gt;
* Object-centric filter rule editor gave javascript error when opened for case-centric model. (D-14799)&lt;br /&gt;
* Object-centric filter rule could incorrectly be dropped as root causes comparison rule. (D-14796)&lt;br /&gt;
* Localization missing for &amp;quot;Save as new filter&amp;quot; button. (D-14839)&lt;br /&gt;
&lt;br /&gt;
===Other improvements===&lt;br /&gt;
* SQL queries run in Snowflake have been further optimized. (B-08936)&lt;br /&gt;
* Snowflake stored procedures and user defined functions have been migrated to Python 3.13. (B-08984)&lt;br /&gt;
* Frontend components have been updated. (B-08991)&lt;br /&gt;
* Backend components have been updated. (B-08990)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2026.1 (build 10870) (released 2026-01-19)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2026_1.pdf QPR_ProcessAnalyzer_2026_1.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
QPR ProcessAnalyzer Server and QPR ScriptLauncher are running on .NET 10, replacing the previous .NET 8 version. When updating to this release, make sure to install the .NET 10 Runtime ([[Updating_QPR_ProcessAnalyzer_Server|update instructions]]). While .NET 8 and .NET 10 can run side by side, .NET 8 does not need to be removed immediately. However, for security reasons, any unused .NET 8 installation should be uninstalled as soon as possible after the update.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
Known issue: The histogram visualization doesn&#039;t work in this release. The issue will be fixed in the next release. Possible workaround is to use the column chart where to set no spacing between columns. This can be configured with the following [[QPR_ProcessAnalyzer_Chart#:~:text=Custom%20Layout|Custom Layout]] settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;plotOptions&amp;quot;: {&lt;br /&gt;
		&amp;quot;series&amp;quot;: {&lt;br /&gt;
			&amp;quot;pointPadding&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;groupPadding&amp;quot;: 0&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
*Object-centric models support versatile [[Filtering_in_QPR_ProcessAnalyzer|object-centric filters]] based on case-centric filter rules using perspective. (B-08595)&lt;br /&gt;
*[[AI_Root_Causes|AI Root Causes analysis]] is shown in a hierarchy for easier readability. (B-08921)&lt;br /&gt;
*[[Process_Flowchart|Case-centric flowchart]] performance has been improved by making all queries simultaneously. (B-08916)&lt;br /&gt;
* Object counts indicator is hidden for object-centric models when perspective is not set. (B-08825)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Filter to exclude case attribute values incorrectly excluded null values even if null wasn&#039;t selected. (D-14773)&lt;br /&gt;
*Prediction generated invalid models where case IDs in events datatable didn&#039;t exist in cases datatable. (D-14758)&lt;br /&gt;
* AI Root Causes presets didn&#039;t work with models without case attributes. (D-14759)&lt;br /&gt;
* Snowflake query with multiple columns with aggregations and Coalesce function gave &amp;quot;invalid identifier&amp;quot; error. (D-14763)&lt;br /&gt;
*Dropdown list to add business calendar holidays from other model shows empty items. (D-14786)&lt;br /&gt;
*In-memory Average function didn&#039;t work when aggregating dates using model&#039;s Attribute function. (D-14761)&lt;br /&gt;
*Sometimes opening models list gave error &amp;quot;User doesn&#039;t have permission GenericRead to model&amp;quot;. (D-14742)&lt;br /&gt;
&lt;br /&gt;
===Other improvements=== &lt;br /&gt;
*[[QPR_ProcessAnalyzer_Security_Hardening#Added_HTTP_Headers|Content-security-policy]] img-src blob: directive has been restored for Highcharts image export. (B-08904)&lt;br /&gt;
*Backend components have been updated [[Updating_QPR_ProcessAnalyzer_Server|including .NET 10]]. (B-08926)&lt;br /&gt;
*Frontend components have been updated. (B-08927)&lt;br /&gt;
&lt;br /&gt;
==Additional release for QPR ProcessAnalyzer 2025.7 (build 10845) (released 2025-12-11)==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
*QPR ProcessAnalyzer can be deployed on-premise using [[Deploy_QPR_ProcessAnalyzer_from_Container|Linux containers]]. (B-08915)&lt;br /&gt;
*Snowflake SQL queries have been simplified to improve performance, e.g., when quering flows. (B-08901)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues=== &lt;br /&gt;
*ODBC and Loading script models, and models with calculated attributes didn&#039;t allow to create or modify case and event attribute filters from header. (D-14751)&lt;br /&gt;
*Fixed incompatibility issue when using Keycloak as identity provider for SAML authentication. (D-14757)&lt;br /&gt;
*System report for users incorrectly listed some users with read-only permissions as Developers (issue with the EffectivePermissionTypesFor function). (D-14748)&lt;br /&gt;
*Referrer-Policy HTTP header was incorrectly set to &amp;quot;same-origins&amp;quot; causing browser console error in Windows deployments. (D-14736)&lt;br /&gt;
*Fixed issue where QPR ProcessAnalyzer request ID was not added to Snowflake data modification queries. (D-14728)&lt;br /&gt;
*Login request duration was incorrectly shown as zero or negative in System reports. (D-14737)&lt;br /&gt;
*In chart settings, some Snowflake measures with aggregations were missing possibility to define percentile value. (D-14276)&lt;br /&gt;
*Fixed issue where it was not possible to delete a model with same name in the same project during the same session. (D-14708)&lt;br /&gt;
*Script editor to specific script can now be opened with a direct url containing the script_editor parameter. (D-14745)&lt;br /&gt;
*Fixed issue were sometimes an incorrect error code was given for a cancelled query. (D-14755)&lt;br /&gt;
*Improved error message if model loading fails when loading script returns incorrect type of data. (D-14637)&lt;br /&gt;
*Fixed issue where variations query with sampling was slow for new models. (D-14729)&lt;br /&gt;
*Added tooltip to gantt chart&#039;s table layout header so that the header text can be fully seen. (D-13748)&lt;br /&gt;
*Switching between Snowflake and in-memory chart by adjusting chart configuration json caused some items in chart settings to appear twice. (D-14667)&lt;br /&gt;
*Selecting model in dashboard when previously there was no model selected and going back to Workspace, gave error message. (D-14735)&lt;br /&gt;
*Query Designer gave untranslated error message: &amp;quot;You don&#039;t have permissions to model ...&amp;quot;. (D-14727)&lt;br /&gt;
*Query Designer gave untranslated error message &amp;quot;Unable to use Snowflake tables as data source for in-memory query&amp;quot;. (D-14683)&lt;br /&gt;
*In Query Designer, table column menu gave JavaScript error for columns where first row was null. (D-14684)&lt;br /&gt;
*Query Designer incorrectly gave message &amp;quot;There are no columns in the data&amp;quot; when the data had no rows. (D-14692)&lt;br /&gt;
*Fixed issue in Manage Users dialog where row selections disappeared when resizing the dialog. (D-14647)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2025.7 (build 10821) (released 2025-11-13)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2025_7.pdf QPR_ProcessAnalyzer_2025_7.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
Known issue: Creating case and event attribute filters in dashboards is not possible from the main header for the following types of in-memory models and attributes:&lt;br /&gt;
*Any attributes for [[QPR_ProcessAnalyzer_Model_Datasources#ODBC_Datasource|ODBC loaded models]]&lt;br /&gt;
*Any attributes for [[QPR_ProcessAnalyzer_Model_Datasources#Loading_Script|Loading script models]]&lt;br /&gt;
*Calculated attributes in any in-memory models.&lt;br /&gt;
&lt;br /&gt;
Workaround is to create the filter rule in a chart&#039;s settings and drag-and-drop it to the header. The issue has been fixed by the next release (D-14751). The issue does not concern Snowflake models.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New features ===&lt;br /&gt;
*Presets added for [[AI_Root_Causes|AI Root Causes analysis]] based on Snowflake Top Insights which is a decision tree model finding combinations of root cause contributors. (B-08889)&lt;br /&gt;
*Added new [[Range_Filter|filter selector]] component to dashboards to easily create date and number range filters. (B-08877)&lt;br /&gt;
*Projects can be browsed in the [[Navigation_Menu|navigation menu]] to access all dashboards, and also organized the menu into two columns. (B-08708)&lt;br /&gt;
*When QPR ProcessAnalyzer is [[Embed_to_Website|embedded to a website]], SAML authentication is performed in a separate window for more robust operation. (B-08871)&lt;br /&gt;
*For more flexible options, [[AI_Agent|AI Agents]] runs the language model query using the Snowflake account where the selected model is located. (B-08860)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
*If DefaultUiLanguage in PA_CONFIGURATION table was not defined, users who haven&#039;t changed language could not login. (D-14706)&lt;br /&gt;
*Improved performance in opening dashboard. (D-14705)&lt;br /&gt;
* Snowflake Native App didn&#039;t show the version number and build timestamp correctly. (D-14703)&lt;br /&gt;
*Snowflake Native App activation failed with a custom compute pool if container service was in the suspended state. (D-14722)&lt;br /&gt;
*Server stuck when trying to generate SQL for SqlDataFrame having multiple columns with the same name. (D-14730)&lt;br /&gt;
*In eventlog prediction, fixed issues preventing the usage of case attribute value prediction. (D-14702)&lt;br /&gt;
*Snowflake DurationBetweenDates function calculated incorrectly when used in a in divisor. (D-14723)&lt;br /&gt;
* Import now succeeds when importing Snowflake datatables refering to data without access. (D-14694)&lt;br /&gt;
*Fixed incorrect color in table column filters, and Workspace loading time has been improved. (D-14704)&lt;br /&gt;
* Fixed issue where dropdown list with projects showed &amp;quot;undefined&amp;quot; in place of project id. (D-14659)&lt;br /&gt;
*Fixed issue where specifying a secret name longer than 440 characters, prevented saving the secret and resulted in an error. (D-14674)&lt;br /&gt;
* SAML authentication failed when it needed to create a new user to QPR ProcessAnalyzer. (D-14717)&lt;br /&gt;
* Fixed issue where SQL dataframe queries didn&#039;t work if the root expression ended to a semicolon. (D-14714)&lt;br /&gt;
*Specific Snowflake query with a comparison criteria, AggregateFrom and GetValueFrom functions gave error about invalid identifier. (D-14718)&lt;br /&gt;
&lt;br /&gt;
===Other improvements=== &lt;br /&gt;
*[[QPR_ProcessAnalyzer_Security_Hardening#HTTP_Response_Headers|Content-Security-Policy HTTP header]] has been reduced to more secure by removing the script-src &#039;unsafe-eval&#039; and img-src &#039;blob&#039; directives. (B-08897)&lt;br /&gt;
*Added [[QPR_ProcessAnalyzer_Security_Hardening#HTTP_Response_Headers|security related HTTP headers]]: X-Permitted-Cross-Domain-Policies, Cross-Origin-Embedder-Policy, Cross-Origin-Opener-Policy, Cross-Origin-Resource-Policy, Referrer-Policy, and Permissions-Policy. (B-08879)&lt;br /&gt;
*Implemented backend support for Snowflake Top Insights for [[SqlDataFrame_in_Expression_Language#:~:text=TopInsights|AI root causes analysis]]. (B-08664)&lt;br /&gt;
*Implemented improved error handling when trying to save too long text to database. (B-08892)&lt;br /&gt;
*For more understandable error messages, error handling and error message generation have been refactored. (B-08754)&lt;br /&gt;
*Optimized database queries and reduced log writing. (B-08870)&lt;br /&gt;
*Frontend components have been updated. (B-08899)&lt;br /&gt;
*Backend components have been updated. (B-08898)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2025.6 (build 10690) (released 2025-10-01)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2025_6.pdf QPR_ProcessAnalyzer_2025_6.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
Known issue: If the [[PA_Configuration_database_table#:~:text=DefaultUiLanguage|DefaultUiLanguage]] system configuration is not defined, users who haven&#039;t changed their own language, are unable to login. To prevent this problem, please ensure the DefaultUiLanguage is defined. The next release has fixed this issue (D-14706).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
Content-Security-Policy (CSP) HTTP header has been updated to enhance security by implementing more restrictive settings. The following directives have been added:&lt;br /&gt;
*object-src &#039;none&#039;&lt;br /&gt;
*frame-ancestors &#039;self&#039;&lt;br /&gt;
*form-action &#039;none&#039;&lt;br /&gt;
*base-uri &#039;none&#039;&lt;br /&gt;
*worker-src blob:&lt;br /&gt;
&lt;br /&gt;
These new restrictions may affect usage that has previously been possible. For example, with the new settings, QPR ProcessAnalyzer can be embedded to a website only within the same origin. For detailed instructions on embedding QPR ProcessAnalyzer on a different website, please refer to [[Embed_to_Website|this quide]]. Additionally, for information on modifying the CSP settings, see documentation for [[QPR_ProcessAnalyzer_Security_Hardening#HTTP_Response_Headers|security hardening]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
In the QPR ProcessAnalyzer 2025.6 Native App, the release version number is not displayed correctly in the User Settings dialog. This omission does not have any other complications. QPR ProcessAnalyzer 2025.6 is the only release with this issue, making it possible to identify this release despite the missing version number. This issue is specific to the Native App only. The next release has fixed this issue (D-14703).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
*[[Manage_Users_and_Groups#Starting_dashboard|Starting dashboard]] after login can be defined for user groups, allowing to create customized starting pages for easy navigation. (B-08791)&lt;br /&gt;
*Snowflake [[QPR_ProcessAnalyzer_Chart#Filtering_Settings|chart&#039;s event filters]] are now embedded to filters created from chart, to precisely follow chart calculation. (B-08845)&lt;br /&gt;
*Result data can be filtered in Snowflake charts using [[QPR_ProcessAnalyzer_Chart#:~:text=Result%20filtering%20expression|result filtering expression]] which works for any datasets. (B-08751)&lt;br /&gt;
*Filter rules order now stays the same when making filter selections and confirming filter. (B-08801)&lt;br /&gt;
*Added model setting [[QPR_ProcessAnalyzer_Project_Workspace#Hiding_Object_Count_Statistics|Show object count statistics]] to hide object counts information in dropdown lists to optimize performance. (B-08849)&lt;br /&gt;
*Added support for [[Chart_On-screen_Settings#:~:text=showStatistics|hiding statistics for on-screen setting]] dropdown lists to improve performance, and in addition the case ID is hidden Case/Event attribute profiling presets. (B-08840)&lt;br /&gt;
*Added following audit fields to users and groups: Created date, Created by, Last modified date, and Last modified by. (B-08792)&lt;br /&gt;
*Snowflake Native App: Added procedure to that [[QPR_ProcessAnalyzer_Native_App_in_Snowflake#Recover_administrator_access|creates administrator user to Native App]] if access to the app has been lost. Also, prevented user management operations that remove own access. (B-08733)&lt;br /&gt;
*Snowflake Native App: Added procedure to [[Change_Native_App_Compute_Pool_Size|change Native App compute pool size]]. Changed new Native Apps to use CPU_X64_S size compute pool, and improved Native App stability. (B-08859)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues=== &lt;br /&gt;
*Snowflake Cortex based AI Assistant didn&#039;t show the results table. (D-14643)&lt;br /&gt;
*When percent stacking is used, Y-axis values are now shown as percentages in data label and tooltip. (D-14633)&lt;br /&gt;
*Fixed issue where Label&amp;amp;Link component had sometimes unnecessary vertical scrollbar. (D-14685)&lt;br /&gt;
*Model validation showed incorrect error message for models with numeric duplicate case ID&#039;s. (D-14687)&lt;br /&gt;
*In Workspace, scripts &amp;quot;View current run log&amp;quot; dialog didn&#039;t update log correctly when new entries were added. (D-14662)&lt;br /&gt;
*Event type mapping in charts didn&#039;t work in object-centric models. (D-14620)&lt;br /&gt;
*Model generation didn&#039;t work as transformation step using _system.ML.ApplyTransformation function. (D-14654)&lt;br /&gt;
*Others aggregation has been removed from date type of dimensions because tables don&#039;t work with textual data in date columns. (D-14623)&lt;br /&gt;
*Fixed issue in AI Assistant where using both Snowflake Cortex and OpenAI modes caused error. (D-14646)&lt;br /&gt;
*In User Management Effective permissions table, column filter incorrectly showed &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; as options. (D-14639)&lt;br /&gt;
*Pivot table incorrectly showed &amp;quot;Numeric value is not recognized&amp;quot; error when Count or Unique count aggregations were used. (D-14559)&lt;br /&gt;
*Workspace buttons are now visible in small screens spanning to multiple lines. (D-14587)&lt;br /&gt;
*Added tooltip text to &amp;quot;Move to&amp;quot; submenu containing projects so that long project names can be seen. (D-14612)&lt;br /&gt;
*Translation was missing from error messages when deleting items from recycle bin. (D-14652)&lt;br /&gt;
*Fixed data type related issues with in-memory Floor, Ceiling and aggregation functions. (D-14622)&lt;br /&gt;
*Optimized resource loading by getting rid of unnecessary file assets/i18n/en_US.json. (D-14641)&lt;br /&gt;
*Fixed issue where opening script editor gave javascript error about content-security-policy violation. (D-14627)&lt;br /&gt;
*Fixed issue in charts showing datatable content had a strange error when datatable was not selected. (D-14650)&lt;br /&gt;
*Fixed incorrect data types in some project, user and group related measures. (D-14619)&lt;br /&gt;
* Fixed issue where moving expression scripts was not possible when SQL Scripting was not allowed. (D-14624)&lt;br /&gt;
*Deleting and renaming scripts were not available for expression scripts when SQL Scripting was not allowed. (D-14625)&lt;br /&gt;
*Improved documentation for situation when non-existing Snowflake warehouse is configured for a model. (D-14543)&lt;br /&gt;
*Project properties dialog shows a descriptive text when no secrets have been defined instead of an empty table. (D-14611)&lt;br /&gt;
* Improved messages and New project button visibility in Workspace top level when no projects are shown. (D-14609)&lt;br /&gt;
*Event preset gave error if enabling Apply with Chart Filters setting and trying to create filters. (D-14695)&lt;br /&gt;
&lt;br /&gt;
===Other improvements===&lt;br /&gt;
*Added QPR ProcessAnalyzer API request ID to Snowflake queries to easily find matching query in Snowflake query history. (B-08839)&lt;br /&gt;
*[[QPR_ProcessAnalyzer_Security_Hardening#Added_HTTP_Headers|Content Security Policy HTTP header]] includes now object-src, frame-ancestors, form-action, base-uri, and worker-src. (B-08794)&lt;br /&gt;
*Snowflake queries have been optimized by removing null and empty string checks from mapped columns as they are now handled by the model validation check. (B-08837)&lt;br /&gt;
*Added backend support for object-centric model filtering based on case-centric filter rules. (B-08836)&lt;br /&gt;
*Frontend components have been updated. (B-08851)&lt;br /&gt;
*Backend components have been updated. (B-08852)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2025.5 (build 10361) (released 2025-08-21)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2025_5.pdf QPR_ProcessAnalyzer_2025_5.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
When using Snowflake Cortex, the AI Assistant is not showing the results table in the assistant&#039;s response. This issue has been fixed by the next release.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New features===  &lt;br /&gt;
*[[Object-Centric_Flowchart|Object-centric flowchart]] can also use object-to-object relations to link events and objects simplifying event-to-object configuration. (B-08671)&lt;br /&gt;
*[[AI_Assistant_for_QPR_ProcessAnalyzer|AI Assistant]] can provide precise quantitative analysis by making queries to eventlog data (powered by Snowflake Cortex Analyst and Agents). (B-08652)&lt;br /&gt;
*[[Filtering_in_QPR_ProcessAnalyzer|Flows and variations can be filtered]] from any event attribute viewpoint in Snowflake. (B-08737)&lt;br /&gt;
* Added [[Project_Properties_Dialog|project properties dialog]] for viewing project information, changing Snowflake connection settings and project secrets. (B-08655)&lt;br /&gt;
*[[QPR_ProcessAnalyzer_Project_Workspace#Validating_Model|Model validity check]] easily detects technically invalid models and shows detailed reason for invalidity. (B-08624)&lt;br /&gt;
*Projects can be [[QPR_ProcessAnalyzer_Project_Workspace#Exporting_Project|exported]] to json files and imported as new projects. (B-08717)&lt;br /&gt;
*Action buttons can be added to dashboard by defining [[Label_and_Link|label component]] that can change dashboard variables and run scripts. (B-08694)&lt;br /&gt;
*Web user interface is available in [[Languages_and_Localization|Ukrainian language]]. (B-08734)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
*Fixed following error when performing client-side SAP import: Could not find a part of the path (QPR_ImportSource_Chunk_*.tmp). (D-14589)&lt;br /&gt;
*Fixed issue where ManageProjects permission was incorrectly required when running scripts using QPR ScriptLauncher non-legacy mode. (D-14562)&lt;br /&gt;
*Fixed following error when using SAP import from SQL script called from expression language called from SQL: The given key &#039;&#039; was not present in the dictionary. (D-14593)&lt;br /&gt;
*Some analyses didn&#039;t work, when case ID columns for cases and events datatables differed only in upper/lowercase letters. (D-14556)&lt;br /&gt;
*Business calendar didn&#039;t work for some measures/dimensions/columns and some had business calendar checkboxes missing. (D-14563)&lt;br /&gt;
*Prediction failed to following error: transformer_model_next_activity/event_year_input_embedding. (D-14551)&lt;br /&gt;
*Scripting now works correctly after rows from PA_OPERATION_STATUS table have been deleted. (D-14545)&lt;br /&gt;
*Fixed issue where case-centric flowchart was very slow for object-centric model. (D-14544)&lt;br /&gt;
*Prevented creating dashboards, models and scripts with duplicate names in the same project. (D-09480)&lt;br /&gt;
*KPI Card now shows line breaks correctly in textual values. (D-14546)&lt;br /&gt;
*Improved table Excel export for list data to show items with separator character instead of showing as JSON. (D-14479)&lt;br /&gt;
*Column showing non-conformance reason was incorrectly aligned to right. (D-14570)&lt;br /&gt;
*GetRelatedValueFrom function caused column name conflict when used multiple times in same query. (D-14591)&lt;br /&gt;
* Fixed issue where in-memory sorting for arrays gave &amp;quot;Error in sorting analysis result rows possibly due to multiple types of values ...&amp;quot;. (D-14592)&lt;br /&gt;
*Array type of values were shown incorrectly when used Last Row Aggregates Over-limit Rows setting. (D-14616)&lt;br /&gt;
*Fixed the &amp;quot;Most common&amp;quot; text aggregation sorting error for in-memory calculation. (D-14573)&lt;br /&gt;
*Snowflake model validation gave incorrect error message when mapped column didn&#039;t exist in datatable. (D-14565)&lt;br /&gt;
*Improved model validation to detect when connection string key for model or datatable does not exist. (D-14607)&lt;br /&gt;
* Model validation gave incorrect error when when events datatable case id mapping was missing. (D-14566)&lt;br /&gt;
*Model validation gave incorrect error message when cases and events datatables were in different datasources. (D-14567)&lt;br /&gt;
*Model validation gave incorrect error message when underlying Snowflake table didn&#039;t exist. (D-14568)&lt;br /&gt;
*Workspace Card/Table mode toggle buttons were not translated. (D-14547)&lt;br /&gt;
*Some invalid queries gave unexpected errors and strange outputs. (D-14569)&lt;br /&gt;
* Added translations to model notifications preview table headers. (D-14590)&lt;br /&gt;
* Added translations to access denied message for header object counts indicator. (D-13967)&lt;br /&gt;
* AI Assistant explaining charts speaks now user interface language. (D-14578)&lt;br /&gt;
* AI Agent prompt chart editor didn&#039;t show correctly if model was not selected. (D-14536)&lt;br /&gt;
*AI Assistant gave &amp;quot;Unsupported cache table type&amp;quot; error when trying to explain object-centric flowchart. (D-14477)&lt;br /&gt;
&lt;br /&gt;
===Other improvements ===&lt;br /&gt;
*When trying to open dashboard with an invalid model, the precise model validation error message is shown. (B-08629)&lt;br /&gt;
*Account locked message is now same as username/password incorrect to prevent account enumeration attack. (B-08740)&lt;br /&gt;
*Stringified value format supports also json objects. (B-08766)&lt;br /&gt;
*Event attribute used as event type can be defined for flow and variation filters in Snowflake models (backend support). (B-08705)&lt;br /&gt;
*Translations have been updated. (B-08757)&lt;br /&gt;
*Frontend components have been updated. (B-08760)&lt;br /&gt;
*Backend components have been updated. (B-08759)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2025.4 (build 9985) (released 2025-05-28)==&lt;br /&gt;
&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2025_4.pdf QPR_ProcessAnalyzer_2025_4.pdf]&lt;br /&gt;
&lt;br /&gt;
===New features ===&lt;br /&gt;
*Added new AI Agent presets analyzing current state and proposing improvements based on different viewpoints, such as Event and Case Counts, Automation, Bottlenecks, and Root Causes. (B-08710)&lt;br /&gt;
*Added a [[Filter_Selectors#Filter_selector|generic filtering component]] that can be configured for creating any type of filters for distinct values. (B-08654)&lt;br /&gt;
*Volume declining in measures due to case sampling can be compensated in chart and flowchart by using a [[Measure,_Dimension_and_Column_Settings#Statistical_calculations|Statistical calculation method]]. (B-08598)&lt;br /&gt;
*In object-centric models, Object ID, Event ID, Event timestamp, and Event type [[Object-centric_Process_Mining_Model#Object-centric_perspectives|attribute names]] are shown correctly. (B-08680)&lt;br /&gt;
*Snowflake native app has now [[QPR_ProcessAnalyzer_Native_App_in_Snowflake#User_access_to_application|application roles]] for user (for using app) and administrator (for managing app). (B-08660)&lt;br /&gt;
*For Snowflake native app, IMPORTED PRIVILEGES ON SNOWFLAKE DB privilege is removed and instead the [[QPR_ProcessAnalyzer_Native_App_in_Snowflake#Optional_privilege_for_AI_Agent|CORTEX_USER database role]] can be assigned. (B-08718)&lt;br /&gt;
*[[QPR_ProcessAnalyzer_Native_App_in_Snowflake#Logging|Native app logging]] has been improved and now sharing application logs with QPR is possible. (B-08661)&lt;br /&gt;
* Added [[DataFrame_in_Expression_Language#CsvToDataFrame|CsvToDataFrame]] function to expression language to convert textual CSV data into in-memory dataframe. (B-08246)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
*Fixed &amp;quot;Invalid identifier&amp;quot; error when opening attribute selection list for case attribute preset caused by object id columns which differed only by letter capitalization. (D-14539)&lt;br /&gt;
*When Image component is clicked in dashboard edit mode, the component is now selected instead of link followed. (D-14525)&lt;br /&gt;
*Filters created from dimensions having dimension-specific filter rules will now create expression filter rule where dimensions-specific filter is embedded, for accurately following the selection. (D-14499)&lt;br /&gt;
*Filtering variations or list of event attribute values didn&#039;t work in in-memory models. (D-14476)&lt;br /&gt;
*Fixed issue where AI Agent didn&#039;t update when dashboard variable changed used by prompt chart. (D-14537)&lt;br /&gt;
* Fixed issue where some statistical calculations inadvertently changed row order when applying in groups. (D-14495)&lt;br /&gt;
*In in-memory models, array type of data was not dimensioned correctly. (D-14518)&lt;br /&gt;
* AI Agent Process Variations preset gave &amp;quot;division by zero&amp;quot; error when there were zero cases. (D-14508)&lt;br /&gt;
*Table grouping header labels were not formatted correctly. (D-14514)&lt;br /&gt;
*Fixed Root causes analysis to work with object-centric models. (D-14515)&lt;br /&gt;
*Filtering by OcelObjectId didn&#039;t work when model didn&#039;t have object type table for perspective used in filter. (D-14522)&lt;br /&gt;
*Fixed Root causes analysis with weighting expression to work with object-centric models. (D-14517)&lt;br /&gt;
*Fixed issue where persisting query results where query is started from datatable having custom table name overwrote data in original table. (D-14528)&lt;br /&gt;
*Flowchart SVG export did not show start and end symbols. (D-12401)&lt;br /&gt;
*Fixed issue where join operation didn&#039;t find renamed columns in SqlDataFrames. (D-14512)&lt;br /&gt;
*Improved chart filtering button positions to work with small chart sizes. (D-14509)&lt;br /&gt;
*Datatable foreign key columns dictionary data type was incorrect preventing reading columns information. (D-14505)&lt;br /&gt;
*Workspace scripts editor allowed to change script code for viewer users (altough not save it). (D-14534)&lt;br /&gt;
* In chart custom sorting, trying to refer to measure that had None aggregation, caused SQL compilation error. (D-14526)&lt;br /&gt;
*Model validation check crashed when the datatables were in different datasources. (D-14502)&lt;br /&gt;
&lt;br /&gt;
===Other improvements=== &lt;br /&gt;
*Added expression language functions for using Snowflake Cortex Agents with Cortex Analyst access to query eventlogs. (B-08647)&lt;br /&gt;
*Projects can be export and imported in JSON format containing dashboards, models, datatables and scripts. (B-08613)&lt;br /&gt;
*Simplified object-centric model queries by accepting OcelObjectId as object attribute name in filters. (B-08702)&lt;br /&gt;
*Streamlined import API by removing importMode parameter and changing default fileType to CSV. (B-08704)&lt;br /&gt;
*Frontend components have been updated. (B-08695)&lt;br /&gt;
*Backend components has been updated. (B-08696)&lt;br /&gt;
&lt;br /&gt;
==Old Releases==&lt;br /&gt;
See older releases in [[QPR ProcessAnalyzer Release Archive]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category: QPR ProcessAnalyzer]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Objects_in_Expression_Language&amp;diff=28547</id>
		<title>QPR ProcessAnalyzer Objects in Expression Language</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Objects_in_Expression_Language&amp;diff=28547"/>
		<updated>2026-06-17T14:24:56Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Filter==&lt;br /&gt;
Filters contain a set of filter rules used to filter cases and events in models. Filters are objects located in the models. Filters are owned by the creator user, and when a filter publish mode is private, only the creator can use it.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Filter properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||Returns the user who created the filter.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Returns date when the filter created date.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Returns description of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Returns id of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||Returns user who modified the filter.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Returns date when the filter last modified.&lt;br /&gt;
|-&lt;br /&gt;
||Model&lt;br /&gt;
||Returns model where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ModelId (Integer)&lt;br /&gt;
||Returns model where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Returns the name of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||Project&lt;br /&gt;
||Returns project where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||Returns project id where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||PublishMode (String)&lt;br /&gt;
||Returns publish mode of the filter, one of the following: &#039;&#039;&#039;Private&#039;&#039;&#039;, &#039;&#039;&#039;Public&#039;&#039;&#039;, or &#039;&#039;&#039;Default&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||Rules (Dictionary)&lt;br /&gt;
||Returns a dictionary containing the filter rules in the filter.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Filter functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Deletes the filter permanently. To delete own filters, the &#039;&#039;&#039;Filtering&#039;&#039;&#039; permission is needed, and to delete any filters the &#039;&#039;&#039;ManageViews&#039;&#039;&#039; permission is needed.&lt;br /&gt;
|-&lt;br /&gt;
||Modify&lt;br /&gt;
||Dictionary&lt;br /&gt;
||&lt;br /&gt;
Changes the filter properties. The input parameter is a dictionary containing the filter properties to change:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the filter.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description of the filter.&lt;br /&gt;
* &#039;&#039;&#039;PublishMode&#039;&#039;&#039; (String): Privacy model of the filter rule. One of the following: &#039;&#039;Private&#039;&#039;, &#039;&#039;Public&#039;&#039;, or &#039;&#039;Default&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Rules&#039;&#039;&#039; (Dictionary): Filter rules as Dictionary ([[Filtering_in_QPR_ProcessAnalyzer_Queries|more information]]).&lt;br /&gt;
* &#039;&#039;&#039;ModelId&#039;&#039;&#039; (Integer): Id of the model where the filter is located. Changing this will move the filter into a different model.&lt;br /&gt;
&lt;br /&gt;
The function returns the updated filter object. Requires &#039;&#039;Filtering&#039;&#039; or &#039;&#039;ManageViews&#039;&#039; permission for the project depending on the owner of the filter.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FilterById(1)&lt;br /&gt;
	.Modify(#{&lt;br /&gt;
		&amp;quot;Name&amp;quot;: &amp;quot;My filter&amp;quot;,&lt;br /&gt;
		&amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
		&amp;quot;PublishMode&amp;quot;: &amp;quot;Public&amp;quot;,&lt;br /&gt;
		&amp;quot;Rules&amp;quot;: #{&lt;br /&gt;
			&amp;quot;Items&amp;quot;: [&lt;br /&gt;
				#{&lt;br /&gt;
					&amp;quot;Type&amp;quot;: &amp;quot;IncludeCases&amp;quot;,&lt;br /&gt;
					&amp;quot;Items&amp;quot;: [&lt;br /&gt;
						#{&lt;br /&gt;
							&amp;quot;Type&amp;quot;: &amp;quot;CaseAttributeValue&amp;quot;,&lt;br /&gt;
							&amp;quot;Attribute&amp;quot;: &amp;quot;Account Manager&amp;quot;,&lt;br /&gt;
							&amp;quot;StringifiedValues&amp;quot;: [&lt;br /&gt;
								&amp;quot;0Mary Wilson&amp;quot;&lt;br /&gt;
							]&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get filter id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||FilterById&lt;br /&gt;
||&lt;br /&gt;
* Filter id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns Filter object corresponding to the provided filter id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Model==&lt;br /&gt;
Notes:&lt;br /&gt;
* For in-memory models that are offline, the object counts represent the situation when the model was last time online (loaded into the memory). &#039;&#039;null&#039;&#039; is returned if the model has never been loaded into the memory.&lt;br /&gt;
* If [[Case_Level_Permissions|Case permissions]] are used for the model, and user doesn&#039;t have &#039;&#039;&#039;GenericWrite&#039;&#039;&#039; permission for the model, &#039;&#039;null&#039;&#039; is returned for data security reasons. Users that have the &#039;&#039;&#039;GenericWrite&#039;&#039;&#039; permission, see null when the model is offline, and when online, they see counts where the case level permissions settings are applied.&lt;br /&gt;
* Properties &#039;&#039;CaseAttributes&#039;&#039;, &#039;&#039;EventAttributes&#039;&#039; and &#039;&#039;Eventlog&#039;&#039; work only for the in-memory models and they require the model to be loaded into the memory. If the model is not in the memory, it is loaded when these properties is used. Other model properties down require the model to be in the memory.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||AllFilters (Filter*)&lt;br /&gt;
||Returns an array of all [[#Filter|filters]] in the model the user has access to. In addition to the &#039;&#039;Filters&#039;&#039; property, &#039;&#039;AllFilters&#039;&#039; also returns private filters of other users. The &#039;&#039;ManageViews&#039;&#039; permission is required to use this property - otherwise error is given.&lt;br /&gt;
|-&lt;br /&gt;
||Calendars (BusinessCalendar*)&lt;br /&gt;
||&lt;br /&gt;
Returns all [[Business_Calendar|business calendars]] stored to the Model as an array. Returns an empty array, if there are no business calendars stored to the model. Note: UI allows to set only one business calendar for a Model.&lt;br /&gt;
|-&lt;br /&gt;
||CaseAttributes (AttributeType*)&lt;br /&gt;
||[[#AttributeType|CaseAttributes]] in the model returned in the alphabetical order. Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||CasesDatatable (Datatable)&lt;br /&gt;
||Returns the Datatable the model uses as a datasource for cases. Returns &#039;&#039;null&#039;&#039; if the cases Datatable is not defined or if model uses other than the Datatable datasource.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Returns the Model configuration as dictionary. Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).Configuration.DataSource.Events.DataTableName&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ConfigurationJson (String)&lt;br /&gt;
||Returns the Model configuration as JSON string.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the model.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the model was created.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultCalendar (BusinessCalendar)&lt;br /&gt;
||Returns the default [[Business_Calendar|business calendar]] of the Model. Returns &#039;&#039;null&#039;&#039;, if there are no calendars in the Model or no calendar has been set as a default calendar. Note: UI allows to set only one business calendar for a Model, which is also the default calendar.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFilter (Filter)&lt;br /&gt;
||Default filter of the model. Returns &#039;&#039;null&#039;&#039; if the model does not have a default filter.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFilterId (Integer)&lt;br /&gt;
||Default filter id of the model. Returns &#039;&#039;null&#039;&#039; if the model does not have a default filter.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Model description. The model description may contain line breaks.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedDate (DateTime)&lt;br /&gt;
||Timestamp when Model was deleted (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||DeletedBy (User)&lt;br /&gt;
||User how deleted the Model.&lt;br /&gt;
|-&lt;br /&gt;
||Diagrams (Diagram*)&lt;br /&gt;
||Returns an array of all [[Diagram_in_Expression_Language|diagrams]] in the model.&lt;br /&gt;
|-&lt;br /&gt;
||EstimatedMemory (Integer)&lt;br /&gt;
||Returns an estimation of how much memory in bytes the model requires.&lt;br /&gt;
|-&lt;br /&gt;
||EventsDatatable (Datatable)&lt;br /&gt;
||Returns the Datatable the model uses as a datasource for events. Returns &#039;&#039;null&#039;&#039; if the events Datatable is not defined or if model uses other than the Datatable datasource.&lt;br /&gt;
|-&lt;br /&gt;
||EventAttributes (AttributeType*)&lt;br /&gt;
||[[#AttributeType|EventAttributes]] in the model returned in the alphabetical order. Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||EventLog (EventLog)&lt;br /&gt;
||EventLog containing the entire model (i.e. event log where no filters have been applied). Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||Filters (Filter*)&lt;br /&gt;
||Returns an array of all public [[#Filter|filters]], the default filter (if any) and the user&#039;s own private filters in the model. Note that the other users&#039;s private filters are not returned even for administrators.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Model Id. Model Id is generated by QPR ProcessAnalyzer when the model is created.&lt;br /&gt;
|-&lt;br /&gt;
||IsValidInMemoryModel (boolean)&lt;br /&gt;
||Returns &#039;&#039;true&#039;&#039; if all the following conditions are met:&lt;br /&gt;
* CheckModelValidity function doesn&#039;t return any issues (because invalid models are assumed to be Snowflake models).&lt;br /&gt;
* Model is not an object-centric model.&lt;br /&gt;
* Data source of the model is &#039;&#039;ODBC&#039;&#039; or &#039;&#039;Expression&#039;&#039;, or the referred datatable has &#039;&#039;DataSourceType&#039;&#039; either &#039;&#039;Local&#039;&#039; or &#039;&#039;SqlServer&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last time modified the model properties. Note that datatables containing the eventlog data are separate objects having similar fields to track the last modification and last data import.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the model was modified the last time.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Model name.&lt;br /&gt;
|-&lt;br /&gt;
||NCache (Integer)&lt;br /&gt;
||Number of objects related to the model when the model is loaded into the memory.&lt;br /&gt;
|-&lt;br /&gt;
||NCaseAttributes (Integer)&lt;br /&gt;
||Number of [[#AttributeType|CaseAttributes]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NCases (Integer)&lt;br /&gt;
||Number of [[#Case|Cases]] in the model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEventAttributes (Integer)&lt;br /&gt;
||Number of [[#AttributeType|EventAttributes]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEvents (Integer)&lt;br /&gt;
||Number of [[#Event|Events]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEventTypes (Integer)&lt;br /&gt;
||Number of [[#EventType|EventTypes]] in the model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||Project (Project)&lt;br /&gt;
||[[#Project|Project]] where the model belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||[[#Project|Project]] id where the model belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||Status (String)&lt;br /&gt;
||&lt;br /&gt;
Memory availability status of the model. There are the following statuses:&lt;br /&gt;
* &#039;&#039;&#039;Loading&#039;&#039;&#039;: The model is currently loading into the memory. When the loading is ready, the status changes to &#039;&#039;online&#039;&#039;. If the loading fails, the status changes to &#039;&#039;offline&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Offline&#039;&#039;&#039;: The model is currently not loaded into the memory. The model needs to be loaded into the memory, so that analyses can be calculated from the model (occurs automatically when an analysis is requested).&lt;br /&gt;
* &#039;&#039;&#039;Online&#039;&#039;&#039;: The model is in the memory and ready for analysis calculation. If the model is dropped from the memory, its status changes to &#039;&#039;offline&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||UsedDatatables (Datatable*)&lt;br /&gt;
||Returns all datatables the model uses as a datasource.&lt;br /&gt;
&lt;br /&gt;
Example: List datatables used by a model:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
StringJoin(&amp;quot;, &amp;quot;, OrderByValue(ModelById(1).UsedDataTables.Name))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CalendarByName (BusinessCalendar)&lt;br /&gt;
||&lt;br /&gt;
name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns a [[Business_Calendar|business calendar]] stored to the Model by the name of the calendar. Business calendars can be stored to models in the model properties. Returns &#039;&#039;null&#039;&#039;, if a calendar with the provided name is not stored to the model.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).CalendarByName(&amp;quot;MyCalendar&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateDiagram (Diagram)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||&lt;br /&gt;
Creates a [[Diagram_in_Expression_Language|diagram]] to the model. Parameters is a dictionary containing diagram properties. Following properties are available:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Diagram name that distinguishes diagrams in a model.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Diagram description text.&lt;br /&gt;
* &#039;&#039;&#039;Content&#039;&#039;&#039; (dictionary): Diagram content as dictionary.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1)&lt;br /&gt;
  .CreateDiagram(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My diagram&amp;quot;,&lt;br /&gt;
    &amp;quot;Description&amp;quot;: &amp;quot;This is my new diagram&amp;quot;,&lt;br /&gt;
    &amp;quot;Content&amp;quot;: #{ ... },&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateFilter (Filter)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a filter to a model. Requires &#039;&#039;GenericWrite&#039;&#039; permission for the project and global &#039;&#039;CreateModel&#039;&#039; permission. If a filter with that name already exists in the model, an exception is thrown.&lt;br /&gt;
The parameters dictionary may have the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the filter. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Description of the filter. This property is optional.&lt;br /&gt;
* &#039;&#039;&#039;Rules&#039;&#039;&#039;: Filter rules for the filter defined as a dictionary according to the [[Filtering_in_QPR_ProcessAnalyzer_Queries|filter json format]]. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;PublishMode&#039;&#039;&#039;: Publish mode of the filter which is one of the following: &#039;&#039;Private&#039;&#039;, &#039;&#039;Public&#039;&#039; or &#039;&#039;Default&#039;&#039;. This property is optional, and the default value is &#039;&#039;Private&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let newFilter = modelById(1).CreateFilter(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My Filter&amp;quot;,&lt;br /&gt;
  &amp;quot;Rules&amp;quot;: #{&lt;br /&gt;
    &amp;quot;Items&amp;quot;: [#{&lt;br /&gt;
      &amp;quot;Type&amp;quot;: &amp;quot;IncludeCases&amp;quot;,&lt;br /&gt;
      &amp;quot;Items&amp;quot;: [#{&lt;br /&gt;
        &amp;quot;Type&amp;quot;: &amp;quot;CaseAttributeValue&amp;quot;,&lt;br /&gt;
        &amp;quot;Attribute&amp;quot;: &amp;quot;Account Manager&amp;quot;,&lt;br /&gt;
        &amp;quot;StringifiedValues&amp;quot;: [ &amp;quot;0Robert Miller&amp;quot; ]&lt;br /&gt;
      }]&lt;br /&gt;
    }]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;PublishMode&amp;quot;: &amp;quot;Public&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||Deletes the Model permanently. The model doesn&#039;t need to be in the recycle bin to be able to delete it permanently.&lt;br /&gt;
|-&lt;br /&gt;
||Modify (Model)&lt;br /&gt;
||Dictionary&lt;br /&gt;
||&lt;br /&gt;
Modifies model properties. The parameter is a dictionary containing the properties to be changed. Following properties can be changed: &#039;&#039;Name&#039;&#039;, &#039;&#039;Description&#039;&#039;, &#039;&#039;ProjectId&#039;&#039;, and &#039;&#039;Configuration&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The function returns the updated model object. Requires the &#039;&#039;GenericWrite&#039;&#039; permission for the project and the global &#039;&#039;CreateModel&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1)&lt;br /&gt;
	.Modify(#{&lt;br /&gt;
		&amp;quot;Name&amp;quot;: &amp;quot;My model&amp;quot;,&lt;br /&gt;
		&amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
		&amp;quot;ProjectId&amp;quot;: 2,&lt;br /&gt;
		&amp;quot;Configuration&amp;quot;: #{&lt;br /&gt;
			&amp;quot;DataSource&amp;quot;: #{&lt;br /&gt;
				&amp;quot;Cases&amp;quot;: #{&lt;br /&gt;
					&amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;DataTableName&amp;quot;: &amp;quot;My cases datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
						&amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;Events&amp;quot;: #{&lt;br /&gt;
					&amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;DataTableName&amp;quot;: &amp;quot;My events datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
						&amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;,&lt;br /&gt;
						&amp;quot;EventType&amp;quot;: &amp;quot;Event Type&amp;quot;,&lt;br /&gt;
						&amp;quot;Timestamp&amp;quot;: &amp;quot;Start Time&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ResetModelCache&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Synchronously clears all cached model data. For a Snowflake model, deletes all cache tables related to the model from Snowflake. For an in-memory model, drops the model from the memory and also drops all other model related caches from the memory. &lt;br /&gt;
|-&lt;br /&gt;
||ResetPreprocessings&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Removes all cached items related to the Model, e.g. preprocessings and calculation results. In practice, the Model is reset to a state where it was right after the model was loaded into memory.&lt;br /&gt;
|-&lt;br /&gt;
||Restore&lt;br /&gt;
||(none)&lt;br /&gt;
||Restores the Model from the recycle bin back to the original location.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;ToSqlDataFrame&amp;quot;&amp;gt;ToSqlDataFrame&amp;lt;/span&amp;gt;&lt;br /&gt;
||In-memory dataframe&lt;br /&gt;
||Converts an in-memory dataframe to an SQL dataframe. In practice, an SQL query is created from the in-memory dataframe and the query is executed in the datasource so that the data is available in the datasource for further SQL operations. This function is intended only to small amounts of data which is less than 16384 rows.&lt;br /&gt;
&lt;br /&gt;
Example: Select matching cases from events data using in-memory dataframe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let model = ModelById(1);&lt;br /&gt;
let dfEvents = model.EventsDatatable.SqlDataFrame;&lt;br /&gt;
let inMemoryDf = ToDataFrame(&lt;br /&gt;
  [[&amp;quot;1&amp;quot;], [&amp;quot;2&amp;quot;], [&amp;quot;3&amp;quot;]],&lt;br /&gt;
  [#{&amp;quot;Name&amp;quot;: &amp;quot;id&amp;quot;, &amp;quot;DataType&amp;quot;: &amp;quot;String&amp;quot;}]&lt;br /&gt;
);&lt;br /&gt;
model.ToSqlDataFrame(inMemoryDf)&lt;br /&gt;
  .Join(dfEvents, [&amp;quot;id&amp;quot;: &amp;quot;CaseId&amp;quot;])&lt;br /&gt;
  .SelectDistinct([&amp;quot;CaseId&amp;quot;])&lt;br /&gt;
  .Collect();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;TriggerNotifications&amp;quot;&amp;gt;TriggerNotifications&amp;lt;/span&amp;gt; (Boolean)&lt;br /&gt;
||Notification names (String*)&lt;br /&gt;
||Triggers the given notifications for the Model. Notifications are given by their names. Triggering means that the configured rules are run and notification emails are sent as defined by the rules. If the notification names parameter is not provided, all notifications in the Model are triggered.&lt;br /&gt;
&lt;br /&gt;
The function return &#039;&#039;true&#039;&#039; if any notification were triggered, otherwise &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).TriggerNotifications([&amp;quot;Notification 1&amp;quot;, &amp;quot;Notification 2&amp;quot;]);&lt;br /&gt;
Triggers notifications Notification 1 and Notification 2 in model id 123.&lt;br /&gt;
&lt;br /&gt;
ModelById(123).TriggerNotifications();&lt;br /&gt;
Triggers all notifications in model id 123.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CheckModelValidity&amp;quot;&amp;gt;CheckModelValidity&amp;lt;/span&amp;gt; (Object array)&lt;br /&gt;
||CheckData field in dictionary&lt;br /&gt;
||Checks the model validity and returns found issues. The returned data is an array of objects where each object represents one validity error and contains the following properties:&lt;br /&gt;
* &#039;&#039;&#039;IssueType&#039;&#039;&#039; (String): Specifies the issue type.&lt;br /&gt;
* &#039;&#039;&#039;ContextType&#039;&#039;&#039; (String): Context in which the issue was found, and it can be &#039;&#039;&#039;EventDataSource&#039;&#039;&#039;, &#039;&#039;&#039;CaseDataSource&#039;&#039;&#039;, &#039;&#039;&#039;OcelDataSource&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Details&#039;&#039;&#039; (Dictionary): Additional details which depend on the type of the issue.&lt;br /&gt;
&lt;br /&gt;
There are two types of checks available (based on whether the &#039;&#039;&#039;CheckData&#039;&#039;&#039; parameter is defined):&lt;br /&gt;
* &#039;&#039;Lightweight check&#039;&#039;: The check is based on only the configuration data stored in QPR ProcessAnalyzer. This check is very quick and does not require running queries in datasource (e.g., in Snowflake).&lt;br /&gt;
* &#039;&#039;Full check&#039;&#039;: The check is comprehensive and it&#039;s able to detect any validity issues the model may have. The full check requires running queries to the actual data which makes the check slower, and in case of Snowflake, it uses the Snowflake warehouse to run the queries.&lt;br /&gt;
&lt;br /&gt;
The lightweight check is performed automatically by the [[QPR_ProcessAnalyzer_Project_Workspace|Workspace]], so if there are any validity issues that the lightweight check can detect, the Workspace notifies about them immediately. If there are any problems with the model calculation results, it might be a good idea to run the full validity check to confirm whether the problems are due to the model being invalid.&lt;br /&gt;
&lt;br /&gt;
Example: Lightweight check:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(ModelById(1).CheckModelValidity())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Full check:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(ModelById(1).CheckModelValidity(#{ &amp;quot;CheckData&amp;quot;: true }))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CortexAgentsQuery&lt;br /&gt;
||&lt;br /&gt;
||Creates a Snowflake Cortex semantic model (see the &#039;&#039;GetSemanticModel&#039;&#039; function) for the process mining model and makes a natural language query on it using Snowflake Cortex Agents. More information: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents. &lt;br /&gt;
&lt;br /&gt;
There are the following parameters:&lt;br /&gt;
# &#039;&#039;&#039;Parameters&#039;&#039;&#039;: Dictionary parameters given to the Cortex Agents REST API query (https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-rest-api). There is a special handling for the following parameters:&lt;br /&gt;
#* &#039;&#039;&#039;model&#039;&#039;&#039;: Defines the name of the LLM to use for the operation. If not defined, the [[PA_Configuration_database_table#:~:text=DefaultCortexAgentsModelName|DefaultCortexAgentsModelName]] system setting applies.&lt;br /&gt;
#* &#039;&#039;&#039;_tools&#039;&#039;&#039;: Additional tool_spec of type &amp;quot;cortex_analyst_text_to_sql&amp;quot; will be added to this value with a reference to the generated semantic model.&lt;br /&gt;
#* &#039;&#039;&#039;_tool_resources&#039;&#039;&#039;: Generated semantic model is added as an additional resource.&lt;br /&gt;
# &#039;&#039;&#039;Filter configuration&#039;&#039;&#039;: Can be a string containing filter JSON or a dictionary containing the filter configuration. The semantic model is created for the filtered eventlog. If not defined, the entire model eventlog will be used.&lt;br /&gt;
# &#039;&#039;&#039;Event column role nappings&#039;&#039;&#039;: Mappings to apply for event columns. If not defined, default column mappings are used.&lt;br /&gt;
# &#039;&#039;&#039;Case column role mappings&#039;&#039;&#039;: Mappings to apply for case columns. If not defined, default column mappings are used.&lt;br /&gt;
&lt;br /&gt;
The function returns a dictionary with the following keys:&lt;br /&gt;
# &#039;&#039;&#039;Response&#039;&#039;&#039;: Actual response as a dictionary returned by the Cortex Agents.&lt;br /&gt;
# &#039;&#039;&#039;Response items&#039;&#039;&#039;: Contains processed response consisting of an array of objects having the following properties:&lt;br /&gt;
#* &#039;&#039;&#039;Text&#039;&#039;&#039;: Textual response.&lt;br /&gt;
#* &#039;&#039;&#039;Sql&#039;&#039;&#039;: Response SQL query string. Not mandatory.&lt;br /&gt;
#* &#039;&#039;&#039;SqlDataFrame&#039;&#039;&#039;: SqlDataFrame created for the SQL query in the Sql property. Only present if Sql is present.&lt;br /&gt;
|-&lt;br /&gt;
||GetSemanticModel&lt;br /&gt;
||&lt;br /&gt;
||Creates a Snowflake Cortex Analyst semantic model for the process mining model and returns it as a dictionary. More information: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst/semantic-model-spec.&lt;br /&gt;
&lt;br /&gt;
There are the following parameters:&lt;br /&gt;
# &#039;&#039;&#039;Filter configuration&#039;&#039;&#039;: Can be a string containing filter JSON or a dictionary containing the filter. The semantic model is created for the filtered eventlog. If not defined, the entire model eventlog will be used.&lt;br /&gt;
# &#039;&#039;&#039;Event column role mappings&#039;&#039;&#039;: Mappings to apply for event columns. If not defined, default column mappings are used.&lt;br /&gt;
# &#039;&#039;&#039;Case column role mappings&#039;&#039;&#039;: Mappings to apply for case columns. If not defined, default column mappings are used.&lt;br /&gt;
&lt;br /&gt;
Examples: Returns a semantic model without any filtering applied.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).GetSemanticModel();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get Model by model id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ModelById&lt;br /&gt;
||&lt;br /&gt;
* Model id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Model|Model]] object corresponding to the provided model id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Object-centric model==&lt;br /&gt;
Object-centric models additionally have the following properties and functions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Object-Centric model properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||IsOcelModel (boolean)&lt;br /&gt;
||Returns &#039;&#039;true&#039;&#039; when the model is an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEvents (Datatable)&lt;br /&gt;
||Datatable containing event data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if event datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventToObject (Datatable)&lt;br /&gt;
||Datatable containing event-to-object relations data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if event-to-object relation datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventTypes (Dictionary)&lt;br /&gt;
||Returns a dictionary containing event type names as keys and the datatables holding event data for that event type in this OCEL model as value. An empty array is returned if event types datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable for &amp;quot;Create order&amp;quot; events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).OcelEventTypes.Get(&amp;quot;Create order&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjects (Datatable)&lt;br /&gt;
||Datatable containing objects data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if object datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectToObject (Datatable)&lt;br /&gt;
||Datatable containing object-to-object relations data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if object-to-object relation datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectTypes (Dictionary)&lt;br /&gt;
||Returns a dictionary containing object type names as keys and the datatables holding data for that object type in this OCEL model as value. An empty array is returned if object types have not been configured for this model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Object-centric model functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventType&lt;br /&gt;
||Event type name (String)&lt;br /&gt;
||&lt;br /&gt;
Datatable containing event type attributes of given event type in this OCEL model. Value &#039;&#039;null&#039;&#039; is returned if a datatable is not configured for this model for given event type. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable for &amp;quot;Create order&amp;quot; events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).OcelEventType(&amp;quot;Create order&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectType&lt;br /&gt;
||Object type name (String)&lt;br /&gt;
||Datatable containing object type attributes of given object type in this OCEL model. Value &#039;&#039;null&#039;&#039; is returned if a datatable is not configured for this model for given object type. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectTypeConfiguration&lt;br /&gt;
||Object type name (String)&lt;br /&gt;
||Returns a matching configuration object with the following properties:&amp;lt;br&amp;gt;&lt;br /&gt;
# Datatable: name of the datatable&lt;br /&gt;
# Unit: unit label for object type items&lt;br /&gt;
&#039;&#039;Null&#039;&#039; is returned if the given object type is not found in the model configuration.  &lt;br /&gt;
If the object type name is not specified or &#039;&#039;null&#039;&#039;, the function returns a dictionary containing configurations for all defined object types.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Project properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the Project.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was created.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Project settings as Dictionary object. See example in &#039;&#039;ConfigurationJson&#039;&#039; property.&lt;br /&gt;
|-&lt;br /&gt;
||ConfigurationJson (String)&lt;br /&gt;
||Project settings as json string.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;DefaultLocationInDataSource&amp;quot;: {&lt;br /&gt;
    &amp;quot;Database&amp;quot;: &amp;quot;MyDatabase&amp;quot;,&lt;br /&gt;
    &amp;quot;Schema&amp;quot;: &amp;quot;MySchema&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;ConnectionStringKeys&amp;quot;: {&lt;br /&gt;
    &amp;quot;Snowflake&amp;quot;: &amp;quot;MyKey1&amp;quot;,&lt;br /&gt;
    &amp;quot;SqlServer&amp;quot;: &amp;quot;MyKey2&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Dashboards (Dashboard*)&lt;br /&gt;
||Returns all [[Dashboard_in_Expression_Language|dashboards]] in the project.&lt;br /&gt;
|-&lt;br /&gt;
||Datatables (Datatable*)&lt;br /&gt;
||Returns all Datatables in the project.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was deleted (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Project description. The project description may contain line breaks.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedBy (User)&lt;br /&gt;
||User who deleted the Project (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the Project.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last modified the Project.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was last modified (refers to the project name, description and parent, not the contents of the project).&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Name of the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Models (Model*)&lt;br /&gt;
||Models that are in the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Parent (Project)&lt;br /&gt;
||Parent project, i.e. a Project where the Project is located in the hierarchy of Projects. Returns &#039;&#039;null&#039;&#039; for root level Projects. Throws an error if user doesn&#039;t have access to the parent project.&lt;br /&gt;
|-&lt;br /&gt;
||ParentProjectId (Integer)&lt;br /&gt;
||Parent project id. Returns &#039;&#039;null&#039;&#039; for root level Projects. The parent project id is returned even if user doesn&#039;t have access to the parent project.&lt;br /&gt;
|-&lt;br /&gt;
||Scripts (Script*)&lt;br /&gt;
||Scripts that are in the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Secrets (Dictionary*)&lt;br /&gt;
||Returns array of all [[Storing_Secrets_for_Scripts|secrets]] in the project as Dictionary with following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the secret.&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Type of the secret which is one of the following: &amp;quot;odbc&amp;quot;, &amp;quot;sap&amp;quot;, &amp;quot;salesforce&amp;quot;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Project functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreateDashboard (Dashboard)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a dashboard to the project. &#039;&#039;EditDashboards&#039;&#039; permission to the project is required. The parameter is dictionary with following supported dashboard properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Identifier&#039;&#039;&#039; (String): Identifier of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Content&#039;&#039;&#039; (Dictionary): Content of the dashboard.&lt;br /&gt;
&lt;br /&gt;
Example: Create empty dashboard.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .CreateDashboard(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
    &amp;quot;Identifier&amp;quot;: &amp;quot;MyDashboard&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create dashboard with a chart.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .CreateDashboard(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
    &amp;quot;Content&amp;quot;: #{&lt;br /&gt;
      &amp;quot;version&amp;quot;: 4,&lt;br /&gt;
      &amp;quot;typeName&amp;quot;: &amp;quot;View&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
      &amp;quot;subElements&amp;quot;: [&lt;br /&gt;
        #{&lt;br /&gt;
          &amp;quot;position&amp;quot;: #{&lt;br /&gt;
            &amp;quot;x&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;y&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;width&amp;quot;: 0.5,&lt;br /&gt;
            &amp;quot;height&amp;quot;: 0.5,&lt;br /&gt;
            &amp;quot;zOrder&amp;quot;: 0&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;element&amp;quot;: #{&lt;br /&gt;
            &amp;quot;typeName&amp;quot;: &amp;quot;Chart&amp;quot;,&lt;br /&gt;
            &amp;quot;configuration&amp;quot;: #{&lt;br /&gt;
              &amp;quot;root&amp;quot;: #{&lt;br /&gt;
                &amp;quot;expressionType&amp;quot;: &amp;quot;Cases&amp;quot;,&lt;br /&gt;
                &amp;quot;expressionParameters&amp;quot;: #{}&lt;br /&gt;
              },&lt;br /&gt;
              &amp;quot;measures&amp;quot;: [#{&lt;br /&gt;
                &amp;quot;expressionType&amp;quot;: &amp;quot;Count&amp;quot;,&lt;br /&gt;
                &amp;quot;expressionParameters&amp;quot;: #{}&lt;br /&gt;
              }]&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateDatatable&amp;quot;&amp;gt;CreateDatatable&amp;lt;/span&amp;gt; (Datatable)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Creates datatable to the project. After creation, there are no columns or rows in the datatable. The function returns the created datatable entity. Following properties can be set for the datatable:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the datatable. This parameter is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Description for the datatable. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;NameInDataSource&#039;&#039;&#039; (string): Table name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039; (string): Schema name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039; (string): Database name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Defines where the data for the datatable is located. Available values are &#039;&#039;&#039;Snowflake&#039;&#039;&#039;, &#039;&#039;&#039;SqlServer&#039;&#039;&#039;, and &#039;&#039;&#039;Local&#039;&#039;&#039;.  This parameter is optional and default value is defined by the [[PA_Configuration_database_table#General_Settings|DefaultDataSource]] setting.&lt;br /&gt;
* &#039;&#039;&#039;Connection&#039;&#039;&#039;: Connection object for the datatable. This parameter is optional.&lt;br /&gt;
&lt;br /&gt;
Example: Create a new datatable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create Snowflake datatable linked to a custom table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
  &amp;quot;NameInDataSource&amp;quot;: &amp;quot;MyTable&amp;quot;,&lt;br /&gt;
  &amp;quot;SchemaNameInDataSource&amp;quot;: &amp;quot;MySchema&amp;quot;,&lt;br /&gt;
  &amp;quot;DatabaseNameInDataSource&amp;quot;: &amp;quot;MyDatabase&amp;quot;,&lt;br /&gt;
  &amp;quot;Type&amp;quot;: &amp;quot;Snowflake&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create Snowflake datatable where connection string is stored as a [[Storing_Secrets_for_Scripts|secret]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;,&lt;br /&gt;
  &amp;quot;Type&amp;quot;: &amp;quot;Snowflake&amp;quot;,&lt;br /&gt;
  &amp;quot;Connection&amp;quot;: ProjectById(1).CreateSnowflakeConnection(#{ &amp;quot;OdbcConnectionStringKey&amp;quot;: &amp;quot;MyKey&amp;quot; })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateMeaConnection&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Creates an object representing connection to QPR MEA (QPR Suite) Web Service. The function parameter is a dictionary containing the property &#039;&#039;&#039;ConnectionStringKey&#039;&#039;&#039; which defines the MEA connection string secret name in the same project. When the connection object has been created, MEA Web Service [[QPR_MEA_Integration|queries and other operations]] can be executed using it.&lt;br /&gt;
&lt;br /&gt;
Example: create connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let connection = ProjectByName(&amp;quot;MyProject&amp;quot;).CreateMeaConnection( #{&amp;quot;ConnectionStringKey&amp;quot;: &amp;quot;MyMeaConnection&amp;quot;} );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: use connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let results = connection.QueryObjects(&amp;quot;[PG.785401983.683494101]&amp;quot;, &amp;quot;name, typename&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateModel (Model)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Creates a model to a project. Requires &#039;&#039;GenericWrite&#039;&#039; permission for the Project and global &#039;&#039;CreateModel&#039;&#039; permission. If a model with that name already exists, an exception is thrown.&lt;br /&gt;
&lt;br /&gt;
Parameters dictionary has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the model. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Description of the model. This property is optional.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039;: Configuration dictionary for the model. This property is technically optional, but a working model requires at least datasource settings to be defined.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateModel(#{    &lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My model&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
  &amp;quot;Configuration&amp;quot;: #{&lt;br /&gt;
    &amp;quot;DataSource&amp;quot;: #{&lt;br /&gt;
      &amp;quot;Cases&amp;quot;: #{&lt;br /&gt;
        &amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;DataTableName&amp;quot;: &amp;quot;My cases datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
          &amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;Events&amp;quot;: #{&lt;br /&gt;
        &amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;DataTableName&amp;quot;: &amp;quot;My events datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
           &amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;,&lt;br /&gt;
           &amp;quot;EventType&amp;quot;: &amp;quot;Event Type&amp;quot;,&lt;br /&gt;
           &amp;quot;Timestamp&amp;quot;: &amp;quot;Start Time&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateProject&amp;quot;&amp;gt;CreateProject&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Create a project as a sub-project of the context project. Returns the created project. Requires the &#039;&#039;ManageProject&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Parameters dictionary has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the project. This property is required.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Description of the project.&lt;br /&gt;
* &#039;&#039;&#039;ParentProjectId&#039;&#039;&#039; (integer): Id of the parent project where the new project is created. This parameter is usually not needed because the parent project is the context project. The CreateProject function is also available in the generic context where the &#039;&#039;ParentProjectId&#039;&#039; parameter is needed to create sub-projects.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039; (string): Snowflake database the project is linked to. Data for the datatables in this project will be located in this database.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039; (string): Snowflake schema the project is linked to. Data for the datatables in this project will be located in this schema. If the schema is defined, also the &#039;&#039;DatabaseNameInDataSource&#039;&#039; needs to be defined.&lt;br /&gt;
* &#039;&#039;&#039;SnowflakeConnectionStringKey&#039;&#039;&#039; (string): Snowflake connection string key to be used for the datatables in this project. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;, &lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;, &lt;br /&gt;
  &amp;quot;DatabaseNameInDataSource&amp;quot;: &amp;quot;My database&amp;quot;, &lt;br /&gt;
  &amp;quot;SchemaNameInDataSource&amp;quot;: &amp;quot;My schema&amp;quot; &lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateScript (Script)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a new script to the project. The parameter is a dictionary containing the following script properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the script. This is a mandatory parameter. Note that it&#039;s not possible to create multiple scripts with the same name in the same project.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Optional description text of the script.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039; (String): Language of the script. Options: &#039;&#039;Expression&#039;&#039; (default), or &#039;&#039;SQL&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039; (String): Script code.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039; (Dictionary): Script json configuration.&lt;br /&gt;
&lt;br /&gt;
The function returns the created script object. Using the function requires &#039;&#039;ManageScripts&#039;&#039; permission for the project, and additionally &#039;&#039;RunScripts&#039;&#039; for SQL scripts.&lt;br /&gt;
&lt;br /&gt;
Example: Create an expression script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateScript(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My expression script&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;WriteLog(\&amp;quot;Hello world!\&amp;quot;);&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create an SQL script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateScript(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My SQL script&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;This is an example SQL script...&amp;quot;,&lt;br /&gt;
  &amp;quot;Language&amp;quot;: &amp;quot;SQL&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;SELECT * FROM table;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DatatableByName (Datatable)&lt;br /&gt;
||Datatable name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Datatable by its name located in the project. Returns null, if Datatable with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).DatatableByName(&amp;quot;MyDatatable1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable by name, and create it if it doesn&#039;t exist:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let project = ProjectById(123);&lt;br /&gt;
let datatableName = &amp;quot;MyDatatable1&amp;quot;;&lt;br /&gt;
let datatable = project.DatatableByName(datatableName);&lt;br /&gt;
if (datatable == null) {&lt;br /&gt;
  datatable = project.CreateDatatable(datatableName);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||Deletes the Project permanently. Note that the Project doesn&#039;t need to be in the recycle bin to be able to delete it permanently.&lt;br /&gt;
|-&lt;br /&gt;
||Export (String)&lt;br /&gt;
||(none)&lt;br /&gt;
||Exports the project and its content to a json string. The json format is described in [[Projects Export File Format]].&lt;br /&gt;
&lt;br /&gt;
Example: Export project id 1 to json data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).Export();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Import&lt;br /&gt;
||JSON string&lt;br /&gt;
||Creates one or several projects from a json string. The project(s) are created as child projects of the context project. The json format is described in [[Projects Export File Format]]. The function returns the created project objects. In case the project names already exist, the import operation automatically adjusts the names to be unique.&lt;br /&gt;
&lt;br /&gt;
Example: Create project from json data (as child of project id 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let jsonData = `{ &amp;quot;Projects&amp;quot;: [ { &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot; } ] }`;&lt;br /&gt;
let result = ProjectById(1).Import(jsonData);&lt;br /&gt;
let createdProjectId = result[&amp;quot;Projects&amp;quot;][0].Id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Restore&lt;br /&gt;
||(none)&lt;br /&gt;
||Restores the Project from the recycle bin back to the original location.&lt;br /&gt;
|-&lt;br /&gt;
||ModelByName (Model)&lt;br /&gt;
||Model name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Model by its name located in the project. Returns null, if Model with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).ModelByName(&amp;quot;My Model 1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;ModifyProject&amp;quot;&amp;gt;Modify&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||Dictionary of settings to change&lt;br /&gt;
||&lt;br /&gt;
Change project settings. Following settings are supported:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the project.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description text of the project.&lt;br /&gt;
* &#039;&#039;&#039;ParentProjectId&#039;&#039;&#039; (Integer): Parent project id. Changing this effectively moves the project into different parent project.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039;: Name of the Snowflake database where the project&#039;s datatables are located. The database needs to exist in the same Snowflake account configured in the Snowflake connection string. When defining this setting, define also the &#039;&#039;SchemaNameInDataSource&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039;: Name of the Snowflake schema where the project&#039;s datatables are located. The schema needs to exist in the same Snowflake account configured in the Snowflake connection string. When defining this setting, define also the &#039;&#039;DatabaseNameInDataSource&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;SnowflakeConnectionStringKey&#039;&#039;&#039; (String): Snowflake connection string key for the project. Snowflake datatables in the project will use connection string behind this key (unless specified by the datatatable).&lt;br /&gt;
* &#039;&#039;&#039;SqlServerConnectionStringKey&#039;&#039;&#039; (String): SQL Server connection string key. SQL Server datatables in the project will use connection string behind this key (unless specified by the datatatable).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ManageProject&#039;&#039; permission is needed to change project properties.&lt;br /&gt;
&lt;br /&gt;
Example: Change project name and move project into other parent project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .Modify(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Project 1&amp;quot;&lt;br /&gt;
    &amp;quot;ParentProjectId&amp;quot;: 2&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set Snowflake connection string key for the project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .Modify(#{&lt;br /&gt;
    &amp;quot;SnowflakeConnectionStringKey&amp;quot;: &amp;quot;MyKey1&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ScriptByName (Script)&lt;br /&gt;
||Script name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Script by its name located in the project. Returns null, if Script with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).ScriptByName(&amp;quot;MyScript1&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;SetSecret&amp;quot;&amp;gt;SetSecret&amp;lt;/span&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
# Secret type (string)&lt;br /&gt;
# Secret name (string)&lt;br /&gt;
# Secret value (string)&lt;br /&gt;
||Sets or adds a [[Storing_Secrets_for_Scripts|secret]] for the project. Setting the secret value to &#039;&#039;null&#039;&#039; removes the secret. There can be several secrets with the same name in the same project if the type of the secret is different. Setting secrets requires the project specific &#039;&#039;ManageProject&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Secret type which is one of the following:&lt;br /&gt;
#* &amp;quot;externaldatatableconnection&amp;quot;: Snowflake ODBC connection string for datatables.&lt;br /&gt;
#* &amp;quot;odbc&amp;quot;: ODBC connection string (e.g., to extract data in scripts, or load an in-memory model).&lt;br /&gt;
#* &amp;quot;oledb&amp;quot;: OleDB connection string (e.g., to extract data in scripts, or load an in-memory model).&lt;br /&gt;
#* &amp;quot;sap&amp;quot;: SAP password.&lt;br /&gt;
#* &amp;quot;salesforce&amp;quot;: Salesforce password.&lt;br /&gt;
#* &amp;quot;sql&amp;quot;: SQL Server connection string.&lt;br /&gt;
#* &amp;quot;qprmea&amp;quot;: QPR MEA connection string.&lt;br /&gt;
# &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Secret name, used to refer to the secret in the commands.&lt;br /&gt;
# &#039;&#039;&#039;Value&#039;&#039;&#039; (string): Secret value which contains the confidential information.&lt;br /&gt;
&lt;br /&gt;
Example: Set SAP password:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).SetSecret(&amp;quot;sap&amp;quot;, &amp;quot;MySapPassword&amp;quot;, &amp;quot;I l0ve 5AP!&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Remove SAP password:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).SetSecret(&amp;quot;sap&amp;quot;, &amp;quot;MySapPassword&amp;quot;, null);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Functions to get project:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ProjectById&lt;br /&gt;
||Project id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns project object corresponding to the provided project id.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectByName&lt;br /&gt;
||Project name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns project object by given project name. If there is no such project or user doesn&#039;t have access to it, &#039;&#039;null&#039;&#039; value is returned. If there are multiple projects with the same name, one of them is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let project = ProjectByName(&amp;quot;My Project&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Functions to create project:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateProject&amp;quot;&amp;gt;CreateProject&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Create a project. This is a similar function as the [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#CreateProject|CreateProject function]] in the project context. This function in the generic context is needed to create root-level projects (which don&#039;t have parent project).&lt;br /&gt;
&lt;br /&gt;
Example: create a root project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: create a sub-project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;&lt;br /&gt;
  &amp;quot;ParentProjectId&amp;quot;: 1&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;Import&amp;quot;&amp;gt;Import&amp;lt;/span&amp;gt; (Project*)&lt;br /&gt;
||JSON string&lt;br /&gt;
||Creates one or several projects from a json string. The project(s) are created as the root level projects. The json format is described in [[Projects Export File Format]]. The function returns the created project objects. In case the project names already exist, the import operation automatically adjusts the names to be unique.&lt;br /&gt;
&lt;br /&gt;
Example: Create a root level project from json data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let jsonData = `{ &amp;quot;Projects&amp;quot;: [ { &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot; } ] }`;&lt;br /&gt;
let result = Import(jsonData);&lt;br /&gt;
let createdProjectId = result[&amp;quot;Projects&amp;quot;][0].Id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Script ==&lt;br /&gt;
Scripts are entities that contain executable code, that can be run. Usually scripts contains ETL routines but also other kind of tasks are possible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Script properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Code (String)&lt;br /&gt;
||Script code.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Script&#039;s configuration.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the Script.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the Script was created.&lt;br /&gt;
|-&lt;br /&gt;
||CurrentRunStart (DateTime)&lt;br /&gt;
||Timestamp of the current run start. Null if the script is currently not running.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Description of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||Language (String)&lt;br /&gt;
||Either of the following scripting language: &#039;&#039;&#039;Expression&#039;&#039;&#039; or &#039;&#039;&#039;SQL&#039;&#039;&#039;. When language is Expression, the script is run as an expression script, and when language is SQL, the script is run as an SQL script (using the sandbox database).&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last modified the Script.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the Script was last modified.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunEnd (DateTime)&lt;br /&gt;
||Timestamp of the last completed script run end (either successful completion or failure). Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunResult (String)&lt;br /&gt;
||Result of the last run. Options are:&lt;br /&gt;
* &#039;&#039;&#039;Completed&#039;&#039;&#039;: The last run was completed successfully.&lt;br /&gt;
* &#039;&#039;&#039;Failed&#039;&#039;&#039;: An error occurred during the last run, so likely the script did not complete as intended.&lt;br /&gt;
* &#039;&#039;&#039;Aborted&#039;&#039;&#039;: Script run was manually stopped prematurely by a user, so the script did not proceeded in the end.&lt;br /&gt;
&lt;br /&gt;
Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunStart (DateTime)&lt;br /&gt;
||Timestamp of the last completed script run start time. Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
|McpPrimitiveType (String)&lt;br /&gt;
|Returns one of the following values depending on which type of MCP primitive the script supports:&lt;br /&gt;
&lt;br /&gt;
* Tool&lt;br /&gt;
* Prompt&lt;br /&gt;
* ResourceNull value means that the script does not support any MCP primitive type.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Name of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||OperationId (Integer)&lt;br /&gt;
||Id of the operation which runs the Script. Null if the script is currently not running.&lt;br /&gt;
|-&lt;br /&gt;
||Project (Project)&lt;br /&gt;
||Project where the Script is located. Null if the script is in the global context.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||Id of the project where the Script is located. Null if the script is in the global context.&lt;br /&gt;
|-&lt;br /&gt;
||Status (String)&lt;br /&gt;
||Current status of the script. Options are:&lt;br /&gt;
* &#039;&#039;&#039;Ready&#039;&#039;&#039;: Script is not running. In this status, the script can be started (changing the status to &#039;&#039;Running&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Running&#039;&#039;&#039;: Script is running. In this status, the script can be stopped (changing the status to &#039;&#039;Stopping&#039;&#039;). Calling stop just requests a script to stop, and the actual stopping occurs some time later.&lt;br /&gt;
* &#039;&#039;&#039;Stopping&#039;&#039;&#039;: Script has been requested to be stopped, but it&#039;s still running. In this status, neither start nor stop can be called for the script. When the script eventually stops, its status changes to &#039;&#039;Ready&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpTool (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP tool or not.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpPrompt (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP prompt or not.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpResource (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP resource or not.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Script functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Deletes the script permanently. To delete an expression script, &#039;&#039;&#039;ManageScripts&#039;&#039;&#039; permission for the project is needed, and to delete an SQL script, global &#039;&#039;&#039;RunScripts&#039;&#039;&#039; permission and &#039;&#039;&#039;ManageScripts&#039;&#039;&#039; permission for the project is needed.&lt;br /&gt;
|-&lt;br /&gt;
||Modify&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Modifies properties of a script. The parameter is a dictionary of properties to change:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the script.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description text of the script.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039; (String): Language of the script, either &#039;&#039;Expression&#039;&#039; or &#039;&#039;SQL&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039; (String): Script code.&lt;br /&gt;
* &#039;&#039;&#039;ProjectId&#039;&#039;&#039; (Integer): Id of the project where the script is located. Changing this property moves the script into a different project.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039; (Dictionary): Script json configuration.&lt;br /&gt;
&lt;br /&gt;
Requires &#039;&#039;ManageScripts&#039;&#039; permissions in the project. Additionally, requires &#039;&#039;RunScripts&#039;&#039; permission for SQL scripts.&lt;br /&gt;
&lt;br /&gt;
Example: Rename script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;Updated script&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Change multiple properties in the same call:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;Updated script&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;Updated description&amp;quot;,&lt;br /&gt;
  &amp;quot;Language&amp;quot;: &amp;quot;SQL&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;SELECT 1&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Move script to a different project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;ProjectId&amp;quot;: ProjectByName(&amp;quot;My project&amp;quot;).Id&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Run (Object)&lt;br /&gt;
||Dictionary of parameters&lt;br /&gt;
||&lt;br /&gt;
Runs the script using the provided parameters. The parameters are available in the script as variables (see the example). Any type of variables can be passed to the script. Note that if the script assumes certain variables, but that they are not passed to the script, the script run will throw an error. &lt;br /&gt;
&lt;br /&gt;
For SQL scripts, the passed parameters are available in the script as variables in format &#039;&#039;&#039;@_parameter_&amp;lt;ParameterName&amp;gt;&#039;&#039;&#039; where &amp;lt;ParameterName&amp;gt; is the name of the parameter, e.g. &#039;&#039;parameter_myParameter1&#039;&#039;. Only string type of parameters can be used, so any other type of data in parameter values is converted into strings.&lt;br /&gt;
&lt;br /&gt;
The return value of the script is returned by the Run function. Expression scripts return a value with the &#039;&#039;return&#039;&#039; statement or alternatively the result of the last line of the script is the return value. If the script does not return any value, the Run function returns &#039;&#039;_empty&#039;&#039;. For SQL scripts, the return value is the last dataset produced by the script (returned as a DataFrame) (SQL scripts might create several datasets using the &#039;&#039;--#ShowReport&#039;&#039; command or the &#039;&#039;Show&#039;&#039; parameter).&lt;br /&gt;
&lt;br /&gt;
When a script is called using the Run function, the called script status does not change, because it&#039;s the parent script that is &#039;&#039;Running&#039;&#039;. Also the called script log is not filled, but instead the logging goes to the calling script.&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to call a script using the Run function several times simultaneously.&lt;br /&gt;
&lt;br /&gt;
If there is an error when running the called script, the Run function throws the error to the calling script.&lt;br /&gt;
&lt;br /&gt;
Scripts are run in the script entity context, so for example the following properties are available:&lt;br /&gt;
* Id: Script id&lt;br /&gt;
* Name: Script name&lt;br /&gt;
* Project.Id: Project id where the script is located&lt;br /&gt;
* Project.Name: Name of the project where the script is located&lt;br /&gt;
&lt;br /&gt;
Example: Following script (id 123) raises a specified number to a specified power:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return Pow(numberToRaise, exponent);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script can be called as follows (returning 16):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runResult = ScriptById(123).Run(#{&lt;br /&gt;
  &amp;quot;numberToRaise&amp;quot;: 4,&lt;br /&gt;
  &amp;quot;exponent&amp;quot;: 2&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;Start&amp;quot;&amp;gt;Start&amp;lt;/span&amp;gt;&lt;br /&gt;
||Dictionary of parameters&lt;br /&gt;
||Starts the script. The function call doesn&#039;t wait for the script run to complete (i.e., asynchronous behavior) which is same as starting the script in the [[Managing_Scripts#Starting_Script|Workspace]].&lt;br /&gt;
&lt;br /&gt;
Parameters to the script can be provided as a dictionary of name-value pairs (which is not possible when script is started in the Workspace). Return value is the script run id (integer) if the script was started. If the script is already running, return value is &#039;&#039;null&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: Start script (without parameters) and store the script run id:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runId = ScriptById(1).Start();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Start script with passing parameters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Start(#{&lt;br /&gt;
  &amp;quot;variable1&amp;quot;: &amp;quot;val1&amp;quot;,&lt;br /&gt;
  &amp;quot;variable2&amp;quot;: 5&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Stop&lt;br /&gt;
||&lt;br /&gt;
||Stops the script. The operation doesn&#039;t wait for the stopping to complete (i.e., asynchronous behavior) which is same as stopping the script in the [[Managing_Scripts#Stopping_Script|Workspace]]. Depending on the operation that the script is performing, the stopping might take some time.&lt;br /&gt;
&lt;br /&gt;
Return value is the script run id (integer) if the script was running. If the script isn&#039;t running, the return value is &#039;&#039;null&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runId = ScriptById(1).Stop();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get a script by the script id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ScriptById&lt;br /&gt;
||&lt;br /&gt;
* Script id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns Script object corresponding to the given script id. If script with the given id doesn&#039;t exist or user doesn&#039;t have permissions to it, an error is given.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User/Group ==&lt;br /&gt;
User objects represents users and user groups. Note that some properties can only be used for users and some for groups.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;User/group properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||Returns the user who created the user.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Returns the date when the user was created.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultDashboard (String)&lt;br /&gt;
||Returns the configured [[Manage_Users_and_Groups#Starting_dashboard|starting dashboard]] (&amp;quot;default dashboard&amp;quot;) identifier for a group (for users, the starting dashboard cannot be configured). The starting dashboard is automatically opened when a user logs in.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Description of the user.&lt;br /&gt;
|-&lt;br /&gt;
||EffectiveDefaultDashboard (String)&lt;br /&gt;
||Returns the [[Manage_Users_and_Groups#Starting_dashboard|starting dashboard]] of a user. Value &#039;&#039;null&#039;&#039; means that the user doesn&#039;t have a starting dashboard. The starting dashboard comes from the user&#039;s groups. If multiple of user&#039;s groups have the starting dashboard defined, the user&#039;s starting dashboard will be taken from a group having alphabetically the first name.&lt;br /&gt;
|-&lt;br /&gt;
||Email (String)&lt;br /&gt;
||Email address of the user.&lt;br /&gt;
|-&lt;br /&gt;
||FullName (String)&lt;br /&gt;
||Full name of the user or group name.&lt;br /&gt;
|-&lt;br /&gt;
||GlobalPermissions (String*)&lt;br /&gt;
||Array of global [[Roles and Permissions#Global_and_Project_Roles|permissions]] of the user. Global permissions come from the global roles assigned to the user and groups that the user belongs to. Note that to get the effective permissions for certain objects, also project specific permissions need to be taken into account.&lt;br /&gt;
|-&lt;br /&gt;
||GroupMemberNames (String*)&lt;br /&gt;
||Array of names of members of a user group. This property is available for groups.&lt;br /&gt;
|-&lt;br /&gt;
||GroupMembers (User*)&lt;br /&gt;
||Array of members of a user group. This property is available for groups.&lt;br /&gt;
|-&lt;br /&gt;
||GroupNames (String*)&lt;br /&gt;
||Array of names of user groups the user belongs to. This property is available for users.&lt;br /&gt;
|-&lt;br /&gt;
||Groups (User*)&lt;br /&gt;
||Array of user groups the user belongs to. This property is available for users.&lt;br /&gt;
|-&lt;br /&gt;
||HasPassword (Boolean)&lt;br /&gt;
||Returns true if user has a password defined in QPR ProcessAnalyzer and thus user can authenticate using the password. If user doesn&#039;t have a password, the SAML authentication is the only way to log in. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property for other users.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the user, which is unique for every user.&lt;br /&gt;
|-&lt;br /&gt;
||IsActive (Boolean)&lt;br /&gt;
||Returns true only if the user is active (not disabled).&lt;br /&gt;
|-&lt;br /&gt;
||IsGroup (Boolean)&lt;br /&gt;
||Returns true if the user is a user group.&lt;br /&gt;
|-&lt;br /&gt;
||IsLocked (Boolean)&lt;br /&gt;
||Returns true if user account is currently [[User_Session_Management#Preventing_password_guessing_attacks|locked]]. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property.&lt;br /&gt;
|-&lt;br /&gt;
||LastLockedDate (DateTime)&lt;br /&gt;
||Returns date when user account was locked the last time. Returns &#039;&#039;null&#039;&#039; if the user account has never been locked. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property.&lt;br /&gt;
|-&lt;br /&gt;
||LastLoginDate (DateTime)&lt;br /&gt;
||Returns date when the user made last successful login. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property for other users.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||Returns the user who last modified this user.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Returns the date when the user was last modified.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Login name of the user or group.&lt;br /&gt;
|-&lt;br /&gt;
||Roles (Object**)&lt;br /&gt;
||&lt;br /&gt;
Returns all roles of the user (both global and project roles) as a nested array structure.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(Users.Where(name == &amp;quot;qpr&amp;quot;).Roles)&lt;br /&gt;
Returns (for example):&lt;br /&gt;
[&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:1&amp;quot;}, &amp;quot;Administrator&amp;quot;],&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:2&amp;quot;}, &amp;quot;Analyzer&amp;quot;],&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:3&amp;quot;}, &amp;quot;Viewer&amp;quot;],&lt;br /&gt;
  [null, &amp;quot;RunScripts&amp;quot;],&lt;br /&gt;
  [null, &amp;quot;Administrator&amp;quot;]&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;User/group functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||EffectivePermissionsFor (String Array)&lt;br /&gt;
||&lt;br /&gt;
* Project to get permissions&lt;br /&gt;
||&lt;br /&gt;
Returns effective (actual) permission of the user to the given project. Project is given as a [[#Project|project object]] (not as a project id). Effective permissions determine the actual permissions that the user has, i.e. a combination of all permissions assigned to the user and groups the user belong to, including both project specific and global roles.&lt;br /&gt;
&lt;br /&gt;
Permissions for the EffectivePermissionsFor function are as follows:&lt;br /&gt;
* All users can query their own permissions&lt;br /&gt;
* To get permissions for any user, the user needs to have [[Roles_and_Permissions|ManageUsers permission]].&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;inactive&#039;&#039; users don&#039;t have any effective permissions, so the EffectivePermissionsFor function does not return any permissions for those users.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1).EffectivePermissionsFor(ModelById(2).Project)&lt;br /&gt;
Returns (for example): [&amp;quot;EditDashboards&amp;quot;, &amp;quot;Filtering&amp;quot;, &amp;quot;GenericRead&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||GetAttribute&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Returns user attribute value by given attribute name and optionally by the model/project/dashboard context. Supported data types are String, Integer, Float, and DateTime. To store more complex data types, data can be converted into json and stored as string. If the attribute doesn&#039;t exist, null is returned.&lt;br /&gt;
&lt;br /&gt;
For example, if using dashboard as context, the attributes are effectively bound to each user and each dashboard separately. Thus, there can be several attributes with the same name as long as the dashboard is different.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Attribute name&#039;&#039;&#039; (String): Name of the attribute.&lt;br /&gt;
# &#039;&#039;&#039;Attribute context&#039;&#039;&#039; (Project/Model/Dashboard): Optional context object the attribute is linked to.&lt;br /&gt;
&lt;br /&gt;
Users have permissions to get attributes for themselves, and also (administrator) users with global &#039;&#039;ManageUsers&#039;&#039; permission can get attributes for all users. In addition, if using the context object, the &#039;&#039;GenericRead&#039;&#039; permission is required for the context object.&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for myself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CurrentUser&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for user John:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Users&lt;br /&gt;
  .Where(Name==&amp;quot;John&amp;quot;)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for user 1 related to dashboard id 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;, DashboardById(1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||SetAttribute&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Sets user attribute value for given attribute name and optionally for the model/project/dashboard context. Supported data types are String, Integer, Float, and DateTime. To store more complex data types, data can be converted into json and stored as string. If setting value &#039;&#039;null&#039;&#039;, the user attribute is removed. Required permissions are same as in the GetAttribute function.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Attribute name&#039;&#039;&#039; (String): Name of the attribute.&lt;br /&gt;
# &#039;&#039;&#039;Attribute value&#039;&#039;&#039; (String/Integer/Float/DateTime): Attribute value to be stored.&lt;br /&gt;
# &#039;&#039;&#039;Attribute context&#039;&#039;&#039; (Project/Model/Dashboard): Optional context object the attribute value is linked to.&lt;br /&gt;
&lt;br /&gt;
Example: Set user attribute MyDataValue for myself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CurrentUser&lt;br /&gt;
  .SetAttribute(&amp;quot;MyDataValue &amp;quot;, &amp;quot;value&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set value 123 as user attribute MyDataValue for user John:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Users&lt;br /&gt;
  .Where(Name==&amp;quot;John&amp;quot;)&lt;br /&gt;
  .SetAttribute(&amp;quot;MyDataValue&amp;quot;, 123);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set current time as user attribute MyDataValue for user 1 related to dashboard id 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;, Now, DashboardById(1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get User by user id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||UserById (User)&lt;br /&gt;
||&lt;br /&gt;
* User id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns User object that has the provided user id. Also groups can be queried with this function. Returns an access denied error if the user with given id does not exist or the current user does not have access to it.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28546</id>
		<title>User Profile</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28546"/>
		<updated>2026-06-17T14:21:42Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preferences ==&lt;br /&gt;
The Preferences tab has the following settings available:&lt;br /&gt;
* Localization settings: User can set the user&#039;s own language, content language, date format, first day of week and whether the 12-hour clock is used. See [[Languages_and_Localization#Date_Format_Settings|more information]].&lt;br /&gt;
&lt;br /&gt;
== User Information ==&lt;br /&gt;
User Information tab shows following information for the currently logged in user:&lt;br /&gt;
* &#039;&#039;&#039;User name&#039;&#039;&#039;: Login name used when user logs in.&lt;br /&gt;
* &#039;&#039;&#039;Full name&#039;&#039;&#039;: Person full name (for example first name and last name).&lt;br /&gt;
* &#039;&#039;&#039;Email&#039;&#039;&#039;: User&#039;s email address.&lt;br /&gt;
* &#039;&#039;&#039;Groups&#039;&#039;&#039;: Groups the user belongs to. The user gets permissions from the groups.&lt;br /&gt;
* &#039;&#039;&#039;Global roles&#039;&#039;&#039;: List of global roles the user has. There is one or several permissions in each role and user gets permissions from the roles.&lt;br /&gt;
* &#039;&#039;&#039;Global permissions&#039;&#039;&#039;: List of global permissions the user has. The permissions determine what actions the user has in the system. &lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Authenticated using&#039;&#039;&#039; field describes which authentication method was used to log in to QPR ProcessAnalyzer. There are following options:&lt;br /&gt;
* QPR ProcessAnalyzer password&lt;br /&gt;
* External identity provider through SAML 2.0&lt;br /&gt;
* Snowflake (available in Snowflake Native App)&lt;br /&gt;
&lt;br /&gt;
== Change password ==&lt;br /&gt;
User can change their own password. When changing the password, you need to provide your current password and also confirm the new password. Note that when authenticated using the SSO (SAML 2.0 identity provided) or Snowflake, the password changing in QPR ProcessAnalyzer is not available.&lt;br /&gt;
&lt;br /&gt;
When running QPR ProcessAnalyzer as Snowflake Native App, there is also &#039;&#039;&#039;Login as other user&#039;&#039;&#039; button to log out QPR ProcessAnalyzer session and go the login screen, so that a different QPR ProcessAnalyzer user can be used. The Snowflake session is not logged out when pressing this button.&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28545</id>
		<title>User Profile</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28545"/>
		<updated>2026-06-17T14:21:05Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preferences ==&lt;br /&gt;
The Preferences tab has the following settings available.&lt;br /&gt;
&lt;br /&gt;
=== Localization settings ===&lt;br /&gt;
User can set the user&#039;s own language, content language, date format, first day of week and whether the 12-hour clock is used. See [[Languages_and_Localization#Date_Format_Settings|more information]].&lt;br /&gt;
&lt;br /&gt;
== User Information ==&lt;br /&gt;
User Information tab shows following information for the currently logged in user:&lt;br /&gt;
* &#039;&#039;&#039;User name&#039;&#039;&#039;: Login name used when user logs in.&lt;br /&gt;
* &#039;&#039;&#039;Full name&#039;&#039;&#039;: Person full name (for example first name and last name).&lt;br /&gt;
* &#039;&#039;&#039;Email&#039;&#039;&#039;: User&#039;s email address.&lt;br /&gt;
* &#039;&#039;&#039;Groups&#039;&#039;&#039;: Groups the user belongs to. The user gets permissions from the groups.&lt;br /&gt;
* &#039;&#039;&#039;Global roles&#039;&#039;&#039;: List of global roles the user has. There is one or several permissions in each role and user gets permissions from the roles.&lt;br /&gt;
* &#039;&#039;&#039;Global permissions&#039;&#039;&#039;: List of global permissions the user has. The permissions determine what actions the user has in the system. &lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Authenticated using&#039;&#039;&#039; field describes which authentication method was used to log in to QPR ProcessAnalyzer. There are following options:&lt;br /&gt;
* QPR ProcessAnalyzer password&lt;br /&gt;
* External identity provider through SAML 2.0&lt;br /&gt;
* Snowflake (available in Snowflake Native App)&lt;br /&gt;
&lt;br /&gt;
== Change password ==&lt;br /&gt;
User can change their own password. When changing the password, you need to provide your current password and also confirm the new password. Note that when authenticated using the SSO (SAML 2.0 identity provided) or Snowflake, the password changing in QPR ProcessAnalyzer is not available.&lt;br /&gt;
&lt;br /&gt;
When running QPR ProcessAnalyzer as Snowflake Native App, there is also &#039;&#039;&#039;Login as other user&#039;&#039;&#039; button to log out QPR ProcessAnalyzer session and go the login screen, so that a different QPR ProcessAnalyzer user can be used. The Snowflake session is not logged out when pressing this button.&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Manage_Users_and_Groups&amp;diff=28544</id>
		<title>Manage Users and Groups</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Manage_Users_and_Groups&amp;diff=28544"/>
		<updated>2026-06-17T14:20:43Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes how to use the Manage Users dialog to modify users, groups and permissions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Manage Users Dialog ==&lt;br /&gt;
The Manage Users dialog is used to create and modify users and groups, and manage roles and permissions. Only users with &#039;&#039;[[Roles_and_Permissions#Global_and_Project_Roles|ManageUsers]]&#039;&#039; permission can use the Manage Users dialog. This page contains information how to use the User Management dialog. For more information how permissions work in conceptual level, please read [[Roles and Permissions]].&lt;br /&gt;
&lt;br /&gt;
User can be &#039;&#039;active&#039;&#039; or &#039;&#039;inactive&#039;&#039;. Inactive users are not allowed to login and thus use their assigned permissions. Users can be inactivated both temporary or permanently to prevent them from login into the system. When using the built-in authentication, user not using the system anymore, need to be inactivated (as users cannot be deleted). When using the federated authentication, it&#039;s not necessary to inactivate users, because those users are anyways not able to login through the external authentication.&lt;br /&gt;
&lt;br /&gt;
The dialog shows which users have a password defined. If user has a password, the user can authenticate via the built-in authentication method. If the SAML authentication is configured, users can also authenticate via it without a password in the QPR ProcessAnalyzer user management. If users are meant to authenticate only using the SAML, it&#039;s strongly recommended to remove the password from the user management to prevent the built-in authentication method.&lt;br /&gt;
&lt;br /&gt;
All changes made in the Manage Users dialog are effective immediately. The bottom of the screen shows either &#039;&#039;Saving&#039;&#039; when saving is currently in progress and, &#039;&#039;Saved&#039;&#039; when saving changes is completed. Note that when making changes to your own roles or groups, in order for them to take effect, you should relogin to the system.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Effective permissions&#039;&#039;&#039; show the actual permissions that users have in the system. The effective permissions are calculated from permissions that are in the groups of the user and permissions that are assigned directly to the user.&lt;br /&gt;
&lt;br /&gt;
== Creating User ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Users&#039;&#039;&#039; tab, and click &#039;&#039;&#039;Add user&#039;&#039;&#039;.&lt;br /&gt;
# Fill in &#039;&#039;&#039;Login name&#039;&#039;&#039; and optionally &#039;&#039;&#039;Full name&#039;&#039;&#039; and &#039;&#039;&#039;Email&#039;&#039;&#039;. Note that each user in the system must have a different login name.&lt;br /&gt;
# Click the &#039;&#039;&#039;Add user&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
== Editing User Information ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Users&#039;&#039;&#039; tab.&lt;br /&gt;
# Select a user from the table and click the &#039;&#039;&#039;Edit&#039;&#039;&#039; button (or double-click the user in the table).&lt;br /&gt;
# Change the user information and click the &#039;&#039;&#039;Save&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
== Setting User Password ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Users&#039;&#039;&#039; tab.&lt;br /&gt;
# Select a user from the left-side table and click &#039;&#039;&#039;Change password&#039;&#039;&#039;.&lt;br /&gt;
# Define a password for the user and confirm the password.&lt;br /&gt;
# Click the &#039;&#039;&#039;Change Password&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
== Removing User Password ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Users&#039;&#039;&#039; tab.&lt;br /&gt;
# Select a user (or several users) from the left-side table and click &#039;&#039;&#039;Remove password&#039;&#039;&#039;.&lt;br /&gt;
# Click the &#039;&#039;&#039;Remove&#039;&#039;&#039; button in the confirmation dialog.&lt;br /&gt;
&lt;br /&gt;
It&#039;s recommended to remove password from users that switch to use the SAML authentication, and thus don&#039;t need to authenticate using the built-in method.&lt;br /&gt;
&lt;br /&gt;
== Editing User Description ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Users&#039;&#039;&#039; tab.&lt;br /&gt;
# Select a user from the table and click &#039;&#039;&#039;Edit description&#039;&#039;&#039;.&lt;br /&gt;
# Change the user description and click the &#039;&#039;&#039;Save&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
== Creating Group ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Groups&#039;&#039;&#039; tab, and click &#039;&#039;&#039;Add group&#039;&#039;&#039;.&lt;br /&gt;
# Fill in &#039;&#039;&#039;Group name&#039;&#039;&#039; and optionally &#039;&#039;&#039;Group Email&#039;&#039;&#039; and &#039;&#039;&#039;Starting dashboard&#039;&#039;&#039; (more below). Note that each group in the system must have a different name.&lt;br /&gt;
# Click the &#039;&#039;&#039;Add group&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
== Editing Group Information ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Groups&#039;&#039;&#039; tab.&lt;br /&gt;
# Select a group from the table and click the &#039;&#039;&#039;Edit&#039;&#039;&#039; button (or double-click the group in the table).&lt;br /&gt;
# Following information of the group can be changed: &#039;&#039;&#039;Group name&#039;&#039;&#039;, &#039;&#039;&#039;Group email&#039;&#039;&#039; and &#039;&#039;&#039;Starting dashboard&#039;&#039;&#039; (more below).&lt;br /&gt;
# Click the &#039;&#039;&#039;Save&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
=== Starting dashboard ===&lt;br /&gt;
Starting dashboard (a.k.a. default dashboard) can be defined that is opened when a user logs in. The starting dashboard can be a navigation page containing links to other dashboards in the process mining application.&lt;br /&gt;
&lt;br /&gt;
The starting dashboard is defined for a group, allowing to define different starting dashboards for users of different groups. All users belonging to a group with a starting dashboard will define that as the starting dashboard for all the users in that group. If a user belongs to multiple groups with each having a starting dashboard, the user&#039;s starting dashboard will be taken from a group having alphabetically the first name. Thus, it&#039;s possible to define a starting dashboard for a narrower group that overrides a larger group, if the narrower group is alphabetically before the larger group.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The starting dashboard is defined using the following format:&lt;br /&gt;
* /&amp;lt;ProjectName&amp;gt;/&amp;lt;DashboardIdentifier&amp;gt;&lt;br /&gt;
* /&amp;lt;ParentProjectName&amp;gt;/&amp;lt;ChildProjectName&amp;gt;/&amp;lt;DashboardIdentifier&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example starting dashboards:&lt;br /&gt;
* /Project 1/Dashboard 1&lt;br /&gt;
* /Project 1/Project 2/Dashboard 1&lt;br /&gt;
&lt;br /&gt;
See how to define [[QPR_ProcessAnalyzer_Dashboard_Designer#Dashboard_General_Settings|dashboard identifiers]].&lt;br /&gt;
&lt;br /&gt;
== Editing Group Description ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Groups&#039;&#039;&#039; tab.&lt;br /&gt;
# Select a group from the table and click &#039;&#039;&#039;Edit description&#039;&#039;&#039;.&lt;br /&gt;
# Change the group description and click the &#039;&#039;&#039;Save&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
== Deleting Group ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Groups&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the group you want to delete and click the &#039;&#039;&#039;Delete group&#039;&#039;&#039; button.&lt;br /&gt;
# In the confirmation dialog, click the &#039;&#039;&#039;Delete&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Note that when a group is deleted, also its user memberships and roles (both project and global level) are deleted.&lt;br /&gt;
&lt;br /&gt;
== Adding User to Groups ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Users&#039;&#039;&#039; tab.&lt;br /&gt;
# Select a user from the left-side table.&lt;br /&gt;
# In the &#039;&#039;&#039;User belongs to groups&#039;&#039;&#039; table, click the &#039;&#039;&#039;Add to group&#039;&#039;&#039; button.&lt;br /&gt;
# Select a group and &#039;&#039;&#039;Membership type&#039;&#039;&#039;, and click the &#039;&#039;&#039;Save&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* You can edit an existing memberships by selecting it from the table and clicking the &#039;&#039;&#039;Edit&#039;&#039;&#039; button.&lt;br /&gt;
* You can delete an existing memberships by selecting it from the table and clicking the &#039;&#039;&#039;Delete&#039;&#039;&#039; button.&lt;br /&gt;
* You can cancel the editing by clicking the &#039;&#039;&#039;Cancel&#039;&#039; button.&lt;br /&gt;
* The &#039;&#039;Membership type&#039;&#039; is usually &#039;&#039;Member&#039;&#039; (other membership types are for legacy use cases).&lt;br /&gt;
* Note that a user can be added to a group only once.&lt;br /&gt;
&lt;br /&gt;
== Adding Users to Group ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;Groups&#039;&#039; tab.&lt;br /&gt;
# Select a group from the left-side table.&lt;br /&gt;
# In the &#039;&#039;&#039;Group contains users&#039;&#039;&#039; table, click the &#039;&#039;&#039;Add user to group&#039;&#039;&#039; button.&lt;br /&gt;
# Select a user and &#039;&#039;&#039;Membership type&#039;&#039;&#039;, and click the &#039;&#039;&#039;Save&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
See also notes in the [[#Adding User to Groups|Adding User to Groups]] section.&lt;br /&gt;
&lt;br /&gt;
== Assigning Project-Level Roles to Users and Groups ==&lt;br /&gt;
# In the &#039;&#039;Manage Users&#039;&#039; dialog, open the &#039;&#039;Users&#039;&#039; tab (or &#039;&#039;&#039;Groups&#039;&#039;&#039; tab if assigning permissions to a group).&lt;br /&gt;
# Select a user/group from the left-side table.&lt;br /&gt;
# In the &#039;&#039;&#039;Project roles of user/group&#039;&#039;&#039; table, click the &#039;&#039;&#039;Assign role for project&#039;&#039;&#039; button.&lt;br /&gt;
# Select a project and &#039;&#039;&#039;Role&#039;&#039;&#039;, and click the &#039;&#039;&#039;Save&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* You can edit an existing role assignment by selecting it from the table and clicking the &#039;&#039;&#039;Edit&#039;&#039;&#039; button.&lt;br /&gt;
* You can delete an existing role assignment by selecting it from the table and clicking the &#039;&#039;&#039;Delete&#039;&#039;&#039; button.&lt;br /&gt;
* You can cancel the role assignment editing by clicking the &#039;&#039;&#039;Cancel&#039;&#039; button.&lt;br /&gt;
* User can have several roles for a project.&lt;br /&gt;
&lt;br /&gt;
== Assigning Global Roles to Users and Groups ==&lt;br /&gt;
# In the &#039;&#039;Manage Users&#039;&#039; dialog, open the &#039;&#039;Users&#039;&#039; tab (or &#039;&#039;&#039;Groups&#039;&#039;&#039; tab if assigning permissions to a group).&lt;br /&gt;
# Select a user/group from the left-side table.&lt;br /&gt;
# In the &#039;&#039;&#039;Global roles of user/group&#039;&#039;&#039; section, check/uncheck one of the global role checkboxes. Changes are saved.&lt;br /&gt;
&lt;br /&gt;
== Inactivating Users ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Users&#039;&#039;&#039; tab.&lt;br /&gt;
# Select one or several users to be inactivated from the left-side table, and click the &#039;&#039;&#039;Inactivate users&#039;&#039;&#039; button.&lt;br /&gt;
# In the confirmation dialog, click the &#039;&#039;&#039;Inactivate&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
In QPR ProcessAnalyzer, users cannot be deleted, so that the audit data is preserved (such as who created and updated objects). Instead, if user is not needed anymore, the user account needs to be inactivated, as inactive users cannot login to the system. &lt;br /&gt;
&lt;br /&gt;
Note that inactive users information cannot be changed, so the user needs to be activated first.&lt;br /&gt;
&lt;br /&gt;
== Activating Users ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Inactive users&#039;&#039;&#039; tab.&lt;br /&gt;
# Select one or several users to be activated from the table, and click the &#039;&#039;&#039;Activate users&#039;&#039;&#039; button.&lt;br /&gt;
# In the confirmation dialog, click the &#039;&#039;&#039;Activate&#039;&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
== Checking User or Project Effective Permissions ==&lt;br /&gt;
# In the &#039;&#039;&#039;Manage Users&#039;&#039;&#039; dialog, open the &#039;&#039;&#039;Effective permissions&#039;&#039;&#039; tab.&lt;br /&gt;
# Select either a project from the &#039;&#039;&#039;Project&#039;&#039;&#039; list or a user from the &#039;&#039;&#039;User&#039;&#039;&#039; list.&lt;br /&gt;
# Table is showing the effective permissions for the selected project or user.&lt;br /&gt;
&lt;br /&gt;
When showing effective permissions for a project, the effective permissions table shows all users that have any permissions to the project. The checkboxes are showing the individual [[Roles_and_Permissions#Global_and_Project_Roles|permissions]] for each user. When showing effective permissions for a user, the effective permissions table shows all projects where the user has any permissions. The checkboxes are showing the individual [[Roles_and_Permissions#Global_and_Project_Roles|permissions]] for each project. &lt;br /&gt;
&lt;br /&gt;
== Prevent Removing Own Access ==&lt;br /&gt;
QPR ProcessAnalyzer has a built-in protection mechanism to prevent users from inadvertently revoking their own access rights. If this were possible, the last administrator could inadvertently remove their own permissions, leaving no one able to manage permissions. To perform operations that are blocked for this reason, another administrator user is required.&lt;br /&gt;
&lt;br /&gt;
The following operations are restricted (to mitigate the risk of self-removal of access rights):&lt;br /&gt;
* Users cannot inactivate their own user accounts.&lt;br /&gt;
* Users cannot remove the global adminstrator role assigned to themselves.&lt;br /&gt;
* Users cannot exit a user group if it has the global adminstrator role assigned, unless the user itself has the global administrator role.&lt;br /&gt;
* Users cannot remove the global adminstrator role from a group if they are members of that group, unless the user itself has the global administrator role.&lt;br /&gt;
* Users cannot delete groups with the global adminstrator role if they belong to those groups, unless the user itself has the global administrator role.&lt;br /&gt;
&lt;br /&gt;
[[Category: QPR ProcessAnalyzer]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28542</id>
		<title>User Profile</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28542"/>
		<updated>2026-06-17T14:11:53Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preferences ==&lt;br /&gt;
The Preferences tab has the following settings available.&lt;br /&gt;
&lt;br /&gt;
=== Localization settings ===&lt;br /&gt;
User can set the user&#039;s own language, content language, date format, first day of week and whether the 12-hour clock is used. See [[Languages_and_Localization#Date_Format_Settings|more information]].&lt;br /&gt;
&lt;br /&gt;
== User Information ==&lt;br /&gt;
User Information tab shows following information for the currently logged in user:&lt;br /&gt;
* &#039;&#039;&#039;User name&#039;&#039;&#039;: Login name used when user logs in.&lt;br /&gt;
* &#039;&#039;&#039;Full name&#039;&#039;&#039;: Person full name (for example first name and last name).&lt;br /&gt;
* &#039;&#039;&#039;Email&#039;&#039;&#039;: User&#039;s email address.&lt;br /&gt;
* &#039;&#039;&#039;Groups&#039;&#039;&#039;: Groups the user belongs to. The user gets permissions from the groups.&lt;br /&gt;
* &#039;&#039;&#039;Global roles&#039;&#039;&#039;: List of global roles the user has. There is one or several permissions in each role and user gets permissions from the roles.&lt;br /&gt;
* &#039;&#039;&#039;Global permissions&#039;&#039;&#039;: List of global permissions the user has. The permissions determine what actions the user has in the system. &lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Authenticated using&#039;&#039;&#039; field describes which authentication method was used to log in to QPR ProcessAnalyzer. There are following options:&lt;br /&gt;
* QPR ProcessAnalyzer password&lt;br /&gt;
* External identity provider through SAML 2.0&lt;br /&gt;
* Snowflake (available in Snowflake Native App)&lt;br /&gt;
&lt;br /&gt;
== Change password ==&lt;br /&gt;
User can change their own password. When changing the password, you need to provide your current password and also confirm the new password. Note that when authenticated using the SSO (SAML 2.0 identity provided) or Snowflake, the password changing in QPR ProcessAnalyzer is not available.&lt;br /&gt;
&lt;br /&gt;
When running QPR ProcessAnalyzer as Snowflake Native App, there is also &#039;&#039;&#039;Login as other user&#039;&#039;&#039; button to log out QPR ProcessAnalyzer session and go the login screen, so that a different QPR ProcessAnalyzer user can be used. The Snowflake session is not logged out when pressing this button.&lt;br /&gt;
&lt;br /&gt;
== Starting dashboard ==&lt;br /&gt;
Starting dashboard (a.k.a. default dashboard) can be defined that is opened when a user logs in. The starting dashboard can be a navigation page containing links to other dashboards in the process mining application.&lt;br /&gt;
&lt;br /&gt;
The starting dashboard is defined for a group, allowing to define different starting dashboards for users of different groups. All users belonging to a group with a starting dashboard will define that as the starting dashboard for all the users in that group. If a user belongs to multiple groups with each having a starting dashboard, the user&#039;s starting dashboard will be taken from a group having alphabetically the first name. Thus, it&#039;s possible to define a starting dashboard for a narrower group that overrides a larger group, if the narrower group is alphabetically before the larger group.&lt;br /&gt;
&lt;br /&gt;
See how to [[Manage_Users_and_Groups#Editing_Group_Information|configure starting dashboards]].&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28539</id>
		<title>User Profile</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28539"/>
		<updated>2026-06-17T14:11:09Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preferences ==&lt;br /&gt;
The Preferences tab has the following settings available.&lt;br /&gt;
&lt;br /&gt;
=== Localization settings ===&lt;br /&gt;
User can set the user&#039;s own language, content language, date format, first day of week and whether the 12-hour clock is used. See [[Languages_and_Localization#Date_Format_Settings|more information]].&lt;br /&gt;
&lt;br /&gt;
== User Information ==&lt;br /&gt;
User Information tab shows following information for the currently logged in user:&lt;br /&gt;
* &#039;&#039;&#039;User name&#039;&#039;&#039;: Login name used when user logs in.&lt;br /&gt;
* &#039;&#039;&#039;Full name&#039;&#039;&#039;: Person full name (for example first name and last name).&lt;br /&gt;
* &#039;&#039;&#039;Email&#039;&#039;&#039;: User&#039;s email address.&lt;br /&gt;
* &#039;&#039;&#039;Groups&#039;&#039;&#039;: Groups the user belongs to. The user gets permissions from the groups.&lt;br /&gt;
* &#039;&#039;&#039;Global roles&#039;&#039;&#039;: List of global roles the user has. There is one or several permissions in each role and user gets permissions from the roles.&lt;br /&gt;
* &#039;&#039;&#039;Global permissions&#039;&#039;&#039;: List of global permissions the user has. The permissions determine what actions the user has in the system. &lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Authenticated using&#039;&#039;&#039; field describes which authentication method was used to log in to QPR ProcessAnalyzer. There are following options:&lt;br /&gt;
* QPR ProcessAnalyzer password&lt;br /&gt;
* External identity provider through SAML 2.0&lt;br /&gt;
* Snowflake (available in Snowflake Native App)&lt;br /&gt;
&lt;br /&gt;
== Change password ==&lt;br /&gt;
User can change user own password. When changing the password, you need to provide your current password and also confirm the new password. Note that when authenticated using the SSO (SAML 2.0 identity provided) or Snowflake, the password changing in QPR ProcessAnalyzer is not available.&lt;br /&gt;
&lt;br /&gt;
When running QPR ProcessAnalyzer as Snowflake Native App, there is also &#039;&#039;&#039;Login as other user&#039;&#039;&#039; button to log out QPR ProcessAnalyzer session and go the login screen, so that a different QPR ProcessAnalyzer user can be used. The Snowflake session is not logged out when pressing this button.&lt;br /&gt;
&lt;br /&gt;
== Starting dashboard ==&lt;br /&gt;
Starting dashboard (a.k.a. default dashboard) can be defined that is opened when a user logs in. The starting dashboard can be a navigation page containing links to other dashboards in the process mining application.&lt;br /&gt;
&lt;br /&gt;
The starting dashboard is defined for a group, allowing to define different starting dashboards for users of different groups. All users belonging to a group with a starting dashboard will define that as the starting dashboard for all the users in that group. If a user belongs to multiple groups with each having a starting dashboard, the user&#039;s starting dashboard will be taken from a group having alphabetically the first name. Thus, it&#039;s possible to define a starting dashboard for a narrower group that overrides a larger group, if the narrower group is alphabetically before the larger group.&lt;br /&gt;
&lt;br /&gt;
See how to [[Manage_Users_and_Groups#Editing_Group_Information|configure starting dashboards]].&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Release_Notes&amp;diff=28536</id>
		<title>QPR ProcessAnalyzer Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Release_Notes&amp;diff=28536"/>
		<updated>2026-06-17T14:03:01Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all new features and fixed issues for each QPR ProcessAnalyzer release.&lt;br /&gt;
&lt;br /&gt;
==Next Release: QPR ProcessAnalyzer 2026.5 (release during the week starting 22 June)==&lt;br /&gt;
[[Next_Release_Roadmap|See roadmap for next release features and fixes]]&lt;br /&gt;
&lt;br /&gt;
==Current Release: QPR ProcessAnalyzer 2026.4 (build 10956) (released 20.5.2026)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2026_4.pdf QPR_ProcessAnalyzer_2026_4.pdf]&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* [[QPR_ProcessAnalyzer_BPMN_Editor#Opening_and_Saving_a_Diagram_in_the_Repository|BPMN diagrams stored in QPR EnterpriseArchitect]] can be opened and saved in QPR ProcessAnalyzer BPMN editor for conformance analysis. (B-09041)&lt;br /&gt;
* Added setting [[PA_Configuration_database_table#:~:text=AIAgentDefaultModelName|AIAgentDefaultModelName]] to define AI Agent&#039;s default LLM in dashboards, and updated &amp;quot;gpt-5.4&amp;quot; as default when OpenAIDefaultModelName setting is not defined. (B-09039)&lt;br /&gt;
* Implemented OAuth refresh tokens grace period, and limited MCP tool names to 50 characters. (B-09090)&lt;br /&gt;
* In object-centric flowchart, [[Object-Centric_Flowchart#Object-centric_flowchart_general_settings|object types can be hidden and shown]] with an toggle button, and flowchart flow routing has been improved to avoid label overlapping. (B-09042)&lt;br /&gt;
* [[QPR_ProcessAnalyzer_Table|Table]] header margins have been adjusted to fit more text, and column filter menu icon is shown only when hovering header. (B-09032)&lt;br /&gt;
* Expression language API is available to move filters to different model, and added functions [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#:~:text=CreateScript|CreateScript]] for project, and [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Script|Modify]] and [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Script|DeletePermanently]] for script objects. (B-09006)&lt;br /&gt;
* Datatables foreign keys are maintained consistent when datatable columns are renamed and deleted, and datatables are renamed, moved and deleted. (B-09035)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Listing scripts was slow when there were lot of script and operation logs. (D-14875)&lt;br /&gt;
* Error message returned from MCP tool call includes now actual exception message. (D-14870)&lt;br /&gt;
* Filtering Case and Event attribute profiling presets with decimal type of attributes didn&#039;t work in Snowflake models. (D-14866)&lt;br /&gt;
* Fixed issue where AI Agent did not provide any response for an eventlog with zero cases. (D-14835)&lt;br /&gt;
* Variation filter showed &amp;quot;undefined&amp;quot; in place of the variation order number when filtered variations were not in the eventlog. (D-14857)&lt;br /&gt;
* Improved error message in situation when model doesn&#039;t have the case or event attribute used by a chart filter. (D-14865)&lt;br /&gt;
* Improved model validation to detect when connection to the source tables in Snowflake is not valid. (D-14837)&lt;br /&gt;
* &amp;quot;Datatable with given name already exists in project&amp;quot; error message had localization missing. (D-14838)&lt;br /&gt;
&lt;br /&gt;
===Other improvements===&lt;br /&gt;
* Frontend components have been updated. (B-09063)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2026.3.1 (build 10941) (released 30.4.2026)==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* MCP tools support [[Create_MCP_Tools#MCP_Tool_Settings|input parameters, structured output]], MCP metadata, and OAuth in Windows deployments. (B-09048)&lt;br /&gt;
* MCP supports [[PA_Configuration_database_table#:~:text=ClientCredentials|OAuth client credentials flow]], refresh tokens, and rate limiting. (B-09080)&lt;br /&gt;
* [[Data_Schema_Dialog|Data schemas]] consisting of datatables and relations can be visualized and modified using ER diagrams. (B-09023)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Business calendar related model properties could not be shown in chart settings. (D-14858)&lt;br /&gt;
* Fixed unclear error when Snowflake connection string keys was removed when project was imported. (D-14833)&lt;br /&gt;
&lt;br /&gt;
===Other improvements===&lt;br /&gt;
* Backend components have been updated. (B-09064)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2026.3 (build 10933) (released 13.04.2026)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2026_3.pdf QPR_ProcessAnalyzer_2026_3.pdf]&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* QPR ProcessAnalyzer acts as [[QPR_ProcessAnalyzer_as_MCP_Server|MCP server]] supporting MCP tools implemented using scripts with OAuth and API key authentication. (B-09004)&lt;br /&gt;
* [[Object-centric_Process_Mining_Model#Configure_object-centric_model|Units for each object type]] can be specified in object-centric models. (B-08992)&lt;br /&gt;
* [[PA_Configuration_database_table#:~:text=DefaultColorPalette|Charts color palette]] can be changed globally to easily manage consistent visual layout. (B-08993)&lt;br /&gt;
* [[External_Content|External content component]] url supports tags refering to dashboard variables to show dynamically changing web page. (B-08998)&lt;br /&gt;
* [[QPR_ProcessAnalyzer_Project_Workspace#Exporting_Project|Project export and import]] using files support public filters stored in models. (B-09007)&lt;br /&gt;
* [[QPR_ProcessAnalyzer_KPI_Card|KPI Card]] shows null value label when data has no rows, and table and chart show &amp;quot;No data&amp;quot; message. (B-08999)&lt;br /&gt;
* [[QPR_MEA_Integration|QPR MEA web service]] operations can be called using QPR ProcessAnalyzer expression language. (B-09030)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Flowchart had flows missing if shown flows were beyond the top-500 flows. (D-14848)&lt;br /&gt;
* Expression filter rules with greater/less than criteria were incorrectly applied as equal filters when editing chart filters. (D-14852)&lt;br /&gt;
* Table column filter dialog was not entire visible in narrow table located in the bottom of screen. (D-14783)&lt;br /&gt;
* Opening Scripts tab in Workspace was slow when there were scripts with long script log. (D-14670)&lt;br /&gt;
* Fixed issue where object-centric model queries sometimes gave inconsistent results. (D-14854)&lt;br /&gt;
* Snowflake query gave &amp;quot;invalid identifier&amp;quot; error when there were two measures with same cases going though event measure filter. (D-14845)&lt;br /&gt;
* Filter rules drag-and-drop didn&#039;t work between expressions in the same chart. (D-14850)&lt;br /&gt;
* Better error message is shown when invalid value is specified to dashboard aspect ratio flex, chart margin, dashboard margin, external content border width, or external content border corner radius. (D-14805)&lt;br /&gt;
* Improved error message when object-centric model perspective doesn&#039;t have the object type correctly defined. (D-14795)&lt;br /&gt;
* Reduced project properties dialog minimum height to fit for smaller screens. (D-14834)&lt;br /&gt;
* Updated NLTK to version 3.9.3. (D-14829)&lt;br /&gt;
&lt;br /&gt;
* Frontend components have been updated. (B-09028)&lt;br /&gt;
* Backend components have been updated. (B-09027)&lt;br /&gt;
&lt;br /&gt;
==Additional release for QPR ProcessAnalyzer 2026.2 (build 10910) (released 16.3.2026)==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* Filters report in System reports shows also other users&#039; private filters for admins. (B-09017)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Filter rules were lost when saving a filter with &amp;quot;Cases with specific events&amp;quot;, &amp;quot;Cases starting with&amp;quot; or &amp;quot;Cases ending to&amp;quot; rules. (D-14847)&lt;br /&gt;
* Fixed issue where object-centric models sometimes gave &amp;quot;Object &amp;lt;cachetablename&amp;gt; does not exist or not authorized&amp;quot; error. (D-14797)&lt;br /&gt;
* ExtractSap function didn&#039;t work with QPR ScriptLauncher when using secret for storing SAP password. (D-14813)&lt;br /&gt;
* Variation stepper incorrectly skipped steps when going down when variation count is maximum. (D-14844)&lt;br /&gt;
* Improved error message when creating model from filter fails. (D-14811)&lt;br /&gt;
* System dashboard names were incorrectly translated twice. (D-14841)&lt;br /&gt;
* AI Assistant had one translation missing. (D-14840)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2026.2 (build 10897) (released 2026-02-26)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2026_2.pdf QPR_ProcessAnalyzer_2026_2.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
Snowflake user-defined functions (UDF) used by QPR ProcessAnalyzer have been updated to use Python 3.13. Some of the old versions of the functions use Python 3.9 which has been deprecated by Snowflake. Although the old versions are not anymore used by QPR ProcessAnalyzer, they are not automatically deleted and thus Snowflake may send notifications about existing deprecated functions. It&#039;s recommended to remove the old functions which are following:&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES_V2&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES_V3&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES_V4&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES_V5&lt;br /&gt;
* QPRPA_UDF_BC_DURATION_BETWEEN_DATES_V6&lt;br /&gt;
* QPRPA_UDF_BPMN_CONFORMANCE_VIOLATIONS_FLOWS&lt;br /&gt;
* QPRPA_UDF_BPMN_CONFORMANCE_VIOLATIONS_FLOWS_V2&lt;br /&gt;
* QPRPA_UDF_BPMN_CONFORMANCE_VIOLATIONS_FLOWS_V3&lt;br /&gt;
* QPRPA_UDF_BPMN_IS_CONFORMANT&lt;br /&gt;
* QPRPA_UDF_BPMN_IS_CONFORMANT_V2&lt;br /&gt;
* QPRPA_UDF_BPMN_IS_CONFORMANT_V3&lt;br /&gt;
* QPRPA_UDTF_CLUSTER&lt;br /&gt;
* QPRPA_UDTF_CLUSTER_V2&lt;br /&gt;
* QPRPA_UDTF_CLUSTER_V3&lt;br /&gt;
* QPRPA_UDTF_CLUSTER_V4&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* Fully conformant [[QPR_ProcessAnalyzer_BPMN_Editor#Auto-creating_BPMN_Diagram_from_Eventlog|BPMN diagrams]] can be created from eventlogs with proper layout and identifying exclusive and parallel gateways. (B-08900)&lt;br /&gt;
* [[Object-Centric_Flowchart|Object-centric flowchart]] flows visibility can be controlled with a stepper based on top variations, and start and end symbols can be hidden for each event type. (B-08987)&lt;br /&gt;
* Added preset for object-centric flowchart, and improved Process Discovery dashboard usage for object-centric models. (B-08863)&lt;br /&gt;
* Viewer users can [[Filtering_in_QPR_ProcessAnalyzer#Saving_filters|save private filters]] for personal use. (B-08920)&lt;br /&gt;
* [[Chart_On-screen_Settings|On-screen settings]] support static and dynamic case/event attribute values selection, and [[Chart_Linked_Settings|linked settings]] can bind to on-screen settings. (B-08814)&lt;br /&gt;
* [[AI_Root_Causes|AI root causes analysis]] related error situations are easier to resolve with easier to understand error messages. (B-08997)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Histogram chart did not show at all and gave a JavaScript error. (D-14801)&lt;br /&gt;
* When chart with multiple series was sorted by measure, some datapoints were not shown when visible X-axis was limited by zooming or Custom layout settings. (D-14793)&lt;br /&gt;
* Disabled filter rules were incorrectly applied for the shown items in the filter rule editing dialog. (D-14791)&lt;br /&gt;
* If there were more than one Range filter components in dashboard, periods menu incorrectly affected all of them. (D-14818)&lt;br /&gt;
* List of event types in object-centric flowchart settings didn&#039;t open if there were object types linked to none events. (D-14798)&lt;br /&gt;
* Snowflake flowchart root causes analysis gave &amp;quot;SQL compilation error&amp;quot; when run with case duration criteria. (D-14790)&lt;br /&gt;
* Term &amp;quot;Second&amp;quot; when meaning time unit was translated incorrectly in French. (D-14803)&lt;br /&gt;
* OpenTelemetry metrics were not sent to Prometheus correctly. (D-14804)&lt;br /&gt;
* Opening script editor by url didn&#039;t show project path and also javascript error appeared to console. (D-14794)&lt;br /&gt;
* Fixed issue where case attribute prediction failed when using more than one iteration. (D-14789)&lt;br /&gt;
* SQLDataFrame with several append operations had performance issue. (D-14772)&lt;br /&gt;
* Null coalescing operators didn&#039;t work correctly in chaining in expression language. (D-14762)&lt;br /&gt;
* Native app could not call procedure if project referred to other database and schema. (D-14749)&lt;br /&gt;
* Trying to create script with duplicate name gave unclear error: Cannot insert duplicate key row in object &#039;dbo.PA_SCRIPT&#039; with unique index &#039;PA_SCRIPT_UNIQUE_NAME_IN_PROJECT&#039;. (D-14784)&lt;br /&gt;
* BPMN editor popup menu was partly hidden behind other chart components. (D-14345)&lt;br /&gt;
* When going to context menu report from BPMN editor, &amp;quot;Operation was cancelled by a user&amp;quot; was given when query was in progress. (D-14807)&lt;br /&gt;
* BPMN editor tooltips measure descriptions didn&#039;t disappear at all. (D-14809)&lt;br /&gt;
* Presets benchmarking didn&#039;t work for models without case attributes. (D-14822)&lt;br /&gt;
* Object-centric filter rule editor gave javascript error when opened for case-centric model. (D-14799)&lt;br /&gt;
* Object-centric filter rule could incorrectly be dropped as root causes comparison rule. (D-14796)&lt;br /&gt;
* Localization missing for &amp;quot;Save as new filter&amp;quot; button. (D-14839)&lt;br /&gt;
&lt;br /&gt;
===Other improvements===&lt;br /&gt;
* SQL queries run in Snowflake have been further optimized. (B-08936)&lt;br /&gt;
* Snowflake stored procedures and user defined functions have been migrated to Python 3.13. (B-08984)&lt;br /&gt;
* Frontend components have been updated. (B-08991)&lt;br /&gt;
* Backend components have been updated. (B-08990)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2026.1 (build 10870) (released 2026-01-19)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2026_1.pdf QPR_ProcessAnalyzer_2026_1.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
QPR ProcessAnalyzer Server and QPR ScriptLauncher are running on .NET 10, replacing the previous .NET 8 version. When updating to this release, make sure to install the .NET 10 Runtime ([[Updating_QPR_ProcessAnalyzer_Server|update instructions]]). While .NET 8 and .NET 10 can run side by side, .NET 8 does not need to be removed immediately. However, for security reasons, any unused .NET 8 installation should be uninstalled as soon as possible after the update.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
Known issue: The histogram visualization doesn&#039;t work in this release. The issue will be fixed in the next release. Possible workaround is to use the column chart where to set no spacing between columns. This can be configured with the following [[QPR_ProcessAnalyzer_Chart#:~:text=Custom%20Layout|Custom Layout]] settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;plotOptions&amp;quot;: {&lt;br /&gt;
		&amp;quot;series&amp;quot;: {&lt;br /&gt;
			&amp;quot;pointPadding&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;groupPadding&amp;quot;: 0&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
*Object-centric models support versatile [[Filtering_in_QPR_ProcessAnalyzer|object-centric filters]] based on case-centric filter rules using perspective. (B-08595)&lt;br /&gt;
*[[AI_Root_Causes|AI Root Causes analysis]] is shown in a hierarchy for easier readability. (B-08921)&lt;br /&gt;
*[[Process_Flowchart|Case-centric flowchart]] performance has been improved by making all queries simultaneously. (B-08916)&lt;br /&gt;
* Object counts indicator is hidden for object-centric models when perspective is not set. (B-08825)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
* Filter to exclude case attribute values incorrectly excluded null values even if null wasn&#039;t selected. (D-14773)&lt;br /&gt;
*Prediction generated invalid models where case IDs in events datatable didn&#039;t exist in cases datatable. (D-14758)&lt;br /&gt;
* AI Root Causes presets didn&#039;t work with models without case attributes. (D-14759)&lt;br /&gt;
* Snowflake query with multiple columns with aggregations and Coalesce function gave &amp;quot;invalid identifier&amp;quot; error. (D-14763)&lt;br /&gt;
*Dropdown list to add business calendar holidays from other model shows empty items. (D-14786)&lt;br /&gt;
*In-memory Average function didn&#039;t work when aggregating dates using model&#039;s Attribute function. (D-14761)&lt;br /&gt;
*Sometimes opening models list gave error &amp;quot;User doesn&#039;t have permission GenericRead to model&amp;quot;. (D-14742)&lt;br /&gt;
&lt;br /&gt;
===Other improvements=== &lt;br /&gt;
*[[QPR_ProcessAnalyzer_Security_Hardening#Added_HTTP_Headers|Content-security-policy]] img-src blob: directive has been restored for Highcharts image export. (B-08904)&lt;br /&gt;
*Backend components have been updated [[Updating_QPR_ProcessAnalyzer_Server|including .NET 10]]. (B-08926)&lt;br /&gt;
*Frontend components have been updated. (B-08927)&lt;br /&gt;
&lt;br /&gt;
==Additional release for QPR ProcessAnalyzer 2025.7 (build 10845) (released 2025-12-11)==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
*QPR ProcessAnalyzer can be deployed on-premise using [[Deploy_QPR_ProcessAnalyzer_from_Container|Linux containers]]. (B-08915)&lt;br /&gt;
*Snowflake SQL queries have been simplified to improve performance, e.g., when quering flows. (B-08901)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues=== &lt;br /&gt;
*ODBC and Loading script models, and models with calculated attributes didn&#039;t allow to create or modify case and event attribute filters from header. (D-14751)&lt;br /&gt;
*Fixed incompatibility issue when using Keycloak as identity provider for SAML authentication. (D-14757)&lt;br /&gt;
*System report for users incorrectly listed some users with read-only permissions as Developers (issue with the EffectivePermissionTypesFor function). (D-14748)&lt;br /&gt;
*Referrer-Policy HTTP header was incorrectly set to &amp;quot;same-origins&amp;quot; causing browser console error in Windows deployments. (D-14736)&lt;br /&gt;
*Fixed issue where QPR ProcessAnalyzer request ID was not added to Snowflake data modification queries. (D-14728)&lt;br /&gt;
*Login request duration was incorrectly shown as zero or negative in System reports. (D-14737)&lt;br /&gt;
*In chart settings, some Snowflake measures with aggregations were missing possibility to define percentile value. (D-14276)&lt;br /&gt;
*Fixed issue where it was not possible to delete a model with same name in the same project during the same session. (D-14708)&lt;br /&gt;
*Script editor to specific script can now be opened with a direct url containing the script_editor parameter. (D-14745)&lt;br /&gt;
*Fixed issue were sometimes an incorrect error code was given for a cancelled query. (D-14755)&lt;br /&gt;
*Improved error message if model loading fails when loading script returns incorrect type of data. (D-14637)&lt;br /&gt;
*Fixed issue where variations query with sampling was slow for new models. (D-14729)&lt;br /&gt;
*Added tooltip to gantt chart&#039;s table layout header so that the header text can be fully seen. (D-13748)&lt;br /&gt;
*Switching between Snowflake and in-memory chart by adjusting chart configuration json caused some items in chart settings to appear twice. (D-14667)&lt;br /&gt;
*Selecting model in dashboard when previously there was no model selected and going back to Workspace, gave error message. (D-14735)&lt;br /&gt;
*Query Designer gave untranslated error message: &amp;quot;You don&#039;t have permissions to model ...&amp;quot;. (D-14727)&lt;br /&gt;
*Query Designer gave untranslated error message &amp;quot;Unable to use Snowflake tables as data source for in-memory query&amp;quot;. (D-14683)&lt;br /&gt;
*In Query Designer, table column menu gave JavaScript error for columns where first row was null. (D-14684)&lt;br /&gt;
*Query Designer incorrectly gave message &amp;quot;There are no columns in the data&amp;quot; when the data had no rows. (D-14692)&lt;br /&gt;
*Fixed issue in Manage Users dialog where row selections disappeared when resizing the dialog. (D-14647)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2025.7 (build 10821) (released 2025-11-13)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2025_7.pdf QPR_ProcessAnalyzer_2025_7.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
Known issue: Creating case and event attribute filters in dashboards is not possible from the main header for the following types of in-memory models and attributes:&lt;br /&gt;
*Any attributes for [[QPR_ProcessAnalyzer_Model_Datasources#ODBC_Datasource|ODBC loaded models]]&lt;br /&gt;
*Any attributes for [[QPR_ProcessAnalyzer_Model_Datasources#Loading_Script|Loading script models]]&lt;br /&gt;
*Calculated attributes in any in-memory models.&lt;br /&gt;
&lt;br /&gt;
Workaround is to create the filter rule in a chart&#039;s settings and drag-and-drop it to the header. The issue has been fixed by the next release (D-14751). The issue does not concern Snowflake models.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New features ===&lt;br /&gt;
*Presets added for [[AI_Root_Causes|AI Root Causes analysis]] based on Snowflake Top Insights which is a decision tree model finding combinations of root cause contributors. (B-08889)&lt;br /&gt;
*Added new [[Range_Filter|filter selector]] component to dashboards to easily create date and number range filters. (B-08877)&lt;br /&gt;
*Projects can be browsed in the [[Navigation_Menu|navigation menu]] to access all dashboards, and also organized the menu into two columns. (B-08708)&lt;br /&gt;
*When QPR ProcessAnalyzer is [[Embed_to_Website|embedded to a website]], SAML authentication is performed in a separate window for more robust operation. (B-08871)&lt;br /&gt;
*For more flexible options, [[AI_Agent|AI Agents]] runs the language model query using the Snowflake account where the selected model is located. (B-08860)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
*If DefaultUiLanguage in PA_CONFIGURATION table was not defined, users who haven&#039;t changed language could not login. (D-14706)&lt;br /&gt;
*Improved performance in opening dashboard. (D-14705)&lt;br /&gt;
* Snowflake Native App didn&#039;t show the version number and build timestamp correctly. (D-14703)&lt;br /&gt;
*Snowflake Native App activation failed with a custom compute pool if container service was in the suspended state. (D-14722)&lt;br /&gt;
*Server stuck when trying to generate SQL for SqlDataFrame having multiple columns with the same name. (D-14730)&lt;br /&gt;
*In eventlog prediction, fixed issues preventing the usage of case attribute value prediction. (D-14702)&lt;br /&gt;
*Snowflake DurationBetweenDates function calculated incorrectly when used in a in divisor. (D-14723)&lt;br /&gt;
* Import now succeeds when importing Snowflake datatables refering to data without access. (D-14694)&lt;br /&gt;
*Fixed incorrect color in table column filters, and Workspace loading time has been improved. (D-14704)&lt;br /&gt;
* Fixed issue where dropdown list with projects showed &amp;quot;undefined&amp;quot; in place of project id. (D-14659)&lt;br /&gt;
*Fixed issue where specifying a secret name longer than 440 characters, prevented saving the secret and resulted in an error. (D-14674)&lt;br /&gt;
* SAML authentication failed when it needed to create a new user to QPR ProcessAnalyzer. (D-14717)&lt;br /&gt;
* Fixed issue where SQL dataframe queries didn&#039;t work if the root expression ended to a semicolon. (D-14714)&lt;br /&gt;
*Specific Snowflake query with a comparison criteria, AggregateFrom and GetValueFrom functions gave error about invalid identifier. (D-14718)&lt;br /&gt;
&lt;br /&gt;
===Other improvements=== &lt;br /&gt;
*[[QPR_ProcessAnalyzer_Security_Hardening#HTTP_Response_Headers|Content-Security-Policy HTTP header]] has been reduced to more secure by removing the script-src &#039;unsafe-eval&#039; and img-src &#039;blob&#039; directives. (B-08897)&lt;br /&gt;
*Added [[QPR_ProcessAnalyzer_Security_Hardening#HTTP_Response_Headers|security related HTTP headers]]: X-Permitted-Cross-Domain-Policies, Cross-Origin-Embedder-Policy, Cross-Origin-Opener-Policy, Cross-Origin-Resource-Policy, Referrer-Policy, and Permissions-Policy. (B-08879)&lt;br /&gt;
*Implemented backend support for Snowflake Top Insights for [[SqlDataFrame_in_Expression_Language#:~:text=TopInsights|AI root causes analysis]]. (B-08664)&lt;br /&gt;
*Implemented improved error handling when trying to save too long text to database. (B-08892)&lt;br /&gt;
*For more understandable error messages, error handling and error message generation have been refactored. (B-08754)&lt;br /&gt;
*Optimized database queries and reduced log writing. (B-08870)&lt;br /&gt;
*Frontend components have been updated. (B-08899)&lt;br /&gt;
*Backend components have been updated. (B-08898)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2025.6 (build 10690) (released 2025-10-01)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2025_6.pdf QPR_ProcessAnalyzer_2025_6.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
Known issue: If the [[PA_Configuration_database_table#:~:text=DefaultUiLanguage|DefaultUiLanguage]] system configuration is not defined, users who haven&#039;t changed their own language, are unable to login. To prevent this problem, please ensure the DefaultUiLanguage is defined. The next release has fixed this issue (D-14706).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
Content-Security-Policy (CSP) HTTP header has been updated to enhance security by implementing more restrictive settings. The following directives have been added:&lt;br /&gt;
*object-src &#039;none&#039;&lt;br /&gt;
*frame-ancestors &#039;self&#039;&lt;br /&gt;
*form-action &#039;none&#039;&lt;br /&gt;
*base-uri &#039;none&#039;&lt;br /&gt;
*worker-src blob:&lt;br /&gt;
&lt;br /&gt;
These new restrictions may affect usage that has previously been possible. For example, with the new settings, QPR ProcessAnalyzer can be embedded to a website only within the same origin. For detailed instructions on embedding QPR ProcessAnalyzer on a different website, please refer to [[Embed_to_Website|this quide]]. Additionally, for information on modifying the CSP settings, see documentation for [[QPR_ProcessAnalyzer_Security_Hardening#HTTP_Response_Headers|security hardening]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
In the QPR ProcessAnalyzer 2025.6 Native App, the release version number is not displayed correctly in the User Settings dialog. This omission does not have any other complications. QPR ProcessAnalyzer 2025.6 is the only release with this issue, making it possible to identify this release despite the missing version number. This issue is specific to the Native App only. The next release has fixed this issue (D-14703).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
*[[User_Profile#Starting_dashboard|Starting dashboard]] after login can be defined for user groups, allowing to create customized starting pages for easy navigation. (B-08791)&lt;br /&gt;
*Snowflake [[QPR_ProcessAnalyzer_Chart#Filtering_Settings|chart&#039;s event filters]] are now embedded to filters created from chart, to precisely follow chart calculation. (B-08845)&lt;br /&gt;
*Result data can be filtered in Snowflake charts using [[QPR_ProcessAnalyzer_Chart#:~:text=Result%20filtering%20expression|result filtering expression]] which works for any datasets. (B-08751)&lt;br /&gt;
*Filter rules order now stays the same when making filter selections and confirming filter. (B-08801)&lt;br /&gt;
*Added model setting [[QPR_ProcessAnalyzer_Project_Workspace#Hiding_Object_Count_Statistics|Show object count statistics]] to hide object counts information in dropdown lists to optimize performance. (B-08849)&lt;br /&gt;
*Added support for [[Chart_On-screen_Settings#:~:text=showStatistics|hiding statistics for on-screen setting]] dropdown lists to improve performance, and in addition the case ID is hidden Case/Event attribute profiling presets. (B-08840)&lt;br /&gt;
*Added following audit fields to users and groups: Created date, Created by, Last modified date, and Last modified by. (B-08792)&lt;br /&gt;
*Snowflake Native App: Added procedure to that [[QPR_ProcessAnalyzer_Native_App_in_Snowflake#Recover_administrator_access|creates administrator user to Native App]] if access to the app has been lost. Also, prevented user management operations that remove own access. (B-08733)&lt;br /&gt;
*Snowflake Native App: Added procedure to [[Change_Native_App_Compute_Pool_Size|change Native App compute pool size]]. Changed new Native Apps to use CPU_X64_S size compute pool, and improved Native App stability. (B-08859)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues=== &lt;br /&gt;
*Snowflake Cortex based AI Assistant didn&#039;t show the results table. (D-14643)&lt;br /&gt;
*When percent stacking is used, Y-axis values are now shown as percentages in data label and tooltip. (D-14633)&lt;br /&gt;
*Fixed issue where Label&amp;amp;Link component had sometimes unnecessary vertical scrollbar. (D-14685)&lt;br /&gt;
*Model validation showed incorrect error message for models with numeric duplicate case ID&#039;s. (D-14687)&lt;br /&gt;
*In Workspace, scripts &amp;quot;View current run log&amp;quot; dialog didn&#039;t update log correctly when new entries were added. (D-14662)&lt;br /&gt;
*Event type mapping in charts didn&#039;t work in object-centric models. (D-14620)&lt;br /&gt;
*Model generation didn&#039;t work as transformation step using _system.ML.ApplyTransformation function. (D-14654)&lt;br /&gt;
*Others aggregation has been removed from date type of dimensions because tables don&#039;t work with textual data in date columns. (D-14623)&lt;br /&gt;
*Fixed issue in AI Assistant where using both Snowflake Cortex and OpenAI modes caused error. (D-14646)&lt;br /&gt;
*In User Management Effective permissions table, column filter incorrectly showed &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; as options. (D-14639)&lt;br /&gt;
*Pivot table incorrectly showed &amp;quot;Numeric value is not recognized&amp;quot; error when Count or Unique count aggregations were used. (D-14559)&lt;br /&gt;
*Workspace buttons are now visible in small screens spanning to multiple lines. (D-14587)&lt;br /&gt;
*Added tooltip text to &amp;quot;Move to&amp;quot; submenu containing projects so that long project names can be seen. (D-14612)&lt;br /&gt;
*Translation was missing from error messages when deleting items from recycle bin. (D-14652)&lt;br /&gt;
*Fixed data type related issues with in-memory Floor, Ceiling and aggregation functions. (D-14622)&lt;br /&gt;
*Optimized resource loading by getting rid of unnecessary file assets/i18n/en_US.json. (D-14641)&lt;br /&gt;
*Fixed issue where opening script editor gave javascript error about content-security-policy violation. (D-14627)&lt;br /&gt;
*Fixed issue in charts showing datatable content had a strange error when datatable was not selected. (D-14650)&lt;br /&gt;
*Fixed incorrect data types in some project, user and group related measures. (D-14619)&lt;br /&gt;
* Fixed issue where moving expression scripts was not possible when SQL Scripting was not allowed. (D-14624)&lt;br /&gt;
*Deleting and renaming scripts were not available for expression scripts when SQL Scripting was not allowed. (D-14625)&lt;br /&gt;
*Improved documentation for situation when non-existing Snowflake warehouse is configured for a model. (D-14543)&lt;br /&gt;
*Project properties dialog shows a descriptive text when no secrets have been defined instead of an empty table. (D-14611)&lt;br /&gt;
* Improved messages and New project button visibility in Workspace top level when no projects are shown. (D-14609)&lt;br /&gt;
*Event preset gave error if enabling Apply with Chart Filters setting and trying to create filters. (D-14695)&lt;br /&gt;
&lt;br /&gt;
===Other improvements===&lt;br /&gt;
*Added QPR ProcessAnalyzer API request ID to Snowflake queries to easily find matching query in Snowflake query history. (B-08839)&lt;br /&gt;
*[[QPR_ProcessAnalyzer_Security_Hardening#Added_HTTP_Headers|Content Security Policy HTTP header]] includes now object-src, frame-ancestors, form-action, base-uri, and worker-src. (B-08794)&lt;br /&gt;
*Snowflake queries have been optimized by removing null and empty string checks from mapped columns as they are now handled by the model validation check. (B-08837)&lt;br /&gt;
*Added backend support for object-centric model filtering based on case-centric filter rules. (B-08836)&lt;br /&gt;
*Frontend components have been updated. (B-08851)&lt;br /&gt;
*Backend components have been updated. (B-08852)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2025.5 (build 10361) (released 2025-08-21)==&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2025_5.pdf QPR_ProcessAnalyzer_2025_5.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
When using Snowflake Cortex, the AI Assistant is not showing the results table in the assistant&#039;s response. This issue has been fixed by the next release.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===New features===  &lt;br /&gt;
*[[Object-Centric_Flowchart|Object-centric flowchart]] can also use object-to-object relations to link events and objects simplifying event-to-object configuration. (B-08671)&lt;br /&gt;
*[[AI_Assistant_for_QPR_ProcessAnalyzer|AI Assistant]] can provide precise quantitative analysis by making queries to eventlog data (powered by Snowflake Cortex Analyst and Agents). (B-08652)&lt;br /&gt;
*[[Filtering_in_QPR_ProcessAnalyzer|Flows and variations can be filtered]] from any event attribute viewpoint in Snowflake. (B-08737)&lt;br /&gt;
* Added [[Project_Properties_Dialog|project properties dialog]] for viewing project information, changing Snowflake connection settings and project secrets. (B-08655)&lt;br /&gt;
*[[QPR_ProcessAnalyzer_Project_Workspace#Validating_Model|Model validity check]] easily detects technically invalid models and shows detailed reason for invalidity. (B-08624)&lt;br /&gt;
*Projects can be [[QPR_ProcessAnalyzer_Project_Workspace#Exporting_Project|exported]] to json files and imported as new projects. (B-08717)&lt;br /&gt;
*Action buttons can be added to dashboard by defining [[Label_and_Link|label component]] that can change dashboard variables and run scripts. (B-08694)&lt;br /&gt;
*Web user interface is available in [[Languages_and_Localization|Ukrainian language]]. (B-08734)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
*Fixed following error when performing client-side SAP import: Could not find a part of the path (QPR_ImportSource_Chunk_*.tmp). (D-14589)&lt;br /&gt;
*Fixed issue where ManageProjects permission was incorrectly required when running scripts using QPR ScriptLauncher non-legacy mode. (D-14562)&lt;br /&gt;
*Fixed following error when using SAP import from SQL script called from expression language called from SQL: The given key &#039;&#039; was not present in the dictionary. (D-14593)&lt;br /&gt;
*Some analyses didn&#039;t work, when case ID columns for cases and events datatables differed only in upper/lowercase letters. (D-14556)&lt;br /&gt;
*Business calendar didn&#039;t work for some measures/dimensions/columns and some had business calendar checkboxes missing. (D-14563)&lt;br /&gt;
*Prediction failed to following error: transformer_model_next_activity/event_year_input_embedding. (D-14551)&lt;br /&gt;
*Scripting now works correctly after rows from PA_OPERATION_STATUS table have been deleted. (D-14545)&lt;br /&gt;
*Fixed issue where case-centric flowchart was very slow for object-centric model. (D-14544)&lt;br /&gt;
*Prevented creating dashboards, models and scripts with duplicate names in the same project. (D-09480)&lt;br /&gt;
*KPI Card now shows line breaks correctly in textual values. (D-14546)&lt;br /&gt;
*Improved table Excel export for list data to show items with separator character instead of showing as JSON. (D-14479)&lt;br /&gt;
*Column showing non-conformance reason was incorrectly aligned to right. (D-14570)&lt;br /&gt;
*GetRelatedValueFrom function caused column name conflict when used multiple times in same query. (D-14591)&lt;br /&gt;
* Fixed issue where in-memory sorting for arrays gave &amp;quot;Error in sorting analysis result rows possibly due to multiple types of values ...&amp;quot;. (D-14592)&lt;br /&gt;
*Array type of values were shown incorrectly when used Last Row Aggregates Over-limit Rows setting. (D-14616)&lt;br /&gt;
*Fixed the &amp;quot;Most common&amp;quot; text aggregation sorting error for in-memory calculation. (D-14573)&lt;br /&gt;
*Snowflake model validation gave incorrect error message when mapped column didn&#039;t exist in datatable. (D-14565)&lt;br /&gt;
*Improved model validation to detect when connection string key for model or datatable does not exist. (D-14607)&lt;br /&gt;
* Model validation gave incorrect error when when events datatable case id mapping was missing. (D-14566)&lt;br /&gt;
*Model validation gave incorrect error message when cases and events datatables were in different datasources. (D-14567)&lt;br /&gt;
*Model validation gave incorrect error message when underlying Snowflake table didn&#039;t exist. (D-14568)&lt;br /&gt;
*Workspace Card/Table mode toggle buttons were not translated. (D-14547)&lt;br /&gt;
*Some invalid queries gave unexpected errors and strange outputs. (D-14569)&lt;br /&gt;
* Added translations to model notifications preview table headers. (D-14590)&lt;br /&gt;
* Added translations to access denied message for header object counts indicator. (D-13967)&lt;br /&gt;
* AI Assistant explaining charts speaks now user interface language. (D-14578)&lt;br /&gt;
* AI Agent prompt chart editor didn&#039;t show correctly if model was not selected. (D-14536)&lt;br /&gt;
*AI Assistant gave &amp;quot;Unsupported cache table type&amp;quot; error when trying to explain object-centric flowchart. (D-14477)&lt;br /&gt;
&lt;br /&gt;
===Other improvements ===&lt;br /&gt;
*When trying to open dashboard with an invalid model, the precise model validation error message is shown. (B-08629)&lt;br /&gt;
*Account locked message is now same as username/password incorrect to prevent account enumeration attack. (B-08740)&lt;br /&gt;
*Stringified value format supports also json objects. (B-08766)&lt;br /&gt;
*Event attribute used as event type can be defined for flow and variation filters in Snowflake models (backend support). (B-08705)&lt;br /&gt;
*Translations have been updated. (B-08757)&lt;br /&gt;
*Frontend components have been updated. (B-08760)&lt;br /&gt;
*Backend components have been updated. (B-08759)&lt;br /&gt;
&lt;br /&gt;
==QPR ProcessAnalyzer 2025.4 (build 9985) (released 2025-05-28)==&lt;br /&gt;
&lt;br /&gt;
New features presentation: [https://files.qpr.com/releases/QPR_ProcessAnalyzer_2025_4.pdf QPR_ProcessAnalyzer_2025_4.pdf]&lt;br /&gt;
&lt;br /&gt;
===New features ===&lt;br /&gt;
*Added new AI Agent presets analyzing current state and proposing improvements based on different viewpoints, such as Event and Case Counts, Automation, Bottlenecks, and Root Causes. (B-08710)&lt;br /&gt;
*Added a [[Filter_Selectors#Filter_selector|generic filtering component]] that can be configured for creating any type of filters for distinct values. (B-08654)&lt;br /&gt;
*Volume declining in measures due to case sampling can be compensated in chart and flowchart by using a [[Measure,_Dimension_and_Column_Settings#Statistical_calculations|Statistical calculation method]]. (B-08598)&lt;br /&gt;
*In object-centric models, Object ID, Event ID, Event timestamp, and Event type [[Object-centric_Process_Mining_Model#Object-centric_perspectives|attribute names]] are shown correctly. (B-08680)&lt;br /&gt;
*Snowflake native app has now [[QPR_ProcessAnalyzer_Native_App_in_Snowflake#User_access_to_application|application roles]] for user (for using app) and administrator (for managing app). (B-08660)&lt;br /&gt;
*For Snowflake native app, IMPORTED PRIVILEGES ON SNOWFLAKE DB privilege is removed and instead the [[QPR_ProcessAnalyzer_Native_App_in_Snowflake#Optional_privilege_for_AI_Agent|CORTEX_USER database role]] can be assigned. (B-08718)&lt;br /&gt;
*[[QPR_ProcessAnalyzer_Native_App_in_Snowflake#Logging|Native app logging]] has been improved and now sharing application logs with QPR is possible. (B-08661)&lt;br /&gt;
* Added [[DataFrame_in_Expression_Language#CsvToDataFrame|CsvToDataFrame]] function to expression language to convert textual CSV data into in-memory dataframe. (B-08246)&lt;br /&gt;
&lt;br /&gt;
===Fixed issues===&lt;br /&gt;
*Fixed &amp;quot;Invalid identifier&amp;quot; error when opening attribute selection list for case attribute preset caused by object id columns which differed only by letter capitalization. (D-14539)&lt;br /&gt;
*When Image component is clicked in dashboard edit mode, the component is now selected instead of link followed. (D-14525)&lt;br /&gt;
*Filters created from dimensions having dimension-specific filter rules will now create expression filter rule where dimensions-specific filter is embedded, for accurately following the selection. (D-14499)&lt;br /&gt;
*Filtering variations or list of event attribute values didn&#039;t work in in-memory models. (D-14476)&lt;br /&gt;
*Fixed issue where AI Agent didn&#039;t update when dashboard variable changed used by prompt chart. (D-14537)&lt;br /&gt;
* Fixed issue where some statistical calculations inadvertently changed row order when applying in groups. (D-14495)&lt;br /&gt;
*In in-memory models, array type of data was not dimensioned correctly. (D-14518)&lt;br /&gt;
* AI Agent Process Variations preset gave &amp;quot;division by zero&amp;quot; error when there were zero cases. (D-14508)&lt;br /&gt;
*Table grouping header labels were not formatted correctly. (D-14514)&lt;br /&gt;
*Fixed Root causes analysis to work with object-centric models. (D-14515)&lt;br /&gt;
*Filtering by OcelObjectId didn&#039;t work when model didn&#039;t have object type table for perspective used in filter. (D-14522)&lt;br /&gt;
*Fixed Root causes analysis with weighting expression to work with object-centric models. (D-14517)&lt;br /&gt;
*Fixed issue where persisting query results where query is started from datatable having custom table name overwrote data in original table. (D-14528)&lt;br /&gt;
*Flowchart SVG export did not show start and end symbols. (D-12401)&lt;br /&gt;
*Fixed issue where join operation didn&#039;t find renamed columns in SqlDataFrames. (D-14512)&lt;br /&gt;
*Improved chart filtering button positions to work with small chart sizes. (D-14509)&lt;br /&gt;
*Datatable foreign key columns dictionary data type was incorrect preventing reading columns information. (D-14505)&lt;br /&gt;
*Workspace scripts editor allowed to change script code for viewer users (altough not save it). (D-14534)&lt;br /&gt;
* In chart custom sorting, trying to refer to measure that had None aggregation, caused SQL compilation error. (D-14526)&lt;br /&gt;
*Model validation check crashed when the datatables were in different datasources. (D-14502)&lt;br /&gt;
&lt;br /&gt;
===Other improvements=== &lt;br /&gt;
*Added expression language functions for using Snowflake Cortex Agents with Cortex Analyst access to query eventlogs. (B-08647)&lt;br /&gt;
*Projects can be export and imported in JSON format containing dashboards, models, datatables and scripts. (B-08613)&lt;br /&gt;
*Simplified object-centric model queries by accepting OcelObjectId as object attribute name in filters. (B-08702)&lt;br /&gt;
*Streamlined import API by removing importMode parameter and changing default fileType to CSV. (B-08704)&lt;br /&gt;
*Frontend components have been updated. (B-08695)&lt;br /&gt;
*Backend components has been updated. (B-08696)&lt;br /&gt;
&lt;br /&gt;
==Old Releases==&lt;br /&gt;
See older releases in [[QPR ProcessAnalyzer Release Archive]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category: QPR ProcessAnalyzer]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Log_in_QPR_ProcessAnalyzer&amp;diff=28535</id>
		<title>Log in QPR ProcessAnalyzer</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Log_in_QPR_ProcessAnalyzer&amp;diff=28535"/>
		<updated>2026-06-17T14:02:25Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Users need valid access rights to log in to QPR ProcessAnalyzer. Users can loging either using single-sign on or built-in user account. If the &#039;&#039;Log in using SSO&#039;&#039; button is available in the login screen, single-sign on is enabled, and it&#039;s most likely the preferred login method.&lt;br /&gt;
&lt;br /&gt;
== Log in using single-sign on ==&lt;br /&gt;
QPR ProcessAnalyzer environment may be connected to organization&#039;s user accounts using single-sign on (SSO) with [[SAML_2.0_Federated_Authentication|SAML 2.0 protocol]], indicated by the &#039;&#039;Login using SSO&#039;&#039; button in the login screen. When pressing the button, user is directed to user organizations&#039; identity provider service to be authenticated. After the authentication, user is directed back to QPR ProcessAnalyzer as an authenticated user. Normally when using the single-sign on, the user doesn&#039;t see the QPR ProcessAnalyzer login screen, as user is directed right away to the identity provider.&lt;br /&gt;
&lt;br /&gt;
Note that the username and password fields in the QPR ProcessAnalyzer login screen are only used for the built-in authentication, and thus users are not able to login with organizations&#039; user account using QPR ProcessAnalyzer login screen.&lt;br /&gt;
&lt;br /&gt;
If using QPR ProcessAnalyzer as Snowflake Native App, the &#039;&#039;Login using SSO&#039;&#039; button will authenticate user using the currently active Snowflake user session. Note that a user account with the same username needs to already exist in the QPR ProcessAnalyzer user management for the authentication to be successful.&lt;br /&gt;
&lt;br /&gt;
== Log in using built-in user account ==&lt;br /&gt;
If the single-sign on is not available, users will login using built-in user accounts, that are managed in QPR ProcessAnalyzer [[Manage_Users_and_Groups|user management]]. Username and password are inputted using QPR ProcessAnalyzer login screen. Usually email address is used as the username. For the first login, you have received the credentials from the QPR ProcessAnalyzer system administrator. It&#039;s recommended to change the password after the first login in the [[User_Profile|User Profile dialog]] available in the main menu.&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Languages_and_Localization&amp;diff=28534</id>
		<title>Languages and Localization</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Languages_and_Localization&amp;diff=28534"/>
		<updated>2026-06-17T14:01:43Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Each users can set their desired language for the user interface. QPR ProcessAnalyzer has the following languages available:&lt;br /&gt;
* English&lt;br /&gt;
* French&lt;br /&gt;
* Spanish&lt;br /&gt;
* German&lt;br /&gt;
* Finnish&lt;br /&gt;
* Swedish&lt;br /&gt;
* Polish&lt;br /&gt;
* Portuguese&lt;br /&gt;
* Ukrainian&lt;br /&gt;
&lt;br /&gt;
== Changing Language ==&lt;br /&gt;
User interface language can be changed in the [[Navigation_Menu#User%20Settings|User Settings dialog]] as follows:&lt;br /&gt;
# [[Getting_Started_with_QPR_ProcessAnalyzer#Logging_in|Login to QPR ProcessAnalyzer]].&lt;br /&gt;
# Open the navigation menu on top left and click &#039;&#039;&#039;User Settings&#039;&#039;&#039;.&lt;br /&gt;
# Choose the desired language in the &#039;&#039;&#039;Language&#039;&#039;&#039; list.&lt;br /&gt;
# Click &#039;&#039;&#039;Save&#039;&#039;&#039; to close the dialog.&lt;br /&gt;
&lt;br /&gt;
The selected language is stored to user settings, so that it is in use when the user logs in the next time (also when using another device).&lt;br /&gt;
&lt;br /&gt;
== Date Format Settings ==&lt;br /&gt;
In addition to the language, the following date presentation related settings can be set for each user in the [[Navigation_Menu#User%20Settings|User Settings dialog]]:&lt;br /&gt;
* &#039;&#039;&#039;Date format&#039;&#039;&#039;: Defines how date values are presented in the user interface. The format can be e.g. MM/dd/yyyy or d.M.yyyy. Following parts can be used in the date format: &#039;&#039;&#039;d&#039;&#039;&#039; (day of month as one or two digits), &#039;&#039;&#039;dd&#039;&#039;&#039; (day of month as two digits), &#039;&#039;&#039;M&#039;&#039;&#039; (month as one or two digits), &#039;&#039;&#039;MM&#039;&#039;&#039; (month as two digits), &#039;&#039;&#039;yy&#039;&#039;&#039; (year as two digits) and &#039;&#039;&#039;yyyy&#039;&#039;&#039; (year as four digits).&lt;br /&gt;
* &#039;&#039;&#039;First day of week&#039;&#039;&#039;: The first day of the week (appearsing in calendars to pick dates).&lt;br /&gt;
* &#039;&#039;&#039;Use 12-hour clock&#039;&#039;&#039;: Whether the 24-hour or 12-hour clock is used to present hours.&lt;br /&gt;
&lt;br /&gt;
Similar to the language, all these settings are remembered for the user.&lt;br /&gt;
&lt;br /&gt;
== Language Support Details ==&lt;br /&gt;
Most texts in the UI are translated, but there are the following exceptions:&lt;br /&gt;
* Process mining data imported to QPR ProcessAnalyzer (e.g. case and event attribute names, event type names, case and event attribute values) needs to be separately translated. See [[Languages and Localization#Content_Language|Content Language]] section below.&lt;br /&gt;
* Some tooltips that contain longer instructions&lt;br /&gt;
* Some special error messages related to the expression language errors&lt;br /&gt;
&lt;br /&gt;
The login page is shown with the system default language, when QPR ProcessAnalyzer is for the first time accessed with a certain device. Language is also stored to the browser&#039;s local storage, so the browser remembers the last used language and in the next time shows the login page in that language.&lt;br /&gt;
&lt;br /&gt;
== Localization Settings for New Users ==&lt;br /&gt;
For system administrators, there are system wide defaults for the localization settings that can be set in the [[PA_Configuration_database_table|configuration table]]:&lt;br /&gt;
* DefaultUiLanguage&lt;br /&gt;
* DefaultDateFormat&lt;br /&gt;
* DefaultFirstDayOfWeek&lt;br /&gt;
* DefaultUse12HourClock&lt;br /&gt;
&lt;br /&gt;
New users have these defaults until the user changes to her/his own settings. In case the administrator needs to change the language for many existing users, the change needs to be done directly to the &#039;&#039;PA_USER_ATTRIBUTE&#039;&#039; table in the database.&lt;br /&gt;
&lt;br /&gt;
== Content Language ==&lt;br /&gt;
Translations for process mining data (e.g. case and event attribute names, event type names, case and event attribute values) can be provided via the ContentTranslations value in the [[PA_Configuration_database_table#Localization_Settings|configuration table]]. When a valid ContentTranslations value is provided, the translations can be taken into use by selecting the &amp;quot;Content language&amp;quot; in the [[User_Profile|User Profile dialog]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Some things to note:&lt;br /&gt;
* Search dialogs work only with the original text, not the translated values.&lt;br /&gt;
* The Workspace user interface isn&#039;t translated from the content viewpoint, except for datatable content preview, which is translated.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
[[Category: QPR ProcessAnalyzer]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Objects_in_Expression_Language&amp;diff=28533</id>
		<title>QPR ProcessAnalyzer Objects in Expression Language</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Objects_in_Expression_Language&amp;diff=28533"/>
		<updated>2026-06-17T14:00:57Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Filter==&lt;br /&gt;
Filters contain a set of filter rules used to filter cases and events in models. Filters are objects located in the models. Filters are owned by the creator user, and when a filter publish mode is private, only the creator can use it.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Filter properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||Returns the user who created the filter.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Returns date when the filter created date.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Returns description of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Returns id of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||Returns user who modified the filter.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Returns date when the filter last modified.&lt;br /&gt;
|-&lt;br /&gt;
||Model&lt;br /&gt;
||Returns model where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ModelId (Integer)&lt;br /&gt;
||Returns model where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Returns the name of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||Project&lt;br /&gt;
||Returns project where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||Returns project id where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||PublishMode (String)&lt;br /&gt;
||Returns publish mode of the filter, one of the following: &#039;&#039;&#039;Private&#039;&#039;&#039;, &#039;&#039;&#039;Public&#039;&#039;&#039;, or &#039;&#039;&#039;Default&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||Rules (Dictionary)&lt;br /&gt;
||Returns a dictionary containing the filter rules in the filter.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Filter functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Deletes the filter permanently. To delete own filters, the &#039;&#039;&#039;Filtering&#039;&#039;&#039; permission is needed, and to delete any filters the &#039;&#039;&#039;ManageViews&#039;&#039;&#039; permission is needed.&lt;br /&gt;
|-&lt;br /&gt;
||Modify&lt;br /&gt;
||Dictionary&lt;br /&gt;
||&lt;br /&gt;
Changes the filter properties. The input parameter is a dictionary containing the filter properties to change:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the filter.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description of the filter.&lt;br /&gt;
* &#039;&#039;&#039;PublishMode&#039;&#039;&#039; (String): Privacy model of the filter rule. One of the following: &#039;&#039;Private&#039;&#039;, &#039;&#039;Public&#039;&#039;, or &#039;&#039;Default&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Rules&#039;&#039;&#039; (Dictionary): Filter rules as Dictionary ([[Filtering_in_QPR_ProcessAnalyzer_Queries|more information]]).&lt;br /&gt;
* &#039;&#039;&#039;ModelId&#039;&#039;&#039; (Integer): Id of the model where the filter is located. Changing this will move the filter into a different model.&lt;br /&gt;
&lt;br /&gt;
The function returns the updated filter object. Requires &#039;&#039;Filtering&#039;&#039; or &#039;&#039;ManageViews&#039;&#039; permission for the project depending on the owner of the filter.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FilterById(1)&lt;br /&gt;
	.Modify(#{&lt;br /&gt;
		&amp;quot;Name&amp;quot;: &amp;quot;My filter&amp;quot;,&lt;br /&gt;
		&amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
		&amp;quot;PublishMode&amp;quot;: &amp;quot;Public&amp;quot;,&lt;br /&gt;
		&amp;quot;Rules&amp;quot;: #{&lt;br /&gt;
			&amp;quot;Items&amp;quot;: [&lt;br /&gt;
				#{&lt;br /&gt;
					&amp;quot;Type&amp;quot;: &amp;quot;IncludeCases&amp;quot;,&lt;br /&gt;
					&amp;quot;Items&amp;quot;: [&lt;br /&gt;
						#{&lt;br /&gt;
							&amp;quot;Type&amp;quot;: &amp;quot;CaseAttributeValue&amp;quot;,&lt;br /&gt;
							&amp;quot;Attribute&amp;quot;: &amp;quot;Account Manager&amp;quot;,&lt;br /&gt;
							&amp;quot;StringifiedValues&amp;quot;: [&lt;br /&gt;
								&amp;quot;0Mary Wilson&amp;quot;&lt;br /&gt;
							]&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get filter id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||FilterById&lt;br /&gt;
||&lt;br /&gt;
* Filter id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns Filter object corresponding to the provided filter id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Model==&lt;br /&gt;
Notes:&lt;br /&gt;
* For in-memory models that are offline, the object counts represent the situation when the model was last time online (loaded into the memory). &#039;&#039;null&#039;&#039; is returned if the model has never been loaded into the memory.&lt;br /&gt;
* If [[Case_Level_Permissions|Case permissions]] are used for the model, and user doesn&#039;t have &#039;&#039;&#039;GenericWrite&#039;&#039;&#039; permission for the model, &#039;&#039;null&#039;&#039; is returned for data security reasons. Users that have the &#039;&#039;&#039;GenericWrite&#039;&#039;&#039; permission, see null when the model is offline, and when online, they see counts where the case level permissions settings are applied.&lt;br /&gt;
* Properties &#039;&#039;CaseAttributes&#039;&#039;, &#039;&#039;EventAttributes&#039;&#039; and &#039;&#039;Eventlog&#039;&#039; work only for the in-memory models and they require the model to be loaded into the memory. If the model is not in the memory, it is loaded when these properties is used. Other model properties down require the model to be in the memory.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||AllFilters (Filter*)&lt;br /&gt;
||Returns an array of all [[#Filter|filters]] in the model the user has access to. In addition to the &#039;&#039;Filters&#039;&#039; property, &#039;&#039;AllFilters&#039;&#039; also returns private filters of other users. The &#039;&#039;ManageViews&#039;&#039; permission is required to use this property - otherwise error is given.&lt;br /&gt;
|-&lt;br /&gt;
||Calendars (BusinessCalendar*)&lt;br /&gt;
||&lt;br /&gt;
Returns all [[Business_Calendar|business calendars]] stored to the Model as an array. Returns an empty array, if there are no business calendars stored to the model. Note: UI allows to set only one business calendar for a Model.&lt;br /&gt;
|-&lt;br /&gt;
||CaseAttributes (AttributeType*)&lt;br /&gt;
||[[#AttributeType|CaseAttributes]] in the model returned in the alphabetical order. Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||CasesDatatable (Datatable)&lt;br /&gt;
||Returns the Datatable the model uses as a datasource for cases. Returns &#039;&#039;null&#039;&#039; if the cases Datatable is not defined or if model uses other than the Datatable datasource.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Returns the Model configuration as dictionary. Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).Configuration.DataSource.Events.DataTableName&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ConfigurationJson (String)&lt;br /&gt;
||Returns the Model configuration as JSON string.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the model.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the model was created.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultCalendar (BusinessCalendar)&lt;br /&gt;
||Returns the default [[Business_Calendar|business calendar]] of the Model. Returns &#039;&#039;null&#039;&#039;, if there are no calendars in the Model or no calendar has been set as a default calendar. Note: UI allows to set only one business calendar for a Model, which is also the default calendar.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFilter (Filter)&lt;br /&gt;
||Default filter of the model. Returns &#039;&#039;null&#039;&#039; if the model does not have a default filter.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFilterId (Integer)&lt;br /&gt;
||Default filter id of the model. Returns &#039;&#039;null&#039;&#039; if the model does not have a default filter.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Model description. The model description may contain line breaks.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedDate (DateTime)&lt;br /&gt;
||Timestamp when Model was deleted (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||DeletedBy (User)&lt;br /&gt;
||User how deleted the Model.&lt;br /&gt;
|-&lt;br /&gt;
||Diagrams (Diagram*)&lt;br /&gt;
||Returns an array of all [[Diagram_in_Expression_Language|diagrams]] in the model.&lt;br /&gt;
|-&lt;br /&gt;
||EstimatedMemory (Integer)&lt;br /&gt;
||Returns an estimation of how much memory in bytes the model requires.&lt;br /&gt;
|-&lt;br /&gt;
||EventsDatatable (Datatable)&lt;br /&gt;
||Returns the Datatable the model uses as a datasource for events. Returns &#039;&#039;null&#039;&#039; if the events Datatable is not defined or if model uses other than the Datatable datasource.&lt;br /&gt;
|-&lt;br /&gt;
||EventAttributes (AttributeType*)&lt;br /&gt;
||[[#AttributeType|EventAttributes]] in the model returned in the alphabetical order. Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||EventLog (EventLog)&lt;br /&gt;
||EventLog containing the entire model (i.e. event log where no filters have been applied). Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||Filters (Filter*)&lt;br /&gt;
||Returns an array of all public [[#Filter|filters]], the default filter (if any) and the user&#039;s own private filters in the model. Note that the other users&#039;s private filters are not returned even for administrators.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Model Id. Model Id is generated by QPR ProcessAnalyzer when the model is created.&lt;br /&gt;
|-&lt;br /&gt;
||IsValidInMemoryModel (boolean)&lt;br /&gt;
||Returns &#039;&#039;true&#039;&#039; if all the following conditions are met:&lt;br /&gt;
* CheckModelValidity function doesn&#039;t return any issues (because invalid models are assumed to be Snowflake models).&lt;br /&gt;
* Model is not an object-centric model.&lt;br /&gt;
* Data source of the model is &#039;&#039;ODBC&#039;&#039; or &#039;&#039;Expression&#039;&#039;, or the referred datatable has &#039;&#039;DataSourceType&#039;&#039; either &#039;&#039;Local&#039;&#039; or &#039;&#039;SqlServer&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last time modified the model properties. Note that datatables containing the eventlog data are separate objects having similar fields to track the last modification and last data import.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the model was modified the last time.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Model name.&lt;br /&gt;
|-&lt;br /&gt;
||NCache (Integer)&lt;br /&gt;
||Number of objects related to the model when the model is loaded into the memory.&lt;br /&gt;
|-&lt;br /&gt;
||NCaseAttributes (Integer)&lt;br /&gt;
||Number of [[#AttributeType|CaseAttributes]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NCases (Integer)&lt;br /&gt;
||Number of [[#Case|Cases]] in the model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEventAttributes (Integer)&lt;br /&gt;
||Number of [[#AttributeType|EventAttributes]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEvents (Integer)&lt;br /&gt;
||Number of [[#Event|Events]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEventTypes (Integer)&lt;br /&gt;
||Number of [[#EventType|EventTypes]] in the model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||Project (Project)&lt;br /&gt;
||[[#Project|Project]] where the model belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||[[#Project|Project]] id where the model belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||Status (String)&lt;br /&gt;
||&lt;br /&gt;
Memory availability status of the model. There are the following statuses:&lt;br /&gt;
* &#039;&#039;&#039;Loading&#039;&#039;&#039;: The model is currently loading into the memory. When the loading is ready, the status changes to &#039;&#039;online&#039;&#039;. If the loading fails, the status changes to &#039;&#039;offline&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Offline&#039;&#039;&#039;: The model is currently not loaded into the memory. The model needs to be loaded into the memory, so that analyses can be calculated from the model (occurs automatically when an analysis is requested).&lt;br /&gt;
* &#039;&#039;&#039;Online&#039;&#039;&#039;: The model is in the memory and ready for analysis calculation. If the model is dropped from the memory, its status changes to &#039;&#039;offline&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||UsedDatatables (Datatable*)&lt;br /&gt;
||Returns all datatables the model uses as a datasource.&lt;br /&gt;
&lt;br /&gt;
Example: List datatables used by a model:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
StringJoin(&amp;quot;, &amp;quot;, OrderByValue(ModelById(1).UsedDataTables.Name))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CalendarByName (BusinessCalendar)&lt;br /&gt;
||&lt;br /&gt;
name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns a [[Business_Calendar|business calendar]] stored to the Model by the name of the calendar. Business calendars can be stored to models in the model properties. Returns &#039;&#039;null&#039;&#039;, if a calendar with the provided name is not stored to the model.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).CalendarByName(&amp;quot;MyCalendar&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateDiagram (Diagram)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||&lt;br /&gt;
Creates a [[Diagram_in_Expression_Language|diagram]] to the model. Parameters is a dictionary containing diagram properties. Following properties are available:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Diagram name that distinguishes diagrams in a model.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Diagram description text.&lt;br /&gt;
* &#039;&#039;&#039;Content&#039;&#039;&#039; (dictionary): Diagram content as dictionary.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1)&lt;br /&gt;
  .CreateDiagram(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My diagram&amp;quot;,&lt;br /&gt;
    &amp;quot;Description&amp;quot;: &amp;quot;This is my new diagram&amp;quot;,&lt;br /&gt;
    &amp;quot;Content&amp;quot;: #{ ... },&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateFilter (Filter)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a filter to a model. Requires &#039;&#039;GenericWrite&#039;&#039; permission for the project and global &#039;&#039;CreateModel&#039;&#039; permission. If a filter with that name already exists in the model, an exception is thrown.&lt;br /&gt;
The parameters dictionary may have the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the filter. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Description of the filter. This property is optional.&lt;br /&gt;
* &#039;&#039;&#039;Rules&#039;&#039;&#039;: Filter rules for the filter defined as a dictionary according to the [[Filtering_in_QPR_ProcessAnalyzer_Queries|filter json format]]. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;PublishMode&#039;&#039;&#039;: Publish mode of the filter which is one of the following: &#039;&#039;Private&#039;&#039;, &#039;&#039;Public&#039;&#039; or &#039;&#039;Default&#039;&#039;. This property is optional, and the default value is &#039;&#039;Private&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let newFilter = modelById(1).CreateFilter(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My Filter&amp;quot;,&lt;br /&gt;
  &amp;quot;Rules&amp;quot;: #{&lt;br /&gt;
    &amp;quot;Items&amp;quot;: [#{&lt;br /&gt;
      &amp;quot;Type&amp;quot;: &amp;quot;IncludeCases&amp;quot;,&lt;br /&gt;
      &amp;quot;Items&amp;quot;: [#{&lt;br /&gt;
        &amp;quot;Type&amp;quot;: &amp;quot;CaseAttributeValue&amp;quot;,&lt;br /&gt;
        &amp;quot;Attribute&amp;quot;: &amp;quot;Account Manager&amp;quot;,&lt;br /&gt;
        &amp;quot;StringifiedValues&amp;quot;: [ &amp;quot;0Robert Miller&amp;quot; ]&lt;br /&gt;
      }]&lt;br /&gt;
    }]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;PublishMode&amp;quot;: &amp;quot;Public&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||Deletes the Model permanently. The model doesn&#039;t need to be in the recycle bin to be able to delete it permanently.&lt;br /&gt;
|-&lt;br /&gt;
||Modify (Model)&lt;br /&gt;
||Dictionary&lt;br /&gt;
||&lt;br /&gt;
Modifies model properties. The parameter is a dictionary containing the properties to be changed. Following properties can be changed: &#039;&#039;Name&#039;&#039;, &#039;&#039;Description&#039;&#039;, &#039;&#039;ProjectId&#039;&#039;, and &#039;&#039;Configuration&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The function returns the updated model object. Requires the &#039;&#039;GenericWrite&#039;&#039; permission for the project and the global &#039;&#039;CreateModel&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1)&lt;br /&gt;
	.Modify(#{&lt;br /&gt;
		&amp;quot;Name&amp;quot;: &amp;quot;My model&amp;quot;,&lt;br /&gt;
		&amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
		&amp;quot;ProjectId&amp;quot;: 2,&lt;br /&gt;
		&amp;quot;Configuration&amp;quot;: #{&lt;br /&gt;
			&amp;quot;DataSource&amp;quot;: #{&lt;br /&gt;
				&amp;quot;Cases&amp;quot;: #{&lt;br /&gt;
					&amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;DataTableName&amp;quot;: &amp;quot;My cases datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
						&amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;Events&amp;quot;: #{&lt;br /&gt;
					&amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;DataTableName&amp;quot;: &amp;quot;My events datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
						&amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;,&lt;br /&gt;
						&amp;quot;EventType&amp;quot;: &amp;quot;Event Type&amp;quot;,&lt;br /&gt;
						&amp;quot;Timestamp&amp;quot;: &amp;quot;Start Time&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ResetModelCache&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Synchronously clears all cached model data. For a Snowflake model, deletes all cache tables related to the model from Snowflake. For an in-memory model, drops the model from the memory and also drops all other model related caches from the memory. &lt;br /&gt;
|-&lt;br /&gt;
||ResetPreprocessings&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Removes all cached items related to the Model, e.g. preprocessings and calculation results. In practice, the Model is reset to a state where it was right after the model was loaded into memory.&lt;br /&gt;
|-&lt;br /&gt;
||Restore&lt;br /&gt;
||(none)&lt;br /&gt;
||Restores the Model from the recycle bin back to the original location.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;ToSqlDataFrame&amp;quot;&amp;gt;ToSqlDataFrame&amp;lt;/span&amp;gt;&lt;br /&gt;
||In-memory dataframe&lt;br /&gt;
||Converts an in-memory dataframe to an SQL dataframe. In practice, an SQL query is created from the in-memory dataframe and the query is executed in the datasource so that the data is available in the datasource for further SQL operations. This function is intended only to small amounts of data which is less than 16384 rows.&lt;br /&gt;
&lt;br /&gt;
Example: Select matching cases from events data using in-memory dataframe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let model = ModelById(1);&lt;br /&gt;
let dfEvents = model.EventsDatatable.SqlDataFrame;&lt;br /&gt;
let inMemoryDf = ToDataFrame(&lt;br /&gt;
  [[&amp;quot;1&amp;quot;], [&amp;quot;2&amp;quot;], [&amp;quot;3&amp;quot;]],&lt;br /&gt;
  [#{&amp;quot;Name&amp;quot;: &amp;quot;id&amp;quot;, &amp;quot;DataType&amp;quot;: &amp;quot;String&amp;quot;}]&lt;br /&gt;
);&lt;br /&gt;
model.ToSqlDataFrame(inMemoryDf)&lt;br /&gt;
  .Join(dfEvents, [&amp;quot;id&amp;quot;: &amp;quot;CaseId&amp;quot;])&lt;br /&gt;
  .SelectDistinct([&amp;quot;CaseId&amp;quot;])&lt;br /&gt;
  .Collect();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;TriggerNotifications&amp;quot;&amp;gt;TriggerNotifications&amp;lt;/span&amp;gt; (Boolean)&lt;br /&gt;
||Notification names (String*)&lt;br /&gt;
||Triggers the given notifications for the Model. Notifications are given by their names. Triggering means that the configured rules are run and notification emails are sent as defined by the rules. If the notification names parameter is not provided, all notifications in the Model are triggered.&lt;br /&gt;
&lt;br /&gt;
The function return &#039;&#039;true&#039;&#039; if any notification were triggered, otherwise &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).TriggerNotifications([&amp;quot;Notification 1&amp;quot;, &amp;quot;Notification 2&amp;quot;]);&lt;br /&gt;
Triggers notifications Notification 1 and Notification 2 in model id 123.&lt;br /&gt;
&lt;br /&gt;
ModelById(123).TriggerNotifications();&lt;br /&gt;
Triggers all notifications in model id 123.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CheckModelValidity&amp;quot;&amp;gt;CheckModelValidity&amp;lt;/span&amp;gt; (Object array)&lt;br /&gt;
||CheckData field in dictionary&lt;br /&gt;
||Checks the model validity and returns found issues. The returned data is an array of objects where each object represents one validity error and contains the following properties:&lt;br /&gt;
* &#039;&#039;&#039;IssueType&#039;&#039;&#039; (String): Specifies the issue type.&lt;br /&gt;
* &#039;&#039;&#039;ContextType&#039;&#039;&#039; (String): Context in which the issue was found, and it can be &#039;&#039;&#039;EventDataSource&#039;&#039;&#039;, &#039;&#039;&#039;CaseDataSource&#039;&#039;&#039;, &#039;&#039;&#039;OcelDataSource&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Details&#039;&#039;&#039; (Dictionary): Additional details which depend on the type of the issue.&lt;br /&gt;
&lt;br /&gt;
There are two types of checks available (based on whether the &#039;&#039;&#039;CheckData&#039;&#039;&#039; parameter is defined):&lt;br /&gt;
* &#039;&#039;Lightweight check&#039;&#039;: The check is based on only the configuration data stored in QPR ProcessAnalyzer. This check is very quick and does not require running queries in datasource (e.g., in Snowflake).&lt;br /&gt;
* &#039;&#039;Full check&#039;&#039;: The check is comprehensive and it&#039;s able to detect any validity issues the model may have. The full check requires running queries to the actual data which makes the check slower, and in case of Snowflake, it uses the Snowflake warehouse to run the queries.&lt;br /&gt;
&lt;br /&gt;
The lightweight check is performed automatically by the [[QPR_ProcessAnalyzer_Project_Workspace|Workspace]], so if there are any validity issues that the lightweight check can detect, the Workspace notifies about them immediately. If there are any problems with the model calculation results, it might be a good idea to run the full validity check to confirm whether the problems are due to the model being invalid.&lt;br /&gt;
&lt;br /&gt;
Example: Lightweight check:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(ModelById(1).CheckModelValidity())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Full check:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(ModelById(1).CheckModelValidity(#{ &amp;quot;CheckData&amp;quot;: true }))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CortexAgentsQuery&lt;br /&gt;
||&lt;br /&gt;
||Creates a Snowflake Cortex semantic model (see the &#039;&#039;GetSemanticModel&#039;&#039; function) for the process mining model and makes a natural language query on it using Snowflake Cortex Agents. More information: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents. &lt;br /&gt;
&lt;br /&gt;
There are the following parameters:&lt;br /&gt;
# &#039;&#039;&#039;Parameters&#039;&#039;&#039;: Dictionary parameters given to the Cortex Agents REST API query (https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-rest-api). There is a special handling for the following parameters:&lt;br /&gt;
#* &#039;&#039;&#039;model&#039;&#039;&#039;: Defines the name of the LLM to use for the operation. If not defined, the [[PA_Configuration_database_table#:~:text=DefaultCortexAgentsModelName|DefaultCortexAgentsModelName]] system setting applies.&lt;br /&gt;
#* &#039;&#039;&#039;_tools&#039;&#039;&#039;: Additional tool_spec of type &amp;quot;cortex_analyst_text_to_sql&amp;quot; will be added to this value with a reference to the generated semantic model.&lt;br /&gt;
#* &#039;&#039;&#039;_tool_resources&#039;&#039;&#039;: Generated semantic model is added as an additional resource.&lt;br /&gt;
# &#039;&#039;&#039;Filter configuration&#039;&#039;&#039;: Can be a string containing filter JSON or a dictionary containing the filter configuration. The semantic model is created for the filtered eventlog. If not defined, the entire model eventlog will be used.&lt;br /&gt;
# &#039;&#039;&#039;Event column role nappings&#039;&#039;&#039;: Mappings to apply for event columns. If not defined, default column mappings are used.&lt;br /&gt;
# &#039;&#039;&#039;Case column role mappings&#039;&#039;&#039;: Mappings to apply for case columns. If not defined, default column mappings are used.&lt;br /&gt;
&lt;br /&gt;
The function returns a dictionary with the following keys:&lt;br /&gt;
# &#039;&#039;&#039;Response&#039;&#039;&#039;: Actual response as a dictionary returned by the Cortex Agents.&lt;br /&gt;
# &#039;&#039;&#039;Response items&#039;&#039;&#039;: Contains processed response consisting of an array of objects having the following properties:&lt;br /&gt;
#* &#039;&#039;&#039;Text&#039;&#039;&#039;: Textual response.&lt;br /&gt;
#* &#039;&#039;&#039;Sql&#039;&#039;&#039;: Response SQL query string. Not mandatory.&lt;br /&gt;
#* &#039;&#039;&#039;SqlDataFrame&#039;&#039;&#039;: SqlDataFrame created for the SQL query in the Sql property. Only present if Sql is present.&lt;br /&gt;
|-&lt;br /&gt;
||GetSemanticModel&lt;br /&gt;
||&lt;br /&gt;
||Creates a Snowflake Cortex Analyst semantic model for the process mining model and returns it as a dictionary. More information: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst/semantic-model-spec.&lt;br /&gt;
&lt;br /&gt;
There are the following parameters:&lt;br /&gt;
# &#039;&#039;&#039;Filter configuration&#039;&#039;&#039;: Can be a string containing filter JSON or a dictionary containing the filter. The semantic model is created for the filtered eventlog. If not defined, the entire model eventlog will be used.&lt;br /&gt;
# &#039;&#039;&#039;Event column role mappings&#039;&#039;&#039;: Mappings to apply for event columns. If not defined, default column mappings are used.&lt;br /&gt;
# &#039;&#039;&#039;Case column role mappings&#039;&#039;&#039;: Mappings to apply for case columns. If not defined, default column mappings are used.&lt;br /&gt;
&lt;br /&gt;
Examples: Returns a semantic model without any filtering applied.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).GetSemanticModel();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get Model by model id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ModelById&lt;br /&gt;
||&lt;br /&gt;
* Model id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Model|Model]] object corresponding to the provided model id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Object-centric model==&lt;br /&gt;
Object-centric models additionally have the following properties and functions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Object-Centric model properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||IsOcelModel (boolean)&lt;br /&gt;
||Returns &#039;&#039;true&#039;&#039; when the model is an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEvents (Datatable)&lt;br /&gt;
||Datatable containing event data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if event datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventToObject (Datatable)&lt;br /&gt;
||Datatable containing event-to-object relations data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if event-to-object relation datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventTypes (Dictionary)&lt;br /&gt;
||Returns a dictionary containing event type names as keys and the datatables holding event data for that event type in this OCEL model as value. An empty array is returned if event types datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable for &amp;quot;Create order&amp;quot; events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).OcelEventTypes.Get(&amp;quot;Create order&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjects (Datatable)&lt;br /&gt;
||Datatable containing objects data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if object datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectToObject (Datatable)&lt;br /&gt;
||Datatable containing object-to-object relations data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if object-to-object relation datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectTypes (Dictionary)&lt;br /&gt;
||Returns a dictionary containing object type names as keys and the datatables holding data for that object type in this OCEL model as value. An empty array is returned if object types have not been configured for this model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Object-centric model functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventType&lt;br /&gt;
||Event type name (String)&lt;br /&gt;
||&lt;br /&gt;
Datatable containing event type attributes of given event type in this OCEL model. Value &#039;&#039;null&#039;&#039; is returned if a datatable is not configured for this model for given event type. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable for &amp;quot;Create order&amp;quot; events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).OcelEventType(&amp;quot;Create order&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectType&lt;br /&gt;
||Object type name (String)&lt;br /&gt;
||Datatable containing object type attributes of given object type in this OCEL model. Value &#039;&#039;null&#039;&#039; is returned if a datatable is not configured for this model for given object type. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectTypeConfiguration&lt;br /&gt;
||Object type name (String)&lt;br /&gt;
||Returns a matching configuration object with the following properties:&amp;lt;br&amp;gt;&lt;br /&gt;
# Datatable: name of the datatable&lt;br /&gt;
# Unit: unit label for object type items&lt;br /&gt;
&#039;&#039;Null&#039;&#039; is returned if the given object type is not found in the model configuration.  &lt;br /&gt;
If the object type name is not specified or &#039;&#039;null&#039;&#039;, the function returns a dictionary containing configurations for all defined object types.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Project properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the Project.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was created.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Project settings as Dictionary object. See example in &#039;&#039;ConfigurationJson&#039;&#039; property.&lt;br /&gt;
|-&lt;br /&gt;
||ConfigurationJson (String)&lt;br /&gt;
||Project settings as json string.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;DefaultLocationInDataSource&amp;quot;: {&lt;br /&gt;
    &amp;quot;Database&amp;quot;: &amp;quot;MyDatabase&amp;quot;,&lt;br /&gt;
    &amp;quot;Schema&amp;quot;: &amp;quot;MySchema&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;ConnectionStringKeys&amp;quot;: {&lt;br /&gt;
    &amp;quot;Snowflake&amp;quot;: &amp;quot;MyKey1&amp;quot;,&lt;br /&gt;
    &amp;quot;SqlServer&amp;quot;: &amp;quot;MyKey2&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Dashboards (Dashboard*)&lt;br /&gt;
||Returns all [[Dashboard_in_Expression_Language|dashboards]] in the project.&lt;br /&gt;
|-&lt;br /&gt;
||Datatables (Datatable*)&lt;br /&gt;
||Returns all Datatables in the project.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was deleted (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Project description. The project description may contain line breaks.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedBy (User)&lt;br /&gt;
||User who deleted the Project (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the Project.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last modified the Project.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was last modified (refers to the project name, description and parent, not the contents of the project).&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Name of the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Models (Model*)&lt;br /&gt;
||Models that are in the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Parent (Project)&lt;br /&gt;
||Parent project, i.e. a Project where the Project is located in the hierarchy of Projects. Returns &#039;&#039;null&#039;&#039; for root level Projects. Throws an error if user doesn&#039;t have access to the parent project.&lt;br /&gt;
|-&lt;br /&gt;
||ParentProjectId (Integer)&lt;br /&gt;
||Parent project id. Returns &#039;&#039;null&#039;&#039; for root level Projects. The parent project id is returned even if user doesn&#039;t have access to the parent project.&lt;br /&gt;
|-&lt;br /&gt;
||Scripts (Script*)&lt;br /&gt;
||Scripts that are in the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Secrets (Dictionary*)&lt;br /&gt;
||Returns array of all [[Storing_Secrets_for_Scripts|secrets]] in the project as Dictionary with following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the secret.&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Type of the secret which is one of the following: &amp;quot;odbc&amp;quot;, &amp;quot;sap&amp;quot;, &amp;quot;salesforce&amp;quot;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Project functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreateDashboard (Dashboard)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a dashboard to the project. &#039;&#039;EditDashboards&#039;&#039; permission to the project is required. The parameter is dictionary with following supported dashboard properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Identifier&#039;&#039;&#039; (String): Identifier of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Content&#039;&#039;&#039; (Dictionary): Content of the dashboard.&lt;br /&gt;
&lt;br /&gt;
Example: Create empty dashboard.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .CreateDashboard(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
    &amp;quot;Identifier&amp;quot;: &amp;quot;MyDashboard&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create dashboard with a chart.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .CreateDashboard(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
    &amp;quot;Content&amp;quot;: #{&lt;br /&gt;
      &amp;quot;version&amp;quot;: 4,&lt;br /&gt;
      &amp;quot;typeName&amp;quot;: &amp;quot;View&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
      &amp;quot;subElements&amp;quot;: [&lt;br /&gt;
        #{&lt;br /&gt;
          &amp;quot;position&amp;quot;: #{&lt;br /&gt;
            &amp;quot;x&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;y&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;width&amp;quot;: 0.5,&lt;br /&gt;
            &amp;quot;height&amp;quot;: 0.5,&lt;br /&gt;
            &amp;quot;zOrder&amp;quot;: 0&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;element&amp;quot;: #{&lt;br /&gt;
            &amp;quot;typeName&amp;quot;: &amp;quot;Chart&amp;quot;,&lt;br /&gt;
            &amp;quot;configuration&amp;quot;: #{&lt;br /&gt;
              &amp;quot;root&amp;quot;: #{&lt;br /&gt;
                &amp;quot;expressionType&amp;quot;: &amp;quot;Cases&amp;quot;,&lt;br /&gt;
                &amp;quot;expressionParameters&amp;quot;: #{}&lt;br /&gt;
              },&lt;br /&gt;
              &amp;quot;measures&amp;quot;: [#{&lt;br /&gt;
                &amp;quot;expressionType&amp;quot;: &amp;quot;Count&amp;quot;,&lt;br /&gt;
                &amp;quot;expressionParameters&amp;quot;: #{}&lt;br /&gt;
              }]&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateDatatable&amp;quot;&amp;gt;CreateDatatable&amp;lt;/span&amp;gt; (Datatable)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Creates datatable to the project. After creation, there are no columns or rows in the datatable. The function returns the created datatable entity. Following properties can be set for the datatable:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the datatable. This parameter is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Description for the datatable. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;NameInDataSource&#039;&#039;&#039; (string): Table name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039; (string): Schema name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039; (string): Database name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Defines where the data for the datatable is located. Available values are &#039;&#039;&#039;Snowflake&#039;&#039;&#039;, &#039;&#039;&#039;SqlServer&#039;&#039;&#039;, and &#039;&#039;&#039;Local&#039;&#039;&#039;.  This parameter is optional and default value is defined by the [[PA_Configuration_database_table#General_Settings|DefaultDataSource]] setting.&lt;br /&gt;
* &#039;&#039;&#039;Connection&#039;&#039;&#039;: Connection object for the datatable. This parameter is optional.&lt;br /&gt;
&lt;br /&gt;
Example: Create a new datatable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create Snowflake datatable linked to a custom table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
  &amp;quot;NameInDataSource&amp;quot;: &amp;quot;MyTable&amp;quot;,&lt;br /&gt;
  &amp;quot;SchemaNameInDataSource&amp;quot;: &amp;quot;MySchema&amp;quot;,&lt;br /&gt;
  &amp;quot;DatabaseNameInDataSource&amp;quot;: &amp;quot;MyDatabase&amp;quot;,&lt;br /&gt;
  &amp;quot;Type&amp;quot;: &amp;quot;Snowflake&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create Snowflake datatable where connection string is stored as a [[Storing_Secrets_for_Scripts|secret]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;,&lt;br /&gt;
  &amp;quot;Type&amp;quot;: &amp;quot;Snowflake&amp;quot;,&lt;br /&gt;
  &amp;quot;Connection&amp;quot;: ProjectById(1).CreateSnowflakeConnection(#{ &amp;quot;OdbcConnectionStringKey&amp;quot;: &amp;quot;MyKey&amp;quot; })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateMeaConnection&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Creates an object representing connection to QPR MEA (QPR Suite) Web Service. The function parameter is a dictionary containing the property &#039;&#039;&#039;ConnectionStringKey&#039;&#039;&#039; which defines the MEA connection string secret name in the same project. When the connection object has been created, MEA Web Service [[QPR_MEA_Integration|queries and other operations]] can be executed using it.&lt;br /&gt;
&lt;br /&gt;
Example: create connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let connection = ProjectByName(&amp;quot;MyProject&amp;quot;).CreateMeaConnection( #{&amp;quot;ConnectionStringKey&amp;quot;: &amp;quot;MyMeaConnection&amp;quot;} );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: use connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let results = connection.QueryObjects(&amp;quot;[PG.785401983.683494101]&amp;quot;, &amp;quot;name, typename&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateModel (Model)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Creates a model to a project. Requires &#039;&#039;GenericWrite&#039;&#039; permission for the Project and global &#039;&#039;CreateModel&#039;&#039; permission. If a model with that name already exists, an exception is thrown.&lt;br /&gt;
&lt;br /&gt;
Parameters dictionary has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the model. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Description of the model. This property is optional.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039;: Configuration dictionary for the model. This property is technically optional, but a working model requires at least datasource settings to be defined.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateModel(#{    &lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My model&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
  &amp;quot;Configuration&amp;quot;: #{&lt;br /&gt;
    &amp;quot;DataSource&amp;quot;: #{&lt;br /&gt;
      &amp;quot;Cases&amp;quot;: #{&lt;br /&gt;
        &amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;DataTableName&amp;quot;: &amp;quot;My cases datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
          &amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;Events&amp;quot;: #{&lt;br /&gt;
        &amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;DataTableName&amp;quot;: &amp;quot;My events datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
           &amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;,&lt;br /&gt;
           &amp;quot;EventType&amp;quot;: &amp;quot;Event Type&amp;quot;,&lt;br /&gt;
           &amp;quot;Timestamp&amp;quot;: &amp;quot;Start Time&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateProject&amp;quot;&amp;gt;CreateProject&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Create a project as a sub-project of the context project. Returns the created project. Requires the &#039;&#039;ManageProject&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Parameters dictionary has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the project. This property is required.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Description of the project.&lt;br /&gt;
* &#039;&#039;&#039;ParentProjectId&#039;&#039;&#039; (integer): Id of the parent project where the new project is created. This parameter is usually not needed because the parent project is the context project. The CreateProject function is also available in the generic context where the &#039;&#039;ParentProjectId&#039;&#039; parameter is needed to create sub-projects.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039; (string): Snowflake database the project is linked to. Data for the datatables in this project will be located in this database.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039; (string): Snowflake schema the project is linked to. Data for the datatables in this project will be located in this schema. If the schema is defined, also the &#039;&#039;DatabaseNameInDataSource&#039;&#039; needs to be defined.&lt;br /&gt;
* &#039;&#039;&#039;SnowflakeConnectionStringKey&#039;&#039;&#039; (string): Snowflake connection string key to be used for the datatables in this project. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;, &lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;, &lt;br /&gt;
  &amp;quot;DatabaseNameInDataSource&amp;quot;: &amp;quot;My database&amp;quot;, &lt;br /&gt;
  &amp;quot;SchemaNameInDataSource&amp;quot;: &amp;quot;My schema&amp;quot; &lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateScript (Script)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a new script to the project. The parameter is a dictionary containing the following script properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the script. This is a mandatory parameter. Note that it&#039;s not possible to create multiple scripts with the same name in the same project.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Optional description text of the script.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039; (String): Language of the script. Options: &#039;&#039;Expression&#039;&#039; (default), or &#039;&#039;SQL&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039; (String): Script code.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039; (Dictionary): Script json configuration.&lt;br /&gt;
&lt;br /&gt;
The function returns the created script object. Using the function requires &#039;&#039;ManageScripts&#039;&#039; permission for the project, and additionally &#039;&#039;RunScripts&#039;&#039; for SQL scripts.&lt;br /&gt;
&lt;br /&gt;
Example: Create an expression script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateScript(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My expression script&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;WriteLog(\&amp;quot;Hello world!\&amp;quot;);&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create an SQL script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateScript(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My SQL script&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;This is an example SQL script...&amp;quot;,&lt;br /&gt;
  &amp;quot;Language&amp;quot;: &amp;quot;SQL&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;SELECT * FROM table;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DatatableByName (Datatable)&lt;br /&gt;
||Datatable name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Datatable by its name located in the project. Returns null, if Datatable with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).DatatableByName(&amp;quot;MyDatatable1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable by name, and create it if it doesn&#039;t exist:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let project = ProjectById(123);&lt;br /&gt;
let datatableName = &amp;quot;MyDatatable1&amp;quot;;&lt;br /&gt;
let datatable = project.DatatableByName(datatableName);&lt;br /&gt;
if (datatable == null) {&lt;br /&gt;
  datatable = project.CreateDatatable(datatableName);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||Deletes the Project permanently. Note that the Project doesn&#039;t need to be in the recycle bin to be able to delete it permanently.&lt;br /&gt;
|-&lt;br /&gt;
||Export (String)&lt;br /&gt;
||(none)&lt;br /&gt;
||Exports the project and its content to a json string. The json format is described in [[Projects Export File Format]].&lt;br /&gt;
&lt;br /&gt;
Example: Export project id 1 to json data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).Export();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Import&lt;br /&gt;
||JSON string&lt;br /&gt;
||Creates one or several projects from a json string. The project(s) are created as child projects of the context project. The json format is described in [[Projects Export File Format]]. The function returns the created project objects. In case the project names already exist, the import operation automatically adjusts the names to be unique.&lt;br /&gt;
&lt;br /&gt;
Example: Create project from json data (as child of project id 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let jsonData = `{ &amp;quot;Projects&amp;quot;: [ { &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot; } ] }`;&lt;br /&gt;
let result = ProjectById(1).Import(jsonData);&lt;br /&gt;
let createdProjectId = result[&amp;quot;Projects&amp;quot;][0].Id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Restore&lt;br /&gt;
||(none)&lt;br /&gt;
||Restores the Project from the recycle bin back to the original location.&lt;br /&gt;
|-&lt;br /&gt;
||ModelByName (Model)&lt;br /&gt;
||Model name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Model by its name located in the project. Returns null, if Model with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).ModelByName(&amp;quot;My Model 1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;ModifyProject&amp;quot;&amp;gt;Modify&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||Dictionary of settings to change&lt;br /&gt;
||&lt;br /&gt;
Change project settings. Following settings are supported:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the project.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description text of the project.&lt;br /&gt;
* &#039;&#039;&#039;ParentProjectId&#039;&#039;&#039; (Integer): Parent project id. Changing this effectively moves the project into different parent project.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039;: Name of the Snowflake database where the project&#039;s datatables are located. The database needs to exist in the same Snowflake account configured in the Snowflake connection string. When defining this setting, define also the &#039;&#039;SchemaNameInDataSource&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039;: Name of the Snowflake schema where the project&#039;s datatables are located. The schema needs to exist in the same Snowflake account configured in the Snowflake connection string. When defining this setting, define also the &#039;&#039;DatabaseNameInDataSource&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;SnowflakeConnectionStringKey&#039;&#039;&#039; (String): Snowflake connection string key for the project. Snowflake datatables in the project will use connection string behind this key (unless specified by the datatatable).&lt;br /&gt;
* &#039;&#039;&#039;SqlServerConnectionStringKey&#039;&#039;&#039; (String): SQL Server connection string key. SQL Server datatables in the project will use connection string behind this key (unless specified by the datatatable).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ManageProject&#039;&#039; permission is needed to change project properties.&lt;br /&gt;
&lt;br /&gt;
Example: Change project name and move project into other parent project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .Modify(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Project 1&amp;quot;&lt;br /&gt;
    &amp;quot;ParentProjectId&amp;quot;: 2&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set Snowflake connection string key for the project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .Modify(#{&lt;br /&gt;
    &amp;quot;SnowflakeConnectionStringKey&amp;quot;: &amp;quot;MyKey1&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ScriptByName (Script)&lt;br /&gt;
||Script name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Script by its name located in the project. Returns null, if Script with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).ScriptByName(&amp;quot;MyScript1&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;SetSecret&amp;quot;&amp;gt;SetSecret&amp;lt;/span&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
# Secret type (string)&lt;br /&gt;
# Secret name (string)&lt;br /&gt;
# Secret value (string)&lt;br /&gt;
||Sets or adds a [[Storing_Secrets_for_Scripts|secret]] for the project. Setting the secret value to &#039;&#039;null&#039;&#039; removes the secret. There can be several secrets with the same name in the same project if the type of the secret is different. Setting secrets requires the project specific &#039;&#039;ManageProject&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Secret type which is one of the following:&lt;br /&gt;
#* &amp;quot;externaldatatableconnection&amp;quot;: Snowflake ODBC connection string for datatables.&lt;br /&gt;
#* &amp;quot;odbc&amp;quot;: ODBC connection string (e.g., to extract data in scripts, or load an in-memory model).&lt;br /&gt;
#* &amp;quot;oledb&amp;quot;: OleDB connection string (e.g., to extract data in scripts, or load an in-memory model).&lt;br /&gt;
#* &amp;quot;sap&amp;quot;: SAP password.&lt;br /&gt;
#* &amp;quot;salesforce&amp;quot;: Salesforce password.&lt;br /&gt;
#* &amp;quot;sql&amp;quot;: SQL Server connection string.&lt;br /&gt;
#* &amp;quot;qprmea&amp;quot;: QPR MEA connection string.&lt;br /&gt;
# &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Secret name, used to refer to the secret in the commands.&lt;br /&gt;
# &#039;&#039;&#039;Value&#039;&#039;&#039; (string): Secret value which contains the confidential information.&lt;br /&gt;
&lt;br /&gt;
Example: Set SAP password:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).SetSecret(&amp;quot;sap&amp;quot;, &amp;quot;MySapPassword&amp;quot;, &amp;quot;I l0ve 5AP!&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Remove SAP password:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).SetSecret(&amp;quot;sap&amp;quot;, &amp;quot;MySapPassword&amp;quot;, null);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Functions to get project:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ProjectById&lt;br /&gt;
||Project id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns project object corresponding to the provided project id.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectByName&lt;br /&gt;
||Project name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns project object by given project name. If there is no such project or user doesn&#039;t have access to it, &#039;&#039;null&#039;&#039; value is returned. If there are multiple projects with the same name, one of them is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let project = ProjectByName(&amp;quot;My Project&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Functions to create project:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateProject&amp;quot;&amp;gt;CreateProject&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Create a project. This is a similar function as the [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#CreateProject|CreateProject function]] in the project context. This function in the generic context is needed to create root-level projects (which don&#039;t have parent project).&lt;br /&gt;
&lt;br /&gt;
Example: create a root project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: create a sub-project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;&lt;br /&gt;
  &amp;quot;ParentProjectId&amp;quot;: 1&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;Import&amp;quot;&amp;gt;Import&amp;lt;/span&amp;gt; (Project*)&lt;br /&gt;
||JSON string&lt;br /&gt;
||Creates one or several projects from a json string. The project(s) are created as the root level projects. The json format is described in [[Projects Export File Format]]. The function returns the created project objects. In case the project names already exist, the import operation automatically adjusts the names to be unique.&lt;br /&gt;
&lt;br /&gt;
Example: Create a root level project from json data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let jsonData = `{ &amp;quot;Projects&amp;quot;: [ { &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot; } ] }`;&lt;br /&gt;
let result = Import(jsonData);&lt;br /&gt;
let createdProjectId = result[&amp;quot;Projects&amp;quot;][0].Id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Script ==&lt;br /&gt;
Scripts are entities that contain executable code, that can be run. Usually scripts contains ETL routines but also other kind of tasks are possible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Script properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Code (String)&lt;br /&gt;
||Script code.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Script&#039;s configuration.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the Script.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the Script was created.&lt;br /&gt;
|-&lt;br /&gt;
||CurrentRunStart (DateTime)&lt;br /&gt;
||Timestamp of the current run start. Null if the script is currently not running.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Description of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||Language (String)&lt;br /&gt;
||Either of the following scripting language: &#039;&#039;&#039;Expression&#039;&#039;&#039; or &#039;&#039;&#039;SQL&#039;&#039;&#039;. When language is Expression, the script is run as an expression script, and when language is SQL, the script is run as an SQL script (using the sandbox database).&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last modified the Script.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the Script was last modified.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunEnd (DateTime)&lt;br /&gt;
||Timestamp of the last completed script run end (either successful completion or failure). Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunResult (String)&lt;br /&gt;
||Result of the last run. Options are:&lt;br /&gt;
* &#039;&#039;&#039;Completed&#039;&#039;&#039;: The last run was completed successfully.&lt;br /&gt;
* &#039;&#039;&#039;Failed&#039;&#039;&#039;: An error occurred during the last run, so likely the script did not complete as intended.&lt;br /&gt;
* &#039;&#039;&#039;Aborted&#039;&#039;&#039;: Script run was manually stopped prematurely by a user, so the script did not proceeded in the end.&lt;br /&gt;
&lt;br /&gt;
Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunStart (DateTime)&lt;br /&gt;
||Timestamp of the last completed script run start time. Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
|McpPrimitiveType (String)&lt;br /&gt;
|Returns one of the following values depending on which type of MCP primitive the script supports:&lt;br /&gt;
&lt;br /&gt;
* Tool&lt;br /&gt;
* Prompt&lt;br /&gt;
* ResourceNull value means that the script does not support any MCP primitive type.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Name of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||OperationId (Integer)&lt;br /&gt;
||Id of the operation which runs the Script. Null if the script is currently not running.&lt;br /&gt;
|-&lt;br /&gt;
||Project (Project)&lt;br /&gt;
||Project where the Script is located. Null if the script is in the global context.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||Id of the project where the Script is located. Null if the script is in the global context.&lt;br /&gt;
|-&lt;br /&gt;
||Status (String)&lt;br /&gt;
||Current status of the script. Options are:&lt;br /&gt;
* &#039;&#039;&#039;Ready&#039;&#039;&#039;: Script is not running. In this status, the script can be started (changing the status to &#039;&#039;Running&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Running&#039;&#039;&#039;: Script is running. In this status, the script can be stopped (changing the status to &#039;&#039;Stopping&#039;&#039;). Calling stop just requests a script to stop, and the actual stopping occurs some time later.&lt;br /&gt;
* &#039;&#039;&#039;Stopping&#039;&#039;&#039;: Script has been requested to be stopped, but it&#039;s still running. In this status, neither start nor stop can be called for the script. When the script eventually stops, its status changes to &#039;&#039;Ready&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpTool (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP tool or not.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpPrompt (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP prompt or not.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpResource (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP resource or not.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Script functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Deletes the script permanently. To delete an expression script, &#039;&#039;&#039;ManageScripts&#039;&#039;&#039; permission for the project is needed, and to delete an SQL script, global &#039;&#039;&#039;RunScripts&#039;&#039;&#039; permission and &#039;&#039;&#039;ManageScripts&#039;&#039;&#039; permission for the project is needed.&lt;br /&gt;
|-&lt;br /&gt;
||Modify&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Modifies properties of a script. The parameter is a dictionary of properties to change:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the script.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description text of the script.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039; (String): Language of the script, either &#039;&#039;Expression&#039;&#039; or &#039;&#039;SQL&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039; (String): Script code.&lt;br /&gt;
* &#039;&#039;&#039;ProjectId&#039;&#039;&#039; (Integer): Id of the project where the script is located. Changing this property moves the script into a different project.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039; (Dictionary): Script json configuration.&lt;br /&gt;
&lt;br /&gt;
Requires &#039;&#039;ManageScripts&#039;&#039; permissions in the project. Additionally, requires &#039;&#039;RunScripts&#039;&#039; permission for SQL scripts.&lt;br /&gt;
&lt;br /&gt;
Example: Rename script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;Updated script&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Change multiple properties in the same call:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;Updated script&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;Updated description&amp;quot;,&lt;br /&gt;
  &amp;quot;Language&amp;quot;: &amp;quot;SQL&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;SELECT 1&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Move script to a different project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;ProjectId&amp;quot;: ProjectByName(&amp;quot;My project&amp;quot;).Id&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Run (Object)&lt;br /&gt;
||Dictionary of parameters&lt;br /&gt;
||&lt;br /&gt;
Runs the script using the provided parameters. The parameters are available in the script as variables (see the example). Any type of variables can be passed to the script. Note that if the script assumes certain variables, but that they are not passed to the script, the script run will throw an error. &lt;br /&gt;
&lt;br /&gt;
For SQL scripts, the passed parameters are available in the script as variables in format &#039;&#039;&#039;@_parameter_&amp;lt;ParameterName&amp;gt;&#039;&#039;&#039; where &amp;lt;ParameterName&amp;gt; is the name of the parameter, e.g. &#039;&#039;parameter_myParameter1&#039;&#039;. Only string type of parameters can be used, so any other type of data in parameter values is converted into strings.&lt;br /&gt;
&lt;br /&gt;
The return value of the script is returned by the Run function. Expression scripts return a value with the &#039;&#039;return&#039;&#039; statement or alternatively the result of the last line of the script is the return value. If the script does not return any value, the Run function returns &#039;&#039;_empty&#039;&#039;. For SQL scripts, the return value is the last dataset produced by the script (returned as a DataFrame) (SQL scripts might create several datasets using the &#039;&#039;--#ShowReport&#039;&#039; command or the &#039;&#039;Show&#039;&#039; parameter).&lt;br /&gt;
&lt;br /&gt;
When a script is called using the Run function, the called script status does not change, because it&#039;s the parent script that is &#039;&#039;Running&#039;&#039;. Also the called script log is not filled, but instead the logging goes to the calling script.&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to call a script using the Run function several times simultaneously.&lt;br /&gt;
&lt;br /&gt;
If there is an error when running the called script, the Run function throws the error to the calling script.&lt;br /&gt;
&lt;br /&gt;
Scripts are run in the script entity context, so for example the following properties are available:&lt;br /&gt;
* Id: Script id&lt;br /&gt;
* Name: Script name&lt;br /&gt;
* Project.Id: Project id where the script is located&lt;br /&gt;
* Project.Name: Name of the project where the script is located&lt;br /&gt;
&lt;br /&gt;
Example: Following script (id 123) raises a specified number to a specified power:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return Pow(numberToRaise, exponent);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script can be called as follows (returning 16):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runResult = ScriptById(123).Run(#{&lt;br /&gt;
  &amp;quot;numberToRaise&amp;quot;: 4,&lt;br /&gt;
  &amp;quot;exponent&amp;quot;: 2&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;Start&amp;quot;&amp;gt;Start&amp;lt;/span&amp;gt;&lt;br /&gt;
||Dictionary of parameters&lt;br /&gt;
||Starts the script. The function call doesn&#039;t wait for the script run to complete (i.e., asynchronous behavior) which is same as starting the script in the [[Managing_Scripts#Starting_Script|Workspace]].&lt;br /&gt;
&lt;br /&gt;
Parameters to the script can be provided as a dictionary of name-value pairs (which is not possible when script is started in the Workspace). Return value is the script run id (integer) if the script was started. If the script is already running, return value is &#039;&#039;null&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: Start script (without parameters) and store the script run id:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runId = ScriptById(1).Start();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Start script with passing parameters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Start(#{&lt;br /&gt;
  &amp;quot;variable1&amp;quot;: &amp;quot;val1&amp;quot;,&lt;br /&gt;
  &amp;quot;variable2&amp;quot;: 5&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Stop&lt;br /&gt;
||&lt;br /&gt;
||Stops the script. The operation doesn&#039;t wait for the stopping to complete (i.e., asynchronous behavior) which is same as stopping the script in the [[Managing_Scripts#Stopping_Script|Workspace]]. Depending on the operation that the script is performing, the stopping might take some time.&lt;br /&gt;
&lt;br /&gt;
Return value is the script run id (integer) if the script was running. If the script isn&#039;t running, the return value is &#039;&#039;null&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runId = ScriptById(1).Stop();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get a script by the script id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ScriptById&lt;br /&gt;
||&lt;br /&gt;
* Script id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns Script object corresponding to the given script id. If script with the given id doesn&#039;t exist or user doesn&#039;t have permissions to it, an error is given.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User/Group ==&lt;br /&gt;
User objects represents users and user groups. Note that some properties can only be used for users and some for groups.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;User/group properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||Returns the user who created the user.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Returns the date when the user was created.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultDashboard (String)&lt;br /&gt;
||Returns the configured [[User_Profile#Starting_dashboard|starting dashboard]] (&amp;quot;default dashboard&amp;quot;) identifier for a group (for users, the starting dashboard cannot be configured). The starting dashboard is automatically opened when a user logs in.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Description of the user.&lt;br /&gt;
|-&lt;br /&gt;
||EffectiveDefaultDashboard (String)&lt;br /&gt;
||Returns the [[User_Profile#Starting_dashboard|starting dashboard]] of a user. Value &#039;&#039;null&#039;&#039; means that the user doesn&#039;t have a starting dashboard. The starting dashboard comes from the user&#039;s groups. If multiple of user&#039;s groups have the starting dashboard defined, the user&#039;s starting dashboard will be taken from a group having alphabetically the first name.&lt;br /&gt;
|-&lt;br /&gt;
||Email (String)&lt;br /&gt;
||Email address of the user.&lt;br /&gt;
|-&lt;br /&gt;
||FullName (String)&lt;br /&gt;
||Full name of the user or group name.&lt;br /&gt;
|-&lt;br /&gt;
||GlobalPermissions (String*)&lt;br /&gt;
||Array of global [[Roles and Permissions#Global_and_Project_Roles|permissions]] of the user. Global permissions come from the global roles assigned to the user and groups that the user belongs to. Note that to get the effective permissions for certain objects, also project specific permissions need to be taken into account.&lt;br /&gt;
|-&lt;br /&gt;
||GroupMemberNames (String*)&lt;br /&gt;
||Array of names of members of a user group. This property is available for groups.&lt;br /&gt;
|-&lt;br /&gt;
||GroupMembers (User*)&lt;br /&gt;
||Array of members of a user group. This property is available for groups.&lt;br /&gt;
|-&lt;br /&gt;
||GroupNames (String*)&lt;br /&gt;
||Array of names of user groups the user belongs to. This property is available for users.&lt;br /&gt;
|-&lt;br /&gt;
||Groups (User*)&lt;br /&gt;
||Array of user groups the user belongs to. This property is available for users.&lt;br /&gt;
|-&lt;br /&gt;
||HasPassword (Boolean)&lt;br /&gt;
||Returns true if user has a password defined in QPR ProcessAnalyzer and thus user can authenticate using the password. If user doesn&#039;t have a password, the SAML authentication is the only way to log in. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property for other users.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the user, which is unique for every user.&lt;br /&gt;
|-&lt;br /&gt;
||IsActive (Boolean)&lt;br /&gt;
||Returns true only if the user is active (not disabled).&lt;br /&gt;
|-&lt;br /&gt;
||IsGroup (Boolean)&lt;br /&gt;
||Returns true if the user is a user group.&lt;br /&gt;
|-&lt;br /&gt;
||IsLocked (Boolean)&lt;br /&gt;
||Returns true if user account is currently [[User_Session_Management#Preventing_password_guessing_attacks|locked]]. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property.&lt;br /&gt;
|-&lt;br /&gt;
||LastLockedDate (DateTime)&lt;br /&gt;
||Returns date when user account was locked the last time. Returns &#039;&#039;null&#039;&#039; if the user account has never been locked. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property.&lt;br /&gt;
|-&lt;br /&gt;
||LastLoginDate (DateTime)&lt;br /&gt;
||Returns date when the user made last successful login. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property for other users.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||Returns the user who last modified this user.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Returns the date when the user was last modified.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Login name of the user or group.&lt;br /&gt;
|-&lt;br /&gt;
||Roles (Object**)&lt;br /&gt;
||&lt;br /&gt;
Returns all roles of the user (both global and project roles) as a nested array structure.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(Users.Where(name == &amp;quot;qpr&amp;quot;).Roles)&lt;br /&gt;
Returns (for example):&lt;br /&gt;
[&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:1&amp;quot;}, &amp;quot;Administrator&amp;quot;],&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:2&amp;quot;}, &amp;quot;Analyzer&amp;quot;],&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:3&amp;quot;}, &amp;quot;Viewer&amp;quot;],&lt;br /&gt;
  [null, &amp;quot;RunScripts&amp;quot;],&lt;br /&gt;
  [null, &amp;quot;Administrator&amp;quot;]&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;User/group functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||EffectivePermissionsFor (String Array)&lt;br /&gt;
||&lt;br /&gt;
* Project to get permissions&lt;br /&gt;
||&lt;br /&gt;
Returns effective (actual) permission of the user to the given project. Project is given as a [[#Project|project object]] (not as a project id). Effective permissions determine the actual permissions that the user has, i.e. a combination of all permissions assigned to the user and groups the user belong to, including both project specific and global roles.&lt;br /&gt;
&lt;br /&gt;
Permissions for the EffectivePermissionsFor function are as follows:&lt;br /&gt;
* All users can query their own permissions&lt;br /&gt;
* To get permissions for any user, the user needs to have [[Roles_and_Permissions|ManageUsers permission]].&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;inactive&#039;&#039; users don&#039;t have any effective permissions, so the EffectivePermissionsFor function does not return any permissions for those users.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1).EffectivePermissionsFor(ModelById(2).Project)&lt;br /&gt;
Returns (for example): [&amp;quot;EditDashboards&amp;quot;, &amp;quot;Filtering&amp;quot;, &amp;quot;GenericRead&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||GetAttribute&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Returns user attribute value by given attribute name and optionally by the model/project/dashboard context. Supported data types are String, Integer, Float, and DateTime. To store more complex data types, data can be converted into json and stored as string. If the attribute doesn&#039;t exist, null is returned.&lt;br /&gt;
&lt;br /&gt;
For example, if using dashboard as context, the attributes are effectively bound to each user and each dashboard separately. Thus, there can be several attributes with the same name as long as the dashboard is different.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Attribute name&#039;&#039;&#039; (String): Name of the attribute.&lt;br /&gt;
# &#039;&#039;&#039;Attribute context&#039;&#039;&#039; (Project/Model/Dashboard): Optional context object the attribute is linked to.&lt;br /&gt;
&lt;br /&gt;
Users have permissions to get attributes for themselves, and also (administrator) users with global &#039;&#039;ManageUsers&#039;&#039; permission can get attributes for all users. In addition, if using the context object, the &#039;&#039;GenericRead&#039;&#039; permission is required for the context object.&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for myself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CurrentUser&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for user John:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Users&lt;br /&gt;
  .Where(Name==&amp;quot;John&amp;quot;)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for user 1 related to dashboard id 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;, DashboardById(1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||SetAttribute&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Sets user attribute value for given attribute name and optionally for the model/project/dashboard context. Supported data types are String, Integer, Float, and DateTime. To store more complex data types, data can be converted into json and stored as string. If setting value &#039;&#039;null&#039;&#039;, the user attribute is removed. Required permissions are same as in the GetAttribute function.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Attribute name&#039;&#039;&#039; (String): Name of the attribute.&lt;br /&gt;
# &#039;&#039;&#039;Attribute value&#039;&#039;&#039; (String/Integer/Float/DateTime): Attribute value to be stored.&lt;br /&gt;
# &#039;&#039;&#039;Attribute context&#039;&#039;&#039; (Project/Model/Dashboard): Optional context object the attribute value is linked to.&lt;br /&gt;
&lt;br /&gt;
Example: Set user attribute MyDataValue for myself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CurrentUser&lt;br /&gt;
  .SetAttribute(&amp;quot;MyDataValue &amp;quot;, &amp;quot;value&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set value 123 as user attribute MyDataValue for user John:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Users&lt;br /&gt;
  .Where(Name==&amp;quot;John&amp;quot;)&lt;br /&gt;
  .SetAttribute(&amp;quot;MyDataValue&amp;quot;, 123);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set current time as user attribute MyDataValue for user 1 related to dashboard id 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;, Now, DashboardById(1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get User by user id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||UserById (User)&lt;br /&gt;
||&lt;br /&gt;
* User id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns User object that has the provided user id. Also groups can be queried with this function. Returns an access denied error if the user with given id does not exist or the current user does not have access to it.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Objects_in_Expression_Language&amp;diff=28532</id>
		<title>QPR ProcessAnalyzer Objects in Expression Language</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Objects_in_Expression_Language&amp;diff=28532"/>
		<updated>2026-06-17T13:59:59Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Filter==&lt;br /&gt;
Filters contain a set of filter rules used to filter cases and events in models. Filters are objects located in the models. Filters are owned by the creator user, and when a filter publish mode is private, only the creator can use it.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Filter properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||Returns the user who created the filter.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Returns date when the filter created date.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Returns description of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Returns id of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||Returns user who modified the filter.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Returns date when the filter last modified.&lt;br /&gt;
|-&lt;br /&gt;
||Model&lt;br /&gt;
||Returns model where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ModelId (Integer)&lt;br /&gt;
||Returns model where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Returns the name of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||Project&lt;br /&gt;
||Returns project where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||Returns project id where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||PublishMode (String)&lt;br /&gt;
||Returns publish mode of the filter, one of the following: &#039;&#039;&#039;Private&#039;&#039;&#039;, &#039;&#039;&#039;Public&#039;&#039;&#039;, or &#039;&#039;&#039;Default&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||Rules (Dictionary)&lt;br /&gt;
||Returns a dictionary containing the filter rules in the filter.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Filter functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Deletes the filter permanently. To delete own filters, the &#039;&#039;&#039;Filtering&#039;&#039;&#039; permission is needed, and to delete any filters the &#039;&#039;&#039;ManageViews&#039;&#039;&#039; permission is needed.&lt;br /&gt;
|-&lt;br /&gt;
||Modify&lt;br /&gt;
||Dictionary&lt;br /&gt;
||&lt;br /&gt;
Changes the filter properties. The input parameter is a dictionary containing the filter properties to change:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the filter.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description of the filter.&lt;br /&gt;
* &#039;&#039;&#039;PublishMode&#039;&#039;&#039; (String): Privacy model of the filter rule. One of the following: &#039;&#039;Private&#039;&#039;, &#039;&#039;Public&#039;&#039;, or &#039;&#039;Default&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Rules&#039;&#039;&#039; (Dictionary): Filter rules as Dictionary ([[Filtering_in_QPR_ProcessAnalyzer_Queries|more information]]).&lt;br /&gt;
* &#039;&#039;&#039;ModelId&#039;&#039;&#039; (Integer): Id of the model where the filter is located. Changing this will move the filter into a different model.&lt;br /&gt;
&lt;br /&gt;
The function returns the updated filter object. Requires &#039;&#039;Filtering&#039;&#039; or &#039;&#039;ManageViews&#039;&#039; permission for the project depending on the owner of the filter.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FilterById(1)&lt;br /&gt;
	.Modify(#{&lt;br /&gt;
		&amp;quot;Name&amp;quot;: &amp;quot;My filter&amp;quot;,&lt;br /&gt;
		&amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
		&amp;quot;PublishMode&amp;quot;: &amp;quot;Public&amp;quot;,&lt;br /&gt;
		&amp;quot;Rules&amp;quot;: #{&lt;br /&gt;
			&amp;quot;Items&amp;quot;: [&lt;br /&gt;
				#{&lt;br /&gt;
					&amp;quot;Type&amp;quot;: &amp;quot;IncludeCases&amp;quot;,&lt;br /&gt;
					&amp;quot;Items&amp;quot;: [&lt;br /&gt;
						#{&lt;br /&gt;
							&amp;quot;Type&amp;quot;: &amp;quot;CaseAttributeValue&amp;quot;,&lt;br /&gt;
							&amp;quot;Attribute&amp;quot;: &amp;quot;Account Manager&amp;quot;,&lt;br /&gt;
							&amp;quot;StringifiedValues&amp;quot;: [&lt;br /&gt;
								&amp;quot;0Mary Wilson&amp;quot;&lt;br /&gt;
							]&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get filter id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||FilterById&lt;br /&gt;
||&lt;br /&gt;
* Filter id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns Filter object corresponding to the provided filter id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Model==&lt;br /&gt;
Notes:&lt;br /&gt;
* For in-memory models that are offline, the object counts represent the situation when the model was last time online (loaded into the memory). &#039;&#039;null&#039;&#039; is returned if the model has never been loaded into the memory.&lt;br /&gt;
* If [[Case_Level_Permissions|Case permissions]] are used for the model, and user doesn&#039;t have &#039;&#039;&#039;GenericWrite&#039;&#039;&#039; permission for the model, &#039;&#039;null&#039;&#039; is returned for data security reasons. Users that have the &#039;&#039;&#039;GenericWrite&#039;&#039;&#039; permission, see null when the model is offline, and when online, they see counts where the case level permissions settings are applied.&lt;br /&gt;
* Properties &#039;&#039;CaseAttributes&#039;&#039;, &#039;&#039;EventAttributes&#039;&#039; and &#039;&#039;Eventlog&#039;&#039; work only for the in-memory models and they require the model to be loaded into the memory. If the model is not in the memory, it is loaded when these properties is used. Other model properties down require the model to be in the memory.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||AllFilters (Filter*)&lt;br /&gt;
||Returns an array of all [[#Filter|filters]] in the model the user has access to. In addition to the &#039;&#039;Filters&#039;&#039; property, &#039;&#039;AllFilters&#039;&#039; also returns private filters of other users. The &#039;&#039;ManageViews&#039;&#039; permission is required to use this property - otherwise error is given.&lt;br /&gt;
|-&lt;br /&gt;
||Calendars (BusinessCalendar*)&lt;br /&gt;
||&lt;br /&gt;
Returns all [[Business_Calendar|business calendars]] stored to the Model as an array. Returns an empty array, if there are no business calendars stored to the model. Note: UI allows to set only one business calendar for a Model.&lt;br /&gt;
|-&lt;br /&gt;
||CaseAttributes (AttributeType*)&lt;br /&gt;
||[[#AttributeType|CaseAttributes]] in the model returned in the alphabetical order. Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||CasesDatatable (Datatable)&lt;br /&gt;
||Returns the Datatable the model uses as a datasource for cases. Returns &#039;&#039;null&#039;&#039; if the cases Datatable is not defined or if model uses other than the Datatable datasource.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Returns the Model configuration as dictionary. Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).Configuration.DataSource.Events.DataTableName&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ConfigurationJson (String)&lt;br /&gt;
||Returns the Model configuration as JSON string.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the model.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the model was created.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultCalendar (BusinessCalendar)&lt;br /&gt;
||Returns the default [[Business_Calendar|business calendar]] of the Model. Returns &#039;&#039;null&#039;&#039;, if there are no calendars in the Model or no calendar has been set as a default calendar. Note: UI allows to set only one business calendar for a Model, which is also the default calendar.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFilter (Filter)&lt;br /&gt;
||Default filter of the model. Returns &#039;&#039;null&#039;&#039; if the model does not have a default filter.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFilterId (Integer)&lt;br /&gt;
||Default filter id of the model. Returns &#039;&#039;null&#039;&#039; if the model does not have a default filter.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Model description. The model description may contain line breaks.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedDate (DateTime)&lt;br /&gt;
||Timestamp when Model was deleted (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||DeletedBy (User)&lt;br /&gt;
||User how deleted the Model.&lt;br /&gt;
|-&lt;br /&gt;
||Diagrams (Diagram*)&lt;br /&gt;
||Returns an array of all [[Diagram_in_Expression_Language|diagrams]] in the model.&lt;br /&gt;
|-&lt;br /&gt;
||EstimatedMemory (Integer)&lt;br /&gt;
||Returns an estimation of how much memory in bytes the model requires.&lt;br /&gt;
|-&lt;br /&gt;
||EventsDatatable (Datatable)&lt;br /&gt;
||Returns the Datatable the model uses as a datasource for events. Returns &#039;&#039;null&#039;&#039; if the events Datatable is not defined or if model uses other than the Datatable datasource.&lt;br /&gt;
|-&lt;br /&gt;
||EventAttributes (AttributeType*)&lt;br /&gt;
||[[#AttributeType|EventAttributes]] in the model returned in the alphabetical order. Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||EventLog (EventLog)&lt;br /&gt;
||EventLog containing the entire model (i.e. event log where no filters have been applied). Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||Filters (Filter*)&lt;br /&gt;
||Returns an array of all public [[#Filter|filters]], the default filter (if any) and the user&#039;s own private filters in the model. Note that the other users&#039;s private filters are not returned even for administrators.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Model Id. Model Id is generated by QPR ProcessAnalyzer when the model is created.&lt;br /&gt;
|-&lt;br /&gt;
||IsValidInMemoryModel (boolean)&lt;br /&gt;
||Returns &#039;&#039;true&#039;&#039; if all the following conditions are met:&lt;br /&gt;
* CheckModelValidity function doesn&#039;t return any issues (because invalid models are assumed to be Snowflake models).&lt;br /&gt;
* Model is not an object-centric model.&lt;br /&gt;
* Data source of the model is &#039;&#039;ODBC&#039;&#039; or &#039;&#039;Expression&#039;&#039;, or the referred datatable has &#039;&#039;DataSourceType&#039;&#039; either &#039;&#039;Local&#039;&#039; or &#039;&#039;SqlServer&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last time modified the model properties. Note that datatables containing the eventlog data are separate objects having similar fields to track the last modification and last data import.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the model was modified the last time.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Model name.&lt;br /&gt;
|-&lt;br /&gt;
||NCache (Integer)&lt;br /&gt;
||Number of objects related to the model when the model is loaded into the memory.&lt;br /&gt;
|-&lt;br /&gt;
||NCaseAttributes (Integer)&lt;br /&gt;
||Number of [[#AttributeType|CaseAttributes]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NCases (Integer)&lt;br /&gt;
||Number of [[#Case|Cases]] in the model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEventAttributes (Integer)&lt;br /&gt;
||Number of [[#AttributeType|EventAttributes]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEvents (Integer)&lt;br /&gt;
||Number of [[#Event|Events]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEventTypes (Integer)&lt;br /&gt;
||Number of [[#EventType|EventTypes]] in the model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||Project (Project)&lt;br /&gt;
||[[#Project|Project]] where the model belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||[[#Project|Project]] id where the model belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||Status (String)&lt;br /&gt;
||&lt;br /&gt;
Memory availability status of the model. There are the following statuses:&lt;br /&gt;
* &#039;&#039;&#039;Loading&#039;&#039;&#039;: The model is currently loading into the memory. When the loading is ready, the status changes to &#039;&#039;online&#039;&#039;. If the loading fails, the status changes to &#039;&#039;offline&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Offline&#039;&#039;&#039;: The model is currently not loaded into the memory. The model needs to be loaded into the memory, so that analyses can be calculated from the model (occurs automatically when an analysis is requested).&lt;br /&gt;
* &#039;&#039;&#039;Online&#039;&#039;&#039;: The model is in the memory and ready for analysis calculation. If the model is dropped from the memory, its status changes to &#039;&#039;offline&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||UsedDatatables (Datatable*)&lt;br /&gt;
||Returns all datatables the model uses as a datasource.&lt;br /&gt;
&lt;br /&gt;
Example: List datatables used by a model:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
StringJoin(&amp;quot;, &amp;quot;, OrderByValue(ModelById(1).UsedDataTables.Name))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CalendarByName (BusinessCalendar)&lt;br /&gt;
||&lt;br /&gt;
name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns a [[Business_Calendar|business calendar]] stored to the Model by the name of the calendar. Business calendars can be stored to models in the model properties. Returns &#039;&#039;null&#039;&#039;, if a calendar with the provided name is not stored to the model.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).CalendarByName(&amp;quot;MyCalendar&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateDiagram (Diagram)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||&lt;br /&gt;
Creates a [[Diagram_in_Expression_Language|diagram]] to the model. Parameters is a dictionary containing diagram properties. Following properties are available:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Diagram name that distinguishes diagrams in a model.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Diagram description text.&lt;br /&gt;
* &#039;&#039;&#039;Content&#039;&#039;&#039; (dictionary): Diagram content as dictionary.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1)&lt;br /&gt;
  .CreateDiagram(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My diagram&amp;quot;,&lt;br /&gt;
    &amp;quot;Description&amp;quot;: &amp;quot;This is my new diagram&amp;quot;,&lt;br /&gt;
    &amp;quot;Content&amp;quot;: #{ ... },&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateFilter (Filter)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a filter to a model. Requires &#039;&#039;GenericWrite&#039;&#039; permission for the project and global &#039;&#039;CreateModel&#039;&#039; permission. If a filter with that name already exists in the model, an exception is thrown.&lt;br /&gt;
The parameters dictionary may have the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the filter. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Description of the filter. This property is optional.&lt;br /&gt;
* &#039;&#039;&#039;Rules&#039;&#039;&#039;: Filter rules for the filter defined as a dictionary according to the [[Filtering_in_QPR_ProcessAnalyzer_Queries|filter json format]]. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;PublishMode&#039;&#039;&#039;: Publish mode of the filter which is one of the following: &#039;&#039;Private&#039;&#039;, &#039;&#039;Public&#039;&#039; or &#039;&#039;Default&#039;&#039;. This property is optional, and the default value is &#039;&#039;Private&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let newFilter = modelById(1).CreateFilter(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My Filter&amp;quot;,&lt;br /&gt;
  &amp;quot;Rules&amp;quot;: #{&lt;br /&gt;
    &amp;quot;Items&amp;quot;: [#{&lt;br /&gt;
      &amp;quot;Type&amp;quot;: &amp;quot;IncludeCases&amp;quot;,&lt;br /&gt;
      &amp;quot;Items&amp;quot;: [#{&lt;br /&gt;
        &amp;quot;Type&amp;quot;: &amp;quot;CaseAttributeValue&amp;quot;,&lt;br /&gt;
        &amp;quot;Attribute&amp;quot;: &amp;quot;Account Manager&amp;quot;,&lt;br /&gt;
        &amp;quot;StringifiedValues&amp;quot;: [ &amp;quot;0Robert Miller&amp;quot; ]&lt;br /&gt;
      }]&lt;br /&gt;
    }]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;PublishMode&amp;quot;: &amp;quot;Public&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||Deletes the Model permanently. The model doesn&#039;t need to be in the recycle bin to be able to delete it permanently.&lt;br /&gt;
|-&lt;br /&gt;
||Modify (Model)&lt;br /&gt;
||Dictionary&lt;br /&gt;
||&lt;br /&gt;
Modifies model properties. The parameter is a dictionary containing the properties to be changed. Following properties can be changed: &#039;&#039;Name&#039;&#039;, &#039;&#039;Description&#039;&#039;, &#039;&#039;ProjectId&#039;&#039;, and &#039;&#039;Configuration&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The function returns the updated model object. Requires the &#039;&#039;GenericWrite&#039;&#039; permission for the project and the global &#039;&#039;CreateModel&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1)&lt;br /&gt;
	.Modify(#{&lt;br /&gt;
		&amp;quot;Name&amp;quot;: &amp;quot;My model&amp;quot;,&lt;br /&gt;
		&amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
		&amp;quot;ProjectId&amp;quot;: 2,&lt;br /&gt;
		&amp;quot;Configuration&amp;quot;: #{&lt;br /&gt;
			&amp;quot;DataSource&amp;quot;: #{&lt;br /&gt;
				&amp;quot;Cases&amp;quot;: #{&lt;br /&gt;
					&amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;DataTableName&amp;quot;: &amp;quot;My cases datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
						&amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;Events&amp;quot;: #{&lt;br /&gt;
					&amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;DataTableName&amp;quot;: &amp;quot;My events datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
						&amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;,&lt;br /&gt;
						&amp;quot;EventType&amp;quot;: &amp;quot;Event Type&amp;quot;,&lt;br /&gt;
						&amp;quot;Timestamp&amp;quot;: &amp;quot;Start Time&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ResetModelCache&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Synchronously clears all cached model data. For a Snowflake model, deletes all cache tables related to the model from Snowflake. For an in-memory model, drops the model from the memory and also drops all other model related caches from the memory. &lt;br /&gt;
|-&lt;br /&gt;
||ResetPreprocessings&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Removes all cached items related to the Model, e.g. preprocessings and calculation results. In practice, the Model is reset to a state where it was right after the model was loaded into memory.&lt;br /&gt;
|-&lt;br /&gt;
||Restore&lt;br /&gt;
||(none)&lt;br /&gt;
||Restores the Model from the recycle bin back to the original location.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;ToSqlDataFrame&amp;quot;&amp;gt;ToSqlDataFrame&amp;lt;/span&amp;gt;&lt;br /&gt;
||In-memory dataframe&lt;br /&gt;
||Converts an in-memory dataframe to an SQL dataframe. In practice, an SQL query is created from the in-memory dataframe and the query is executed in the datasource so that the data is available in the datasource for further SQL operations. This function is intended only to small amounts of data which is less than 16384 rows.&lt;br /&gt;
&lt;br /&gt;
Example: Select matching cases from events data using in-memory dataframe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let model = ModelById(1);&lt;br /&gt;
let dfEvents = model.EventsDatatable.SqlDataFrame;&lt;br /&gt;
let inMemoryDf = ToDataFrame(&lt;br /&gt;
  [[&amp;quot;1&amp;quot;], [&amp;quot;2&amp;quot;], [&amp;quot;3&amp;quot;]],&lt;br /&gt;
  [#{&amp;quot;Name&amp;quot;: &amp;quot;id&amp;quot;, &amp;quot;DataType&amp;quot;: &amp;quot;String&amp;quot;}]&lt;br /&gt;
);&lt;br /&gt;
model.ToSqlDataFrame(inMemoryDf)&lt;br /&gt;
  .Join(dfEvents, [&amp;quot;id&amp;quot;: &amp;quot;CaseId&amp;quot;])&lt;br /&gt;
  .SelectDistinct([&amp;quot;CaseId&amp;quot;])&lt;br /&gt;
  .Collect();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;TriggerNotifications&amp;quot;&amp;gt;TriggerNotifications&amp;lt;/span&amp;gt; (Boolean)&lt;br /&gt;
||Notification names (String*)&lt;br /&gt;
||Triggers the given notifications for the Model. Notifications are given by their names. Triggering means that the configured rules are run and notification emails are sent as defined by the rules. If the notification names parameter is not provided, all notifications in the Model are triggered.&lt;br /&gt;
&lt;br /&gt;
The function return &#039;&#039;true&#039;&#039; if any notification were triggered, otherwise &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).TriggerNotifications([&amp;quot;Notification 1&amp;quot;, &amp;quot;Notification 2&amp;quot;]);&lt;br /&gt;
Triggers notifications Notification 1 and Notification 2 in model id 123.&lt;br /&gt;
&lt;br /&gt;
ModelById(123).TriggerNotifications();&lt;br /&gt;
Triggers all notifications in model id 123.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CheckModelValidity&amp;quot;&amp;gt;CheckModelValidity&amp;lt;/span&amp;gt; (Object array)&lt;br /&gt;
||CheckData field in dictionary&lt;br /&gt;
||Checks the model validity and returns found issues. The returned data is an array of objects where each object represents one validity error and contains the following properties:&lt;br /&gt;
* &#039;&#039;&#039;IssueType&#039;&#039;&#039; (String): Specifies the issue type.&lt;br /&gt;
* &#039;&#039;&#039;ContextType&#039;&#039;&#039; (String): Context in which the issue was found, and it can be &#039;&#039;&#039;EventDataSource&#039;&#039;&#039;, &#039;&#039;&#039;CaseDataSource&#039;&#039;&#039;, &#039;&#039;&#039;OcelDataSource&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Details&#039;&#039;&#039; (Dictionary): Additional details which depend on the type of the issue.&lt;br /&gt;
&lt;br /&gt;
There are two types of checks available (based on whether the &#039;&#039;&#039;CheckData&#039;&#039;&#039; parameter is defined):&lt;br /&gt;
* &#039;&#039;Lightweight check&#039;&#039;: The check is based on only the configuration data stored in QPR ProcessAnalyzer. This check is very quick and does not require running queries in datasource (e.g., in Snowflake).&lt;br /&gt;
* &#039;&#039;Full check&#039;&#039;: The check is comprehensive and it&#039;s able to detect any validity issues the model may have. The full check requires running queries to the actual data which makes the check slower, and in case of Snowflake, it uses the Snowflake warehouse to run the queries.&lt;br /&gt;
&lt;br /&gt;
The lightweight check is performed automatically by the [[QPR_ProcessAnalyzer_Project_Workspace|Workspace]], so if there are any validity issues that the lightweight check can detect, the Workspace notifies about them immediately. If there are any problems with the model calculation results, it might be a good idea to run the full validity check to confirm whether the problems are due to the model being invalid.&lt;br /&gt;
&lt;br /&gt;
Example: Lightweight check:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(ModelById(1).CheckModelValidity())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Full check:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(ModelById(1).CheckModelValidity(#{ &amp;quot;CheckData&amp;quot;: true }))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CortexAgentsQuery&lt;br /&gt;
||&lt;br /&gt;
||Creates a Snowflake Cortex semantic model (see the &#039;&#039;GetSemanticModel&#039;&#039; function) for the process mining model and makes a natural language query on it using Snowflake Cortex Agents. More information: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents. &lt;br /&gt;
&lt;br /&gt;
There are the following parameters:&lt;br /&gt;
# &#039;&#039;&#039;Parameters&#039;&#039;&#039;: Dictionary parameters given to the Cortex Agents REST API query (https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-rest-api). There is a special handling for the following parameters:&lt;br /&gt;
#* &#039;&#039;&#039;model&#039;&#039;&#039;: Defines the name of the LLM to use for the operation. If not defined, the [[PA_Configuration_database_table#:~:text=DefaultCortexAgentsModelName|DefaultCortexAgentsModelName]] system setting applies.&lt;br /&gt;
#* &#039;&#039;&#039;_tools&#039;&#039;&#039;: Additional tool_spec of type &amp;quot;cortex_analyst_text_to_sql&amp;quot; will be added to this value with a reference to the generated semantic model.&lt;br /&gt;
#* &#039;&#039;&#039;_tool_resources&#039;&#039;&#039;: Generated semantic model is added as an additional resource.&lt;br /&gt;
# &#039;&#039;&#039;Filter configuration&#039;&#039;&#039;: Can be a string containing filter JSON or a dictionary containing the filter configuration. The semantic model is created for the filtered eventlog. If not defined, the entire model eventlog will be used.&lt;br /&gt;
# &#039;&#039;&#039;Event column role nappings&#039;&#039;&#039;: Mappings to apply for event columns. If not defined, default column mappings are used.&lt;br /&gt;
# &#039;&#039;&#039;Case column role mappings&#039;&#039;&#039;: Mappings to apply for case columns. If not defined, default column mappings are used.&lt;br /&gt;
&lt;br /&gt;
The function returns a dictionary with the following keys:&lt;br /&gt;
# &#039;&#039;&#039;Response&#039;&#039;&#039;: Actual response as a dictionary returned by the Cortex Agents.&lt;br /&gt;
# &#039;&#039;&#039;Response items&#039;&#039;&#039;: Contains processed response consisting of an array of objects having the following properties:&lt;br /&gt;
#* &#039;&#039;&#039;Text&#039;&#039;&#039;: Textual response.&lt;br /&gt;
#* &#039;&#039;&#039;Sql&#039;&#039;&#039;: Response SQL query string. Not mandatory.&lt;br /&gt;
#* &#039;&#039;&#039;SqlDataFrame&#039;&#039;&#039;: SqlDataFrame created for the SQL query in the Sql property. Only present if Sql is present.&lt;br /&gt;
|-&lt;br /&gt;
||GetSemanticModel&lt;br /&gt;
||&lt;br /&gt;
||Creates a Snowflake Cortex Analyst semantic model for the process mining model and returns it as a dictionary. More information: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst/semantic-model-spec.&lt;br /&gt;
&lt;br /&gt;
There are the following parameters:&lt;br /&gt;
# &#039;&#039;&#039;Filter configuration&#039;&#039;&#039;: Can be a string containing filter JSON or a dictionary containing the filter. The semantic model is created for the filtered eventlog. If not defined, the entire model eventlog will be used.&lt;br /&gt;
# &#039;&#039;&#039;Event column role mappings&#039;&#039;&#039;: Mappings to apply for event columns. If not defined, default column mappings are used.&lt;br /&gt;
# &#039;&#039;&#039;Case column role mappings&#039;&#039;&#039;: Mappings to apply for case columns. If not defined, default column mappings are used.&lt;br /&gt;
&lt;br /&gt;
Examples: Returns a semantic model without any filtering applied.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).GetSemanticModel();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get Model by model id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ModelById&lt;br /&gt;
||&lt;br /&gt;
* Model id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Model|Model]] object corresponding to the provided model id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Object-centric model==&lt;br /&gt;
Object-centric models additionally have the following properties and functions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Object-Centric model properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||IsOcelModel (boolean)&lt;br /&gt;
||Returns &#039;&#039;true&#039;&#039; when the model is an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEvents (Datatable)&lt;br /&gt;
||Datatable containing event data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if event datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventToObject (Datatable)&lt;br /&gt;
||Datatable containing event-to-object relations data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if event-to-object relation datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventTypes (Dictionary)&lt;br /&gt;
||Returns a dictionary containing event type names as keys and the datatables holding event data for that event type in this OCEL model as value. An empty array is returned if event types datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable for &amp;quot;Create order&amp;quot; events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).OcelEventTypes.Get(&amp;quot;Create order&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjects (Datatable)&lt;br /&gt;
||Datatable containing objects data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if object datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectToObject (Datatable)&lt;br /&gt;
||Datatable containing object-to-object relations data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if object-to-object relation datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectTypes (Dictionary)&lt;br /&gt;
||Returns a dictionary containing object type names as keys and the datatables holding data for that object type in this OCEL model as value. An empty array is returned if object types have not been configured for this model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Object-centric model functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventType&lt;br /&gt;
||Event type name (String)&lt;br /&gt;
||&lt;br /&gt;
Datatable containing event type attributes of given event type in this OCEL model. Value &#039;&#039;null&#039;&#039; is returned if a datatable is not configured for this model for given event type. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable for &amp;quot;Create order&amp;quot; events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).OcelEventType(&amp;quot;Create order&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectType&lt;br /&gt;
||Object type name (String)&lt;br /&gt;
||Datatable containing object type attributes of given object type in this OCEL model. Value &#039;&#039;null&#039;&#039; is returned if a datatable is not configured for this model for given object type. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectTypeConfiguration&lt;br /&gt;
||Object type name (String)&lt;br /&gt;
||Returns a matching configuration object with the following properties:&amp;lt;br&amp;gt;&lt;br /&gt;
# Datatable: name of the datatable&lt;br /&gt;
# Unit: unit label for object type items&lt;br /&gt;
&#039;&#039;Null&#039;&#039; is returned if the given object type is not found in the model configuration.  &lt;br /&gt;
If the object type name is not specified or &#039;&#039;null&#039;&#039;, the function returns a dictionary containing configurations for all defined object types.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Project properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the Project.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was created.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Project settings as Dictionary object. See example in &#039;&#039;ConfigurationJson&#039;&#039; property.&lt;br /&gt;
|-&lt;br /&gt;
||ConfigurationJson (String)&lt;br /&gt;
||Project settings as json string.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;DefaultLocationInDataSource&amp;quot;: {&lt;br /&gt;
    &amp;quot;Database&amp;quot;: &amp;quot;MyDatabase&amp;quot;,&lt;br /&gt;
    &amp;quot;Schema&amp;quot;: &amp;quot;MySchema&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;ConnectionStringKeys&amp;quot;: {&lt;br /&gt;
    &amp;quot;Snowflake&amp;quot;: &amp;quot;MyKey1&amp;quot;,&lt;br /&gt;
    &amp;quot;SqlServer&amp;quot;: &amp;quot;MyKey2&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Dashboards (Dashboard*)&lt;br /&gt;
||Returns all [[Dashboard_in_Expression_Language|dashboards]] in the project.&lt;br /&gt;
|-&lt;br /&gt;
||Datatables (Datatable*)&lt;br /&gt;
||Returns all Datatables in the project.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was deleted (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Project description. The project description may contain line breaks.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedBy (User)&lt;br /&gt;
||User who deleted the Project (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the Project.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last modified the Project.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was last modified (refers to the project name, description and parent, not the contents of the project).&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Name of the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Models (Model*)&lt;br /&gt;
||Models that are in the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Parent (Project)&lt;br /&gt;
||Parent project, i.e. a Project where the Project is located in the hierarchy of Projects. Returns &#039;&#039;null&#039;&#039; for root level Projects. Throws an error if user doesn&#039;t have access to the parent project.&lt;br /&gt;
|-&lt;br /&gt;
||ParentProjectId (Integer)&lt;br /&gt;
||Parent project id. Returns &#039;&#039;null&#039;&#039; for root level Projects. The parent project id is returned even if user doesn&#039;t have access to the parent project.&lt;br /&gt;
|-&lt;br /&gt;
||Scripts (Script*)&lt;br /&gt;
||Scripts that are in the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Secrets (Dictionary*)&lt;br /&gt;
||Returns array of all [[Storing_Secrets_for_Scripts|secrets]] in the project as Dictionary with following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the secret.&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Type of the secret which is one of the following: &amp;quot;odbc&amp;quot;, &amp;quot;sap&amp;quot;, &amp;quot;salesforce&amp;quot;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Project functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreateDashboard (Dashboard)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a dashboard to the project. &#039;&#039;EditDashboards&#039;&#039; permission to the project is required. The parameter is dictionary with following supported dashboard properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Identifier&#039;&#039;&#039; (String): Identifier of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Content&#039;&#039;&#039; (Dictionary): Content of the dashboard.&lt;br /&gt;
&lt;br /&gt;
Example: Create empty dashboard.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .CreateDashboard(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
    &amp;quot;Identifier&amp;quot;: &amp;quot;MyDashboard&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create dashboard with a chart.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .CreateDashboard(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
    &amp;quot;Content&amp;quot;: #{&lt;br /&gt;
      &amp;quot;version&amp;quot;: 4,&lt;br /&gt;
      &amp;quot;typeName&amp;quot;: &amp;quot;View&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
      &amp;quot;subElements&amp;quot;: [&lt;br /&gt;
        #{&lt;br /&gt;
          &amp;quot;position&amp;quot;: #{&lt;br /&gt;
            &amp;quot;x&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;y&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;width&amp;quot;: 0.5,&lt;br /&gt;
            &amp;quot;height&amp;quot;: 0.5,&lt;br /&gt;
            &amp;quot;zOrder&amp;quot;: 0&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;element&amp;quot;: #{&lt;br /&gt;
            &amp;quot;typeName&amp;quot;: &amp;quot;Chart&amp;quot;,&lt;br /&gt;
            &amp;quot;configuration&amp;quot;: #{&lt;br /&gt;
              &amp;quot;root&amp;quot;: #{&lt;br /&gt;
                &amp;quot;expressionType&amp;quot;: &amp;quot;Cases&amp;quot;,&lt;br /&gt;
                &amp;quot;expressionParameters&amp;quot;: #{}&lt;br /&gt;
              },&lt;br /&gt;
              &amp;quot;measures&amp;quot;: [#{&lt;br /&gt;
                &amp;quot;expressionType&amp;quot;: &amp;quot;Count&amp;quot;,&lt;br /&gt;
                &amp;quot;expressionParameters&amp;quot;: #{}&lt;br /&gt;
              }]&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateDatatable&amp;quot;&amp;gt;CreateDatatable&amp;lt;/span&amp;gt; (Datatable)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Creates datatable to the project. After creation, there are no columns or rows in the datatable. The function returns the created datatable entity. Following properties can be set for the datatable:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the datatable. This parameter is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Description for the datatable. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;NameInDataSource&#039;&#039;&#039; (string): Table name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039; (string): Schema name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039; (string): Database name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Defines where the data for the datatable is located. Available values are &#039;&#039;&#039;Snowflake&#039;&#039;&#039;, &#039;&#039;&#039;SqlServer&#039;&#039;&#039;, and &#039;&#039;&#039;Local&#039;&#039;&#039;.  This parameter is optional and default value is defined by the [[PA_Configuration_database_table#General_Settings|DefaultDataSource]] setting.&lt;br /&gt;
* &#039;&#039;&#039;Connection&#039;&#039;&#039;: Connection object for the datatable. This parameter is optional.&lt;br /&gt;
&lt;br /&gt;
Example: Create a new datatable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create Snowflake datatable linked to a custom table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
  &amp;quot;NameInDataSource&amp;quot;: &amp;quot;MyTable&amp;quot;,&lt;br /&gt;
  &amp;quot;SchemaNameInDataSource&amp;quot;: &amp;quot;MySchema&amp;quot;,&lt;br /&gt;
  &amp;quot;DatabaseNameInDataSource&amp;quot;: &amp;quot;MyDatabase&amp;quot;,&lt;br /&gt;
  &amp;quot;Type&amp;quot;: &amp;quot;Snowflake&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create Snowflake datatable where connection string is stored as a [[Storing_Secrets_for_Scripts|secret]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;,&lt;br /&gt;
  &amp;quot;Type&amp;quot;: &amp;quot;Snowflake&amp;quot;,&lt;br /&gt;
  &amp;quot;Connection&amp;quot;: ProjectById(1).CreateSnowflakeConnection(#{ &amp;quot;OdbcConnectionStringKey&amp;quot;: &amp;quot;MyKey&amp;quot; })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateMeaConnection&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Creates an object representing connection to QPR MEA (QPR Suite) Web Service. The function parameter is a dictionary containing the property &#039;&#039;&#039;ConnectionStringKey&#039;&#039;&#039; which defines the MEA connection string secret name in the same project. When the connection object has been created, MEA Web Service [[QPR_MEA_Integration|queries and other operations]] can be executed using it.&lt;br /&gt;
&lt;br /&gt;
Example: create connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let connection = ProjectByName(&amp;quot;MyProject&amp;quot;).CreateMeaConnection( #{&amp;quot;ConnectionStringKey&amp;quot;: &amp;quot;MyMeaConnection&amp;quot;} );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: use connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let results = connection.QueryObjects(&amp;quot;[PG.785401983.683494101]&amp;quot;, &amp;quot;name, typename&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateModel (Model)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Creates a model to a project. Requires &#039;&#039;GenericWrite&#039;&#039; permission for the Project and global &#039;&#039;CreateModel&#039;&#039; permission. If a model with that name already exists, an exception is thrown.&lt;br /&gt;
&lt;br /&gt;
Parameters dictionary has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the model. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Description of the model. This property is optional.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039;: Configuration dictionary for the model. This property is technically optional, but a working model requires at least datasource settings to be defined.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateModel(#{    &lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My model&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
  &amp;quot;Configuration&amp;quot;: #{&lt;br /&gt;
    &amp;quot;DataSource&amp;quot;: #{&lt;br /&gt;
      &amp;quot;Cases&amp;quot;: #{&lt;br /&gt;
        &amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;DataTableName&amp;quot;: &amp;quot;My cases datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
          &amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;Events&amp;quot;: #{&lt;br /&gt;
        &amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;DataTableName&amp;quot;: &amp;quot;My events datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
           &amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;,&lt;br /&gt;
           &amp;quot;EventType&amp;quot;: &amp;quot;Event Type&amp;quot;,&lt;br /&gt;
           &amp;quot;Timestamp&amp;quot;: &amp;quot;Start Time&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateProject&amp;quot;&amp;gt;CreateProject&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Create a project as a sub-project of the context project. Returns the created project. Requires the &#039;&#039;ManageProject&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Parameters dictionary has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the project. This property is required.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Description of the project.&lt;br /&gt;
* &#039;&#039;&#039;ParentProjectId&#039;&#039;&#039; (integer): Id of the parent project where the new project is created. This parameter is usually not needed because the parent project is the context project. The CreateProject function is also available in the generic context where the &#039;&#039;ParentProjectId&#039;&#039; parameter is needed to create sub-projects.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039; (string): Snowflake database the project is linked to. Data for the datatables in this project will be located in this database.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039; (string): Snowflake schema the project is linked to. Data for the datatables in this project will be located in this schema. If the schema is defined, also the &#039;&#039;DatabaseNameInDataSource&#039;&#039; needs to be defined.&lt;br /&gt;
* &#039;&#039;&#039;SnowflakeConnectionStringKey&#039;&#039;&#039; (string): Snowflake connection string key to be used for the datatables in this project. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;, &lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;, &lt;br /&gt;
  &amp;quot;DatabaseNameInDataSource&amp;quot;: &amp;quot;My database&amp;quot;, &lt;br /&gt;
  &amp;quot;SchemaNameInDataSource&amp;quot;: &amp;quot;My schema&amp;quot; &lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateScript (Script)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a new script to the project. The parameter is a dictionary containing the following script properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the script. This is a mandatory parameter. Note that it&#039;s not possible to create multiple scripts with the same name in the same project.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Optional description text of the script.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039; (String): Language of the script. Options: &#039;&#039;Expression&#039;&#039; (default), or &#039;&#039;SQL&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039; (String): Script code.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039; (Dictionary): Script json configuration.&lt;br /&gt;
&lt;br /&gt;
The function returns the created script object. Using the function requires &#039;&#039;ManageScripts&#039;&#039; permission for the project, and additionally &#039;&#039;RunScripts&#039;&#039; for SQL scripts.&lt;br /&gt;
&lt;br /&gt;
Example: Create an expression script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateScript(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My expression script&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;WriteLog(\&amp;quot;Hello world!\&amp;quot;);&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create an SQL script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateScript(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My SQL script&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;This is an example SQL script...&amp;quot;,&lt;br /&gt;
  &amp;quot;Language&amp;quot;: &amp;quot;SQL&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;SELECT * FROM table;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DatatableByName (Datatable)&lt;br /&gt;
||Datatable name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Datatable by its name located in the project. Returns null, if Datatable with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).DatatableByName(&amp;quot;MyDatatable1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable by name, and create it if it doesn&#039;t exist:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let project = ProjectById(123);&lt;br /&gt;
let datatableName = &amp;quot;MyDatatable1&amp;quot;;&lt;br /&gt;
let datatable = project.DatatableByName(datatableName);&lt;br /&gt;
if (datatable == null) {&lt;br /&gt;
  datatable = project.CreateDatatable(datatableName);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||Deletes the Project permanently. Note that the Project doesn&#039;t need to be in the recycle bin to be able to delete it permanently.&lt;br /&gt;
|-&lt;br /&gt;
||Export (String)&lt;br /&gt;
||(none)&lt;br /&gt;
||Exports the project and its content to a json string. The json format is described in [[Projects Export File Format]].&lt;br /&gt;
&lt;br /&gt;
Example: Export project id 1 to json data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).Export();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Import&lt;br /&gt;
||JSON string&lt;br /&gt;
||Creates one or several projects from a json string. The project(s) are created as child projects of the context project. The json format is described in [[Projects Export File Format]]. The function returns the created project objects. In case the project names already exist, the import operation automatically adjusts the names to be unique.&lt;br /&gt;
&lt;br /&gt;
Example: Create project from json data (as child of project id 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let jsonData = `{ &amp;quot;Projects&amp;quot;: [ { &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot; } ] }`;&lt;br /&gt;
let result = ProjectById(1).Import(jsonData);&lt;br /&gt;
let createdProjectId = result[&amp;quot;Projects&amp;quot;][0].Id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Restore&lt;br /&gt;
||(none)&lt;br /&gt;
||Restores the Project from the recycle bin back to the original location.&lt;br /&gt;
|-&lt;br /&gt;
||ModelByName (Model)&lt;br /&gt;
||Model name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Model by its name located in the project. Returns null, if Model with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).ModelByName(&amp;quot;My Model 1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;ModifyProject&amp;quot;&amp;gt;Modify&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||Dictionary of settings to change&lt;br /&gt;
||&lt;br /&gt;
Change project settings. Following settings are supported:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the project.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description text of the project.&lt;br /&gt;
* &#039;&#039;&#039;ParentProjectId&#039;&#039;&#039; (Integer): Parent project id. Changing this effectively moves the project into different parent project.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039;: Name of the Snowflake database where the project&#039;s datatables are located. The database needs to exist in the same Snowflake account configured in the Snowflake connection string. When defining this setting, define also the &#039;&#039;SchemaNameInDataSource&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039;: Name of the Snowflake schema where the project&#039;s datatables are located. The schema needs to exist in the same Snowflake account configured in the Snowflake connection string. When defining this setting, define also the &#039;&#039;DatabaseNameInDataSource&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;SnowflakeConnectionStringKey&#039;&#039;&#039; (String): Snowflake connection string key for the project. Snowflake datatables in the project will use connection string behind this key (unless specified by the datatatable).&lt;br /&gt;
* &#039;&#039;&#039;SqlServerConnectionStringKey&#039;&#039;&#039; (String): SQL Server connection string key. SQL Server datatables in the project will use connection string behind this key (unless specified by the datatatable).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ManageProject&#039;&#039; permission is needed to change project properties.&lt;br /&gt;
&lt;br /&gt;
Example: Change project name and move project into other parent project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .Modify(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Project 1&amp;quot;&lt;br /&gt;
    &amp;quot;ParentProjectId&amp;quot;: 2&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set Snowflake connection string key for the project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .Modify(#{&lt;br /&gt;
    &amp;quot;SnowflakeConnectionStringKey&amp;quot;: &amp;quot;MyKey1&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ScriptByName (Script)&lt;br /&gt;
||Script name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Script by its name located in the project. Returns null, if Script with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).ScriptByName(&amp;quot;MyScript1&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;SetSecret&amp;quot;&amp;gt;SetSecret&amp;lt;/span&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
# Secret type (string)&lt;br /&gt;
# Secret name (string)&lt;br /&gt;
# Secret value (string)&lt;br /&gt;
||Sets or adds a [[Storing_Secrets_for_Scripts|secret]] for the project. Setting the secret value to &#039;&#039;null&#039;&#039; removes the secret. There can be several secrets with the same name in the same project if the type of the secret is different. Setting secrets requires the project specific &#039;&#039;ManageProject&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Secret type which is one of the following:&lt;br /&gt;
#* &amp;quot;externaldatatableconnection&amp;quot;: Snowflake ODBC connection string for datatables.&lt;br /&gt;
#* &amp;quot;odbc&amp;quot;: ODBC connection string (e.g., to extract data in scripts, or load an in-memory model).&lt;br /&gt;
#* &amp;quot;oledb&amp;quot;: OleDB connection string (e.g., to extract data in scripts, or load an in-memory model).&lt;br /&gt;
#* &amp;quot;sap&amp;quot;: SAP password.&lt;br /&gt;
#* &amp;quot;salesforce&amp;quot;: Salesforce password.&lt;br /&gt;
#* &amp;quot;sql&amp;quot;: SQL Server connection string.&lt;br /&gt;
#* &amp;quot;qprmea&amp;quot;: QPR MEA connection string.&lt;br /&gt;
# &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Secret name, used to refer to the secret in the commands.&lt;br /&gt;
# &#039;&#039;&#039;Value&#039;&#039;&#039; (string): Secret value which contains the confidential information.&lt;br /&gt;
&lt;br /&gt;
Example: Set SAP password:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).SetSecret(&amp;quot;sap&amp;quot;, &amp;quot;MySapPassword&amp;quot;, &amp;quot;I l0ve 5AP!&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Remove SAP password:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).SetSecret(&amp;quot;sap&amp;quot;, &amp;quot;MySapPassword&amp;quot;, null);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Functions to get project:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ProjectById&lt;br /&gt;
||Project id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns project object corresponding to the provided project id.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectByName&lt;br /&gt;
||Project name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns project object by given project name. If there is no such project or user doesn&#039;t have access to it, &#039;&#039;null&#039;&#039; value is returned. If there are multiple projects with the same name, one of them is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let project = ProjectByName(&amp;quot;My Project&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Functions to create project:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateProject&amp;quot;&amp;gt;CreateProject&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Create a project. This is a similar function as the [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#CreateProject|CreateProject function]] in the project context. This function in the generic context is needed to create root-level projects (which don&#039;t have parent project).&lt;br /&gt;
&lt;br /&gt;
Example: create a root project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: create a sub-project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;&lt;br /&gt;
  &amp;quot;ParentProjectId&amp;quot;: 1&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;Import&amp;quot;&amp;gt;Import&amp;lt;/span&amp;gt; (Project*)&lt;br /&gt;
||JSON string&lt;br /&gt;
||Creates one or several projects from a json string. The project(s) are created as the root level projects. The json format is described in [[Projects Export File Format]]. The function returns the created project objects. In case the project names already exist, the import operation automatically adjusts the names to be unique.&lt;br /&gt;
&lt;br /&gt;
Example: Create a root level project from json data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let jsonData = `{ &amp;quot;Projects&amp;quot;: [ { &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot; } ] }`;&lt;br /&gt;
let result = Import(jsonData);&lt;br /&gt;
let createdProjectId = result[&amp;quot;Projects&amp;quot;][0].Id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Script ==&lt;br /&gt;
Scripts are entities that contain executable code, that can be run. Usually scripts contains ETL routines but also other kind of tasks are possible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Script properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Code (String)&lt;br /&gt;
||Script code.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Script&#039;s configuration.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the Script.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the Script was created.&lt;br /&gt;
|-&lt;br /&gt;
||CurrentRunStart (DateTime)&lt;br /&gt;
||Timestamp of the current run start. Null if the script is currently not running.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Description of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||Language (String)&lt;br /&gt;
||Either of the following scripting language: &#039;&#039;&#039;Expression&#039;&#039;&#039; or &#039;&#039;&#039;SQL&#039;&#039;&#039;. When language is Expression, the script is run as an expression script, and when language is SQL, the script is run as an SQL script (using the sandbox database).&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last modified the Script.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the Script was last modified.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunEnd (DateTime)&lt;br /&gt;
||Timestamp of the last completed script run end (either successful completion or failure). Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunResult (String)&lt;br /&gt;
||Result of the last run. Options are:&lt;br /&gt;
* &#039;&#039;&#039;Completed&#039;&#039;&#039;: The last run was completed successfully.&lt;br /&gt;
* &#039;&#039;&#039;Failed&#039;&#039;&#039;: An error occurred during the last run, so likely the script did not complete as intended.&lt;br /&gt;
* &#039;&#039;&#039;Aborted&#039;&#039;&#039;: Script run was manually stopped prematurely by a user, so the script did not proceeded in the end.&lt;br /&gt;
&lt;br /&gt;
Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunStart (DateTime)&lt;br /&gt;
||Timestamp of the last completed script run start time. Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
|McpPrimitiveType (String)&lt;br /&gt;
|Returns one of the following values depending on which type of MCP primitive the script supports:&lt;br /&gt;
&lt;br /&gt;
* Tool&lt;br /&gt;
* Prompt&lt;br /&gt;
* ResourceNull value means that the script does not support any MCP primitive type.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Name of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||OperationId (Integer)&lt;br /&gt;
||Id of the operation which runs the Script. Null if the script is currently not running.&lt;br /&gt;
|-&lt;br /&gt;
||Project (Project)&lt;br /&gt;
||Project where the Script is located. Null if the script is in the global context.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||Id of the project where the Script is located. Null if the script is in the global context.&lt;br /&gt;
|-&lt;br /&gt;
||Status (String)&lt;br /&gt;
||Current status of the script. Options are:&lt;br /&gt;
* &#039;&#039;&#039;Ready&#039;&#039;&#039;: Script is not running. In this status, the script can be started (changing the status to &#039;&#039;Running&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Running&#039;&#039;&#039;: Script is running. In this status, the script can be stopped (changing the status to &#039;&#039;Stopping&#039;&#039;). Calling stop just requests a script to stop, and the actual stopping occurs some time later.&lt;br /&gt;
* &#039;&#039;&#039;Stopping&#039;&#039;&#039;: Script has been requested to be stopped, but it&#039;s still running. In this status, neither start nor stop can be called for the script. When the script eventually stops, its status changes to &#039;&#039;Ready&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpTool (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP tool or not.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpPrompt (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP prompt or not.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpResource (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP resource or not.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Script functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Deletes the script permanently. To delete an expression script, &#039;&#039;&#039;ManageScripts&#039;&#039;&#039; permission for the project is needed, and to delete an SQL script, global &#039;&#039;&#039;RunScripts&#039;&#039;&#039; permission and &#039;&#039;&#039;ManageScripts&#039;&#039;&#039; permission for the project is needed.&lt;br /&gt;
|-&lt;br /&gt;
||Modify&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Modifies properties of a script. The parameter is a dictionary of properties to change:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the script.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description text of the script.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039; (String): Language of the script, either &#039;&#039;Expression&#039;&#039; or &#039;&#039;SQL&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039; (String): Script code.&lt;br /&gt;
* &#039;&#039;&#039;ProjectId&#039;&#039;&#039; (Integer): Id of the project where the script is located. Changing this property moves the script into a different project.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039; (Dictionary): Script json configuration.&lt;br /&gt;
&lt;br /&gt;
Requires &#039;&#039;ManageScripts&#039;&#039; permissions in the project. Additionally, requires &#039;&#039;RunScripts&#039;&#039; permission for SQL scripts.&lt;br /&gt;
&lt;br /&gt;
Example: Rename script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;Updated script&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Change multiple properties in the same call:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;Updated script&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;Updated description&amp;quot;,&lt;br /&gt;
  &amp;quot;Language&amp;quot;: &amp;quot;SQL&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;SELECT 1&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Move script to a different project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;ProjectId&amp;quot;: ProjectByName(&amp;quot;My project&amp;quot;).Id&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Run (Object)&lt;br /&gt;
||Dictionary of parameters&lt;br /&gt;
||&lt;br /&gt;
Runs the script using the provided parameters. The parameters are available in the script as variables (see the example). Any type of variables can be passed to the script. Note that if the script assumes certain variables, but that they are not passed to the script, the script run will throw an error. &lt;br /&gt;
&lt;br /&gt;
For SQL scripts, the passed parameters are available in the script as variables in format &#039;&#039;&#039;@_parameter_&amp;lt;ParameterName&amp;gt;&#039;&#039;&#039; where &amp;lt;ParameterName&amp;gt; is the name of the parameter, e.g. &#039;&#039;parameter_myParameter1&#039;&#039;. Only string type of parameters can be used, so any other type of data in parameter values is converted into strings.&lt;br /&gt;
&lt;br /&gt;
The return value of the script is returned by the Run function. Expression scripts return a value with the &#039;&#039;return&#039;&#039; statement or alternatively the result of the last line of the script is the return value. If the script does not return any value, the Run function returns &#039;&#039;_empty&#039;&#039;. For SQL scripts, the return value is the last dataset produced by the script (returned as a DataFrame) (SQL scripts might create several datasets using the &#039;&#039;--#ShowReport&#039;&#039; command or the &#039;&#039;Show&#039;&#039; parameter).&lt;br /&gt;
&lt;br /&gt;
When a script is called using the Run function, the called script status does not change, because it&#039;s the parent script that is &#039;&#039;Running&#039;&#039;. Also the called script log is not filled, but instead the logging goes to the calling script.&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to call a script using the Run function several times simultaneously.&lt;br /&gt;
&lt;br /&gt;
If there is an error when running the called script, the Run function throws the error to the calling script.&lt;br /&gt;
&lt;br /&gt;
Scripts are run in the script entity context, so for example the following properties are available:&lt;br /&gt;
* Id: Script id&lt;br /&gt;
* Name: Script name&lt;br /&gt;
* Project.Id: Project id where the script is located&lt;br /&gt;
* Project.Name: Name of the project where the script is located&lt;br /&gt;
&lt;br /&gt;
Example: Following script (id 123) raises a specified number to a specified power:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return Pow(numberToRaise, exponent);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script can be called as follows (returning 16):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runResult = ScriptById(123).Run(#{&lt;br /&gt;
  &amp;quot;numberToRaise&amp;quot;: 4,&lt;br /&gt;
  &amp;quot;exponent&amp;quot;: 2&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;Start&amp;quot;&amp;gt;Start&amp;lt;/span&amp;gt;&lt;br /&gt;
||Dictionary of parameters&lt;br /&gt;
||Starts the script. The function call doesn&#039;t wait for the script run to complete (i.e., asynchronous behavior) which is same as starting the script in the [[Managing_Scripts#Starting_Script|Workspace]].&lt;br /&gt;
&lt;br /&gt;
Parameters to the script can be provided as a dictionary of name-value pairs (which is not possible when script is started in the Workspace). Return value is the script run id (integer) if the script was started. If the script is already running, return value is &#039;&#039;null&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: Start script (without parameters) and store the script run id:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runId = ScriptById(1).Start();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Start script with passing parameters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Start(#{&lt;br /&gt;
  &amp;quot;variable1&amp;quot;: &amp;quot;val1&amp;quot;,&lt;br /&gt;
  &amp;quot;variable2&amp;quot;: 5&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Stop&lt;br /&gt;
||&lt;br /&gt;
||Stops the script. The operation doesn&#039;t wait for the stopping to complete (i.e., asynchronous behavior) which is same as stopping the script in the [[Managing_Scripts#Stopping_Script|Workspace]]. Depending on the operation that the script is performing, the stopping might take some time.&lt;br /&gt;
&lt;br /&gt;
Return value is the script run id (integer) if the script was running. If the script isn&#039;t running, the return value is &#039;&#039;null&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runId = ScriptById(1).Stop();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get a script by the script id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ScriptById&lt;br /&gt;
||&lt;br /&gt;
* Script id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns Script object corresponding to the given script id. If script with the given id doesn&#039;t exist or user doesn&#039;t have permissions to it, an error is given.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User/Group ==&lt;br /&gt;
User objects represents users and user groups. Note that some properties can only be used for users and some for groups.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;User/group properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||Returns the user who created the user.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Returns the date when the user was created.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultDashboard (String)&lt;br /&gt;
||Returns the configured [[User_Profile#Starting_dashboard|starting dashboard]] (&amp;quot;default dashboard&amp;quot;) identifier for a group (for users, the starting dashboard cannot be configured). The starting dashboard is automatically opened when a user logs in.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Description of the user.&lt;br /&gt;
|-&lt;br /&gt;
||EffectiveDefaultDashboard (String)&lt;br /&gt;
||Returns the [[User_Settings#Starting_dashboard|starting dashboard]] of a user. Value &#039;&#039;null&#039;&#039; means that the user doesn&#039;t have a starting dashboard. The starting dashboard comes from the user&#039;s groups. If multiple of user&#039;s groups have the starting dashboard defined, the user&#039;s starting dashboard will be taken from a group having alphabetically the first name.&lt;br /&gt;
|-&lt;br /&gt;
||Email (String)&lt;br /&gt;
||Email address of the user.&lt;br /&gt;
|-&lt;br /&gt;
||FullName (String)&lt;br /&gt;
||Full name of the user or group name.&lt;br /&gt;
|-&lt;br /&gt;
||GlobalPermissions (String*)&lt;br /&gt;
||Array of global [[Roles and Permissions#Global_and_Project_Roles|permissions]] of the user. Global permissions come from the global roles assigned to the user and groups that the user belongs to. Note that to get the effective permissions for certain objects, also project specific permissions need to be taken into account.&lt;br /&gt;
|-&lt;br /&gt;
||GroupMemberNames (String*)&lt;br /&gt;
||Array of names of members of a user group. This property is available for groups.&lt;br /&gt;
|-&lt;br /&gt;
||GroupMembers (User*)&lt;br /&gt;
||Array of members of a user group. This property is available for groups.&lt;br /&gt;
|-&lt;br /&gt;
||GroupNames (String*)&lt;br /&gt;
||Array of names of user groups the user belongs to. This property is available for users.&lt;br /&gt;
|-&lt;br /&gt;
||Groups (User*)&lt;br /&gt;
||Array of user groups the user belongs to. This property is available for users.&lt;br /&gt;
|-&lt;br /&gt;
||HasPassword (Boolean)&lt;br /&gt;
||Returns true if user has a password defined in QPR ProcessAnalyzer and thus user can authenticate using the password. If user doesn&#039;t have a password, the SAML authentication is the only way to log in. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property for other users.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the user, which is unique for every user.&lt;br /&gt;
|-&lt;br /&gt;
||IsActive (Boolean)&lt;br /&gt;
||Returns true only if the user is active (not disabled).&lt;br /&gt;
|-&lt;br /&gt;
||IsGroup (Boolean)&lt;br /&gt;
||Returns true if the user is a user group.&lt;br /&gt;
|-&lt;br /&gt;
||IsLocked (Boolean)&lt;br /&gt;
||Returns true if user account is currently [[User_Session_Management#Preventing_password_guessing_attacks|locked]]. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property.&lt;br /&gt;
|-&lt;br /&gt;
||LastLockedDate (DateTime)&lt;br /&gt;
||Returns date when user account was locked the last time. Returns &#039;&#039;null&#039;&#039; if the user account has never been locked. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property.&lt;br /&gt;
|-&lt;br /&gt;
||LastLoginDate (DateTime)&lt;br /&gt;
||Returns date when the user made last successful login. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property for other users.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||Returns the user who last modified this user.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Returns the date when the user was last modified.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Login name of the user or group.&lt;br /&gt;
|-&lt;br /&gt;
||Roles (Object**)&lt;br /&gt;
||&lt;br /&gt;
Returns all roles of the user (both global and project roles) as a nested array structure.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(Users.Where(name == &amp;quot;qpr&amp;quot;).Roles)&lt;br /&gt;
Returns (for example):&lt;br /&gt;
[&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:1&amp;quot;}, &amp;quot;Administrator&amp;quot;],&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:2&amp;quot;}, &amp;quot;Analyzer&amp;quot;],&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:3&amp;quot;}, &amp;quot;Viewer&amp;quot;],&lt;br /&gt;
  [null, &amp;quot;RunScripts&amp;quot;],&lt;br /&gt;
  [null, &amp;quot;Administrator&amp;quot;]&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;User/group functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||EffectivePermissionsFor (String Array)&lt;br /&gt;
||&lt;br /&gt;
* Project to get permissions&lt;br /&gt;
||&lt;br /&gt;
Returns effective (actual) permission of the user to the given project. Project is given as a [[#Project|project object]] (not as a project id). Effective permissions determine the actual permissions that the user has, i.e. a combination of all permissions assigned to the user and groups the user belong to, including both project specific and global roles.&lt;br /&gt;
&lt;br /&gt;
Permissions for the EffectivePermissionsFor function are as follows:&lt;br /&gt;
* All users can query their own permissions&lt;br /&gt;
* To get permissions for any user, the user needs to have [[Roles_and_Permissions|ManageUsers permission]].&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;inactive&#039;&#039; users don&#039;t have any effective permissions, so the EffectivePermissionsFor function does not return any permissions for those users.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1).EffectivePermissionsFor(ModelById(2).Project)&lt;br /&gt;
Returns (for example): [&amp;quot;EditDashboards&amp;quot;, &amp;quot;Filtering&amp;quot;, &amp;quot;GenericRead&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||GetAttribute&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Returns user attribute value by given attribute name and optionally by the model/project/dashboard context. Supported data types are String, Integer, Float, and DateTime. To store more complex data types, data can be converted into json and stored as string. If the attribute doesn&#039;t exist, null is returned.&lt;br /&gt;
&lt;br /&gt;
For example, if using dashboard as context, the attributes are effectively bound to each user and each dashboard separately. Thus, there can be several attributes with the same name as long as the dashboard is different.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Attribute name&#039;&#039;&#039; (String): Name of the attribute.&lt;br /&gt;
# &#039;&#039;&#039;Attribute context&#039;&#039;&#039; (Project/Model/Dashboard): Optional context object the attribute is linked to.&lt;br /&gt;
&lt;br /&gt;
Users have permissions to get attributes for themselves, and also (administrator) users with global &#039;&#039;ManageUsers&#039;&#039; permission can get attributes for all users. In addition, if using the context object, the &#039;&#039;GenericRead&#039;&#039; permission is required for the context object.&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for myself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CurrentUser&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for user John:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Users&lt;br /&gt;
  .Where(Name==&amp;quot;John&amp;quot;)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for user 1 related to dashboard id 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;, DashboardById(1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||SetAttribute&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Sets user attribute value for given attribute name and optionally for the model/project/dashboard context. Supported data types are String, Integer, Float, and DateTime. To store more complex data types, data can be converted into json and stored as string. If setting value &#039;&#039;null&#039;&#039;, the user attribute is removed. Required permissions are same as in the GetAttribute function.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Attribute name&#039;&#039;&#039; (String): Name of the attribute.&lt;br /&gt;
# &#039;&#039;&#039;Attribute value&#039;&#039;&#039; (String/Integer/Float/DateTime): Attribute value to be stored.&lt;br /&gt;
# &#039;&#039;&#039;Attribute context&#039;&#039;&#039; (Project/Model/Dashboard): Optional context object the attribute value is linked to.&lt;br /&gt;
&lt;br /&gt;
Example: Set user attribute MyDataValue for myself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CurrentUser&lt;br /&gt;
  .SetAttribute(&amp;quot;MyDataValue &amp;quot;, &amp;quot;value&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set value 123 as user attribute MyDataValue for user John:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Users&lt;br /&gt;
  .Where(Name==&amp;quot;John&amp;quot;)&lt;br /&gt;
  .SetAttribute(&amp;quot;MyDataValue&amp;quot;, 123);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set current time as user attribute MyDataValue for user 1 related to dashboard id 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;, Now, DashboardById(1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get User by user id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||UserById (User)&lt;br /&gt;
||&lt;br /&gt;
* User id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns User object that has the provided user id. Also groups can be queried with this function. Returns an access denied error if the user with given id does not exist or the current user does not have access to it.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Navigation_Menu&amp;diff=28531</id>
		<title>Navigation Menu</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Navigation_Menu&amp;diff=28531"/>
		<updated>2026-06-17T13:59:14Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The navigation menu can be opened by clicking the dashboard or view name in the header. The menu displays projects and dashboards in its left column. To ensure a focused view, only projects that contain dashboards, or have child projects containing dashboards, are listed. When you click on a project name, the menu displays the dashboards within that project. Clicking the project name again navigates you back to the main project list, allowing you to select a different project. To open a dashboard, simply click on its name. The right column of the navigation menu has the following functionalities available:&lt;br /&gt;
&lt;br /&gt;
== Ready-made dashboards ==&lt;br /&gt;
=== Starting Dashboard ===&lt;br /&gt;
If the user has a [[User_Profile#Starting_dashboard|starting dashboard]], this item is shown in the navigation menu. With this button, the starting dashboard is opened which is usually a custom main page or navigation page.&lt;br /&gt;
&lt;br /&gt;
=== Process Discovery ===&lt;br /&gt;
The Process Discovery is a starting point for an analysis to discover and visualize processes. The [[QPR ProcessAnalyzer Chart|Chart]] on the right side allows the creation of customized charts to answer specific business needs, with measures and dimensions the user has selected. The [[Process Flowchart|Process Flowchart]] or [[Object-Centric_Flowchart|Object-Centric Flowchart]] on the left shows the process drawn as a conventional process flowchart or object-centric flowchart.&lt;br /&gt;
&lt;br /&gt;
=== Conformance Checking ===&lt;br /&gt;
[[Conformance Analysis]] incorporates the [[Conformance Checking|Conformance Checking]] capability of QPR ProcessAnalyzer. There are two dashboards that belong to the conformance analysis: the nonconformance reasons and the possible root causes for the nonconformance.&lt;br /&gt;
&lt;br /&gt;
=== Clustering Analysis ===&lt;br /&gt;
[[Clustering Analysis]] analyzes through the process mining data, and divides cases into similar groups based on case attributes and occurred types of events. Use it to get a deep understanding of the analyzed process mining data and also to validate the data.&lt;br /&gt;
&lt;br /&gt;
=== Enhanced BPMN ===&lt;br /&gt;
The [[QPR_ProcessAnalyzer_BPMN_Editor|Enhanced BPMN]] dashboard is for designing BPMN diagrams and visualizing process mining KPI&#039;s in BPMN diagrams. Also filtering based on conformance and process flow in the BPMN diagram can be created.&lt;br /&gt;
&lt;br /&gt;
== System functionality ==&lt;br /&gt;
=== Workspace ===&lt;br /&gt;
[[QPR_ProcessAnalyzer_Project_Workspace|Project workspace]] is for managing projects, dashboards, datatables and scripts.&lt;br /&gt;
&lt;br /&gt;
=== Manage Users ===&lt;br /&gt;
[[Manage_Users_and_Groups|Manage Users dialog]] is for administrators to manage users, groups, roles and permissions in the system. It&#039;s also possible to view the effective permissions for audit purposes.&lt;br /&gt;
&lt;br /&gt;
=== System Reports ===&lt;br /&gt;
System reports dialog is available for administrators, showing system information, such as recent tasks, running tasks, task statistics, dashboard usage, and listings of different kind of objects in the system. The reports can be modified by changing settings, but the settings cannot be saved.&lt;br /&gt;
&lt;br /&gt;
=== Benchmark Performance ===&lt;br /&gt;
Benchmark Performance dialog tests how long it takes to run each preset (i.e. get the preset opened), and based on that creates a report of the performance of the system. The performance benchmark is done for the currently open model and filter, so before opening the Benchmark Performance dialog, change a suitable model and filter (usually benchmarking is done for &#039;&#039;All cases&#039;&#039;). The benchmark run is started by clicking the &#039;&#039;&#039;Start Run&#039;&#039;&#039; button. When the benchmark run starts, a table appears showing presets as rows and benchmarking measures as columns. You can monitor the progress of the run, because results are filled to the table as soon as they are available. &lt;br /&gt;
&lt;br /&gt;
You can choose which presets to run (by default all) and how many times each preset is run (by default three times). For example, you can choose not to run certain presets to make the benchmarking complete quicker, or if for some reason, certain presets give error, they can be excluded. Running each preset more times give more predictable result, but on the other hand, the run takes longer.&lt;br /&gt;
&lt;br /&gt;
When the benchmark run is completed, you can click the &#039;&#039;&#039;Export Results&#039;&#039;&#039; button to download a report (provided as a text file). The report contains the run results and also basic information about the system and the used model. The results show for each preset the average, median, minimum (fastest), maximum (slowest), standard deviation of the results, and a list of each individual run duration. In addition the footer shows sum of the measures for all run presets. You can stop the benchmarking run while in progress by clicking the &#039;&#039;&#039;Stop Run&#039;&#039;&#039; button and still export a report of already run presets. Note also that the table can be exported to Excel by right clicking it to open a context menu.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Load to the system by other users may affect the benchmark results, so to get the most accurate results, check from the [[QPR_ProcessAnalyzer_Logs#Task_Log|Task log]] that there are currently no other users in the system.&lt;br /&gt;
* Presets are run in a random order to reduce random variation in the results.&lt;br /&gt;
&lt;br /&gt;
=== Query Designer ===&lt;br /&gt;
Query Designer is for testing QPR ProcessAnalyzer KPI language queries that contain&lt;br /&gt;
* root expression to select objects to be analysed&lt;br /&gt;
* dimension expressions to slice the analyzed object into slices&lt;br /&gt;
* measure expressions to calculate KPI&#039;s and other measures from each of the slices&lt;br /&gt;
* data can also be sorted and number of rows limited&lt;br /&gt;
&lt;br /&gt;
The expressions are written in the left side using a JSON format. When the &#039;&#039;&#039;Run Query&#039;&#039;&#039; button is clicked, the defined query is run and results appear to a table in the right side. Details of the JSON format can be found in [[Web_API:_Expression/query|QPR ProcessAnalyzer Expression Analysis]].&lt;br /&gt;
&lt;br /&gt;
=== Expression Designer ===&lt;br /&gt;
Expression Designer is used to run expressions in a generic context. Write the expressions in the upper box and the results appear in the lower box. When clicking the &#039;&#039;&#039;Run All&#039;&#039;&#039; button, all expressions in the upper box are run. It&#039;s also possible to select parts of the expression and click the &#039;&#039;&#039;Run Selection&#039;&#039;&#039; button to only run the selected parts. If there are errors in the run, cursor is automatically moved to the point where the error occurred.&lt;br /&gt;
&lt;br /&gt;
=== [[User_Profile|User Profile]] ===&lt;br /&gt;
&lt;br /&gt;
=== About ===&lt;br /&gt;
The About dialog displays technical information about the QPR ProcessAnalyzer environment:&lt;br /&gt;
* Software build&lt;br /&gt;
* Build timestamp&lt;br /&gt;
* Database version&lt;br /&gt;
* Features enabled&lt;br /&gt;
* System default language&lt;br /&gt;
* System default date format&lt;br /&gt;
* System default first day of week&lt;br /&gt;
* System default clock format&lt;br /&gt;
* QPR ProcessAnalyzer memory usage&lt;br /&gt;
* Available / total physical memory&lt;br /&gt;
&lt;br /&gt;
=== Sign out ===&lt;br /&gt;
The user session can be signed out, which also clears all cached information in the browser side. When using a personal computer, signing out is normally not needed from the security point of view, but if there are other users in the same computer, it&#039;s important to sign out after using the system.&lt;br /&gt;
&lt;br /&gt;
When using QPR ProcessAnalyzer as Snowflake Native App, also the Snowflake session is logged out when pressing the &#039;&#039;Sign out&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category: QPR ProcessAnalyzer]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Navigation_Menu&amp;diff=28530</id>
		<title>Navigation Menu</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Navigation_Menu&amp;diff=28530"/>
		<updated>2026-06-17T13:57:03Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The navigation menu can be opened by clicking the dashboard or view name in the header. The menu displays projects and dashboards in its left column. To ensure a focused view, only projects that contain dashboards, or have child projects containing dashboards, are listed. When you click on a project name, the menu displays the dashboards within that project. Clicking the project name again navigates you back to the main project list, allowing you to select a different project. To open a dashboard, simply click on its name. The right column of the navigation menu has the following functionalities available:&lt;br /&gt;
&lt;br /&gt;
== Ready-made dashboards ==&lt;br /&gt;
=== Starting Dashboard ===&lt;br /&gt;
If the user has a [[User_Settings#Starting_dashboard|starting dashboard]], this item is shown in the navigation menu. With this button, the starting dashboard is opened which is usually a custom main page or navigation page.&lt;br /&gt;
&lt;br /&gt;
=== Process Discovery ===&lt;br /&gt;
The Process Discovery is a starting point for an analysis to discover and visualize processes. The [[QPR ProcessAnalyzer Chart|Chart]] on the right side allows the creation of customized charts to answer specific business needs, with measures and dimensions the user has selected. The [[Process Flowchart|Process Flowchart]] or [[Object-Centric_Flowchart|Object-Centric Flowchart]] on the left shows the process drawn as a conventional process flowchart or object-centric flowchart.&lt;br /&gt;
&lt;br /&gt;
=== Conformance Checking ===&lt;br /&gt;
[[Conformance Analysis]] incorporates the [[Conformance Checking|Conformance Checking]] capability of QPR ProcessAnalyzer. There are two dashboards that belong to the conformance analysis: the nonconformance reasons and the possible root causes for the nonconformance.&lt;br /&gt;
&lt;br /&gt;
=== Clustering Analysis ===&lt;br /&gt;
[[Clustering Analysis]] analyzes through the process mining data, and divides cases into similar groups based on case attributes and occurred types of events. Use it to get a deep understanding of the analyzed process mining data and also to validate the data.&lt;br /&gt;
&lt;br /&gt;
=== Enhanced BPMN ===&lt;br /&gt;
The [[QPR_ProcessAnalyzer_BPMN_Editor|Enhanced BPMN]] dashboard is for designing BPMN diagrams and visualizing process mining KPI&#039;s in BPMN diagrams. Also filtering based on conformance and process flow in the BPMN diagram can be created.&lt;br /&gt;
&lt;br /&gt;
== System functionality ==&lt;br /&gt;
=== Workspace ===&lt;br /&gt;
[[QPR_ProcessAnalyzer_Project_Workspace|Project workspace]] is for managing projects, dashboards, datatables and scripts.&lt;br /&gt;
&lt;br /&gt;
=== Manage Users ===&lt;br /&gt;
[[Manage_Users_and_Groups|Manage Users dialog]] is for administrators to manage users, groups, roles and permissions in the system. It&#039;s also possible to view the effective permissions for audit purposes.&lt;br /&gt;
&lt;br /&gt;
=== System Reports ===&lt;br /&gt;
System reports dialog is available for administrators, showing system information, such as recent tasks, running tasks, task statistics, dashboard usage, and listings of different kind of objects in the system. The reports can be modified by changing settings, but the settings cannot be saved.&lt;br /&gt;
&lt;br /&gt;
=== Benchmark Performance ===&lt;br /&gt;
Benchmark Performance dialog tests how long it takes to run each preset (i.e. get the preset opened), and based on that creates a report of the performance of the system. The performance benchmark is done for the currently open model and filter, so before opening the Benchmark Performance dialog, change a suitable model and filter (usually benchmarking is done for &#039;&#039;All cases&#039;&#039;). The benchmark run is started by clicking the &#039;&#039;&#039;Start Run&#039;&#039;&#039; button. When the benchmark run starts, a table appears showing presets as rows and benchmarking measures as columns. You can monitor the progress of the run, because results are filled to the table as soon as they are available. &lt;br /&gt;
&lt;br /&gt;
You can choose which presets to run (by default all) and how many times each preset is run (by default three times). For example, you can choose not to run certain presets to make the benchmarking complete quicker, or if for some reason, certain presets give error, they can be excluded. Running each preset more times give more predictable result, but on the other hand, the run takes longer.&lt;br /&gt;
&lt;br /&gt;
When the benchmark run is completed, you can click the &#039;&#039;&#039;Export Results&#039;&#039;&#039; button to download a report (provided as a text file). The report contains the run results and also basic information about the system and the used model. The results show for each preset the average, median, minimum (fastest), maximum (slowest), standard deviation of the results, and a list of each individual run duration. In addition the footer shows sum of the measures for all run presets. You can stop the benchmarking run while in progress by clicking the &#039;&#039;&#039;Stop Run&#039;&#039;&#039; button and still export a report of already run presets. Note also that the table can be exported to Excel by right clicking it to open a context menu.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Load to the system by other users may affect the benchmark results, so to get the most accurate results, check from the [[QPR_ProcessAnalyzer_Logs#Task_Log|Task log]] that there are currently no other users in the system.&lt;br /&gt;
* Presets are run in a random order to reduce random variation in the results.&lt;br /&gt;
&lt;br /&gt;
=== Query Designer ===&lt;br /&gt;
Query Designer is for testing QPR ProcessAnalyzer KPI language queries that contain&lt;br /&gt;
* root expression to select objects to be analysed&lt;br /&gt;
* dimension expressions to slice the analyzed object into slices&lt;br /&gt;
* measure expressions to calculate KPI&#039;s and other measures from each of the slices&lt;br /&gt;
* data can also be sorted and number of rows limited&lt;br /&gt;
&lt;br /&gt;
The expressions are written in the left side using a JSON format. When the &#039;&#039;&#039;Run Query&#039;&#039;&#039; button is clicked, the defined query is run and results appear to a table in the right side. Details of the JSON format can be found in [[Web_API:_Expression/query|QPR ProcessAnalyzer Expression Analysis]].&lt;br /&gt;
&lt;br /&gt;
=== Expression Designer ===&lt;br /&gt;
Expression Designer is used to run expressions in a generic context. Write the expressions in the upper box and the results appear in the lower box. When clicking the &#039;&#039;&#039;Run All&#039;&#039;&#039; button, all expressions in the upper box are run. It&#039;s also possible to select parts of the expression and click the &#039;&#039;&#039;Run Selection&#039;&#039;&#039; button to only run the selected parts. If there are errors in the run, cursor is automatically moved to the point where the error occurred.&lt;br /&gt;
&lt;br /&gt;
=== [[User_Profile|User Profile]] ===&lt;br /&gt;
&lt;br /&gt;
=== About ===&lt;br /&gt;
The About dialog displays technical information about the QPR ProcessAnalyzer environment:&lt;br /&gt;
* Software build&lt;br /&gt;
* Build timestamp&lt;br /&gt;
* Database version&lt;br /&gt;
* Features enabled&lt;br /&gt;
* System default language&lt;br /&gt;
* System default date format&lt;br /&gt;
* System default first day of week&lt;br /&gt;
* System default clock format&lt;br /&gt;
* QPR ProcessAnalyzer memory usage&lt;br /&gt;
* Available / total physical memory&lt;br /&gt;
&lt;br /&gt;
=== Sign out ===&lt;br /&gt;
The user session can be signed out, which also clears all cached information in the browser side. When using a personal computer, signing out is normally not needed from the security point of view, but if there are other users in the same computer, it&#039;s important to sign out after using the system.&lt;br /&gt;
&lt;br /&gt;
When using QPR ProcessAnalyzer as Snowflake Native App, also the Snowflake session is logged out when pressing the &#039;&#039;Sign out&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category: QPR ProcessAnalyzer]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Wiki&amp;diff=28529</id>
		<title>QPR ProcessAnalyzer Wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Wiki&amp;diff=28529"/>
		<updated>2026-06-17T13:25:18Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;downloadButton&amp;quot; style=&amp;quot;width:190px;float:right;margin: 3px 12px 0px 15px;&amp;quot;&amp;gt;[[Online_Learning_Platform|Online Learning&amp;lt;br /&amp;gt;Platform]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Welcome to QPR ProcessAnalyzer Wiki! QPR ProcessAnalyzer is a software for turning event and transactional data into visual process analysis and intelligence. Topics in this documentation are divided based on user roles for process analysts, developers and administrators.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
== For Process Analysts ==&lt;br /&gt;
This section contains information how to get started with QPR ProcessAnalyzer and how to create your first dashboards! This section also describes how to use filters and how to make different kinds of analyses with QPR ProcessAnalyzer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex;flex-wrap: wrap;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 0 210px;border:1px solid #dfdfdf;padding:0 1em 1em 1.5em;background-color:#F7FAFC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
=== Getting Started ===&lt;br /&gt;
* [[Getting Started with QPR ProcessAnalyzer]]&lt;br /&gt;
* [[Log_in_QPR_ProcessAnalyzer|Log in QPR ProcessAnalyzer]]&lt;br /&gt;
* [[QPR_ProcessAnalyzer_Native_App_in_Snowflake|Snowflake Native App]]&lt;br /&gt;
* [[Introduction to Process Mining|Introduction to Process Mining]]&lt;br /&gt;
* [[Process_Mining_Concepts|Process Mining Concepts]]&lt;br /&gt;
* [[Navigation_Menu|Navigation Menu]]&lt;br /&gt;
* [[User Profile|User Profile]] and [[Languages and Localization|Language Settings]]&lt;br /&gt;
* [[QPR Task Recorder for Web Apps|QPR Task Recorder for Web Apps]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 0 210px;border:1px solid #dfdfdf;padding:0 1em 1em 1.5em;background-color:#F7FAFC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Working with Dashboards ===&lt;br /&gt;
* [[QPR_ProcessAnalyzer_Project_Workspace|Project Workspace]]: [[QPR_ProcessAnalyzer_Project_Workspace#Projects|Projects]], [[QPR_ProcessAnalyzer_Project_Workspace#Dashboards|Dashboards]], [[QPR_ProcessAnalyzer_Project_Workspace#Models|Models]], [[QPR_ProcessAnalyzer_Project_Workspace#Datatables|Datatables]], [[Managing_Scripts|Scripts]], [[QPR_ProcessAnalyzer_Project_Workspace#Recycle_Bin|Recycle Bin]]&lt;br /&gt;
* [[Filtering_in_QPR_ProcessAnalyzer|Using Filters]]&lt;br /&gt;
* [[QPR ProcessAnalyzer Dashboard Designer|Creating Dashboards]]&lt;br /&gt;
* [[AI Assistant for QPR ProcessAnalyzer|AI Assistant]] (powered by OpenAI GPT)&lt;br /&gt;
* [[Dashboard Variables|Dynamic Variables in Dashboards]]&lt;br /&gt;
* [[Business Calendar|Business Calendar to Calculate Durations]]&lt;br /&gt;
* [[Best Practices for Designing Dashboards|Best Practices for Designing Dashboards]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 0 370px;border:1px solid #dfdfdf;padding:0 1em 1em 1.5em;background-color:#F7FAFC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analyses and Visualizations ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
* [[Process Flowchart|Case-Centric Flowchart]]&lt;br /&gt;
* [[Object-Centric_Flowchart|Object-Centric Flowchart]]&lt;br /&gt;
* [[QPR ProcessAnalyzer Chart|Chart]] / [[Snowflake Chart|Snowflake Chart]]&lt;br /&gt;
** [[QPR ProcessAnalyzer Graph Charts|Graph charts]]&lt;br /&gt;
** [[QPR_ProcessAnalyzer_Table|Table]]&lt;br /&gt;
** [[QPR_ProcessAnalyzer_Pivot_Table|Pivot Table]]&lt;br /&gt;
** [[QPR_ProcessAnalyzer_KPI_Card|KPI Card]]&lt;br /&gt;
** [[Gantt_Chart|Gantt Chart]]&lt;br /&gt;
** [[Sankey_Chart|Sankey Chart]]&lt;br /&gt;
** [[Measure,_Dimension_and_Column_Settings|Measure Settings]]&lt;br /&gt;
** [[Chart_On-screen_Settings|On-screen Settings]]&lt;br /&gt;
** [[Chart_Linked_Settings|Linked Settings]]&lt;br /&gt;
** [[Actions_to_Run_Script_in_Table|Run Script Actions]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
* [[AI_Agent|AI Agent]]&lt;br /&gt;
* [[AI Root Causes|AI Root Causes Analysis]] / [[Root Causes|Classic Root Causes Analysis]]&lt;br /&gt;
* [[Clustering Analysis|Clustering Analysis]]&lt;br /&gt;
* [[Conformance Analysis|Conformance Analysis]]&lt;br /&gt;
* [[Design Diagram|Design Diagram]] / [[QPR ProcessAnalyzer BPMN Editor|BPMN Editor]]&lt;br /&gt;
* [[Label and Link]]&lt;br /&gt;
* [[Image|Image]]&lt;br /&gt;
* [[Range_Filter|Range Filter Selector]] (for dates and numbers)&lt;br /&gt;
* [[Filter_Selectors|Dimension Filter Selectors]]&lt;br /&gt;
* [[Dropdown_List_Selector|Dropdown List Selector]]&lt;br /&gt;
* [[External_Content|Embedded webpage]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== For Citizen Developers ==&lt;br /&gt;
This section describes how to build ETL scripts that transform the source data into process mining models. There is also a detailed description how the process mining models can be configured so that they are optimal for the desired analyses. Finally, there is reference documentation for all expression language related functionality, that can be used both when writing custom KPI&#039;s in dashboards and in the ETL scripts.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex;flex-wrap: wrap;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 0 370px;border:1px solid #dfdfdf;padding:0 1em 1em 1.5em;background-color:#F7FAFC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
=== Expression Language Reference ===&lt;br /&gt;
* [[SQL_Expressions|SQL Expressions for Snowflake]]&lt;br /&gt;
* In-memory expressions: [[QPR_ProcessAnalyzer_Expressions|Basic Syntax and Operations]] / [[Generic Functions in QPR ProcessAnalyzer|Generic Functions]]&lt;br /&gt;
* [[Generic_Objects_in_Expression_Language|Generic types]] ([[Generic_Properties_in_Expression_Language|Generic Properties]], [[Generic_Objects_in_Expression_Language#Array|Array]], [[Generic_Objects_in_Expression_Language#DateTime|DateTime]], [[Generic_Objects_in_Expression_Language#String|String]], [[Generic_Objects_in_Expression_Language#Timespan|Timespan]],  [[Generic_Objects_in_Expression_Language#Dictionary|Dictionary]])&lt;br /&gt;
* [[Process_Mining_Objects_in_Expression_Language|In-memory models API]] ([[Process_Mining_Objects_in_Expression_Language#AttributeType|AttributeType]], [[Process_Mining_Objects_in_Expression_Language#Case|Case]], [[Process_Mining_Objects_in_Expression_Language#Event|Event]], [[Process_Mining_Objects_in_Expression_Language#EventLog|EventLog]], [[Process_Mining_Objects_in_Expression_Language#EventType|EventType]], [[Process_Mining_Objects_in_Expression_Language#Flow|Flow]], [[Process_Mining_Objects_in_Expression_Language#FlowOccurrence|FlowOccurrence]], [[Process_Mining_Objects_in_Expression_Language#Variation|Variation]])&lt;br /&gt;
* Configuration objects ([[Dashboard_in_Expression_Language|Dashboard]], [[Datatable_in_Expression_Language|Datatable]], [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Model|Model]], [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Filter|Filter]], [[Diagram_in_Expression_Language|Diagram]], [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Script|Script]], [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Project|Project]], [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#User.2FGroup|User/Group]])&lt;br /&gt;
* Tabular data ([[DataFrame in Expression Language|DataFrame]], [[SqlDataFrame in Expression Language|SqlDataFrame]],  [[DataFlow_in_Expression_Language|DataFlow]])&lt;br /&gt;
* [[Machine_Learning_Functions_in_Expression_Language|Machine Learning API]] / [[Conformance_Checking|Conformance Checking]] / [[QPR_MEA_Integration|QPR MEA Integration]]&lt;br /&gt;
* [[Filtering_in_QPR_ProcessAnalyzer_Queries|Filter Rules JSON]]&lt;br /&gt;
* [[System Library]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 0 250px;border:1px solid #dfdfdf;padding:0 1em 1em 1.5em;background-color:#F7FAFC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Create Process Mining Models ===&lt;br /&gt;
* [[Creating Process Mining Model|Walkthrough: Creating Process Mining Model]]&lt;br /&gt;
* [[Exporting_and_Importing_Data_in_QPR_ProcessAnalyzer|Importing Data from CSV, XES and PACM files]]&lt;br /&gt;
* [[Object-centric_Process_Mining_Model|Object-centric Process Mining (OCPM)]]&lt;br /&gt;
* [[Create_Object-centric_Model_from_Relational_Schema|Create OCPM Model from Relational Schema]]&lt;br /&gt;
* [[Event Ordering for Identical Timestamps|Event Ordering for Identical Timestamps]]&lt;br /&gt;
* [[Managing Time Zones and Local Time|Time Zones and Local Time]]&lt;br /&gt;
* [[Best_Practices_for_Designing_Models|Best Practices for Designing Models]]&lt;br /&gt;
* [[Decide_Case_ID_Data_Type|Decide Case ID Data Type]]&lt;br /&gt;
* [[Create_Predicted_Eventlog|Create Predicted Eventlog]]&lt;br /&gt;
* [[Create Simulated Eventlog]]&lt;br /&gt;
==== For In-memory Models ====&lt;br /&gt;
* [[Calculated Attributes in QPR ProcessAnalyzer|Calculated Case and Event Attributes]]&lt;br /&gt;
* [[Email Notifications|Email Notifications]]&lt;br /&gt;
* [[QPR ProcessAnalyzer Model Datasources|Model datasources]] ([[QPR ProcessAnalyzer Model Datasources#Loading Data from Datatables|Datatable]], [[QPR ProcessAnalyzer Model Datasources#Loading Script|Loading Script]], [[QPR ProcessAnalyzer Model Datasources#ODBC_Datasource|ODBC]])&lt;br /&gt;
* [[Case Level Permissions|Case Level Permissions]]&lt;br /&gt;
* [[Automatic Model Loading on Server Startup|Keeping Models Always Available]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 0 250px;border:1px solid #dfdfdf;padding:0 1em 1em 1.5em;background-color:#F7FAFC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Integrations and Connectors ===&lt;br /&gt;
* [[Managing Scripts|Managing Scripts in Workspace]]&lt;br /&gt;
* [[Datatable_Properties_Dialog|Managing Datatables in Workspace]]&lt;br /&gt;
* [[SQL Scripting for ETL|Writing SQL Scripts]]&lt;br /&gt;
* [[SQL Scripting Commands|SQL Scripting Commands Reference]]&lt;br /&gt;
* [[Storing Secrets for Scripts|Storing Secrets]]&lt;br /&gt;
* [[QPR ProcessAnalyzer ScriptLauncher|Installing and using QPR ScriptLauncher]]&lt;br /&gt;
* [[Importing_Data_from_SAP|How to Import Data from SAP]]&lt;br /&gt;
* [[Anonymize data|Anonymize data]]&lt;br /&gt;
* [[Expression Script Examples|Expression Script Examples]]&lt;br /&gt;
* [[QPR ProcessAnalyzer API|QPR ProcessAnalyzer REST API]]&lt;br /&gt;
* [[Sample Eventlog Files|Sample Eventlogs]]&lt;br /&gt;
* [[Connecting_to_QPR_ProcessAnalyzer_MCP_Server|Connecting to MCP Server]]&lt;br /&gt;
* [[MCP_Tool_Examples|MCP Tool Examples]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== For System Administrators ==&lt;br /&gt;
This section starts with the planning of QPR ProcessAnalyzer installation. After all requirements have been fulfilled, you can continue with the installation and configuration of QPR ProcessAnalyzer. Finally, learn how to manage users and perform other administrative tasks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex;flex-wrap: wrap;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 0 290px;border:1px solid #dfdfdf;padding:0 1em 1em 1.5em;background-color:#F7FAFC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
=== Planning Installation ===&lt;br /&gt;
* [[QPR ProcessAnalyzer System Requirements|System Requirements]]&lt;br /&gt;
* [[QPR ProcessAnalyzer System Architecture|System Architecture]]&lt;br /&gt;
* [[User Session Management|User Session Management]]&lt;br /&gt;
* [[QPR_ProcessAnalyzer_Downloads|Downloads Page]]&lt;br /&gt;
* [[QPR ProcessAnalyzer Release Notes|QPR ProcessAnalyzer Release Notes]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 0 290px;border:1px solid #dfdfdf;padding:0 1em 1em 1.5em;background-color:#F7FAFC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installing and Configuring ===&lt;br /&gt;
* [[Deploy_QPR_ProcessAnalyzer_from_Container|Container Deployment]]&lt;br /&gt;
* [[Installing QPR ProcessAnalyzer Server on Windows|Install on Windows]] (or [[Updating_QPR_ProcessAnalyzer_Server|Update]])&lt;br /&gt;
* [[Snowflake_Connection_Configuration|Connect to Snowflake]]&lt;br /&gt;
* [[SAML_2.0_Federated_Authentication|SAML 2.0 Authentication]]&lt;br /&gt;
* [[QPR_ProcessAnalyzer_as_MCP_Server|Configure MCP Server]] / [[Create_MCP_Tools|Create MCP Tools]]&lt;br /&gt;
* [[QPR ProcessAnalyzer Security Hardening|Security Hardening]]&lt;br /&gt;
* [[Setting_up_Scripting_Sandbox|Setting up SQL Scripting Sandbox]]&lt;br /&gt;
* [[Activate_QPR_ProcessAnalyzer_using_ActivationUtility|Activation without Internet Connection]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 0 290px;border:1px solid #dfdfdf;padding:0 1em 1em 1.5em;background-color:#F7FAFC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Administrating System ===&lt;br /&gt;
* [[Roles and Permissions|User Roles and Permissions]]&lt;br /&gt;
* [[Manage Users and Groups|Managing Users]]&lt;br /&gt;
* [[PA_Configuration_database_table|Configurations in database]]&lt;br /&gt;
* [[Server_settings_in_appsettings.json|Configurations in appsettings.json file]]&lt;br /&gt;
* [[Server_settings_in_log4net.config|Configurations in log4net.config file]]&lt;br /&gt;
* [[QPR ProcessAnalyzer Logs|Logs for Audit and Troubleshooting]]&lt;br /&gt;
* [[Embed_to_Website|Embed to Website]]&lt;br /&gt;
* [[In-memory_Models_Management|In-memory Models Management]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Agreements ==&lt;br /&gt;
See the [[QPR General Terms and Conditions]] and [[QPR SaaS Terms and Conditions]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=User_Settings&amp;diff=28528</id>
		<title>User Settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=User_Settings&amp;diff=28528"/>
		<updated>2026-06-17T13:21:31Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TeeHiet moved page User Settings to User Profile: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[User Profile]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28527</id>
		<title>User Profile</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28527"/>
		<updated>2026-06-17T13:21:31Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TeeHiet moved page User Settings to User Profile: TK-63420&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== User information ==&lt;br /&gt;
User Settings dialog shows following information for the currently logged in user:&lt;br /&gt;
* &#039;&#039;&#039;User name&#039;&#039;&#039;: Login name used when user logs in.&lt;br /&gt;
* &#039;&#039;&#039;Full name&#039;&#039;&#039;: Person full name (for example first name and last name).&lt;br /&gt;
* &#039;&#039;&#039;Email&#039;&#039;&#039;: User&#039;s email address.&lt;br /&gt;
* &#039;&#039;&#039;Groups&#039;&#039;&#039;: Groups the user belongs to. The user gets permissions from the groups.&lt;br /&gt;
* &#039;&#039;&#039;Global roles&#039;&#039;&#039;: List of global roles the user has. There is one or several permissions in each role and user gets permissions from the roles.&lt;br /&gt;
* &#039;&#039;&#039;Global permissions&#039;&#039;&#039;: List of global permissions the user has. The permissions determine what actions the user has in the system. &lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Authenticated using&#039;&#039;&#039; field describes which authentication method was used to log in to QPR ProcessAnalyzer. There are following options:&lt;br /&gt;
* QPR ProcessAnalyzer password&lt;br /&gt;
* External identity provider through SAML 2.0&lt;br /&gt;
* Snowflake (available in Snowflake Native App)&lt;br /&gt;
&lt;br /&gt;
== Localization settings ==&lt;br /&gt;
User can set the user&#039;s own language, content language, date format, first day of week and whether the 12-hour clock is used. See [[Languages_and_Localization#Date_Format_Settings|more information]].&lt;br /&gt;
&lt;br /&gt;
== Change password ==&lt;br /&gt;
User can change user own password. When changing the password, you need to provide your current password and also confirm the new password. Note that when authenticated using the SSO (SAML 2.0 identity provided) or Snowflake, the password changing in QPR ProcessAnalyzer is not available.&lt;br /&gt;
&lt;br /&gt;
When running QPR ProcessAnalyzer as Snowflake Native App, there is also &#039;&#039;&#039;Login as other user&#039;&#039;&#039; button to log out QPR ProcessAnalyzer session and go the login screen, so that a different QPR ProcessAnalyzer user can be used. The Snowflake session is not logged out when pressing this button.&lt;br /&gt;
&lt;br /&gt;
== Starting dashboard ==&lt;br /&gt;
Starting dashboard (a.k.a. default dashboard) can be defined that is opened when a user logs in. The starting dashboard can be a navigation page containing links to other dashboards in the process mining application.&lt;br /&gt;
&lt;br /&gt;
The starting dashboard is defined for a group, allowing to define different starting dashboards for users of different groups. All users belonging to a group with a starting dashboard will define that as the starting dashboard for all the users in that group. If a user belongs to multiple groups with each having a starting dashboard, the user&#039;s starting dashboard will be taken from a group having alphabetically the first name. Thus, it&#039;s possible to define a starting dashboard for a narrower group that overrides a larger group, if the narrower group is alphabetically before the larger group.&lt;br /&gt;
&lt;br /&gt;
See how to [[Manage_Users_and_Groups#Editing_Group_Information|configure starting dashboards]].&lt;br /&gt;
&lt;br /&gt;
== Technical information ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;QPR ProcessAnalyzer version&#039;&#039;&#039; can be seen. When pressing the &#039;&#039;&#039;(details)&#039;&#039;&#039; link, a dialog with following system related technical information is shown:&lt;br /&gt;
* Database major version&lt;br /&gt;
* Database minor version&lt;br /&gt;
* PACM file version&lt;br /&gt;
* System default language&lt;br /&gt;
* System default date format&lt;br /&gt;
* System default first day of week&lt;br /&gt;
* System default use of 12-hour clock&lt;br /&gt;
* Server build&lt;br /&gt;
* Client build&lt;br /&gt;
* Client revision&lt;br /&gt;
* Build timestamp&lt;br /&gt;
* Database initialized for version&lt;br /&gt;
* QPR ProcessAnalyzer memory usage&lt;br /&gt;
* Available / total physical memory&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28479</id>
		<title>Create MCP Prompts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28479"/>
		<updated>2026-06-11T08:57:55Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Prompts ==&lt;br /&gt;
MCP prompts are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP prompt when the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP prompt option. Also, only system administrators can modify scripts that are MCP prompts, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Prompt:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP prompt, give it a name. This name is then used as the MCP prompt name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover prompts with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Prompt Settings ==&lt;br /&gt;
The prompt description is a concise metadata field that gives an AI agent instructions on how to achieve complex tasks. When a prompt is called, the associated script is executed and the result is returned as a prompt message.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own prompt configuration as JSON. Supported values are same as [https://modelcontextprotocol.io/specification/2025-11-25/server/prompts#prompt here], except for the name which is always generated automatically and can&#039;t be overridden. Defining the prompt configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the prompt.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the prompt, MCP prompts provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the prompt. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the prompt. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;arguments&#039;&#039;&#039;: Following arguments are available to indicate about the MCP prompt:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039; (required, string): The argument name.&lt;br /&gt;
** &#039;&#039;&#039;description&#039;&#039;&#039; (optional, string): A human-readable description of the argument.&lt;br /&gt;
** &#039;&#039;&#039;required&#039;&#039;&#039; (optional, boolean): Whether the argument must be provided.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the prompt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP prompt configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Text Summarizer&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Generates a concise summary of the provided text&amp;quot;,&lt;br /&gt;
  &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;The text content to summarize&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;maxLength&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Maximum length of the summary in characters&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/summarize.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;category&amp;quot;: &amp;quot;text-processing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a prompt script that takes modelId as parameter:&amp;lt;pre&amp;gt;&lt;br /&gt;
`&lt;br /&gt;
Based on the model ${modelId}, create a report having the following structure:&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
- Name&lt;br /&gt;
- Description&lt;br /&gt;
- Configuration and used data tables&lt;br /&gt;
&lt;br /&gt;
=== Model data ===&lt;br /&gt;
- Model statistics such as number of cases, events, event types, flows, variations etc.&lt;br /&gt;
&lt;br /&gt;
=== Model structure ===&lt;br /&gt;
- Analysis based on event types, flows, variations and BPMN model.&lt;br /&gt;
`&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Resources&amp;diff=28478</id>
		<title>Create MCP Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Resources&amp;diff=28478"/>
		<updated>2026-06-11T08:55:27Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Resources ==&lt;br /&gt;
MCP resources are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP resource when the &#039;&#039;&#039;MCP resource&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP resource option. Also, only system administrators can modify scripts that are MCP resources, because any changes to the MCP interface is restricted to system administrators for security reasons. An MCP Resource script that returns binary data has to return the resource as Base64 encoded string.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Resource:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP resource, give it a name. This name is then used as the MCP resource name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover resources with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP resource&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Resource Settings ==&lt;br /&gt;
The MCP resource is a read-only data entity that provides AI models with external context, files, or background knowledge. When a resource is read, the associated script is executed and the result is returned as text resource contents.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own resource configuration as JSON. Supported values are same as [https://modelcontextprotocol.io/specification/2025-11-25/server/resources#resource here], except for the name which is always generated automatically and can&#039;t be overridden. Defining the resource configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the resource.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the resource, MCP resources provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the resource. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the resource. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;uri&#039;&#039;&#039;: &amp;quot;script:///{scriptId}&amp;quot; where scriptId is the script&#039;s database identifier. This value can&#039;t be modified.&lt;br /&gt;
* &#039;&#039;&#039;mimeType&#039;&#039;&#039;: Mime type of the resource. Defaults to &amp;quot;text/plain&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;annotations&#039;&#039;&#039;: Metadata for filtering and prioritization of the resource content.&lt;br /&gt;
** &#039;&#039;&#039;audience&#039;&#039;&#039; (optional, array of roles): The intended audience for this content. Supported values are: &amp;quot;user&amp;quot; and &amp;quot;assistant&amp;quot;.&lt;br /&gt;
** &#039;&#039;&#039;priority&#039;&#039;&#039; (optional, number): How important this data is, as a decimal number between &amp;quot;0&amp;quot; (lowest) and &amp;quot;1&amp;quot; (highest).&lt;br /&gt;
** &#039;&#039;&#039;lastModified&#039;&#039;&#039; (optional, string): When the resource was last modified, as an ISO 8601 date-time string (e.g. &amp;quot;2025-01-12T15:00:58Z&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;size&#039;&#039;&#039; (integer): Size in bytes.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the resource.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP resource configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Process Mining Data Export&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Exports process mining analysis results as JSON&amp;quot;,&lt;br /&gt;
  &amp;quot;mimeType&amp;quot;: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
  &amp;quot;size&amp;quot;: 102400,&lt;br /&gt;
  &amp;quot;annotations&amp;quot;: {&lt;br /&gt;
    &amp;quot;audience&amp;quot;: [&amp;quot;user&amp;quot;, &amp;quot;assistant&amp;quot;],&lt;br /&gt;
    &amp;quot;priority&amp;quot;: 0.8,&lt;br /&gt;
    &amp;quot;lastModified&amp;quot;: &amp;quot;2025-06-25T10:30:00Z&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/export.png&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/png&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;48x48&amp;quot;]&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;refreshInterval&amp;quot;: &amp;quot;300&amp;quot;,&lt;br /&gt;
    &amp;quot;dataSource&amp;quot;: &amp;quot;process-mining&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a resource script that returns binary data:&amp;lt;pre&amp;gt;&lt;br /&gt;
CallWebService(#{&lt;br /&gt;
    &amp;quot;Address&amp;quot;: &amp;quot;https://www.qpr.com/hs-fs/hubfs/main/global-content/qpr-software-color-header%2Blogo.png?width=150&amp;amp;…&lt;br /&gt;
})[&amp;quot;Response&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Resources&amp;diff=28477</id>
		<title>Create MCP Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Resources&amp;diff=28477"/>
		<updated>2026-06-11T08:51:04Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: /* Creating MCP Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Resources ==&lt;br /&gt;
MCP resources are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP resource when the &#039;&#039;&#039;MCP resource&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP resource option. Also, only system administrators can modify scripts that are MCP resources, because any changes to the MCP interface is restricted to system administrators for security reasons. An MCP Resource script that returns binary data has to return the resource as Base64 encoded string.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Resource:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP resource, give it a name. This name is then used as the MCP resource name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover resources with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP resource&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Resource Settings ==&lt;br /&gt;
The MCP resource is a read-only data entity that provides AI models with external context, files, or background knowledge. When a resource is read, the associated script is executed and the result is returned as text resource contents.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own resource configuration as JSON. Supported values are same as [https://modelcontextprotocol.io/specification/2025-11-25/server/resources#resource here], except for the name which is always generated automatically and can&#039;t be overridden. Defining the resource configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the resource.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the resource, MCP resources provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the resource. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the resource. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;uri&#039;&#039;&#039;: &amp;quot;script:///{scriptId}&amp;quot; where scriptId is the script&#039;s database identifier. This value can&#039;t be modified.&lt;br /&gt;
* &#039;&#039;&#039;mimeType&#039;&#039;&#039;: Mime type of the resource. Defaults to &amp;quot;text/plain&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;annotations&#039;&#039;&#039;: Metadata for filtering and prioritization of the resource content.&lt;br /&gt;
** &#039;&#039;&#039;audience&#039;&#039;&#039; (optional, array of roles): The intended audience for this content. Supported values are: &amp;quot;user&amp;quot; and &amp;quot;assistant&amp;quot;.&lt;br /&gt;
** &#039;&#039;&#039;priority&#039;&#039;&#039; (optional, number): How important this data is, as a decimal number between &amp;quot;0&amp;quot; (lowest) and &amp;quot;1&amp;quot; (highest).&lt;br /&gt;
** &#039;&#039;&#039;lastModified&#039;&#039;&#039; (optional, string): When the resource was last modified, as an ISO 8601 date-time string (e.g. &amp;quot;2025-01-12T15:00:58Z&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;size&#039;&#039;&#039; (integer): Size in bytes.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the resource.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP resource configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Process Mining Data Export&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Exports process mining analysis results as JSON&amp;quot;,&lt;br /&gt;
  &amp;quot;mimeType&amp;quot;: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
  &amp;quot;size&amp;quot;: 102400,&lt;br /&gt;
  &amp;quot;annotations&amp;quot;: {&lt;br /&gt;
    &amp;quot;audience&amp;quot;: [&amp;quot;user&amp;quot;, &amp;quot;assistant&amp;quot;],&lt;br /&gt;
    &amp;quot;priority&amp;quot;: 0.8,&lt;br /&gt;
    &amp;quot;lastModified&amp;quot;: &amp;quot;2025-06-25T10:30:00Z&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/export.png&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/png&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;48x48&amp;quot;]&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;refreshInterval&amp;quot;: &amp;quot;300&amp;quot;,&lt;br /&gt;
    &amp;quot;dataSource&amp;quot;: &amp;quot;process-mining&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Server_settings_in_appsettings.json&amp;diff=28433</id>
		<title>Server settings in appsettings.json</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Server_settings_in_appsettings.json&amp;diff=28433"/>
		<updated>2026-05-28T13:39:43Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64813&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The appsettings.json file is the main settings file for the QPR ProcessAnalyzer Server application.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Setting&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|SqlDatabaseConnectionString&lt;br /&gt;
|Connection string to configuration database in SQL Server. Check whether you are using the SQL Server default instance or a named instance, and whether the SQL Server authentication or Windows authentication is used.&lt;br /&gt;
&lt;br /&gt;
Connect to SQL Server default instance using SQL Server authentication:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connect to SQL Server default instance using Windows authentication:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connect to SQL Server named instance using SQL Server authentication:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Server=myServerName\\myInstanceName;Database=myDataBase;User Id=myUsername;Password=myPassword;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connect to SQL Server named instance using Windows authentication:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Server=myServerName\\myInstanceName;Database=myDataBase;Trusted_Connection=True;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More information about connections strings: https://www.connectionstrings.com/sqlconnection.&lt;br /&gt;
|-&lt;br /&gt;
|LogFilePath&lt;br /&gt;
|Location of the QPR ProcessAnalyzer Server log file, defined as the full path including the file name. For example: &#039;&#039;C:\\ProgramData\\QPR Software\\QPR ProcessAnalyzer\\Logs\\PA.log&#039;&#039; (json escapings are included).&lt;br /&gt;
|-&lt;br /&gt;
|CorsOrigins&lt;br /&gt;
|Defines how QPR ProcessAnalyzer Server responds to the CORS preflight requests. By default, this setting is empty, meaning that CORS is not allowed. To allow CORS from all origins, specify &#039;&#039;&#039;*&#039;&#039;&#039; (note that this is the least secure option). If CORS need to be enabled for a specific site(s), they are defined as a comma separated list to this setting. More about CORS: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS.&lt;br /&gt;
|-&lt;br /&gt;
|UseXForwardedForAsClientIp&lt;br /&gt;
|If QPR ProcessAnalyzer Server is running behind a web traffic load balancer (e.g. in Amazon Web Services), the following setting needs to be set to &#039;&#039;True&#039;&#039;. In that case, the client ip address is fetched from http request &#039;&#039;X-Forwarded-For&#039;&#039; (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For) field instead of the source of the ip packet. Client ip address is needed for logging and as a security confirmation in addition to the session id. When there is no load balancer and thus X-Forwarded-For is not set, it&#039;s important to have this setting as &#039;&#039;False&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Following settings are used by in-memory models (so these settings are not effective for Snowflake models):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Setting&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|ModelLoadOnStartup&lt;br /&gt;
|Whether in-memory models having setting &#039;&#039;LoadOnStartup&#039;&#039; as &#039;&#039;&#039;true&#039;&#039;&#039; are loaded automatically during the server startup. By default, this setting should be set to &#039;&#039;&#039;True&#039;&#039;&#039;. This setting can be used to temporarily disable automatic model loading for all models when for example automatic model loading causes issues.&lt;br /&gt;
|-&lt;br /&gt;
|DropUnusedFiltersAfter&lt;br /&gt;
|&lt;br /&gt;
Specifies duration after which filters are dropped from the memory if they have not been used during that time. Defined in format &#039;&#039;HH:mm:ss&#039;&#039; or &#039;&#039;d.HH:mm:ss&#039;&#039;, for example 01:00:00 (one hour), 00:30:00 (30 minutes) or 1.00:00:00 (24 hours). When a calculation uses a filter, the filter&#039;s last used time is updated (also model&#039;s last used time is updated). This setting can be overridden for each model in the [[In-memory_Models_Management|model settings]].&lt;br /&gt;
|-&lt;br /&gt;
|DropUnusedAnalysisResultsAfter&lt;br /&gt;
|&lt;br /&gt;
Specifies duration after which query results (analysis results) are dropped from the memory if they have not been used during that time. Defined in format &#039;&#039;HH:mm:ss&#039;&#039; or &#039;&#039;d.HH:mm:ss&#039;&#039;, for example 01:00:00 (one hour), 00:30:00 (30 minutes) or 1.00:00:00 (24 hours). Default value is 00:30:00 (30 minutes).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Following settings are for the product activation:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Setting&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|ProductActivationCode&lt;br /&gt;
|QPR ProcessAnalyzer Server product license activation code. Ask your organization license activation code from [mailto:customercare@qpr.com customercare@qpr.com].&lt;br /&gt;
&lt;br /&gt;
QPR ProcessAnalyzer Server automatically activates itself if the code is specified and there is an internet connection in the server computer. If there is no internet access, the activation need to be done manually by using the [[Activate_QPR_ProcessAnalyzer_using_ActivationUtility|Activation Utility]].&lt;br /&gt;
|-&lt;br /&gt;
|FirstName&lt;br /&gt;
|Customer contact person first name.&lt;br /&gt;
|-&lt;br /&gt;
|LastName&lt;br /&gt;
|Customer contact person last name.&lt;br /&gt;
|-&lt;br /&gt;
|Email&lt;br /&gt;
|Customer contact person email address.&lt;br /&gt;
|-&lt;br /&gt;
|LicenseFilePath&lt;br /&gt;
|QPR ProcessAnalyzer Server license file path including the file name. For example &#039;&#039;C:\\ProgramData\\QPR Software\\QPR ProcessAnalyzer\\pa_service.lf&#039;&#039; (json escapings are included). The license file is created when the QPR ProcessAnalyzer Server is activated. If changing the activation code, this file needs to be deleted manually to enable reactivation.&lt;br /&gt;
|-&lt;br /&gt;
|EMSAddress&lt;br /&gt;
|Activation server address &#039;&#039;&amp;lt;nowiki&amp;gt;https://activation.qpr.com&amp;lt;/nowiki&amp;gt;&#039;&#039; that is contacted when the QPR ProcessAnalyzer Server is activated. Do not change this setting.&lt;br /&gt;
|-&lt;br /&gt;
|UseProxyServer&lt;br /&gt;
|If needed, define the proxy server for QPR ProcessAnalyzer Server activation.&lt;br /&gt;
|-&lt;br /&gt;
|ProxyAddress&lt;br /&gt;
|If needed, define the proxy server for QPR ProcessAnalyzer Server activation.&lt;br /&gt;
|-&lt;br /&gt;
|Country&lt;br /&gt;
|Customer country.&lt;br /&gt;
|-&lt;br /&gt;
|JobTitle&lt;br /&gt;
|Customer contact person job title.&lt;br /&gt;
|-&lt;br /&gt;
|PhoneNumber&lt;br /&gt;
|Customer contact person phone number.&lt;br /&gt;
|-&lt;br /&gt;
|Address&lt;br /&gt;
|Customer address.&lt;br /&gt;
|-&lt;br /&gt;
|PostalCode&lt;br /&gt;
|Customer postal code.&lt;br /&gt;
|-&lt;br /&gt;
|Region&lt;br /&gt;
|Customer region.&lt;br /&gt;
|-&lt;br /&gt;
|Organization&lt;br /&gt;
|Customer organization.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Following settings are used by HTTP request and response logging:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Setting&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|HttpLogging&lt;br /&gt;
|When this section is defined as a top-level property in appsettings.json, the HTTP request and response logging is enabled. The following properties can be configured (see [https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.httplogging.httploggingoptions?view=aspnetcore-10.0 component documentation] for more information):&lt;br /&gt;
* LoggingFields: Specifies which parts of the HTTP request and response are logged (e.g., &amp;quot;RequestPropertiesAndHeaders&amp;quot;, &amp;quot;ResponseStatusCode&amp;quot;, &amp;quot;All&amp;quot;). Default value is &amp;quot;All&amp;quot;.&lt;br /&gt;
* RequestBodyLogLimit: The maximum number of bytes of the request body to log. Default value is &amp;quot;4096&amp;quot;.&lt;br /&gt;
* ResponseBodyLogLimit: The maximum number of bytes of the response body to log. Default value is &amp;quot;4096&amp;quot;.&lt;br /&gt;
* CombineLogs: Boolean value that defines whether to combine request and response logs into a single log entry. Default value is &amp;quot;true&amp;quot;.&lt;br /&gt;
* MediaTypeOptions:|An array of media type strings to log when body logging is enabled.&lt;br /&gt;
An example configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;HttpLogging&amp;quot;: {&lt;br /&gt;
    &amp;quot;LoggingFields&amp;quot;: &amp;quot;RequestPropertiesAndHeaders, ResponseStatusCode&amp;quot;,&lt;br /&gt;
    &amp;quot;RequestBodyLogLimit&amp;quot;: 4096,&lt;br /&gt;
    &amp;quot;ResponseBodyLogLimit&amp;quot;: 4096,&lt;br /&gt;
    &amp;quot;CombineLogs&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #dfdfdf;padding:0.5em 1em 0.5em 1em;background-color:#E7EAEC;margin:10px 0px 0px 10px;&amp;quot;&amp;gt;&lt;br /&gt;
The appsettings.json needs to be a correctly formatted json file, and thus the backslashes and quotation marks in string values need to be escaped as follows: \ → \\ and &amp;quot; → \&amp;quot;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28432</id>
		<title>User Profile</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=User_Profile&amp;diff=28432"/>
		<updated>2026-05-28T12:32:58Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63311&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== User information ==&lt;br /&gt;
User Settings dialog shows following information for the currently logged in user:&lt;br /&gt;
* &#039;&#039;&#039;User name&#039;&#039;&#039;: Login name used when user logs in.&lt;br /&gt;
* &#039;&#039;&#039;Full name&#039;&#039;&#039;: Person full name (for example first name and last name).&lt;br /&gt;
* &#039;&#039;&#039;Email&#039;&#039;&#039;: User&#039;s email address.&lt;br /&gt;
* &#039;&#039;&#039;Groups&#039;&#039;&#039;: Groups the user belongs to. The user gets permissions from the groups.&lt;br /&gt;
* &#039;&#039;&#039;Global roles&#039;&#039;&#039;: List of global roles the user has. There is one or several permissions in each role and user gets permissions from the roles.&lt;br /&gt;
* &#039;&#039;&#039;Global permissions&#039;&#039;&#039;: List of global permissions the user has. The permissions determine what actions the user has in the system. &lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Authenticated using&#039;&#039;&#039; field describes which authentication method was used to log in to QPR ProcessAnalyzer. There are following options:&lt;br /&gt;
* QPR ProcessAnalyzer password&lt;br /&gt;
* External identity provider through SAML 2.0&lt;br /&gt;
* Snowflake (available in Snowflake Native App)&lt;br /&gt;
&lt;br /&gt;
== Localization settings ==&lt;br /&gt;
User can set the user&#039;s own language, content language, date format, first day of week and whether the 12-hour clock is used. See [[Languages_and_Localization#Date_Format_Settings|more information]].&lt;br /&gt;
&lt;br /&gt;
== Change password ==&lt;br /&gt;
User can change user own password. When changing the password, you need to provide your current password and also confirm the new password. Note that when authenticated using the SSO (SAML 2.0 identity provided) or Snowflake, the password changing in QPR ProcessAnalyzer is not available.&lt;br /&gt;
&lt;br /&gt;
When running QPR ProcessAnalyzer as Snowflake Native App, there is also &#039;&#039;&#039;Login as other user&#039;&#039;&#039; button to log out QPR ProcessAnalyzer session and go the login screen, so that a different QPR ProcessAnalyzer user can be used. The Snowflake session is not logged out when pressing this button.&lt;br /&gt;
&lt;br /&gt;
== Starting dashboard ==&lt;br /&gt;
Starting dashboard (a.k.a. default dashboard) can be defined that is opened when a user logs in. The starting dashboard can be a navigation page containing links to other dashboards in the process mining application.&lt;br /&gt;
&lt;br /&gt;
The starting dashboard is defined for a group, allowing to define different starting dashboards for users of different groups. All users belonging to a group with a starting dashboard will define that as the starting dashboard for all the users in that group. If a user belongs to multiple groups with each having a starting dashboard, the user&#039;s starting dashboard will be taken from a group having alphabetically the first name. Thus, it&#039;s possible to define a starting dashboard for a narrower group that overrides a larger group, if the narrower group is alphabetically before the larger group.&lt;br /&gt;
&lt;br /&gt;
See how to [[Manage_Users_and_Groups#Editing_Group_Information|configure starting dashboards]].&lt;br /&gt;
&lt;br /&gt;
== Technical information ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;QPR ProcessAnalyzer version&#039;&#039;&#039; can be seen. When pressing the &#039;&#039;&#039;(details)&#039;&#039;&#039; link, a dialog with following system related technical information is shown:&lt;br /&gt;
* Database major version&lt;br /&gt;
* Database minor version&lt;br /&gt;
* PACM file version&lt;br /&gt;
* System default language&lt;br /&gt;
* System default date format&lt;br /&gt;
* System default first day of week&lt;br /&gt;
* System default use of 12-hour clock&lt;br /&gt;
* Server build&lt;br /&gt;
* Client build&lt;br /&gt;
* Client revision&lt;br /&gt;
* Build timestamp&lt;br /&gt;
* Database initialized for version&lt;br /&gt;
* QPR ProcessAnalyzer memory usage&lt;br /&gt;
* Available / total physical memory&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Languages_and_Localization&amp;diff=28431</id>
		<title>Languages and Localization</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Languages_and_Localization&amp;diff=28431"/>
		<updated>2026-05-28T12:30:11Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63311&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Each users can set their desired language for the user interface. QPR ProcessAnalyzer has the following languages available:&lt;br /&gt;
* English&lt;br /&gt;
* French&lt;br /&gt;
* Spanish&lt;br /&gt;
* German&lt;br /&gt;
* Finnish&lt;br /&gt;
* Swedish&lt;br /&gt;
* Polish&lt;br /&gt;
* Portuguese&lt;br /&gt;
* Ukrainian&lt;br /&gt;
&lt;br /&gt;
== Changing Language ==&lt;br /&gt;
User interface language can be changed in the [[Navigation_Menu#User%20Settings|User Settings dialog]] as follows:&lt;br /&gt;
# [[Getting_Started_with_QPR_ProcessAnalyzer#Logging_in|Login to QPR ProcessAnalyzer]].&lt;br /&gt;
# Open the navigation menu on top left and click &#039;&#039;&#039;User Settings&#039;&#039;&#039;.&lt;br /&gt;
# Choose the desired language in the &#039;&#039;&#039;Language&#039;&#039;&#039; list.&lt;br /&gt;
# Click &#039;&#039;&#039;Save&#039;&#039;&#039; to close the dialog.&lt;br /&gt;
&lt;br /&gt;
The selected language is stored to user settings, so that it is in use when the user logs in the next time (also when using another device).&lt;br /&gt;
&lt;br /&gt;
== Date Format Settings ==&lt;br /&gt;
In addition to the language, the following date presentation related settings can be set for each user in the [[Navigation_Menu#User%20Settings|User Settings dialog]]:&lt;br /&gt;
* &#039;&#039;&#039;Date format&#039;&#039;&#039;: Defines how date values are presented in the user interface. The format can be e.g. MM/dd/yyyy or d.M.yyyy. Following parts can be used in the date format: &#039;&#039;&#039;d&#039;&#039;&#039; (day of month as one or two digits), &#039;&#039;&#039;dd&#039;&#039;&#039; (day of month as two digits), &#039;&#039;&#039;M&#039;&#039;&#039; (month as one or two digits), &#039;&#039;&#039;MM&#039;&#039;&#039; (month as two digits), &#039;&#039;&#039;yy&#039;&#039;&#039; (year as two digits) and &#039;&#039;&#039;yyyy&#039;&#039;&#039; (year as four digits).&lt;br /&gt;
* &#039;&#039;&#039;First day of week&#039;&#039;&#039;: The first day of the week (appearsing in calendars to pick dates).&lt;br /&gt;
* &#039;&#039;&#039;Use 12-hour clock&#039;&#039;&#039;: Whether the 24-hour or 12-hour clock is used to present hours.&lt;br /&gt;
&lt;br /&gt;
Similar to the language, all these settings are remembered for the user.&lt;br /&gt;
&lt;br /&gt;
== Language Support Details ==&lt;br /&gt;
Most texts in the UI are translated, but there are the following exceptions:&lt;br /&gt;
* Process mining data imported to QPR ProcessAnalyzer (e.g. case and event attribute names, event type names, case and event attribute values) needs to be separately translated. See [[Languages and Localization#Content_Language|Content Language]] section below.&lt;br /&gt;
* Some tooltips that contain longer instructions&lt;br /&gt;
* Some special error messages related to the expression language errors&lt;br /&gt;
&lt;br /&gt;
The login page is shown with the system default language, when QPR ProcessAnalyzer is for the first time accessed with a certain device. Language is also stored to the browser&#039;s local storage, so the browser remembers the last used language and in the next time shows the login page in that language.&lt;br /&gt;
&lt;br /&gt;
== Localization Settings for New Users ==&lt;br /&gt;
For system administrators, there are system wide defaults for the localization settings that can be set in the [[PA_Configuration_database_table|configuration table]]:&lt;br /&gt;
* DefaultUiLanguage&lt;br /&gt;
* DefaultDateFormat&lt;br /&gt;
* DefaultFirstDayOfWeek&lt;br /&gt;
* DefaultUse12HourClock&lt;br /&gt;
&lt;br /&gt;
New users have these defaults until the user changes to her/his own settings. In case the administrator needs to change the language for many existing users, the change needs to be done directly to the &#039;&#039;PA_USER_ATTRIBUTE&#039;&#039; table in the database.&lt;br /&gt;
&lt;br /&gt;
== Content Language ==&lt;br /&gt;
Translations for process mining data (e.g. case and event attribute names, event type names, case and event attribute values) can be provided via the ContentTranslations value in the [[PA_Configuration_database_table#Localization_Settings|configuration table]]. When a valid ContentTranslations value is provided, the translations can be taken into use by selecting the &amp;quot;Content language&amp;quot; in the [[User_Settings|User Settings dialog]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Some things to note:&lt;br /&gt;
* Search dialogs work only with the original text, not the translated values.&lt;br /&gt;
* The Workspace user interface isn&#039;t translated from the content viewpoint, except for datatable content preview, which is translated.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
[[Category: QPR ProcessAnalyzer]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Languages_and_Localization&amp;diff=28430</id>
		<title>Languages and Localization</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Languages_and_Localization&amp;diff=28430"/>
		<updated>2026-05-28T12:29:42Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63311&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Each users can set their desired language for the user interface. QPR ProcessAnalyzer has the following languages available:&lt;br /&gt;
* English&lt;br /&gt;
* French&lt;br /&gt;
* Spanish&lt;br /&gt;
* German&lt;br /&gt;
* Finnish&lt;br /&gt;
* Swedish&lt;br /&gt;
* Polish&lt;br /&gt;
* Portuguese&lt;br /&gt;
* Ukrainian&lt;br /&gt;
&lt;br /&gt;
== Changing Language ==&lt;br /&gt;
User interface language can be changed in the [[Navigation_Menu#User%20Settings|User Settings dialog]] as follows:&lt;br /&gt;
# [[Getting_Started_with_QPR_ProcessAnalyzer#Logging_in|Login to QPR ProcessAnalyzer]].&lt;br /&gt;
# Open the navigation menu on top left and click &#039;&#039;&#039;User Settings&#039;&#039;&#039;.&lt;br /&gt;
# Choose the desired language in the &#039;&#039;&#039;Language&#039;&#039;&#039; list.&lt;br /&gt;
# Click &#039;&#039;&#039;Save&#039;&#039;&#039; to close the dialog.&lt;br /&gt;
&lt;br /&gt;
The selected language is stored to user settings, so that it is in use when the user logs in the next time (also when using another device).&lt;br /&gt;
&lt;br /&gt;
== Date Format Settings ==&lt;br /&gt;
In addition to the language, the following date presentation related settings can be set for each user in the [[Navigation_Menu#User%20Settings|User Settings dialog]]:&lt;br /&gt;
* &#039;&#039;&#039;Date format&#039;&#039;&#039;: Defines how date values are presented in the user interface. The format can be e.g. MM/dd/yyyy or d.M.yyyy. Following parts can be used in the date format: &#039;&#039;&#039;d&#039;&#039;&#039; (day of month as one or two digits), &#039;&#039;&#039;dd&#039;&#039;&#039; (day of month as two digits), &#039;&#039;&#039;M&#039;&#039;&#039; (month as one or two digits), &#039;&#039;&#039;MM&#039;&#039;&#039; (month as two digits), &#039;&#039;&#039;yy&#039;&#039;&#039; (year as two digits) and &#039;&#039;&#039;yyyy&#039;&#039;&#039; (year as four digits).&lt;br /&gt;
* &#039;&#039;&#039;First day of week&#039;&#039;&#039;: The first day of the week (appearsing in calendars to pick dates).&lt;br /&gt;
* &#039;&#039;&#039;Use 12-hour clock&#039;&#039;&#039;: Whether the 24-hour or 12-hour clock is used to present hours.&lt;br /&gt;
&lt;br /&gt;
Similar to the language, all these settings are remembered for the user.&lt;br /&gt;
&lt;br /&gt;
== Language Support Details ==&lt;br /&gt;
Most texts in the UI are translated, but there are the following exceptions:&lt;br /&gt;
* Process mining data imported to QPR ProcessAnalyzer (e.g. case and event attribute names, event type names, case and event attribute values) needs to be separately translated. See [[Languages and Localization#Content_Translations|Content_Translations]] section below.&lt;br /&gt;
* Some tooltips that contain longer instructions&lt;br /&gt;
* Some special error messages related to the expression language errors&lt;br /&gt;
&lt;br /&gt;
The login page is shown with the system default language, when QPR ProcessAnalyzer is for the first time accessed with a certain device. Language is also stored to the browser&#039;s local storage, so the browser remembers the last used language and in the next time shows the login page in that language.&lt;br /&gt;
&lt;br /&gt;
== Localization Settings for New Users ==&lt;br /&gt;
For system administrators, there are system wide defaults for the localization settings that can be set in the [[PA_Configuration_database_table|configuration table]]:&lt;br /&gt;
* DefaultUiLanguage&lt;br /&gt;
* DefaultDateFormat&lt;br /&gt;
* DefaultFirstDayOfWeek&lt;br /&gt;
* DefaultUse12HourClock&lt;br /&gt;
&lt;br /&gt;
New users have these defaults until the user changes to her/his own settings. In case the administrator needs to change the language for many existing users, the change needs to be done directly to the &#039;&#039;PA_USER_ATTRIBUTE&#039;&#039; table in the database.&lt;br /&gt;
&lt;br /&gt;
== Content Language ==&lt;br /&gt;
Translations for process mining data (e.g. case and event attribute names, event type names, case and event attribute values) can be provided via the ContentTranslations value in the [[PA_Configuration_database_table#Localization_Settings|configuration table]]. When a valid ContentTranslations value is provided, the translations can be taken into use by selecting the &amp;quot;Content language&amp;quot; in the [[User_Settings|User Settings dialog]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Some things to note:&lt;br /&gt;
* Search dialogs work only with the original text, not the translated values.&lt;br /&gt;
* The Workspace user interface isn&#039;t translated from the content viewpoint, except for datatable content preview, which is translated.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
[[Category: QPR ProcessAnalyzer]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=PA_Configuration_database_table&amp;diff=28429</id>
		<title>PA Configuration database table</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=PA_Configuration_database_table&amp;diff=28429"/>
		<updated>2026-05-28T12:18:34Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63311&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;QPR ProcessAnalyzer database has a configuration table &#039;&#039;&#039;PA_Configuration&#039;&#039;&#039; containing settings listed in the tables below. You need &#039;&#039;&#039;SQL Server Management Studio&#039;&#039;&#039; to edit the settings in the configuration table. QPR ProcessAnalyzer Server needs to be restarted (e.g. IIS application pool recycled) for the changes to take effect.&lt;br /&gt;
&lt;br /&gt;
For boolean values, &#039;&#039;true&#039;&#039; and &#039;&#039;1&#039;&#039; are valid values for yes, and &#039;&#039;false&#039;&#039; and &#039;&#039;0&#039;&#039; are valid for no.&lt;br /&gt;
&lt;br /&gt;
== General Settings ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Name	!!Default&amp;amp;nbsp;value	!!Description&lt;br /&gt;
|-&lt;br /&gt;
||DefaultDataSource&lt;br /&gt;
||&lt;br /&gt;
||Datasource where datatables data is stored when datatables are created by a script when the datasource is not explicitly specified in the script. Options are &#039;&#039;&#039;Snowflake&#039;&#039;&#039; and &#039;&#039;&#039;SqlServer&#039;&#039;&#039;. Value &#039;&#039;snowflake&#039;&#039; can be used when the &#039;&#039;SnowflakeConnectionString&#039;&#039; setting is defined, and value &#039;&#039;sqlserver&#039;&#039; can be used when the setting &#039;&#039;SqlServerConnectionString&#039;&#039; is configured. The setting can be changed without affecting the existing datatables, as the setting only affect new datatables. When this setting is empty, datatables are created in the metadata database.&lt;br /&gt;
|-&lt;br /&gt;
||SnowflakeConnectionString&lt;br /&gt;
||&lt;br /&gt;
||ODBC connection string for the Snowflake account. This setting is needed to make analytics calculations in the Snowflake. More information how to configure the [[Snowflake_Connection_Configuration#Set_Snowflake_ODBC_connection|Snowflake connection string]]. The Snowflake ODBC driver also needs to be installed in the machine running the QPR ProcessAnalyzer Server. When this setting has been configured, users can create Snowflake stored datatables and models using Snowflake calculation.&lt;br /&gt;
&lt;br /&gt;
When running QPR ProcessAnalyzer in the Snowpark Container Services, leave the SnowflakeConnectionString empty because then the connection string is created automatically using the method provided by the Snowpark Container Services.&lt;br /&gt;
|-&lt;br /&gt;
||SqlServerConnectionString&lt;br /&gt;
||&lt;br /&gt;
||Connection string for the SQL Server database containing the datatables data. It&#039;s recommended to use a separate database, but it&#039;s also possible to connect to the same database as the configuration data. If this setting is not configured, local datatables cannot be created (SQL Server stored). Existing datatables located in the configuration datatabase still work even if this setting has not be configured. Note that the connection uses ADO.Net (not ODBC), so the connection string is similar to the configuration database ([[Server_settings_in_appsettings.json|appsettings.json]] file).&lt;br /&gt;
|-&lt;br /&gt;
||DefaultColorPalette&lt;br /&gt;
||&lt;br /&gt;
||Charts color palette used globally in the environment. Defined as a json array of strings encoded with RGB hex (with or without alpha). Note that when a color palette in a chart has been changed, the chart starts using a chart-specific color palette, and the global color palette doesn&#039;t affect those charts. &lt;br /&gt;
&lt;br /&gt;
Example: [&amp;quot;#1F77B4&amp;quot;, &amp;quot;#FF7F0E&amp;quot;, &amp;quot;#2CA02C&amp;quot;, &amp;quot;#D62728&amp;quot;, &amp;quot;#9467BD&amp;quot;, &amp;quot;#8C564B&amp;quot;, &amp;quot;#E377C2&amp;quot;, &amp;quot;#7F7F7F&amp;quot;, &amp;quot;#BCBD22&amp;quot;, &amp;quot;#17BECF&amp;quot;]&lt;br /&gt;
|-&lt;br /&gt;
||OpenAIAPIKey&lt;br /&gt;
||&lt;br /&gt;
||API key for the OpenAI API (https://platform.openai.com/docs/api-reference). It needs to be configured to use the [[AI_Assistant_for_QPR_ProcessAnalyzer|AI Assistant]] and [[Generic_Functions_in_QPR_ProcessAnalyzer#OpenAIChatCompletion|OpenAIChatCompletion]] function.&lt;br /&gt;
|-&lt;br /&gt;
||AIAgentDefaultModelName&lt;br /&gt;
||openai-gpt-5-nano&lt;br /&gt;
||Snowflake LLM to use by default for AI Agent dashboard component and AI Agent presets. If not defined, &#039;&#039;&#039;openai-gpt-5-nano&#039;&#039;&#039; is used. See list of available LLM&#039;s: https://docs.snowflake.com/en/sql-reference/functions/complete-snowflake-cortex#arguments. Note that the list might not be up-to-date because the available LLM&#039;s change often. To get the up-to-date list, use the following SQL command: https://docs.snowflake.com/en/sql-reference/sql/show-models.&lt;br /&gt;
|-&lt;br /&gt;
||OpenAIDefaultModelName&lt;br /&gt;
||gpt-5.4&lt;br /&gt;
||OpenAI API LLM to use for the [[AI_Assistant_for_QPR_ProcessAnalyzer|AI Assistant]] and [[Generic_Functions_in_QPR_ProcessAnalyzer#OpenAIChatCompletion|OpenAIChatCompletion]] function. If not defined, &#039;&#039;&#039;gpt-5.4&#039;&#039;&#039; will be used. More information about OpenAI models: https://platform.openai.com/docs/models.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultCortexAgentsModelName&lt;br /&gt;
||llama3.1-70b&lt;br /&gt;
||Specifies the LLM to use when using Snowflake Cortex Agents (https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-rest-api). If not defined, &#039;&#039;&#039;llama3.1-70b&#039;&#039;&#039; is used.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;QueryTimeout&amp;quot;&amp;gt;QueryTimeout&amp;lt;/span&amp;gt;&lt;br /&gt;
||300&lt;br /&gt;
||Timeout (in seconds) for requests made to /api/expression/query and /api/expression endpoints. When the timeout is exceeded, the query is stopped and a timeout error is returned. Purpose of the timeout is to protect the system against potentially too long running or even never-ending queries which might otherwise jam the system.&lt;br /&gt;
|-&lt;br /&gt;
||SessionIdleTimeout&lt;br /&gt;
||3600&lt;br /&gt;
||Idle user session expiration timeout in seconds. User session expires if the session hasn&#039;t been used after this amount of time.&lt;br /&gt;
|-&lt;br /&gt;
||SessionMaximumDuration&lt;br /&gt;
||86400&lt;br /&gt;
||Maximum duration for a user session in seconds. Even if a session is used so that the SessionIdleTimeout is not reached, the session is expired after this amount of time.&lt;br /&gt;
|-&lt;br /&gt;
|DatabaseId&lt;br /&gt;
|&lt;br /&gt;
||Unique identifier for the QPR ProcessAnalyzer environment. Any characters between a-z, A-Z, 0-9 and _ (underscore) can be used in the DatabaseId. If the DatabaseId is missing or set to null, the system will generate a new GUID during startup and use it as the DatabaseId. The DatabaseId can also be an empty string. If using several QPR ProcessAnalyzer environments, make sure each use a different DatabaseId. The DatabaseId is used as part of the table names in Snowflake and SQL Server (in the datatables database). Thus if the DatabaseId is changed, all tables in Snowflake and SQL Server named with qprpa_dt_&amp;lt;DatabaseId&amp;gt;_&amp;lt;DatatableId&amp;gt; need to be renamed.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CacheOnlyPrimaryKeysForFilters&amp;quot;&amp;gt;CacheOnlyPrimaryKeysForFilters&amp;lt;/span&amp;gt;&lt;br /&gt;
||false&lt;br /&gt;
||Defines whether to include all columns in the Snowflake event cache filter tables (&#039;&#039;false&#039;&#039;), or only the primary key columns (&#039;&#039;true&#039;&#039;). When &#039;&#039;false&#039;&#039;, cache table creation is slower, but the analysis calculation is faster because the original event table is not used anymore. When &#039;&#039;false&#039;&#039;, also the cache tables require more storage space in Snowflake.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Localization Settings ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Name	!!Default&amp;amp;nbsp;value	!!Description&lt;br /&gt;
|-&lt;br /&gt;
||DefaultUiLanguage&lt;br /&gt;
||en_US&lt;br /&gt;
||Language code for the UI language that new user accounts get by default. Thus, a created user account has this language until the user changes her/his language. Also the login page is translated using this language when QPR ProcessAnalyzer is used for the first time in that web browser (when user has changed the language, it&#039;s remembered by the browser). This setting must be one of the supported language codes (xx_XX):&lt;br /&gt;
* English: &#039;&#039;&#039;en_US&#039;&#039;&#039;&lt;br /&gt;
* Finnish: &#039;&#039;&#039;fi_FI&#039;&#039;&#039;&lt;br /&gt;
* French: &#039;&#039;&#039;fr_FR&#039;&#039;&#039;&lt;br /&gt;
* German: &#039;&#039;&#039;de_DE&#039;&#039;&#039;&lt;br /&gt;
* Polish: &#039;&#039;&#039;pl_PL&#039;&#039;&#039;&lt;br /&gt;
* Portuguese: &#039;&#039;&#039;pt_BR&#039;&#039;&#039;&lt;br /&gt;
* Spanish: &#039;&#039;&#039;es_ES&#039;&#039;&#039;&lt;br /&gt;
* Swedish: &#039;&#039;&#039;sv_SE&#039;&#039;&#039;&lt;br /&gt;
* Ukrainian: &#039;&#039;&#039;uk_UK&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DefaultDateFormat&lt;br /&gt;
||MM/dd/yyyy&lt;br /&gt;
||Default date format that new user accounts get by default. The date format does not contain the time part (e.g. hours, minutes and seconds). Defined using the .Net date format (https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings).&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFirstDayOfWeek&lt;br /&gt;
||0&lt;br /&gt;
||Default first day of the week that new user accounts get by default. &#039;&#039;&#039;0&#039;&#039;&#039; is Sunday and &#039;&#039;&#039;1&#039;&#039;&#039; is Monday. This information is used by the UI when showing e.g. calendars.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultUse12HourClock&lt;br /&gt;
||false&lt;br /&gt;
||Defines whether the 12-hour clock is used by default (instead of the 24-hour clock) for the new user accounts when showing time information in the UI. Defined as &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;. More information about the 12-hour clock: https://en.wikipedia.org/wiki/12-hour_clock.&lt;br /&gt;
|-&lt;br /&gt;
||ContentTranslations&lt;br /&gt;
||&lt;br /&gt;
||Used for providing translations for process mining data. The format is a JSON object where each top-level property is a language identifier and each language identifier contains key-value pairs of original text and translated text. The language identifier can be a PA UI language code (see DefaultUiLanguage entry above) or a custom identifier (e.g. &amp;quot;Latin&amp;quot;).&amp;lt;br&amp;gt;&lt;br /&gt;
Example:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;fi_FI&amp;quot;: {&lt;br /&gt;
        &amp;quot;Account Manager&amp;quot;: &amp;quot;Asiakkuuspäällikkö&amp;quot;,&lt;br /&gt;
        &amp;quot;Region&amp;quot;: &amp;quot;Alue&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;es_ES&amp;quot;: {&lt;br /&gt;
        &amp;quot;Account Manager&amp;quot;: &amp;quot;Gerente de cuentas&amp;quot;,&lt;br /&gt;
        &amp;quot;Region&amp;quot;: &amp;quot;Región&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;Latin&amp;quot;: {&lt;br /&gt;
        &amp;quot;Account Manager&amp;quot;: &amp;quot;Rationum Administrator&amp;quot;,&lt;br /&gt;
        &amp;quot;Region&amp;quot;: &amp;quot;Regio&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ETL Scripts Settings ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Name	!!Default&amp;amp;nbsp;value	!!Description&lt;br /&gt;
|-&lt;br /&gt;
||AllowExternalDatasources&lt;br /&gt;
||true&lt;br /&gt;
||Can be used to disallow all connections to external datasources in the expression language and SQL scripts to improve security. Disallowed operations include ODBC, OLE DB, SQL Server (Ado.Net), SAP, Salesforce, and call web service. Note that this setting does not prevent the Snowflake processing. Regardless of this setting, QPR ScriptLauncher can be used to extract data from source systems.&lt;br /&gt;
|-&lt;br /&gt;
||SandboxDatabaseConnectionString&lt;br /&gt;
||&lt;br /&gt;
||Connection string to scripting sandbox database (ETL). If not defined, SQL-based ETL scripts cannot be run. Connection string for the scripting sandbox database is similar to the  [[Server_settings_in_appsettings.json|QPR ProcessAnalyzer database connection string]]. More information: [[Setting up Scripting Sandbox]].&lt;br /&gt;
|-&lt;br /&gt;
||AllowNonTemporaryETLTargetTable&lt;br /&gt;
||false&lt;br /&gt;
||Defined whether ETL scripts are allowed to create global temporary database tables (tables starting with ##). More information about temporary tables: https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql?view=sql-server-ver15#temporary-tables.&lt;br /&gt;
|-&lt;br /&gt;
||DatabaseBulkCopyTimeout&lt;br /&gt;
||600&lt;br /&gt;
||Timeout used for data import operations to datatables.&lt;br /&gt;
|-&lt;br /&gt;
|SandboxDatabaseBulkCopyTimeout&lt;br /&gt;
||600&lt;br /&gt;
||Timeout used for data import operations to sandbox tables in the SQL scripts.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span style=&amp;quot;color:lightgrey;&amp;quot;&amp;gt;DatabaseBulkCopyBatchSize&amp;lt;/span&amp;gt;&lt;br /&gt;
||5000&lt;br /&gt;
||BulkCopyBatchSize given for QPR ProcessAnalyzer database SqlBulkCopy operations.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span style=&amp;quot;color:lightgrey;&amp;quot;&amp;gt;SandboxDatabaseBulkCopyBatchSize&amp;lt;/span&amp;gt;&lt;br /&gt;
||5000&lt;br /&gt;
||BulkCopyBatchSize given for sandbox SqlBulkCopy operations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MCP and OAuth Server Settings ==&lt;br /&gt;
MCP server settings are needed for QPR ProcessAnalyzer to act as an [[QPR_ProcessAnalyzer_as_MCP_Server|MCP server]]. To authenticate to the MCP server, either the API key needs to be defined (in the McpServerConfiguration setting), or the internal OAuth Server needs to be configured (BuiltInOAuthServerConfiguration setting).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Name	!!Description&lt;br /&gt;
|-&lt;br /&gt;
||McpServerConfiguration&lt;br /&gt;
||Used to configure the MCP server built-in to ProcessAnalyzer server. If not set, MCP server functionality is disabled and MCP clients can&#039;t access to this server using MCP. If set, contains a string representation of a JSON object that supports the following properties:&lt;br /&gt;
* &#039;&#039;&#039;McpApiKey&#039;&#039;&#039; (string): If defined and not empty, defines the API key that can be used to connect to QPR ProcessAnalyzer MCP server without any other authentication. Default value is empty.&amp;lt;br&amp;gt;&lt;br /&gt;
Example value when using API Key authentication:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ &amp;quot;McpApiKey&amp;quot;: &amp;quot;xnTqr@Hd87JcuCmQZbjUHfwD@&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example value when using OAuth 2.0 authentication:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ &amp;quot;McpApiKey&amp;quot;: null }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note that when using OAuth 2.0 authentication the BuiltInOAuthServerConfiguration (see below) needs to be defined with an AcceptedAudiences value other than the default.&lt;br /&gt;
|-&lt;br /&gt;
||BuiltInOAuthServerConfiguration&lt;br /&gt;
||Used to configure OAuth 2.0 compatible OAuth server settings for OAuth server built-in (&amp;quot;internal&amp;quot;) to ProcessAnalyzer server. If not set, built-in OAuth server functionality is disabled and clients can&#039;t connect to this server using OAuth. If set, contains a string representation of a JSON object that supports the following properties: &lt;br /&gt;
* &#039;&#039;&#039;Issuer&#039;&#039;&#039; (string): OAuth issuer, which identifies a trusted authorization server that authenticates users and issues OAuth 2.0 access tokens and JSON Web Tokens (JWTs). If not defined or empty, default value is used, which is of format: &amp;lt;QPR ProcessAnalyzer server&#039;s base URL&amp;gt;/builtin-oauth. For example: https://example.com/builtin-oauth. The default value is empty.&lt;br /&gt;
* &#039;&#039;&#039;AcceptedAudiences&#039;&#039;&#039; (array of strings): Array of strings that define all the accepted audiences this QPR ProcessAnalyzer server is serving. When authorizing user using OAuth, these values are matched with the audience-parameter (a.k.a. client id) of the authorization. Only requests with a value that matches a value in this array are accepted. If null, audience-parameters are not validated at all. Instead, all authorization requests will pass the audience validation check. This also enables [https://datatracker.ietf.org/doc/html/rfc7591 Dynamic Client Registration Protocol (DCR)]. The default value is an empty array.&lt;br /&gt;
* &#039;&#039;&#039;SigningKey&#039;&#039;&#039; (string): Signing key for the built-in OAuth identity provider. If empty, generates a non-deterministic key based on the physical system where QPR ProcessAnalyzer is running. NOTE: Once QPR ProcessAnalyzer server is restarted, these non-deterministic keys no longer work. If defined, string must contain the key either in PEM ([https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsa.importfrompem?view=net-10.0 RFC 7468 PEM-encoded key]) or JSON ([https://datatracker.ietf.org/doc/html/rfc7517 RFC 7517]) format. The default value is empty.&lt;br /&gt;
* &#039;&#039;&#039;TokenLifetimeSeconds&#039;&#039;&#039; (integer): Token lifetime in seconds for the built-in OAuth identity provider. After access token created by built-in gets older than this lifetime, it becomes unusable and a new token has to be created. The default value is 3600.&lt;br /&gt;
* &#039;&#039;&#039;RefreshTokenLifetimeSeconds&#039;&#039;&#039; (integer): Refresh token lifetime in seconds for the built-in OAuth identity provider. After a refresh token gets older than this lifetime, it becomes unusable and the user has to authenticate again. The default value is 2592000 (30 days).&lt;br /&gt;
* &#039;&#039;&#039;DisableExternalOAuthForwarding&#039;&#039;&#039; (boolean): Can be used to disable forwarding OAuth requests to any configured external OAuth authorization server or SAML identity provider. If set, a QPR ProcessAnalyzer&#039;s own login view functionality is always used when authorizing a user. The default value is false.&lt;br /&gt;
* &#039;&#039;&#039;ClientCredentials&#039;&#039;&#039; (array of objects):  List of confidential client registrations for the &#039;&#039;client_credentials&#039;&#039; grant type. Each entry maps a client application (identified by &#039;&#039;ClientId&#039;&#039; and &#039;&#039;ClientSecret&#039;&#039;) to a ProcessAnalyzer user, enabling machine-to-machine authentication without interactive login. If not defined or empty, the &#039;&#039;client_credentials&#039;&#039; grant type is not available. Each object in the array supports the following properties:&lt;br /&gt;
** &#039;&#039;&#039;ClientId&#039;&#039;&#039; (string): Unique client identifier used by the &#039;&#039;client_id&#039;&#039; parameter of the token request.&lt;br /&gt;
** &#039;&#039;&#039;ClientSecret&#039;&#039;&#039; (string): Client secret used by the &#039;&#039;client_secret&#039;&#039; parameter of the token request to authenticate the client to the MCP server. Also supports HTTP Basic authentication (&#039;&#039;Authorization: Basic base64(client_id:client_secret)&#039;&#039;).&lt;br /&gt;
** &#039;&#039;&#039;MappedUserLoginName&#039;&#039;&#039; (string): Login name of the QPR ProcessAnalyzer user this client acts as. The issued access token will represent this user and carry their identity and permissions. The user must exist and be active in QPR ProcessAnalyzer.&lt;br /&gt;
** &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Optional human-readable description for this client registration.&lt;br /&gt;
** &#039;&#039;&#039;RefreshTokenRotationGracePeriodSeconds&#039;&#039;&#039; (integer): Grace period in seconds during which a rotated (previously used) refresh token is still accepted. When a refresh token is used, it is rotated (replaced with a new one). During this grace period, the old token remains valid to accommodate concurrent or retried requests that may arrive with the old token. After the grace period expires, the old rotated token becomes permanently invalid. The default value is 60 seconds (1 minute).&lt;br /&gt;
&lt;br /&gt;
Example BuiltInOAuthServerConfiguration configuration:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;Issuer&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;AcceptedAudiences&amp;quot;: null,&lt;br /&gt;
  &amp;quot;SigningKey&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;TokenLifetime&amp;quot;: 3600,&lt;br /&gt;
  &amp;quot;DisableExternalOAuthForwarding2&amp;quot;: true,&lt;br /&gt;
  &amp;quot;ClientCredentials&amp;quot;: [{&lt;br /&gt;
    &amp;quot;ClientId&amp;quot;: &amp;quot;my-backend-service&amp;quot;,&lt;br /&gt;
    &amp;quot;ClientSecret&amp;quot;: &amp;quot;a-secure-random-secret&amp;quot;,&lt;br /&gt;
    &amp;quot;MappedUserLoginName&amp;quot;: &amp;quot;service-account&amp;quot;,&lt;br /&gt;
    &amp;quot;Description&amp;quot;: &amp;quot;Backend integration service&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== In-memory Calculation Settings ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Name	!!Default&amp;amp;nbsp;value	!!Description&lt;br /&gt;
|-&lt;br /&gt;
||NumberOfParallelModelReaders&lt;br /&gt;
||4&lt;br /&gt;
||Models and datatable contents can be loaded with multiple simultaneous connections to the database to speed up the loading. This setting determines how many parallel loaders/readers at maximum (loaders are loading at the same time). For smaller models there are less parallel loaders than the defined limit: If there are less than 100000 rows in the table, there is only one loader. If there are less than 200000 rows in the table, there are only two loaders, and so on. &lt;br /&gt;
&lt;br /&gt;
The more there are parallel loaders, the more processor load and network bandwidth is consumed, and other operations in QPR ProcessAnalyzer might slow down. Note also that the performance optimum is achieved with a certain number of parallel loaders which differs between environment. Thus to achieve the best performance, data loading should be tested with different number of parallel loaders. Increasing number of parallel loaders beyond the optimum decreases the performance.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
||StartupModelLoadingMaxParallelism&lt;br /&gt;
||2&lt;br /&gt;
||Maximum number of QPR ProcessAnalyzer models that are loaded into memory simultaneously by the [[Automatic_Model_Loading_on_Server_Startup|Automatic Loading on Server Startup]]. If there are more models to be loaded on the server startup than this setting, loading for the rest of the models is started one by one when previous model loadings are completed. If this setting is not defined, &#039;&#039;&#039;2&#039;&#039;&#039; is used as a default value.&lt;br /&gt;
&lt;br /&gt;
Loading more models at the same time will speed up the whole model loading process, but on the other hand, it causes more load on the system, which affects the system responsiveness for users. Model loading consists of (1) transferring data from the datasource to QPR ProcessAnalyzer and (2) loaded data preprocessing into a model. The former uses mainly network bandwidth (if datasource is in a different server) and the latter uses mainly processor capacity in the QPR ProcessAnalyzer server. &lt;br /&gt;
&lt;br /&gt;
This setting affects only the model loading during the server startup and it doesn&#039;t restrict models loadings initiated by users.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SAML 2.0 Federated Authentication Settings ==&lt;br /&gt;
Note that the SAMLMetadataUrl and ServiceProviderLocation are mandatory for the federated authentication to work. Having both ExternalOAuthServerConfiguration and SAML authentication configured at the same time is not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Name	!!Description&lt;br /&gt;
|-&lt;br /&gt;
||SAMLMetadataUrl&lt;br /&gt;
||&lt;br /&gt;
Metadata URL of the identity provider (IdP). Check that the metadata url can actually be opened using a web browser and is publicly available. The metadata is an XML document starting with &#039;&#039;&#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&#039;&#039;&#039; followed by an &#039;&#039;&#039;EntityDescriptor&#039;&#039;&#039; tag. The metadata URL might look &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;https://your.federated.identity.provider.com/saml/metadata&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;. This setting is mandatory for the SAML authentication to work.&lt;br /&gt;
|-&lt;br /&gt;
||ServiceProviderLocation&lt;br /&gt;
||&lt;br /&gt;
Specifies the QPR ProcessAnalyzer server location (the root path which contains e.g. the &#039;&#039;ui&#039;&#039; folder). It&#039;s used by the url to redirect back to QPR ProcessAnalyzer after a successful authentication from the identity provider. The setting is defined in the following form: &#039;&#039;&#039;https://&amp;lt;hostname&amp;gt;/qprpa&#039;&#039;&#039;, for example &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;https://customer.onqpr.com/qprpa&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;. Note that the actual redirect back url is &#039;&#039;&#039;https://&amp;lt;hostname&amp;gt;/qprpa/api/Saml2/Acs&#039;&#039;&#039; (/api/Saml2/Acs is automatically included to the url). This setting is mandatory for the SAML authentication to work. Note that if this reply url is configured the identity provider, it must match with the ServiceProviderLocation setting.&lt;br /&gt;
|-&lt;br /&gt;
||SAMLUserIdAttribute&lt;br /&gt;
||&lt;br /&gt;
Name of the SAML attribute in the assertion that will be used as the user&#039;s login name. If this field is not defined, the &#039;&#039;&#039;saml:Assertion&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;saml:Subject&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;saml:NameID&#039;&#039;&#039; attribute in the assertion is used. If this setting is given, one of the &#039;&#039;&#039;saml:Assertion&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;saml:AttributeStatement&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;saml:Attribute&#039;&#039;&#039; elements in the assertion is used (the &#039;&#039;&#039;Name&#039;&#039;&#039; attribute in the &#039;&#039;&#039;saml:Attribute&#039;&#039;&#039; element is used for matching). Please note that the saml:NameID element is different than the usual SAML attributes that are defined by the saml:Attribute elements. For example, if an email address is used as a user id, the value of the setting could be for example &#039;&#039;&amp;lt;nowiki&amp;gt;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress&amp;lt;/nowiki&amp;gt;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||SAMLGroupsAttribute&lt;br /&gt;
||Attribute name in SAML assertion that is mapped to user groups in QPR ProcessAnalyzer. The user group names are case sensitive. When a user logs in, the user is added to and removed from groups based on the information in the SAML assertion. If this setting is not configured, users are not added to or removed from groups automatically. Note that the user needs to login for the groups to be synchronized. If a group doesn&#039;t exist in QPR ProcessAnalyzer, that group is skipped.&lt;br /&gt;
&lt;br /&gt;
In the SAML assertion, attributes are in the saml:Assertion &amp;gt; saml:AttributeStatement &amp;gt; saml:Attribute elements (the Name attribute in the saml:Attribute element is used for matching).&lt;br /&gt;
|-&lt;br /&gt;
||SAMLEncryptionCertificate&lt;br /&gt;
||This setting defines a PFX formatted X.509 certificate (defined in RCF 1422) used to encrypt SAML assertions. The public key of the certificate is published in the service provider metadata, where the identity provider can read it and encrypt SAML assertions. QPR ProcessAnalyzer as the service provider uses the corresponding private key of the certificate to decrypt SAML assertions. The setting needs to be a PFX formatted certificate file that is base64 encoded and it doesn&#039;t contain the BEGIN CERTIFICATE etc. header or footer lines. This setting is needed only when using the SAML assertions encryption. Even though this setting is defined, the SAML assertions are not required to be encrypted. More information how to create the certificate file (https://stackoverflow.com/questions/16480846/x-509-private-public-key) and convert it to base64 (https://stackoverflow.com/questions/46959822/base-64-encoded-form-of-the-pfx-file).&lt;br /&gt;
|-&lt;br /&gt;
||SAMLSigningCertificate&lt;br /&gt;
||This setting defines a PFX formatted X.509 certificate (defined in RCF 1422) used to sign SAML authentication requests sent from QPR ProcessAnalyzer to the identity provider. The public key of the certificate is published in the service provider metadata, where the identity provider can read it, to verify the authenticity of the SAML requests. The setting needs to be a PFX formatted certificate file that is base64 encoded and it doesn&#039;t contain the BEGIN CERTIFICATE etc. header or footer lines. If this setting is not defined, the internal hard-coded signing certificate is used. More information how to create the certificate file (https://stackoverflow.com/questions/16480846/x-509-private-public-key) and convert it to base64 (https://stackoverflow.com/questions/46959822/base-64-encoded-form-of-the-pfx-file).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SMTP Server Settings ==&lt;br /&gt;
SMTP server settings are needed for QPR ProcessAnalyzer to send email messages. Email sending is used by the [[Email_Notifications|notifications]] and the [[Generic_Functions_in_QPR_ProcessAnalyzer#SendEmail|SendEmail]] function in the expression language.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Name	!!Description&lt;br /&gt;
|-&lt;br /&gt;
||SmtpServer&lt;br /&gt;
||DNS name, host name or IP address of the SMTP server. Mandatory setting for the email sending to work.&lt;br /&gt;
|-&lt;br /&gt;
||SmtpPort&lt;br /&gt;
||TCP port number of the SMTP server. If not defined, port 25 is used by default.&lt;br /&gt;
|-&lt;br /&gt;
||SmtpAuthenticationUsername&lt;br /&gt;
||User name for authenticating to the SMTP server. If not defined, no authentication is used to connect to the SMTP server.&lt;br /&gt;
|-&lt;br /&gt;
||SmtpFromAddress&lt;br /&gt;
||Email address where email messages sent by QPR ProcessAnalyzer appear to be coming from. This doesn&#039;t need to be a real email address, although the address used may affect email spam filters. The setting configured here is the default email address to use in following cases:&lt;br /&gt;
* &#039;&#039;From address&#039;&#039; is not set for the email notifications&lt;br /&gt;
* &#039;&#039;From&#039;&#039; parameter is not defined for the expression language &#039;&#039;SendEmail&#039;&#039; function&lt;br /&gt;
* &#039;&#039;EmailFrom&#039;&#039; parameter is not defined for the SQL Scripting SendEmail operation&lt;br /&gt;
|-&lt;br /&gt;
||SmtpAuthenticationPassword&lt;br /&gt;
||Password for authenticating to the SMTP server.&lt;br /&gt;
|-&lt;br /&gt;
||SmtpEnableSSL&lt;br /&gt;
||Use value &#039;&#039;&#039;True&#039;&#039;&#039; or &#039;&#039;&#039;False&#039;&#039;&#039; depending whether TLS connection to the SMTP server is used or not. If not defined, &#039;&#039;False&#039;&#039; is the default value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OAuth Client (for External OAuth Server) ==&lt;br /&gt;
QPR ProcessAnalyzer can be used with an external OAuth Server. In this mode, users authenticate to a 3rd party OAuth authentication server which is accepted by QPR ProcessAnalyzer by granting user access.&lt;br /&gt;
&lt;br /&gt;
Having both ExternalOAuthServerConfiguration and SAML authentication configured at the same time is not supported.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Name	!!Description&lt;br /&gt;
|-&lt;br /&gt;
||ExternalOAuthServerConfiguration&lt;br /&gt;
||Used to configure OAuth 2.0 compatible OAuth server settings for server that is used to authenticate the user signing in to ProcessAnalyzer. If not set, external OAuth server will not be used for authentication. If set, contains a string representation of a JSON object that supports the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Authority&#039;&#039;&#039; (string): OAuth authority URL for authentication. E.g., https://accounts.google.com/&lt;br /&gt;
* &#039;&#039;&#039;Audience&#039;&#039;&#039; (string): Mandatory. OAuth audience/client ID for validating OAuth tokens.&lt;br /&gt;
* &#039;&#039;&#039;AuthorizeUrlOverride&#039;&#039;&#039; (string): Override URL for the OAuth authorization endpoint. If empty or not defined, the default URL from the authority&#039;s discovery document is used.&lt;br /&gt;
* &#039;&#039;&#039;TokenUrlOverride&#039;&#039;&#039; (string): Override URL for the OAuth token endpoint. If empty or not defined, the default URL from the authority&#039;s discovery document is used.&lt;br /&gt;
* &#039;&#039;&#039;UserInfoUrlOverride&#039;&#039;&#039; (string): Override URL to fetch user information from the OAuth provider. If empty or not defined, the default URL from the authority&#039;s discovery document is used. Should not be used if OpendID Connect is to be used as access token validation is skipped.&lt;br /&gt;
* &#039;&#039;&#039;ClientSecret&#039;&#039;&#039; (string): OAuth client secret for confidential client authentication. If configured, this value is sent as the client_secret parameter when exchanging authorization codes for tokens.&lt;br /&gt;
* &#039;&#039;&#039;Issuer&#039;&#039;&#039; (string): OAuth issuer for validating OAuth tokens. If empty, the authority URL&#039;s issuer is used.&lt;br /&gt;
* &#039;&#039;&#039;UserNameClaim&#039;&#039;&#039; (string): Name of the claim whose value is to be used as the name of the authenticated user. The default value is &amp;quot;preferred_username&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;UserGroupsClaim&#039;&#039;&#039; (string): Name of the claim whose value is to be used as the names of the user groups the authenticated user belongs to. When a user logs in, the user is added to and removed from groups based on the information in the UserGroupsClaim. If this setting is not configured, users are not added to or removed from groups automatically. Note that the user needs to login for the groups to be synchronized. If a group doesn&#039;t exist in QPR ProcessAnalyzer, that group is skipped. The default value is empty, i.e. groups are not synchronized.&amp;lt;br&amp;gt;&lt;br /&gt;
Example configuration:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;Authority&amp;quot;: &amp;quot;https://accounts.google.com/&amp;quot;,&lt;br /&gt;
  &amp;quot;Audience&amp;quot;: &amp;quot;...&amp;quot;,&lt;br /&gt;
  &amp;quot;ClientSecret&amp;quot;: &amp;quot;...&amp;quot;,&lt;br /&gt;
  &amp;quot;UserNameClaim&amp;quot;: &amp;quot;name&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readonly Information ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot;&lt;br /&gt;
!Name	!!Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:lightgrey;&amp;quot;&amp;gt;DatabaseVersion&amp;lt;/span&amp;gt;&lt;br /&gt;
||Database schema version. It will be updated automatically when the newer version of QPR ProcessAnalyzer Server connects to the database and performs migration for the database schema.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span style=&amp;quot;color:lightgrey;&amp;quot;&amp;gt;InitializationScriptDatabaseVersion&amp;lt;/span&amp;gt;&lt;br /&gt;
||Database version that was when the database was initialized when the software was installed. Do not change this setting.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span style=&amp;quot;color:lightgrey;&amp;quot;&amp;gt;MinimumDatabaseVersion&amp;lt;/span&amp;gt;&lt;br /&gt;
||Minimum allowed database version for QPR ProcessAnalyzer Server connecting to the database. This is a legacy setting and it should not be used.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Languages_and_Localization&amp;diff=28428</id>
		<title>Languages and Localization</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Languages_and_Localization&amp;diff=28428"/>
		<updated>2026-05-28T12:07:26Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63311&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Each users can set their desired language for the user interface. QPR ProcessAnalyzer has the following languages available:&lt;br /&gt;
* English&lt;br /&gt;
* French&lt;br /&gt;
* Spanish&lt;br /&gt;
* German&lt;br /&gt;
* Finnish&lt;br /&gt;
* Swedish&lt;br /&gt;
* Polish&lt;br /&gt;
* Portuguese&lt;br /&gt;
* Ukrainian&lt;br /&gt;
&lt;br /&gt;
== Changing Language ==&lt;br /&gt;
User interface language can be changed in the [[Navigation_Menu#User%20Settings|User Settings dialog]] as follows:&lt;br /&gt;
# [[Getting_Started_with_QPR_ProcessAnalyzer#Logging_in|Login to QPR ProcessAnalyzer]].&lt;br /&gt;
# Open the navigation menu on top left and click &#039;&#039;&#039;User Settings&#039;&#039;&#039;.&lt;br /&gt;
# Choose the desired language in the &#039;&#039;&#039;Language&#039;&#039;&#039; list.&lt;br /&gt;
# Click &#039;&#039;&#039;Save&#039;&#039;&#039; to close the dialog.&lt;br /&gt;
&lt;br /&gt;
The selected language is stored to user settings, so that it is in use when the user logs in the next time (also when using another device).&lt;br /&gt;
&lt;br /&gt;
== Date Format Settings ==&lt;br /&gt;
In addition to the language, the following date presentation related settings can be set for each user in the [[Navigation_Menu#User%20Settings|User Settings dialog]]:&lt;br /&gt;
* &#039;&#039;&#039;Date format&#039;&#039;&#039;: Defines how date values are presented in the user interface. The format can be e.g. MM/dd/yyyy or d.M.yyyy. Following parts can be used in the date format: &#039;&#039;&#039;d&#039;&#039;&#039; (day of month as one or two digits), &#039;&#039;&#039;dd&#039;&#039;&#039; (day of month as two digits), &#039;&#039;&#039;M&#039;&#039;&#039; (month as one or two digits), &#039;&#039;&#039;MM&#039;&#039;&#039; (month as two digits), &#039;&#039;&#039;yy&#039;&#039;&#039; (year as two digits) and &#039;&#039;&#039;yyyy&#039;&#039;&#039; (year as four digits).&lt;br /&gt;
* &#039;&#039;&#039;First day of week&#039;&#039;&#039;: The first day of the week (appearsing in calendars to pick dates).&lt;br /&gt;
* &#039;&#039;&#039;Use 12-hour clock&#039;&#039;&#039;: Whether the 24-hour or 12-hour clock is used to present hours.&lt;br /&gt;
&lt;br /&gt;
Similar to the language, all these settings are remembered for the user.&lt;br /&gt;
&lt;br /&gt;
== Language Support Details ==&lt;br /&gt;
Most texts in the UI are translated, but there are the following exceptions:&lt;br /&gt;
* Process mining data imported to QPR ProcessAnalyzer (e.g. case and event attribute names, event type names, case and event attribute values) needs to be separately translated. See [[Languages and Localization#Content_Translations|Content_Translations]] section below.&lt;br /&gt;
* Some tooltips that contain longer instructions&lt;br /&gt;
* Some special error messages related to the expression language errors&lt;br /&gt;
&lt;br /&gt;
The login page is shown with the system default language, when QPR ProcessAnalyzer is for the first time accessed with a certain device. Language is also stored to the browser&#039;s local storage, so the browser remembers the last used language and in the next time shows the login page in that language.&lt;br /&gt;
&lt;br /&gt;
== Localization Settings for New Users ==&lt;br /&gt;
For system administrators, there are system wide defaults for the localization settings that can be set in the [[PA_Configuration_database_table|configuration table]]:&lt;br /&gt;
* DefaultUiLanguage&lt;br /&gt;
* DefaultDateFormat&lt;br /&gt;
* DefaultFirstDayOfWeek&lt;br /&gt;
* DefaultUse12HourClock&lt;br /&gt;
&lt;br /&gt;
New users have these defaults until the user changes to her/his own settings. In case the administrator needs to change the language for many existing users, the change needs to be done directly to the &#039;&#039;PA_USER_ATTRIBUTE&#039;&#039; table in the database.&lt;br /&gt;
&lt;br /&gt;
== Content Translations ==&lt;br /&gt;
Translations for process mining data (e.g. case and event attribute names, event type names, case and event attribute values) can be provided via the ContentTranslations value in the [[PA_Configuration_database_table#Localization_Settings|configuration table]]. When a valid ContentTranslations value is provided, the translations can be taken into use by selecting the &amp;quot;Content language&amp;quot; in the [[User_Settings|User Settings dialog]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
[[Category: QPR ProcessAnalyzer]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Resources&amp;diff=28426</id>
		<title>Create MCP Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Resources&amp;diff=28426"/>
		<updated>2026-05-27T12:39:00Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Resources ==&lt;br /&gt;
MCP resources are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP resource when the &#039;&#039;&#039;MCP resource&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP resource option. Also, only system administrators can modify scripts that are MCP resources, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Resource:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP resource, give it a name. This name is then used as the MCP resource name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover resources with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP resource&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Resource Settings ==&lt;br /&gt;
The MCP resource is a read-only data entity that provides AI models with external context, files, or background knowledge. When a resource is read, the associated script is executed and the result is returned as text resource contents.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own resource configuration as JSON. Supported values are same as [https://modelcontextprotocol.io/specification/2025-11-25/server/resources#resource here], except for the name which is always generated automatically and can&#039;t be overridden. Defining the resource configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the resource.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the resource, MCP resources provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the resource. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the resource. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;uri&#039;&#039;&#039;: &amp;quot;script:///{scriptId}&amp;quot; where scriptId is the script&#039;s database identifier. This value can&#039;t be modified.&lt;br /&gt;
* &#039;&#039;&#039;mimeType&#039;&#039;&#039;: Mime type of the resource. Defaults to &amp;quot;text/plain&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;annotations&#039;&#039;&#039;: Metadata for filtering and prioritization of the resource content.&lt;br /&gt;
** &#039;&#039;&#039;audience&#039;&#039;&#039; (optional, array of roles): The intended audience for this content. Supported values are: &amp;quot;user&amp;quot; and &amp;quot;assistant&amp;quot;.&lt;br /&gt;
** &#039;&#039;&#039;priority&#039;&#039;&#039; (optional, number): How important this data is, as a decimal number between &amp;quot;0&amp;quot; (lowest) and &amp;quot;1&amp;quot; (highest).&lt;br /&gt;
** &#039;&#039;&#039;lastModified&#039;&#039;&#039; (optional, string): When the resource was last modified, as an ISO 8601 date-time string (e.g. &amp;quot;2025-01-12T15:00:58Z&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;size&#039;&#039;&#039; (integer): Size in bytes.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the resource.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP resource configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Process Mining Data Export&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Exports process mining analysis results as JSON&amp;quot;,&lt;br /&gt;
  &amp;quot;mimeType&amp;quot;: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
  &amp;quot;size&amp;quot;: 102400,&lt;br /&gt;
  &amp;quot;annotations&amp;quot;: {&lt;br /&gt;
    &amp;quot;audience&amp;quot;: [&amp;quot;user&amp;quot;, &amp;quot;assistant&amp;quot;],&lt;br /&gt;
    &amp;quot;priority&amp;quot;: 0.8,&lt;br /&gt;
    &amp;quot;lastModified&amp;quot;: &amp;quot;2025-06-25T10:30:00Z&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/export.png&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/png&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;48x48&amp;quot;]&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;refreshInterval&amp;quot;: &amp;quot;300&amp;quot;,&lt;br /&gt;
    &amp;quot;dataSource&amp;quot;: &amp;quot;process-mining&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28425</id>
		<title>Create MCP Prompts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28425"/>
		<updated>2026-05-27T12:25:47Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Prompts ==&lt;br /&gt;
MCP prompts are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP prompt when the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP prompt option. Also, only system administrators can modify scripts that are MCP prompts, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Prompt:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP prompt, give it a name. This name is then used as the MCP prompt name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover prompts with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Prompt Settings ==&lt;br /&gt;
The prompt description is a concise metadata field that gives an AI agent instructions on how to achieve complex tasks. When a prompt is called, the associated script is executed and the result is returned as a prompt message.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own prompt configuration as JSON. Supported values are same as [https://modelcontextprotocol.io/specification/2025-11-25/server/prompts#prompt here], except for the name which is always generated automatically and can&#039;t be overridden. Defining the prompt configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the prompt.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the prompt, MCP prompts provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the prompt. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the prompt. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;arguments&#039;&#039;&#039;: Following arguments are available to indicate about the MCP prompt:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039; (required, string): The argument name.&lt;br /&gt;
** &#039;&#039;&#039;description&#039;&#039;&#039; (optional, string): A human-readable description of the argument.&lt;br /&gt;
** &#039;&#039;&#039;required&#039;&#039;&#039; (optional, boolean): Whether the argument must be provided.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the prompt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP prompt configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Text Summarizer&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Generates a concise summary of the provided text&amp;quot;,&lt;br /&gt;
  &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;The text content to summarize&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;maxLength&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Maximum length of the summary in characters&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/summarize.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;category&amp;quot;: &amp;quot;text-processing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28424</id>
		<title>Create MCP Prompts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28424"/>
		<updated>2026-05-27T12:19:13Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Prompts ==&lt;br /&gt;
MCP prompts are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP prompt when the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP prompt option. Also, only system administrators can modify scripts that are MCP prompts, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Prompt:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP prompt, give it a name. This name is then used as the MCP prompt name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover prompts with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Prompt Settings ==&lt;br /&gt;
The prompt description is a concise metadata field that gives an AI agent instructions on how to achieve complex tasks. When a prompt is called, the associated script is executed and the result is returned as a prompt message.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own prompt configuration as JSON. Supported values are same as [http://here https://modelcontextprotocol.io/specification/2025-11-25/server/prompts#prompt], except for the name which is always generated automatically and can&#039;t be overridden. Defining the prompt configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the prompt.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the prompt, MCP prompts provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the prompt. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the prompt. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;arguments&#039;&#039;&#039;: Following arguments are available to indicate about the MCP prompt:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039; (required, string): The argument name.&lt;br /&gt;
** &#039;&#039;&#039;description&#039;&#039;&#039; (optional, string): A human-readable description of the argument.&lt;br /&gt;
** &#039;&#039;&#039;required&#039;&#039;&#039; (optional, boolean): Whether the argument must be provided.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the prompt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP prompt configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Text Summarizer&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Generates a concise summary of the provided text&amp;quot;,&lt;br /&gt;
  &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;The text content to summarize&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;maxLength&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Maximum length of the summary in characters&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/summarize.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;category&amp;quot;: &amp;quot;text-processing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28423</id>
		<title>Create MCP Prompts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28423"/>
		<updated>2026-05-27T12:18:08Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Prompts ==&lt;br /&gt;
MCP prompts are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP prompt when the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP prompt option. Also, only system administrators can modify scripts that are MCP prompts, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Prompt:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP prompt, give it a name. This name is then used as the MCP prompt name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover prompts with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Prompt Settings ==&lt;br /&gt;
The prompt description is a concise metadata field that gives an AI agent instructions on how to achieve complex tasks. When a prompt is called, the associated script is executed and the result is returned as a prompt message.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own prompt configuration as JSON. Supported values are same as [http://here https://modelcontextprotocol.io/specification/2025-11-25/server/prompts#prompt], except for the name which is always generated automatically and can&#039;t be overridden. Defining the prompt configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the prompt, MCP prompts provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the prompt. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the prompt. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;arguments&#039;&#039;&#039;: Following arguments are available to indicate about the MCP prompt:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039; (required, string): The argument name.&lt;br /&gt;
** &#039;&#039;&#039;description&#039;&#039;&#039; (optional, string): A human-readable description of the argument.&lt;br /&gt;
** &#039;&#039;&#039;required&#039;&#039;&#039; (optional, boolean): Whether the argument must be provided.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the prompt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP prompt configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Text Summarizer&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Generates a concise summary of the provided text&amp;quot;,&lt;br /&gt;
  &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;The text content to summarize&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;maxLength&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Maximum length of the summary in characters&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/summarize.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;category&amp;quot;: &amp;quot;text-processing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28422</id>
		<title>Create MCP Prompts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28422"/>
		<updated>2026-05-27T12:17:49Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Prompts ==&lt;br /&gt;
MCP prompts are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP prompt when the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP prompt option. Also, only system administrators can modify scripts that are MCP prompts, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Prompt:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP prompt, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover prompts with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Prompt Settings ==&lt;br /&gt;
The prompt description is a concise metadata field that gives an AI agent instructions on how to achieve complex tasks. When a prompt is called, the associated script is executed and the result is returned as a prompt message.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own prompt configuration as JSON. Supported values are same as [http://here https://modelcontextprotocol.io/specification/2025-11-25/server/prompts#prompt], except for the name which is always generated automatically and can&#039;t be overridden. Defining the prompt configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the prompt, MCP prompts provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the prompt. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the prompt. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;arguments&#039;&#039;&#039;: Following arguments are available to indicate about the MCP prompt:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039; (required, string): The argument name.&lt;br /&gt;
** &#039;&#039;&#039;description&#039;&#039;&#039; (optional, string): A human-readable description of the argument.&lt;br /&gt;
** &#039;&#039;&#039;required&#039;&#039;&#039; (optional, boolean): Whether the argument must be provided.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the prompt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP prompt configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Text Summarizer&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Generates a concise summary of the provided text&amp;quot;,&lt;br /&gt;
  &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;The text content to summarize&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;maxLength&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Maximum length of the summary in characters&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/summarize.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;category&amp;quot;: &amp;quot;text-processing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28421</id>
		<title>Create MCP Prompts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28421"/>
		<updated>2026-05-27T12:17:27Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Prompts ==&lt;br /&gt;
MCP prompts are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP prompt when the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP prompt option. Also, only system administrators can modify scripts that are MCP prompts, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Prompt:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP prompt, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover prompts with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Prompt Settings ==&lt;br /&gt;
The prompt description is a concise metadata field that gives an AI agent instructions on how to achieve complex tasks. When a prompt is called, the associated script is executed and the result is returned as a prompt message.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own prompt configuration as JSON. Supported values are same as [http://here https://modelcontextprotocol.io/specification/2025-11-25/server/prompts#prompt], except for the name which is always generated automatically and can&#039;t be overridden. Defining the prompt configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the prompt, MCP prompts provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the prompt. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the prompt. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;arguments&#039;&#039;&#039;: Following arguments are available to indicate about the MCP prompt:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039; (required, string): The argument name.&lt;br /&gt;
** &#039;&#039;&#039;description&#039;&#039;&#039; (optional, string): A human-readable description of the argument.&lt;br /&gt;
** &#039;&#039;&#039;required&#039;&#039;&#039; (optional, boolean): Whether the argument must be provided.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the prompt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP prompt configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Text Summarizer&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Generates a concise summary of the provided text&amp;quot;,&lt;br /&gt;
  &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;The text content to summarize&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;maxLength&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Maximum length of the summary in characters&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/summarize.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;category&amp;quot;: &amp;quot;text-processing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28420</id>
		<title>Create MCP Prompts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28420"/>
		<updated>2026-05-27T12:16:52Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Prompts ==&lt;br /&gt;
MCP prompts are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP prompt when the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP prompt option. Also, only system administrators can modify scripts that are MCP prompts, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Prompt:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP prompt, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover tools with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Prompt Settings ==&lt;br /&gt;
The prompt description is a concise metadata field that gives an AI agent instructions on how to achieve complex tasks. When a prompt is called, the associated script is executed and the result is returned as a prompt message.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own prompt configuration as JSON. Supported values are same as [http://here https://modelcontextprotocol.io/specification/2025-11-25/server/prompts#prompt], except for the name which is always generated automatically and can&#039;t be overridden. Defining the prompt configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the prompt, MCP prompts provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the prompt. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the prompt. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;arguments&#039;&#039;&#039;: Following arguments are available to indicate about the MCP prompt:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039; (required, string): The argument name.&lt;br /&gt;
** &#039;&#039;&#039;description&#039;&#039;&#039; (optional, string): A human-readable description of the argument.&lt;br /&gt;
** &#039;&#039;&#039;required&#039;&#039;&#039; (optional, boolean): Whether the argument must be provided.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the prompt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP prompt configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Text Summarizer&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Generates a concise summary of the provided text&amp;quot;,&lt;br /&gt;
  &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;The text content to summarize&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;maxLength&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Maximum length of the summary in characters&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/summarize.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;category&amp;quot;: &amp;quot;text-processing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28419</id>
		<title>Create MCP Prompts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28419"/>
		<updated>2026-05-27T12:15:34Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Prompts ==&lt;br /&gt;
MCP prompts are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP prompt when the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP prompt option. Also, only system administrators can modify scripts that are MCP prompts, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Tool:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP tool, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover tools with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Prompt Settings ==&lt;br /&gt;
The prompt description is a concise metadata field that gives an AI agent instructions on how to achieve complex tasks. When a prompt is called, the associated script is executed and the result is returned as a prompt message.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own prompt configuration as JSON. Supported values are same as [http://here https://modelcontextprotocol.io/specification/2025-11-25/server/prompts#prompt], except for the name which is always generated automatically and can&#039;t be overridden. Defining the prompt configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the prompt, MCP prompts provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the prompt. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the prompt. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;arguments&#039;&#039;&#039;: Following arguments are available to indicate about the MCP prompt:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039; (required, string): The argument name.&lt;br /&gt;
** &#039;&#039;&#039;description&#039;&#039;&#039; (optional, string): A human-readable description of the argument.&lt;br /&gt;
** &#039;&#039;&#039;required&#039;&#039;&#039; (optional, boolean): Whether the argument must be provided.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the prompt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP prompt configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Text Summarizer&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Generates a concise summary of the provided text&amp;quot;,&lt;br /&gt;
  &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;The text content to summarize&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;maxLength&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Maximum length of the summary in characters&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/summarize.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;category&amp;quot;: &amp;quot;text-processing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28418</id>
		<title>Create MCP Prompts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28418"/>
		<updated>2026-05-27T12:05:07Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Prompts ==&lt;br /&gt;
MCP prompts are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP prompt when the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP prompt option. Only system administrator users can enable the MCP tool option. Also, only system administrators can modify scripts that are MCP prompts, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Tool:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP tool, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover tools with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Prompt Settings ==&lt;br /&gt;
The prompt description is a concise metadata field that gives an AI agent instructions on how to achieve complex tasks. When a prompt is called, the associated script is executed and the result is returned as a prompt message.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own prompt configuration as JSON. Supported values are same as [http://here https://modelcontextprotocol.io/specification/2025-11-25/server/prompts#prompt], except for the name which is always generated automatically and can&#039;t be overridden. Defining the prompt configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the prompt, MCP prompts provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the prompt. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the prompt. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;arguments&#039;&#039;&#039;: Following arguments are available to indicate about the MCP prompt:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039; (required, string): The argument name.&lt;br /&gt;
** &#039;&#039;&#039;description&#039;&#039;&#039; (optional, string): A human-readable description of the argument.&lt;br /&gt;
** &#039;&#039;&#039;required&#039;&#039;&#039; (optional, boolean): Whether the argument must be provided.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the prompt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: a full MCP prompt configuration:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Text Summarizer&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Generates a concise summary of the provided text&amp;quot;,&lt;br /&gt;
  &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;The text content to summarize&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;maxLength&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Maximum length of the summary in characters&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/summarize.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;category&amp;quot;: &amp;quot;text-processing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28417</id>
		<title>Create MCP Prompts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Prompts&amp;diff=28417"/>
		<updated>2026-05-27T12:01:09Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Prompts ==&lt;br /&gt;
MCP prompts are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP prompt when the &#039;&#039;&#039;MCP prompt&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP prompt option. Only system administrator users can enable the MCP tool option. Also, only system administrators can modify scripts that are MCP prompts, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Tool:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP tool, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover tools with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Prompt Settings ==&lt;br /&gt;
The prompt description is a concise metadata field that gives an AI agent instructions on how to achieve complex tasks. When a prompt is called, the associated script is executed and the result is returned as a prompt message.&lt;br /&gt;
&lt;br /&gt;
Every script can define its own prompt configuration as JSON. Supported values are same as [http://here https://modelcontextprotocol.io/specification/2025-11-25/server/prompts#prompt], except for the name which is always generated automatically and can&#039;t be overridden. Defining the prompt configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
In addition to the name of the prompt, MCP prompts provide the following information to the MCP client:&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;: Title of the prompt. Uses the script&#039;s title by default.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039;: Description of the prompt. Uses the script&#039;s description by default.&lt;br /&gt;
* &#039;&#039;&#039;arguments&#039;&#039;&#039;: Following arguments are available to indicate about the MCP prompt:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039; (required, string): The argument name.&lt;br /&gt;
** &#039;&#039;&#039;description&#039;&#039;&#039; (optional, string): A human-readable description of the argument.&lt;br /&gt;
** &#039;&#039;&#039;required&#039;&#039;&#039; (optional, boolean): Whether the argument must be provided.&lt;br /&gt;
* &#039;&#039;&#039;icons&#039;&#039;&#039;: Same as icons for [[Create_MCP_Tools#MCP_Icons|MCP tools]].&lt;br /&gt;
* &#039;&#039;&#039;meta&#039;&#039;&#039;: Metadata about the prompt.&lt;br /&gt;
&lt;br /&gt;
Example prompt configuration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Text Summarizer&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Generates a concise summary of the provided text&amp;quot;,&lt;br /&gt;
  &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;The text content to summarize&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;maxLength&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Maximum length of the summary in characters&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/summarize.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;category&amp;quot;: &amp;quot;text-processing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhilight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Tools&amp;diff=28416</id>
		<title>Create MCP Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Tools&amp;diff=28416"/>
		<updated>2026-05-27T11:32:44Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Tools ==&lt;br /&gt;
MCP tools are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP tool when the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP tool option. Also, only system administrators can modify scripts that are MCP tools, because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Tool:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP tool, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover tools with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Tool Settings ==&lt;br /&gt;
&lt;br /&gt;
=== MCP Tool Description ===&lt;br /&gt;
The tool description is a concise metadata field that tells an AI agent what a tool does and when it should be used. It serves as the primary signal during the agent&#039;s planning and routing phase, where the agent decides which tool (if any) to call in response to a user&#039;s request. The tool description answers two questions for the agent:&lt;br /&gt;
* What does this tool do? – A brief explanation of the tool&#039;s capability.&lt;br /&gt;
* When should the agent use it? – The conditions, scenarios, or trigger signals that indicate this tool is the right choice.&lt;br /&gt;
&lt;br /&gt;
It does not need to explain how to format inputs or how to interpret outputs — those concerns belong to the input parameter descriptions and output schema descriptions, respectively. During planning, agents load all available tool descriptions into their context simultaneously to evaluate which tool best fits the task. This means:&lt;br /&gt;
* Every character in every description costs tokens – across all tools, not just the one ultimately selected.&lt;br /&gt;
* Long descriptions risk truncation – some implementations silently cut off descriptions beyond 1000–2000 characters, potentially hiding critical information.&lt;br /&gt;
* Agents perform better with clear, concise signals – verbose descriptions introduce noise that can confuse tool selection.&lt;br /&gt;
&lt;br /&gt;
=== Input Parameters ===&lt;br /&gt;
MCP tool input parameters are defined using a JSON schema following the [https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage Model Context Protocol&#039;s JSON Schema]. Each supported input parameter is listed under &#039;&#039;&#039;properties&#039;&#039;&#039;. By default, script don&#039;t enforce any schema.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: The following schema defines a script with five different types of parameters:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;stringParameter&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;String parameter&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
	&amp;quot;numberParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Number parameter&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;booleanParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Boolean parameter&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;arrayParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Array parameter&amp;quot;,&lt;br /&gt;
	  &amp;quot;nullable&amp;quot;: true,&lt;br /&gt;
	  &amp;quot;items&amp;quot;: {&lt;br /&gt;
		  &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;&lt;br /&gt;
	  }&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;objectParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Object parameter&amp;quot;,&lt;br /&gt;
	  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
	    &amp;quot;inner&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, the tool can be called, for example, with the following set of parameters:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;stringParameter&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;numberParameter&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;booleanParameter&amp;quot;: true,&lt;br /&gt;
  &amp;quot;arrayParameter&amp;quot;: [ 1, 2, 3 ],&lt;br /&gt;
  &amp;quot;objectParameter&amp;quot;: { &amp;quot;inner&amp;quot;: &amp;quot;test&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structured Tool Output ===&lt;br /&gt;
Structured tool output is described using a JSON schema following the [https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage Model Context Protocol&#039;s JSON Schema]. By default, scripts don&#039;t enforce any schema and the result is considered to be just text. Due to the limitations of MCP protocol, if defined, the top-level object type should be &amp;quot;object&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example: The following example configures the script&#039;s return value to contain an object having the &amp;quot;models&amp;quot; property with information about each model:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;string&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;String value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;number&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Number value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;boolean&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Boolean value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;array&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Array value&amp;quot;,&lt;br /&gt;
      &amp;quot;nullable&amp;quot;: true,&lt;br /&gt;
      &amp;quot;items&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Object value&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;inner&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MCP Tool Metadata ===&lt;br /&gt;
Every script can define its own &#039;&#039;&#039;McpTool&#039;&#039;&#039; configuration as JSON. Supported values are same as [https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool here], except for the &#039;&#039;&#039;name&#039;&#039;&#039; which is always generated automatically and can&#039;t be overridden. Defining the McpTool configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
Following annotations are available to indicate about the MCP tool:&lt;br /&gt;
* &#039;&#039;&#039;destructiveHint&#039;&#039;&#039;: MCP tool call deletes data which might be permanently lost. Some LLM agents ask for confirmation from the user, to make sure that destructive tool calls are not made by mistake.&lt;br /&gt;
* &#039;&#039;&#039;idempotentHint&#039;&#039;&#039;: All MCP tool calls with the same parameters always provide the same result. Some LLM agents may cache tool call results for idempotent MCP tools to improve performance and reduce load from the MCP server.&lt;br /&gt;
* &#039;&#039;&#039;openWorldHint&#039;&#039;&#039;: MCP tool call in the MCP server will use some external services. Open world tool calls are expected to be slower than other tool calls.&lt;br /&gt;
* &#039;&#039;&#039;readOnlyHint&#039;&#039;&#039;: MCP tool call does not change any data, and thus the call may not have any potentially undesired effects. Some LLM agents ask for confirmation from the user, to make sure that tool calls that change data are not made by mistake.&lt;br /&gt;
&lt;br /&gt;
Example: The following JSON configures the MCP tool with a customized title and description, as well as some additional [https://github.com/modelcontextprotocol/csharp-sdk/blob/main/src/ModelContextProtocol.Core/Protocol/ToolAnnotations.cs MCP tool annotations]:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Example MCP tool title&amp;quot;,&lt;br /&gt;
    &amp;quot;annotations&amp;quot;: {&lt;br /&gt;
        &amp;quot;destructiveHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;idempotentHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;openWorldHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;readOnlyHint&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MCP Icons ===&lt;br /&gt;
The MCP tools, prompts, and resources can have icons for visual identification in client user interfaces. Icons are defined in the &#039;&#039;&#039;icons&#039;&#039;&#039; array property in the entity&#039;s MCP configuration.&lt;br /&gt;
&lt;br /&gt;
The icon object has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;src&#039;&#039;&#039; (required): URI pointing to the icon resource. Can be an HTTP/HTTPS URL pointing to an image file. Can be a data URI with base64-encoded image data (e.g. data:image/png;base64,...).&lt;br /&gt;
* &#039;&#039;&#039;mimeType&#039;&#039;&#039; (optional): MIME type of the icon image. Supported values include:&lt;br /&gt;
** &#039;&#039;&#039;image/png&#039;&#039;&#039;: PNG images.&lt;br /&gt;
** &#039;&#039;&#039;image/jpeg&#039;&#039;&#039; or &#039;&#039;&#039;image/jpg&#039;&#039;&#039;: JPEG images.&lt;br /&gt;
** &#039;&#039;&#039;image/svg+xml&#039;&#039;&#039;: SVG images (scalable, but requires security precautions against embedded scripts).&lt;br /&gt;
** &#039;&#039;&#039;image/webp&#039;&#039;&#039;: WebP images.&lt;br /&gt;
* &#039;&#039;&#039;sizes&#039;&#039;&#039; (optional): Array of size specifications at which the icon can be used. Examples: [&amp;quot;48x48&amp;quot;], [&amp;quot;96x96&amp;quot;, &amp;quot;48x48&amp;quot;], [&amp;quot;any&amp;quot;] for scalable formats like SVG. If not provided, clients should assume the icon can be used at any size.&lt;br /&gt;
* &#039;&#039;&#039;theme&#039;&#039;&#039; (optional): Specifies the theme the icon is designed for. If not provided, clients should assume the icon can be used with any theme.&lt;br /&gt;
** &#039;&#039;&#039;light&#039;&#039;&#039;: icon designed for use on a light background.&lt;br /&gt;
** &#039;&#039;&#039;dark&#039;&#039;&#039;: icon designed for use on a dark background.&lt;br /&gt;
&lt;br /&gt;
Example: The following JSON configures the MCP entity to have an icon for both light and dark themes:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/tool.png&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/png&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;48x48&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/tool-dark.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;dark&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing MCP tools using QPR ProcessAnalyzer ==&lt;br /&gt;
When developing MCP tools, it might be useful try test them in QPR ProcessAnalyzer before publishing as MCP tools. Scripts (used as MCP tools) can be called in the [[Navigation_Menu#Expression_Designer|Expression Designer]]. The following example expression calls a script with some parameters and shows the return value as json:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
let returnValue = ScriptById(1).Run(#{&lt;br /&gt;
  &amp;quot;stringParameter&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;numberParameter&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;booleanParameter&amp;quot;: true,&lt;br /&gt;
  &amp;quot;arrayParameter&amp;quot;: [1, 2, 3]&lt;br /&gt;
  &amp;quot;objectParameter&amp;quot;: {&lt;br /&gt;
    &amp;quot;inner&amp;quot;: &amp;quot;test&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
return ToJson(returnValue);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Now, if script having id 1 has the following script source code:&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
#{&lt;br /&gt;
  &amp;quot;string&amp;quot;: stringParameter,&lt;br /&gt;
  &amp;quot;number&amp;quot;: numberParameter,&lt;br /&gt;
  &amp;quot;boolean&amp;quot;: booleanParameter,&lt;br /&gt;
  &amp;quot;array&amp;quot;: arrayParameter,&lt;br /&gt;
  &amp;quot;object&amp;quot;: objectParameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and is configured as specified in the previous chapter, the result of expression will be the following valid JSON object as string:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;string&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;number&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;boolean&amp;quot;: true,&lt;br /&gt;
  &amp;quot;array&amp;quot;: [1,2,3],&lt;br /&gt;
  &amp;quot;object&amp;quot;: {&amp;quot;inner&amp;quot;: &amp;quot;text&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Tools&amp;diff=28415</id>
		<title>Create MCP Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Tools&amp;diff=28415"/>
		<updated>2026-05-27T11:30:17Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Tools ==&lt;br /&gt;
MCP tools are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP tool when the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; option is selected in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP tool checkbox. Also, scripts that are MCP tools, only system administrators can modify them because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Tool:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP tool, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover tools with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; option.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Tool Settings ==&lt;br /&gt;
&lt;br /&gt;
=== MCP Tool Description ===&lt;br /&gt;
The tool description is a concise metadata field that tells an AI agent what a tool does and when it should be used. It serves as the primary signal during the agent&#039;s planning and routing phase, where the agent decides which tool (if any) to call in response to a user&#039;s request. The tool description answers two questions for the agent:&lt;br /&gt;
* What does this tool do? – A brief explanation of the tool&#039;s capability.&lt;br /&gt;
* When should the agent use it? – The conditions, scenarios, or trigger signals that indicate this tool is the right choice.&lt;br /&gt;
&lt;br /&gt;
It does not need to explain how to format inputs or how to interpret outputs — those concerns belong to the input parameter descriptions and output schema descriptions, respectively. During planning, agents load all available tool descriptions into their context simultaneously to evaluate which tool best fits the task. This means:&lt;br /&gt;
* Every character in every description costs tokens – across all tools, not just the one ultimately selected.&lt;br /&gt;
* Long descriptions risk truncation – some implementations silently cut off descriptions beyond 1000–2000 characters, potentially hiding critical information.&lt;br /&gt;
* Agents perform better with clear, concise signals – verbose descriptions introduce noise that can confuse tool selection.&lt;br /&gt;
&lt;br /&gt;
=== Input Parameters ===&lt;br /&gt;
MCP tool input parameters are defined using a JSON schema following the [https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage Model Context Protocol&#039;s JSON Schema]. Each supported input parameter is listed under &#039;&#039;&#039;properties&#039;&#039;&#039;. By default, script don&#039;t enforce any schema.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: The following schema defines a script with five different types of parameters:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;stringParameter&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;String parameter&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
	&amp;quot;numberParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Number parameter&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;booleanParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Boolean parameter&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;arrayParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Array parameter&amp;quot;,&lt;br /&gt;
	  &amp;quot;nullable&amp;quot;: true,&lt;br /&gt;
	  &amp;quot;items&amp;quot;: {&lt;br /&gt;
		  &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;&lt;br /&gt;
	  }&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;objectParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Object parameter&amp;quot;,&lt;br /&gt;
	  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
	    &amp;quot;inner&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, the tool can be called, for example, with the following set of parameters:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;stringParameter&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;numberParameter&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;booleanParameter&amp;quot;: true,&lt;br /&gt;
  &amp;quot;arrayParameter&amp;quot;: [ 1, 2, 3 ],&lt;br /&gt;
  &amp;quot;objectParameter&amp;quot;: { &amp;quot;inner&amp;quot;: &amp;quot;test&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structured Tool Output ===&lt;br /&gt;
Structured tool output is described using a JSON schema following the [https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage Model Context Protocol&#039;s JSON Schema]. By default, scripts don&#039;t enforce any schema and the result is considered to be just text. Due to the limitations of MCP protocol, if defined, the top-level object type should be &amp;quot;object&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example: The following example configures the script&#039;s return value to contain an object having the &amp;quot;models&amp;quot; property with information about each model:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;string&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;String value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;number&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Number value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;boolean&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Boolean value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;array&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Array value&amp;quot;,&lt;br /&gt;
      &amp;quot;nullable&amp;quot;: true,&lt;br /&gt;
      &amp;quot;items&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Object value&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;inner&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MCP Tool Metadata ===&lt;br /&gt;
Every script can define its own &#039;&#039;&#039;McpTool&#039;&#039;&#039; configuration as JSON. Supported values are same as [https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool here], except for the &#039;&#039;&#039;name&#039;&#039;&#039; which is always generated automatically and can&#039;t be overridden. Defining the McpTool configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
Following annotations are available to indicate about the MCP tool:&lt;br /&gt;
* &#039;&#039;&#039;destructiveHint&#039;&#039;&#039;: MCP tool call deletes data which might be permanently lost. Some LLM agents ask for confirmation from the user, to make sure that destructive tool calls are not made by mistake.&lt;br /&gt;
* &#039;&#039;&#039;idempotentHint&#039;&#039;&#039;: All MCP tool calls with the same parameters always provide the same result. Some LLM agents may cache tool call results for idempotent MCP tools to improve performance and reduce load from the MCP server.&lt;br /&gt;
* &#039;&#039;&#039;openWorldHint&#039;&#039;&#039;: MCP tool call in the MCP server will use some external services. Open world tool calls are expected to be slower than other tool calls.&lt;br /&gt;
* &#039;&#039;&#039;readOnlyHint&#039;&#039;&#039;: MCP tool call does not change any data, and thus the call may not have any potentially undesired effects. Some LLM agents ask for confirmation from the user, to make sure that tool calls that change data are not made by mistake.&lt;br /&gt;
&lt;br /&gt;
Example: The following JSON configures the MCP tool with a customized title and description, as well as some additional [https://github.com/modelcontextprotocol/csharp-sdk/blob/main/src/ModelContextProtocol.Core/Protocol/ToolAnnotations.cs MCP tool annotations]:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Example MCP tool title&amp;quot;,&lt;br /&gt;
    &amp;quot;annotations&amp;quot;: {&lt;br /&gt;
        &amp;quot;destructiveHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;idempotentHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;openWorldHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;readOnlyHint&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MCP Icons ===&lt;br /&gt;
The MCP tools, prompts, and resources can have icons for visual identification in client user interfaces. Icons are defined in the &#039;&#039;&#039;icons&#039;&#039;&#039; array property in the entity&#039;s MCP configuration.&lt;br /&gt;
&lt;br /&gt;
The icon object has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;src&#039;&#039;&#039; (required): URI pointing to the icon resource. Can be an HTTP/HTTPS URL pointing to an image file. Can be a data URI with base64-encoded image data (e.g. data:image/png;base64,...).&lt;br /&gt;
* &#039;&#039;&#039;mimeType&#039;&#039;&#039; (optional): MIME type of the icon image. Supported values include:&lt;br /&gt;
** &#039;&#039;&#039;image/png&#039;&#039;&#039;: PNG images.&lt;br /&gt;
** &#039;&#039;&#039;image/jpeg&#039;&#039;&#039; or &#039;&#039;&#039;image/jpg&#039;&#039;&#039;: JPEG images.&lt;br /&gt;
** &#039;&#039;&#039;image/svg+xml&#039;&#039;&#039;: SVG images (scalable, but requires security precautions against embedded scripts).&lt;br /&gt;
** &#039;&#039;&#039;image/webp&#039;&#039;&#039;: WebP images.&lt;br /&gt;
* &#039;&#039;&#039;sizes&#039;&#039;&#039; (optional): Array of size specifications at which the icon can be used. Examples: [&amp;quot;48x48&amp;quot;], [&amp;quot;96x96&amp;quot;, &amp;quot;48x48&amp;quot;], [&amp;quot;any&amp;quot;] for scalable formats like SVG. If not provided, clients should assume the icon can be used at any size.&lt;br /&gt;
* &#039;&#039;&#039;theme&#039;&#039;&#039; (optional): Specifies the theme the icon is designed for. If not provided, clients should assume the icon can be used with any theme.&lt;br /&gt;
** &#039;&#039;&#039;light&#039;&#039;&#039;: icon designed for use on a light background.&lt;br /&gt;
** &#039;&#039;&#039;dark&#039;&#039;&#039;: icon designed for use on a dark background.&lt;br /&gt;
&lt;br /&gt;
Example: The following JSON configures the MCP entity to have an icon for both light and dark themes:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/tool.png&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/png&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;48x48&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/tool-dark.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;dark&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing MCP tools using QPR ProcessAnalyzer ==&lt;br /&gt;
When developing MCP tools, it might be useful try test them in QPR ProcessAnalyzer before publishing as MCP tools. Scripts (used as MCP tools) can be called in the [[Navigation_Menu#Expression_Designer|Expression Designer]]. The following example expression calls a script with some parameters and shows the return value as json:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
let returnValue = ScriptById(1).Run(#{&lt;br /&gt;
  &amp;quot;stringParameter&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;numberParameter&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;booleanParameter&amp;quot;: true,&lt;br /&gt;
  &amp;quot;arrayParameter&amp;quot;: [1, 2, 3]&lt;br /&gt;
  &amp;quot;objectParameter&amp;quot;: {&lt;br /&gt;
    &amp;quot;inner&amp;quot;: &amp;quot;test&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
return ToJson(returnValue);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Now, if script having id 1 has the following script source code:&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
#{&lt;br /&gt;
  &amp;quot;string&amp;quot;: stringParameter,&lt;br /&gt;
  &amp;quot;number&amp;quot;: numberParameter,&lt;br /&gt;
  &amp;quot;boolean&amp;quot;: booleanParameter,&lt;br /&gt;
  &amp;quot;array&amp;quot;: arrayParameter,&lt;br /&gt;
  &amp;quot;object&amp;quot;: objectParameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and is configured as specified in the previous chapter, the result of expression will be the following valid JSON object as string:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;string&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;number&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;boolean&amp;quot;: true,&lt;br /&gt;
  &amp;quot;array&amp;quot;: [1,2,3],&lt;br /&gt;
  &amp;quot;object&amp;quot;: {&amp;quot;inner&amp;quot;: &amp;quot;text&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Tools&amp;diff=28414</id>
		<title>Create MCP Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Tools&amp;diff=28414"/>
		<updated>2026-05-27T11:20:50Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Tools ==&lt;br /&gt;
MCP tools are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP tool when the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; checkbox is enabled in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP tool checkbox. Also, scripts that are MCP tools, only system administrators can modify them because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Tool:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP tool, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover tools with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; checkbox.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Tool Settings ==&lt;br /&gt;
&lt;br /&gt;
=== MCP Tool Description ===&lt;br /&gt;
The tool description is a concise metadata field that tells an AI agent what a tool does and when it should be used. It serves as the primary signal during the agent&#039;s planning and routing phase, where the agent decides which tool (if any) to call in response to a user&#039;s request. The tool description answers two questions for the agent:&lt;br /&gt;
* What does this tool do? – A brief explanation of the tool&#039;s capability.&lt;br /&gt;
* When should the agent use it? – The conditions, scenarios, or trigger signals that indicate this tool is the right choice.&lt;br /&gt;
&lt;br /&gt;
It does not need to explain how to format inputs or how to interpret outputs — those concerns belong to the input parameter descriptions and output schema descriptions, respectively. During planning, agents load all available tool descriptions into their context simultaneously to evaluate which tool best fits the task. This means:&lt;br /&gt;
* Every character in every description costs tokens – across all tools, not just the one ultimately selected.&lt;br /&gt;
* Long descriptions risk truncation – some implementations silently cut off descriptions beyond 1000–2000 characters, potentially hiding critical information.&lt;br /&gt;
* Agents perform better with clear, concise signals – verbose descriptions introduce noise that can confuse tool selection.&lt;br /&gt;
&lt;br /&gt;
=== Input Parameters ===&lt;br /&gt;
MCP tool input parameters are defined using a JSON schema following the [https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage Model Context Protocol&#039;s JSON Schema]. Each supported input parameter is listed under &#039;&#039;&#039;properties&#039;&#039;&#039;. By default, script don&#039;t enforce any schema.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: The following schema defines a script with five different types of parameters:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;stringParameter&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;String parameter&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
	&amp;quot;numberParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Number parameter&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;booleanParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Boolean parameter&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;arrayParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Array parameter&amp;quot;,&lt;br /&gt;
	  &amp;quot;nullable&amp;quot;: true,&lt;br /&gt;
	  &amp;quot;items&amp;quot;: {&lt;br /&gt;
		  &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;&lt;br /&gt;
	  }&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;objectParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Object parameter&amp;quot;,&lt;br /&gt;
	  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
	    &amp;quot;inner&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, the tool can be called, for example, with the following set of parameters:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;stringParameter&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;numberParameter&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;booleanParameter&amp;quot;: true,&lt;br /&gt;
  &amp;quot;arrayParameter&amp;quot;: [ 1, 2, 3 ],&lt;br /&gt;
  &amp;quot;objectParameter&amp;quot;: { &amp;quot;inner&amp;quot;: &amp;quot;test&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structured Tool Output ===&lt;br /&gt;
Structured tool output is described using a JSON schema following the [https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage Model Context Protocol&#039;s JSON Schema]. By default, scripts don&#039;t enforce any schema and the result is considered to be just text. Due to the limitations of MCP protocol, if defined, the top-level object type should be &amp;quot;object&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example: The following example configures the script&#039;s return value to contain an object having the &amp;quot;models&amp;quot; property with information about each model:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;string&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;String value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;number&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Number value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;boolean&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Boolean value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;array&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Array value&amp;quot;,&lt;br /&gt;
      &amp;quot;nullable&amp;quot;: true,&lt;br /&gt;
      &amp;quot;items&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Object value&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;inner&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MCP Tool Metadata ===&lt;br /&gt;
Every script can define its own &#039;&#039;&#039;McpTool&#039;&#039;&#039; configuration as JSON. Supported values are same as [https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool here], except for the &#039;&#039;&#039;name&#039;&#039;&#039; which is always generated automatically and can&#039;t be overridden. Defining the McpTool configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
Following annotations are available to indicate about the MCP tool:&lt;br /&gt;
* &#039;&#039;&#039;destructiveHint&#039;&#039;&#039;: MCP tool call deletes data which might be permanently lost. Some LLM agents ask for confirmation from the user, to make sure that destructive tool calls are not made by mistake.&lt;br /&gt;
* &#039;&#039;&#039;idempotentHint&#039;&#039;&#039;: All MCP tool calls with the same parameters always provide the same result. Some LLM agents may cache tool call results for idempotent MCP tools to improve performance and reduce load from the MCP server.&lt;br /&gt;
* &#039;&#039;&#039;openWorldHint&#039;&#039;&#039;: MCP tool call in the MCP server will use some external services. Open world tool calls are expected to be slower than other tool calls.&lt;br /&gt;
* &#039;&#039;&#039;readOnlyHint&#039;&#039;&#039;: MCP tool call does not change any data, and thus the call may not have any potentially undesired effects. Some LLM agents ask for confirmation from the user, to make sure that tool calls that change data are not made by mistake.&lt;br /&gt;
&lt;br /&gt;
Example: The following JSON configures the MCP tool with a customized title and description, as well as some additional [https://github.com/modelcontextprotocol/csharp-sdk/blob/main/src/ModelContextProtocol.Core/Protocol/ToolAnnotations.cs MCP tool annotations]:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Example MCP tool title&amp;quot;,&lt;br /&gt;
    &amp;quot;annotations&amp;quot;: {&lt;br /&gt;
        &amp;quot;destructiveHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;idempotentHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;openWorldHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;readOnlyHint&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MCP Icons ===&lt;br /&gt;
The MCP tools, prompts, and resources can have icons for visual identification in client user interfaces. Icons are defined in the &#039;&#039;&#039;icons&#039;&#039;&#039; array property in the entity&#039;s MCP configuration.&lt;br /&gt;
&lt;br /&gt;
The icon object has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;src&#039;&#039;&#039; (required): URI pointing to the icon resource. Can be an HTTP/HTTPS URL pointing to an image file. Can be a data URI with base64-encoded image data (e.g. data:image/png;base64,...).&lt;br /&gt;
* &#039;&#039;&#039;mimeType&#039;&#039;&#039; (optional): MIME type of the icon image. Supported values include:&lt;br /&gt;
** &#039;&#039;&#039;image/png&#039;&#039;&#039;: PNG images.&lt;br /&gt;
** &#039;&#039;&#039;image/jpeg&#039;&#039;&#039; or &#039;&#039;&#039;image/jpg&#039;&#039;&#039;: JPEG images.&lt;br /&gt;
** &#039;&#039;&#039;image/svg+xml&#039;&#039;&#039;: SVG images (scalable, but requires security precautions against embedded scripts).&lt;br /&gt;
** &#039;&#039;&#039;image/webp&#039;&#039;&#039;: WebP images.&lt;br /&gt;
* &#039;&#039;&#039;sizes&#039;&#039;&#039; (optional): Array of size specifications at which the icon can be used. Examples: [&amp;quot;48x48&amp;quot;], [&amp;quot;96x96&amp;quot;, &amp;quot;48x48&amp;quot;], [&amp;quot;any&amp;quot;] for scalable formats like SVG. If not provided, clients should assume the icon can be used at any size.&lt;br /&gt;
* &#039;&#039;&#039;theme&#039;&#039;&#039; (optional): Specifies the theme the icon is designed for. If not provided, clients should assume the icon can be used with any theme.&lt;br /&gt;
** &#039;&#039;&#039;light&#039;&#039;&#039;: icon designed for use on a light background.&lt;br /&gt;
** &#039;&#039;&#039;dark&#039;&#039;&#039;: icon designed for use on a dark background.&lt;br /&gt;
&lt;br /&gt;
Example: The following JSON configures the MCP entity to have an icon for both light and dark themes:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;icons&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/tool.png&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/png&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;48x48&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;light&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;src&amp;quot;: &amp;quot;https://example.com/icons/tool-dark.svg&amp;quot;,&lt;br /&gt;
      &amp;quot;mimeType&amp;quot;: &amp;quot;image/svg+xml&amp;quot;,&lt;br /&gt;
      &amp;quot;sizes&amp;quot;: [&amp;quot;any&amp;quot;],&lt;br /&gt;
      &amp;quot;theme&amp;quot;: &amp;quot;dark&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing MCP tools using QPR ProcessAnalyzer ==&lt;br /&gt;
When developing MCP tools, it might be useful try test them in QPR ProcessAnalyzer before publishing as MCP tools. Scripts (used as MCP tools) can be called in the [[Navigation_Menu#Expression_Designer|Expression Designer]]. The following example expression calls a script with some parameters and shows the return value as json:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
let returnValue = ScriptById(1).Run(#{&lt;br /&gt;
  &amp;quot;stringParameter&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;numberParameter&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;booleanParameter&amp;quot;: true,&lt;br /&gt;
  &amp;quot;arrayParameter&amp;quot;: [1, 2, 3]&lt;br /&gt;
  &amp;quot;objectParameter&amp;quot;: {&lt;br /&gt;
    &amp;quot;inner&amp;quot;: &amp;quot;test&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
return ToJson(returnValue);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Now, if script having id 1 has the following script source code:&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
#{&lt;br /&gt;
  &amp;quot;string&amp;quot;: stringParameter,&lt;br /&gt;
  &amp;quot;number&amp;quot;: numberParameter,&lt;br /&gt;
  &amp;quot;boolean&amp;quot;: booleanParameter,&lt;br /&gt;
  &amp;quot;array&amp;quot;: arrayParameter,&lt;br /&gt;
  &amp;quot;object&amp;quot;: objectParameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and is configured as specified in the previous chapter, the result of expression will be the following valid JSON object as string:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;string&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;number&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;boolean&amp;quot;: true,&lt;br /&gt;
  &amp;quot;array&amp;quot;: [1,2,3],&lt;br /&gt;
  &amp;quot;object&amp;quot;: {&amp;quot;inner&amp;quot;: &amp;quot;text&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Tools&amp;diff=28413</id>
		<title>Create MCP Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Tools&amp;diff=28413"/>
		<updated>2026-05-27T10:51:35Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Tools ==&lt;br /&gt;
MCP tools are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP tool when the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; checkbox is enabled in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP tool checkbox. Also, scripts that are MCP tools, only system administrators can modify them because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Tool:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP tool, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover tools with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; checkbox.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Tool Settings ==&lt;br /&gt;
&lt;br /&gt;
=== MCP Tool Description ===&lt;br /&gt;
The tool description is a concise metadata field that tells an AI agent what a tool does and when it should be used. It serves as the primary signal during the agent&#039;s planning and routing phase, where the agent decides which tool (if any) to call in response to a user&#039;s request. The tool description answers two questions for the agent:&lt;br /&gt;
* What does this tool do? – A brief explanation of the tool&#039;s capability.&lt;br /&gt;
* When should the agent use it? – The conditions, scenarios, or trigger signals that indicate this tool is the right choice.&lt;br /&gt;
&lt;br /&gt;
It does not need to explain how to format inputs or how to interpret outputs — those concerns belong to the input parameter descriptions and output schema descriptions, respectively. During planning, agents load all available tool descriptions into their context simultaneously to evaluate which tool best fits the task. This means:&lt;br /&gt;
* Every character in every description costs tokens – across all tools, not just the one ultimately selected.&lt;br /&gt;
* Long descriptions risk truncation – some implementations silently cut off descriptions beyond 1000–2000 characters, potentially hiding critical information.&lt;br /&gt;
* Agents perform better with clear, concise signals – verbose descriptions introduce noise that can confuse tool selection.&lt;br /&gt;
&lt;br /&gt;
=== Input Parameters ===&lt;br /&gt;
MCP tool input parameters are defined using a JSON schema following the [https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage Model Context Protocol&#039;s JSON Schema]. Each supported input parameter is listed under &#039;&#039;&#039;properties&#039;&#039;&#039;. By default, script don&#039;t enforce any schema.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: The following schema defines a script with five different types of parameters:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;stringParameter&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;String parameter&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
	&amp;quot;numberParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Number parameter&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;booleanParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Boolean parameter&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;arrayParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Array parameter&amp;quot;,&lt;br /&gt;
	  &amp;quot;nullable&amp;quot;: true,&lt;br /&gt;
	  &amp;quot;items&amp;quot;: {&lt;br /&gt;
		  &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;&lt;br /&gt;
	  }&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;objectParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Object parameter&amp;quot;,&lt;br /&gt;
	  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
	    &amp;quot;inner&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, the tool can be called, for example, with the following set of parameters:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;stringParameter&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;numberParameter&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;booleanParameter&amp;quot;: true,&lt;br /&gt;
  &amp;quot;arrayParameter&amp;quot;: [ 1, 2, 3 ],&lt;br /&gt;
  &amp;quot;objectParameter&amp;quot;: { &amp;quot;inner&amp;quot;: &amp;quot;test&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structured Tool Output ===&lt;br /&gt;
Structured tool output is described using a JSON schema following the [https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage Model Context Protocol&#039;s JSON Schema]. By default, scripts don&#039;t enforce any schema and the result is considered to be just text. Due to the limitations of MCP protocol, if defined, the top-level object type should be &amp;quot;object&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example: The following example configures the script&#039;s return value to contain an object having the &amp;quot;models&amp;quot; property with information about each model:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;string&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;String value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;number&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Number value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;boolean&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Boolean value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;array&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Array value&amp;quot;,&lt;br /&gt;
      &amp;quot;nullable&amp;quot;: true,&lt;br /&gt;
      &amp;quot;items&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Object value&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;inner&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MCP Tool Metadata ===&lt;br /&gt;
Every script can define its own &#039;&#039;&#039;McpTool&#039;&#039;&#039; configuration as JSON. Supported values are same as [https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool here], except for the &#039;&#039;&#039;name&#039;&#039;&#039; which is always generated automatically and can&#039;t be overridden. Defining the McpTool configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&lt;br /&gt;
Following annotations are available to indicate about the MCP tool:&lt;br /&gt;
* &#039;&#039;&#039;destructiveHint&#039;&#039;&#039;: MCP tool call deletes data which might be permanently lost. Some LLM agents ask for confirmation from the user, to make sure that destructive tool calls are not made by mistake.&lt;br /&gt;
* &#039;&#039;&#039;idempotentHint&#039;&#039;&#039;: All MCP tool calls with the same parameters always provide the same result. Some LLM agents may cache tool call results for idempotent MCP tools to improve performance and reduce load from the MCP server.&lt;br /&gt;
* &#039;&#039;&#039;openWorldHint&#039;&#039;&#039;: MCP tool call in the MCP server will use some external services. Open world tool calls are expected to be slower than other tool calls.&lt;br /&gt;
* &#039;&#039;&#039;readOnlyHint&#039;&#039;&#039;: MCP tool call does not change any data, and thus the call may not have any potentially undesired effects. Some LLM agents ask for confirmation from the user, to make sure that tool calls that change data are not made by mistake.&lt;br /&gt;
&lt;br /&gt;
Example: The following JSON configures the MCP tool with a customized title and description, as well as some additional [https://github.com/modelcontextprotocol/csharp-sdk/blob/main/src/ModelContextProtocol.Core/Protocol/ToolAnnotations.cs MCP tool annotations]:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Example MCP tool title&amp;quot;,&lt;br /&gt;
    &amp;quot;annotations&amp;quot;: {&lt;br /&gt;
        &amp;quot;destructiveHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;idempotentHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;openWorldHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;readOnlyHint&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing MCP tools using QPR ProcessAnalyzer ==&lt;br /&gt;
When developing MCP tools, it might be useful try test them in QPR ProcessAnalyzer before publishing as MCP tools. Scripts (used as MCP tools) can be called in the [[Navigation_Menu#Expression_Designer|Expression Designer]]. The following example expression calls a script with some parameters and shows the return value as json:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
let returnValue = ScriptById(1).Run(#{&lt;br /&gt;
  &amp;quot;stringParameter&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;numberParameter&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;booleanParameter&amp;quot;: true,&lt;br /&gt;
  &amp;quot;arrayParameter&amp;quot;: [1, 2, 3]&lt;br /&gt;
  &amp;quot;objectParameter&amp;quot;: {&lt;br /&gt;
    &amp;quot;inner&amp;quot;: &amp;quot;test&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
return ToJson(returnValue);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Now, if script having id 1 has the following script source code:&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
#{&lt;br /&gt;
  &amp;quot;string&amp;quot;: stringParameter,&lt;br /&gt;
  &amp;quot;number&amp;quot;: numberParameter,&lt;br /&gt;
  &amp;quot;boolean&amp;quot;: booleanParameter,&lt;br /&gt;
  &amp;quot;array&amp;quot;: arrayParameter,&lt;br /&gt;
  &amp;quot;object&amp;quot;: objectParameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and is configured as specified in the previous chapter, the result of expression will be the following valid JSON object as string:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;string&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;number&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;boolean&amp;quot;: true,&lt;br /&gt;
  &amp;quot;array&amp;quot;: [1,2,3],&lt;br /&gt;
  &amp;quot;object&amp;quot;: {&amp;quot;inner&amp;quot;: &amp;quot;text&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Managing_Scripts&amp;diff=28412</id>
		<title>Managing Scripts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Managing_Scripts&amp;diff=28412"/>
		<updated>2026-05-27T10:48:07Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In QPR ProcessAnalyzer, scripts can be used for ETL tasks and to automate routines. Scripts are managed in the [[QPR_ProcessAnalyzer_Project_Workspace|Project Workspace]].&lt;br /&gt;
&lt;br /&gt;
=== Running vs. Calling Scripts ===&lt;br /&gt;
&#039;&#039;Running&#039;&#039; a script means starting executing a stored script, which can be done in the UI or using the ScriptLauncher. A script can also &#039;&#039;call&#039;&#039; other scripts during the run. The differences between the running and calling are:&lt;br /&gt;
* Script can run only once at a time, whereas there are no limitations on how many times a script can be called at the same time&lt;br /&gt;
* Script log is written to the running script. No script log is written to the called script.&lt;br /&gt;
* Script status shows whether the script is being run or not. The status does not change, when a script is called from other script.&lt;br /&gt;
&lt;br /&gt;
When a script is running, it&#039;s not possible to start another run of the same script, so the first run needs to end to start new. Scripts can call other scripts and a called scripts can run multiple times simultaneously. In the stack of called scripts, the script log is generated to the top level script. Also the top level script shows that it&#039;s running and the called scripts do not.&lt;br /&gt;
&lt;br /&gt;
=== Scripts List ===&lt;br /&gt;
When selecting a project and opening the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab, all scripts in the project can be seen. Scripts list shows following information:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the script.&lt;br /&gt;
* &#039;&#039;&#039;Status&#039;&#039;&#039;: Status of the script, which is one of following: &#039;&#039;Ready&#039;&#039;, &#039;&#039;Running&#039;&#039; or &#039;&#039;Stopping&#039;&#039;. For more information about script statuses, see below.&lt;br /&gt;
* &#039;&#039;&#039;Last run duration&#039;&#039;&#039;: Duration of the last ended run of the script (the last run result can be any).&lt;br /&gt;
* &#039;&#039;&#039;Last run date&#039;&#039;&#039;: Date and time when the last run ended. If you need to know the last run start time, subtract the &#039;&#039;Last run duration&#039;&#039; from this time.&lt;br /&gt;
* &#039;&#039;&#039;Last run result&#039;&#039;&#039;: Result of the last run of the script. Either of following: &#039;&#039;Completed&#039;&#039;, &#039;&#039;Failed&#039;&#039; or &#039;&#039;Aborted&#039;&#039;. For more information about last run results, see below.&lt;br /&gt;
* &#039;&#039;&#039;Id&#039;&#039;&#039;: Script id that uniquely identifies the script in the system.&lt;br /&gt;
&lt;br /&gt;
Scrips are in either of following statuses:&lt;br /&gt;
* &#039;&#039;&#039;Ready&#039;&#039;&#039;: Script is currently not running, and can be started.&lt;br /&gt;
* &#039;&#039;&#039;Running&#039;&#039;&#039;: Script is currently running, and the script can be stopped. When a script is running, another run of the same script cannot be started.&lt;br /&gt;
* &#039;&#039;&#039;Stopping&#039;&#039;&#039;: Script is currently being stopped. When a script is in this status, the script cannot be started nor stopped, so you need to wait for the script to stop. There may be a delay in stopping a script, depending on the operation currently performed by the script.&lt;br /&gt;
&lt;br /&gt;
The last script run result can be either of the following:&lt;br /&gt;
* &#039;&#039;&#039;Completed&#039;&#039;&#039;: The last run ended successfully, i.e. without any errors or exceptions. Note that despite of the technically successful run, the script might still not work as intended.&lt;br /&gt;
* &#039;&#039;&#039;Failed&#039;&#039;&#039;: The last run ended to an error or exception. To see more information about the reason of the failure, see the [[#Viewing_Script_Log|last run log]].&lt;br /&gt;
* &#039;&#039;&#039;Aborted&#039;&#039;&#039;: The last run was stopped by a user, so the script did not run till the end.&lt;br /&gt;
&lt;br /&gt;
=== Script Properties ===&lt;br /&gt;
To open Script Properties, &#039;&#039;&#039;right-click&#039;&#039;&#039; the script on the Scripts tab in the Workspace and select &#039;&#039;&#039;Properties&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
The Script Properties lists the following information on the &#039;&#039;&#039;General&#039;&#039;&#039; tab:&lt;br /&gt;
* &#039;&#039;&#039;Script ID&#039;&#039;&#039;: A unique ID in the system.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039;: The script&#039;s language, either &amp;quot;SQL&amp;quot; or &amp;quot;Expression&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Status&#039;&#039;&#039;: As above in Scripts List.&lt;br /&gt;
* &#039;&#039;&#039;Last run start&#039;&#039;&#039;: Date and time when the last run started.&lt;br /&gt;
* &#039;&#039;&#039;Last run end&#039;&#039;&#039;: As &amp;quot;Last run date&amp;quot; above in Scripts List.&lt;br /&gt;
* &#039;&#039;&#039;Last run duration&#039;&#039;&#039;: As above in Scripts List.&lt;br /&gt;
* &#039;&#039;&#039;Last run result&#039;&#039;&#039;: As above in Scripts List.&lt;br /&gt;
* &#039;&#039;&#039;Last modified&#039;&#039;&#039;: Date and time when the script was last modified.&lt;br /&gt;
* &#039;&#039;&#039;Last modified by&#039;&#039;&#039;: User who last modified the script.&lt;br /&gt;
* &#039;&#039;&#039;Created&#039;&#039;&#039;: Date and time when the script was created.&lt;br /&gt;
* &#039;&#039;&#039;Created by&#039;&#039;&#039;: User who created the script.&lt;br /&gt;
&lt;br /&gt;
The script Properties has the following information on the &#039;&#039;&#039;Input&#039;&#039;&#039; tab:&lt;br /&gt;
* &#039;&#039;&#039;JSON schema for input parameters&#039;&#039;&#039;: A text box for defining the [[QPR_ProcessAnalyzer_as_MCP_Server#Defining_Input_Parameters|input parameters]].&lt;br /&gt;
&lt;br /&gt;
The script Properties has the following information on the &#039;&#039;&#039;Output&#039;&#039;&#039; tab:&lt;br /&gt;
* &#039;&#039;&#039;JSON schema for script output&#039;&#039;&#039;: A text box for defining the [[QPR_ProcessAnalyzer_as_MCP_Server#Defining_Structured_Tool_Output|output parameters]].&lt;br /&gt;
&lt;br /&gt;
The Script Properties has the following selections on the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab. Changing the selection requires that the user has a global Manage scripts permission:&lt;br /&gt;
* &#039;&#039;&#039;None&#039;&#039;&#039;: The script has no MCP use.&lt;br /&gt;
* &#039;&#039;&#039;MCP tool&#039;&#039;&#039;: The script can be used as an [[QPR_ProcessAnalyzer_as_MCP_Server|MCP]] tool.&lt;br /&gt;
* &#039;&#039;&#039;MCP prompt&#039;&#039;&#039;: The script can be used as an MCP prompt.&lt;br /&gt;
* &#039;&#039;&#039;MCP resource&#039;&#039;&#039;: The script can be used as an MCP resource.&lt;br /&gt;
In addition, when any of the MCP options is selected, there is the text box for defining the MCP tool, MCP prompt, or MCP resource configuration in JSON.&lt;br /&gt;
&lt;br /&gt;
The Script Properties has the following information on the &#039;&#039;&#039;Description&#039;&#039;&#039; tab:&lt;br /&gt;
* A textbox to edit the description of the script.&lt;br /&gt;
&lt;br /&gt;
=== Editing Script ===&lt;br /&gt;
Open the scripts editor as follows:&lt;br /&gt;
# On the left side projects hierarchy, select the project where the script is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script and in the right-click context menu select &#039;&#039;&#039;Edit&#039;&#039;&#039;. Alternatively, you can hover the script and click the &#039;&#039;Edit&#039;&#039; button in the end of the row.&lt;br /&gt;
&lt;br /&gt;
If the script has been defined as an MCP tool, only System Administrators are able to edit the script.&lt;br /&gt;
&lt;br /&gt;
The script editor can show multiple scripts in the tabs, allowing to easily switch between the scrips. The editor remembers all scripts that have been opened during the session.&lt;br /&gt;
&lt;br /&gt;
In the script editor, you can:&lt;br /&gt;
* Run the script by clicking the &#039;&#039;&#039;Run&#039;&#039;&#039; button.&lt;br /&gt;
* Stop a running script by clicking the &#039;&#039;&#039;Stop&#039;&#039;&#039; button.&lt;br /&gt;
* Save a script having unsaved changes by clicking the &#039;&#039;&#039;Save&#039;&#039;&#039; button.&lt;br /&gt;
* To run a script having unsaved changes, click the &#039;&#039;&#039;Save and Run&#039;&#039;&#039; button. Note that the script needs to be saved to run it.&lt;br /&gt;
* To go back to the list of scripts, click the &#039;&#039;&#039;Go back&#039;&#039;&#039; button. If there are unsaved changes in any of the opened scripts, you need to either save or cancel the changes.&lt;br /&gt;
* To close a script, click the &#039;&#039;Close&#039;&#039; button for the tab showing the script. If there are unsaved changes, you need to either save or cancel changes.&lt;br /&gt;
&lt;br /&gt;
=== Starting Script ===&lt;br /&gt;
# On the left side projects hierarchy, select the project where the script is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script and in the right-click context menu select &#039;&#039;&#039;Run&#039;&#039;&#039;. Alternatively, you can hover the script and click the &#039;&#039;Run&#039;&#039; button in the end of the row.&lt;br /&gt;
&lt;br /&gt;
Note that when running a script in the UI, the script must not contain commands where &#039;&#039;ExecuteInClientSide&#039;&#039; is enabled, because that is only supported when running scripts using [[QPR_ProcessAnalyzer_ScriptLauncher|QPR ScriptLauncher]].&lt;br /&gt;
&lt;br /&gt;
=== Stopping Script ===&lt;br /&gt;
# On the left side projects hierarchy, select the project where the script is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script and from the right-click context menu select &#039;&#039;&#039;Stop&#039;&#039;&#039;. Alternatively, you can hover the script and click the &#039;&#039;Stop&#039;&#039; button in the end of the row.&lt;br /&gt;
&lt;br /&gt;
Note that it may take a while for a script to actually stop, depending on what kind of operation the script is executing when it&#039;s stopped.&lt;br /&gt;
&lt;br /&gt;
=== Viewing Script Log ===&lt;br /&gt;
It&#039;s possible to see the script log of the last run, and monitor the currently running script progress. Logs for older runs are not available in the UI, nut they are stored by the system.&lt;br /&gt;
&lt;br /&gt;
To see the logs:&lt;br /&gt;
# On the left side projects hierarchy, select the project where the script is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script and in the right-click context menu select either &#039;&#039;&#039;View last run log&#039;&#039;&#039; or &#039;&#039;&#039;View current run log&#039;&#039;&#039;. (The script needs to be running to open the current run log.)&lt;br /&gt;
# If keeping the current run log open, the latest log entries are updated automatically every two seconds.&lt;br /&gt;
&lt;br /&gt;
More information about [[QPR_ProcessAnalyzer_Logs#Script_Log|Script Log]].&lt;br /&gt;
&lt;br /&gt;
=== Creating Script ===&lt;br /&gt;
# On the left side projects hierarchy, select the project where you want to create a script.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Click the &#039;&#039;&#039;New&#039;&#039;&#039; button and click &#039;&#039;&#039;Script&#039;&#039;&#039;. Define a name for the script and the scripting &#039;&#039;&#039;Language&#039;&#039;&#039; (either &#039;&#039;&#039;Expression&#039;&#039;&#039; or &#039;&#039;&#039;SQL&#039;&#039;&#039;), and then click &#039;&#039;&#039;Create&#039;&#039;&#039;. Note that script names must be unique within a project.&lt;br /&gt;
&lt;br /&gt;
Note that the scripting language cannot be changed after the script has been created, so a new script needs to be created to change the language.&lt;br /&gt;
&lt;br /&gt;
Note that each script in the same project needs to have a unique name.&lt;br /&gt;
&lt;br /&gt;
=== Deleting Script ===&lt;br /&gt;
# Select the project where the script(s) to be deleted are located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select one or several scripts to be deleted.&lt;br /&gt;
# Click the &#039;&#039;&#039;Delete&#039;&#039;&#039; button and click &#039;&#039;&#039;Delete&#039;&#039;&#039; to the confirmation message.&lt;br /&gt;
&lt;br /&gt;
Note that if the script is being run, it cannot be deleted.&lt;br /&gt;
&lt;br /&gt;
=== Renaming Script ===&lt;br /&gt;
# Select the project where the script to be renamed is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script to be renamed.&lt;br /&gt;
# Click the &#039;&#039;&#039;Rename&#039;&#039;&#039; button.&lt;br /&gt;
# Change the script name in the opening dialog and click &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Moving Script ===&lt;br /&gt;
Scripts can be moved by dragging them with the left mouse button from the right side list to the target project in the left side hierarchy. Alternatively, you can first select the scripts, then from the right-click context menu select &#039;&#039;&#039;Move to&#039;&#039;&#039; and finally select the target project.&lt;br /&gt;
&lt;br /&gt;
=== Duplicating Script ===&lt;br /&gt;
# Select the project where the script to be duplicated is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script to be duplicated.&lt;br /&gt;
# Click the &#039;&#039;&#039;Duplicate&#039;&#039;&#039; button. A duplicate of the script is created.&lt;br /&gt;
&lt;br /&gt;
=== Viewing Script Run Results ===&lt;br /&gt;
Script runs can be [[Managing_Scripts#Running_Script|started]] and [[Managing_Scripts#Stopping_Script|stopped]] in the UI. Note that when running scripts using the UI, return values or results of the script cannot be viewed. If you want to use scripts that return data, there are following options:&lt;br /&gt;
* Script can write data to the script log&lt;br /&gt;
* Script can write data to a datatable&lt;br /&gt;
* Script can be called from a dashboard and use the dashboard to present the returned data (see more below).&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Objects_in_Expression_Language&amp;diff=28411</id>
		<title>QPR ProcessAnalyzer Objects in Expression Language</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Objects_in_Expression_Language&amp;diff=28411"/>
		<updated>2026-05-27T10:43:56Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Filter==&lt;br /&gt;
Filters contain a set of filter rules used to filter cases and events in models. Filters are objects located in the models. Filters are owned by the creator user, and when a filter publish mode is private, only the creator can use it.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Filter properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||Returns the user who created the filter.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Returns date when the filter created date.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Returns description of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Returns id of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||Returns user who modified the filter.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Returns date when the filter last modified.&lt;br /&gt;
|-&lt;br /&gt;
||Model&lt;br /&gt;
||Returns model where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ModelId (Integer)&lt;br /&gt;
||Returns model where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Returns the name of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||Project&lt;br /&gt;
||Returns project where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||Returns project id where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||PublishMode (String)&lt;br /&gt;
||Returns publish mode of the filter, one of the following: &#039;&#039;&#039;Private&#039;&#039;&#039;, &#039;&#039;&#039;Public&#039;&#039;&#039;, or &#039;&#039;&#039;Default&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||Rules (Dictionary)&lt;br /&gt;
||Returns a dictionary containing the filter rules in the filter.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Filter functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Deletes the filter permanently. To delete own filters, the &#039;&#039;&#039;Filtering&#039;&#039;&#039; permission is needed, and to delete any filters the &#039;&#039;&#039;ManageViews&#039;&#039;&#039; permission is needed.&lt;br /&gt;
|-&lt;br /&gt;
||Modify&lt;br /&gt;
||Dictionary&lt;br /&gt;
||&lt;br /&gt;
Changes the filter properties. The input parameter is a dictionary containing the filter properties to change:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the filter.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description of the filter.&lt;br /&gt;
* &#039;&#039;&#039;PublishMode&#039;&#039;&#039; (String): Privacy model of the filter rule. One of the following: &#039;&#039;Private&#039;&#039;, &#039;&#039;Public&#039;&#039;, or &#039;&#039;Default&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Rules&#039;&#039;&#039; (Dictionary): Filter rules as Dictionary ([[Filtering_in_QPR_ProcessAnalyzer_Queries|more information]]).&lt;br /&gt;
* &#039;&#039;&#039;ModelId&#039;&#039;&#039; (Integer): Id of the model where the filter is located. Changing this will move the filter into a different model.&lt;br /&gt;
&lt;br /&gt;
The function returns the updated filter object. Requires &#039;&#039;Filtering&#039;&#039; or &#039;&#039;ManageViews&#039;&#039; permission for the project depending on the owner of the filter.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FilterById(1)&lt;br /&gt;
	.Modify(#{&lt;br /&gt;
		&amp;quot;Name&amp;quot;: &amp;quot;My filter&amp;quot;,&lt;br /&gt;
		&amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
		&amp;quot;PublishMode&amp;quot;: &amp;quot;Public&amp;quot;,&lt;br /&gt;
		&amp;quot;Rules&amp;quot;: #{&lt;br /&gt;
			&amp;quot;Items&amp;quot;: [&lt;br /&gt;
				#{&lt;br /&gt;
					&amp;quot;Type&amp;quot;: &amp;quot;IncludeCases&amp;quot;,&lt;br /&gt;
					&amp;quot;Items&amp;quot;: [&lt;br /&gt;
						#{&lt;br /&gt;
							&amp;quot;Type&amp;quot;: &amp;quot;CaseAttributeValue&amp;quot;,&lt;br /&gt;
							&amp;quot;Attribute&amp;quot;: &amp;quot;Account Manager&amp;quot;,&lt;br /&gt;
							&amp;quot;StringifiedValues&amp;quot;: [&lt;br /&gt;
								&amp;quot;0Mary Wilson&amp;quot;&lt;br /&gt;
							]&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get filter id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||FilterById&lt;br /&gt;
||&lt;br /&gt;
* Filter id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns Filter object corresponding to the provided filter id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Model==&lt;br /&gt;
Notes:&lt;br /&gt;
* For in-memory models that are offline, the object counts represent the situation when the model was last time online (loaded into the memory). &#039;&#039;null&#039;&#039; is returned if the model has never been loaded into the memory.&lt;br /&gt;
* If [[Case_Level_Permissions|Case permissions]] are used for the model, and user doesn&#039;t have &#039;&#039;&#039;GenericWrite&#039;&#039;&#039; permission for the model, &#039;&#039;null&#039;&#039; is returned for data security reasons. Users that have the &#039;&#039;&#039;GenericWrite&#039;&#039;&#039; permission, see null when the model is offline, and when online, they see counts where the case level permissions settings are applied.&lt;br /&gt;
* Properties &#039;&#039;CaseAttributes&#039;&#039;, &#039;&#039;EventAttributes&#039;&#039; and &#039;&#039;Eventlog&#039;&#039; work only for the in-memory models and they require the model to be loaded into the memory. If the model is not in the memory, it is loaded when these properties is used. Other model properties down require the model to be in the memory.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||AllFilters (Filter*)&lt;br /&gt;
||Returns an array of all [[#Filter|filters]] in the model the user has access to. In addition to the &#039;&#039;Filters&#039;&#039; property, &#039;&#039;AllFilters&#039;&#039; also returns private filters of other users. The &#039;&#039;ManageViews&#039;&#039; permission is required to use this property - otherwise error is given.&lt;br /&gt;
|-&lt;br /&gt;
||Calendars (BusinessCalendar*)&lt;br /&gt;
||&lt;br /&gt;
Returns all [[Business_Calendar|business calendars]] stored to the Model as an array. Returns an empty array, if there are no business calendars stored to the model. Note: UI allows to set only one business calendar for a Model.&lt;br /&gt;
|-&lt;br /&gt;
||CaseAttributes (AttributeType*)&lt;br /&gt;
||[[#AttributeType|CaseAttributes]] in the model returned in the alphabetical order. Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||CasesDatatable (Datatable)&lt;br /&gt;
||Returns the Datatable the model uses as a datasource for cases. Returns &#039;&#039;null&#039;&#039; if the cases Datatable is not defined or if model uses other than the Datatable datasource.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Returns the Model configuration as dictionary. Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).Configuration.DataSource.Events.DataTableName&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ConfigurationJson (String)&lt;br /&gt;
||Returns the Model configuration as JSON string.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the model.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the model was created.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultCalendar (BusinessCalendar)&lt;br /&gt;
||Returns the default [[Business_Calendar|business calendar]] of the Model. Returns &#039;&#039;null&#039;&#039;, if there are no calendars in the Model or no calendar has been set as a default calendar. Note: UI allows to set only one business calendar for a Model, which is also the default calendar.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFilter (Filter)&lt;br /&gt;
||Default filter of the model. Returns &#039;&#039;null&#039;&#039; if the model does not have a default filter.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFilterId (Integer)&lt;br /&gt;
||Default filter id of the model. Returns &#039;&#039;null&#039;&#039; if the model does not have a default filter.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Model description. The model description may contain line breaks.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedDate (DateTime)&lt;br /&gt;
||Timestamp when Model was deleted (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||DeletedBy (User)&lt;br /&gt;
||User how deleted the Model.&lt;br /&gt;
|-&lt;br /&gt;
||Diagrams (Diagram*)&lt;br /&gt;
||Returns an array of all [[Diagram_in_Expression_Language|diagrams]] in the model.&lt;br /&gt;
|-&lt;br /&gt;
||EstimatedMemory (Integer)&lt;br /&gt;
||Returns an estimation of how much memory in bytes the model requires.&lt;br /&gt;
|-&lt;br /&gt;
||EventsDatatable (Datatable)&lt;br /&gt;
||Returns the Datatable the model uses as a datasource for events. Returns &#039;&#039;null&#039;&#039; if the events Datatable is not defined or if model uses other than the Datatable datasource.&lt;br /&gt;
|-&lt;br /&gt;
||EventAttributes (AttributeType*)&lt;br /&gt;
||[[#AttributeType|EventAttributes]] in the model returned in the alphabetical order. Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||EventLog (EventLog)&lt;br /&gt;
||EventLog containing the entire model (i.e. event log where no filters have been applied). Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||Filters (Filter*)&lt;br /&gt;
||Returns an array of all public [[#Filter|filters]], the default filter (if any) and the user&#039;s own private filters in the model. Note that the other users&#039;s private filters are not returned even for administrators.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Model Id. Model Id is generated by QPR ProcessAnalyzer when the model is created.&lt;br /&gt;
|-&lt;br /&gt;
||IsValidInMemoryModel (boolean)&lt;br /&gt;
||Returns &#039;&#039;true&#039;&#039; if all the following conditions are met:&lt;br /&gt;
* CheckModelValidity function doesn&#039;t return any issues (because invalid models are assumed to be Snowflake models).&lt;br /&gt;
* Model is not an object-centric model.&lt;br /&gt;
* Data source of the model is &#039;&#039;ODBC&#039;&#039; or &#039;&#039;Expression&#039;&#039;, or the referred datatable has &#039;&#039;DataSourceType&#039;&#039; either &#039;&#039;Local&#039;&#039; or &#039;&#039;SqlServer&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last time modified the model properties. Note that datatables containing the eventlog data are separate objects having similar fields to track the last modification and last data import.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the model was modified the last time.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Model name.&lt;br /&gt;
|-&lt;br /&gt;
||NCache (Integer)&lt;br /&gt;
||Number of objects related to the model when the model is loaded into the memory.&lt;br /&gt;
|-&lt;br /&gt;
||NCaseAttributes (Integer)&lt;br /&gt;
||Number of [[#AttributeType|CaseAttributes]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NCases (Integer)&lt;br /&gt;
||Number of [[#Case|Cases]] in the model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEventAttributes (Integer)&lt;br /&gt;
||Number of [[#AttributeType|EventAttributes]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEvents (Integer)&lt;br /&gt;
||Number of [[#Event|Events]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEventTypes (Integer)&lt;br /&gt;
||Number of [[#EventType|EventTypes]] in the model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||Project (Project)&lt;br /&gt;
||[[#Project|Project]] where the model belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||[[#Project|Project]] id where the model belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||Status (String)&lt;br /&gt;
||&lt;br /&gt;
Memory availability status of the model. There are the following statuses:&lt;br /&gt;
* &#039;&#039;&#039;Loading&#039;&#039;&#039;: The model is currently loading into the memory. When the loading is ready, the status changes to &#039;&#039;online&#039;&#039;. If the loading fails, the status changes to &#039;&#039;offline&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Offline&#039;&#039;&#039;: The model is currently not loaded into the memory. The model needs to be loaded into the memory, so that analyses can be calculated from the model (occurs automatically when an analysis is requested).&lt;br /&gt;
* &#039;&#039;&#039;Online&#039;&#039;&#039;: The model is in the memory and ready for analysis calculation. If the model is dropped from the memory, its status changes to &#039;&#039;offline&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||UsedDatatables (Datatable*)&lt;br /&gt;
||Returns all datatables the model uses as a datasource.&lt;br /&gt;
&lt;br /&gt;
Example: List datatables used by a model:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
StringJoin(&amp;quot;, &amp;quot;, OrderByValue(ModelById(1).UsedDataTables.Name))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CalendarByName (BusinessCalendar)&lt;br /&gt;
||&lt;br /&gt;
name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns a [[Business_Calendar|business calendar]] stored to the Model by the name of the calendar. Business calendars can be stored to models in the model properties. Returns &#039;&#039;null&#039;&#039;, if a calendar with the provided name is not stored to the model.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).CalendarByName(&amp;quot;MyCalendar&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateDiagram (Diagram)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||&lt;br /&gt;
Creates a [[Diagram_in_Expression_Language|diagram]] to the model. Parameters is a dictionary containing diagram properties. Following properties are available:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Diagram name that distinguishes diagrams in a model.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Diagram description text.&lt;br /&gt;
* &#039;&#039;&#039;Content&#039;&#039;&#039; (dictionary): Diagram content as dictionary.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1)&lt;br /&gt;
  .CreateDiagram(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My diagram&amp;quot;,&lt;br /&gt;
    &amp;quot;Description&amp;quot;: &amp;quot;This is my new diagram&amp;quot;,&lt;br /&gt;
    &amp;quot;Content&amp;quot;: #{ ... },&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateFilter (Filter)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a filter to a model. Requires &#039;&#039;GenericWrite&#039;&#039; permission for the project and global &#039;&#039;CreateModel&#039;&#039; permission. If a filter with that name already exists in the model, an exception is thrown.&lt;br /&gt;
The parameters dictionary may have the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the filter. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Description of the filter. This property is optional.&lt;br /&gt;
* &#039;&#039;&#039;Rules&#039;&#039;&#039;: Filter rules for the filter defined as a dictionary according to the [[Filtering_in_QPR_ProcessAnalyzer_Queries|filter json format]]. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;PublishMode&#039;&#039;&#039;: Publish mode of the filter which is one of the following: &#039;&#039;Private&#039;&#039;, &#039;&#039;Public&#039;&#039; or &#039;&#039;Default&#039;&#039;. This property is optional, and the default value is &#039;&#039;Private&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let newFilter = modelById(1).CreateFilter(#{    &lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My Filter&amp;quot;,&lt;br /&gt;
  &amp;quot;Rules&amp;quot;: #{&lt;br /&gt;
    &amp;quot;Items&amp;quot;: [#{&lt;br /&gt;
      &amp;quot;Type&amp;quot;: &amp;quot;IncludeCases&amp;quot;,&lt;br /&gt;
      &amp;quot;Items&amp;quot;: [#{&lt;br /&gt;
        &amp;quot;Type&amp;quot;: &amp;quot;CaseAttributeValue&amp;quot;,&lt;br /&gt;
        &amp;quot;Attribute&amp;quot;: &amp;quot;Account Manager&amp;quot;,&lt;br /&gt;
        &amp;quot;StringifiedValues&amp;quot;: [ &amp;quot;0Robert Miller&amp;quot; ]&lt;br /&gt;
      }]&lt;br /&gt;
    }]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;PublishMode&amp;quot;: &amp;quot;Public&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||Deletes the Model permanently. The model doesn&#039;t need to be in the recycle bin to be able to delete it permanently.&lt;br /&gt;
|-&lt;br /&gt;
||Modify (Model)&lt;br /&gt;
||Dictionary&lt;br /&gt;
||&lt;br /&gt;
Modifies model properties. The parameter is a dictionary containing the properties to be changed. Following properties can be changed: &#039;&#039;Name&#039;&#039;, &#039;&#039;Description&#039;&#039;, &#039;&#039;ProjectId&#039;&#039;, and &#039;&#039;Configuration&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The function returns the updated model object. Requires the &#039;&#039;GenericWrite&#039;&#039; permission for the project and the global &#039;&#039;CreateModel&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1)&lt;br /&gt;
	.Modify(#{&lt;br /&gt;
		&amp;quot;Name&amp;quot;: &amp;quot;My model&amp;quot;,&lt;br /&gt;
		&amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
		&amp;quot;ProjectId&amp;quot;: 2,&lt;br /&gt;
		&amp;quot;Configuration&amp;quot;: #{&lt;br /&gt;
			&amp;quot;DataSource&amp;quot;: #{&lt;br /&gt;
				&amp;quot;Cases&amp;quot;: #{&lt;br /&gt;
					&amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;DataTableName&amp;quot;: &amp;quot;My cases datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
						&amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;Events&amp;quot;: #{&lt;br /&gt;
					&amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;DataTableName&amp;quot;: &amp;quot;My events datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
						&amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;,&lt;br /&gt;
						&amp;quot;EventType&amp;quot;: &amp;quot;Event Type&amp;quot;,&lt;br /&gt;
						&amp;quot;Timestamp&amp;quot;: &amp;quot;Start Time&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ResetModelCache&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Synchronously clears all cached model data. For a Snowflake model, deletes all cache tables related to the model from Snowflake. For an in-memory model, drops the model from the memory and also drops all other model related caches from the memory. &lt;br /&gt;
|-&lt;br /&gt;
||ResetPreprocessings&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Removes all cached items related to the Model, e.g. preprocessings and calculation results. In practice, the Model is reset to a state where it was right after the model was loaded into memory.&lt;br /&gt;
|-&lt;br /&gt;
||Restore&lt;br /&gt;
||(none)&lt;br /&gt;
||Restores the Model from the recycle bin back to the original location.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;ToSqlDataFrame&amp;quot;&amp;gt;ToSqlDataFrame&amp;lt;/span&amp;gt;&lt;br /&gt;
||In-memory dataframe&lt;br /&gt;
||Converts an in-memory dataframe to an SQL dataframe. In practice, an SQL query is created from the in-memory dataframe and the query is executed in the datasource so that the data is available in the datasource for further SQL operations. This function is intended only to small amounts of data which is less than 16384 rows.&lt;br /&gt;
&lt;br /&gt;
Example: Select matching cases from events data using in-memory dataframe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let model = ModelById(1);&lt;br /&gt;
let dfEvents = model.EventsDatatable.SqlDataFrame;&lt;br /&gt;
let inMemoryDf = ToDataFrame(&lt;br /&gt;
  [[&amp;quot;1&amp;quot;], [&amp;quot;2&amp;quot;], [&amp;quot;3&amp;quot;]],&lt;br /&gt;
  [#{&amp;quot;Name&amp;quot;: &amp;quot;id&amp;quot;, &amp;quot;DataType&amp;quot;: &amp;quot;String&amp;quot;}]&lt;br /&gt;
);&lt;br /&gt;
model.ToSqlDataFrame(inMemoryDf)&lt;br /&gt;
  .Join(dfEvents, [&amp;quot;id&amp;quot;: &amp;quot;CaseId&amp;quot;])&lt;br /&gt;
  .SelectDistinct([&amp;quot;CaseId&amp;quot;])&lt;br /&gt;
  .Collect();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;TriggerNotifications&amp;quot;&amp;gt;TriggerNotifications&amp;lt;/span&amp;gt; (Boolean)&lt;br /&gt;
||Notification names (String*)&lt;br /&gt;
||Triggers the given notifications for the Model. Notifications are given by their names. Triggering means that the configured rules are run and notification emails are sent as defined by the rules. If the notification names parameter is not provided, all notifications in the Model are triggered.&lt;br /&gt;
&lt;br /&gt;
The function return &#039;&#039;true&#039;&#039; if any notification were triggered, otherwise &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).TriggerNotifications([&amp;quot;Notification 1&amp;quot;, &amp;quot;Notification 2&amp;quot;]);&lt;br /&gt;
Triggers notifications Notification 1 and Notification 2 in model id 123.&lt;br /&gt;
&lt;br /&gt;
ModelById(123).TriggerNotifications();&lt;br /&gt;
Triggers all notifications in model id 123.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CheckModelValidity&amp;quot;&amp;gt;CheckModelValidity&amp;lt;/span&amp;gt; (Object array)&lt;br /&gt;
||CheckData field in dictionary&lt;br /&gt;
||Checks the model validity and returns found issues. The returned data is an array of objects where each object represents one validity error and contains the following properties:&lt;br /&gt;
* &#039;&#039;&#039;IssueType&#039;&#039;&#039; (String): Specifies the issue type.&lt;br /&gt;
* &#039;&#039;&#039;ContextType&#039;&#039;&#039; (String): Context in which the issue was found, and it can be &#039;&#039;&#039;EventDataSource&#039;&#039;&#039;, &#039;&#039;&#039;CaseDataSource&#039;&#039;&#039;, &#039;&#039;&#039;OcelDataSource&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Details&#039;&#039;&#039; (Dictionary): Additional details which depend on the type of the issue.&lt;br /&gt;
&lt;br /&gt;
There are two types of checks available (based on whether the &#039;&#039;&#039;CheckData&#039;&#039;&#039; parameter is defined):&lt;br /&gt;
* &#039;&#039;Lightweight check&#039;&#039;: The check is based on only the configuration data stored in QPR ProcessAnalyzer. This check is very quick and does not require running queries in datasource (e.g., in Snowflake).&lt;br /&gt;
* &#039;&#039;Full check&#039;&#039;: The check is comprehensive and it&#039;s able to detect any validity issues the model may have. The full check requires running queries to the actual data which makes the check slower, and in case of Snowflake, it uses the Snowflake warehouse to run the queries.&lt;br /&gt;
&lt;br /&gt;
The lightweight check is performed automatically by the [[QPR_ProcessAnalyzer_Project_Workspace|Workspace]], so if there are any validity issues that the lightweight check can detect, the Workspace notifies about them immediately. If there are any problems with the model calculation results, it might be a good idea to run the full validity check to confirm whether the problems are due to the model being invalid.&lt;br /&gt;
&lt;br /&gt;
Example: Lightweight check:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(ModelById(1).CheckModelValidity())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Full check:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(ModelById(1).CheckModelValidity(#{ &amp;quot;CheckData&amp;quot;: true }))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CortexAgentsQuery&lt;br /&gt;
||&lt;br /&gt;
||Creates a Snowflake Cortex semantic model (see &#039;&#039;GetSemanticModel&#039;&#039; function) for the process mining model and makes a natural language query on it using Snowflake Cortex Agents. More information: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents. &lt;br /&gt;
&lt;br /&gt;
There are the following parameters:&lt;br /&gt;
# &#039;&#039;&#039;Parameters&#039;&#039;&#039;: Dictionary parameters given to the Cortex Agents REST API query (https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-rest-api). There is a special handling for the following parameters:&lt;br /&gt;
#* &#039;&#039;&#039;model&#039;&#039;&#039;: If not defined, uses the default Cortex Agents model name configured into the database, or if that is not defined, uses &amp;quot;llama3.1-70b&amp;quot;.&lt;br /&gt;
#* &#039;&#039;&#039;_tools&#039;&#039;&#039;: Additional tool_spec of type &amp;quot;cortex_analyst_text_to_sql&amp;quot; will be added to this value with a reference to the generated semantic model.&lt;br /&gt;
#* &#039;&#039;&#039;_tool_resources&#039;&#039;&#039;: Generated semantic model is added as an additional resource.&lt;br /&gt;
# &#039;&#039;&#039;Filter configuration&#039;&#039;&#039;: Can be a string containing filter JSON or a dictionary containing the filter configuration. The semantic model is created for the filtered eventlog. If not defined, the entire model eventlog will be used.&lt;br /&gt;
# &#039;&#039;&#039;Event column role nappings&#039;&#039;&#039;: Mappings to apply for event columns. If not defined, default column mappings are used.&lt;br /&gt;
# &#039;&#039;&#039;Case column role mappings&#039;&#039;&#039;: Mappings to apply for case columns. If not defined, default column mappings are used.&lt;br /&gt;
&lt;br /&gt;
The function returns a dictionary with the following keys:&lt;br /&gt;
# &#039;&#039;&#039;Response&#039;&#039;&#039;: Actual response as a dictionary returned by the Cortex Agents.&lt;br /&gt;
# &#039;&#039;&#039;Response items&#039;&#039;&#039;: Contains processed response consisting of an array of objects having the following properties:&lt;br /&gt;
#* &#039;&#039;&#039;Text&#039;&#039;&#039;: Textual response.&lt;br /&gt;
#* &#039;&#039;&#039;Sql&#039;&#039;&#039;: Response SQL query string. Not mandatory.&lt;br /&gt;
#* &#039;&#039;&#039;SqlDataFrame&#039;&#039;&#039;: SqlDataFrame created for the SQL query in the Sql property. Only present if Sql is present.&lt;br /&gt;
|-&lt;br /&gt;
||GetSemanticModel&lt;br /&gt;
||&lt;br /&gt;
||Creates a Snowflake Cortex Analyst semantic model for the process mining model and returns it as a dictionary. More information: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst/semantic-model-spec.&lt;br /&gt;
&lt;br /&gt;
There are the following parameters:&lt;br /&gt;
# &#039;&#039;&#039;Filter configuration&#039;&#039;&#039;: Can be a string containing filter JSON or a dictionary containing the filter. The semantic model is created for the filtered eventlog. If not defined, the entire model eventlog will be used.&lt;br /&gt;
# &#039;&#039;&#039;Event column role mappings&#039;&#039;&#039;: Mappings to apply for event columns. If not defined, default column mappings are used.&lt;br /&gt;
# &#039;&#039;&#039;Case column role mappings&#039;&#039;&#039;: Mappings to apply for case columns. If not defined, default column mappings are used.&lt;br /&gt;
&lt;br /&gt;
Examples: Returns a semantic model without any filtering applied.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).GetSemanticModel();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get Model by model id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ModelById&lt;br /&gt;
||&lt;br /&gt;
* Model id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Model|Model]] object corresponding to the provided model id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Object-centric model==&lt;br /&gt;
Object-centric models additionally have the following properties and functions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Object-Centric model properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||IsOcelModel (boolean)&lt;br /&gt;
||Returns &#039;&#039;true&#039;&#039; when the model is an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEvents (Datatable)&lt;br /&gt;
||Datatable containing event data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if event datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventToObject (Datatable)&lt;br /&gt;
||Datatable containing event-to-object relations data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if event-to-object relation datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventTypes (Dictionary)&lt;br /&gt;
||Returns a dictionary containing event type names as keys and the datatables holding event data for that event type in this OCEL model as value. An empty array is returned if event types datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable for &amp;quot;Create order&amp;quot; events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).OcelEventTypes.Get(&amp;quot;Create order&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjects (Datatable)&lt;br /&gt;
||Datatable containing objects data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if object datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectToObject (Datatable)&lt;br /&gt;
||Datatable containing object-to-object relations data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if object-to-object relation datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectTypes (Dictionary)&lt;br /&gt;
||Returns a dictionary containing object type names as keys and the datatables holding data for that object type in this OCEL model as value. An empty array is returned if object types have not been configured for this model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Object-centric model functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventType&lt;br /&gt;
||Event type name (String)&lt;br /&gt;
||&lt;br /&gt;
Datatable containing event type attributes of given event type in this OCEL model. Value &#039;&#039;null&#039;&#039; is returned if a datatable is not configured for this model for given event type. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable for &amp;quot;Create order&amp;quot; events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).OcelEventType(&amp;quot;Create order&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectType&lt;br /&gt;
||Object type name (String)&lt;br /&gt;
||Datatable containing object type attributes of given object type in this OCEL model. Value &#039;&#039;null&#039;&#039; is returned if a datatable is not configured for this model for given object type. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectTypeConfiguration&lt;br /&gt;
||Object type name (String)&lt;br /&gt;
||Returns a matching configuration object with the following properties:&amp;lt;br&amp;gt;&lt;br /&gt;
# Datatable: name of the datatable&lt;br /&gt;
# Unit: unit label for object type items&lt;br /&gt;
&#039;&#039;Null&#039;&#039; is returned if the given object type is not found in the model configuration.  &lt;br /&gt;
If the object type name is not specified or &#039;&#039;null&#039;&#039;, the function returns a dictionary containing configurations for all defined object types.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Project properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the Project.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was created.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Project settings as Dictionary object. See example in &#039;&#039;ConfigurationJson&#039;&#039; property.&lt;br /&gt;
|-&lt;br /&gt;
||ConfigurationJson (String)&lt;br /&gt;
||Project settings as json string.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;DefaultLocationInDataSource&amp;quot;: {&lt;br /&gt;
    &amp;quot;Database&amp;quot;: &amp;quot;MyDatabase&amp;quot;,&lt;br /&gt;
    &amp;quot;Schema&amp;quot;: &amp;quot;MySchema&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;ConnectionStringKeys&amp;quot;: {&lt;br /&gt;
    &amp;quot;Snowflake&amp;quot;: &amp;quot;MyKey1&amp;quot;,&lt;br /&gt;
    &amp;quot;SqlServer&amp;quot;: &amp;quot;MyKey2&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Dashboards (Dashboard*)&lt;br /&gt;
||Returns all [[Dashboard_in_Expression_Language|dashboards]] in the project.&lt;br /&gt;
|-&lt;br /&gt;
||Datatables (Datatable*)&lt;br /&gt;
||Returns all Datatables in the project.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was deleted (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Project description. The project description may contain line breaks.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedBy (User)&lt;br /&gt;
||User who deleted the Project (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the Project.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last modified the Project.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was last modified (refers to the project name, description and parent, not the contents of the project).&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Name of the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Models (Model*)&lt;br /&gt;
||Models that are in the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Parent (Project)&lt;br /&gt;
||Parent project, i.e. a Project where the Project is located in the hierarchy of Projects. Returns &#039;&#039;null&#039;&#039; for root level Projects. Throws an error if user doesn&#039;t have access to the parent project.&lt;br /&gt;
|-&lt;br /&gt;
||ParentProjectId (Integer)&lt;br /&gt;
||Parent project id. Returns &#039;&#039;null&#039;&#039; for root level Projects. The parent project id is returned even if user doesn&#039;t have access to the parent project.&lt;br /&gt;
|-&lt;br /&gt;
||Scripts (Script*)&lt;br /&gt;
||Scripts that are in the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Secrets (Dictionary*)&lt;br /&gt;
||Returns array of all [[Storing_Secrets_for_Scripts|secrets]] in the project as Dictionary with following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the secret.&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Type of the secret which is one of the following: &amp;quot;odbc&amp;quot;, &amp;quot;sap&amp;quot;, &amp;quot;salesforce&amp;quot;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Project functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreateDashboard (Dashboard)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a dashboard to the project. &#039;&#039;EditDashboards&#039;&#039; permission to the project is required. The parameter is dictionary with following supported dashboard properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Identifier&#039;&#039;&#039; (String): Identifier of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Content&#039;&#039;&#039; (Dictionary): Content of the dashboard.&lt;br /&gt;
&lt;br /&gt;
Example: Create empty dashboard.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .CreateDashboard(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
    &amp;quot;Identifier&amp;quot;: &amp;quot;MyDashboard&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create dashboard with a chart.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .CreateDashboard(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
    &amp;quot;Content&amp;quot;: #{&lt;br /&gt;
      &amp;quot;version&amp;quot;: 4,&lt;br /&gt;
      &amp;quot;typeName&amp;quot;: &amp;quot;View&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
      &amp;quot;subElements&amp;quot;: [&lt;br /&gt;
        #{&lt;br /&gt;
          &amp;quot;position&amp;quot;: #{&lt;br /&gt;
            &amp;quot;x&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;y&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;width&amp;quot;: 0.5,&lt;br /&gt;
            &amp;quot;height&amp;quot;: 0.5,&lt;br /&gt;
            &amp;quot;zOrder&amp;quot;: 0&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;element&amp;quot;: #{&lt;br /&gt;
            &amp;quot;typeName&amp;quot;: &amp;quot;Chart&amp;quot;,&lt;br /&gt;
            &amp;quot;configuration&amp;quot;: #{&lt;br /&gt;
              &amp;quot;root&amp;quot;: #{&lt;br /&gt;
                &amp;quot;expressionType&amp;quot;: &amp;quot;Cases&amp;quot;,&lt;br /&gt;
                &amp;quot;expressionParameters&amp;quot;: #{}&lt;br /&gt;
              },&lt;br /&gt;
              &amp;quot;measures&amp;quot;: [#{&lt;br /&gt;
                &amp;quot;expressionType&amp;quot;: &amp;quot;Count&amp;quot;,&lt;br /&gt;
                &amp;quot;expressionParameters&amp;quot;: #{}&lt;br /&gt;
              }]&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateDatatable&amp;quot;&amp;gt;CreateDatatable&amp;lt;/span&amp;gt; (Datatable)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Creates datatable to the project. After creation, there are no columns or rows in the datatable. The function returns the created datatable entity. Following properties can be set for the datatable:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the datatable. This parameter is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Description for the datatable. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;NameInDataSource&#039;&#039;&#039; (string): Table name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039; (string): Schema name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039; (string): Database name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Defines where the data for the datatable is located. Available values are &#039;&#039;&#039;Snowflake&#039;&#039;&#039;, &#039;&#039;&#039;SqlServer&#039;&#039;&#039;, and &#039;&#039;&#039;Local&#039;&#039;&#039;.  This parameter is optional and default value is defined by the [[PA_Configuration_database_table#General_Settings|DefaultDataSource]] setting.&lt;br /&gt;
* &#039;&#039;&#039;Connection&#039;&#039;&#039;: Connection object for the datatable. This parameter is optional.&lt;br /&gt;
&lt;br /&gt;
Example: Create a new datatable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create Snowflake datatable linked to a custom table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
  &amp;quot;NameInDataSource&amp;quot;: &amp;quot;MyTable&amp;quot;,&lt;br /&gt;
  &amp;quot;SchemaNameInDataSource&amp;quot;: &amp;quot;MySchema&amp;quot;,&lt;br /&gt;
  &amp;quot;DatabaseNameInDataSource&amp;quot;: &amp;quot;MyDatabase&amp;quot;,&lt;br /&gt;
  &amp;quot;Type&amp;quot;: &amp;quot;Snowflake&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create Snowflake datatable where connection string is stored as a [[Storing_Secrets_for_Scripts|secret]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;,&lt;br /&gt;
  &amp;quot;Type&amp;quot;: &amp;quot;Snowflake&amp;quot;,&lt;br /&gt;
  &amp;quot;Connection&amp;quot;: ProjectById(1).CreateSnowflakeConnection(#{ &amp;quot;OdbcConnectionStringKey&amp;quot;: &amp;quot;MyKey&amp;quot; })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateMeaConnection&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Creates an object representing connection to QPR MEA (QPR Suite) Web Service. The function parameter is a dictionary containing the property &#039;&#039;&#039;ConnectionStringKey&#039;&#039;&#039; which defines the MEA connection string secret name in the same project. When the connection object has been created, MEA Web Service [[QPR_MEA_Integration|queries and other operations]] can be executed using it.&lt;br /&gt;
&lt;br /&gt;
Example: create connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let connection = ProjectByName(&amp;quot;MyProject&amp;quot;).CreateMeaConnection( #{&amp;quot;ConnectionStringKey&amp;quot;: &amp;quot;MyMeaConnection&amp;quot;} );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: use connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let results = connection.QueryObjects(&amp;quot;[PG.785401983.683494101]&amp;quot;, &amp;quot;name, typename&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateModel (Model)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Creates a model to a project. Requires &#039;&#039;GenericWrite&#039;&#039; permission for the Project and global &#039;&#039;CreateModel&#039;&#039; permission. If a model with that name already exists, an exception is thrown.&lt;br /&gt;
&lt;br /&gt;
Parameters dictionary has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the model. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Description of the model. This property is optional.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039;: Configuration dictionary for the model. This property is technically optional, but a working model requires at least datasource settings to be defined.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateModel(#{    &lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My model&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
  &amp;quot;Configuration&amp;quot;: #{&lt;br /&gt;
    &amp;quot;DataSource&amp;quot;: #{&lt;br /&gt;
      &amp;quot;Cases&amp;quot;: #{&lt;br /&gt;
        &amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;DataTableName&amp;quot;: &amp;quot;My cases datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
          &amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;Events&amp;quot;: #{&lt;br /&gt;
        &amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;DataTableName&amp;quot;: &amp;quot;My events datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
           &amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;,&lt;br /&gt;
           &amp;quot;EventType&amp;quot;: &amp;quot;Event Type&amp;quot;,&lt;br /&gt;
           &amp;quot;Timestamp&amp;quot;: &amp;quot;Start Time&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateProject&amp;quot;&amp;gt;CreateProject&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Create a project as a sub-project of the context project. Returns the created project. Requires the &#039;&#039;ManageProject&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Parameters dictionary has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the project. This property is required.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Description of the project.&lt;br /&gt;
* &#039;&#039;&#039;ParentProjectId&#039;&#039;&#039; (integer): Id of the parent project where the new project is created. This parameter is usually not needed because the parent project is the context project. The CreateProject function is also available in the generic context where the &#039;&#039;ParentProjectId&#039;&#039; parameter is needed to create sub-projects.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039; (string): Snowflake database the project is linked to. Data for the datatables in this project will be located in this database.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039; (string): Snowflake schema the project is linked to. Data for the datatables in this project will be located in this schema. If the schema is defined, also the &#039;&#039;DatabaseNameInDataSource&#039;&#039; needs to be defined.&lt;br /&gt;
* &#039;&#039;&#039;SnowflakeConnectionStringKey&#039;&#039;&#039; (string): Snowflake connection string key to be used for the datatables in this project. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;, &lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;, &lt;br /&gt;
  &amp;quot;DatabaseNameInDataSource&amp;quot;: &amp;quot;My database&amp;quot;, &lt;br /&gt;
  &amp;quot;SchemaNameInDataSource&amp;quot;: &amp;quot;My schema&amp;quot; &lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateScript (Script)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a new script to the project. The parameter is a dictionary containing the following script properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the script. This is a mandatory parameter. Note that it&#039;s not possible to create multiple scripts with the same name in the same project.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Optional description text of the script.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039; (String): Language of the script. Options: &#039;&#039;Expression&#039;&#039; (default), or &#039;&#039;SQL&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039; (String): Script code.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039; (Dictionary): Script json configuration.&lt;br /&gt;
&lt;br /&gt;
The function returns the created script object. Using the function requires &#039;&#039;ManageScripts&#039;&#039; permission for the project, and additionally &#039;&#039;RunScripts&#039;&#039; for SQL scripts.&lt;br /&gt;
&lt;br /&gt;
Example: Create an expression script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateScript(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My expression script&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;WriteLog(\&amp;quot;Hello world!\&amp;quot;);&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create an SQL script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateScript(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My SQL script&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;This is an example SQL script...&amp;quot;,&lt;br /&gt;
  &amp;quot;Language&amp;quot;: &amp;quot;SQL&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;SELECT * FROM table;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DatatableByName (Datatable)&lt;br /&gt;
||Datatable name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Datatable by its name located in the project. Returns null, if Datatable with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).DatatableByName(&amp;quot;MyDatatable1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable by name, and create it if it doesn&#039;t exist:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let project = ProjectById(123);&lt;br /&gt;
let datatableName = &amp;quot;MyDatatable1&amp;quot;;&lt;br /&gt;
let datatable = project.DatatableByName(datatableName);&lt;br /&gt;
if (datatable == null) {&lt;br /&gt;
  datatable = project.CreateDatatable(datatableName);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||Deletes the Project permanently. Note that the Project doesn&#039;t need to be in the recycle bin to be able to delete it permanently.&lt;br /&gt;
|-&lt;br /&gt;
||Export (String)&lt;br /&gt;
||(none)&lt;br /&gt;
||Exports the project and its content to a json string. The json format is described in [[Projects Export File Format]].&lt;br /&gt;
&lt;br /&gt;
Example: Export project id 1 to json data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).Export();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Import&lt;br /&gt;
||JSON string&lt;br /&gt;
||Creates one or several projects from a json string. The project(s) are created as child projects of the context project. The json format is described in [[Projects Export File Format]]. The function returns the created project objects. In case the project names already exist, the import operation automatically adjusts the names to be unique.&lt;br /&gt;
&lt;br /&gt;
Example: Create project from json data (as child of project id 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let jsonData = `{ &amp;quot;Projects&amp;quot;: [ { &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot; } ] }`;&lt;br /&gt;
let result = ProjectById(1).Import(jsonData);&lt;br /&gt;
let createdProjectId = result[&amp;quot;Projects&amp;quot;][0].Id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Restore&lt;br /&gt;
||(none)&lt;br /&gt;
||Restores the Project from the recycle bin back to the original location.&lt;br /&gt;
|-&lt;br /&gt;
||ModelByName (Model)&lt;br /&gt;
||Model name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Model by its name located in the project. Returns null, if Model with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).ModelByName(&amp;quot;My Model 1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;ModifyProject&amp;quot;&amp;gt;Modify&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||Dictionary of settings to change&lt;br /&gt;
||&lt;br /&gt;
Change project settings. Following settings are supported:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the project.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description text of the project.&lt;br /&gt;
* &#039;&#039;&#039;ParentProjectId&#039;&#039;&#039; (Integer): Parent project id. Changing this effectively moves the project into different parent project.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039;: Name of the Snowflake database where the project&#039;s datatables are located. The database needs to exist in the same Snowflake account configured in the Snowflake connection string. When defining this setting, define also the &#039;&#039;SchemaNameInDataSource&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039;: Name of the Snowflake schema where the project&#039;s datatables are located. The schema needs to exist in the same Snowflake account configured in the Snowflake connection string. When defining this setting, define also the &#039;&#039;DatabaseNameInDataSource&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;SnowflakeConnectionStringKey&#039;&#039;&#039; (String): Snowflake connection string key for the project. Snowflake datatables in the project will use connection string behind this key (unless specified by the datatatable).&lt;br /&gt;
* &#039;&#039;&#039;SqlServerConnectionStringKey&#039;&#039;&#039; (String): SQL Server connection string key. SQL Server datatables in the project will use connection string behind this key (unless specified by the datatatable).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ManageProject&#039;&#039; permission is needed to change project properties.&lt;br /&gt;
&lt;br /&gt;
Example: Change project name and move project into other parent project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .Modify(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Project 1&amp;quot;&lt;br /&gt;
    &amp;quot;ParentProjectId&amp;quot;: 2&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set Snowflake connection string key for the project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .Modify(#{&lt;br /&gt;
    &amp;quot;SnowflakeConnectionStringKey&amp;quot;: &amp;quot;MyKey1&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ScriptByName (Script)&lt;br /&gt;
||Script name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Script by its name located in the project. Returns null, if Script with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).ScriptByName(&amp;quot;MyScript1&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;SetSecret&amp;quot;&amp;gt;SetSecret&amp;lt;/span&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
# Secret type (string)&lt;br /&gt;
# Secret name (string)&lt;br /&gt;
# Secret value (string)&lt;br /&gt;
||Sets or adds a [[Storing_Secrets_for_Scripts|secret]] for the project. Setting the secret value to &#039;&#039;null&#039;&#039; removes the secret. There can be several secrets with the same name in the same project if the type of the secret is different. Setting secrets requires the project specific &#039;&#039;ManageProject&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Secret type which is one of the following:&lt;br /&gt;
#* &amp;quot;externaldatatableconnection&amp;quot;: Snowflake ODBC connection string for datatables.&lt;br /&gt;
#* &amp;quot;odbc&amp;quot;: ODBC connection string (e.g., to extract data in scripts, or load an in-memory model).&lt;br /&gt;
#* &amp;quot;oledb&amp;quot;: OleDB connection string (e.g., to extract data in scripts, or load an in-memory model).&lt;br /&gt;
#* &amp;quot;sap&amp;quot;: SAP password.&lt;br /&gt;
#* &amp;quot;salesforce&amp;quot;: Salesforce password.&lt;br /&gt;
#* &amp;quot;sql&amp;quot;: SQL Server connection string.&lt;br /&gt;
#* &amp;quot;qprmea&amp;quot;: QPR MEA connection string.&lt;br /&gt;
# &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Secret name, used to refer to the secret in the commands.&lt;br /&gt;
# &#039;&#039;&#039;Value&#039;&#039;&#039; (string): Secret value which contains the confidential information.&lt;br /&gt;
&lt;br /&gt;
Example: Set SAP password:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).SetSecret(&amp;quot;sap&amp;quot;, &amp;quot;MySapPassword&amp;quot;, &amp;quot;I l0ve 5AP!&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Remove SAP password:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).SetSecret(&amp;quot;sap&amp;quot;, &amp;quot;MySapPassword&amp;quot;, null);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Functions to get project:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ProjectById&lt;br /&gt;
||Project id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns project object corresponding to the provided project id.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectByName&lt;br /&gt;
||Project name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns project object by given project name. If there is no such project or user doesn&#039;t have access to it, &#039;&#039;null&#039;&#039; value is returned. If there are multiple projects with the same name, one of them is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let project = ProjectByName(&amp;quot;My Project&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Functions to create project:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateProject&amp;quot;&amp;gt;CreateProject&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Create a project. This is a similar function as the [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#CreateProject|CreateProject function]] in the project context. This function in the generic context is needed to create root-level projects (which don&#039;t have parent project).&lt;br /&gt;
&lt;br /&gt;
Example: create a root project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: create a sub-project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;&lt;br /&gt;
  &amp;quot;ParentProjectId&amp;quot;: 1&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;Import&amp;quot;&amp;gt;Import&amp;lt;/span&amp;gt; (Project*)&lt;br /&gt;
||JSON string&lt;br /&gt;
||Creates one or several projects from a json string. The project(s) are created as the root level projects. The json format is described in [[Projects Export File Format]]. The function returns the created project objects. In case the project names already exist, the import operation automatically adjusts the names to be unique.&lt;br /&gt;
&lt;br /&gt;
Example: Create a root level project from json data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let jsonData = `{ &amp;quot;Projects&amp;quot;: [ { &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot; } ] }`;&lt;br /&gt;
let result = Import(jsonData);&lt;br /&gt;
let createdProjectId = result[&amp;quot;Projects&amp;quot;][0].Id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Script ==&lt;br /&gt;
Scripts are entities that contain executable code, that can be run. Usually scripts contains ETL routines but also other kind of tasks are possible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Script properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Code (String)&lt;br /&gt;
||Script code.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Script&#039;s configuration.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the Script.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the Script was created.&lt;br /&gt;
|-&lt;br /&gt;
||CurrentRunStart (DateTime)&lt;br /&gt;
||Timestamp of the current run start. Null if the script is currently not running.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Description of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||Language (String)&lt;br /&gt;
||Either of the following scripting language: &#039;&#039;&#039;Expression&#039;&#039;&#039; or &#039;&#039;&#039;SQL&#039;&#039;&#039;. When language is Expression, the script is run as an expression script, and when language is SQL, the script is run as an SQL script (using the sandbox database).&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last modified the Script.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the Script was last modified.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunEnd (DateTime)&lt;br /&gt;
||Timestamp of the last completed script run end (either successful completion or failure). Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunResult (String)&lt;br /&gt;
||Result of the last run. Options are:&lt;br /&gt;
* &#039;&#039;&#039;Completed&#039;&#039;&#039;: The last run was completed successfully.&lt;br /&gt;
* &#039;&#039;&#039;Failed&#039;&#039;&#039;: An error occurred during the last run, so likely the script did not complete as intended.&lt;br /&gt;
* &#039;&#039;&#039;Aborted&#039;&#039;&#039;: Script run was manually stopped prematurely by a user, so the script did not proceeded in the end.&lt;br /&gt;
&lt;br /&gt;
Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunStart (DateTime)&lt;br /&gt;
||Timestamp of the last completed script run start time. Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Name of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||OperationId (Integer)&lt;br /&gt;
||Id of the operation which runs the Script. Null if the script is currently not running.&lt;br /&gt;
|-&lt;br /&gt;
||Project (Project)&lt;br /&gt;
||Project where the Script is located. Null if the script is in the global context.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||Id of the project where the Script is located. Null if the script is in the global context.&lt;br /&gt;
|-&lt;br /&gt;
||Status (String)&lt;br /&gt;
||Current status of the script. Options are:&lt;br /&gt;
* &#039;&#039;&#039;Ready&#039;&#039;&#039;: Script is not running. In this status, the script can be started (changing the status to &#039;&#039;Running&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Running&#039;&#039;&#039;: Script is running. In this status, the script can be stopped (changing the status to &#039;&#039;Stopping&#039;&#039;). Calling stop just requests a script to stop, and the actual stopping occurs some time later.&lt;br /&gt;
* &#039;&#039;&#039;Stopping&#039;&#039;&#039;: Script has been requested to be stopped, but it&#039;s still running. In this status, neither start nor stop can be called for the script. When the script eventually stops, its status changes to &#039;&#039;Ready&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpTool (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP tool or not.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpPrompt (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP prompt or not.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpResource (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP resource or not.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Script functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Deletes the script permanently. To delete an expression script, &#039;&#039;&#039;ManageScripts&#039;&#039;&#039; permission for the project is needed, and to delete an SQL script, global &#039;&#039;&#039;RunScripts&#039;&#039;&#039; permission and &#039;&#039;&#039;ManageScripts&#039;&#039;&#039; permission for the project is needed.&lt;br /&gt;
|-&lt;br /&gt;
||Modify&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Modifies properties of a script. The parameter is a dictionary of properties to change:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the script.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description text of the script.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039; (String): Language of the script, either &#039;&#039;Expression&#039;&#039; or &#039;&#039;SQL&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039; (String): Script code.&lt;br /&gt;
* &#039;&#039;&#039;ProjectId&#039;&#039;&#039; (Integer): Id of the project where the script is located. Changing this property moves the script into a different project.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039; (Dictionary): Script json configuration.&lt;br /&gt;
&lt;br /&gt;
Requires &#039;&#039;ManageScripts&#039;&#039; permissions in the project. Additionally, requires &#039;&#039;RunScripts&#039;&#039; permission for SQL scripts.&lt;br /&gt;
&lt;br /&gt;
Example: Rename script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;Updated script&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Change multiple properties in the same call:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;Updated script&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;Updated description&amp;quot;,&lt;br /&gt;
  &amp;quot;Language&amp;quot;: &amp;quot;SQL&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;SELECT 1&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Move script to a different project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;ProjectId&amp;quot;: ProjectByName(&amp;quot;My project&amp;quot;).Id&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Run (Object)&lt;br /&gt;
||Dictionary of parameters&lt;br /&gt;
||&lt;br /&gt;
Runs the script using the provided parameters. The parameters are available in the script as variables (see the example). Any type of variables can be passed to the script. Note that if the script assumes certain variables, but that they are not passed to the script, the script run will throw an error. &lt;br /&gt;
&lt;br /&gt;
For SQL scripts, the passed parameters are available in the script as variables in format &#039;&#039;&#039;@_parameter_&amp;lt;ParameterName&amp;gt;&#039;&#039;&#039; where &amp;lt;ParameterName&amp;gt; is the name of the parameter, e.g. &#039;&#039;parameter_myParameter1&#039;&#039;. Only string type of parameters can be used, so any other type of data in parameter values is converted into strings.&lt;br /&gt;
&lt;br /&gt;
The return value of the script is returned by the Run function. Expression scripts return a value with the &#039;&#039;return&#039;&#039; statement or alternatively the result of the last line of the script is the return value. If the script does not return any value, the Run function returns &#039;&#039;_empty&#039;&#039;. For SQL scripts, the return value is the last dataset produced by the script (returned as a DataFrame) (SQL scripts might create several datasets using the &#039;&#039;--#ShowReport&#039;&#039; command or the &#039;&#039;Show&#039;&#039; parameter).&lt;br /&gt;
&lt;br /&gt;
When a script is called using the Run function, the called script status does not change, because it&#039;s the parent script that is &#039;&#039;Running&#039;&#039;. Also the called script log is not filled, but instead the logging goes to the calling script.&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to call a script using the Run function several times simultaneously.&lt;br /&gt;
&lt;br /&gt;
If there is an error when running the called script, the Run function throws the error to the calling script.&lt;br /&gt;
&lt;br /&gt;
Scripts are run in the script entity context, so for example the following properties are available:&lt;br /&gt;
* Id: Script id&lt;br /&gt;
* Name: Script name&lt;br /&gt;
* Project.Id: Project id where the script is located&lt;br /&gt;
* Project.Name: Name of the project where the script is located&lt;br /&gt;
&lt;br /&gt;
Example: Following script (id 123) raises a specified number to a specified power:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return Pow(numberToRaise, exponent);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script can be called as follows (returning 16):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runResult = ScriptById(123).Run(#{&lt;br /&gt;
  &amp;quot;numberToRaise&amp;quot;: 4,&lt;br /&gt;
  &amp;quot;exponent&amp;quot;: 2&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;Start&amp;quot;&amp;gt;Start&amp;lt;/span&amp;gt;&lt;br /&gt;
||Dictionary of parameters&lt;br /&gt;
||Starts the script. The function call doesn&#039;t wait for the script run to complete (i.e., asynchronous behavior) which is same as starting the script in the [[Managing_Scripts#Starting_Script|Workspace]].&lt;br /&gt;
&lt;br /&gt;
Parameters to the script can be provided as a dictionary of name-value pairs (which is not possible when script is started in the Workspace). Return value is the script run id (integer) if the script was started. If the script is already running, return value is &#039;&#039;null&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: Start script (without parameters) and store the script run id:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runId = ScriptById(1).Start();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Start script with passing parameters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Start(#{&lt;br /&gt;
  &amp;quot;variable1&amp;quot;: &amp;quot;val1&amp;quot;,&lt;br /&gt;
  &amp;quot;variable2&amp;quot;: 5&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Stop&lt;br /&gt;
||&lt;br /&gt;
||Stops the script. The operation doesn&#039;t wait for the stopping to complete (i.e., asynchronous behavior) which is same as stopping the script in the [[Managing_Scripts#Stopping_Script|Workspace]]. Depending on the operation that the script is performing, the stopping might take some time.&lt;br /&gt;
&lt;br /&gt;
Return value is the script run id (integer) if the script was running. If the script isn&#039;t running, the return value is &#039;&#039;null&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runId = ScriptById(1).Stop();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get a script by the script id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ScriptById&lt;br /&gt;
||&lt;br /&gt;
* Script id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns Script object corresponding to the given script id. If script with the given id doesn&#039;t exist or user doesn&#039;t have permissions to it, an error is given.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User/Group ==&lt;br /&gt;
User objects represents users and user groups. Note that some properties can only be used for users and some for groups.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;User/group properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||Returns the user who created the user.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Returns the date when the user was created.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultDashboard (String)&lt;br /&gt;
||Returns the configured [[User_Settings#Starting_dashboard|starting dashboard]] (&amp;quot;default dashboard&amp;quot;) identifier for a group (for users, the starting dashboard cannot be configured). The starting dashboard is automatically opened when a user logs in.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Description of the user.&lt;br /&gt;
|-&lt;br /&gt;
||EffectiveDefaultDashboard (String)&lt;br /&gt;
||Returns the [[User_Settings#Starting_dashboard|starting dashboard]] of a user. Value &#039;&#039;null&#039;&#039; means that the user doesn&#039;t have a starting dashboard. The starting dashboard comes from the user&#039;s groups. If multiple of user&#039;s groups have the starting dashboard defined, the user&#039;s starting dashboard will be taken from a group having alphabetically the first name.&lt;br /&gt;
|-&lt;br /&gt;
||Email (String)&lt;br /&gt;
||Email address of the user.&lt;br /&gt;
|-&lt;br /&gt;
||FullName (String)&lt;br /&gt;
||Full name of the user or group name.&lt;br /&gt;
|-&lt;br /&gt;
||GlobalPermissions (String*)&lt;br /&gt;
||Array of global [[Roles and Permissions#Global_and_Project_Roles|permissions]] of the user. Global permissions come from the global roles assigned to the user and groups that the user belongs to. Note that to get the effective permissions for certain objects, also project specific permissions need to be taken into account.&lt;br /&gt;
|-&lt;br /&gt;
||GroupMemberNames (String*)&lt;br /&gt;
||Array of names of members of a user group. This property is available for groups.&lt;br /&gt;
|-&lt;br /&gt;
||GroupMembers (User*)&lt;br /&gt;
||Array of members of a user group. This property is available for groups.&lt;br /&gt;
|-&lt;br /&gt;
||GroupNames (String*)&lt;br /&gt;
||Array of names of user groups the user belongs to. This property is available for users.&lt;br /&gt;
|-&lt;br /&gt;
||Groups (User*)&lt;br /&gt;
||Array of user groups the user belongs to. This property is available for users.&lt;br /&gt;
|-&lt;br /&gt;
||HasPassword (Boolean)&lt;br /&gt;
||Returns true if user has a password defined in QPR ProcessAnalyzer and thus user can authenticate using the password. If user doesn&#039;t have a password, the SAML authentication is the only way to log in. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property for other users.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the user, which is unique for every user.&lt;br /&gt;
|-&lt;br /&gt;
||IsActive (Boolean)&lt;br /&gt;
||Returns true only if the user is active (not disabled).&lt;br /&gt;
|-&lt;br /&gt;
||IsGroup (Boolean)&lt;br /&gt;
||Returns true if the user is a user group.&lt;br /&gt;
|-&lt;br /&gt;
||IsLocked (Boolean)&lt;br /&gt;
||Returns true if user account is currently [[User_Session_Management#Preventing_password_guessing_attacks|locked]]. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property.&lt;br /&gt;
|-&lt;br /&gt;
||LastLockedDate (DateTime)&lt;br /&gt;
||Returns date when user account was locked the last time. Returns &#039;&#039;null&#039;&#039; if the user account has never been locked. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property.&lt;br /&gt;
|-&lt;br /&gt;
||LastLoginDate (DateTime)&lt;br /&gt;
||Returns date when the user made last successful login. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property for other users.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||Returns the user who last modified this user.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Returns the date when the user was last modified.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Login name of the user or group.&lt;br /&gt;
|-&lt;br /&gt;
||Roles (Object**)&lt;br /&gt;
||&lt;br /&gt;
Returns all roles of the user (both global and project roles) as a nested array structure.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(Users.Where(name == &amp;quot;qpr&amp;quot;).Roles)&lt;br /&gt;
Returns (for example):&lt;br /&gt;
[&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:1&amp;quot;}, &amp;quot;Administrator&amp;quot;],&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:2&amp;quot;}, &amp;quot;Analyzer&amp;quot;],&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:3&amp;quot;}, &amp;quot;Viewer&amp;quot;],&lt;br /&gt;
  [null, &amp;quot;RunScripts&amp;quot;],&lt;br /&gt;
  [null, &amp;quot;Administrator&amp;quot;]&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;User/group functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||EffectivePermissionsFor (String Array)&lt;br /&gt;
||&lt;br /&gt;
* Project to get permissions&lt;br /&gt;
||&lt;br /&gt;
Returns effective (actual) permission of the user to the given project. Project is given as a [[#Project|project object]] (not as a project id). Effective permissions determine the actual permissions that the user has, i.e. a combination of all permissions assigned to the user and groups the user belong to, including both project specific and global roles.&lt;br /&gt;
&lt;br /&gt;
Permissions for the EffectivePermissionsFor function are as follows:&lt;br /&gt;
* All users can query their own permissions&lt;br /&gt;
* To get permissions for any user, the user needs to have [[Roles_and_Permissions|ManageUsers permission]].&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;inactive&#039;&#039; users don&#039;t have any effective permissions, so the EffectivePermissionsFor function does not return any permissions for those users.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1).EffectivePermissionsFor(ModelById(2).Project)&lt;br /&gt;
Returns (for example): [&amp;quot;EditDashboards&amp;quot;, &amp;quot;Filtering&amp;quot;, &amp;quot;GenericRead&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||GetAttribute&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Returns user attribute value by given attribute name and optionally by the model/project/dashboard context. Supported data types are String, Integer, Float, and DateTime. To store more complex data types, data can be converted into json and stored as string. If the attribute doesn&#039;t exist, null is returned.&lt;br /&gt;
&lt;br /&gt;
For example, if using dashboard as context, the attributes are effectively bound to each user and each dashboard separately. Thus, there can be several attributes with the same name as long as the dashboard is different.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Attribute name&#039;&#039;&#039; (String): Name of the attribute.&lt;br /&gt;
# &#039;&#039;&#039;Attribute context&#039;&#039;&#039; (Project/Model/Dashboard): Optional context object the attribute is linked to.&lt;br /&gt;
&lt;br /&gt;
Users have permissions to get attributes for themselves, and also (administrator) users with global &#039;&#039;ManageUsers&#039;&#039; permission can get attributes for all users. In addition, if using the context object, the &#039;&#039;GenericRead&#039;&#039; permission is required for the context object.&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for myself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CurrentUser&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for user John:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Users&lt;br /&gt;
  .Where(Name==&amp;quot;John&amp;quot;)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for user 1 related to dashboard id 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;, DashboardById(1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||SetAttribute&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Sets user attribute value for given attribute name and optionally for the model/project/dashboard context. Supported data types are String, Integer, Float, and DateTime. To store more complex data types, data can be converted into json and stored as string. If setting value &#039;&#039;null&#039;&#039;, the user attribute is removed. Required permissions are same as in the GetAttribute function.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Attribute name&#039;&#039;&#039; (String): Name of the attribute.&lt;br /&gt;
# &#039;&#039;&#039;Attribute value&#039;&#039;&#039; (String/Integer/Float/DateTime): Attribute value to be stored.&lt;br /&gt;
# &#039;&#039;&#039;Attribute context&#039;&#039;&#039; (Project/Model/Dashboard): Optional context object the attribute value is linked to.&lt;br /&gt;
&lt;br /&gt;
Example: Set user attribute MyDataValue for myself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CurrentUser&lt;br /&gt;
  .SetAttribute(&amp;quot;MyDataValue &amp;quot;, &amp;quot;value&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set value 123 as user attribute MyDataValue for user John:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Users&lt;br /&gt;
  .Where(Name==&amp;quot;John&amp;quot;)&lt;br /&gt;
  .SetAttribute(&amp;quot;MyDataValue&amp;quot;, 123);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set current time as user attribute MyDataValue for user 1 related to dashboard id 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;, Now, DashboardById(1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get User by user id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||UserById (User)&lt;br /&gt;
||&lt;br /&gt;
* User id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns User object that has the provided user id. Also groups can be queried with this function. Returns an access denied error if the user with given id does not exist or the current user does not have access to it.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Objects_in_Expression_Language&amp;diff=28410</id>
		<title>QPR ProcessAnalyzer Objects in Expression Language</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=QPR_ProcessAnalyzer_Objects_in_Expression_Language&amp;diff=28410"/>
		<updated>2026-05-27T10:43:11Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Filter==&lt;br /&gt;
Filters contain a set of filter rules used to filter cases and events in models. Filters are objects located in the models. Filters are owned by the creator user, and when a filter publish mode is private, only the creator can use it.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Filter properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||Returns the user who created the filter.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Returns date when the filter created date.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Returns description of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Returns id of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||Returns user who modified the filter.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Returns date when the filter last modified.&lt;br /&gt;
|-&lt;br /&gt;
||Model&lt;br /&gt;
||Returns model where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ModelId (Integer)&lt;br /&gt;
||Returns model where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Returns the name of the filter.&lt;br /&gt;
|-&lt;br /&gt;
||Project&lt;br /&gt;
||Returns project where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||Returns project id where the filter belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||PublishMode (String)&lt;br /&gt;
||Returns publish mode of the filter, one of the following: &#039;&#039;&#039;Private&#039;&#039;&#039;, &#039;&#039;&#039;Public&#039;&#039;&#039;, or &#039;&#039;&#039;Default&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||Rules (Dictionary)&lt;br /&gt;
||Returns a dictionary containing the filter rules in the filter.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Filter functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Deletes the filter permanently. To delete own filters, the &#039;&#039;&#039;Filtering&#039;&#039;&#039; permission is needed, and to delete any filters the &#039;&#039;&#039;ManageViews&#039;&#039;&#039; permission is needed.&lt;br /&gt;
|-&lt;br /&gt;
||Modify&lt;br /&gt;
||Dictionary&lt;br /&gt;
||&lt;br /&gt;
Changes the filter properties. The input parameter is a dictionary containing the filter properties to change:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the filter.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description of the filter.&lt;br /&gt;
* &#039;&#039;&#039;PublishMode&#039;&#039;&#039; (String): Privacy model of the filter rule. One of the following: &#039;&#039;Private&#039;&#039;, &#039;&#039;Public&#039;&#039;, or &#039;&#039;Default&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Rules&#039;&#039;&#039; (Dictionary): Filter rules as Dictionary ([[Filtering_in_QPR_ProcessAnalyzer_Queries|more information]]).&lt;br /&gt;
* &#039;&#039;&#039;ModelId&#039;&#039;&#039; (Integer): Id of the model where the filter is located. Changing this will move the filter into a different model.&lt;br /&gt;
&lt;br /&gt;
The function returns the updated filter object. Requires &#039;&#039;Filtering&#039;&#039; or &#039;&#039;ManageViews&#039;&#039; permission for the project depending on the owner of the filter.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FilterById(1)&lt;br /&gt;
	.Modify(#{&lt;br /&gt;
		&amp;quot;Name&amp;quot;: &amp;quot;My filter&amp;quot;,&lt;br /&gt;
		&amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
		&amp;quot;PublishMode&amp;quot;: &amp;quot;Public&amp;quot;,&lt;br /&gt;
		&amp;quot;Rules&amp;quot;: #{&lt;br /&gt;
			&amp;quot;Items&amp;quot;: [&lt;br /&gt;
				#{&lt;br /&gt;
					&amp;quot;Type&amp;quot;: &amp;quot;IncludeCases&amp;quot;,&lt;br /&gt;
					&amp;quot;Items&amp;quot;: [&lt;br /&gt;
						#{&lt;br /&gt;
							&amp;quot;Type&amp;quot;: &amp;quot;CaseAttributeValue&amp;quot;,&lt;br /&gt;
							&amp;quot;Attribute&amp;quot;: &amp;quot;Account Manager&amp;quot;,&lt;br /&gt;
							&amp;quot;StringifiedValues&amp;quot;: [&lt;br /&gt;
								&amp;quot;0Mary Wilson&amp;quot;&lt;br /&gt;
							]&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get filter id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||FilterById&lt;br /&gt;
||&lt;br /&gt;
* Filter id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns Filter object corresponding to the provided filter id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Model==&lt;br /&gt;
Notes:&lt;br /&gt;
* For in-memory models that are offline, the object counts represent the situation when the model was last time online (loaded into the memory). &#039;&#039;null&#039;&#039; is returned if the model has never been loaded into the memory.&lt;br /&gt;
* If [[Case_Level_Permissions|Case permissions]] are used for the model, and user doesn&#039;t have &#039;&#039;&#039;GenericWrite&#039;&#039;&#039; permission for the model, &#039;&#039;null&#039;&#039; is returned for data security reasons. Users that have the &#039;&#039;&#039;GenericWrite&#039;&#039;&#039; permission, see null when the model is offline, and when online, they see counts where the case level permissions settings are applied.&lt;br /&gt;
* Properties &#039;&#039;CaseAttributes&#039;&#039;, &#039;&#039;EventAttributes&#039;&#039; and &#039;&#039;Eventlog&#039;&#039; work only for the in-memory models and they require the model to be loaded into the memory. If the model is not in the memory, it is loaded when these properties is used. Other model properties down require the model to be in the memory.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||AllFilters (Filter*)&lt;br /&gt;
||Returns an array of all [[#Filter|filters]] in the model the user has access to. In addition to the &#039;&#039;Filters&#039;&#039; property, &#039;&#039;AllFilters&#039;&#039; also returns private filters of other users. The &#039;&#039;ManageViews&#039;&#039; permission is required to use this property - otherwise error is given.&lt;br /&gt;
|-&lt;br /&gt;
||Calendars (BusinessCalendar*)&lt;br /&gt;
||&lt;br /&gt;
Returns all [[Business_Calendar|business calendars]] stored to the Model as an array. Returns an empty array, if there are no business calendars stored to the model. Note: UI allows to set only one business calendar for a Model.&lt;br /&gt;
|-&lt;br /&gt;
||CaseAttributes (AttributeType*)&lt;br /&gt;
||[[#AttributeType|CaseAttributes]] in the model returned in the alphabetical order. Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||CasesDatatable (Datatable)&lt;br /&gt;
||Returns the Datatable the model uses as a datasource for cases. Returns &#039;&#039;null&#039;&#039; if the cases Datatable is not defined or if model uses other than the Datatable datasource.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Returns the Model configuration as dictionary. Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).Configuration.DataSource.Events.DataTableName&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ConfigurationJson (String)&lt;br /&gt;
||Returns the Model configuration as JSON string.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the model.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the model was created.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultCalendar (BusinessCalendar)&lt;br /&gt;
||Returns the default [[Business_Calendar|business calendar]] of the Model. Returns &#039;&#039;null&#039;&#039;, if there are no calendars in the Model or no calendar has been set as a default calendar. Note: UI allows to set only one business calendar for a Model, which is also the default calendar.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFilter (Filter)&lt;br /&gt;
||Default filter of the model. Returns &#039;&#039;null&#039;&#039; if the model does not have a default filter.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultFilterId (Integer)&lt;br /&gt;
||Default filter id of the model. Returns &#039;&#039;null&#039;&#039; if the model does not have a default filter.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Model description. The model description may contain line breaks.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedDate (DateTime)&lt;br /&gt;
||Timestamp when Model was deleted (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||DeletedBy (User)&lt;br /&gt;
||User how deleted the Model.&lt;br /&gt;
|-&lt;br /&gt;
||Diagrams (Diagram*)&lt;br /&gt;
||Returns an array of all [[Diagram_in_Expression_Language|diagrams]] in the model.&lt;br /&gt;
|-&lt;br /&gt;
||EstimatedMemory (Integer)&lt;br /&gt;
||Returns an estimation of how much memory in bytes the model requires.&lt;br /&gt;
|-&lt;br /&gt;
||EventsDatatable (Datatable)&lt;br /&gt;
||Returns the Datatable the model uses as a datasource for events. Returns &#039;&#039;null&#039;&#039; if the events Datatable is not defined or if model uses other than the Datatable datasource.&lt;br /&gt;
|-&lt;br /&gt;
||EventAttributes (AttributeType*)&lt;br /&gt;
||[[#AttributeType|EventAttributes]] in the model returned in the alphabetical order. Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||EventLog (EventLog)&lt;br /&gt;
||EventLog containing the entire model (i.e. event log where no filters have been applied). Using this property requires that the model is loaded in the memory. If the model is not in the memory, it&#039;s loaded when this property is used.&lt;br /&gt;
|-&lt;br /&gt;
||Filters (Filter*)&lt;br /&gt;
||Returns an array of all public [[#Filter|filters]], the default filter (if any) and the user&#039;s own private filters in the model. Note that the other users&#039;s private filters are not returned even for administrators.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Model Id. Model Id is generated by QPR ProcessAnalyzer when the model is created.&lt;br /&gt;
|-&lt;br /&gt;
||IsValidInMemoryModel (boolean)&lt;br /&gt;
||Returns &#039;&#039;true&#039;&#039; if all the following conditions are met:&lt;br /&gt;
* CheckModelValidity function doesn&#039;t return any issues (because invalid models are assumed to be Snowflake models).&lt;br /&gt;
* Model is not an object-centric model.&lt;br /&gt;
* Data source of the model is &#039;&#039;ODBC&#039;&#039; or &#039;&#039;Expression&#039;&#039;, or the referred datatable has &#039;&#039;DataSourceType&#039;&#039; either &#039;&#039;Local&#039;&#039; or &#039;&#039;SqlServer&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last time modified the model properties. Note that datatables containing the eventlog data are separate objects having similar fields to track the last modification and last data import.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the model was modified the last time.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Model name.&lt;br /&gt;
|-&lt;br /&gt;
||NCache (Integer)&lt;br /&gt;
||Number of objects related to the model when the model is loaded into the memory.&lt;br /&gt;
|-&lt;br /&gt;
||NCaseAttributes (Integer)&lt;br /&gt;
||Number of [[#AttributeType|CaseAttributes]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NCases (Integer)&lt;br /&gt;
||Number of [[#Case|Cases]] in the model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEventAttributes (Integer)&lt;br /&gt;
||Number of [[#AttributeType|EventAttributes]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEvents (Integer)&lt;br /&gt;
||Number of [[#Event|Events]] in model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||NEventTypes (Integer)&lt;br /&gt;
||Number of [[#EventType|EventTypes]] in the model. Works only for in-memory models.&lt;br /&gt;
|-&lt;br /&gt;
||Project (Project)&lt;br /&gt;
||[[#Project|Project]] where the model belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||[[#Project|Project]] id where the model belongs to.&lt;br /&gt;
|-&lt;br /&gt;
||Status (String)&lt;br /&gt;
||&lt;br /&gt;
Memory availability status of the model. There are the following statuses:&lt;br /&gt;
* &#039;&#039;&#039;Loading&#039;&#039;&#039;: The model is currently loading into the memory. When the loading is ready, the status changes to &#039;&#039;online&#039;&#039;. If the loading fails, the status changes to &#039;&#039;offline&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Offline&#039;&#039;&#039;: The model is currently not loaded into the memory. The model needs to be loaded into the memory, so that analyses can be calculated from the model (occurs automatically when an analysis is requested).&lt;br /&gt;
* &#039;&#039;&#039;Online&#039;&#039;&#039;: The model is in the memory and ready for analysis calculation. If the model is dropped from the memory, its status changes to &#039;&#039;offline&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||UsedDatatables (Datatable*)&lt;br /&gt;
||Returns all datatables the model uses as a datasource.&lt;br /&gt;
&lt;br /&gt;
Example: List datatables used by a model:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
StringJoin(&amp;quot;, &amp;quot;, OrderByValue(ModelById(1).UsedDataTables.Name))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Model functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CalendarByName (BusinessCalendar)&lt;br /&gt;
||&lt;br /&gt;
name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns a [[Business_Calendar|business calendar]] stored to the Model by the name of the calendar. Business calendars can be stored to models in the model properties. Returns &#039;&#039;null&#039;&#039;, if a calendar with the provided name is not stored to the model.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).CalendarByName(&amp;quot;MyCalendar&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateDiagram (Diagram)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||&lt;br /&gt;
Creates a [[Diagram_in_Expression_Language|diagram]] to the model. Parameters is a dictionary containing diagram properties. Following properties are available:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Diagram name that distinguishes diagrams in a model.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Diagram description text.&lt;br /&gt;
* &#039;&#039;&#039;Content&#039;&#039;&#039; (dictionary): Diagram content as dictionary.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1)&lt;br /&gt;
  .CreateDiagram(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My diagram&amp;quot;,&lt;br /&gt;
    &amp;quot;Description&amp;quot;: &amp;quot;This is my new diagram&amp;quot;,&lt;br /&gt;
    &amp;quot;Content&amp;quot;: #{ ... },&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateFilter (Filter)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a filter to a model. Requires &#039;&#039;GenericWrite&#039;&#039; permission for the project and global &#039;&#039;CreateModel&#039;&#039; permission. If a filter with that name already exists in the model, an exception is thrown.&lt;br /&gt;
The parameters dictionary may have the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the filter. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Description of the filter. This property is optional.&lt;br /&gt;
* &#039;&#039;&#039;Rules&#039;&#039;&#039;: Filter rules for the filter defined as a dictionary according to the [[Filtering_in_QPR_ProcessAnalyzer_Queries|filter json format]]. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;PublishMode&#039;&#039;&#039;: Publish mode of the filter which is one of the following: &#039;&#039;Private&#039;&#039;, &#039;&#039;Public&#039;&#039; or &#039;&#039;Default&#039;&#039;. This property is optional, and the default value is &#039;&#039;Private&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let newFilter = modelById(1).CreateFilter(#{    &lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My Filter&amp;quot;,&lt;br /&gt;
  &amp;quot;Rules&amp;quot;: #{&lt;br /&gt;
    &amp;quot;Items&amp;quot;: [#{&lt;br /&gt;
      &amp;quot;Type&amp;quot;: &amp;quot;IncludeCases&amp;quot;,&lt;br /&gt;
      &amp;quot;Items&amp;quot;: [#{&lt;br /&gt;
        &amp;quot;Type&amp;quot;: &amp;quot;CaseAttributeValue&amp;quot;,&lt;br /&gt;
        &amp;quot;Attribute&amp;quot;: &amp;quot;Account Manager&amp;quot;,&lt;br /&gt;
        &amp;quot;StringifiedValues&amp;quot;: [ &amp;quot;0Robert Miller&amp;quot; ]&lt;br /&gt;
      }]&lt;br /&gt;
    }]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;PublishMode&amp;quot;: &amp;quot;Public&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||Deletes the Model permanently. The model doesn&#039;t need to be in the recycle bin to be able to delete it permanently.&lt;br /&gt;
|-&lt;br /&gt;
||Modify (Model)&lt;br /&gt;
||Dictionary&lt;br /&gt;
||&lt;br /&gt;
Modifies model properties. The parameter is a dictionary containing the properties to be changed. Following properties can be changed: &#039;&#039;Name&#039;&#039;, &#039;&#039;Description&#039;&#039;, &#039;&#039;ProjectId&#039;&#039;, and &#039;&#039;Configuration&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The function returns the updated model object. Requires the &#039;&#039;GenericWrite&#039;&#039; permission for the project and the global &#039;&#039;CreateModel&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1)&lt;br /&gt;
	.Modify(#{&lt;br /&gt;
		&amp;quot;Name&amp;quot;: &amp;quot;My model&amp;quot;,&lt;br /&gt;
		&amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
		&amp;quot;ProjectId&amp;quot;: 2,&lt;br /&gt;
		&amp;quot;Configuration&amp;quot;: #{&lt;br /&gt;
			&amp;quot;DataSource&amp;quot;: #{&lt;br /&gt;
				&amp;quot;Cases&amp;quot;: #{&lt;br /&gt;
					&amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;DataTableName&amp;quot;: &amp;quot;My cases datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
						&amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
				&amp;quot;Events&amp;quot;: #{&lt;br /&gt;
					&amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;DataTableName&amp;quot;: &amp;quot;My events datatable&amp;quot;,&lt;br /&gt;
					&amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
						&amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;,&lt;br /&gt;
						&amp;quot;EventType&amp;quot;: &amp;quot;Event Type&amp;quot;,&lt;br /&gt;
						&amp;quot;Timestamp&amp;quot;: &amp;quot;Start Time&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ResetModelCache&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Synchronously clears all cached model data. For a Snowflake model, deletes all cache tables related to the model from Snowflake. For an in-memory model, drops the model from the memory and also drops all other model related caches from the memory. &lt;br /&gt;
|-&lt;br /&gt;
||ResetPreprocessings&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Removes all cached items related to the Model, e.g. preprocessings and calculation results. In practice, the Model is reset to a state where it was right after the model was loaded into memory.&lt;br /&gt;
|-&lt;br /&gt;
||Restore&lt;br /&gt;
||(none)&lt;br /&gt;
||Restores the Model from the recycle bin back to the original location.&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;ToSqlDataFrame&amp;quot;&amp;gt;ToSqlDataFrame&amp;lt;/span&amp;gt;&lt;br /&gt;
||In-memory dataframe&lt;br /&gt;
||Converts an in-memory dataframe to an SQL dataframe. In practice, an SQL query is created from the in-memory dataframe and the query is executed in the datasource so that the data is available in the datasource for further SQL operations. This function is intended only to small amounts of data which is less than 16384 rows.&lt;br /&gt;
&lt;br /&gt;
Example: Select matching cases from events data using in-memory dataframe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let model = ModelById(1);&lt;br /&gt;
let dfEvents = model.EventsDatatable.SqlDataFrame;&lt;br /&gt;
let inMemoryDf = ToDataFrame(&lt;br /&gt;
  [[&amp;quot;1&amp;quot;], [&amp;quot;2&amp;quot;], [&amp;quot;3&amp;quot;]],&lt;br /&gt;
  [#{&amp;quot;Name&amp;quot;: &amp;quot;id&amp;quot;, &amp;quot;DataType&amp;quot;: &amp;quot;String&amp;quot;}]&lt;br /&gt;
);&lt;br /&gt;
model.ToSqlDataFrame(inMemoryDf)&lt;br /&gt;
  .Join(dfEvents, [&amp;quot;id&amp;quot;: &amp;quot;CaseId&amp;quot;])&lt;br /&gt;
  .SelectDistinct([&amp;quot;CaseId&amp;quot;])&lt;br /&gt;
  .Collect();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;TriggerNotifications&amp;quot;&amp;gt;TriggerNotifications&amp;lt;/span&amp;gt; (Boolean)&lt;br /&gt;
||Notification names (String*)&lt;br /&gt;
||Triggers the given notifications for the Model. Notifications are given by their names. Triggering means that the configured rules are run and notification emails are sent as defined by the rules. If the notification names parameter is not provided, all notifications in the Model are triggered.&lt;br /&gt;
&lt;br /&gt;
The function return &#039;&#039;true&#039;&#039; if any notification were triggered, otherwise &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(123).TriggerNotifications([&amp;quot;Notification 1&amp;quot;, &amp;quot;Notification 2&amp;quot;]);&lt;br /&gt;
Triggers notifications Notification 1 and Notification 2 in model id 123.&lt;br /&gt;
&lt;br /&gt;
ModelById(123).TriggerNotifications();&lt;br /&gt;
Triggers all notifications in model id 123.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CheckModelValidity&amp;quot;&amp;gt;CheckModelValidity&amp;lt;/span&amp;gt; (Object array)&lt;br /&gt;
||CheckData field in dictionary&lt;br /&gt;
||Checks the model validity and returns found issues. The returned data is an array of objects where each object represents one validity error and contains the following properties:&lt;br /&gt;
* &#039;&#039;&#039;IssueType&#039;&#039;&#039; (String): Specifies the issue type.&lt;br /&gt;
* &#039;&#039;&#039;ContextType&#039;&#039;&#039; (String): Context in which the issue was found, and it can be &#039;&#039;&#039;EventDataSource&#039;&#039;&#039;, &#039;&#039;&#039;CaseDataSource&#039;&#039;&#039;, &#039;&#039;&#039;OcelDataSource&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Details&#039;&#039;&#039; (Dictionary): Additional details which depend on the type of the issue.&lt;br /&gt;
&lt;br /&gt;
There are two types of checks available (based on whether the &#039;&#039;&#039;CheckData&#039;&#039;&#039; parameter is defined):&lt;br /&gt;
* &#039;&#039;Lightweight check&#039;&#039;: The check is based on only the configuration data stored in QPR ProcessAnalyzer. This check is very quick and does not require running queries in datasource (e.g., in Snowflake).&lt;br /&gt;
* &#039;&#039;Full check&#039;&#039;: The check is comprehensive and it&#039;s able to detect any validity issues the model may have. The full check requires running queries to the actual data which makes the check slower, and in case of Snowflake, it uses the Snowflake warehouse to run the queries.&lt;br /&gt;
&lt;br /&gt;
The lightweight check is performed automatically by the [[QPR_ProcessAnalyzer_Project_Workspace|Workspace]], so if there are any validity issues that the lightweight check can detect, the Workspace notifies about them immediately. If there are any problems with the model calculation results, it might be a good idea to run the full validity check to confirm whether the problems are due to the model being invalid.&lt;br /&gt;
&lt;br /&gt;
Example: Lightweight check:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(ModelById(1).CheckModelValidity())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Full check:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(ModelById(1).CheckModelValidity(#{ &amp;quot;CheckData&amp;quot;: true }))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CortexAgentsQuery&lt;br /&gt;
||&lt;br /&gt;
||Creates a Snowflake Cortex semantic model (see &#039;&#039;GetSemanticModel&#039;&#039; function) for the process mining model and makes a natural language query on it using Snowflake Cortex Agents. More information: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents. &lt;br /&gt;
&lt;br /&gt;
There are the following parameters:&lt;br /&gt;
# &#039;&#039;&#039;Parameters&#039;&#039;&#039;: Dictionary parameters given to the Cortex Agents REST API query (https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-rest-api). There is a special handling for the following parameters:&lt;br /&gt;
#* &#039;&#039;&#039;model&#039;&#039;&#039;: If not defined, uses the default Cortex Agents model name configured into the database, or if that is not defined, uses &amp;quot;llama3.1-70b&amp;quot;.&lt;br /&gt;
#* &#039;&#039;&#039;_tools&#039;&#039;&#039;: Additional tool_spec of type &amp;quot;cortex_analyst_text_to_sql&amp;quot; will be added to this value with a reference to the generated semantic model.&lt;br /&gt;
#* &#039;&#039;&#039;_tool_resources&#039;&#039;&#039;: Generated semantic model is added as an additional resource.&lt;br /&gt;
# &#039;&#039;&#039;Filter configuration&#039;&#039;&#039;: Can be a string containing filter JSON or a dictionary containing the filter configuration. The semantic model is created for the filtered eventlog. If not defined, the entire model eventlog will be used.&lt;br /&gt;
# &#039;&#039;&#039;Event column role nappings&#039;&#039;&#039;: Mappings to apply for event columns. If not defined, default column mappings are used.&lt;br /&gt;
# &#039;&#039;&#039;Case column role mappings&#039;&#039;&#039;: Mappings to apply for case columns. If not defined, default column mappings are used.&lt;br /&gt;
&lt;br /&gt;
The function returns a dictionary with the following keys:&lt;br /&gt;
# &#039;&#039;&#039;Response&#039;&#039;&#039;: Actual response as a dictionary returned by the Cortex Agents.&lt;br /&gt;
# &#039;&#039;&#039;Response items&#039;&#039;&#039;: Contains processed response consisting of an array of objects having the following properties:&lt;br /&gt;
#* &#039;&#039;&#039;Text&#039;&#039;&#039;: Textual response.&lt;br /&gt;
#* &#039;&#039;&#039;Sql&#039;&#039;&#039;: Response SQL query string. Not mandatory.&lt;br /&gt;
#* &#039;&#039;&#039;SqlDataFrame&#039;&#039;&#039;: SqlDataFrame created for the SQL query in the Sql property. Only present if Sql is present.&lt;br /&gt;
|-&lt;br /&gt;
||GetSemanticModel&lt;br /&gt;
||&lt;br /&gt;
||Creates a Snowflake Cortex Analyst semantic model for the process mining model and returns it as a dictionary. More information: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst/semantic-model-spec.&lt;br /&gt;
&lt;br /&gt;
There are the following parameters:&lt;br /&gt;
# &#039;&#039;&#039;Filter configuration&#039;&#039;&#039;: Can be a string containing filter JSON or a dictionary containing the filter. The semantic model is created for the filtered eventlog. If not defined, the entire model eventlog will be used.&lt;br /&gt;
# &#039;&#039;&#039;Event column role mappings&#039;&#039;&#039;: Mappings to apply for event columns. If not defined, default column mappings are used.&lt;br /&gt;
# &#039;&#039;&#039;Case column role mappings&#039;&#039;&#039;: Mappings to apply for case columns. If not defined, default column mappings are used.&lt;br /&gt;
&lt;br /&gt;
Examples: Returns a semantic model without any filtering applied.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).GetSemanticModel();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get Model by model id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ModelById&lt;br /&gt;
||&lt;br /&gt;
* Model id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#Model|Model]] object corresponding to the provided model id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Object-centric model==&lt;br /&gt;
Object-centric models additionally have the following properties and functions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Object-Centric model properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||IsOcelModel (boolean)&lt;br /&gt;
||Returns &#039;&#039;true&#039;&#039; when the model is an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEvents (Datatable)&lt;br /&gt;
||Datatable containing event data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if event datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventToObject (Datatable)&lt;br /&gt;
||Datatable containing event-to-object relations data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if event-to-object relation datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventTypes (Dictionary)&lt;br /&gt;
||Returns a dictionary containing event type names as keys and the datatables holding event data for that event type in this OCEL model as value. An empty array is returned if event types datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable for &amp;quot;Create order&amp;quot; events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).OcelEventTypes.Get(&amp;quot;Create order&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjects (Datatable)&lt;br /&gt;
||Datatable containing objects data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if object datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectToObject (Datatable)&lt;br /&gt;
||Datatable containing object-to-object relations data for the OCEL model. Value &#039;&#039;null&#039;&#039; is returned if object-to-object relation datatable has not been configured for the model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectTypes (Dictionary)&lt;br /&gt;
||Returns a dictionary containing object type names as keys and the datatables holding data for that object type in this OCEL model as value. An empty array is returned if object types have not been configured for this model. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Object-centric model functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||OcelEventType&lt;br /&gt;
||Event type name (String)&lt;br /&gt;
||&lt;br /&gt;
Datatable containing event type attributes of given event type in this OCEL model. Value &#039;&#039;null&#039;&#039; is returned if a datatable is not configured for this model for given event type. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable for &amp;quot;Create order&amp;quot; events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ModelById(1).OcelEventType(&amp;quot;Create order&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectType&lt;br /&gt;
||Object type name (String)&lt;br /&gt;
||Datatable containing object type attributes of given object type in this OCEL model. Value &#039;&#039;null&#039;&#039; is returned if a datatable is not configured for this model for given object type. Throws an unsupported operation exception if the model is not an OCEL model.&lt;br /&gt;
|-&lt;br /&gt;
||OcelObjectTypeConfiguration&lt;br /&gt;
||Object type name (String)&lt;br /&gt;
||Returns a matching configuration object with the following properties:&amp;lt;br&amp;gt;&lt;br /&gt;
# Datatable: name of the datatable&lt;br /&gt;
# Unit: unit label for object type items&lt;br /&gt;
&#039;&#039;Null&#039;&#039; is returned if the given object type is not found in the model configuration.  &lt;br /&gt;
If the object type name is not specified or &#039;&#039;null&#039;&#039;, the function returns a dictionary containing configurations for all defined object types.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Project properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the Project.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was created.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Project settings as Dictionary object. See example in &#039;&#039;ConfigurationJson&#039;&#039; property.&lt;br /&gt;
|-&lt;br /&gt;
||ConfigurationJson (String)&lt;br /&gt;
||Project settings as json string.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;DefaultLocationInDataSource&amp;quot;: {&lt;br /&gt;
    &amp;quot;Database&amp;quot;: &amp;quot;MyDatabase&amp;quot;,&lt;br /&gt;
    &amp;quot;Schema&amp;quot;: &amp;quot;MySchema&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;ConnectionStringKeys&amp;quot;: {&lt;br /&gt;
    &amp;quot;Snowflake&amp;quot;: &amp;quot;MyKey1&amp;quot;,&lt;br /&gt;
    &amp;quot;SqlServer&amp;quot;: &amp;quot;MyKey2&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Dashboards (Dashboard*)&lt;br /&gt;
||Returns all [[Dashboard_in_Expression_Language|dashboards]] in the project.&lt;br /&gt;
|-&lt;br /&gt;
||Datatables (Datatable*)&lt;br /&gt;
||Returns all Datatables in the project.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was deleted (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Project description. The project description may contain line breaks.&lt;br /&gt;
|-&lt;br /&gt;
||DeletedBy (User)&lt;br /&gt;
||User who deleted the Project (moved to the recycle bin).&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the Project.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last modified the Project.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the Project was last modified (refers to the project name, description and parent, not the contents of the project).&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Name of the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Models (Model*)&lt;br /&gt;
||Models that are in the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Parent (Project)&lt;br /&gt;
||Parent project, i.e. a Project where the Project is located in the hierarchy of Projects. Returns &#039;&#039;null&#039;&#039; for root level Projects. Throws an error if user doesn&#039;t have access to the parent project.&lt;br /&gt;
|-&lt;br /&gt;
||ParentProjectId (Integer)&lt;br /&gt;
||Parent project id. Returns &#039;&#039;null&#039;&#039; for root level Projects. The parent project id is returned even if user doesn&#039;t have access to the parent project.&lt;br /&gt;
|-&lt;br /&gt;
||Scripts (Script*)&lt;br /&gt;
||Scripts that are in the Project.&lt;br /&gt;
|-&lt;br /&gt;
||Secrets (Dictionary*)&lt;br /&gt;
||Returns array of all [[Storing_Secrets_for_Scripts|secrets]] in the project as Dictionary with following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the secret.&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Type of the secret which is one of the following: &amp;quot;odbc&amp;quot;, &amp;quot;sap&amp;quot;, &amp;quot;salesforce&amp;quot;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Project functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreateDashboard (Dashboard)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a dashboard to the project. &#039;&#039;EditDashboards&#039;&#039; permission to the project is required. The parameter is dictionary with following supported dashboard properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Identifier&#039;&#039;&#039; (String): Identifier of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description of the dashboard.&lt;br /&gt;
* &#039;&#039;&#039;Content&#039;&#039;&#039; (Dictionary): Content of the dashboard.&lt;br /&gt;
&lt;br /&gt;
Example: Create empty dashboard.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .CreateDashboard(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
    &amp;quot;Identifier&amp;quot;: &amp;quot;MyDashboard&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create dashboard with a chart.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .CreateDashboard(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
    &amp;quot;Content&amp;quot;: #{&lt;br /&gt;
      &amp;quot;version&amp;quot;: 4,&lt;br /&gt;
      &amp;quot;typeName&amp;quot;: &amp;quot;View&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;My dashboard&amp;quot;,&lt;br /&gt;
      &amp;quot;subElements&amp;quot;: [&lt;br /&gt;
        #{&lt;br /&gt;
          &amp;quot;position&amp;quot;: #{&lt;br /&gt;
            &amp;quot;x&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;y&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;width&amp;quot;: 0.5,&lt;br /&gt;
            &amp;quot;height&amp;quot;: 0.5,&lt;br /&gt;
            &amp;quot;zOrder&amp;quot;: 0&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;element&amp;quot;: #{&lt;br /&gt;
            &amp;quot;typeName&amp;quot;: &amp;quot;Chart&amp;quot;,&lt;br /&gt;
            &amp;quot;configuration&amp;quot;: #{&lt;br /&gt;
              &amp;quot;root&amp;quot;: #{&lt;br /&gt;
                &amp;quot;expressionType&amp;quot;: &amp;quot;Cases&amp;quot;,&lt;br /&gt;
                &amp;quot;expressionParameters&amp;quot;: #{}&lt;br /&gt;
              },&lt;br /&gt;
              &amp;quot;measures&amp;quot;: [#{&lt;br /&gt;
                &amp;quot;expressionType&amp;quot;: &amp;quot;Count&amp;quot;,&lt;br /&gt;
                &amp;quot;expressionParameters&amp;quot;: #{}&lt;br /&gt;
              }]&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateDatatable&amp;quot;&amp;gt;CreateDatatable&amp;lt;/span&amp;gt; (Datatable)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Creates datatable to the project. After creation, there are no columns or rows in the datatable. The function returns the created datatable entity. Following properties can be set for the datatable:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the datatable. This parameter is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Description for the datatable. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;NameInDataSource&#039;&#039;&#039; (string): Table name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039; (string): Schema name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039; (string): Database name in the datasource (e.g., in Snowflake) which this datatable is linked to. This parameter is optional.&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Defines where the data for the datatable is located. Available values are &#039;&#039;&#039;Snowflake&#039;&#039;&#039;, &#039;&#039;&#039;SqlServer&#039;&#039;&#039;, and &#039;&#039;&#039;Local&#039;&#039;&#039;.  This parameter is optional and default value is defined by the [[PA_Configuration_database_table#General_Settings|DefaultDataSource]] setting.&lt;br /&gt;
* &#039;&#039;&#039;Connection&#039;&#039;&#039;: Connection object for the datatable. This parameter is optional.&lt;br /&gt;
&lt;br /&gt;
Example: Create a new datatable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create Snowflake datatable linked to a custom table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
  &amp;quot;NameInDataSource&amp;quot;: &amp;quot;MyTable&amp;quot;,&lt;br /&gt;
  &amp;quot;SchemaNameInDataSource&amp;quot;: &amp;quot;MySchema&amp;quot;,&lt;br /&gt;
  &amp;quot;DatabaseNameInDataSource&amp;quot;: &amp;quot;MyDatabase&amp;quot;,&lt;br /&gt;
  &amp;quot;Type&amp;quot;: &amp;quot;Snowflake&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create Snowflake datatable where connection string is stored as a [[Storing_Secrets_for_Scripts|secret]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateDatatable(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My datatable&amp;quot;,&lt;br /&gt;
  &amp;quot;Type&amp;quot;: &amp;quot;Snowflake&amp;quot;,&lt;br /&gt;
  &amp;quot;Connection&amp;quot;: ProjectById(1).CreateSnowflakeConnection(#{ &amp;quot;OdbcConnectionStringKey&amp;quot;: &amp;quot;MyKey&amp;quot; })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateMeaConnection&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Creates an object representing connection to QPR MEA (QPR Suite) Web Service. The function parameter is a dictionary containing the property &#039;&#039;&#039;ConnectionStringKey&#039;&#039;&#039; which defines the MEA connection string secret name in the same project. When the connection object has been created, MEA Web Service [[QPR_MEA_Integration|queries and other operations]] can be executed using it.&lt;br /&gt;
&lt;br /&gt;
Example: create connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let connection = ProjectByName(&amp;quot;MyProject&amp;quot;).CreateMeaConnection( #{&amp;quot;ConnectionStringKey&amp;quot;: &amp;quot;MyMeaConnection&amp;quot;} );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: use connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let results = connection.QueryObjects(&amp;quot;[PG.785401983.683494101]&amp;quot;, &amp;quot;name, typename&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateModel (Model)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Creates a model to a project. Requires &#039;&#039;GenericWrite&#039;&#039; permission for the Project and global &#039;&#039;CreateModel&#039;&#039; permission. If a model with that name already exists, an exception is thrown.&lt;br /&gt;
&lt;br /&gt;
Parameters dictionary has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the model. This property is mandatory.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Description of the model. This property is optional.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039;: Configuration dictionary for the model. This property is technically optional, but a working model requires at least datasource settings to be defined.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateModel(#{    &lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My model&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;,&lt;br /&gt;
  &amp;quot;Configuration&amp;quot;: #{&lt;br /&gt;
    &amp;quot;DataSource&amp;quot;: #{&lt;br /&gt;
      &amp;quot;Cases&amp;quot;: #{&lt;br /&gt;
        &amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;DataTableName&amp;quot;: &amp;quot;My cases datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
          &amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;Events&amp;quot;: #{&lt;br /&gt;
        &amp;quot;DataSourceType&amp;quot;: &amp;quot;datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;DataTableName&amp;quot;: &amp;quot;My events datatable&amp;quot;,&lt;br /&gt;
        &amp;quot;Columns&amp;quot;: #{&lt;br /&gt;
           &amp;quot;CaseId&amp;quot;: &amp;quot;Case Name&amp;quot;,&lt;br /&gt;
           &amp;quot;EventType&amp;quot;: &amp;quot;Event Type&amp;quot;,&lt;br /&gt;
           &amp;quot;Timestamp&amp;quot;: &amp;quot;Start Time&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateProject&amp;quot;&amp;gt;CreateProject&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||&lt;br /&gt;
* Parameters dictionary&lt;br /&gt;
||Create a project as a sub-project of the context project. Returns the created project. Requires the &#039;&#039;ManageProject&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Parameters dictionary has the following properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Name of the project. This property is required.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (string): Description of the project.&lt;br /&gt;
* &#039;&#039;&#039;ParentProjectId&#039;&#039;&#039; (integer): Id of the parent project where the new project is created. This parameter is usually not needed because the parent project is the context project. The CreateProject function is also available in the generic context where the &#039;&#039;ParentProjectId&#039;&#039; parameter is needed to create sub-projects.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039; (string): Snowflake database the project is linked to. Data for the datatables in this project will be located in this database.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039; (string): Snowflake schema the project is linked to. Data for the datatables in this project will be located in this schema. If the schema is defined, also the &#039;&#039;DatabaseNameInDataSource&#039;&#039; needs to be defined.&lt;br /&gt;
* &#039;&#039;&#039;SnowflakeConnectionStringKey&#039;&#039;&#039; (string): Snowflake connection string key to be used for the datatables in this project. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;, &lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;My description&amp;quot;, &lt;br /&gt;
  &amp;quot;DatabaseNameInDataSource&amp;quot;: &amp;quot;My database&amp;quot;, &lt;br /&gt;
  &amp;quot;SchemaNameInDataSource&amp;quot;: &amp;quot;My schema&amp;quot; &lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||CreateScript (Script)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Creates a new script to the project. The parameter is a dictionary containing the following script properties:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the script. This is a mandatory parameter. Note that it&#039;s not possible to create multiple scripts with the same name in the same project.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Optional description text of the script.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039; (String): Language of the script. Options: &#039;&#039;Expression&#039;&#039; (default), or &#039;&#039;SQL&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039; (String): Script code.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039; (Dictionary): Script json configuration.&lt;br /&gt;
&lt;br /&gt;
The function returns the created script object. Using the function requires &#039;&#039;ManageScripts&#039;&#039; permission for the project, and additionally &#039;&#039;RunScripts&#039;&#039; for SQL scripts.&lt;br /&gt;
&lt;br /&gt;
Example: Create an expression script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateScript(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My expression script&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;WriteLog(\&amp;quot;Hello world!\&amp;quot;);&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Create an SQL script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).CreateScript(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My SQL script&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;This is an example SQL script...&amp;quot;,&lt;br /&gt;
  &amp;quot;Language&amp;quot;: &amp;quot;SQL&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;SELECT * FROM table;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DatatableByName (Datatable)&lt;br /&gt;
||Datatable name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Datatable by its name located in the project. Returns null, if Datatable with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).DatatableByName(&amp;quot;MyDatatable1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get datatable by name, and create it if it doesn&#039;t exist:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let project = ProjectById(123);&lt;br /&gt;
let datatableName = &amp;quot;MyDatatable1&amp;quot;;&lt;br /&gt;
let datatable = project.DatatableByName(datatableName);&lt;br /&gt;
if (datatable == null) {&lt;br /&gt;
  datatable = project.CreateDatatable(datatableName);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||Deletes the Project permanently. Note that the Project doesn&#039;t need to be in the recycle bin to be able to delete it permanently.&lt;br /&gt;
|-&lt;br /&gt;
||Export (String)&lt;br /&gt;
||(none)&lt;br /&gt;
||Exports the project and its content to a json string. The json format is described in [[Projects Export File Format]].&lt;br /&gt;
&lt;br /&gt;
Example: Export project id 1 to json data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).Export();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Import&lt;br /&gt;
||JSON string&lt;br /&gt;
||Creates one or several projects from a json string. The project(s) are created as child projects of the context project. The json format is described in [[Projects Export File Format]]. The function returns the created project objects. In case the project names already exist, the import operation automatically adjusts the names to be unique.&lt;br /&gt;
&lt;br /&gt;
Example: Create project from json data (as child of project id 1):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let jsonData = `{ &amp;quot;Projects&amp;quot;: [ { &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot; } ] }`;&lt;br /&gt;
let result = ProjectById(1).Import(jsonData);&lt;br /&gt;
let createdProjectId = result[&amp;quot;Projects&amp;quot;][0].Id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Restore&lt;br /&gt;
||(none)&lt;br /&gt;
||Restores the Project from the recycle bin back to the original location.&lt;br /&gt;
|-&lt;br /&gt;
||ModelByName (Model)&lt;br /&gt;
||Model name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Model by its name located in the project. Returns null, if Model with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).ModelByName(&amp;quot;My Model 1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;ModifyProject&amp;quot;&amp;gt;Modify&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||Dictionary of settings to change&lt;br /&gt;
||&lt;br /&gt;
Change project settings. Following settings are supported:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the project.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description text of the project.&lt;br /&gt;
* &#039;&#039;&#039;ParentProjectId&#039;&#039;&#039; (Integer): Parent project id. Changing this effectively moves the project into different parent project.&lt;br /&gt;
* &#039;&#039;&#039;DatabaseNameInDataSource&#039;&#039;&#039;: Name of the Snowflake database where the project&#039;s datatables are located. The database needs to exist in the same Snowflake account configured in the Snowflake connection string. When defining this setting, define also the &#039;&#039;SchemaNameInDataSource&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;SchemaNameInDataSource&#039;&#039;&#039;: Name of the Snowflake schema where the project&#039;s datatables are located. The schema needs to exist in the same Snowflake account configured in the Snowflake connection string. When defining this setting, define also the &#039;&#039;DatabaseNameInDataSource&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;SnowflakeConnectionStringKey&#039;&#039;&#039; (String): Snowflake connection string key for the project. Snowflake datatables in the project will use connection string behind this key (unless specified by the datatatable).&lt;br /&gt;
* &#039;&#039;&#039;SqlServerConnectionStringKey&#039;&#039;&#039; (String): SQL Server connection string key. SQL Server datatables in the project will use connection string behind this key (unless specified by the datatatable).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ManageProject&#039;&#039; permission is needed to change project properties.&lt;br /&gt;
&lt;br /&gt;
Example: Change project name and move project into other parent project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .Modify(#{&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Project 1&amp;quot;&lt;br /&gt;
    &amp;quot;ParentProjectId&amp;quot;: 2&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set Snowflake connection string key for the project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1)&lt;br /&gt;
  .Modify(#{&lt;br /&gt;
    &amp;quot;SnowflakeConnectionStringKey&amp;quot;: &amp;quot;MyKey1&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||ScriptByName (Script)&lt;br /&gt;
||Script name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns Script by its name located in the project. Returns null, if Script with that name does not exist in the project.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(123).ScriptByName(&amp;quot;MyScript1&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;SetSecret&amp;quot;&amp;gt;SetSecret&amp;lt;/span&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
# Secret type (string)&lt;br /&gt;
# Secret name (string)&lt;br /&gt;
# Secret value (string)&lt;br /&gt;
||Sets or adds a [[Storing_Secrets_for_Scripts|secret]] for the project. Setting the secret value to &#039;&#039;null&#039;&#039; removes the secret. There can be several secrets with the same name in the same project if the type of the secret is different. Setting secrets requires the project specific &#039;&#039;ManageProject&#039;&#039; permission.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Type&#039;&#039;&#039; (string): Secret type which is one of the following:&lt;br /&gt;
#* &amp;quot;externaldatatableconnection&amp;quot;: Snowflake ODBC connection string for datatables.&lt;br /&gt;
#* &amp;quot;odbc&amp;quot;: ODBC connection string (e.g., to extract data in scripts, or load an in-memory model).&lt;br /&gt;
#* &amp;quot;oledb&amp;quot;: OleDB connection string (e.g., to extract data in scripts, or load an in-memory model).&lt;br /&gt;
#* &amp;quot;sap&amp;quot;: SAP password.&lt;br /&gt;
#* &amp;quot;salesforce&amp;quot;: Salesforce password.&lt;br /&gt;
#* &amp;quot;sql&amp;quot;: SQL Server connection string.&lt;br /&gt;
#* &amp;quot;qprmea&amp;quot;: QPR MEA connection string.&lt;br /&gt;
# &#039;&#039;&#039;Name&#039;&#039;&#039; (string): Secret name, used to refer to the secret in the commands.&lt;br /&gt;
# &#039;&#039;&#039;Value&#039;&#039;&#039; (string): Secret value which contains the confidential information.&lt;br /&gt;
&lt;br /&gt;
Example: Set SAP password:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).SetSecret(&amp;quot;sap&amp;quot;, &amp;quot;MySapPassword&amp;quot;, &amp;quot;I l0ve 5AP!&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Remove SAP password:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProjectById(1).SetSecret(&amp;quot;sap&amp;quot;, &amp;quot;MySapPassword&amp;quot;, null);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Functions to get project:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ProjectById&lt;br /&gt;
||Project id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns project object corresponding to the provided project id.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectByName&lt;br /&gt;
||Project name (String)&lt;br /&gt;
||&lt;br /&gt;
Returns project object by given project name. If there is no such project or user doesn&#039;t have access to it, &#039;&#039;null&#039;&#039; value is returned. If there are multiple projects with the same name, one of them is returned.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let project = ProjectByName(&amp;quot;My Project&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Functions to create project:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;CreateProject&amp;quot;&amp;gt;CreateProject&amp;lt;/span&amp;gt; (Project)&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Create a project. This is a similar function as the [[QPR_ProcessAnalyzer_Objects_in_Expression_Language#CreateProject|CreateProject function]] in the project context. This function in the generic context is needed to create root-level projects (which don&#039;t have parent project).&lt;br /&gt;
&lt;br /&gt;
Example: create a root project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: create a sub-project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateProject(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot;&lt;br /&gt;
  &amp;quot;ParentProjectId&amp;quot;: 1&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;Import&amp;quot;&amp;gt;Import&amp;lt;/span&amp;gt; (Project*)&lt;br /&gt;
||JSON string&lt;br /&gt;
||Creates one or several projects from a json string. The project(s) are created as the root level projects. The json format is described in [[Projects Export File Format]]. The function returns the created project objects. In case the project names already exist, the import operation automatically adjusts the names to be unique.&lt;br /&gt;
&lt;br /&gt;
Example: Create a root level project from json data:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let jsonData = `{ &amp;quot;Projects&amp;quot;: [ { &amp;quot;Name&amp;quot;: &amp;quot;My project&amp;quot; } ] }`;&lt;br /&gt;
let result = Import(jsonData);&lt;br /&gt;
let createdProjectId = result[&amp;quot;Projects&amp;quot;][0].Id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Script ==&lt;br /&gt;
Scripts are entities that contain executable code, that can be run. Usually scripts contains ETL routines but also other kind of tasks are possible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Script properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Code (String)&lt;br /&gt;
||Script code.&lt;br /&gt;
|-&lt;br /&gt;
||Configuration (Dictionary)&lt;br /&gt;
||Script&#039;s configuration.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||User who created the Script.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Timestamp when the Script was created.&lt;br /&gt;
|-&lt;br /&gt;
||CurrentRunStart (DateTime)&lt;br /&gt;
||Timestamp of the current run start. Null if the script is currently not running.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Description of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||Language (String)&lt;br /&gt;
||Either of the following scripting language: &#039;&#039;&#039;Expression&#039;&#039;&#039; or &#039;&#039;&#039;SQL&#039;&#039;&#039;. When language is Expression, the script is run as an expression script, and when language is SQL, the script is run as an SQL script (using the sandbox database).&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||User who last modified the Script.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Timestamp when the Script was last modified.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunEnd (DateTime)&lt;br /&gt;
||Timestamp of the last completed script run end (either successful completion or failure). Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunResult (String)&lt;br /&gt;
||Result of the last run. Options are:&lt;br /&gt;
* &#039;&#039;&#039;Completed&#039;&#039;&#039;: The last run was completed successfully.&lt;br /&gt;
* &#039;&#039;&#039;Failed&#039;&#039;&#039;: An error occurred during the last run, so likely the script did not complete as intended.&lt;br /&gt;
* &#039;&#039;&#039;Aborted&#039;&#039;&#039;: Script run was manually stopped prematurely by a user, so the script did not proceeded in the end.&lt;br /&gt;
&lt;br /&gt;
Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||LastRunStart (DateTime)&lt;br /&gt;
||Timestamp of the last completed script run start time. Null if the Script hasn&#039;t been run yet.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Name of the Script.&lt;br /&gt;
|-&lt;br /&gt;
||OperationId (Integer)&lt;br /&gt;
||Id of the operation which runs the Script. Null if the script is currently not running.&lt;br /&gt;
|-&lt;br /&gt;
||Project (Project)&lt;br /&gt;
||Project where the Script is located. Null if the script is in the global context.&lt;br /&gt;
|-&lt;br /&gt;
||ProjectId (Integer)&lt;br /&gt;
||Id of the project where the Script is located. Null if the script is in the global context.&lt;br /&gt;
|-&lt;br /&gt;
||Status (String)&lt;br /&gt;
||Current status of the script. Options are:&lt;br /&gt;
* &#039;&#039;&#039;Ready&#039;&#039;&#039;: Script is not running. In this status, the script can be started (changing the status to &#039;&#039;Running&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Running&#039;&#039;&#039;: Script is running. In this status, the script can be stopped (changing the status to &#039;&#039;Stopping&#039;&#039;). Calling stop just requests a script to stop, and the actual stopping occurs some time later.&lt;br /&gt;
* &#039;&#039;&#039;Stopping&#039;&#039;&#039;: Script has been requested to be stopped, but it&#039;s still running. In this status, neither start nor stop can be called for the script. When the script eventually stops, its status changes to &#039;&#039;Ready&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpTool&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP tool or not.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpPrompt (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP prompt or not.&lt;br /&gt;
|-&lt;br /&gt;
||CanBeUsedAsMcpResource (Boolean)&lt;br /&gt;
||A boolean value determining whether this script can be used as a MCP resource or not.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Script functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||DeletePermanently&lt;br /&gt;
||(none)&lt;br /&gt;
||&lt;br /&gt;
Deletes the script permanently. To delete an expression script, &#039;&#039;&#039;ManageScripts&#039;&#039;&#039; permission for the project is needed, and to delete an SQL script, global &#039;&#039;&#039;RunScripts&#039;&#039;&#039; permission and &#039;&#039;&#039;ManageScripts&#039;&#039;&#039; permission for the project is needed.&lt;br /&gt;
|-&lt;br /&gt;
||Modify&lt;br /&gt;
||Parameters dictionary&lt;br /&gt;
||Modifies properties of a script. The parameter is a dictionary of properties to change:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039; (String): Name of the script.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039; (String): Description text of the script.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039; (String): Language of the script, either &#039;&#039;Expression&#039;&#039; or &#039;&#039;SQL&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039; (String): Script code.&lt;br /&gt;
* &#039;&#039;&#039;ProjectId&#039;&#039;&#039; (Integer): Id of the project where the script is located. Changing this property moves the script into a different project.&lt;br /&gt;
* &#039;&#039;&#039;Configuration&#039;&#039;&#039; (Dictionary): Script json configuration.&lt;br /&gt;
&lt;br /&gt;
Requires &#039;&#039;ManageScripts&#039;&#039; permissions in the project. Additionally, requires &#039;&#039;RunScripts&#039;&#039; permission for SQL scripts.&lt;br /&gt;
&lt;br /&gt;
Example: Rename script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;Updated script&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Change multiple properties in the same call:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;Name&amp;quot;: &amp;quot;Updated script&amp;quot;,&lt;br /&gt;
  &amp;quot;Description&amp;quot;: &amp;quot;Updated description&amp;quot;,&lt;br /&gt;
  &amp;quot;Language&amp;quot;: &amp;quot;SQL&amp;quot;,&lt;br /&gt;
  &amp;quot;Code&amp;quot;: &amp;quot;SELECT 1&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Move script to a different project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Modify(#{&lt;br /&gt;
  &amp;quot;ProjectId&amp;quot;: ProjectByName(&amp;quot;My project&amp;quot;).Id&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Run (Object)&lt;br /&gt;
||Dictionary of parameters&lt;br /&gt;
||&lt;br /&gt;
Runs the script using the provided parameters. The parameters are available in the script as variables (see the example). Any type of variables can be passed to the script. Note that if the script assumes certain variables, but that they are not passed to the script, the script run will throw an error. &lt;br /&gt;
&lt;br /&gt;
For SQL scripts, the passed parameters are available in the script as variables in format &#039;&#039;&#039;@_parameter_&amp;lt;ParameterName&amp;gt;&#039;&#039;&#039; where &amp;lt;ParameterName&amp;gt; is the name of the parameter, e.g. &#039;&#039;parameter_myParameter1&#039;&#039;. Only string type of parameters can be used, so any other type of data in parameter values is converted into strings.&lt;br /&gt;
&lt;br /&gt;
The return value of the script is returned by the Run function. Expression scripts return a value with the &#039;&#039;return&#039;&#039; statement or alternatively the result of the last line of the script is the return value. If the script does not return any value, the Run function returns &#039;&#039;_empty&#039;&#039;. For SQL scripts, the return value is the last dataset produced by the script (returned as a DataFrame) (SQL scripts might create several datasets using the &#039;&#039;--#ShowReport&#039;&#039; command or the &#039;&#039;Show&#039;&#039; parameter).&lt;br /&gt;
&lt;br /&gt;
When a script is called using the Run function, the called script status does not change, because it&#039;s the parent script that is &#039;&#039;Running&#039;&#039;. Also the called script log is not filled, but instead the logging goes to the calling script.&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to call a script using the Run function several times simultaneously.&lt;br /&gt;
&lt;br /&gt;
If there is an error when running the called script, the Run function throws the error to the calling script.&lt;br /&gt;
&lt;br /&gt;
Scripts are run in the script entity context, so for example the following properties are available:&lt;br /&gt;
* Id: Script id&lt;br /&gt;
* Name: Script name&lt;br /&gt;
* Project.Id: Project id where the script is located&lt;br /&gt;
* Project.Name: Name of the project where the script is located&lt;br /&gt;
&lt;br /&gt;
Example: Following script (id 123) raises a specified number to a specified power:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return Pow(numberToRaise, exponent);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script can be called as follows (returning 16):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runResult = ScriptById(123).Run(#{&lt;br /&gt;
  &amp;quot;numberToRaise&amp;quot;: 4,&lt;br /&gt;
  &amp;quot;exponent&amp;quot;: 2&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;span id=&amp;quot;Start&amp;quot;&amp;gt;Start&amp;lt;/span&amp;gt;&lt;br /&gt;
||Dictionary of parameters&lt;br /&gt;
||Starts the script. The function call doesn&#039;t wait for the script run to complete (i.e., asynchronous behavior) which is same as starting the script in the [[Managing_Scripts#Starting_Script|Workspace]].&lt;br /&gt;
&lt;br /&gt;
Parameters to the script can be provided as a dictionary of name-value pairs (which is not possible when script is started in the Workspace). Return value is the script run id (integer) if the script was started. If the script is already running, return value is &#039;&#039;null&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: Start script (without parameters) and store the script run id:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runId = ScriptById(1).Start();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Start script with passing parameters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ScriptById(1).Start(#{&lt;br /&gt;
  &amp;quot;variable1&amp;quot;: &amp;quot;val1&amp;quot;,&lt;br /&gt;
  &amp;quot;variable2&amp;quot;: 5&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||Stop&lt;br /&gt;
||&lt;br /&gt;
||Stops the script. The operation doesn&#039;t wait for the stopping to complete (i.e., asynchronous behavior) which is same as stopping the script in the [[Managing_Scripts#Stopping_Script|Workspace]]. Depending on the operation that the script is performing, the stopping might take some time.&lt;br /&gt;
&lt;br /&gt;
Return value is the script run id (integer) if the script was running. If the script isn&#039;t running, the return value is &#039;&#039;null&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let runId = ScriptById(1).Stop();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get a script by the script id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||ScriptById&lt;br /&gt;
||&lt;br /&gt;
* Script id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns Script object corresponding to the given script id. If script with the given id doesn&#039;t exist or user doesn&#039;t have permissions to it, an error is given.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User/Group ==&lt;br /&gt;
User objects represents users and user groups. Note that some properties can only be used for users and some for groups.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;User/group properties&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||CreatedBy (User)&lt;br /&gt;
||Returns the user who created the user.&lt;br /&gt;
|-&lt;br /&gt;
||CreatedDate (DateTime)&lt;br /&gt;
||Returns the date when the user was created.&lt;br /&gt;
|-&lt;br /&gt;
||DefaultDashboard (String)&lt;br /&gt;
||Returns the configured [[User_Settings#Starting_dashboard|starting dashboard]] (&amp;quot;default dashboard&amp;quot;) identifier for a group (for users, the starting dashboard cannot be configured). The starting dashboard is automatically opened when a user logs in.&lt;br /&gt;
|-&lt;br /&gt;
||Description (String)&lt;br /&gt;
||Description of the user.&lt;br /&gt;
|-&lt;br /&gt;
||EffectiveDefaultDashboard (String)&lt;br /&gt;
||Returns the [[User_Settings#Starting_dashboard|starting dashboard]] of a user. Value &#039;&#039;null&#039;&#039; means that the user doesn&#039;t have a starting dashboard. The starting dashboard comes from the user&#039;s groups. If multiple of user&#039;s groups have the starting dashboard defined, the user&#039;s starting dashboard will be taken from a group having alphabetically the first name.&lt;br /&gt;
|-&lt;br /&gt;
||Email (String)&lt;br /&gt;
||Email address of the user.&lt;br /&gt;
|-&lt;br /&gt;
||FullName (String)&lt;br /&gt;
||Full name of the user or group name.&lt;br /&gt;
|-&lt;br /&gt;
||GlobalPermissions (String*)&lt;br /&gt;
||Array of global [[Roles and Permissions#Global_and_Project_Roles|permissions]] of the user. Global permissions come from the global roles assigned to the user and groups that the user belongs to. Note that to get the effective permissions for certain objects, also project specific permissions need to be taken into account.&lt;br /&gt;
|-&lt;br /&gt;
||GroupMemberNames (String*)&lt;br /&gt;
||Array of names of members of a user group. This property is available for groups.&lt;br /&gt;
|-&lt;br /&gt;
||GroupMembers (User*)&lt;br /&gt;
||Array of members of a user group. This property is available for groups.&lt;br /&gt;
|-&lt;br /&gt;
||GroupNames (String*)&lt;br /&gt;
||Array of names of user groups the user belongs to. This property is available for users.&lt;br /&gt;
|-&lt;br /&gt;
||Groups (User*)&lt;br /&gt;
||Array of user groups the user belongs to. This property is available for users.&lt;br /&gt;
|-&lt;br /&gt;
||HasPassword (Boolean)&lt;br /&gt;
||Returns true if user has a password defined in QPR ProcessAnalyzer and thus user can authenticate using the password. If user doesn&#039;t have a password, the SAML authentication is the only way to log in. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property for other users.&lt;br /&gt;
|-&lt;br /&gt;
||Id (Integer)&lt;br /&gt;
||Id of the user, which is unique for every user.&lt;br /&gt;
|-&lt;br /&gt;
||IsActive (Boolean)&lt;br /&gt;
||Returns true only if the user is active (not disabled).&lt;br /&gt;
|-&lt;br /&gt;
||IsGroup (Boolean)&lt;br /&gt;
||Returns true if the user is a user group.&lt;br /&gt;
|-&lt;br /&gt;
||IsLocked (Boolean)&lt;br /&gt;
||Returns true if user account is currently [[User_Session_Management#Preventing_password_guessing_attacks|locked]]. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property.&lt;br /&gt;
|-&lt;br /&gt;
||LastLockedDate (DateTime)&lt;br /&gt;
||Returns date when user account was locked the last time. Returns &#039;&#039;null&#039;&#039; if the user account has never been locked. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property.&lt;br /&gt;
|-&lt;br /&gt;
||LastLoginDate (DateTime)&lt;br /&gt;
||Returns date when the user made last successful login. &#039;&#039;ManageUsers&#039;&#039; permission is needed to access this property for other users.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedBy (User)&lt;br /&gt;
||Returns the user who last modified this user.&lt;br /&gt;
|-&lt;br /&gt;
||LastModifiedDate (DateTime)&lt;br /&gt;
||Returns the date when the user was last modified.&lt;br /&gt;
|-&lt;br /&gt;
||Name (String)&lt;br /&gt;
||Login name of the user or group.&lt;br /&gt;
|-&lt;br /&gt;
||Roles (Object**)&lt;br /&gt;
||&lt;br /&gt;
Returns all roles of the user (both global and project roles) as a nested array structure.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ToJson(Users.Where(name == &amp;quot;qpr&amp;quot;).Roles)&lt;br /&gt;
Returns (for example):&lt;br /&gt;
[&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:1&amp;quot;}, &amp;quot;Administrator&amp;quot;],&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:2&amp;quot;}, &amp;quot;Analyzer&amp;quot;],&lt;br /&gt;
  [{&amp;quot;calcId&amp;quot;: &amp;quot;Project:3&amp;quot;}, &amp;quot;Viewer&amp;quot;],&lt;br /&gt;
  [null, &amp;quot;RunScripts&amp;quot;],&lt;br /&gt;
  [null, &amp;quot;Administrator&amp;quot;]&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;User/group functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||EffectivePermissionsFor (String Array)&lt;br /&gt;
||&lt;br /&gt;
* Project to get permissions&lt;br /&gt;
||&lt;br /&gt;
Returns effective (actual) permission of the user to the given project. Project is given as a [[#Project|project object]] (not as a project id). Effective permissions determine the actual permissions that the user has, i.e. a combination of all permissions assigned to the user and groups the user belong to, including both project specific and global roles.&lt;br /&gt;
&lt;br /&gt;
Permissions for the EffectivePermissionsFor function are as follows:&lt;br /&gt;
* All users can query their own permissions&lt;br /&gt;
* To get permissions for any user, the user needs to have [[Roles_and_Permissions|ManageUsers permission]].&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;inactive&#039;&#039; users don&#039;t have any effective permissions, so the EffectivePermissionsFor function does not return any permissions for those users.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1).EffectivePermissionsFor(ModelById(2).Project)&lt;br /&gt;
Returns (for example): [&amp;quot;EditDashboards&amp;quot;, &amp;quot;Filtering&amp;quot;, &amp;quot;GenericRead&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||GetAttribute&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Returns user attribute value by given attribute name and optionally by the model/project/dashboard context. Supported data types are String, Integer, Float, and DateTime. To store more complex data types, data can be converted into json and stored as string. If the attribute doesn&#039;t exist, null is returned.&lt;br /&gt;
&lt;br /&gt;
For example, if using dashboard as context, the attributes are effectively bound to each user and each dashboard separately. Thus, there can be several attributes with the same name as long as the dashboard is different.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Attribute name&#039;&#039;&#039; (String): Name of the attribute.&lt;br /&gt;
# &#039;&#039;&#039;Attribute context&#039;&#039;&#039; (Project/Model/Dashboard): Optional context object the attribute is linked to.&lt;br /&gt;
&lt;br /&gt;
Users have permissions to get attributes for themselves, and also (administrator) users with global &#039;&#039;ManageUsers&#039;&#039; permission can get attributes for all users. In addition, if using the context object, the &#039;&#039;GenericRead&#039;&#039; permission is required for the context object.&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for myself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CurrentUser&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for user John:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Users&lt;br /&gt;
  .Where(Name==&amp;quot;John&amp;quot;)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Get user attribute MyDataValue for user 1 related to dashboard id 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;, DashboardById(1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||SetAttribute&lt;br /&gt;
||&lt;br /&gt;
||&lt;br /&gt;
Sets user attribute value for given attribute name and optionally for the model/project/dashboard context. Supported data types are String, Integer, Float, and DateTime. To store more complex data types, data can be converted into json and stored as string. If setting value &#039;&#039;null&#039;&#039;, the user attribute is removed. Required permissions are same as in the GetAttribute function.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
# &#039;&#039;&#039;Attribute name&#039;&#039;&#039; (String): Name of the attribute.&lt;br /&gt;
# &#039;&#039;&#039;Attribute value&#039;&#039;&#039; (String/Integer/Float/DateTime): Attribute value to be stored.&lt;br /&gt;
# &#039;&#039;&#039;Attribute context&#039;&#039;&#039; (Project/Model/Dashboard): Optional context object the attribute value is linked to.&lt;br /&gt;
&lt;br /&gt;
Example: Set user attribute MyDataValue for myself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CurrentUser&lt;br /&gt;
  .SetAttribute(&amp;quot;MyDataValue &amp;quot;, &amp;quot;value&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set value 123 as user attribute MyDataValue for user John:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Users&lt;br /&gt;
  .Where(Name==&amp;quot;John&amp;quot;)&lt;br /&gt;
  .SetAttribute(&amp;quot;MyDataValue&amp;quot;, 123);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Set current time as user attribute MyDataValue for user 1 related to dashboard id 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UserById(1)&lt;br /&gt;
  .GetAttribute(&amp;quot;MyDataValue&amp;quot;, Now, DashboardById(1));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Function to get User by user id:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Parameters&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||UserById (User)&lt;br /&gt;
||&lt;br /&gt;
* User id (Integer)&lt;br /&gt;
||&lt;br /&gt;
Returns User object that has the provided user id. Also groups can be queried with this function. Returns an access denied error if the user with given id does not exist or the current user does not have access to it.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Managing_Scripts&amp;diff=28409</id>
		<title>Managing Scripts</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Managing_Scripts&amp;diff=28409"/>
		<updated>2026-05-27T10:34:53Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In QPR ProcessAnalyzer, scripts can be used for ETL tasks and to automate routines. Scripts are managed in the [[QPR_ProcessAnalyzer_Project_Workspace|Project Workspace]].&lt;br /&gt;
&lt;br /&gt;
=== Running vs. Calling Scripts ===&lt;br /&gt;
&#039;&#039;Running&#039;&#039; a script means starting executing a stored script, which can be done in the UI or using the ScriptLauncher. A script can also &#039;&#039;call&#039;&#039; other scripts during the run. The differences between the running and calling are:&lt;br /&gt;
* Script can run only once at a time, whereas there are no limitations on how many times a script can be called at the same time&lt;br /&gt;
* Script log is written to the running script. No script log is written to the called script.&lt;br /&gt;
* Script status shows whether the script is being run or not. The status does not change, when a script is called from other script.&lt;br /&gt;
&lt;br /&gt;
When a script is running, it&#039;s not possible to start another run of the same script, so the first run needs to end to start new. Scripts can call other scripts and a called scripts can run multiple times simultaneously. In the stack of called scripts, the script log is generated to the top level script. Also the top level script shows that it&#039;s running and the called scripts do not.&lt;br /&gt;
&lt;br /&gt;
=== Scripts List ===&lt;br /&gt;
When selecting a project and opening the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab, all scripts in the project can be seen. Scripts list shows following information:&lt;br /&gt;
* &#039;&#039;&#039;Name&#039;&#039;&#039;: Name of the script.&lt;br /&gt;
* &#039;&#039;&#039;Status&#039;&#039;&#039;: Status of the script, which is one of following: &#039;&#039;Ready&#039;&#039;, &#039;&#039;Running&#039;&#039; or &#039;&#039;Stopping&#039;&#039;. For more information about script statuses, see below.&lt;br /&gt;
* &#039;&#039;&#039;Last run duration&#039;&#039;&#039;: Duration of the last ended run of the script (the last run result can be any).&lt;br /&gt;
* &#039;&#039;&#039;Last run date&#039;&#039;&#039;: Date and time when the last run ended. If you need to know the last run start time, subtract the &#039;&#039;Last run duration&#039;&#039; from this time.&lt;br /&gt;
* &#039;&#039;&#039;Last run result&#039;&#039;&#039;: Result of the last run of the script. Either of following: &#039;&#039;Completed&#039;&#039;, &#039;&#039;Failed&#039;&#039; or &#039;&#039;Aborted&#039;&#039;. For more information about last run results, see below.&lt;br /&gt;
* &#039;&#039;&#039;Id&#039;&#039;&#039;: Script id that uniquely identifies the script in the system.&lt;br /&gt;
&lt;br /&gt;
Scrips are in either of following statuses:&lt;br /&gt;
* &#039;&#039;&#039;Ready&#039;&#039;&#039;: Script is currently not running, and can be started.&lt;br /&gt;
* &#039;&#039;&#039;Running&#039;&#039;&#039;: Script is currently running, and the script can be stopped. When a script is running, another run of the same script cannot be started.&lt;br /&gt;
* &#039;&#039;&#039;Stopping&#039;&#039;&#039;: Script is currently being stopped. When a script is in this status, the script cannot be started nor stopped, so you need to wait for the script to stop. There may be a delay in stopping a script, depending on the operation currently performed by the script.&lt;br /&gt;
&lt;br /&gt;
The last script run result can be either of the following:&lt;br /&gt;
* &#039;&#039;&#039;Completed&#039;&#039;&#039;: The last run ended successfully, i.e. without any errors or exceptions. Note that despite of the technically successful run, the script might still not work as intended.&lt;br /&gt;
* &#039;&#039;&#039;Failed&#039;&#039;&#039;: The last run ended to an error or exception. To see more information about the reason of the failure, see the [[#Viewing_Script_Log|last run log]].&lt;br /&gt;
* &#039;&#039;&#039;Aborted&#039;&#039;&#039;: The last run was stopped by a user, so the script did not run till the end.&lt;br /&gt;
&lt;br /&gt;
=== Script Properties ===&lt;br /&gt;
To open Script Properties, &#039;&#039;&#039;right-click&#039;&#039;&#039; the script on the Scripts tab in the Workspace and select &#039;&#039;&#039;Properties&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
The Script Properties lists the following information on the &#039;&#039;&#039;General&#039;&#039;&#039; tab:&lt;br /&gt;
* &#039;&#039;&#039;Script ID&#039;&#039;&#039;: A unique ID in the system.&lt;br /&gt;
* &#039;&#039;&#039;Language&#039;&#039;&#039;: The script&#039;s language, either &amp;quot;SQL&amp;quot; or &amp;quot;Expression&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Status&#039;&#039;&#039;: As above in Scripts List.&lt;br /&gt;
* &#039;&#039;&#039;Last run start&#039;&#039;&#039;: Date and time when the last run started.&lt;br /&gt;
* &#039;&#039;&#039;Last run end&#039;&#039;&#039;: As &amp;quot;Last run date&amp;quot; above in Scripts List.&lt;br /&gt;
* &#039;&#039;&#039;Last run duration&#039;&#039;&#039;: As above in Scripts List.&lt;br /&gt;
* &#039;&#039;&#039;Last run result&#039;&#039;&#039;: As above in Scripts List.&lt;br /&gt;
* &#039;&#039;&#039;Last modified&#039;&#039;&#039;: Date and time when the script was last modified.&lt;br /&gt;
* &#039;&#039;&#039;Last modified by&#039;&#039;&#039;: User who last modified the script.&lt;br /&gt;
* &#039;&#039;&#039;Created&#039;&#039;&#039;: Date and time when the script was created.&lt;br /&gt;
* &#039;&#039;&#039;Created by&#039;&#039;&#039;: User who created the script.&lt;br /&gt;
&lt;br /&gt;
The script Properties has the following information on the &#039;&#039;&#039;Input&#039;&#039; tab:&lt;br /&gt;
* &#039;&#039;&#039;JSON schema for input parameters&#039;&#039;&#039;: A text box for defining the [[QPR_ProcessAnalyzer_as_MCP_Server#Defining_Input_Parameters|input parameters]].&lt;br /&gt;
&lt;br /&gt;
The script Properties has the following information on the &#039;&#039;&#039;Output&#039;&#039; tab:&lt;br /&gt;
* &#039;&#039;&#039;JSON schema for script output&#039;&#039;&#039;: A text box for defining the [[QPR_ProcessAnalyzer_as_MCP_Server#Defining_Structured_Tool_Output|output parameters]].&lt;br /&gt;
&lt;br /&gt;
The Script Properties has the following selections on the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab. Changing the selection requires that the user has a global Manage scripts permission:&lt;br /&gt;
* &#039;&#039;&#039;None&#039;&#039;&#039;: The script has no MCP use.&lt;br /&gt;
* &#039;&#039;&#039;MCP tool&#039;&#039;&#039;: The script can be used as an [[QPR_ProcessAnalyzer_as_MCP_Server|MCP]] tool.&lt;br /&gt;
* &#039;&#039;&#039;MCP prompt&#039;&#039;&#039;: The script can be used as an MCP prompt.&lt;br /&gt;
* &#039;&#039;&#039;MCP resource&#039;&#039;&#039;: The script can be used as an MCP resource.&lt;br /&gt;
In addition, when any of the MCP options is selected, there is the text box for defining the MCP tool, MCP prompt, or MCP resource configuration in JSON.&lt;br /&gt;
&lt;br /&gt;
The Script Properties has the following information on the &#039;&#039;&#039;Description&#039;&#039;&#039; tab:&lt;br /&gt;
* A textbox to edit the description of the script.&lt;br /&gt;
&lt;br /&gt;
=== Editing Script ===&lt;br /&gt;
Open the scripts editor as follows:&lt;br /&gt;
# On the left side projects hierarchy, select the project where the script is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script and in the right-click context menu select &#039;&#039;&#039;Edit&#039;&#039;&#039;. Alternatively, you can hover the script and click the &#039;&#039;Edit&#039;&#039; button in the end of the row.&lt;br /&gt;
&lt;br /&gt;
If the script has been defined as an MCP tool, only System Administrators are able to edit the script.&lt;br /&gt;
&lt;br /&gt;
The script editor can show multiple scripts in the tabs, allowing to easily switch between the scrips. The editor remembers all scripts that have been opened during the session.&lt;br /&gt;
&lt;br /&gt;
In the script editor, you can:&lt;br /&gt;
* Run the script by clicking the &#039;&#039;&#039;Run&#039;&#039;&#039; button.&lt;br /&gt;
* Stop a running script by clicking the &#039;&#039;&#039;Stop&#039;&#039;&#039; button.&lt;br /&gt;
* Save a script having unsaved changes by clicking the &#039;&#039;&#039;Save&#039;&#039;&#039; button.&lt;br /&gt;
* To run a script having unsaved changes, click the &#039;&#039;&#039;Save and Run&#039;&#039;&#039; button. Note that the script needs to be saved to run it.&lt;br /&gt;
* To go back to the list of scripts, click the &#039;&#039;&#039;Go back&#039;&#039;&#039; button. If there are unsaved changes in any of the opened scripts, you need to either save or cancel the changes.&lt;br /&gt;
* To close a script, click the &#039;&#039;Close&#039;&#039; button for the tab showing the script. If there are unsaved changes, you need to either save or cancel changes.&lt;br /&gt;
&lt;br /&gt;
=== Starting Script ===&lt;br /&gt;
# On the left side projects hierarchy, select the project where the script is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script and in the right-click context menu select &#039;&#039;&#039;Run&#039;&#039;&#039;. Alternatively, you can hover the script and click the &#039;&#039;Run&#039;&#039; button in the end of the row.&lt;br /&gt;
&lt;br /&gt;
Note that when running a script in the UI, the script must not contain commands where &#039;&#039;ExecuteInClientSide&#039;&#039; is enabled, because that is only supported when running scripts using [[QPR_ProcessAnalyzer_ScriptLauncher|QPR ScriptLauncher]].&lt;br /&gt;
&lt;br /&gt;
=== Stopping Script ===&lt;br /&gt;
# On the left side projects hierarchy, select the project where the script is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script and from the right-click context menu select &#039;&#039;&#039;Stop&#039;&#039;&#039;. Alternatively, you can hover the script and click the &#039;&#039;Stop&#039;&#039; button in the end of the row.&lt;br /&gt;
&lt;br /&gt;
Note that it may take a while for a script to actually stop, depending on what kind of operation the script is executing when it&#039;s stopped.&lt;br /&gt;
&lt;br /&gt;
=== Viewing Script Log ===&lt;br /&gt;
It&#039;s possible to see the script log of the last run, and monitor the currently running script progress. Logs for older runs are not available in the UI, nut they are stored by the system.&lt;br /&gt;
&lt;br /&gt;
To see the logs:&lt;br /&gt;
# On the left side projects hierarchy, select the project where the script is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script and in the right-click context menu select either &#039;&#039;&#039;View last run log&#039;&#039;&#039; or &#039;&#039;&#039;View current run log&#039;&#039;&#039;. (The script needs to be running to open the current run log.)&lt;br /&gt;
# If keeping the current run log open, the latest log entries are updated automatically every two seconds.&lt;br /&gt;
&lt;br /&gt;
More information about [[QPR_ProcessAnalyzer_Logs#Script_Log|Script Log]].&lt;br /&gt;
&lt;br /&gt;
=== Creating Script ===&lt;br /&gt;
# On the left side projects hierarchy, select the project where you want to create a script.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Click the &#039;&#039;&#039;New&#039;&#039;&#039; button and click &#039;&#039;&#039;Script&#039;&#039;&#039;. Define a name for the script and the scripting &#039;&#039;&#039;Language&#039;&#039;&#039; (either &#039;&#039;&#039;Expression&#039;&#039;&#039; or &#039;&#039;&#039;SQL&#039;&#039;&#039;), and then click &#039;&#039;&#039;Create&#039;&#039;&#039;. Note that script names must be unique within a project.&lt;br /&gt;
&lt;br /&gt;
Note that the scripting language cannot be changed after the script has been created, so a new script needs to be created to change the language.&lt;br /&gt;
&lt;br /&gt;
Note that each script in the same project needs to have a unique name.&lt;br /&gt;
&lt;br /&gt;
=== Deleting Script ===&lt;br /&gt;
# Select the project where the script(s) to be deleted are located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select one or several scripts to be deleted.&lt;br /&gt;
# Click the &#039;&#039;&#039;Delete&#039;&#039;&#039; button and click &#039;&#039;&#039;Delete&#039;&#039;&#039; to the confirmation message.&lt;br /&gt;
&lt;br /&gt;
Note that if the script is being run, it cannot be deleted.&lt;br /&gt;
&lt;br /&gt;
=== Renaming Script ===&lt;br /&gt;
# Select the project where the script to be renamed is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script to be renamed.&lt;br /&gt;
# Click the &#039;&#039;&#039;Rename&#039;&#039;&#039; button.&lt;br /&gt;
# Change the script name in the opening dialog and click &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Moving Script ===&lt;br /&gt;
Scripts can be moved by dragging them with the left mouse button from the right side list to the target project in the left side hierarchy. Alternatively, you can first select the scripts, then from the right-click context menu select &#039;&#039;&#039;Move to&#039;&#039;&#039; and finally select the target project.&lt;br /&gt;
&lt;br /&gt;
=== Duplicating Script ===&lt;br /&gt;
# Select the project where the script to be duplicated is located.&lt;br /&gt;
# Open the &#039;&#039;&#039;Scripts&#039;&#039;&#039; tab.&lt;br /&gt;
# Select the script to be duplicated.&lt;br /&gt;
# Click the &#039;&#039;&#039;Duplicate&#039;&#039;&#039; button. A duplicate of the script is created.&lt;br /&gt;
&lt;br /&gt;
=== Viewing Script Run Results ===&lt;br /&gt;
Script runs can be [[Managing_Scripts#Running_Script|started]] and [[Managing_Scripts#Stopping_Script|stopped]] in the UI. Note that when running scripts using the UI, return values or results of the script cannot be viewed. If you want to use scripts that return data, there are following options:&lt;br /&gt;
* Script can write data to the script log&lt;br /&gt;
* Script can write data to a datatable&lt;br /&gt;
* Script can be called from a dashboard and use the dashboard to present the returned data (see more below).&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Dropdown_List_Selector&amp;diff=28401</id>
		<title>Dropdown List Selector</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Dropdown_List_Selector&amp;diff=28401"/>
		<updated>2026-05-25T08:35:22Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64553&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Dropdown List Selector&#039;&#039;&#039; enables dynamic behavior to dashboards by allowing users to make selections that affect charts and other components in the dashboard. Thus, the Dropdown List Selector can be used to set parameters for the calculations in charts. The Dropdown List Selector is usual dropdown list where user can select a value from a list of predefined values.&lt;br /&gt;
&lt;br /&gt;
The dropdown list is linked to other components of the dashboard using variables: The selected value is stored to a variable, which is used by the other components. To make the behavior work, the variable needs to be configured both to the dropdown list and the charts using it. For charts, variables are bound using either [[Chart_Linked_Settings|linked settings]] or directly using tags in custom expressions (e.g. &#039;&#039;&amp;lt;#tagName&amp;gt;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The Dropdown List Selector can be configured flexibly based on any data in the model, and the contents of the list updates automatically when the model data changes. Note that the Dropdown List Selector is not linked to the filters of the dashboard (for filtering, use the &#039;&#039;Case attribute filter&#039;&#039; or &#039;&#039;Event type filter&#039;&#039; components).&lt;br /&gt;
&lt;br /&gt;
== Add Dropdown List Selector to dashboard ==&lt;br /&gt;
Dropdown List Selector is added to dashboard by activating the [[QPR_ProcessAnalyzer_Dashboard_Designer#Editing_Dashboards|Add component mode]] and clicking the &#039;&#039;Dropdown List Selector&#039;&#039; in the tool palette. Mandatory settings are &#039;&#039;Variable name&#039;&#039; and &#039;&#039;List items&#039;&#039; for the Dropdown List Selector to show. When adding the Dropdown List Selector, also the linked variable needs to be defined to the dashboard as follows:&lt;br /&gt;
# When in dashboard designer in the [[QPR_ProcessAnalyzer_Dashboard_Designer#Editing_Dashboards|Edit mode]], click the dots menu on top right and click &#039;&#039;&#039;Dashboard Properties&#039;&#039;&#039;.&lt;br /&gt;
# Open the &#039;&#039;&#039;Variables&#039;&#039;&#039; tab.&lt;br /&gt;
# Define a name for the variable in the available textbox. The name can be chosen freely.&lt;br /&gt;
# Set the behavior to be &#039;&#039;&#039;Stored variable&#039;&#039;&#039;. (When using this behavior, the selected value in the dropdown list is stored to the dashboard when the dashboard is saved.)&lt;br /&gt;
# Click the &#039;&#039;&#039;Done&#039;&#039;&#039; button on top right.&lt;br /&gt;
# The variable needs to be defined also to the Dropdown List Selector settings in the &#039;&#039;Variable name&#039;&#039; field.&lt;br /&gt;
# Save the dashboard.&lt;br /&gt;
&lt;br /&gt;
== Dropdown List Selector settings ==&lt;br /&gt;
Dropdown List Selector has the following settings:&lt;br /&gt;
* &#039;&#039;&#039;Variable name&#039;&#039;&#039;: Name of the variable that is linked to this dropdown list. When user makes a selection in the dropdown list, the selection is stored to the variable.&lt;br /&gt;
* &#039;&#039;&#039;Title&#039;&#039;&#039;: Explaining title (label) for the dropdown list that is visible in the dashboard. If no title is defined, an automatic title is derived based on the chosen &#039;&#039;List items&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Dropdown list mode&#039;&#039;&#039;: Defines whether the list allows single or multiple selected values.&lt;br /&gt;
* &#039;&#039;&#039;Analyzed objects&#039;&#039;&#039;: Types of process mining objects where the &#039;&#039;List items&#039;&#039; are calculated from. Based on this selection, there are different options available for the &#039;&#039;List items&#039;&#039; and &#039;&#039;1. measure&#039;&#039;. The Analyzed objects selection works similarly as the [[QPR_ProcessAnalyzer_Chart#Analyzed_Data|same selection in charts]].&lt;br /&gt;
* &#039;&#039;&#039;List items&#039;&#039;&#039;: Select what kind of items the dropdown list is showing. There are variety of options to choose from, and the options depend on what has been selected as the &#039;&#039;Analyzed objects&#039;&#039;. This selection is similar to the [[QPR_ProcessAnalyzer_Chart#Selecting_Measures.2C_Dimensions_and_Columns|dimension selection in charts]].&lt;br /&gt;
* &#039;&#039;&#039;Sorting&#039;&#039;&#039;: Defines a column based on which items are sorted in the list.&lt;br /&gt;
* &#039;&#039;&#039;Maximum rows&#039;&#039;&#039;: Maximum number of items shown by the list. This setting can be used if desired to show only the most relevant items. Listing more than thousands of items may cause the list to work very slowly, so showing lot of items, consider what&#039;s the practical maximum from the performance point of view.&lt;br /&gt;
* &#039;&#039;&#039;1. measure&#039;&#039;&#039;: The dropdown list can optionally show aggregated/summarized information for each of the shown item. When the first measure is selected, possibility to define a second measure appears. The measures work similarly as [[QPR_ProcessAnalyzer_Chart#Selecting_Measures.2C_Dimensions_and_Columns|measures in charts]].&lt;br /&gt;
* &#039;&#039;&#039;Follow dashboard filters&#039;&#039;&#039;: Whether dashboard filters are applied to the query when getting the list items.&lt;br /&gt;
* &#039;&#039;&#039;Chart filter&#039;&#039;&#039;: Filter rules that are applied to the query when getting the list items.&lt;br /&gt;
* &#039;&#039;&#039;[[Chart_Linked_Settings|Linked settings]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039;: Model to which the query is made to get the list items.&lt;br /&gt;
* &#039;&#039;&#039;[[QPR_ProcessAnalyzer_Chart#Layout_Settings|Layout settings]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Variable value format ==&lt;br /&gt;
When using a Snowflake model, the Dropdown List Selector stores the variable using the [[Stringified_Value_Format|stringified format]]. When using an in-memory model, the variable values is stored in the json format (https://www.w3schools.com/js/js_json_intro.asp). The reason for the different behavior is that the stringified format is more versatile, so it was taken into use for Snowflake (which was implemented after the original in-memory). The [[Chart_Linked_Settings|linked settings]] in charts by default use the stringified format, so when working with in-memory models, you need to change the &#039;&#039;valueFormat&#039;&#039; parameter in the linked settings.&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Filter_Selectors&amp;diff=28399</id>
		<title>Filter Selectors</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Filter_Selectors&amp;diff=28399"/>
		<updated>2026-05-25T07:50:58Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64553&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter selectors are an easy way to add and change filter rules in a dashboard. If certain filters are commonly changed when using a dashboard, it&#039;s recommended to add a filter selector to the dashboard for that type of filter. There are filter selectors available for [[#Case_attribute_filter_selector|case attribute values]] and [[#Event_type_filter_selector|event filtering by event types]]. Before a filter selector can be used with an object-centric model, the base object type needs to be selected.&lt;br /&gt;
&lt;br /&gt;
When values are selected in the filter selector, a corresponding filter rule is created and it&#039;s visible in the dashboard header. The list and the filter rule are kept in synchronization, i.e., when the list is changed, the filter rule is updated, and when the filter rule is changed in the dashboard header, the list updates accordingly.&lt;br /&gt;
&lt;br /&gt;
== Case attribute filter ==&lt;br /&gt;
The Case attribute filter allows to easily create case filters based on the case attribute distinct values. Case attribute filter selector has the following settings:&lt;br /&gt;
* &#039;&#039;&#039;Case attribute&#039;&#039;&#039;: Select the case attribute the dropdown list is bound to.&lt;br /&gt;
* &#039;&#039;&#039;Title&#039;&#039;&#039;: Defines a custom title for the dropdown list, if the case attribute name as the default title is not sufficient.&lt;br /&gt;
* &#039;&#039;&#039;Link to Dashboard filter&#039;&#039;&#039;: When unchecked, selecting values from the list creates a filter rule that is visible in the dashboard header. When checked, selecting values from the list creates a hidden filter rule that is not shown in the dashboard header. In the former case, the filter rule is applied to the [[Dashboard_Variables#Dashboard_Variables|Filter]] variable, and in the latter case it&#039;s applied to the [[Dashboard_Variables#Dashboard_Variables|DashboardFilter]] variable.&lt;br /&gt;
* &#039;&#039;&#039;Chart filter&#039;&#039;&#039;: Optional filter rules applied to the shown values in the list. This filter can be used to limit which values are available in the list and how the shown case counts are calculated.&lt;br /&gt;
* &#039;&#039;&#039;Maximum rows&#039;&#039;&#039;: Maximum number of rows shown by the list. If there are more values available than this limit, clicking the list opens a search dialog instead which can be used to search any of the available values (even if there are millions of values). Usually, when there are small number of values to choose from, the dropdown list is the easiest to use. When there are lot of values, it&#039;s not practical to show them all in the dropdown list and thus the search dialog becomes useful.&lt;br /&gt;
* &#039;&#039;&#039;[[QPR_ProcessAnalyzer_Chart#Layout_Settings|Layout settings]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In addition, there are the [[QPR_ProcessAnalyzer_Chart#Layout_Settings|layout settings]] available.&lt;br /&gt;
&lt;br /&gt;
[[File:FilterSelectors.png]]&lt;br /&gt;
&lt;br /&gt;
== Event type filter ==&lt;br /&gt;
Event type filter selector is used to filter events by the event type names. There are the same settings available as in the [[#Case_attribute_filter_selector|Case attribute filter selector]], (except the case attribute selection is not applicable). The type of filter created is the include event types (note that the include cases by occurring event types is a different type of filter rule).&lt;br /&gt;
&lt;br /&gt;
== Dimension filter selector ==&lt;br /&gt;
The dimension filter selector (or just filter selector) is a generic filtering component that can filter distinct values from any type of dimensions. The component shows filterable values as selectable boxes for applying include filter rules. Values having no cases (due to other filter rules in the dashboard) are shown as grey and cannot be selected. If the dashboard filter contains a corresponding filter rule with the Filter selector, the Filter selectors is synchronized with the filter rule as follows:&lt;br /&gt;
# Selecting or unselecting boxes updates the filter rule values.&lt;br /&gt;
# Changes to the filter rule update the selected boxes in the filter selector.&lt;br /&gt;
# If all boxes are unselected, the corresponding filter rule is removed.&lt;br /&gt;
&lt;br /&gt;
The Filter selector has the following settings, divided into tabs:&lt;br /&gt;
===General Tab===&lt;br /&gt;
* &#039;&#039;&#039;Title&#039;&#039;&#039;: Defines a shown title for the Filter selector.&lt;br /&gt;
* &#039;&#039;&#039;Base object type&#039;&#039;&#039;: Base object type for the perspective of the created filter. Shown only when an object-centric model is selected.&lt;br /&gt;
* &#039;&#039;&#039;Filtered items&#039;&#039;&#039;: Similar to the [[QPR_ProcessAnalyzer_Chart#Selecting_Measures,_Dimensions_and_Columns|dimension]] selection, determining what kind of filter rules this selector creates or modifies.&lt;br /&gt;
* &#039;&#039;&#039;1. measure/2. measure/...&#039;&#039;&#039;: Zero-to-many measures shown for each filterable item. The measure values are shown each in a separate line below the filter value in the box.&lt;br /&gt;
* &#039;&#039;&#039;Maximum rows&#039;&#039;&#039;: Limits the number of items shown.&lt;br /&gt;
* &#039;&#039;&#039;Sorting&#039;&#039;&#039;: Defines how the items are sorted.&lt;br /&gt;
* &#039;&#039;&#039;Analyzed objects&#039;&#039;&#039;: Which objects the query is based on to get the items.&lt;br /&gt;
&lt;br /&gt;
===Layout Tab===&lt;br /&gt;
* See &#039;&#039;&#039;[[QPR_ProcessAnalyzer_Chart#Layout_Settings|Layout settings]]&#039;&#039;&#039;&lt;br /&gt;
In addition, the Filter Selector has the following setting available:&lt;br /&gt;
* &#039;&#039;&#039;Visualization&#039;&#039;&#039;: A selection whether to show the filterable items as cards or a multi-select dropdown list.&lt;br /&gt;
** &#039;&#039;&#039;Cards&#039;&#039;&#039;: The filterable items are shown as cards. When a card is selected without keys pressed, the previous selections are kept. When a card is selected with the Ctrl key pressed, previous selections are removed. When a card is selected with the Shift key pressed, all cards between the selection and the previous selection are selected (range selection).&lt;br /&gt;
** &#039;&#039;&#039;Multi-select list&#039;&#039;&#039;: The filterable items are shown as items in a dropdown list.&lt;br /&gt;
&lt;br /&gt;
===Filter Tab===&lt;br /&gt;
* &#039;&#039;&#039;Follow Dashboard Filters&#039;&#039;&#039;: Determines whether measure values are filtered by the dashboard filter rules. Affects also whether boxes are greyed.&lt;br /&gt;
* &#039;&#039;&#039;Default filtering&#039;&#039;&#039;: Whether the component is bound to filtering cases or events.&lt;br /&gt;
* &#039;&#039;&#039;Component Filter&#039;&#039;&#039;: If some filtered values need to be hidden, they can be additionally filtered by this setting.&lt;br /&gt;
&lt;br /&gt;
===Advanced Tab===&lt;br /&gt;
* &#039;&#039;&#039;Chart settings (editable)&#039;&#039;&#039;: Similar to [[QPR_ProcessAnalyzer_Chart#Advanced_Settings|the setting in charts]].&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Similar to [[QPR_ProcessAnalyzer_Chart#Visual_Settings|the setting in charts]].&lt;br /&gt;
* &#039;&#039;&#039;On-screen settings&#039;&#039;&#039;: Similar to [[Chart_On-screen_Settings|the chart on-screen settings]].&lt;br /&gt;
* &#039;&#039;&#039;Linked Settings&#039;&#039;&#039;: Similar to [[Chart_Linked_Settings|the chart linked settings]].&lt;br /&gt;
* &#039;&#039;&#039;Linked settings disabled&#039;&#039;&#039;: Selection to disable the Linked Settings.&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039;: Similar to [[Chart_Linked_Settings|the chart linked settings]].&lt;br /&gt;
* &#039;&#039;&#039;Object-centric perspective settings&#039;&#039;&#039;: Similar to [[QPR_ProcessAnalyzer_Chart#Analyzed_Data|the settings in charts]]. Shown only when an object-centric model is selected.&lt;br /&gt;
* &#039;&#039;&#039;Event type mapping&#039;&#039;&#039;: Similar to [[QPR_ProcessAnalyzer_Chart#Analyzed_Data|the setting in charts]].&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Filter_Selectors&amp;diff=28398</id>
		<title>Filter Selectors</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Filter_Selectors&amp;diff=28398"/>
		<updated>2026-05-25T07:43:39Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64553&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter selectors are an easy way to add and change filter rules in a dashboard. If certain filters are commonly changed when using a dashboard, it&#039;s recommended to add a filter selector to the dashboard for that type of filter. There are filter selectors available for [[#Case_attribute_filter_selector|case attribute values]] and [[#Event_type_filter_selector|event filtering by event types]]. Before a filter selector can be used with an object-centric model, the base object type needs to be selected.&lt;br /&gt;
&lt;br /&gt;
When values are selected in the filter selector, a corresponding filter rule is created and it&#039;s visible in the dashboard header. The list and the filter rule are kept in synchronization, i.e., when the list is changed, the filter rule is updated, and when the filter rule is changed in the dashboard header, the list updates accordingly.&lt;br /&gt;
&lt;br /&gt;
== Case attribute filter ==&lt;br /&gt;
The Case attribute filter allows to easily create case filters based on the case attribute distinct values. Case attribute filter selector has the following settings:&lt;br /&gt;
* &#039;&#039;&#039;Case attribute&#039;&#039;&#039;: Select the case attribute the dropdown list is bound to.&lt;br /&gt;
* &#039;&#039;&#039;Title&#039;&#039;&#039;: Defines a custom title for the dropdown list, if the case attribute name as the default title is not sufficient.&lt;br /&gt;
* &#039;&#039;&#039;Link to Dashboard filter&#039;&#039;&#039;: When unchecked, selecting values from the list creates a filter rule that is visible in the dashboard header. When checked, selecting values from the list creates a hidden filter rule that is not shown in the dashboard header. In the former case, the filter rule is applied to the [[Dashboard_Variables#Dashboard_Variables|Filter]] variable, and in the latter case it&#039;s applied to the [[Dashboard_Variables#Dashboard_Variables|DashboardFilter]] variable.&lt;br /&gt;
* &#039;&#039;&#039;Chart filter&#039;&#039;&#039;: Optional filter rules applied to the shown values in the list. This filter can be used to limit which values are available in the list and how the shown case counts are calculated.&lt;br /&gt;
* &#039;&#039;&#039;Maximum rows&#039;&#039;&#039;: Maximum number of rows shown by the list. If there are more values available than this limit, clicking the list opens a search dialog instead which can be used to search any of the available values (even if there are millions of values). Usually, when there are small number of values to choose from, the dropdown list is the easiest to use. When there are lot of values, it&#039;s not practical to show them all in the dropdown list and thus the search dialog becomes useful.&lt;br /&gt;
* &#039;&#039;&#039;[[QPR_ProcessAnalyzer_Chart#Layout_Settings|Layout settings]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In addition, there are the [[QPR_ProcessAnalyzer_Chart#Layout_Settings|layout settings]] available.&lt;br /&gt;
&lt;br /&gt;
[[File:FilterSelectors.png]]&lt;br /&gt;
&lt;br /&gt;
== Event type filter ==&lt;br /&gt;
Event type filter selector is used to filter events by the event type names. There are the same settings available as in the [[#Case_attribute_filter_selector|Case attribute filter selector]], (except the case attribute selection is not applicable). The type of filter created is the include event types (note that the include cases by occurring event types is a different type of filter rule).&lt;br /&gt;
&lt;br /&gt;
== Dimension filter selector ==&lt;br /&gt;
The dimension filter selector (or just filter selector) is a generic filtering component that can filter distinct values from any type of dimensions. The component shows filterable values as selectable boxes for applying include filter rules. Values having no cases (due to other filter rules in the dashboard) are shown as grey and cannot be selected. If the dashboard filter contains a corresponding filter rule with the Filter selector, the Filter selectors is synchronized with the filter rule as follows:&lt;br /&gt;
# Selecting or unselecting boxes updates the filter rule values.&lt;br /&gt;
# Changes to the filter rule update the selected boxes in the filter selector.&lt;br /&gt;
# If all boxes are unselected, the corresponding filter rule is removed.&lt;br /&gt;
&lt;br /&gt;
The Filter selector has the following settings, divided into tabs:&lt;br /&gt;
===General Tab===&lt;br /&gt;
* &#039;&#039;&#039;Title&#039;&#039;&#039;: Defines a shown title for the Filter selector.&lt;br /&gt;
* &#039;&#039;&#039;Base object type&#039;&#039;&#039;: Base object type for the perspective of the created filter. Shown only when an object-centric model is selected.&lt;br /&gt;
* &#039;&#039;&#039;Filtered items&#039;&#039;&#039;: Similar to the [[QPR_ProcessAnalyzer_Chart#Selecting_Measures,_Dimensions_and_Columns|dimension]] selection, determining what kind of filter rules this selector creates or modifies.&lt;br /&gt;
* &#039;&#039;&#039;1. measure/2. measure/...&#039;&#039;&#039;: Zero-to-many measures shown for each filterable item. The measure values are shown each in a separate line below the filter value in the box.&lt;br /&gt;
* &#039;&#039;&#039;Maximum rows&#039;&#039;&#039;: Limits the number of items shown.&lt;br /&gt;
* &#039;&#039;&#039;Sorting&#039;&#039;&#039;: Defines how the items are sorted.&lt;br /&gt;
* &#039;&#039;&#039;Analyzed objects&#039;&#039;&#039;: Which objects the query is based on to get the items.&lt;br /&gt;
&lt;br /&gt;
===Layout Tab===&lt;br /&gt;
* See &#039;&#039;&#039;[[QPR_ProcessAnalyzer_Chart#Layout_Settings|Layout settings]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Filter Tab===&lt;br /&gt;
* &#039;&#039;&#039;Follow Dashboard Filters&#039;&#039;&#039;: Determines whether measure values are filtered by the dashboard filter rules. Affects also whether boxes are greyed.&lt;br /&gt;
* &#039;&#039;&#039;Default filtering&#039;&#039;&#039;: Whether the component is bound to filtering cases or events.&lt;br /&gt;
* &#039;&#039;&#039;Component Filter&#039;&#039;&#039;: If some filtered values need to be hidden, they can be additionally filtered by this setting.&lt;br /&gt;
&lt;br /&gt;
===Advanced Tab===&lt;br /&gt;
* &#039;&#039;&#039;Chart settings (editable)&#039;&#039;&#039;: Similar to [[QPR_ProcessAnalyzer_Chart#Advanced_Settings|the setting in charts]].&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: Similar to [[QPR_ProcessAnalyzer_Chart#Visual_Settings|the setting in charts]].&lt;br /&gt;
* &#039;&#039;&#039;On-screen settings&#039;&#039;&#039;: Similar to [[Chart_On-screen_Settings|the chart on-screen settings]].&lt;br /&gt;
* &#039;&#039;&#039;Linked Settings&#039;&#039;&#039;: Similar to [[Chart_Linked_Settings|the chart linked settings]].&lt;br /&gt;
* &#039;&#039;&#039;Linked settings disabled&#039;&#039;&#039;: Selection to disable the Linked Settings.&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039;: Similar to [[Chart_Linked_Settings|the chart linked settings]].&lt;br /&gt;
* &#039;&#039;&#039;Object-centric perspective settings&#039;&#039;&#039;: Similar to [[QPR_ProcessAnalyzer_Chart#Analyzed_Data|the settings in charts]]. Shown only when an object-centric model is selected.&lt;br /&gt;
* &#039;&#039;&#039;Event type mapping&#039;&#039;&#039;: Similar to [[QPR_ProcessAnalyzer_Chart#Analyzed_Data|the setting in charts]].&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Object-Centric_Flowchart&amp;diff=28360</id>
		<title>Object-Centric Flowchart</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Object-Centric_Flowchart&amp;diff=28360"/>
		<updated>2026-05-19T07:29:59Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-63971&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An Object-centric flowchart visualizes process flows through different business objects and their relationships in an object-centric process mining model.&lt;br /&gt;
&lt;br /&gt;
For event types, the Object-centric flowchart shows the number of events occurred and the number of each type of objects going through the event. When hovering over an event type, a tooltip showing the following information is shown: the event type name, the total number of events, the number of objects where this event occurred, and the number of events the the object is related to.&lt;br /&gt;
&lt;br /&gt;
For flows, the Object-centric flowchart shows the number of flowing objects and the average duration of the flow. When hovering over a flow, a tooltip showing the following information is shown: the object type name, the start and end event type names, the number of flowing objects, and the average duration of the flow.&lt;br /&gt;
&lt;br /&gt;
== Presets ==&lt;br /&gt;
The Object-centric flowchart provides presets that deliver immediate, high-quality visualization of complex multi-object processes. The presets configure the flowchart to show the most relevant event types and object relationships, making it an ideal starting point for exploring object-centric models. When using some of the presets, you need to select the base object type for the preset to work.&lt;br /&gt;
&lt;br /&gt;
== Visibility Settings ==&lt;br /&gt;
The Object-centric flowchart visualizes event types and flows based on the most common process variations (ordered by object count descending). The flowchart shows only the event types and flows that belong to the defined number of top variations for each object type. You can adjust the number of variations using two methods:&lt;br /&gt;
* &#039;&#039;&#039;Manual Input&#039;&#039;&#039;: Type a specific number directly into the textbox in the bottom-left corner of the flowchart.&lt;br /&gt;
* &#039;&#039;&#039;Step-by-Step Adjustment&#039;&#039;&#039;: Use the plus (+) and minus (-) buttons to increase or decrease the count. Each press of the plus or minus button will show or hide at least one event type or flow in at least one of the displayed object types. Because of this, the stepper may skip certain numbers if those variations do not result in any visual changes to the flowchart. The buttons are automatically disabled when you reach the minimum (1 variation) or the maximum (the entire dataset is already shown).&lt;br /&gt;
Increasing the number of variations reveals more paths and event types, while decreasing it simplifies the view to show only the most frequent process paths. The maximum allowed value is determined by the object type that has the highest number of variations in the current dataset. If you input a larger number, it will automatically revert to this maximum.&lt;br /&gt;
&lt;br /&gt;
The variation stepper is designed to remember your preferred level of detail:&lt;br /&gt;
* &#039;&#039;&#039;Stored Value&#039;&#039;&#039;: The flowchart stores the specific value you define.&lt;br /&gt;
* &#039;&#039;&#039;Automatic Scaling&#039;&#039;&#039;: If you apply a filter that reduces the total number of variations available, the stepper value will decrease to match the filtered dataset.&lt;br /&gt;
* &#039;&#039;&#039;Automatic Recovery&#039;&#039;&#039;: When the filter is removed or the dataset increases, the stepper will automatically return to your original defined value.&lt;br /&gt;
&lt;br /&gt;
== Moving and Zooming ==&lt;br /&gt;
The Object-centric flowchart can be moved by mouse dragging (i.e. keep the left mouse button pressed while moving the mouse cursor). Use the mouse wheel to zoom in and out while the cursor is over the flowchart. You can also use the &#039;&#039;&#039;+&#039;&#039;&#039; and &#039;&#039;&#039;-&#039;&#039;&#039; buttons on the bottom right corner, which increase and decrease the zoom level by 10% in each step.&lt;br /&gt;
&lt;br /&gt;
There are two resets of the zoom and position available, &#039;&#039;&#039;Window width&#039;&#039;&#039; and &#039;&#039;&#039;100% zoom&#039;&#039;&#039;, which can be toggled by clicking the &#039;&#039;&#039;Reset zoom&#039;&#039;&#039; button in the bottom right. When zoom is 100%, Window width mode is activated, and when zoom is other than 100%, 100% zoom is activated.&lt;br /&gt;
&lt;br /&gt;
== Filtering ==&lt;br /&gt;
[[Process_Mining_Concepts#Filter_and_Filter_Rule|Filter rules]] can be created from the flowchart by selecting the event types and flows. When selecting only event types, you can create a filter which includes and excludes the selected event types or objects (i.e. filter the events based on event types or objects). When selecting only flows, you can create a filter to include or exclude only objects containing the selected flows.&lt;br /&gt;
&lt;br /&gt;
== Event type and flow KPI&#039;s ==&lt;br /&gt;
The Object-centric flowchart is able to show and visualize measures calculated for the event types and flows.&lt;br /&gt;
&lt;br /&gt;
For event types, the following visualizations are available:&lt;br /&gt;
* &#039;&#039;&#039;Event type name&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Total number of events of that type&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Number of objects where this event occurred (each object type separately)&#039;&#039;&#039;: The object type color is visualized next to the measure value.&lt;br /&gt;
* &#039;&#039;&#039;Number of occurred events where the object is related to (each object type separately)&#039;&#039;&#039;: The object type color is visualized next to the measure value.&lt;br /&gt;
&lt;br /&gt;
For flows, the following visualizations are available:&lt;br /&gt;
* &#039;&#039;&#039;Flow color&#039;&#039;&#039; is the color assigned to the object type.&lt;br /&gt;
* &#039;&#039;&#039;Number of flowing objects&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Average duration of the flow&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Object-centric flowchart general settings ==&lt;br /&gt;
The Object-centric flowchart settings can be opened by clicking the Object-centric flowchart so that it gets selected, and then clicking the settings button on the top right of the Object-centric flowchart. The Object-centric flowchart has the following settings in the &#039;&#039;&#039;General&#039;&#039;&#039; tab:&lt;br /&gt;
* &#039;&#039;&#039;Follow object-to-object relations&#039;&#039;&#039;: When unselected, the flowchart only shows event types in each object based on the event-to-object relations in the object-centric model. When selected, the flowchart shows event types in each object based on both the event-to-object and object-to-object relations.&lt;br /&gt;
* &#039;&#039;&#039;By Objects&#039;&#039;&#039; / &#039;&#039;&#039;By Events&#039;&#039;&#039;:  Mode selection:&lt;br /&gt;
** In the &amp;quot;By Objects&amp;quot; mode, you can select which event types for each object type are used. The lists show to which object types each event type is linked to with an event-to-object relation. You can use the color box to select the color for each object type. Each object type can be shown or hidden using the toggle button next to its list. The flowchart shows event types, flows, and start/end symbols only for shown object types.&lt;br /&gt;
** In the &amp;quot;By Events&amp;quot; mode, you can select which object types for each event type are used. A list item has the word &amp;quot;direct&amp;quot; for each object type where the event type is linked to with an event-to-object relation.&lt;br /&gt;
&lt;br /&gt;
== Object-centric flowchart layout settings ==&lt;br /&gt;
&#039;&#039;&#039;Layout&#039;&#039;&#039; tab has following settings:&lt;br /&gt;
* &#039;&#039;&#039;Title&#039;&#039;&#039;: User defined title visible above the flowchart.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: You can add a description, which users can access by clicking the info button in the flowchart&#039;s top right corner. The info button appears only when a description has been defined for the flowchart. This description can be used to provide additional insights into the flowchart. The description field supports multiple lines and allows for Markdown syntax (https://www.markdownguide.org/basic-syntax) and basic HTML formatting (including tags like b, i, u, h1, and h2). For example bolding, italic, underline, headings, lists and links can be added. See examples how to use the Markdown syntax from Snowflake presets. The dialog containing the description can be moved and resized, and users can continue to interact with the dashboard even while the dialog is open.&lt;br /&gt;
* &#039;&#039;&#039;Diagram initial zoom&#039;&#039;&#039;: Zoom level used when the dashboard containing the flowchart is opened. Available options:&lt;br /&gt;
** &#039;&#039;&#039;Window size&#039;&#039;&#039;: Flowchart fits to the visible screen entirely while being as large as possible.&lt;br /&gt;
** &#039;&#039;&#039;Window width&#039;&#039;&#039;: Flowchart width takes the entire area width. If height is greater than area, the top part of the flowchart is visible. In other case, flowchart is positioned vertically in the middle of the canvas.&lt;br /&gt;
** &#039;&#039;&#039;50/80/100/120/150/200% zoom&#039;&#039;&#039;: Flowchart zoom level is set to the defined percentage and top of the flowchart is aligned with the top of the canvas. If this would lead to empty space below the flowchart, position the flowchart in the center of the canvas instead.&lt;br /&gt;
* &#039;&#039;&#039;Highlight incoming and outgoing flows&#039;&#039;&#039;: Same as the [[Process_Flowchart#Flowchart_general_settings|setting for flowcharts]].&lt;br /&gt;
* &#039;&#039;&#039;Allow multiselect event types and flows&#039;&#039;&#039;: Same as the [[Process_Flowchart#Flowchart_general_settings|setting for flowcharts]].&lt;br /&gt;
* &#039;&#039;&#039;Allow zooming&#039;&#039;&#039;: Zooming the flowchart is allowed (using the mouse wheel and the zoom buttons). When not allowed, the zoom controls are not visible.&lt;br /&gt;
* &#039;&#039;&#039;Allow moving&#039;&#039;&#039;: Moving the flowchart in the canvas is allowed (using the mouse drag).&lt;br /&gt;
* &#039;&#039;&#039;Show zoom buttons&#039;&#039;&#039;: Zoom controls are shown in the right bottom corner of the flowchart.&lt;br /&gt;
* &#039;&#039;&#039;Background color&#039;&#039;&#039;: Background color of the flowchart. The color can also contain partial transparency (alpha value) or even be fully transparent. When the chart background has transparency, the color of the dashboard background is visible behind the chart.&lt;br /&gt;
* &#039;&#039;&#039;Border color&#039;&#039;&#039;: Border color of the chart. Like the background, border color can also contain transparency.&lt;br /&gt;
* &#039;&#039;&#039;Border width&#039;&#039;&#039;: Border width of the chart in pixels. When the width is zero, border is not visible.&lt;br /&gt;
* &#039;&#039;&#039;Border corner roundness&#039;&#039;&#039;: Border corner roundness in pixels. Zero means sharp corners.&lt;br /&gt;
* &#039;&#039;&#039;Export&#039;&#039;&#039;: The flowchart can be exported as png or svg image file.&lt;br /&gt;
&lt;br /&gt;
== Object-centric flowchart filtering settings ==&lt;br /&gt;
* &#039;&#039;&#039;Follow Dashboard Filters&#039;&#039;&#039;: When checked, the chart is filtered by the filters in the dashboard. When unchecked, the chart is not affected by filters in the dashboard, and thus the chart is based on data in the entire model.&lt;br /&gt;
* &#039;&#039;&#039;Apply Chart Filters First&#039;&#039;&#039;: Same as the [[QPR_ProcessAnalyzer_Chart#Filtering_Settings|setting for charts]].&lt;br /&gt;
* &#039;&#039;&#039;Allow Creating Filters&#039;&#039;&#039;: Same as the [[QPR_ProcessAnalyzer_Chart#Filtering_Settings|setting for charts]].&lt;br /&gt;
* &#039;&#039;&#039;Apply with Flowchart Object Filters&#039;&#039;&#039;: When checked, when selecting datapoints in the flowchart, the flowchart&#039;s object filter rules are included to the created filter as separate filter rules (located before the filter rule corresponding to the selected datapoints).&lt;br /&gt;
* &#039;&#039;&#039;Update filter during selection&#039;&#039;&#039;: Same as the [[QPR_ProcessAnalyzer_Chart#Filtering_Settings|setting for charts]].&lt;br /&gt;
* &#039;&#039;&#039;Object-centric Filter&#039;&#039;&#039;: Button to add object-centric filter rules that affect this Object-centric flowchart only. Filter rules can be edited by clicking them and removed from the recycle bin icon. The filters defined here filter the original object-centric model. If there are several filter rules defined, all of the individual rules must match.&lt;br /&gt;
&lt;br /&gt;
== Object-centric flowchart advanced settings ==&lt;br /&gt;
&#039;&#039;&#039;Advanced&#039;&#039;&#039; tab has following settings:&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039;: Select [[QPR ProcessAnalyzer Project Workspace#Models|model]] that is shown by the flowchart. This model selection overrides the model selection in the main header, allowing to create dashboards showing flowcharts from several models. Note that only object-centric models are available in the list.&lt;br /&gt;
* &#039;&#039;&#039;Settings available in preview mode&#039;&#039;&#039;: If there is no need for a user to change the chart settings when viewing the dashboard, this option can hide the settings in the [[QPR_ProcessAnalyzer_Dashboard_Designer#Editing_Dashboards|preview mode]]. This helps to make the dashboard cleaner looking as there is no settings button in the chart. Then changing the chart settings can only be done in the &#039;&#039;edit mode&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;On-screen settings&#039;&#039;&#039;: Event type and flow measure parameters can be defined as on-screen settings, similar to in [[QPR_ProcessAnalyzer_Chart#On-screen_Settings|charts]].&lt;br /&gt;
* &#039;&#039;&#039;Linked Settings&#039;&#039;&#039;: Same functionality for flowcharts as for [[QPR_ProcessAnalyzer_Chart#Linked_settings|Linked Settings in Charts]].&lt;br /&gt;
* &#039;&#039;&#039;Chart Settings (editable)&#039;&#039;&#039;: Contain the flowchart settings in the json format. Editing the json is also possible.&lt;br /&gt;
&lt;br /&gt;
== Add on-screen settings for object and event types ==&lt;br /&gt;
Configure following on-screen and linked settings to show the Object types and Event types dropdown lists above the flowchart.&lt;br /&gt;
&lt;br /&gt;
On-screen settings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;label&amp;quot;: &amp;quot;Show object types&amp;quot;,&lt;br /&gt;
		&amp;quot;type&amp;quot;: &amp;quot;root&amp;quot;,&lt;br /&gt;
		&amp;quot;parameter&amp;quot;: &amp;quot;objectTypes&amp;quot;,&lt;br /&gt;
		&amp;quot;maxWidth&amp;quot;: 400,&lt;br /&gt;
		&amp;quot;control&amp;quot;: &amp;quot;multiselectlist&amp;quot;,&lt;br /&gt;
		&amp;quot;dynamicType&amp;quot;: &amp;quot;OcelObjectTypes&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;label&amp;quot;: &amp;quot;Show event types&amp;quot;,&lt;br /&gt;
		&amp;quot;type&amp;quot;: &amp;quot;root&amp;quot;,&lt;br /&gt;
		&amp;quot;parameter&amp;quot;: &amp;quot;eventTypes&amp;quot;,&lt;br /&gt;
		&amp;quot;maxWidth&amp;quot;: 400,&lt;br /&gt;
		&amp;quot;control&amp;quot;: &amp;quot;multiselectlist&amp;quot;,&lt;br /&gt;
		&amp;quot;dynamicType&amp;quot;: &amp;quot;OcelEventTypes&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linked settings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;root&amp;quot;,&lt;br /&gt;
			&amp;quot;parameter&amp;quot;: &amp;quot;objectTypes&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;generic&amp;quot;,&lt;br /&gt;
			&amp;quot;parameter&amp;quot;: &amp;quot;flowchart.objectTypes&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;root&amp;quot;,&lt;br /&gt;
			&amp;quot;parameter&amp;quot;: &amp;quot;eventTypes&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;generic&amp;quot;,&lt;br /&gt;
			&amp;quot;parameter&amp;quot;: &amp;quot;flowchart.eventTypes&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=QPR_SaaS_Terms_and_Conditions&amp;diff=28329</id>
		<title>QPR SaaS Terms and Conditions</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=QPR_SaaS_Terms_and_Conditions&amp;diff=28329"/>
		<updated>2026-05-13T11:57:31Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: /* 5. Customer’s Use of the SaaS Services */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These QPR SaaS Terms and Conditions, together with the QPR General Terms and Conditions, shall apply to the delivery of the Software described in detail in the Purchase Order between QPR and the Customer, which are delivered to the Customer via information networks (“SaaS Services”) and the Support Services for such SaaS Services. &lt;br /&gt;
&lt;br /&gt;
Any definition used in these QPR SaaS Terms and Conditions, but not defined herein, has the meaning set forth in the QPR General Terms and Conditions. &lt;br /&gt;
&lt;br /&gt;
== 1. SaaS Services ==&lt;br /&gt;
&lt;br /&gt;
1.1 QPR shall deliver the SaaS Services identified in the Purchase Order to the Customer substantially as set out in the Agreement. The SaaS Services shall contain the required hardware and software platform, including the server hardware, network connectivity from the server hardware to the internet, and backups of the data in the environment.  &lt;br /&gt;
&lt;br /&gt;
1.2 QPR constantly develops its service offering and reserves the right to make changes to the SaaS Services, at any time, provided that such change does not have a material adverse effect on the agreed functionality of the SaaS Services or the agreed service levels. QPR will inform the Customer of changes and where reasonably possible with fourteen (14) days prior notice before the change takes effect.  &lt;br /&gt;
&lt;br /&gt;
== 2. Use Rights ==&lt;br /&gt;
&lt;br /&gt;
2.1 During the License Term and subject to the terms and conditions of the Agreement, QPR hereby grants to the Customer a non-exclusive and non-transferable license to use the SaaS Services solely for the Customer’s internal business operations.  &lt;br /&gt;
&lt;br /&gt;
2.2 The use of the SaaS Services is limited to the User Licenses or any other license metrics set out in the Purchase Order.  &lt;br /&gt;
&lt;br /&gt;
2.3 The Customer may not license, sublicense, rent, resell, lease, market, commercialize or otherwise assign, transfer, disclose or make available the SaaS Services in any form or manner to any person other than the Customer’s employees and third-party service providers without the written consent of QPR. The Customer’s third-party service providers shall not be permitted to use the SaaS Services for the benefit of any entities other than the Customer. The Customer shall itself monitor its use of the SaaS Services and report any use in excess of the agreed User Licenses to QPR. QPR may also monitor the use of the SaaS Services by the Customer to verify the Customer’s compliance with the Agreement and agreed User Licenses.  &lt;br /&gt;
&lt;br /&gt;
== 3. Support Services ==&lt;br /&gt;
&lt;br /&gt;
3.1 QPR shall provide the Customer with Support Services during the License Term substantially as set out in the Agreement. The Support Services are described in detail in [the Purchase Order and the Service Description / the prevailing QPR Customer Care Program published by QPR [insert link]. QPR reserves the right to make changes to the [Support Services / QPR Customer Care Program] at any time.  &lt;br /&gt;
&lt;br /&gt;
3.2 QPR agrees to provide all Support Services with due care, skill, and diligence. QPR may at its own discretion subcontract any or all of the Support Services to its authorized resellers, subcontractors, or representatives. &lt;br /&gt;
&lt;br /&gt;
3.3 The Support Services concern the use of the SaaS Services only. The following matters will not be covered by the Support Services:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Assistance relating to Third Party Software, integrations or any software, products or services other than the SaaS Services.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Assistance with a problem resulting from the misuse, improper use, unauthorized alteration or modification, or damage caused by misuse, of the SaaS Services.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Assistance with a problem resulting from the combination of the SaaS Services with other software, applications, systems or equipment to the extent such combination has not been approved by QPR.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Assistance with installing, configuring, using, and integrating any third-party product that the Customer has purchased separately, including but not limited to database systems, operating systems, web servers, browsers, network equipment, and firewall systems.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Assistance relating to integrations or interfaces with other software components or product versions that are not explicitly designated by QPR as compatible with the SaaS Services in use.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Assistance concerning product versions of the SaaS Services other than the most recent official release.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3.4 The Customer will be responsible for paying QPR’s standard fees as applicable from time to time for time and other resources provided by QPR to diagnose or attempt to correct any matter not covered by the Support Services as defined above.  &lt;br /&gt;
&lt;br /&gt;
3.5 Due to obsoleting of technologies of vendors, QPR will not provide Support Services for the SaaS Services in a runtime environment where components or products are no longer fully supported by vendors, even if the SaaS Services would have been supported in such runtime environment at the time of signing the Purchase Order.&lt;br /&gt;
&lt;br /&gt;
== 4. Service Levels ==&lt;br /&gt;
&lt;br /&gt;
4.1 QPR will use commercially reasonable efforts to ensure that the SaaS Services are available to use during any given time, except during maintenance windows, updates, and repair. Operation of the SaaS Services may require short breaks in the service outside maintenance windows. &lt;br /&gt;
&lt;br /&gt;
4.2 QPR will perform maintenance in hosting servers and environments in pre-scheduled maintenance windows. The standard maintenance windows will be communicated separately. In case of emergency maintenance requirements, QPR will use its commercially reasonable efforts to inform Customers of such maintenance needs at least 24 hours in advance. &lt;br /&gt;
&lt;br /&gt;
4.3 QPR cannot guarantee network availability between the Customer and the hosted environment, as network availability can involve numerous third parties and is beyond the control of QPR. QPR will not be liable for any downtime that the Customer experiences as a result of the Customer’s own network connectivity issues. &lt;br /&gt;
&lt;br /&gt;
4.4 QPR is obligated to start resolving any service outage or other problem with the SaaS Services within one (1) hour after receiving notification from the Customer during opening hours of QPR Customer Care. QPR will make efforts to determine whether the outage or other problem is within QPR&#039;s reasonable control. If QPR determines that the issue is attributable to QPR, the Customer will be credited an amount equal to the Fees paid for the SaaS Services for one (1) day for every 4 hours of downtime that the Customer experiences after QPR has received notification from the Customer. QPR will have no other liability to the Customer for failure to provide availability of the SaaS Services. &lt;br /&gt;
&lt;br /&gt;
== 5. Customer’s Use of the SaaS Services ==&lt;br /&gt;
&lt;br /&gt;
5.1 The Customer’s use of the SaaS Services must comply with all applicable laws, regulations, and ordinances, including any laws regarding the export of data or software. The Customer agrees to comply with reasonable instructions and specifications of QPR, including any guidance in or design of the SaaS Services. The Customer shall be solely responsible for ensuring that any use of the SaaS Services by the Customer’s employees is in accordance with the Agreement and the instructions and specifications of QPR. &lt;br /&gt;
&lt;br /&gt;
5.2 The Customer may use the SaaS Services solely for its internal business purposes. The Customer is not entitled to resell or in any other way distribute (including merger, consolidation or similar transaction) the SaaS Services to any third parties without the written consent of QPR.  &lt;br /&gt;
&lt;br /&gt;
5.3 The Customer acknowledges that the SaaS Services are delivered utilizing Amazon Web Services (“AWS”) and Snowflake&#039;s services. Third party services are exclusively governed by their respective terms and conditions.   &lt;br /&gt;
&lt;br /&gt;
5.4 QPR products contain powerful features, under which the Customer can perform mass operations involving complex structures and large amounts of data and processing. As many operations can be executed in parallel by different concurrent users, it is quite possible to exhaust the capacity of the underlying resources, like CPU, central memory, storage system, and network interfaces. The capacity and performance limits of the computing environment can eventually be reached even with a single user, by increasing the amount and complexity of data and performing big enough operations. QPR will never guarantee that an arbitrary end user scenario would not exhaust the resources of the computing environment. The Customer is responsible for dimensioning the computing environment and using QPR products in a sensible way.&lt;br /&gt;
&lt;br /&gt;
== 6. Information Security, Storage, and Backup ==&lt;br /&gt;
&lt;br /&gt;
6.1 The Customer shall be responsible for its devices, systems, applications, connections, and software as well as their functionality. The Customer shall be responsible for the protection of the Customer’s data communications and data systems and costs for communications and other comparable costs related to the use of the SaaS Services. &lt;br /&gt;
&lt;br /&gt;
6.2 The Customer Material is stored in a database file on hosted servers and it is backed up in accordance with the Service Description and QPR’s standard practices applicable from time to time.  &lt;br /&gt;
&lt;br /&gt;
6.3 QPR asserts no ownership or other rights to Customer Material. The Customer is solely responsible for having all required rights to use the Customer Material in the manner required by the SaaS Services or applicable laws, including but not limited to transferring the data to an information system maintained by a third party. Customer agrees not to transfer any illegal or infringing material to the SaaS Services. &lt;br /&gt;
&lt;br /&gt;
6.4 QPR may store the Customer Material at any geographical location within the European Economic Area (EEA) using any third-party storage providers it deems suitable. Should there be limitations as to where Customer Material can be stored geographically, the Customer is obliged to inform QPR before transferring any of such data to the SaaS Services. &lt;br /&gt;
&lt;br /&gt;
6.5 QPR personnel shall not access the Customer Material, except as necessary for resolving any technical problems of the SaaS Services, performing maintenance tasks, or performing agreed services agreed with the Customer, such as Support Services. &lt;br /&gt;
&lt;br /&gt;
6.6 QPR will use commercially reasonable efforts to provide and maintain a secure environment for and retain sufficient backups of all Customer Material. In the unlikely event of a security breach or unrecoverable loss of Customer Material caused by QPR, the exclusive remedy of the Customer will be limited to a refund of a maximum of the total amount paid by the Customer for the SaaS Services over the six (6) months preceding the event. The Customer agrees to assume the risk of any such security breach or data loss and agrees to hold QPR harmless thereof.  &lt;br /&gt;
&lt;br /&gt;
== 7. Term and Termination ==&lt;br /&gt;
&lt;br /&gt;
7.1 The Agreement shall enter into force on the date it has been duly signed by each party and shall continue for the License Term set out in the Purchase Order. After the License Term, the Agreement shall automatically renew for additional twelve (12) month renewal periods, unless terminated by either party with written notice to the other party at least three (3) months prior to the end of the License Term or the then-current renewal period. &lt;br /&gt;
&lt;br /&gt;
7.2 Either party may terminate the Agreement in accordance with the QPR General Terms and Conditions.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category: QPR ProcessAnalyzer]]&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
	<entry>
		<id>https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Tools&amp;diff=28315</id>
		<title>Create MCP Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.onqpr.com/pa/index.php?title=Create_MCP_Tools&amp;diff=28315"/>
		<updated>2026-05-13T04:39:32Z</updated>

		<summary type="html">&lt;p&gt;TeeHiet: TK-64611&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating MCP Tools ==&lt;br /&gt;
MCP tools are implemented using [[Managing_Scripts|scripts]] written in QPR ProcessAnalyzer expression language. A script will be added as the MCP tool when the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; checkbox is enabled in the [[Managing_Scripts#Script_Properties|Script Properties]]. Only system administrator users can enable the MCP tool checkbox. Also, scripts that are MCP tools, only system administrators can modify them because any changes to the MCP interface is restricted to system administrators for security reasons.&lt;br /&gt;
&lt;br /&gt;
To enable a script as an MCP Tool:&lt;br /&gt;
# Log in to QPR ProcessAnalyzer as a System Administrator.&lt;br /&gt;
# Open or create the script.&lt;br /&gt;
# For the script to be used as an MCP tool, give it a name. This name is then used as the MCP tool name. It is important to ensure that every script intended for MCP use has a non-empty, valid name, as clients may fail to discover tools with invalid names. The maximum length of the name is 50 characters.&lt;br /&gt;
# Open the properties of the script.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;MCP&#039;&#039;&#039; tab and select the &#039;&#039;&#039;MCP tool&#039;&#039;&#039; checkbox.&lt;br /&gt;
# Switch to the &#039;&#039;&#039;Description&#039;&#039;&#039; tab and provide a description. The description is added to the context of the client.&lt;br /&gt;
&lt;br /&gt;
== MCP Tool Settings ==&lt;br /&gt;
Every script can define its own &#039;&#039;&#039;McpTool&#039;&#039;&#039; configuration as JSON. Supported values are same as [https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool here], except for the &#039;&#039;&#039;name&#039;&#039;&#039; which is always generated automatically and can&#039;t be overridden. Defining the McpTool configuration will override any default configurations generated for scripts automatically by QPR ProcessAnalyzer. For example, specifying the value for &amp;quot;title&amp;quot; here will override the default functionality of using script&#039;s name as title of the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: The following JSON configures the MCP tool with a customized title and description, as well as some additional [https://github.com/modelcontextprotocol/csharp-sdk/blob/main/src/ModelContextProtocol.Core/Protocol/ToolAnnotations.cs MCP tool annotations]:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Example MCP tool title&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Example MCP tool description&amp;quot;,&lt;br /&gt;
    &amp;quot;annotations&amp;quot;: {&lt;br /&gt;
        &amp;quot;destructiveHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;idempotentHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;openWorldHint&amp;quot;: true,&lt;br /&gt;
        &amp;quot;readOnlyHint&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Defining Input Parameters ===&lt;br /&gt;
MCP tool input parameters are defined using a JSON schema following the [https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage Model Context Protocol&#039;s JSON Schema]. Each supported input parameter is listed under &#039;&#039;&#039;properties&#039;&#039;&#039;. By default, script don&#039;t enforce any schema.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: The following schema defines a script with five different types of parameters:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;stringParameter&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;String parameter&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
	&amp;quot;numberParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Number parameter&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;booleanParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Boolean parameter&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;arrayParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Array parameter&amp;quot;,&lt;br /&gt;
	  &amp;quot;nullable&amp;quot;: true,&lt;br /&gt;
	  &amp;quot;items&amp;quot;: {&lt;br /&gt;
		  &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;&lt;br /&gt;
	  }&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;objectParameter&amp;quot;: {&lt;br /&gt;
	  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
	  &amp;quot;description&amp;quot;: &amp;quot;Object parameter&amp;quot;,&lt;br /&gt;
	  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
	    &amp;quot;inner&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
After this, the tool can be called, for example, with the following set of parameters:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;stringParameter&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;numberParameter&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;booleanParameter&amp;quot;: true,&lt;br /&gt;
  &amp;quot;arrayParameter&amp;quot;: [ 1, 2, 3 ],&lt;br /&gt;
  &amp;quot;objectParameter&amp;quot;: { &amp;quot;inner&amp;quot;: &amp;quot;test&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Defining Structured Tool Output ===&lt;br /&gt;
Structured tool output is described using a JSON schema following the [https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage Model Context Protocol&#039;s JSON Schema]. By default, scripts don&#039;t enforce any schema and the result is considered to be just text.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;: The following example configures the script&#039;s return value to contain an object having the &amp;quot;models&amp;quot; property with information about each model:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;string&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;String value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;number&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Number value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;boolean&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Boolean value&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;array&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Array value&amp;quot;,&lt;br /&gt;
      &amp;quot;nullable&amp;quot;: true,&lt;br /&gt;
      &amp;quot;items&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;Object value&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;inner&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing MCP tools using QPR ProcessAnalyzer ==&lt;br /&gt;
When developing MCP tools, it might be useful try test them in QPR ProcessAnalyzer before publishing as MCP tools. Scripts (used as MCP tools) can be called in the [[Navigation_Menu#Expression_Designer|Expression Designer]]. The following example expression calls a script with some parameters and shows the return value as json:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
let returnValue = ScriptById(1).Run(#{&lt;br /&gt;
  &amp;quot;stringParameter&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;numberParameter&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;booleanParameter&amp;quot;: true,&lt;br /&gt;
  &amp;quot;arrayParameter&amp;quot;: [1, 2, 3]&lt;br /&gt;
  &amp;quot;objectParameter&amp;quot;: {&lt;br /&gt;
    &amp;quot;inner&amp;quot;: &amp;quot;test&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
return ToJson(returnValue);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Now, if script having id 1 has the following script source code:&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
#{&lt;br /&gt;
  &amp;quot;string&amp;quot;: stringParameter,&lt;br /&gt;
  &amp;quot;number&amp;quot;: numberParameter,&lt;br /&gt;
  &amp;quot;boolean&amp;quot;: booleanParameter,&lt;br /&gt;
  &amp;quot;array&amp;quot;: arrayParameter,&lt;br /&gt;
  &amp;quot;object&amp;quot;: objectParameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and is configured as specified in the previous chapter, the result of expression will be the following valid JSON object as string:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;string&amp;quot;: &amp;quot;hello&amp;quot;,&lt;br /&gt;
  &amp;quot;number&amp;quot;: 123.456,&lt;br /&gt;
  &amp;quot;boolean&amp;quot;: true,&lt;br /&gt;
  &amp;quot;array&amp;quot;: [1,2,3],&lt;br /&gt;
  &amp;quot;object&amp;quot;: {&amp;quot;inner&amp;quot;: &amp;quot;text&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>TeeHiet</name></author>
	</entry>
</feed>