Calculaties
Introductie
Wat zijn calculaties?
Met calculaties in Fortes Change Cloud kun je customvelden verrijken met logica. Ze worden geschreven in XML en kunnen bewerkingen uitvoeren zoals het optellen van velden, het vergelijken van waarden, het aggregeren van gegevens van onderliggende objecten, en meer. Calculaties vormen de ruggengraat van geavanceerde configuratie in FCC en maken geautomatiseerde gegevensverwerking mogelijk binnen portfolio's, projecten en andere objecten.
Wie gebruikt calculaties?
Calculaties worden aangemaakt en onderhouden door systeembeheerders en consultants die het datamodel van FCC configureren. Ze worden doorgaans gebruikt om veldwaarden te automatiseren, bedrijfsregels af te dwingen en afgeleide kengetallen te creëren binnen de portfolio- en projecthiërarchie.
Drie manieren om een customveld te vullen
Customvelden kunnen op drie manieren worden gevuld:
- Handmatige invoer: De gebruiker vult de waarde handmatig in.
- Conditionele logica: Er wordt alleen een waarde naar het veld geschreven als aan een specifieke voorwaarde wordt voldaan.
- Calculatie: De waarde wordt automatisch berekend met behulp van op XML gebaseerde calculatieblokken.
Objectenreferentietabel
Elk object in FCC heeft een referentienummer (foldertype). Deze nummers worden in calculaties gebruikt om specifieke objecttypes aan te spreken. Hieronder vind je de volledige referentietabel.
| Foldertype | Interne objectnaam | Engels | Nederlands |
|---|---|---|---|
| 3 | Person | Resource | Resource |
| 4 | KnowledgeRepository | Knowledge Repository | Kennisbibliotheek |
| 16 | Skill | Skill | Skill |
| 76 | Currency | Currency | Valuta |
| 81 | Timesheet | Time Sheet | Weekstaat |
| 83 | CostEntry | Cost / Hour Entry | Boekingsregel (kosten/uren) |
| 84 | TimesheetRow | Time Sheet Row | Weekstaatregel |
| 100 | Entry | Entry | Boekingsregel |
| 301 | DocumentBase | Document | Document |
| 302 | DocumentHistory | Document | Document |
| 500 | OrganizationalUnit | Organisational Unit | Organisatie-eenheid |
| 701 | Portfolio | Portfolio | Portfolio |
| 703 | PortfolioModel | Portfolio Model | Portfolio model |
| 711 | PortfolioDashboard | Custom Dashboard | Eigen Overzicht |
| 720 | Benefit | Benefit | Benefit |
| 730 | Scenario | Scenario | Scenario |
| 4900 | ProjectBase | Project Base | Project Base |
| 4901 | Idea | Idea | Idee |
| 4910 | ProgramProject | Programme | Programma |
| 4911 | ProgramProjectModel | Programme Model | Programmamodel |
| 5000 | P2Project | Project | Project |
| 5002 | P2ProjectTemplate | Project Model | Projectmodel |
| 5003 | ProjectReport | Portfolio Item | Portfolio-item |
| 5004 | ProjectReportsHistory | Version | Versie |
| 5005 | ProjectReportModel | Report Model | Rapportagemodel |
| 5006 | SavedProjectReport | Saved Portfolio Item | Bewaard portfolio-item |
| 5010 | ProjectPublication | Project publication | Project publication |
| 5031 | ProjectRole | Project Role | Project Rol |
| 5100 | P2Program | Folder | Map |
| 5110 | P2ProgramProject | MSP Programme | MSP Programma |
| 5111 | P2ProgramTemplate | MSP Programme Model | MSP-programmamodel |
| 5301 | P2Stage | Stage | Fase |
| 5302 | P2Product | Product | Product |
| 5303 | P2Workpackage | Workpackage | Werkpakket |
| 5499 | NonProjectActSets | NPA set container | NPA set container |
| 5500 | NonProject | Non-project Activity Set | Niet-project activiteitenset |
| 5501 | NonProjectCategory | Category | Categorie |
| 5502 | NonProjectActivity | Non-project Activity | Niet-project activiteit |
| 5510 | TimeRegistrationGroup | Time Entry Group | Tijdregistratiegroep |
| 5519 | TimeRegistrationConfigurations | Time Entry Configurations | Tijdregistratieconfiguraties |
| 5520 | TimeRegistrationConfiguration | Time Entry Configuration | Tijdregistratieconfiguratie |
| 5602 | PlanItem | Plan Item | Planning-item |
| 6001 | P2Issue | Issue | Issue |
| 6011 | P2Risk | Risk | Risico |
| 6021 | P2Quality | Quality review | Kwaliteitsbeoordeling |
| 6031 | P2Change | Change | Wijziging |
| 6041 | P2Action | Action | Actie |
| 6051 | P2Lessonlearned | Lesson learned | Leerpunt |
| 6061 | Order | Order | Order |
| 8017 | ProjectResource | Project Resource | Project Resource |
Calculatiesyntaxis
Enkele calculatie
Calculaties worden geschreven in XML. De meest voorkomende vorm is een enkele calculatie:
<calculation>
<!-- This is a comment and has no effect on the XML code -->
<block></block>
</calculation>
Belangrijke regels:
- Elke calculatie moet beginnen met
<calculation>en eindigen met</calculation>. Deze tags zijn hoofdlettergevoelig. - Binnen een calculatie definieer je blokken die een specifieke bewerking uitvoeren (bijvoorbeeld
<cmp/>,<add/>). - Gebruik XML-commentaar (
<!-- ... -->) om te documenteren wat de calculatie doet. Dit wordt beschouwd als best practice.
Meerdere calculaties
Als je meerdere calculatieblokken nodig hebt (bijvoorbeeld om afhankelijk van voorwaarden verschillende logica uit te voeren), plaats je ze binnen een <calculations>-element (meervoud):
<calculations>
<!-- Execute when condition A is met -->
<calculation>
<condition></condition>
<block></block>
</calculation>
<!-- Execute when condition B is met -->
<calculation>
<condition></condition>
<block></block>
</calculation>
</calculations>
Tips voor het schrijven van XML
- Gebruik inspringing. Inspringen is niet vereist om de XML te laten werken, maar het maakt calculaties veel makkelijker om te lezen en te onderhouden.
- Gebruik commentaar. Documenteer je keuzes en leg uit wat elk blok doet. Zo blijft de calculatie begrijpelijk, ook wanneer iemand anders deze later opnieuw bekijkt.
Calculatieblokken
Calculatieblokken zijn de bouwstenen binnen een <calculation>. Elk blok voert een specifieke bewerking uit. Je kunt één of meerdere blokken gebruiken in een enkele calculatie.
Add
Het <add>-blok berekent de som van de opgegeven velden.
| Attribuut | Waarde | Omschrijving |
|---|---|---|
minus | true / false | Ingesteld op een <field> om de waarde te negeren |
Voorbeeld: Twee velden optellen:
<calculation>
<add>
<field>Custom1</field>
<field>Custom2</field>
</add>
</calculation>
Voorbeeld: Aftrekken (add met minus):
<calculation>
<add>
<field>Custom1</field>
<field minus='true'>Custom2</field>
</add>
</calculation>
Resultaat: Custom1 + (-Custom2) = Custom1 - Custom2
Vergelijken
Het <cmp>-blok vergelijkt een of meerdere velden/waarden. Geeft True, False of een aangepast resultaat terug.
| Attribuut | Waarden | Omschrijving |
|---|---|---|
value | Elke waarde | Vaste waarde die wordt gebruikt in de vergelijking |
condition | equals, smaller, smallerequals, greater, greaterequals, not, in, not in, empty, not empty | De vergelijkingsoperator |
result | Elke waarde | Aangepaste waarde die wordt teruggegeven als de vergelijking waar is |
Voorbeeld: Gelijkheidscontrole:
<calculation>
<cmp condition='equals' value='test'>
<field>Custom1</field>
</cmp>
</calculation>
Geeft True terug als Custom1 gelijk is aan "test".
Voorbeeld: Ongelijk met aangepast resultaat:
<calculation>
<cmp condition='not' value='test' result='my value'>
<field>Custom1</field>
</cmp>
</calculation>
Geeft "my value" terug als Custom1 niet gelijk is aan "test".
Voorbeeld: In lijst:
<calculation>
<cmp condition='in' value='value1,value2,value3'>
<field>Custom1</field>
</cmp>
</calculation>
Geeft True terug als Custom1 overeenkomt met een van de opgegeven waarden.
Voorbeeld: Groter dan met geneste waarde:
<calculation>
<cmp condition='greater'>
<field>Custom1</field>
<value>10</value>
</cmp>
</calculation>
Samenvoegen
Het <concat>-blok voegt meerdere velden of waarden samen tot één string.
| Attribuut | Waarde | Omschrijving |
|---|---|---|
separator | Elke waarde | Wordt geplaatst tussen de samengevoegde waarden. Standaard: geen scheidingsteken |
Het <field>-element binnen <concat> ondersteunt aanvullende attributen:
| Attribuut | Omschrijving |
|---|---|
offset | Aantal tekens dat wordt overgeslagen vanaf het begin van de veldwaarde |
length | Aantal tekens dat wordt behouden vanaf het begin van de veldwaarde |
minlength | Minimale lengte die de veldwaarde moet hebben |
Voorbeeld: Samenvoegen met scheidingsteken:
<calculation>
<concat separator=" " subfolders="true" relation="planning" foldertype="5602">
<field>Owner</field>
</concat>
</calculation>
Als er 3 planning-onderliggende objecten zijn, wordt het volgende teruggegeven: Owner1 Owner2 Owner3
Voorbeeld: Meerdere velden en waarden samenvoegen:
<calculation>
<concat separator="+">
<field>EntryType</field>
<field>P2Project</field>
<value>RowApproval</value>
</concat>
</calculation>
Geeft bijvoorbeeld terug: Planned+12345+RowApproval
Splitsen
Het <cut>-blok splitst een veldwaarde op basis van een scheidingsteken en geeft specifieke delen terug op basis van index.
| Attribuut | Waarde | Omschrijving |
|---|---|---|
delimiter | Elke waarde | Het teken waarop wordt gesplitst (standaard: spatie) |
indexes | Kommagescheiden indices | Welke delen worden teruggegeven (0-based) |
Voorbeeld: Selecteren op index (gescheiden door spaties):
<calculation>
<cut>
<field indexes='0,2'>Custom2</field>
</cut>
</calculation>
Als Custom2 = "One Two Three Four", wordt het volgende teruggegeven: OneThree
Voorbeeld: Selecteren op index met scheidingsteken:
<calculation>
<cut>
<field indexes='0' delimiter='-'>Custom1</field>
</cut>
</calculation>
Als Custom1 = "One-Two-Three-Four", wordt het volgende teruggegeven: One
Datum
Het <date>-blok berekent datums op basis van aangepaste periodes.
| Element | Omschrijving |
|---|---|
<field> | Het datumveld dat als invoer wordt gebruikt |
<startof> | Geeft het begin van een periode terug (bijvoorbeeld maand, jaar) |
<endof> | Geeft het einde van een periode terug |
<offset> | Telt tijdsintervallen op of trekt ze af (weken, maanden, kwartalen, jaren) |
Voorbeeld: Laatste dag van volgende maand:
<calculation>
<date>
<field>Portfolio veld 1</field>
<offset>
<scale>months</scale>
<intervals>1</intervals>
</offset>
<endof>
<scale>month</scale>
</endof>
</date>
</calculation>
Datumopmaak
Het <dateproperty>-blok geeft een datumveld weer als een specifieke tekstuele representatie.
| Attribuut | Waarde | Omschrijving |
|---|---|---|
format | Opmaakstring | Het te gebruiken datumopmaakpatroon |
Ondersteunde opmaaktokens:
| Token | Omschrijving | Voorbeeld |
|---|---|---|
G | Tijdperk | AD |
y / yyyy | Jaar | 1996; 96 |
M / MM | Maand in het jaar | July; Jul; 07 |
w | Week in het jaar | 27 |
W | Week in de maand | 2 |
D | Dag in het jaar | 189 |
d | Dag in de maand | 10 |
E | Dag van de week (tekst) | Tuesday |
a | AM/PM-aanduiding | PM |
H | Uur (0-23) | 0 |
h | Uur (1-12) | 12 |
m | Minuut | 30 |
s | Seconde | 55 |
S | Milliseconde | 978 |
z | Tijdzone | PST; GMT-08:00 |
Voorbeeld: Weeknummer:
<calculation>
<dateProperty format="WW">
<field>Enddate</field>
</dateProperty>
</calculation>
Voor einddatum 2010-01-08 wordt het volgende teruggegeven: 01
Voorbeeld: Jaar met label:
<calculation>
<dateProperty format="'Year: 'yyyy">
<field>Enddate</field>
</dateProperty>
</calculation>
Geeft terug: Year: 2010
Datumberekening
Het <datecalculation>-blok voert berekeningen uit op datumvelden.
Voorbeeld: Huidige datum:
<calculation>
<datecalculation>
<var>%currentdate%</var>
</datecalculation>
</calculation>
Voorbeeld: Eerste dag van het jaar:
<calculation>
<datecalculation>
<field>Custom1</field>
<startof>
<scale>year</scale>
</startof>
</datecalculation>
</calculation>
Voorbeeld: Laatste dag van de maand:
<calculation>
<datecalculation>
<field>Custom1</field>
<endof>
<scale>month</scale>
</endof>
</datecalculation>
</calculation>
Delen
Het <div>-blok deelt het ene veld door het andere.
| Attribuut | Waarde | Omschrijving |
|---|---|---|
minus | true / false | Ingesteld op een <field> om de waarde te negeren |
Voorbeeld: Delen door een vaste waarde:
<calculation>
<div>
<field>Custom1</field>
<value>3</value>
</div>
</calculation>
Voorbeeld: Delen door een genegeerd veld:
<calculation>
<div>
<field>Custom1</field>
<field minus="true">Custom2</field>
</div>
</calculation>
Folderfield
Het <folderfield>-blok neemt de waarde over van een veld van het huidige object of van een gerefereerd object.
Voorbeeld: Veld overnemen via referentie:
<calculation>
<folderfield>
<field reference="ProjectReport">FolderID</field>
</folderfield>
</calculation>
Voorbeeld: Percentage overnemen van huidige fase:
<calculation>
<folderfield>
<field reference="CurrentStage">PercentageCompleted</field>
</folderfield>
</calculation>
Max
Het <max>-blok evalueert twee waarden en geeft de grootste terug. Waarden moeten van het type double zijn.
<calculation>
<max>
<field>20.0</field>
<field>25.0</field>
</max>
</calculation>
Geeft terug: 25.0
Min
Het <min>-blok evalueert twee waarden en geeft de kleinste terug. Waarden moeten van het type double zijn.
<calculation>
<min>
<field>20.0</field>
<field>25.0</field>
</min>
</calculation>
Geeft terug: 20.0
Vermenigvuldigen
Het <mul>-blok vermenigvuldigt velden met elkaar.
| Attribuut | Waarde | Omschrijving |
|---|---|---|
minus | true / false | Ingesteld op een <field> om de waarde te negeren |
Voorbeeld:
<calculation>
<mul>
<field>Custom43</field>
<field>Custom45</field>
</mul>
</calculation>
Voorbeeld: Vermenigvuldigen met negatie:
<calculation>
<mul>
<field>Custom42</field>
<field minus="true">Custom44</field>
</mul>
</calculation>
Som
Het <sum>-blok telt de waarden van een veld op over alle overeenkomende onderliggende objecten.
Als je twee velden op hetzelfde object wilt optellen, gebruik dan <add> in plaats daarvan.
Voorbeeld: Som over alle onderliggende projecten:
<calculation>
<sum>
<folderFilter foldertype='5000'/>
<field>Custom1</field>
</sum>
</calculation>
Voorbeeld: Som met een naamfilter:
<calculation>
<sum>
<folderFilter foldertype='5000'>
<Name operator='equals' filterValues='Test Project'/>
</folderFilter>
<field>Custom1</field>
</sum>
</calculation>
Waar / onwaar
De <tst>- en <not>-blokken evalueren een veld naar True of False.
Voorbeeld: Test:
<calculation>
<tst>
<field>Custom1</field>
</tst>
</calculation>
Voorbeeld: Not (omgekeerd):
<calculation>
<not>
<field>Custom1</field>
</not>
</calculation>
Geeft True terug als Custom1 False is.
Waarde
Het <value>-blok geeft een vaste waarde terug. Wordt niet gebruikt om te rekenen, maar om een constante in te stellen.
<calculation>
<value>123.89</value>
</calculation>
Aantal werkdagen
Het <nrworkingdays>-blok berekent het aantal werkdagen tussen twee datumvelden.
<calculation>
<nrworkingdays>
<field>Custom1</field>
<field>Custom2</field>
</nrworkingdays>
</calculation>
Aantal dagen tussen
Het <nrdaysbetween>-blok berekent het totale aantal dagen (inclusief weekenden) tussen twee datumvelden.
<calculation>
<nrdaysbetween>
<field>Startdate</field>
<field>Enddate</field>
</nrdaysbetween>
</calculation>
Aantal
Het <count>-blok telt het aantal overeenkomende onderliggende objecten.
Voorbeeld: Portfolio-items tellen:
<calculation>
<count>
<folderFilter foldertype="5003" />
</count>
</calculation>
Voorbeeld: Tellen met voorwaarden:
<calculation>
<count foldertypes="301">
<condition>
<cmp value="4">
<field>DocumentType</field>
</cmp>
</condition>
</count>
</calculation>
Boekingensom
Het <timelinesum>-blok berekent de som van alle boekingen die aan een specifiek object zijn gerelateerd. Het ondersteunt verschillende attributen en filteropties.
Hoofdattributen
| Attribuut | Waarden | Omschrijving |
|---|---|---|
type | Planned, Actual, Budget, Forecast, Demand, Request, Realised, enz. | Filtert op het opgegeven boekingstype |
hours | true / false | Uren meenemen in de calculatie |
money | true / false | Geld meenemen in de calculatie |
value | true / false | Waarde-items meenemen in de calculatie |
periodStart | Datum of FIELD:FieldName | Startdatum van de periode |
periodEnd | Datum of FIELD:FieldName | Einddatum van de periode |
bookdate | Datum of FIELD:FieldName | Effectieve datum voor een enkele dag |
project | %folderID% | Beperken tot een specifiek project |
timelineUnit | GUID | Correleert met een booking method en waardeveldtype |
Filterattributen
Filters kunnen binnen <timelinesum> genest worden met een <filter>-element:
| Filterveld | Omschrijving |
|---|---|
periodStartdate | Startdatum van de boeking |
periodEnddate | Einddatum van de boeking |
reference | Objectreferentie van de boeking (bijvoorbeeld Product, Project) |
type | Boekingstype: Actual, Assigned, Budget, Committed, Remaining, Reserved, Capacity, Demand, Supply, Allocation, Available, Request, Planned, Estimate, EAC, ETC |
parent | Het object waaronder de boeking is toegevoegd |
skill | De skill die aan de geboekte uren is gerelateerd |
resource | De resource die aan de geboekte uren is gerelateerd |
category | De financiële categorie die aan het geboekte geld is gerelateerd |
isDraft | Definitief (0) of concept (1) |
program | De gerelateerde map |
programProject | Het gerelateerde programma |
project | Het gerelateerde project |
product | Het gerelateerde product |
stage | De gerelateerde projectfase |
projectReport | Het gerelateerde portfolio-item |
resourceOU | De OE die wordt gebruikt voor tijdregistratie (GroupID) of resourcemanagement (Pool) |
Booking methods
De timeline unit bepaalt hoe boekingen worden opgeslagen en opgehaald.
| Booking method | Invoervelden | Omschrijving |
|---|---|---|
| BookdateTotal | Bookdate, Value | Geboekt op een enkele datum |
| PeriodTotalWorkingDays | Startdate, Enddate, Value | Invoerwaarden gespreid over werkdagen |
| PeriodPerWorkingDay | Startdate, Enddate, Value | Invoerwaarde is de waarde per werkdag |
Timeline units
| Timeline unit | Booking method |
|---|---|
| Uren (gewijzigd op boekdatum) | BookdateTotal |
| Geld (gewijzigd op boekdatum) | BookdateTotal |
| Uren en geld (gewijzigd op boekdatum) | BookdateTotal |
| FTE (Uren per werkdag / 8) | PeriodPerWorkingDay |
| Days per Working Week (Uren per werkdag x 5) | PeriodPerWorkingDay |
| Uren per werkdag | PeriodPerWorkingDay |
| Uren (wijzigingen gespreid over een periode) | PeriodTotalWorkingDays |
| Mandagen (wijzigingen gespreid over een periode) | PeriodTotalWorkingDays |
| Geld (wijzigingen gespreid over werkdagen) | PeriodTotalWorkingDays |
Voorbeeld: Geplande uren met een specifieke timeline unit:
<calculation>
<timelinesum type="Planned" timelineUnit="1281FD30-D2BD-4BD5-8529-7487F9813BA2"/>
</calculation>
Voorbeeld: Besteed geld met datumbereik en categoriefilter:
<calculation>
<timelinesum type="Actual" money="true" project="%folderID%"
periodStart="2010-01-01" periodEnd="FIELD:ReportProvideStatusPer">
<filter>
<Category operator="in" filterValues="208989,208990,243797" />
</filter>
</timelinesum>
</calculation>
Calculatie-opties
Calculaties op hetzelfde object worden automatisch herberekend wanneer dat nodig is. Calculaties op het bovenliggende object worden ook automatisch getriggerd.
Wanneer een calculatie echter afhankelijk is van een ander object (bijvoorbeeld: een wijziging in een project moet herberekening van het gekoppelde portfolio-item triggeren), moet je een calculatie-optie configureren op het customveld.
Calculatie-opties zijn in de meeste gevallen niet nodig. Configureer ze alleen wanneer er afhankelijkheden tussen objecten bestaan.
Relaties gebruiken
Standaard worden de calculaties van de directe bovenliggende laag getriggerd via het "normal relation"-mechanisme. Als je een andere relatie nodig hebt (bijvoorbeeld de planningsstructuur), geef je deze op in de calculatie-optie.
Voorbeeld: Som over plan-items (met planningsrelatie):
<calculation>
<sum>
<folderFilter foldertype='5602'>
<field>Custom1</field>
</sum>
</calculation>
Calculatie-optie: relation='planning'
Dit vertelt de calculatie-engine om herberekening te triggeren via de "planning"-relatie.
Referentievelden gebruiken
Wanneer een calculatie gegevens uitleest van een gerefereerd object, configureer je de calculatie-optie zodat de referentie herberekening triggert.
Voorbeeld: Veld kopiëren van gekoppeld project van een portfolio-item:
<calculation>
<folderField reference='OperationalProject'>
<field>Custom1</field>
</folderField>
</calculation>
Calculatie-optie: 1 (of geef de referentie op indien nodig, bijvoorbeeld 1,reference=P2Project)
Calculatievoorwaarden
Wat zijn voorwaarden?
Met voorwaarden kun je een calculatie alleen uitvoeren als aan een specifieke vereiste wordt voldaan. Gebruik het <condition>-blok binnen een <calculation>. De calculatie wordt alleen uitgevoerd als de voorwaarde als waar wordt geëvalueerd.
<calculation>
<!-- Calculation only executes if the condition is met -->
<condition/>
<block/>
</calculation>
Voorwaarden kunnen worden gedefinieerd in customvelden onder de knop Advanced.
Break gebruiken
Om te voorkomen dat volgende calculaties worden uitgevoerd wanneer al aan een voorwaarde is voldaan, voeg je break='true' toe aan de calculatie:
<calculations>
<calculation break='true'>
<condition>
<cmp condition='empty'>
<field>Owner</field>
</cmp>
</condition>
</calculation>
<calculation>
<cmp condition='empty'>
<field>Parent</field>
</cmp>
</calculation>
<calculation>
...
</calculation>
</calculations>
Wanneer break='true' is ingesteld en aan de eerste voorwaarde wordt voldaan, worden alle volgende calculaties overgeslagen. Zonder de break blijft de engine elk calculatieblok evalueren.
Type voorwaarden: AND en OR
Standaard worden meerdere <conditions>-blokken geëvalueerd als AND. Alle voorwaarden moeten waar zijn:
<calculation>
<conditions>
...
</conditions>
<conditions>
...
</conditions>
</calculation>
Om OR-logica te gebruiken (er hoeft slechts aan één voorwaarde te worden voldaan), stel je type='or' in:
<calculation>
<conditions type='or'>
...
</conditions>
<conditions>
...
</conditions>
</calculation>
Depends gebruiken
Het <depends>-blok geeft aan welke velden herberekening moeten triggeren wanneer hun waarde verandert:
<calculation>
<depends>
<field>Custom121</field>
</depends>
<folderfield>
<field>ModificationDate</field>
</folderfield>
</calculation>
Deze calculatie wordt herberekend wanneer Custom121 verandert, en schrijft de wijzigingsdatum naar het doelveld.
Bewerkbaarheid en zichtbaarheid van velden configureren
Voorwaarden kunnen worden gecombineerd met <editCheck> en <displayCheck> om te bepalen wie een veld kan bewerken of zien.
Bewerkcontrole
Beperkt het bewerken van een veld op basis van een voorwaarde. In dit voorbeeld kunnen alleen beheerders het veld bewerken:
<calculation>
<fieldConditions>
<editCheck>
<condition>
<adminCheck/>
</condition>
</editCheck>
</fieldConditions>
</calculation>
Weergavecontrole
Verbergt een veld volledig voor gebruikers die niet aan de voorwaarde voldoen. In dit voorbeeld kunnen alleen beheerders het veld zien:
<calculation>
<fieldConditions>
<displayCheck>
<condition>
<admincheck/>
</condition>
</displayCheck>
</fieldConditions>
</calculation>
Voorbeeld: Weergavecontrole met meerdere voorwaarden:
<fieldConditions>
<displayCheck>
<conditions type="or">
<condition>
<cmp value="XXX" condition="in">
<var>CustomXX</var>
</cmp>
</condition>
<condition>
<pagefoldertype condition="in">21,23,5000,5041,5100,6021,6020</pagefoldertype>
</condition>
</conditions>
</displayCheck>
</fieldConditions>
Het <pagefoldertype>-filter bepaalt op welke objecttypes het veld zichtbaar is:
5000= Project5100= Map6021= Kwaliteitsbeoordeling- enz.
Best practices
- Gebruik altijd commentaar in je XML om het doel van elk calculatieblok uit te leggen.
- Gebruik inspringing consistent om calculaties leesbaar te houden.
- Gebruik
break='true'bij meerdere voorwaardelijke calculaties om onnodige verwerking te voorkomen. - Test calculaties op één object voordat je ze breed toepast.
- Documenteer calculatie-opties: noteer de relatie- of referentieconfiguratie naast de XML.
- Houd calculaties eenvoudig: splits complexe logica op in meerdere customvelden in plaats van één omvangrijke calculatie te maken.
Veelgestelde vragen
Waar maak ik calculaties aan? In het onderdeel Configuratie van FCC. Navigeer naar het objecttype (bijvoorbeeld Project), open of maak een customveld en voer de calculatie-XML in bij het veld Calculatie onder Advanced.
Zijn calculaties hoofdlettergevoelig?
Ja. De XML-tags (<calculation>, </calculation>, <field>, enz.) zijn hoofdlettergevoelig en moeten exact worden geschreven zoals gedocumenteerd.
Wanneer worden calculaties getriggerd? Calculaties op hetzelfde object worden automatisch getriggerd wanneer een veld verandert. Voor triggers tussen objecten moet je een calculatie-optie configureren.
Wat gebeurt er als ik door nul deel? De calculatie geeft een lege waarde of de waarde nul terug. Er wordt geen foutmelding gegenereerd.
Kan ik calculatieblokken nesten?
Ja. Je kunt blokken zoals <mul> binnen <div> nesten, of <add> binnen <div>, om complexe expressies te maken zoals gewogen gemiddelden of percentages.
Wat is het verschil tussen <add> en <sum>?
<add> telt velden op binnen hetzelfde object. <sum> aggregeert een veld over onderliggende objecten (met een <folderFilter>).