Background![]() Creation of tasks requires basic knowledge of:
The QBO3 UI allows a power user to define the layout of a form (including an unlimited number of fields) by adding Questions. Questions may be any type of HTML form element, and may map to any data point available in the database. If they do not map to a pre-existing data point in the database, the field will be tracked as part of an XML fragment in the ImportForm.XmlData column. This allows power users to create fields 'on the fly' if they wish. Status-Based Routing
A common use case is to submit a task for review and approval. Implied in such a use case is the possibility of rejection, or requiring a submitted to re-work the task to provide amplifying information. Thus, a single form may appear to multiple work lists, for multiple people, as it transitions between statuses.
Implementing this requirement in QBO is best done by:
When an Import Form record is updated, the ImportFormTransition trigger will:
RepeatabilityWhen a task is created by a workflow, or via a GET request (
e.g. ImportForm.ashx/Render?Template=My Task&Object=Organization&ObjectID=1 ), QBO will either create a new task or bind to an existing task based on the task template's repeatable setting:
To demonstrate use cases for repeatability, we'll create three tasks all bound to 'Organization':
The 'Company Profile' task template may be defined as 'one per parent', and any number of workflows may prompt a user to enter or review the Company Profile. Regardless of how many workflows include the 'Company Profile' task, only one copy of the task will be created per Organization. In this situation:
A 'Support Ticket' task template may be defined as 'many per parent', and each time a support ticket task is added to an Organization, a new task is created. There may be multiple support tickets open simultaneously for a given organization, and each may be completed independently of any other support tickets. In this situation:
The 'Contract' task template may be defined as 'one active per parent', meaning that there may only be one 'active' Contract task at a time. In this situation:
Note that there is a more complicated use case for 'one active per parent': creating a task that's part of a workflow, before the workflow is created. Let's assume that:
The 'Draft Contract' task template can be defined as 'one active per parent'. Then the following happens:
To handle this use case, 'active' tasks are task that:
Tech note: the implementation of this behavior may be overridden in Design > Configuration > ImportForm > Statements > SelectByTemplate
PDF FormsThe qbo.Attachment.PDF plugins supports using form-enabled PDF documents as custom forms. This allows QBO 3 systems to plug-and-play existing PDF forms as custom forms.
Key methods include:
SummaryFlat Overview:
QBO data is stored in may tables. The AbstractObject/Summary() method returns a record, it's parents, siblings and children as multiple data tables, translated to XML. A rich DataSet or XML structure such is not usable by some third party software such as MS Word and Adobe Acrobat. For such products, AbstractObject/SummaryFlat will produce a single DataTable concatenating multiple DataTables together.
For example, assume we have the following structure:
ImportForm/SummaryFlat?Valuation_= &Valuation_Loan_= &Valuation_Property_= &Valuation_Comparables_=6 will create a single table structured as follows:
ImportFormID ImportForm ... all other ImportForm columns ... ... all ImportForm.XmlData elements ... Valuation_ValuationID Valuation_Valuation ... all other Valuation columns ... Valuation_Loan_LoanID Valuation_Loan_Loan ... all other Loan columns ... Valuation_Property_PropertyID Valuation_Property_Property ... all other Property columns ... Valuation_Comparable_0_ValuationComparableID Valuation_Comparable_0_ValuationComparable ... all other ValuationComparable columns for the first ValuationComparable record Valuation_Comparable_1_ValuationComparableID Valuation_Comparable_1_ValuationComparable ... all other ValuationComparable columns for the second ValuationComparable record ... and so on, until we reach the 6th one (because we passed Valuation_Comparables=6) Valuation_Comparable_5_ValuationComparableID Valuation_Comparable_5_ValuationComparable ... all other ValuationComparable columns for the sixth ValuationComparable record This is a very 'wide' table, but generally speaking, Word and Acrobat can handle it.
Choosing what relationship to include requires some thought. Once you've 'shaped' the data by determining the parameters you want, you can create a reusable Statement that stores these parameters in a configuration entry. For example, assume a Valuations system might create an ImportForm statement called 'ValuationStandardOutput', with the BaseOperation set to 'SummaryFlat', and the parameters defined above. Once done, multiple Import Form Templates, Attachment Templates, and such can reuse the 'ValuationStandardOutput' statement.
Extending the Task's FunctionalityCreating questions allows a power user without any knowledge of HTML, CSS or Javascript to quickly and easily create powerful data-enabled forms. Forms use an XSLT to render the form in the browser. If the questions do not quite cover the functionality needed, one can edit the form's XSLT directly. Each form template may have a Select, List and Edit XSLT. In most cases, the Edit XSLT is the one being used. QBO provides an in-browser XSLT Edit page to allow real-time modifications of the form layout.
By default, form XSLTs will import a library of standard QBO-specific XSLT templates, found in ImportForm.Library.xslt (and ImportForm.Library.Core.xslt).
Example: Embedding standard HTML
<div>Hello World!</div> <iframe width="420" height="315" src="//www.youtube.com/embed/a7nbmjkImHQ" frameborder="0" allowfullscreen></iframe> Example: Embedding a new field (not mapped to a standard QBO table and column)
<input type="text" name="MyNewField" value="{$XmlData//MyNewField}"/> Notes:
Example: Embedding an existing field
<input type="text" name="Loan_UPBAmount" value="{{//LoanItem/UPBAmount}}"/> Notes:
Example: Displaying a new field from another task
<xsl:value-of select=" {//ImportFormItem[ImportForm='My Other Form']/XmlData//SomeOtherField} "/> Notes:
|
Quandis Business Objects 3 > qbo.Decision >