Release Notes

Matrix: update from a spreadsheet

posted Apr 20, 2018, 3:43 PM by Chad Boyer   [ updated Apr 21, 2018, 10:10 AM by Eric Patrick ]

The QBO Matrix View panel supports updating a matrix from a spreadsheet (CSV file).  One can:
  • Export a matrix view via Options-> Export to CSV
  • Update the matrix data in Excel (or another spreadsheet editor)
  • Drop the revised spreadsheet on the Matrix View header to update the matrix
In order for this to work, navigate to Design > Configuration > Modules, choose the Matrix modules, and from the Settings tab, ensure the MatrixViewImport setting is set to true. (The underlying application setting is qbo.Application.Properties.Settings.MatrixViewImport.)

Additionally, one can:
  • Copy an existing matrix to a new matrix: from the Matrix Summary's Edit menu, choose Copy.  
  • Export a Matrix: from the Matrix Summary's Edit menu, choose Export.
  • Import a Matrix: from Home > Import Data, choose the QBO XML engine, and drop an exported matrix onto the import panel.
Technical notes:
  • Updating a matrix from a spreadsheet requires each column have a matching Input our Output column
  • CSV files need to have its columns wrapped in quotes for each field

qbo.MethodElement.js extended to respond to Events

posted Apr 16, 2018, 4:11 PM by Philip Raath

qbo.MethodElement can now trigger an API call in response to an Event.

To configure, assign the Event to the renderOnEvent property of the MethodElement options.

Code example:
<div name="EventTests">
          <input type="button" id="testButton" value="Click Me!"/>
          <div id="Question3" data-behavior="MethodElement" data-methodelement-options="{{'className': 'SLSLoan', 'operation': 'Search', 'parameters':                                                                                               'DisplaySize=1', 'renderOnEvent': ''}}"></div>
          <input type="hidden" id="PIConstant" data-methodelement-value="Question3.PIConstant"/>

GUI Example:

Tests: Theme.ashx/Specs?Library=Behaviors\Spec.MethodElement.js

qbo.Depend extended to respond to Button clicks

posted Apr 6, 2018, 5:16 PM by Philip Raath   [ updated Apr 6, 2018, 5:18 PM ]

qbo.Depend can now toggle the 'disabled' class on the basis of a button click.

To assign this dependency, use the pattern: {buttonId} = click as the 'depends' parameter.

<div id="buttonTestsDiv">
    <label for ="buttonTest1">Button Test 1</label>
    <div class="controls">
      <input type="button" id="testButton" value="Click me!"/>
      <input type="text" id="buttonTest1" data-behavior="Depend" data-depend-options="{{'depends': 'testButton = click', 'condition': 'and',                         'disabledClass': 'disabled'}}"/>

Tests: Theme.ashx/Specs?Library=Behaviors\Spec.Depend.js

C# 7 Features with Visual Studio 2015

posted Apr 6, 2018, 10:19 AM by Eric Patrick

QBO is starting to use new C# 7 features. To compile with Visual Studio 2015, you need to add the Microsoft.Net.Compilers Nuget package.

See also a Stack Overflow post: How to use C# 7 with Visual Studio 2015?

Rolling Log Update

posted Mar 6, 2018, 2:58 PM by Brian Espinoza

qbo.Logging has been extended with RollingLog and RollingLogTraceListener classes. This extends LogEntry (ETL) functionality for anyone wishing to log RollingLog from all machines to an outside database / table (dbo.RollingLog). This table can be accessed from the front-end UI via /Logging/RollingLog.ashx/ or /Logging/Logging.ashx > DailyLogTable.
  • This update was built with standalone Logging in mind. As such: 
    • To Log and/or Search, RollingLogTraceListenerData will scan your connection strings for one of name: "qbo.Logging". Should "qbo.Logging" not exist in your connection strings, it will cascade to your "qbo.Default" connection.
    • RollingLog is implemented entirely as an ISearchable and performs individual sqlClient queries for inserting RollingLog entries, searching records, and dashboard display.
      • RollingLog.ashx routes through the RollingLogTraceListener to perform ISearchable hits.
      • Note that ISearchable and all tracelisteners that implement it have been extended with a Dashboard method. This will be a breaking change, meaning you will want to get latest on qbo.Logging, qbo.Logging.Amazon, and qbo.Message.Amazon since these projects implement ISearchable TraceListeners.
  • You can now query and filter RollingLog directly from the front-end.
    • Hit the magnifying glass to expand filter options.
  • The "Message" field contains most of your error message. We have added a Full-Text Index to this column and will support Full-Text Index query notation.
    • msdn offers some support here:
    • Message supports the following:
      • { AND | & } | { AND NOT | &! } | { OR | | } : searchTerm1 AND searchTerm2
      • { OR | | } : searchTerm1 OR searchTerm2
      • { NEAR | ~ } : searchTerm1 NEAR searchTerm2
      • Chained NEAR:  searchTerm1 ~ searchTerm2 ~ searchTerm3
      • Prefixing -- akin to Quand%: "Quand*"
    • Note that "Message" still supports using "%" in searches but these queries are not indexed and may be non-performant.
  • Searches automatically filter records based on qbo.Application default settings for SiteName.
    • This prevents the scenario in which SLS can see QMS RollingLog records.
  • With Phase I, we've ensured that the RollingLog table captures all exceptions currently being captured by RollingLog.txt
    • Phase II we might consider logging IIS errors or Event Logs.

Deployment Instructions:
  • Get latest qbo.Logging, qbo.LogginWeb, qbo.Logging.Amazon, qbo.Message.Amazon, qbo.Application
  • In web.config, add or uncomment "DailyLogTable" under loggingConfiguration > Listeners and under categorySources > add[name = "General"] > Listeners
  • Ensure connection strings has a connection for "qbo.Logging". Ping the QMS team for this.
  • Deploy and test.

Visual Studio 2017 and MSBuild Deployments

posted Jan 22, 2018, 4:50 PM by Eric Patrick   [ updated Jan 30, 2018, 10:51 AM ]

For a machine with Visual Studio 2017 only, see qbo.Sample.2017.proj for changes needed to make CI deployments work.

To sum up:
  • Download and install the Build Tools for Visual Studio 2017
  • Ensure your project file targets VS version 15 (2017), instead of 14 (2015):
    • <VS Condition=" '$(VS)'=='' ">15.0</VS>
  • Copy the Microsoft database target (SSDT, SQL) from the Visual Studio folder to the BuildTools folder:
    • Copy-Item 'C:\Program Files (x86)\Microsoft visual studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\SSDT\*.*' 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v15.0\SSDT'
    • Copy-Item 'C:\Program Files (x86)\Microsoft visual studio\2017\Professional\Common7\IDE\Extensions\Microsoft\SQLDB' 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Extensions\Microsoft\SQLDB' -recurse -force
  • Run the 2017 build:
    • & 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\amd64\MSBuild' .\qbo3.Sample.proj 
To integrate database builds into a fully automated CI environment, consider installing the MS Build data tools Nuget package.

IService Permission Update - Breaking Change

posted Jan 17, 2018, 3:50 PM by Greg Kent   [ updated Jan 24, 2018, 3:08 PM ]

IService permission verification has been updated to match functionality of statement verification. Specifically:
  • VerifyPermission now verify pattern {ClassName}{ServiceName}. It previously used pattern {ServiceName}. This is a breaking change
  • VerifyPermission now supports allowing inheritance which is set within each Service. Note if Service.AllowInheritance is null, it cascades to value set for qbo.Application.Properties.Settings.Default.AllowInheritance

Fix Service Permissions

SystemFunction contains a new method ListInvalidServiceFunctions that will:
  • Identify any SystemFunctions that match the old naming pattern for each ServiceName {ServiceName}
  • Insert new SystemFunction {ClassName}{ServiceName} if it does not exist
  • Copy all SystemPermissions tied to original SystemFunction under new SystemFunction
It also supports a preview method. Usage:

  • /Security/SystemFunction.ashx/ListInvalidServiceFunctions?Output=Xml - will display a preview of the old SystemFunction, new SystemFunction and count of SystemPermissions that are associated with old SystemFunction. No inserts occur.
  • /Security/SystemFunction.ashx/ListInvalidServiceFunctions?Output=Xml&Update=true - will Insert new SystemFunctions and SystemPermissions with above logic
  • Contact module has a Service registered labeled AccurintSearch which has permissions tied to SystemRole User.  There is a corresponding SystemFunction labeled AccurintSearch
  • After the update, there will be a new SystemRole record ContactAccurintSearch with a SystemPermission record pointing to SystemRole User
Note with class inheritance, classes such as Organization,Court, Person and other classes that inherit from Contact will show Services registered under their classes. ListInvalidServiceFunctions will also insert SystemFunctions for:

  • OrganizationAccurintSearch
  • CourtAccurintSearch
  • PersonAccurintSearch
  • etc.
and copy SystemPermissions for each.


Please ensure the update is run before Queue Service or any site activity occurs on the target platform. This is becuase SystemFunctions will automatically insert if they do not exist. By being inserted, they will be excluded from ListInvalidServiceFunctions and SystemPermissions will not be copied. 

Import Engine Async Implementation

posted Dec 28, 2017, 6:18 AM by Eric Patrick

All QBO Import Engines contained in qbo.Import have been converted to support asynchronous processing.  The net result is:
  • All IImportEngine methods now support asynchronous processing
  • Import Engines now favor an asynchronous code path and invoke QBO methods signatures using AbstractObject/InvokeAsync. If necessary this will cascade to synchronous operations when asynchronous is not implemented.
See qbo.Import.Tests for unit tests on all QBO Import Engines.

Datasets reset Readonly flag

posted Dec 12, 2017, 4:01 PM by Chad Boyer   [ updated Dec 12, 2017, 5:53 PM by Eric Patrick ]

The introduction of AbstractObject.ExecuteDataSetAsync uses Database.ExecuteReaderAsync, loading the DataReader into a DataSet, since SqlDatabase does not have a native ExecuteDataSetAsync method. This has an unintended side effect: each column in the DataSet is marked as read-only (DataColumn.ReadOnly = true). This side effect is only an issue when the application tier attempts to modify the data set in memory, such as is done with USPSCertified mailing plugin.

To address this issue, the ObjectConfiguration.NormalizeDataSet static method has been extended to explicitly mark columns as writable. AbsractObject.ExecuteDataSetAsync calls NormalizeDataSet before returning a data set, effectively making the result backward compatible with ExecuteDataSet.

Setting DataColumn.ReadOnly = false is now the default behavior; this can be feature-switched with the application setting qbo.Application.Properties.Settings.Default.DataSetColumnsWritable (default is true).


posted Dec 5, 2017, 4:52 PM by Philip Raath   [ updated Dec 5, 2017, 4:57 PM ]

Revision: 35679

New-qboImage function is available in qbo.ps1.

There are two required parameters: 
  • Name - name of the image to be created
  • InstanceId - reference to source instance

1-10 of 40