Workflow Instructies
Dit artikel documenteert alle beschikbare workflow instructies in Ultimo. Instructies zijn de bouwstenen van workflows: elke XML-tag binnen een <Execution> blok is een instructie. Ze zijn gegroepeerd per categorie. Zie workflow-engine voor de algemene opzet van workflows en expressions voor expression functies.
Commonbewerken
Basis instructies die in vrijwel elke workflow voorkomen.
Assignbewerken
Wijs een waarde toe aan een property van een domain object. Kan binnen en buiten een #Transaction gebruikt worden. Binnen een Transaction worden wijzigingen naar de database geschreven; buiten een Transaction alleen in het geheugen.
Let op: Gebruik Assign NIET om een status te wijzigen. Gebruik daarvoor #ChangeStatus zodat de Status Matrix en Pre/Post workflows correct worden doorlopen.
<!-- Binnen Transaction: wijzigt het domain object in de database -->
<Transaction>
<Assign Name="Set Job.Description" Property="${Job.Description}" Value="${Job.FeedbackDescription}" />
<Assign Name="Set DateTime" Property="${Job.PmWorkOrder.LastMaintenanceDate}" Value="${Job.FinishedDate}" />
<Assign Name="Reset Preference" Property="${PreferredVendor.Preference}" Value="True" />
</Transaction>
<!-- Buiten Transaction: wijzigt alleen een interne property -->
<Assign Name="Set Cost property Empty" Property="${Cost}" Value="Empty" />
Attributen:
- Name - Beschrijving van de actie
- Property - Property reference, bijv. ${Job.Description}
- Value - Waarde, property reference, of expressie (met = prefix)
AssignTextbewerken
Wijs een String-waarde toe aan een property, specifiek voor meertalige omgevingen. Gebruik dit wanneer je een "multilingual", "neutral" of "string" waarde naar een ander type wilt converteren.
<Transaction>
<AssignText Name="Set Job.Description" Property="${Job.Description}"
Value="${KnowledgeTopic.Description}" SourceLanguage="EN-US" TargetLanguage="EN" />
</Transaction>
Extra attributen:
- SourceLanguage - Brontaal (bijv. EN-US)
- TargetLanguage - Doeltaal (bijv. EN)
- PreserveOtherMultilingualValues - Behoud andere taalwaarden bij toewijzing
AssignWhenEmptybewerken
Wijs een waarde toe ALLEEN als de property nog leeg is. Handig voor standaardwaarden die niet overschreven mogen worden.
<AssignWhenEmpty Name="Set HoursEmployee if still empty"
Property="${HoursEmployee}" Value="${Employee}" />
Commandbewerken
Voer een voorgedefinieerd commando uit. Commands zijn ingebouwde functionaliteitsblokken in Ultimo die niet als losse instructies beschikbaar zijn.
<Command Name="Job_CreateAndInitialize" CommandName="Job_CreateAndInitialize">
<Parameter Name="JobCreateMethod" Direction="In" Value="CreateApproved" />
<Parameter Name="Job" Direction="Out" OutputProperty="${Job}" />
</Command>
Attributen: - CommandName - Naam van het commando - Parameters - In/Out parameters
Commentbewerken
Voeg commentaar toe aan de workflow XML. Wordt niet uitgevoerd maar verbetert de leesbaarheid.
<Comment Comment="Korte beschrijving"><![CDATA[Uitgebreide uitleg van het proces]]></Comment>
CreateObjectbewerken
Maak een nieuw object-instantie aan, zoals een Dictionary of Status. Niet gebruiken voor domain objects - gebruik daarvoor #Insert.
<CreateObject Name="Create status" ObjectType="Status" OutputProperty="${Status}" />
<CreateObject Name="Create dictionary" ObjectType="Dictionary[String]" OutputProperty="${StopFilter}" />
SingleItemValidationbewerken
Valideer dat een lijst precies een element bevat. Als de lijst meer elementen bevat, wordt de workflow afgebroken met een foutmelding.
<SingleItemValidation Name="Get Single Item"
List="${ArticleSiteVendors}" OutputProperty="${ArticleSiteVendor}"
MessageCode="0000" AllowEmpty="True" />
Attributen:
- AllowEmpty - True als de lijst ook leeg mag zijn
Togglebewerken
Inverteer een Boolean waarde: True wordt False en vice versa.
<Toggle Name="Toggle RegisterStock" Property="${Article.RegisterStock}" />
UserContentbewerken
Uitbreidingspunt in een workflow waar consultants en klantbeheerders eigen logica kunnen toevoegen. Zie UserContent in de workflow engine.
<UserContent Name="Pre" />
<!-- ... standaard logica ... -->
<UserContent Name="Post" />
Consultant tip: Voor Bulk workflows moet UserContent een child van ForEach zijn.
Validationbewerken
Controleer een conditie. Als de conditie false retourneert, wordt de workflow afgebroken en een foutmelding getoond.
<Validation Name="Equipment verplicht"
Condition="${Job.Equipment} != Empty" MessageCode="9001">
<Parameter Name="Job" Direction="In" Value="${Job}" />
</Validation>
<Validation Name="Check threshold"
Condition="${TotalThreshold} + ${AbcCode.Threshold} <= 100" MessageCode="3844">
<Parameter Name="AbcCode" Direction="In" Value="${AbcCode}" />
</Validation>
Attributen:
- Condition - Expressie die true of false retourneert
- MessageCode - Code uit de Message tabel in de database. Custom messages starten bij 9000+
Consultant tip: Validation is ideaal in UserContent Pre om extra controles toe te voegen voor een statuswijziging.
Flow controlbewerken
Instructies voor conditionele logica, lussen en flow control.
Whenbewerken
Conditionele uitvoering: de instructies binnen When worden alleen uitgevoerd als de conditie true is. Buiten een Choose gedraagt When zich als een if. Binnen een Choose als een case.
<!-- Standalone if -->
<When Name="Status change requested" Condition="${ChangeStatusTo} != Empty">
<ChangeStatus Name="Change status" DomainObject="${Job}" NewStatus="${ChangeStatusTo}" />
</When>
<!-- Met property vergelijking -->
<When Name="Is preferred vendor" Condition="${PreferredVendor.Preference} == True">
<WorkflowCall Name="GetPreferredVendor" WorkflowName="ArticleSiteVendor_GetPreferredVendor">
<Parameter Name="PreferredVendor" Direction="In" Value="${PreferredVendor}" />
</WorkflowCall>
</When>
Choose / Otherwisebewerken
If-elseif-else constructie. De eerste When waarvan de conditie true is wordt uitgevoerd. Als geen enkele When matcht, wordt Otherwise uitgevoerd.
<Choose Name="Bepaal actie">
<When Name="X is 1" Condition="${x} == 1">
<Assign Name="Set result" Property="${Result}" Value="1" />
</When>
<When Name="X is 2" Condition="${x} == 2">
<Assign Name="Set result" Property="${Result}" Value="2" />
</When>
<Otherwise Name="Overig">
<Assign Name="Set result" Property="${Result}" Value="0" />
</Otherwise>
</Choose>
ChooseUserInteractionbewerken
Splits logica op basis van of er gebruikersinteractie beschikbaar is. Belangrijk voor workflows die zowel vanuit de UI als vanuit achtergrondprocessen (import, scheduler) kunnen draaien.
<ChooseUserInteraction Name="UI beschikbaar?">
<WithUserInteraction Name="Met UI">
<Dialog Name="ShowDialog" TitleCode="CONFIRM" />
</WithUserInteraction>
<WithoutUserInteraction Name="Zonder UI">
<Assign Name="Standaard" Property="${Job.Description}" Value="${Job.FeedbackDescription}" />
</WithoutUserInteraction>
</ChooseUserInteraction>
ForEachbewerken
Itereer over een lijst van items. De As property wordt automatisch aangemaakt binnen de loop en bestaat niet meer na afloop.
<ForEach Name="Keur werkorders goed" In="${CreatedWorkOrders}" As="NewWorkOrder">
<ChangeStatus Name="Approve" DomainObject="${NewWorkOrder}" NewStatus="WorkOrderStatus.Approved" />
</ForEach>
<!-- Met conditie (filter binnen de loop) -->
<ForEach Name="Loop items" In="${AbcDeterminationList}" As="AbcDetermination"
Condition="${AbcDetermination.Processed} == False && ${Continue} == True">
<!-- acties -->
</ForEach>
Attributen:
- In - Lijst om over te itereren (List[DomainObject])
- As - Naam van de loop-variabele
- Condition - Optionele filter: alleen items die voldoen worden verwerkt
Whilebewerken
Herhaal een blok totdat een conditie niet meer waar is. Heeft een cycle limit als beveiliging tegen oneindige lussen.
<While Name="Verwijder regels" Condition="${AllDeleted} == False" CycleLimit="2500">
<Transaction>
<GetList Name="Get batch" Type="InternalChargeLine" OutputProperty="${Lines}"
OrderBy="Id" Top="${BatchSize}">
<Filters>
<PropertyFilter PropertyName="Id.InternalCharge" Operator="=" PropertyValue="${InternalCharge}" />
</Filters>
</GetList>
<When Name="Geen regels meer" Condition="${Lines.Count} == 0">
<Assign Name="Klaar" Property="${AllDeleted}" Value="True" />
</When>
<ForEach Name="Delete" In="${Lines}" As="Line">
<DeleteObject Name="Delete" DomainObject="${Line}" />
</ForEach>
</Transaction>
</While>
Attributen:
- CycleLimit - Maximum aantal iteraties (default beveiliging)
- ContinueAtLimit - True om door te gaan bij het bereiken van de limiet (met voorzichtigheid gebruiken)
Counterbewerken
Verhoog een numerieke property met een stapgrootte. Equivalent aan Assign met een expressie.
<Counter Name="index" Property="${index}" Step="2" />
<Counter Name="index terug" Property="${index}" Step="-2" />
Stopbewerken
Beeindig de workflow. Verschillende modi beschikbaar:
| Mode | Effect |
|---|---|
Abort |
Stopt alle parent workflows, rollback transaction |
EndAll |
Beeindig huidige en parent workflows, resultaat is succesvol |
EndCurrent |
Beeindig alleen de actieve workflow |
EndUserContent |
Beeindig alleen de UserContent sectie |
<Stop Name="Stop" Mode="Abort" />
<Stop Name="Klaar" Mode="EndAll" />
WhenFeatureTogglebewerken
Controleer of een feature toggle actief is.
<WhenFeatureToggle Name="Check feature" Feature="ExampleFeature" />
WorkflowCallbewerken
Roep een andere workflow aan. Parameters worden doorgegeven via In/Out/InOut.
<WorkflowCall Name="Initialiseer job" WorkflowName="Job_CreateAndInitialize">
<Parameter Name="JobCreateMethod" Direction="In" Value="CreateApproved" />
<Parameter Name="Job" Direction="Out" OutputProperty="${Job}" />
</WorkflowCall>
Attributen:
- WorkflowName - Naam van de aan te roepen workflow
- EnforceNoUserInteraction - True om de WithoutUserInteraction-pad af te dwingen
Databasebewerken
Instructies voor database-operaties. Moeten altijd binnen een Transaction staan.
Transactionbewerken
Container voor alle database-operaties. Zonder Transaction kunnen GetList, Insert, ChangeStatus etc. niet worden gebruikt.
<Transaction>
<Insert Name="Insert" ObjectType="Job" OutputProperty="${NewJob}">
<Parameter Name="Status" Direction="In" Value="JobStatus.Created" />
</Insert>
</Transaction>
Attributen:
- Flush - Tussentijds naar database schrijven
- IncludeTrashedObjects - Verwijderde objecten meenemen in queries
- IncludeTranslationsForQuery - Vertalingen meenemen bij Query instructie
- IsolationLevel - Default (kan uncommitted data lezen) of ReadCommitted (alleen committed data)
Consultant tip: Gebruik
ReadCommittedalleen bij bekende locking/performance problemen.
Insertbewerken
Maak een nieuw domain object aan in de database. De Id wordt automatisch gegenereerd als autokey actief is.
<Insert Name="Insert Incident" ObjectType="Incident" OutputProperty="${Incident}">
<Parameter Name="Context" Direction="In" Value="${IncidentContext}" />
<Parameter Name="Status" Direction="In" Value="IncidentStatus.None" />
<Parameter Name="Description" Direction="In" Value="${Job.Description}" />
<Parameter Name="ReportDate" Direction="In" Value="${Job.StatusCreatedReportDate}" />
<Parameter Name="ReportEmployee" Direction="In" Value="${Job.ReportForeignKeyEmployee}" />
<Parameter Name="Site" Direction="In" Value="${Job.Site}" />
</Insert>
Attributen:
- ObjectType - Type domain object (Job, Equipment, Incident, etc.)
- OutputProperty - Property om het nieuwe object in op te slaan
- Parameters - Veldwaarden voor het nieuwe record (Direction altijd In)
Updatebewerken
Werk meerdere properties van een domain object bij in een instructie. Vervangt meerdere Assign instructies.
<Update Name="SetJobProperties" DomainObject="${Job}">
<Parameter Name="Context" Direction="In" Value="JobContext.TD" />
<Parameter Name="Status" Direction="In" Value="JobStatus.Created" />
</Update>
Copybewerken
Kopieer properties van het ene domain object naar het andere. De objecten hoeven niet van hetzelfde type te zijn, maar de property-namen en datatypes moeten overeenkomen.
<Copy Name="Copy CustomColumns" Source="${Job.ServiceDeskReportType}" Target="${Job}"
CopyType="OnlySetIfEmpty" CustomOnly="True" />
Attributen:
- CopyType - Overwrite (overschrijf bestaande waarden) of OnlySetIfEmpty (alleen lege velden vullen)
- CustomOnly - True om alleen custom properties te kopieren
ChangeStatusbewerken
Wijzig de status van een domain object via de Status Matrix. De matrix bepaalt of de overgang is toegestaan en welke Pre/Post workflows worden uitgevoerd.
<ChangeStatus Name="Activate" DomainObject="${Job}" NewStatus="JobStatus.Active" />
<ChangeStatus Name="Copy status" DomainObject="${Job2}" NewStatus="${Job1.Status}" />
Attributen: - DomainObject - Het object waarvan de status wordt gewijzigd - NewStatus - Nieuwe status (enum waarde, property reference, of numeriek) - UsedDate - Optionele datum/tijd voor de statushistorie
DeleteObjectbewerken
Verwijder een domain object. Dit omvat trash + delete, inclusief Pre/Post workflows.
Volgorde: StatusMatrix validatie -> PreTrash -> Status naar Trash -> PostTrash -> PreDelete -> Daadwerkelijke delete.
<DeleteObject Name="Delete" DomainObject="${Job}" />
TrashObjectbewerken
Markeer een domain object als verwijderd (soft delete). Het object kan nog hersteld worden.
<TrashObject Name="TrashJob" DomainObject="${Job}" />
UntrashObjectbewerken
Herstel een naar de prullenbak verplaatst domain object.
<UntrashObject Name="UntrashJob" DomainObject="${Job}" />
GetItembewerken
Haal exact een domain object op uit de database. Het resultaat MOET precies 1 record bevatten.
<GetItem Name="Get default status" Type="DefaultProgressStatusContextRecordStatus"
OutputProperty="${DefaultStatus}">
<Filters>
<PropertyFilter PropertyName="Id.DefaultProgressStatusContext.Id"
Operator="=" PropertyValue="${Job.ServiceDeskReportType.SetContext}" />
<PropertyFilter PropertyName="Id.Status" Operator="=" PropertyValue="1" />
</Filters>
</GetItem>
GetListbewerken
Haal meerdere domain objects op als lijst. De OutputProperty moet van type List[...] zijn.
<GetList Name="Get subjobs" Type="Job" OutputProperty="${SubjobList}"
OrderBy="ScheduledStartDate" OrderDirection="Ascending">
<Filters>
<PropertyFilter PropertyName="Multijob" Operator="=" PropertyValue="${Job}" />
<PropertyFilter PropertyName="ScheduledStartDate" Operator="<"
PropertyValue="${Job.ScheduledStartDate}" />
</Filters>
</GetList>
Attributen: - OrderBy / OrderDirection - Sortering - Top - Maximum aantal resultaten
GetCountbewerken
Tel het aantal records dat aan de filter voldoet.
<GetCount Name="Tel subjobs" Type="Job" OutputProperty="${SubJobCount}">
<Filters>
<PropertyFilter PropertyName="Multijob" Operator="=" PropertyValue="${Job}" />
</Filters>
</GetCount>
GetSum / GetMax / GetMinbewerken
Aggregatiefuncties op een specifieke property.
<GetSum Name="Sum Quantity" Type="ObjectBatch" OutputProperty="${SumQuantity}" PropertyName="QuantityOut">
<Filters>
<PropertyFilter PropertyName="JobMaterial" Operator="=" PropertyValue="${JobMaterial}" />
</Filters>
</GetSum>
<GetMax Name="Max price" Type="Article" OutputProperty="${MaxPrice}" PropertyName="Price" />
<GetMin Name="Min score" Type="RiskClass" OutputProperty="${MinScore}" PropertyName="FromScore" />
GetGroupedListbewerken
Haal een gegroepeerde lijst op. Output type is GroupedList[GroupKey, ItemType].
<GetGroupedList Name="Materials per warehouse" Type="JobMaterial"
OutputProperty="${GroupedMaterials}" GroupBy="Warehouse" OrderBy="Id">
<Joins>
<Join Name="Warehouse" Alias="warehouse" Type="LeftOuterJoin" />
</Joins>
<Filters>
<PropertyFilter PropertyName="Id.Job" Operator="=" PropertyValue="${Job}" />
</Filters>
</GetGroupedList>
Query / Subquerybewerken
Voer een geavanceerde query uit met custom projectie (specifieke kolommen).
<Query Name="GetDepartments" Type="Department" OrderBy="Id" OrderDirection="Ascending"
OutputProperty="${DepartmentResult}">
<Properties>
<Property Name="Id" Alias="DepartmentId" Type="GroupProperty" />
<Property Name="emp2.Description" Alias="Description" Type="GroupProperty" />
</Properties>
</Query>
IsReferredTobewerken
Controleer of een domain object door andere objecten wordt gerefereerd.
<IsReferredTo Name="Check references" DomainObject="${Job}" OutputProperty="${JobIsUsed}"
ExcludeTrashedRecords="True" />
Flushbewerken
Schrijf in-memory wijzigingen naar de database, zonder de transaction te beeindigen. Kan geheugen vrijmaken bij grote operaties.
<Flush Comment="Write changes to DB" />
Logbewerken
Schrijf een bericht naar een logbestand. Configureer de log via log.config.
<Log Name="Log" Description="New job created" LogName="Workflow" Type="Information">
<Parameter Name="NumberOfRecords" Direction="In" Value="${NumberOfRecords}" />
</Log>
Log types: Information, Warning, Error
Filtersbewerken
Filters worden gebruikt binnen GetItem, GetList, GetCount, GetSum, GetMax, GetMin en GetGroupedList.
PropertyFilterbewerken
De meest gebruikte filter. Vergelijkt een property met een waarde.
<PropertyFilter PropertyName="Status" Operator="=" PropertyValue="JobStatus.Active" />
<PropertyFilter PropertyName="Equipment" Operator="!=" PropertyValue="Empty" />
Operators: =, !=, >, <, >=, <=, Like
CombinedFilterbewerken
Combineer meerdere filters met AND of OR.
<CombinedFilter FilterOperator="And">
<PropertyFilter PropertyName="Id.Job" Operator="=" PropertyValue="${Job}" />
<PropertyFilter PropertyName="Status" Operator="=" PropertyValue="JobMaterialStatus.Created" />
</CombinedFilter>
<CombinedFilter FilterOperator="Or">
<PropertyFilter PropertyName="Status" Operator="=" PropertyValue="JobStatus.Active" />
<PropertyFilter PropertyName="Status" Operator="=" PropertyValue="JobStatus.Finished" />
</CombinedFilter>
InFilterbewerken
Filter op meerdere waarden tegelijk (SQL IN clausule).
<InFilter PropertyName="Status" Values="JobStatus.Active, JobStatus.Closed" />
<InFilter PropertyName="Id" Values="${WorkPeriodIds}" />
NotFilterbewerken
Inverteer een filter (SQL NOT).
<NotFilter>
<PropertyFilter PropertyName="Id.ProgressStatusNextAvailable" Operator="="
PropertyValue="${DefaultAvailable}" />
</NotFilter>
DateFilter / DatePartFilterbewerken
Filter op datum of een deel van een datum.
<DateFilter PropertyName="ActivateDate" Operator="=" PropertyValue="#{Environment.CurrentDate}" />
<DatePartFilter PropertyName="DepreciationStartDate" Operator="!=" PropertyValue="1" DatePart="Day" />
DatePart waarden: Hour, Day, Week, Month, Quarter, Year
BetweenFilterbewerken
Filter op een bereik (inclusief grenzen).
<BetweenFilter PropertyName="${Job.Cost}" LowValue="1000" HighValue="2000" />
PropertyEmptyFilterbewerken
Filter op lege waarden.
<PropertyEmptyFilter PropertyName="Description" />
WhenFilterbewerken
Conditionele filter: wordt alleen toegepast als de conditie waar is.
<WhenFilter Condition="${UseSiteFilter} == True">
<PropertyFilter PropertyName="Site" Operator="=" PropertyValue="${Job.Site}" />
</WhenFilter>
DistanceFilterbewerken
Filter op geografische afstand in meters.
<DistanceFilter FirstLatitude="52.123" FirstLongitude="5.456"
SecondLatitude="52.789" SecondLongitude="5.012" Operator="<" Distance="1000" />
Joinsbewerken
Joins worden gebruikt binnen Get-instructies om gerelateerde entiteiten mee te laden.
<GetList Name="Get items" Type="JobMaterial" OutputProperty="${Materials}">
<Joins>
<Join Name="Warehouse" Alias="warehouse" Type="LeftOuterJoin" />
<Join Name="Article" Alias="article" Type="InnerJoin" />
</Joins>
<Filters>
<PropertyFilter PropertyName="article.Description" Operator="Like" PropertyValue="%" />
</Filters>
</GetList>
Join types: InnerJoin, LeftOuterJoin
Communicationbewerken
Instructies voor communicatie: emails, reminders, afspraken.
Emailbewerken
Verstuur een email op basis van een TextTemplate. De template wordt uit de database gehaald via de code.
<Email Name="SendEmail" From="#{Settings.EmailSender}" To="${Job.Employee}"
CC="${Job.ReportEmployee}" RelatedSubjects="${Job}" EmailTemplateCode="0000"
Concept="true" OutputProperty="${Email}">
<Attachments>
<Attachment FileName="Bijlage.pdf" Data="${AttachmentData}" />
</Attachments>
</Email>
Attributen:
- From - Afzender (meestal #{Settings.EmailSender})
- To - Ontvanger: employee, lijst van employees, emailadres, of combinatie
- CC / BCC - Carbon copy / blind carbon copy
- RelatedSubjects - Domain objects gekoppeld aan de email (voor traceerbaarheid in Ultimo)
- EmailTemplateCode - Code van de TextTemplate in de database
- Concept - True als de email als concept moet worden opgeslagen (niet direct verzenden)
Consultant tip: Gebruik
Concept="true"tijdens testen zodat emails niet daadwerkelijk worden verstuurd.
Reminderbewerken
Stuur een interne reminder (notificatie) naar een of meer medewerkers.
<Reminder Name="Stuur herinnering" Recipients="${Recipients}"
Priority="${Priority}" ReminderTemplateCode="0000"
RelatedSubjects="${Job}" EnablePushNotifications="True" />
CreateAppointment / UpdateAppointmentbewerken
Maak of wijzig een afspraak in een externe agenda via email.
<CreateAppointment Name="Plan afspraak" From="#{Settings.EmailSender}"
To="${Job.Employee}" StartDate="${Job.ScheduledStartDate}"
EndDate="=#addminutes(${Job.ScheduledStartDate}, 30)"
Location="Werkplaats A" RelatedSubjects="${Job}" TemplateCode="0000"
OutputProperty="${Appointment}" />
Dialogbewerken
Instructies voor gebruikersinteractie via dialogen. Alleen beschikbaar als AllowUserInteraction="True".
Dialogbewerken
Toon een dialoogvenster aan de gebruiker.
<Dialog Name="VraagNaam" TitleCode="ASKFORNAME" AllowCancel="True">
<Container Border="True">
<Text Name="NewName" Value="${OriginalName}" OutputProperty="${NewName}"
LabelCode="NAME" Required="True" />
</Container>
</Dialog>
Dialog controlsbewerken
Beschikbare controls binnen een Dialog:
| Control | Beschrijving |
|---|---|
| Text | Tekstveld |
| TextArea | Groot tekstveld (meerdere regels) |
| Number | Numeriek veld |
| Date | Datumkiezer |
| DateTime | Datum+tijd kiezer |
| Time | Tijdkiezer |
| Duration | Duur (uren:minuten) |
| CheckBox | Vinkje |
| CheckBoxGroup | Groep vinkjes |
| RadioGroup | Keuzerondjes |
| ComboBox | Keuzelijst |
| SelectionList | Selectielijst uit database |
| EmailAddress | Email-adres selectie |
| FileSelector | Bestand uploaden |
| Signature | Digitale handtekening |
| Location | Locatiekiezer |
| Html | HTML-teksteditor |
| Password | Wachtwoordveld |
| Literal | Alleen-lezen tekst |
| ListSelector | Lijst met bron- en doellijst |
| SelectionPeriod | Periodeselectie |
Voorbeeld met meerdere controls:
<Dialog Name="UrenRegistratie" TitleCode="HOURREGISTRATION">
<Container TitleCode="DETAILS" Border="True">
<SelectionList Name="Employee" OutputProperty="${SelectedEmployee}"
ColumnName="EmpId" Required="True" LabelCode="EMPLOYEE" />
<Number Name="Hours" OutputProperty="${Hours}" LabelCode="HOURS"
DecimalPrecision="2" MinValue="0" />
<DateTime Name="StartDate" OutputProperty="${StartDate}"
LabelCode="STARTDATE" Required="True" IntervalMinutes="15" />
<TextArea Name="Remark" OutputProperty="${Remark}" LabelCode="REMARK"
TextAreaRows="4" />
</Container>
</Dialog>
Dialog validatiebewerken
<Validations>
<ValidationExpression Name="Check waarden ingevuld"
Condition="${Hours} != Empty || ${FixedPrice} != Empty"
MessageCode="1030" ValidationType="Error" TriggerType="OnClose" />
<ValidationWorkflow Name="Validate status"
WorkflowName="Validation_ChangeProgressStatus">
<Parameter Name="NewProgressStatus" Direction="In" Value="${NewStatus}" />
</ValidationWorkflow>
</Validations>
Dialog updatesbewerken
Gebruik UpdateWorkflow om dialoog-waarden dynamisch bij te werken:
<Updates>
<UpdateWorkflow Name="Get defaults" WorkflowName="Dialog_GetDefaults">
<Parameter Name="Employee" Direction="In" Value="${Employee}" />
<Parameter Name="DefaultCategory" Direction="Out" OutputProperty="${DefaultCategory}" />
</UpdateWorkflow>
</Updates>
User Inputbewerken
Messagebewerken
Toon een meldingsbericht aan de gebruiker.
<Message Name="Bevestiging" MessageCode="0169">
<Parameter Name="WorkOrder" Direction="In" Value="${WorkOrder}" />
</Message>
Questionbewerken
Stel een Ja/Nee (of Ja/Nee/Annuleer) vraag.
<Question Name="Bevestig" Type="YesNo" MessageCode="0000"
Default="Yes" OutputProperty="${QuestionResult}" />
ContinuationQuestionbewerken
Ja/Nee vraag waarbij "Nee" de workflow afbreekt.
<ContinuationQuestion Name="Doorgaan?" MessageCode="0846">
<Parameter Name="Article" Direction="In" Value="${JobMaterial.Article}" />
</ContinuationQuestion>
SystemDialogbewerken
Toon een systeemdialoog (bijv. een selectiescherm).
<SystemDialog Name="Kies Equipment" DialogName="SelectDomainObject">
<Parameter Name="EntityName" Direction="In" Value="Equipment" />
<Parameter Name="SqlWhereClause" Direction="In" Value="EqmContext = 1" />
<Parameter Name="DomainObject" Direction="Out" OutputProperty="${SelectedEquipment}" />
</SystemDialog>
Viewbewerken
Open een scherm na een workflow-actie.
<View Name="Open job" ViewName="DataEntryScreen">
<Parameter Name="DomainObject" Direction="In" Value="${CreatedJob}" />
<Parameter Name="ScreenName" Direction="In" Value="${FormName}" />
</View>
VerifyElectronicSignaturebewerken
Vraag de gebruiker om een elektronische handtekening (wachtwoord + reden).
<VerifyElectronicSignature Name="Verifieer" />
Import / Exportbewerken
Importbewerken
Importeer data vanuit XML of CSV.
<Import Name="Import data" Data="${Input}" OutputProperty="${Output}"
RollbackOnError="True" ProcessObjects="True" Culture="NL" />
Attributen:
- RollbackOnError - Rollback bij fouten
- ProcessObjects - Voer workflow business logica uit tijdens import
- ImportFormat - Xml (default) of Json
- ErrorOutputProperty - Property voor foutmeldingen
- ErrorCount / InsertCount / UpdateCount etc. - Tellerproperties
Exportbewerken
Exporteer data naar XML of CSV.
<Export Type="${ExportConnector.EntityToExport}" Data="${Data}"
OutputProperty="${Output}" ExportFormat="${ExportConnector.FileType}"
Culture="${ExportConnector.Culture}" Encoding="${ExportConnector.OutputEncoding}"
Separator="${ExportConnector.CsvSeparator}" />
Documentbewerken
CreateDocument / DocumentGridPagebewerken
Maak een Excel of XML document met data.
<CreateDocument Name="Export" DocumentType="Excel" FileName="Export.xlsx"
ConvertHtmlToPlainText="True">
<DocumentGridPage Name="Cost overzicht" PageTitle="Kosten" Type="Cost"
ViewfieldConfiguration="default">
<Properties>
<Property Name="Id" Alias="CostId" Type="Property" />
<Property Name="Context" Alias="Context" Type="Property" />
</Properties>
</DocumentGridPage>
</CreateDocument>
Downloadbewerken
Download een bestand uit de FileService. De workflow stopt na het downloaden.
<Download Name="Download rapport" FileName="Documents\Rapport.pdf" />
Filebewerken
Instructies voor bestandsbeheer in de Ultimo FileService.
| Instructie | Beschrijving |
|---|---|
| OpenFile | Open een bestand als stream |
| SaveFile | Sla een bestand op |
| CopyFile | Kopieer een bestand |
| MoveFile | Verplaats/hernoem een bestand |
| DeleteFile | Verwijder een bestand |
| FileExists | Controleer of bestand bestaat |
| CreateFolder | Maak een map aan |
| CopyDirectory | Kopieer een map |
| MoveFolder | Verplaats/hernoem een map |
| DeleteFolder | Verwijder een map |
| FolderExists | Controleer of map bestaat |
| GetFileList | Lijst van bestanden in een map |
OpenFilebewerken
Open een bestand uit de FileService als stream. Alle bestanden moeten binnen de FileServiceData-locatie staan.
<OpenFile Name="Open" FileName="Documents\input.txt" OutputProperty="${Stream}" Encoding="utf-8" />
Attributen:
- FileName - Pad binnen de FileService
- OutputProperty - Property van type FileServiceStreamContainer
- Encoding - Encoding (bijv. utf-8, utf-16, iso-8859-1)
SaveFilebewerken
Sla een bestand op in de FileService. Data moet van het type DocumentContainer zijn.
<SaveFile Name="Save" FileName="Documents\Report.pdf" Data="${ReportStream}" />
CopyFilebewerken
Kopieer een bestand naar een nieuwe locatie in de FileService.
<CopyFile Name="Copy" SourceFile="${Source.ImageFile}" TargetFile="${Target.ImageFile}" />
MoveFilebewerken
Verplaats of hernoem een bestand in de FileService.
<MoveFile Name="Move" SourceFile="Import\input.xml" TargetFile="Import\processed\input.xml" />
DeleteFilebewerken
Verwijder een bestand uit de FileService. Kan niet ongedaan worden gemaakt.
<DeleteFile Name="Delete" FileName="Import\${ConnectorId}\Input\upload" />
FileExistsbewerken
Controleer of een bestand bestaat in de FileService.
<FileExists Name="Check" FileName="${Dir}\${FileName}" OutputProperty="${Exists}" />
GetFileListbewerken
Haal een lijst van bestandsnamen op uit een map in de FileService.
<GetFileList Name="Get files" OutputProperty="${Files}" FolderName="Workflows"
SearchPattern="*.wfl" OrderBy="Name" />
Attributen:
- OutputProperty - Van type List[String]
- FolderName - Map in de FileService
- SearchPattern - Regex of wildcardpatroon voor bestandsnamen
- OrderBy - Sortering (bijv. Name)
CreateFolderbewerken
Maak een nieuwe map aan in de FileService.
<CreateFolder Name="MaakMap" FolderName="Documents" />
CopyDirectorybewerken
Kopieer een map inclusief inhoud naar een nieuwe locatie.
<CopyDirectory Name="Copy" SourceDirectory="${SourceDirectory}" TargetDirectory="${TargetDirectory}" />
MoveFolderbewerken
Verplaats of hernoem een map in de FileService.
<MoveFolder Name="Move" OriginalFolderName="${OldName}" NewFolderName="${NewName}" />
DeleteFolderbewerken
Verwijder een map uit de FileService.
<DeleteFolder Name="Delete" FolderName="${FullPath}" />
FolderExistsbewerken
Controleer of een map bestaat in de FileService.
<FolderExists Name="Check" FolderName="Documents" OutputProperty="${FolderExists}" />
Printbewerken
Druk data af naar een printer geconfigureerd in UCT.
<Print Name="Print" PrinterId="0001" FileName="Documents\Order.pdf"
Landscape="False" Data="${Data}" />
Attributen:
- PrinterId - Id van de printer in UCT
- FileName - Tijdelijke bestandsnaam voor printdata
- Landscape - True voor liggend formaat (niet van toepassing op email-printers)
- Data - De data om af te drukken
Reportbewerken
CreateReportbewerken
Genereer een rapport (Crystal Reports) in verschillende formaten.
<CreateReport Name="Genereer rapport" ReportName="job01" ReportType="Pdf"
OutputProperty="${ReportData}" ShowTrashedRecords="False">
<CollectInput Name="Input" DialogTitleCode="CRITERIA">
<CollectInputFormula Name="F1" ColumnName="EqmId" Operator="Like"
ResultType="string" SqlWhereClause="EqmContext = 1" />
</CollectInput>
<ReportParameter Name="P1" Value="${Job.Id}" />
<ReportFormulaValue Name="F1" ColumnName="JobId" Operator="=" Value="${Job.Id}" ResultType="string" />
</CreateReport>
ReportType opties: Pdf, Word, Excel, ExcelDataOnly, Rtf, EditableRtf, Csv, Html, Xml
Printbewerken
Druk data af naar een printer (geconfigureerd in UCT).
<Print Name="Print" PrinterId="0001" FileName="Documents\Order.pdf"
Landscape="False" Data="${Data}" />
Textbewerken
FormatTextbewerken
Formatteer tekst via de template engine. Gebruik een TextCode uit de database of een inline template.
<FormatText Name="Format label" TextCode="ARCGISCONDITIONPEROBJECT"
OutputProperty="${Title}" />
<FormatText Name="Format warning" TextCode="2938" OutputProperty="${Warning}">
<Parameters>
<Parameter Name="Reservation" Direction="In" Value="${Reservation}" />
</Parameters>
</FormatText>
CheckFormatText / UnformatTextbewerken
Reguliere expressies: valideer of parseer tekst.
<!-- Valideer met regex -->
<CheckFormatText Name="Check URL" Text="${Url}"
Mask="^https?://.*$" CaseSensitive="False" OutputProperty="${IsValid}" />
<!-- Parseer tekst met regex groepen -->
<UnformatText Name="Extract filename" Text="${UploadedFile}" Mask="[^\\]*$"
CaseSensitive="False" OutputProperty="${FileName}">
<Parameter Name="0" Direction="Out" OutputProperty="${FileName}" />
</UnformatText>
XMLbewerken
XmlParser / CsvToXmlParserbewerken
Parseer XML of CSV naar een XmlDocumentContainer voor verdere verwerking.
<XmlParser Name="Parse XML" Input="${Input}" OutputProperty="${XmlDoc}" />
<CsvToXmlParser Name="Parse CSV" Input="${Input}" Separator=";" Type="Employee"
OutputProperty="${XmlDoc}" Encoding="UTF-8" Action="InsertOrUpdate" HasHeaderLine="True" />
XmlTransformbewerken
Transformeer XML met een XSLT stylesheet.
<XmlTransform Name="Transform" Input="${XmlDoc}" XsltName="import.xslt"
OutputProperty="${TransformedDoc}" Encoding="UTF-8" />
XmlValidationbewerken
Valideer XML tegen een XSD schema.
<XmlValidation Name="Validate" Input="${XmlDoc}" XsdName="schema.xsd" />
Listbewerken
AddToList / RemoveFromListbewerken
Voeg items toe aan of verwijder items uit een lijst.
<AddToList Name="Voeg toe" List="${Articles}" Item="${Article}" />
<RemoveFromList Name="Verwijder" List="${Jobs}" Item="${Job}" />
Filterbewerken
Filter een lijst op basis van een conditie.
<Filter Name="Niet-lege items" InList="${InList}" OutList="${ResultList}"
As="${value}" Condition="${value} != Empty" />
Mathbewerken
Add / Subtractbewerken
Reken met twee numerieke waarden.
<Add Name="Verhoog teller" ValueLeft="${Counter}" ValueRight="1" OutputProperty="${Counter}" />
<Subtract Name="Bereken verschil" ValueLeft="100" ValueRight="${Used}" OutputProperty="${Remaining}" />
Data (Test)bewerken
Instructies voor het beheren van testdata in scenario-tests.
InsertTestDatabewerken
Maak testdata aan voor een scenario. De testdata wordt automatisch verwijderd wanneer het scenario klaar is. Benader testdata via ${TestData.[Name]}. Naamconventie: recordtype-prefix gevolgd door twee cijfers in lowercase, bijv. emp01, job01, eqm01.
<InsertTestData Name="OBJ1" ObjectType="Job" />
<!-- Benader via ${TestData.OBJ1} -->
Attributen: - Name - Naam van de testdata (wordt gebruikt als referentie) - ObjectType - Type entiteit om aan te maken (Job, Employee, Equipment, etc.) - Parameters - Veldwaarden voor het testrecord
Let op: Bij een compound key hoeft alleen de LineId leeg gelaten te worden; de Id wordt automatisch gegenereerd.
SetRelationbewerken
Stel een relatie in op een testdata-object. Gebruik dit voor properties die niet gezet kunnen worden tijdens creatie, of voor circulaire referenties.
<SetRelation Name="Set Multijob" Relation="${TestData.Job.Multijob}" Value="${TestData.Job}" />
Attributen:
- Relation - Referentie naar de relatie, bijv. ${TestData.JOB1.Employee}
- Value - Waarde van de relatie
Datebewerken
CalculateWeekOfYearbewerken
Bereken het weeknummer van een datum.
<CalculateWeekOfYear Name="Weeknummer" Date="#{Environment.CurrentDate}" WeekOfYear="${WeekDate}" />
Debugbewerken
Debugbewerken
Toon een debug-bericht. Alleen in Development/Test omgevingen. De workflow stopt bij het debug-bericht.
<Debug Name="Debug" Message="${Job.HoursCalculated}" />
<Debug Name="Debug expression" Message="#{Environment.CurrentDateTime}" />
<Debug Name="Debug berekening" Message="#round(3.33335, 2)" />
Consultant tip: Verwijder altijd Debug instructies voor deployment naar productie. In productie zorgt Debug voor een foutmelding.
Gerelateerde artikelenbewerken
- workflow-engine - Algemene opzet van de workflow engine
- expressions - Expression functies
- workflow-patronen - Veelvoorkomende patronen
- workflow-debugger - Debugging tips