Sammlung von OCL Expressions
Produktlinie
Standard
|Expert
Betriebsart
CLOUD ABO
|ON-PREMISES
Module
Leistung & CRM
Budget & Teilprojekt
Fremdkosten
Ressourcenplanung
Business Intelligence
OCL Expressions für alle Einträge
OCL Expressions für Adresseinträge
OCL Expressions für Bearbeiter
OCL Expressions für Projekte / Phasen
OCL Expressions für Rechnungen
OCL Expressions für Rechnungsberichte
OCL Expressions für Vorschüsse
OCL Expressions mit Datumsoperatoren
Timsession.allInstances->first.login
. Gibt den aktuell eingeloggten Projektbearbeiter zurück.objid
(bis Vertec 6.2.0.6 boldid
). Liefert die eindeutige Id-Nummer des Objekts. Diese Nummer wird bei neu erzeugten Objekten fortlaufend vergeben und kann daher auch für Sortierungen nach Erzeugungsreihenfolge nützlich sein.creator
modifier
creationDateTime
modifiedDateTime
adresseintrag
.person
.firma
.kontakt
.paar
.einfacheAdresse
.adresseintrag->select(projekte->size>0)
adresseintrag->select(stellung.asstring='CEO')
adresseintrag->select(stellung.asstring='')
adresseintrag->select(stellung.asstring<>'')
adresseintrag->select(standardkanton='ZH')
person->select(kontakte->size=0)
adresseintrag->select(name.sqlLike('%wald%') or name.sqlLike('Treu%'))
Die Variante sqlLikeCaseInsensitive
macht denselben Vergleich, achtet aber nicht auf Gross/Kleinschreibung; "and
", "or
" und "not
" sind erlaubt (Klammersetzung beachten, immer kleinschreiben).
if self.oclistypeof(Person) then self.oclastype(Person).vorname else if self.oclistypeof(Kontakt) then if self.oclastype(Kontakt).person->notempty then self.oclastype(Kontakt).person.vorname else self.oclastype(Kontakt).vorname endif else '' endif endif
if self.oclistypeof(Person) then self.oclastype(Person).name else if self.oclistypeof(Kontakt) then if self.oclastype(Kontakt).person->notempty then self.oclastype(Kontakt).person.name else self.oclastype(Kontakt).name endif else '' endif endif
if self.oclistypeof(Paar) then if self.oclastype(Paar).personA->notempty and self.oclastype(Paar).personB->notempty then if self.oclastype(Paar).personA.name.asstring = self.oclastype(Paar).personB.name.asstring then self.oclastype(Paar).personA.name else self.oclastype(Paar).personA.name + ' & ' + self.oclastype(Paar).personB.name endif else if self.oclastype(Paar).personA->notempty then if self.oclastype(Paar).personA.name.asstring = self.oclastype(Paar).nameb.asstring then self.oclastype(Paar).personA.name else self.oclastype(Paar).personA.name + ' & ' + self.oclastype(Paar).nameb endif else if self.oclastype(Paar).personB->notempty then if self.oclastype(Paar).namea.asstring = self.oclastype(Paar).personB.name.asstring then self.oclastype(Paar).namea else self.oclastype(Paar).namea + ' & ' + self.oclastype(Paar).personB.name endif else if self.oclastype(Paar).namea.asstring = self.oclastype(Paar).nameb.asstring then self.oclastype(Paar).namea else self.oclastype(Paar).namea + ' & ' + self.oclastype(Paar).nameb endif endif endif endif else if self.oclistypeof(Kontakt) then if self.oclastype(Kontakt).person->notempty then self.oclastype(Kontakt).person.name else self.oclastype(Kontakt).name endif else name endif endif
if self.oclastype(Paar).personA->notempty and self.oclastype(Paar).personB->notempty then self.oclastype(Paar).personA.vorname + ' & ' + self.oclastype(Paar).personB.vorname else if self.oclastype(Paar).personA->notempty then self.oclastype(Paar).personA.vorname + ' & ' + self.oclastype(Paar).vornameb else if self.oclastype(Paar).personB->notempty then self.oclastype(Paar).vornameA + ' & ' + self.oclastype(Paar).personB.vorname else self.oclastype(Paar).vornameA + ' & ' + self.oclastype(Paar).vornameb endif endif endif
if self.oclastype(Paar).personA->notempty and self.oclastype(Paar).personB->notempty then self.oclastype(Paar).personA.name + ' & ' + self.oclastype(Paar).personB.name else if self.oclastype(Paar).personA->notempty then self.oclastype(Paar).personA.name + ' & ' + self.oclastype(Paar).nameb else if self.oclastype(Paar).personB->notempty then self.oclastype(Paar).nameA + ' & ' + self.oclastype(Paar).personB.name else self.oclastype(Paar).nameA + ' & ' + self.oclastype(Paar).nameb endif endif endif
person->select(aktiv)->select(geburtsdatum.asstring<>'')->select(((date<=encodedate(date.year,geburtsdatum.month,geburtsdatum.day)) and(date>=encodedate(date.year,geburtsdatum.month,geburtsdatum.day).incday(-30)))or((date<=encodedate(date.year+1,geburtsdatum.month,geburtsdatum.day)) and (date>=encodedate(date.year+1, geburtsdatum.month,geburtsdatum.day).incday(-30))))
if ocliskindof(Kontakt) then self->oclastype(Kontakt)->asset->collect(x| if x.person->size>0 then if x.person.ismale then 'Male' else 'Female' endif else if x.ismale then 'Male' else 'Female' endif endif)->first else if ocliskindof(Person) then if oclastype(Person).ismale then 'Male' else 'Female' endif else '' endif endif
projektbearbeiter
projektbearbeiter->select(aktiv)
Timsession.allInstances->first.login
projektbearbeiter->select(eigprojekte->size>0)
projektbearbeiter->select(stufe.asstring='Secretary')
projektbearbeiter->select(kuerzel.asstring='')
projektbearbeiter->select(kuerzel.asstring<>'')
projektbearbeiter->groupleistungenb('01.01.2011', '31.12.2011','') ->collect(minutenintoffen + minutenintverrechnet)->sum
self->groupleistungenB('1.1.2011', '31.12.2011', '') ->collect(s | (s.minutenextOffen-s.minutenextOffenUnprod+s.minutenextVerrechnet-s.minutenextVerrechnetUnprod) / (s.minutenIntVerrechnet+s.minutenIntOffen) *100)->sum
projekt
oder Projekt.allInstances
(Gross-/Kleinschreibung beachten)projektphase
oder Projektphase.allInstances
(Gross-/Kleinschreibung beachten).allePhasen
.owningProjekt
projekt->select(phasen->size=0)
projekt->select(phasen->size>0)
projekt->select(typ.produktiv)
projekt->select(sprache.asstring='FR')
projekt->select(aktiv)
projekt->select(not aktiv)
projekt->select(code->asset->collect(x|Projekt.allinstances->select(code=x)->size)->sum>1)
projektphase->select(pauschal)
projektphase->select(not verrechenbar)
parentphase
subphasen
parentlist
parentlist->first
kann also auf die oberste Ebene im Baum zugegriffen werden.sublist
offertDatum
erteiltDatum
abschlussDatum
abgelehntDatum
Den einzelnen Status kann man über eine Nummer abfragen (bsp. phasen->select(status=1)
). Die Nummern der einzelnen Status lautet wie folgt:
0: Im Angebot
1: Erteilt
2: Abgeschlossen
3: Abgelehnt
planMinutenInt
sumMinutenInt
planWertExt
sumWertExt
planWertInt
sumLeistungWertInt
planKostenLeistung
sumLeistungWertKosten
planSpesenWert
sumSpesenWert
planKostenSpesen
sumKostenSpesen
planAuslagenWert
sumAuslagenWert
planKostenAuslagen
sumKostenAuslagen
planMinutenInt
sumMinutenInt
planWertExt
sumWertExt
planWertInt
sumWertInt
planKostenLeistung
sumKostenLeistung
planSpesenWert
sumSpesenWert
planKostenSpesen
sumKostenSpesen
planAuslagenWert
sumAuslagenWert
planKostenAuslagen
sumKostenAuslagen
Auf Phasenzuordnungen sind ausser der oben gelisteten Budgetwerte zusätzlich folgende Werte verfügbar:
Bearbeiter-Zuordnung |
|
Tätigkeitszuordnung |
|
Spesentyp-Zuordnung |
|
Auslagentyp-Zuordnung |
|
buchungsbeleg->oclAsType(Beleg).buchungen
Von hier aus kann mann nun auf die verschiedenen Werte zugreifen wie z.B.die
buchungsbeleg->oclastype(Beleg).buchungen->select(isthaben).betrag->sum
rechnungvorschusslink->select(betragnetto<>0)->collect (vorschuesse.bezeichnung + ': ' + betragnetto.asstring)->listtostring(' / ')
Zeigt die Bezeichnung der Vorschüsse und den jeweiligen Betrag an, z.B. in einer Listenspalte.
vorschuesseAufRechnung
vorschuesse
Wie Sie Word-Berichte aufbauen, finden Sie im Artikel Word-Berichte. Was die einzelnen Felder auf der Rechnung bedeuten, finden Sie im Artikel Die Rechnung in OCL.
rechnungsadresstext
datum
nummer
von.asstring
bis.asstring
rechnungsbriefanrede
rechnungsgrussformel
projekt
projekt.betreffend
pauschal
pauschalbetrag
leistwertext
rabattBetrag
rabattProzent
totalRabattBetrag
leistmwstsatz
leistmwst
leistwertextmitmwst
pauschalspesenbetrageff
pauschalspesenbetrag
pauschalspesenprozent
spesenext
spesenext - pauschalspesenbetrageff
spesenmwst
spesenmwstsatz
spesenextmitmwst
auslagenext
auslagenmwst
spesenmwstsatz
auslagenextmitmwst
vorschussbetrag
vorschussmwst
vorschussbetrag + vorschussmwst
leistmwstsatz
leistspesenextmitmwst + vorschussbetrag + vorschussmwst
total
waehrung
projekt.projektleiter
total.floor.asstring
if oclisKindOf(Container) then oclAsType(Container).eintraege ->list->oclAsType(Rechnung)->ordermulti('if xRechnungsadresse ->isEmpty then projekt.kunde.oclastype(Adresseintrag) else xRechnungsadresse.oclastype(Adresseintrag) endif.standardplz') else self->asset endif
Expressions, die eine Bedingung abfragen, also JA oder NEIN zurückgeben. Normalerweise Band Expressions für 'Cond'-Bands (siehe Artikel Word-Berichte).
von.asstring <> '' or bis.asstring <> ''
(not pauschal) and (leistwertext <> 0)
rabatt
rabattBetrag > 0
rabattProzent > 0
leistmwst > 0
pauschalspesen
pauschalspesenbetrag > 0
pauschalspesenprozent > 0
usespesen
spesenext > 0
(spesenext > 0) and usespesen
spesenmwst > 0
auslagenext > 0
auslagenmwst > 0
((spesenext > 0) and usespesen) or (auslagenext > 0)
vorschussbetrag > 0
vorschusseffektiv > 0
vorschusseffektivmwst > 0
vorschusseffektivmwst
leistungen->orderby(boldid)->select(x|x.boldid=self.leistungen ->orderby(boldid)->select(ansatzext=x.ansatzext)->first.boldid)
Technisch gesehen macht die Expression eine Liste von Leistungen, bei der jede einzelne einen anderen Ansatz hat.
Innerhalb eines solchen Bands kann man die Leistungen dann filtern, z.B. mit:
leistungen->select(bndAnsatz.ansatz=ansatz).wertext->sum
leistungen->orderby(boldid)->select(x|x.boldid=self.leistungen ->orderby(boldid)->select((ansatzext=x.ansatzext) and (typ=x.typ)) ->first.boldid)
Filtern mit:
leistungen->select(bndTaetigkeit.typ=typ) ->select(bndTaetigkeit.ansatz=ansatz).wertext->sum
rechnungvorschusslink->select(betragnetto<>0)->collect (rechnungen.nummer.asstring + ': ' + betrag.asstring)->listtostring(' / ')
Zeigt die Rechnungsnummer und den jeweiligen Betrag, zum Beispiel in einer Listenspalte.
Informationen zu den OCL Datumsoperatoren finden Sie hier .
now
date
OCL-Expression, welche die Kalenderwoche ausrechnet:
date->asset->collect(x|(x.mondayofweek.incday(3).dateToFloat - encodedate(x.mondayofweek.incday(3).year,1,1).dateToFloat + 7).floor div 7)->first
Statt date
kann ein beliebiger Datumswert verwendet werden.
OCL-Expressions, welche für eine beliebige Kalenderwoche (eines beliebigen Jahres) das Startdatum (Datum vom Montag dieser Woche) berechnen:
date.firstOfYear.incDay(3).mondayOfWeek.incDay(7*(kw-1))
date.firstOfYear.incDay(3).mondayOfWeek.incDay(7*(12-1))
encodeDate(jahr, 1, 4).mondayOfWeek.incDay(7*(kw-1))
encodeDate(2026, 1, 4).mondayOfWeek.incDay(7*(12-1))
formatdatetime: Zur Formatierung von Datums- und Zeitwerten kann der Operator formatdatetime
verwendet werden. Diese Abfrage z.B. stellt die aktuelle Zeit dar, im Format Stunden.Minuten: now.formatdatetime('hh.mm')
. Alle Informationen zu formatdatetime
finden Sie im Artikel OCL.
encodedate: Für Datumsabfragen wird der Operator encodeDate
verwendet. Beispiel: Ordner mit allen Rechnungen, die im Jahr 2018 erstellt wurden: rechnung->select(datum >= encodeDate(2018,01,01))
. Alle Informationen zu encodeDate
finden Sie im Artikel OCL.
rechnung->select(not bezahlt)->select(faelligdatum<=date.incday(-30))
person->select(aktiv)->select(geburtsdatum.asstring<>'')->select( ((date<=encodedate(date.year,geburtsdatum.month,geburtsdatum.day)) and(date>=encodedate(date.year,geburtsdatum.month,geburtsdatum.day) .incday(-30)))or((date<=encodedate(date.year+1,geburtsdatum.month, geburtsdatum.day)) and (date>=encodedate(date.year+1, geburtsdatum.month,geburtsdatum.day).incday(-30))))
adresseintrag->select(creationDateTime >= date.incDay(-360))