Jämförda versioner

Nyckel

  • Dessa rader lades till.
  • Denna rad togs bort.
  • Formateringen ändrades.

Infoga utdrag
Beräkningar
Beräkningar
nameprogrammering av uträkningar
nopaneltrue

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.

Formulärmotorn utför beräkningenBeräkningen/beräkningarna utförs automatiskt när ett formulär besvaras.

...

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 Formulärtjänsten så är det inget man ser utan detta används personalgränssnittet används detta automatiskt. Om Formulärmotorn resultatberä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 integrerade anslutna tjänster såsom WebDoc, Cosmic etcCosmic, EyeDoc, 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. 

...

THEN blocket innehåller de beräkningar som skall utföras då villkoret i WHEN blocket är uppfyllt. Denna delan delen kallas ofta RHS, right hand side

Exempel

Kodblock
languagejava
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

Fakta

Fakta är något som vi vill använda i vår beräkning. Fakta från formuläret är en lista med alla frågor och dess svar, namnet på denna lista är Questions.

Questions måste man själv göra tillgänglig som en egen variabel, i exemplet nedan kallar vi variabeln för $q.

Questions innehåller då nyckel/värde par där nyckel är frågans 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 numerisk såsom tal och skala (number, range) ingår med dess svarsvärde. I fristående tjänsten heter dessa Heltal och Decimaltal

  • Frågor av typen rullgardin och enval (radio, matrixradio och select) 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
languagejava
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

...

Man kan skapa egna variabler som sedan kan användas i en formel. Man måste själv sätta vilken datatyp som avses för variabeln och det är Javas datatyper, primitiver och klasser,  som finns tillgängliga att användas. Man

Tänk på att syntaxen för variabelnamn skiljer på versaler och gemener vilket innebär att namnet undervikt vikt inte är samma som underVikt Vikt.

Se längre ner för beskrivning av Javas datatyper

...

Syntax och Java dialekt

För att skriva Drools kod beräkningar så använder vi oss av Drools egna DSL samt Java syntax. Drools DSL (Domain Specific Language) är specific syntax och för att skriva Drools regler använder vi Drools Rule Language (DRL), dock är det bara en delmängd av DRL:en som används vid en resultatberäkning. Det är alltså Java syntax till stor del som styr hur en beräkning skrivs och i Java syntax så finns det en del regler som måste följas men det innebär också att vi får tillgång till Javas operatorer, flödeskontroller, primitiver och standard klasser. För att skriva enkla beräkningar så behöver man inte vara en fullfjädrad programmerare utan det räcker långt att man tittar på de kodexempel som finns för att göra sin beräkning. Om man sedan vill göra en mer avancerad beräkning så hjälper det självklart om man har grundläggande förståelse om programmering och då gärna specifikt för Java.

...

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
languagejava
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.

if-then, if-then-else, switch

används för villkor

for, while, do-while

används för iteration

break, continue, return

uthopp

Nedan ser du exempel på hur olika flödeskontroller kan användas.

Kodblock
languagejava
when
  $q: Questions()
  eval($q.get("vikt") != 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("längdå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
languagejava
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.

...