Praktický úvod do ProjectWise CEL

PW CEL po lopate

Kompletné laické vysvetlenie obmedzenia SQL, databázových hraníc, typov lookupov, podporovaných datasetov a migračných rozhodnutí.

Vysvetlenie a odporúčaniePodmienka alebo limitZákaz alebo bezpečnostná hranica

Čo sa mení oproti pôvodnému nastavovaniu ProjectWise

Tento prehľad je určený ľuďom, ktorí poznajú administráciu ProjectWise, atribúty, formuláre a Environmenty používané ako číselníky, ale nemusia poznať programovanie ani CEL.

CEL teda nie je nová databáza, klient SQL ani univerzálne API nad ProjectWise. Je to bezpečný jazyk na výpočet hodnoty z vopred povoleného kontextu.


Čo nám Bentley reálne zatrhlo

Zmena sa týka podpory výrazov SQL v atribútoch služby ProjectWise Cloud. Bentley zavádza nastavenie Prevent new SQL expressions in attributes.

Praktický význam:

  • nemožno vytvárať nové SQL výrazy v atribútoch,
  • pri úprave existujúceho atribútu SQL ho treba prepísať do PW CEL,
  • existujúce atribúty SQL sa automaticky nevymažú a majú ďalej fungovať, kým ich nie je potrebné upraviť,
  • Bentley momentálne neposkytuje automatický konvertor, ktorý by starú konfiguráciu spoľahlivo prepísal do CEL.

Toto nie je úplný zákaz všetkého, čo sme používali v pôvodnom nastavení ProjectWise. V starších výrazoch sa miešali najmenej tri odlišné veci:

  1. Systémové premenné ProjectWise, napríklad aktuálny používateľ alebo hodnota iného atribútu.
  2. Funkcie SQL, napríklad ISNULL, IIF alebo CHARINDEX.
  3. Skutočný prístup k databáze, napríklad tabuľky, pohľady, spojenia (JOIN) a uložené procedúry.

Prvé dve skupiny sa často dajú prepísať do CEL pomerne priamo. Tretia skupina predstavuje hlavné obmedzenie: CEL nedostane voľný prístup k databáze SQL.


Čo je CEL

CEL znamená Common Expression Language. ProjectWise používa vlastnú implementáciu jazyka CEL, ktorú tu nazývame PW CEL.

Výraz dostane povolené vstupy, vyhodnotí nad nimi jednoduchú logiku a vráti výsledok. Napríklad:

thisUser.name

Výsledkom je meno aktuálneho používateľa, pretože ProjectWise vložil do kontextu objekt thisUser.

Dôležitá myšlienka: CEL nevie nič o databáze sám od seba. Vie iba to, čo mu ProjectWise v konkrétnom mieste sprístupní.

V kontexte atribútov dokumentu môže výraz pristupovať napríklad k:

  • aktuálnemu formuláru cez thisForm,
  • aktuálnemu dokumentu cez thisDocument,
  • jeho priečinku cez thisFolder,
  • Work Area cez príslušný objekt,
  • aktuálnemu používateľovi cez thisUser,
  • aktuálnemu UTC času,
  • registrovaným lookupom.

Iný kontext, napríklad Workflow Rules Engine, môže mať inú množinu objektov. To, že niečo funguje v jednom kontexte, ešte neznamená, že je to dostupné všade.


Pôvodný spôsob a PW CEL vedľa seba

Pôvodné nastavovaniePW CEL
Výraz mohol obsahovať premenné ProjectWise, funkcie SQL alebo databázovú logiku.Výraz používa syntax jazyka CEL a objekty, ktoré poskytol ProjectWise.
Administrátor často potreboval poznať názvy tabuliek, stĺpcov, pohľadov alebo procedúr.Interná databázová schéma nie je súčasťou podporovaného rozhrania.
Pomocou SQL bolo možné vytvárať spojenia a čítať údaje z rôznych tabuliek.CEL pracuje s aktuálnym kontextom a registrovanými lookupmi.
Logika mohla byť úzko naviazaná na databázu a konkrétnu verziu produktu.Bentley kontroluje zverejnené objekty, funkcie a datasety.
Zmena databázovej schémy alebo cloudové obmedzenia mohli výraz znefunkčniť.Oddelenie od databázy poskytuje spoločnosti Bentley stabilnejšiu a bezpečnejšiu hranicu.
Veľká časť riadenia bola v rukách databázového administrátora.Väčšia časť riadenia spočíva v registrácii lookupov a v podporovanom rozhraní API PW CEL.

Najdôležitejšie obmedzenia

CEL zároveň neznamená, že Bentley „nevie“ zobraziť ďalšie údaje. Výrobca by principiálne mohol pridať nový riadený objekt alebo dataset lookupu. My ako administrátori si však nevieme ľubovoľnú tabuľku SQL sami vyhlásiť za vstup CEL. Musíme použiť podporovaný objekt, registrovaný lookup alebo externú synchronizáciu.


Aké tabuľky sa dajú použiť

V dokumentácii ProjectWise Administrator 2026 spoločnosť Bentley uvádza týchto osem vstavaných lookupov:

Built-in lookupStĺpce dostupné pre výberPovinný filterČo poskytuje
DMS.Usersname, description, emailPoužívatelia zdroja údajov (datasource)
DMS.UserListsname, descriptionZoznamy používateľov
DMS.UsersInListname, description, emaillistPoužívatelia v konkrétnom zozname
DMS.UserGroupsname, descriptionSkupiny používateľov
DMS.UsersInGroupname, description, emailgroupPoužívatelia v konkrétnej skupine
DMS.Workflowsname, descriptionDefinície workflow
DMS.Statesname, descriptionStavy v zdroji údajov (datasource)
DMS.StatesInWorkflowname, descriptionworkflowStavy konkrétneho workflow

Stĺpce list, group a workflow slúžia na filtrovanie. Nie sú to bežné stĺpce, ktoré možno vrátiť vo výsledku.

Predpona DMS. je rezervovaná pre vstavané lookupy ProjectWise. Vlastný lookup by sa takto pomenovať nemal.

Tento zoznam neobsahuje dokumenty, priečinky ani ľubovoľné tabuľky Environmentov. K aktuálnemu dokumentu a priečinku sa pristupuje cez kontextové objekty. Údaje z Environmentu sa sprístupňujú samostatným lookupom typu Environment.


Tri druhy lookupov

1. Lookup typu Environment

Lookup typu Environment používa dokumenty vo vybranom Environmente ProjectWise ako riadky lookupu. Pri registrácii sa určí:

  • ktorý Environment je zdrojom,
  • ktoré jeho atribúty budú dostupné ako stĺpce,
  • ktorý stĺpec je hodnota a ktorý popis,
  • prípadné fixné filtre a zoradenie.

Je to najbližšia náhrada za pôvodný Environment používaný ako číselník. Samotná existencia Environmentu však nestačí. Aby ho CEL vedel použiť, musí byť nad ním zaregistrovaný lookup pre CEL.

Pozor na dve veci:

  • CEL vidí iba atribúty, ktoré boli v definícii lookupu sprístupnené.
  • Ak sa do Environmentu neskôr pridá nový atribút, treba upraviť konfiguráciu lookupu a podľa dokumentácie spoločnosti Bentley znovu otvoriť a uložiť existujúce výrazy, ktoré ho majú používať.

Princíp použitia:

getLookup('Lkp.Originator')
  .filterEquals('PW_CODE', thisForm.FI_ORIGIN_CODE)
  .selectOne('PW_DESCRIPTION', '')

Výraz vezme registrovaný lookup, ponechá záznamy so zhodným kódom a vráti jeden popis. Ak sa nenájde presne jeden záznam, vráti prázdny text.

2. Lookup typu Standard

Lookup typu Standard je dátová tabuľka spravovaná systémom ProjectWise, do ktorej sa údaje nahrajú podporovaným postupom využívajúcim PowerShell alebo SDK. Hodí sa napríklad pre údaje z ERP, CRM alebo iného externého systému.

Nie je to automaticky živý dotaz SQL. Je to riadená kópia alebo snímka údajov. Keď sa zmení zdrojový systém, treba zabezpečiť nové nahratie alebo synchronizáciu.

3. Vstavaný lookup

Vstavaný lookup poskytuje ProjectWise. Sem patrí presný zoznam ôsmich datasetov DMS.* uvedený vyššie. Ich obsah spravuje ProjectWise a my používame iba dokumentované stĺpce a filtre.


Ako sa čítajú údaje z lookupu

Základný postup má tri kroky:

  1. getLookup('Názov') vyberie registrovaný lookup.
  2. filterEquals(...), filterIn(...) a podobné funkcie zúžia riadky.
  3. select(...) alebo selectOne(...) vráti výsledok.

Podporované operácie zahŕňajú:

  • getLookup, listLookups,
  • filterEquals, filterNotEquals,
  • filterContains, filterNotContains,
  • filterIn, filterNotIn,
  • select, selectOne.

Pri veľkých lookupoch treba filtrovať čo najskôr a až potom vyberať výsledok. Funkcia selectOne bez náhradnej hodnoty očakáva presne jeden záznam. Ak sa nájde nula alebo viac záznamov, vznikne chyba. Ak sa zadá náhradná hodnota, v oboch prípadoch sa vráti práve táto hodnota.

Príklad nad vstavaným lookupom:

getLookup('DMS.Users')
  .filterEquals('name', thisForm.PW_USERNAME)
  .selectOne('description', '')

Výraz nájde používateľa podľa prihlasovacieho mena a vráti jeho popis, ktorý sa v danej konfigurácii používa ako celé meno.


Jednoduché príklady pre predstavu

Hodnota iného atribútu na tom istom formulári

Pôvodný zápis v ProjectWise mohol používať systémovú premennú typu $EDIT#Discipline$. V PW CEL sa používa objekt formulára:

thisForm.Discipline

Podmienka namiesto IIF

thisForm.TRIG_MINOR_REV == '1' ? thisForm.RV_REV_1 : ''

Ak má spúšťač hodnotu 1, výsledkom je revízia. Inak sa vráti prázdny text.

Hodnota podľa aktuálneho používateľa

getLookup('Lkp.UserSupl')
  .filterEquals('PW_USERNAME', thisUser.name)
  .selectOne('PW_ORIGINATOR_CODE', '')

CEL zistí aktuálne prihlasovacie meno, vyhľadá ho v registrovanom lookupe a vráti priradený kód organizácie.


Dajú sa čítať údaje z iného Environmentu?

Nie priamo cez kontext formulára. thisForm predstavuje aktuálny formulár a neexistuje všeobecný príkaz „otvor ľubovoľný Environment a načítaj jeho riadky“.

Ak máme pôvodný Environment používaný ako číselník, odporúčaný model je:

  1. Environment zostane miestom, kde sa spravujú hodnoty.
  2. Nad Environmentom sa zaregistruje lookup, ktorý sprístupní vybrané atribúty.
  3. Výraz CEL ho načíta cez getLookup(...), vyfiltruje a vyberie hodnotu.

Ak zdrojové údaje nie sú vo vhodnom Environmente, alternatívou je lookup typu Standard so synchronizáciou. Ak je potrebná zložitá relačná logika nad viacerými tabuľkami, zvyčajne ju treba realizovať mimo CEL, výsledok predpočítať a jazyku CEL sprístupniť už pripravené údaje.


Čo použiť v konkrétnej situácii

PotrebaSprávny prvý kandidát
Aktuálny používateľthisUser
Hodnota na aktuálnom formulárithisForm
Aktuálny dokument, priečinok alebo Work AreaPríslušný PW CEL objekt
Číselník spravovaný v Environmente ProjectWiseLookup typu Environment
Používatelia, skupiny, zoznamy, workflow a stavyVstavaný DMS.* lookup
Údaje z ERP, CRM alebo iného externého systémuLookup typu Standard a riadená synchronizácia
Opakovaná spoločná logika CELLibrary Expression
Zložité spojenie (JOIN), agregácia alebo procedúra nad databázouRedizajn, predvýpočet alebo externá integrácia

Library Expression umožňuje uložiť opakovane používanú logiku CEL pod lib a volať ju z viacerých výrazov. Nie je to cesta k databáze a nerozširuje oprávnenia CEL na prístup k údajom.


Ako pristúpiť k migrácii

Pri každom starom atribúte je dobré najprv zistiť, čo v skutočnosti robí:

  1. Číta iba aktuálneho používateľa, dokument, priečinok alebo iný atribút?
  2. Používa iba jednoduchú podmienku alebo textovú funkciu?
  3. Číta číselník z pôvodného Environmentu používaného ako lookup?
  4. Pripája údaje z viacerých tabuliek?
  5. Volá uloženú procedúru?
  6. Vracia jednu hodnotu, alebo zostavuje zoznam pre výber?
  7. Aké má správanie pri nulovom, jednom a viacerých výsledkoch?

Potom sa vyberie cieľ:

  • kontextový objekt, ak je údaj súčasťou aktuálneho kontextu ProjectWise,
  • operácia CEL, ak ide o podmienku, text, zoznam alebo čas,
  • lookup typu Environment, ak ide o spravovaný číselník ProjectWise,
  • vstavaný lookup, ak ide o podporované systémové údaje,
  • lookup typu Standard, ak údaje prichádzajú zvonka,
  • redizajn, ak staré riešenie závisí od ľubovoľného SQL alebo procedúry.

Časté nedorozumenia

Je CEL náhrada za SQL?

Nie v plnom rozsahu. Nahrádza výrazovú logiku v podporovaných scenároch ProjectWise, ale nie všeobecné databázové dotazovanie.

Sú názvy ako DMS.Users názvami tabuliek SQL?

Pre používateľa CEL nie. Sú to vstavané datasety lookupov s presne určenými stĺpcami a filtrami.

Môžem použiť ľubovoľnú tabuľku SQL, ak poznám jej názov?

Nie. Názov databázovej tabuľky nie je podporovaným rozhraním CEL.

Môžem čítať hodnoty z pôvodného Environmentu používaného ako lookup?

Áno, ak sa nad ním zaregistruje lookup typu Environment a sprístupnia sa potrebné atribúty. Nie však prostredníctvom svojvoľného priameho dotazu.

Musím lookup typu Environment znovu vytvoriť po každom novom zázname?

Nie. Riadky sa čítajú dynamicky zo zdrojového Environmentu. Definíciu treba upraviť vtedy, keď pridávame alebo meníme sprístupnené stĺpce či konfiguráciu lookupu.

Je lookup typu Standard dynamický?

Nie rovnakým spôsobom. Jeho obsah sa musí nahrať alebo synchronizovať podporovaným nástrojom.

Môže Bentley v budúcnosti sprístupniť ďalšie údaje?

Áno, výrobca môže rozšíriť podporované objekty alebo datasety. To však neznamená, že dnešný administrátor môže sám otvoriť ľubovoľnú tabuľku.


Záver

PW CEL mení základný princíp konfigurácie:

  • predtým sme často začínali otázkou „kde je údaj v databáze?“,
  • teraz musíme začať otázkou „prostredníctvom ktorého podporovaného objektu alebo lookupu získam v ProjectWise tento údaj?“.

Jednoduché výpočty, podmienky, textové úpravy a prácu s aktuálnym dokumentom možno riešiť priamo v CEL. Číselníky možno sprístupniť prostredníctvom lookupov. Ľubovoľná databázová logika sa do CEL neprepisuje priamo; musí sa nahradiť podporovaným dátovým tokom alebo prepracovať.

To je zároveň hlavná výhoda aj nevýhoda PW CEL: je bezpečnejší a kontrolovanejší, ale zámerne neposkytuje možnosti všeobecného SQL.


Oficiálne zdroje

Vysvetlenia a ukážky vychádzajú z verejnej dokumentácie Bentley pre ProjectWise Administrator 2026 a z reálnych spôsobov použitia PW CEL.

Stav zdrojov overený: 18. 8. 2026.

← Späť na technický prehľad PW CEL