Sammlung von OCL Expressions
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.creatormodifiercreationDateTimemodifiedDateTimeadresseintrag.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
projektbearbeiterprojektbearbeiter->select(aktiv)Timsession.allInstances->first.loginprojektbearbeiter->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.owningProjektprojekt->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)parentphasesubphasenparentlistparentlist->first kann also auf die oberste Ebene im Baum zugegriffen werden.sublistoffertDatumerteiltDatumabschlussDatumabgelehntDatumDen 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
planMinutenIntsumMinutenIntplanWertExtsumWertExtplanWertIntsumLeistungWertIntplanKostenLeistungsumLeistungWertKostenplanSpesenWertsumSpesenWertplanKostenSpesensumKostenSpesenplanAuslagenWertsumAuslagenWertplanKostenAuslagensumKostenAuslagenplanMinutenIntsumMinutenIntplanWertExtsumWertExtplanWertIntsumWertIntplanKostenLeistungsumKostenLeistungplanSpesenWertsumSpesenWertplanKostenSpesensumKostenSpesenplanAuslagenWertsumAuslagenWertplanKostenAuslagensumKostenAuslagenAuf Phasenzuordnungen sind ausser der oben gelisteten Budgetwerte zusätzlich folgende Werte verfügbar:
Bearbeiter-Zuordnung |
|
| Tätigkeitszuordnung |
|
| Spesentyp-Zuordnung |
|
| Auslagentyp-Zuordnung |
|
buchungsbeleg->oclAsType(Beleg).buchungenVon hier aus kann mann nun auf die verschiedenen Werte zugreifen wie z.B.die
buchungsbeleg->oclastype(Beleg).buchungen->select(isthaben).betrag->sumrechnungvorschusslink->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.
vorschuesseAufRechnungvorschuesseWie 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.
rechnungsadresstextdatumnummervon.asstringbis.asstringrechnungsbriefanrederechnungsgrussformelprojektprojekt.betreffendpauschalpauschalbetragleistwertextrabattBetragrabattProzenttotalRabattBetragleistmwstsatzleistmwstleistwertextmitmwstpauschalspesenbetrageffpauschalspesenbetragpauschalspesenprozentspesenextspesenext - pauschalspesenbetrageffspesenmwstspesenmwstsatzspesenextmitmwstauslagenextauslagenmwstspesenmwstsatzauslagenextmitmwstvorschussbetragvorschussmwstvorschussbetrag + vorschussmwstleistmwstsatzleistspesenextmitmwst + vorschussbetrag + vorschussmwsttotalwaehrungprojekt.projektleitertotal.floor.asstringif 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)rabattrabattBetrag > 0rabattProzent > 0leistmwst > 0pauschalspesenpauschalspesenbetrag > 0pauschalspesenprozent > 0usespesenspesenext > 0(spesenext > 0) and usespesenspesenmwst > 0auslagenext > 0auslagenmwst > 0((spesenext > 0) and usespesen) or (auslagenext > 0)vorschussbetrag > 0vorschusseffektiv > 0vorschusseffektivmwst > 0vorschusseffektivmwstleistungen->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.
nowdateOCL 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))