Infoga utdrag | ||||||||
---|---|---|---|---|---|---|---|---|
|
Denna sida beskriver hur beräkningar går till och hur de kan skrivas samt vad man bör tänka på. Löpande i dokumentet finns kodexempel där vi visar på olika sätt att skriva en beräkning. Vi har försökt att skriva så författare av resultatberäkning utan teknisk bakgrund skall förstå men ibland behöver tyvärr använda oss av tekniska termer då det krävs.
Gå direkt till rubriken:
Innehållsförteckning |
---|
Beräkningar i
...
1177 formulärhantering
På en formulärsmall formulärmall kan en eller flera beräkningar skapas som skall utföras baserat på ett besvarat formulär.
...
Vi har idag stöd för en typ av beräkningar och det är "inera:form-engine:drools-java:1". Om man använder Fristående personalgränssnittet används detta automatiskt. Om Formulärmotornresultatberäkningsmotorn, vilket är den IT-komponent där beräkningen utförs, ser en beräkning av typen "inera:form-engine:drools-java:1" på mallen så kommer denna utföras.
Andra anslutna tjänster såsom Cosmic, EydeDocEyeDoc, Provisio mfl. kanske redan har stöd för beräkningar och de kan då spara dessa på en mall som en egen typ och senare själva göra beräkningar på det besvarade formuläret. Det är då självklart viktigt att man anger en annan typ än den som Formulärmotorn resultatberäkningsmotorn känner till och som är unik för anropande system.
Drools och
...
1177 formulärhantering
Stödet för beräkningstypen 'inera:form-engine:drools-java:1' bygger på Drools (kie) som är en regelmotor byggd med programmeringsspråket Java.
...
Kodblock | ||
---|---|---|
| ||
when $q: Questions() eval($q.get("vikt") != null) eval($q.get("längd") != null) eval($q.get("längd") > 0) then Double double bmi = $q.get("vikt") / ($q.get("längd")/100 * $q.get("längd")/100); outcome.set(bmi); end |
...
Questions
innehåller då nyckel/värde par där nyckel är Frågans id och värde är svaret på frågan.
...
En fråga måste ha ett unikt id, Frågans id (
questionId
)En fråga kan bara ha ett svar, flervalsfrågor stöds inte i nuläget
En fråga utan svar (
null
) tas inte med som fakta till beräkningen.Frågor av typen tal och skala (number, range) ingår med dess svarsvärde.
Frågor av typen rullgardin och enval (
radio
,matrixradio
ochselect
) ingår och där svaret är svarsalternativets ordningstal (answerAlternativeNumber
)
...
Beskrivning av objektet Questions
Retur | Metod | Beskrivning |
java.lang.Double | get(java.lang.String questionId) | Returnera svarsvärde för fråga med id questionId |
java.lang.Double | get(java.lang.String questionId, java.lang.Double defaultValue) | Returnera svarsvärde för fråga med id questionId. Om svarsvärde är null returneras defaultValue |
java.lang.Double | get(java.lang.String questionId, java.lang.Integer defaultValue) | Returnera svarsvärde för fråga med id questionId. Om svarsvärde är null returneras defaultValue |
Resultat
Resultatet för beräkningen, som vi själva skall sätta, finns alltid tillgängligt i then
-blocket med namnet outcome
.
...
Kodblock |
---|
when .... then Doubledouble bmi = $q.get("vikt") / ($q.get("längd")/100 * $q.get("längd")/100); outcome.set(bmi); // här sätter vi värdet på outcome end |
Beskrivning av objektet Outcome
Retur | Metod | Beskrivning |
void | set(java.lang.Double value) | Sätt värde för resultat |
Kommentarer i beräkningen
...
Kodblock | ||
---|---|---|
| ||
when // detta är en kommentar på en rad $q: Questions() // detta är också en kommentar eval($q.get("vikt") != null) eval($q.get("längd") != null) eval($q.get("längd") > 0) then /* Detta är en flerradskommentar som går över flera rader */ Doubledouble bmi = $q.get("vikt") / ($q.get("längd")/100 * $q.get("längd")/100); outcome.set(bmi); end |
...
En operator används när du vill utföra en operation på en variabel. Nedan följder några vanliga operatorer:
| addition, subtraktion, multiplikation, division |
| lika med, inte lika med |
| större än, mindre än, större än eller lika med, mindre än eller lika med |
| logiskt och (AND), logiskt eller (OR) |
| tilldela en variabel ett värde |
Läs mer om Java operatorer här: Operators
...
Kodblock | ||
---|---|---|
| ||
when $q: Questions() eval($q.get("längd") != null) eval($q.get("längd") > 0) then Double double vikt = $q.get("vikt"); Double double langd = $q.get("längd"); Double double alder = $q.get("ålder"); Double double bmi = vikt / (langd/100 * langd/100); // division och multiplikation if (alder != null && alder > 55) { // om ålder inte är null och större än 55 bmi = bmi -3; // subtrahera 3 som ålderbonus } outcome.set(bmi); end |
...
Flödeskontroller som finns tillgängliga i Java.
| används för villkor |
| används för iteration |
| uthopp |
Nedan ser du exempel på hur olika flödeskontroller kan användas.
Kodblock | ||
---|---|---|
| ||
when $q: Questions() eval($q.get("längdvikt") != null) eval($q.get("längd") != null) eval($q.get("längd") > 0) then Double double vikt = $q.get("vikt"); Double double langd = $q.get("längd"); double alder = $q.get("ålder"); Double double bmi = vikt / (langd/100 * langd/100); if (alder != null && alder > 77) { // if statement bmi = bmi -9; } else if (alder != null && alder > 55 ) { //else if bmi = bmi -93; } outcome.set(bmi); end |
...
En primitiv börjar alltid med en gemen och en klass börjar alltid med en versal.
En primitiv kan aldrig vara
null
.
Om man inte har behov av att använda null-värden så rekommenderas att använda primitiver, alltså de som börjar med en gemen.
För den som är intresserad så finns bra beskrivning om Javas primitiver och standard klasser.
...
Kodblock |
---|
when $q: Questions() ... then Double double vikt = $q.get("vikt"); Double double langd = $q.get("längd"); // längd i centimeter Double double alder = $q.get("ålder"); Double double bmi = vikt / (langd/100 * langd/100); if (alder != null && alder > 55) { bmi = bmi -3; // bonus för ålder } outcome.set(bmi); end |
...
Kodblock | ||
---|---|---|
| ||
when $q: Questions() ... then Double double vikt = $q.get("weight"); Double double langd = $q.get("height"); // längd i centimeter Double double alder = $q.get("ålder", 0); // om ålder är ej angiven, returnera 0 Double double bmi = vikt / (langd/100 * langd/100); if (alder > 55) { bmi = bmi -3; // bonus för ålder } outcome.set(bmi); end |
Dividera inte med noll
Ett vanligt fel att är att man inte kontrollerar värdet innan det används. Om man till exempel försöker dividera med en variabel som har värdet noll (0
) resulterar det i felet divide by zero
.
...