Język skryptowy systemu jest używany w Workflow Management, na przykład do formułowania warunku wstępnego lub warunku przejścia lub do określania operatorów, którzy nie są podsumowani w roli workflow.
Silnik workflow obsługuje zarówno własny język skryptowy systemu, jak i JavaScript do wyrażania złożonych relacji. Niniejsza dokumentacja zawiera szczegółowe informacje na temat poszczególnych funkcji ogólnych języka skryptowego systemu. Funkcje ogólne to funkcje, których kontekst użycia nie wymaga ani definicji działania, ani bazy danych OLTP. Przykładami funkcji ogólnych są createCisDate i createTimestamp, które tworzą CisDate lub czas, a także getByPrimaryKey i getByBusinessKey, które otwierają obiekt biznesowy przy użyciu jego klucza podstawowego lub klucza biznesowego.
Przykłady zawarte w tym dokumencie mają pomóc w zrozumieniu sposobu korzystania z funkcji i poleceń języka skryptowego systemu. Aby użyć przykładów w innych kontekstach aplikacji, może być konieczne ich dostosowanie. Niniejszy dokument zawiera również przykłady funkcji, które nie są częścią języka skryptowego systemu. W takim przypadku przykłady wskazują, w jaki sposób można osiągnąć tę samą lub podobną funkcjonalność przy użyciu języka skryptowego systemu.
Grupa docelowa
Grupą docelową tego dokumentu są programiści i konsultanci techniczni, którzy tworzą lub dostosowują workflow dla klientów, a także klienci, którzy zarządzają własnym workflow.
Niniejszy dokument zakłada zrozumienie zakresu funkcji Workflow Management widocznych dla użytkownika. Ponadto, czytelnik powinien posiadać podstawową znajomość SQL lub innego języka programowania w celu zrozumienia języka skryptowego systemu.
Definicje terminów
GUID
GUID jest skrótem od Globally Unique Identifier i odpowiada globalnie unikalnemu identyfikatorowi. GUID to 128-bitowy numer obliczany zgodnie ze schematem Open Software Foundation (OSF) dla rozproszonych środowisk obliczeniowych (DCE). Zawiera on między innymi adres IP komputera generującego, składnik czasu i składnik losowy. Oznacza to, że dwa niezależne komputery mogą zawsze obliczyć różne identyfikatory GUID bez synchronizacji. W Comarch ERP Enterprise identyfikatory GUID są reprezentowane jako tablice bajtów Java o długości 16 i są używane głównie jako kompaktowe klucze podstawowe i obce w Business Objects.
Systemowy język skryptowy
Wyrażenia, warunki, polecenia, funkcje i deklaracje są używane do wyrażania złożonych relacji. Wszystkie te wyrażenia są częścią wspólnego języka skryptowego zwanego językiem skryptowym systemu. Składnia języka skryptowego systemu jest oparta na SQL, Pascal i Java. Język skryptowy systemu jest używany w Workflow Management, na przykład do formułowania warunku wstępnego lub warunku przejścia lub do określania operatorów, którzy nie są podsumowani w roli workflow.
Funkcje ogólne
Funkcje ogólne to funkcje, których kontekst użycia nie wymaga ani definicji działania, ani bazy danych OLTP. Niniejszy dokument dzieli funkcje ogólne na następujące grupy:
- Funkcje arytmetyczne
- Funkcje logiczne
- Funkcje dla ciągów znaków
- Funkcje daty i godziny
- Funkcje dla list
- Funkcje GUID
- Funkcje dla zestawów wartości
- Funkcje dla obiektów biznesowych
- Funkcje dla instrukcji OQL
- Funkcje NLS
- Funkcje dla plików
- Funkcje dla użytkowników
- Polecenia wyzwalania zdarzeń
- Funkcje systemowe i konfiguracyjne
- Funkcje wiadomości
- Funkcje dla wartości zerowych
- Inne funkcje
Funkcje arytmetyczne (Arithmetic functions)
Funkcje arytmetyczne reprezentują podstawowe operacje arytmetyczne. Funkcje arytmetyczne obejmują
- abs
- ceil
- floor
- max
- min
- neg
- round
abs
Nazwa |
abs |
Opis |
abs zwraca wartość bezwzględną liczby. |
Podpisy |
Number abs(Number value) |
Parametry |
value jest liczbą. |
Wynik |
Wartość bezwzględna value jako liczby. |
Źródła błędów |
Brak |
Przykłady |
abs(3.14159) zwraca wartość 3.14159. abs(-3.14159) zwraca -3.14159. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
function create() { var p_number := parameters.NUMBER; var r_abs := abs(p_number); result.VALUE := r_abs; }
ceil
Nazwa |
ceil |
Opis |
ceil zaokrągla liczbę w górę. |
Podpisy |
Number ceil(Number value) Number ceil(Number value, Number scale) |
Parametry |
value to liczba, która powinna zostać zaokrąglona w górę. scale to liczba cyfr potomnych dla wyniku. |
Wynik |
Liczba value zaokrąglona do scale miejsc dziesiętnych. Jeśli wartość scale nie jest określona, przyjmowane jest 0 miejsc po przecinku. Jeśli scale jest liczbą ujemną lub nie jest liczbą całkowitą, jest zaokrąglana do round(abs(„scale”)). |
Źródła błędów |
Brak |
Przykłady |
ceil(3.14159) zwraca 4. ceil(-3.1415) zwraca -3. ceil(3.14159 2) zwraca 3.15. ceil(-3.14159 4) zwraca -3.1415. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
ceil, round |
function create()
{
var p_number := parameters.NUMBER;
var p_scale := parameters.SCALE;
var r_ceil := ceil(p_number, p_scale);
result.VALUE := r_ceil;
}
floor
Nazwa |
floor |
Opis |
floor zaokrągla liczbę. |
Podpisy |
Number floor(Number value) Number floor(Number value, Number scale) |
Parametry |
value to liczba, która powinna zostać zaokrąglona w dół. scale to liczba cyfr potomnych dla wyniku. |
Wynik |
Liczba value jest zaokrąglana w dół do scale miejsc dziesiętnych. Jeśli wartość scale nie jest określona, przyjmowane jest 0 miejsc po przecinku. Jeśli scale jest liczbą ujemną lub nie jest liczbą całkowitą, jest zaokrąglana w dół do round(abs(„scale”)). |
Źródła błędów |
Brak |
Przykłady |
floor(3.14159) zwraca 3. floor(-3.1415) zwraca -4. floor(3.14159 4) zwraca wartość 3.1415. floor(-3.14159 2) zwraca -3.15. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
ceil, round |
function create()
{
var p_number := parameters.NUMBER;
var p_scale := parameters.SCALE;
var r_ceil := floor(p_number, p_scale);
result.VALUE := r_ceil;
}
max
Nazwa |
max |
Opis |
max określa największą liczbę, CisDate lub Timestamp z maksymalnie 9 parametrów. |
Podpisy |
Number max(Number p1) Number max(Number p1, Number p2) Number max(Number p1, Number p2, Number p3,…, Number p9) CisDate max(CisDate p1) CisDate max(CisDate p1, CisDate p2) CisDate max(CisDate p1, CisDate p2, CisDate p3,…, CisDate p9) Timestamp max(Timestamp p1) Timestamp max(Timestamp p1, Timestamp p2) Timestamp max(Timestamp p1, Timestamp p2, Timestamp p3,…, Timestamp p9) |
Parametry |
p1 to pierwsza liczba, CisDate lub punkt w czasie. p2 to druga liczba, CisDate lub punkt w czasie. p3 to trzecia liczba, CisDate lub punkt w czasie. […] p9 to dziewiąta liczba, CisDate lub punkt w czasie. |
Wynik |
Największa liczba, CisDate lub Timestamp spośród przesłanych parametrów. |
Źródła błędów |
Brak |
Przykłady |
max(-3, 1) zwraca 1. max(MIN_DATE, MAX_DATE) zwraca 9999.12.31. max(MIN_DATE, UNDEFINED_DATE) zwraca 1000.01.01. Jeśli parameters odwołuje się do obiektu biznesowego z częścią updateInfo, wówczas max(parameters.object:updateInfo.createTime, parameters.object:updateInfo.updateTime) zwraca czas ostatniej zmiany. Jeśli obiekt biznesowy nie został zmieniony od czasu jego utworzenia, wyrażenie zwraca czas utworzenia. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
min |
function create()
{
var p_number1 := parameters.NUMBER1;
var p_number2 := parameters.NUMBER2;
var p_timestamp1 := parameters.TIMESTAMP1;
var p_timestamp2 := parameters.TIMESTAMP2;
var p_cisDate1 := createCisDate(year(p_timestamp1), month(p_timestamp1), day(p_timestamp1));
var p_cisDate2 := createCisDate(year(p_timestamp2), month(p_timestamp2), day(p_timestamp2));
var r_max_number := max(p_number1, p_number2);
var r_max_cisDate := max(p_cisDate1, p_cisDate2);
var r_max_timestamp := max(p_timestamp1, p_timestamp2);
result.VALUE_NUMBER := r_max_number;
result.VALUE_CISDATE := r_max_cisDate;
result.VALUE_CISDATE := r_max_cisDate;
result.VALUE_TIMESTAMP := r_max_timestamp;
}
Aby określić największą liczbę z listy zawierającej więcej niż 9 liczb, można użyć na przykład następującej funkcji zdefiniowanej przez użytkownika:
function maxOfList(numberList as Number[]) as Number {
var largest := 0;
if (size(numberList) > 0)
największy := numberList[0];
for (n as Number : numberList)
if (n > największy)
largest := n;}
return largest;
}
min
Nazwa |
min |
Opis |
min określa najmniejszą liczbę, CisDate lub Timestamp z maksymalnie 9 parametrów. |
Podpisy |
Number min(Number p1) Number min(Number p1, Number p2) Number min(Number p1, Number p2, Number, p3,…, Number p9) CisDate min(CisDate p1) CisDate min(CisDate p1, CisDate p2) CisDate min(CisDate p1, CisDate p2, CisDate p3,…, CisDate p9) Timestamp min(Timestamp p1) Timestamp min(Timestamp p1, Timestamp p2) Timestamp min(Timestamp p1, Timestamp p2, Timestamp p3,…, Timestamp p9) |
Parametry |
p1 to pierwsza liczba, CisDate lub punkt w czasie. p2 to druga liczba, CisDate lub punkt w czasie. p3 to trzecia liczba, CisDate lub punkt w czasie. […] p9 to dziewiąta liczba, CisDate lub punkt w czasie. |
Wynik |
Najmniejsza liczba, CisDate lub Timestamp spośród przesłanych parametrów. |
Źródła błędów |
Brak |
Przykłady |
min(-3, 1) zwraca -3. min(MIN_DATE, MIN_DATE) zwraca 1000.01.01. min(MIN_DATE, UNDEFINED_DATE) zwraca 1000.01.01. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
max |
function create()
{
var p_number1 := parameters.NUMBER1;
var p_number2 := parameters.NUMBER2;
var p_timestamp1 := parameters.TIMESTAMP1;
var p_timestamp2 := parameters.TIMESTAMP2;
var p_cisDate1 as CisDate;
var p_cisDate2 as CisDate;
if (p_timestamp1 <> UNDEFINED_DATE)
p_cisDate1 := createCisDate(year(p_timestamp1), month(p_timestamp1), day(p_timestamp1));
if (p_timestamp2 <> UNDEFINED_DATE)
p_cisDate2 := createCisDate(year(p_timestamp2), month(p_timestamp2), day(p_timestamp2));
var r_min_liczba := min(p_liczba1, p_liczba2);
var r_min_cisDate := min(p_cisDate1, p_cisDate2);
var r_min_timestamp := min(p_timestamp1, p_timestamp2);
result.VALUE_NUMBER := r_min_number;
result.VALUE_TIMESTAMP := r_min_timestamp;
result.VALUE_CISDATE := r_min_cisDate;
result.IS_NULL := isNull(r_min_cisDate);
}
Aby określić najmniejszą liczbę z listy zawierającej więcej niż 9 liczb, można użyć na przykład następującej funkcji zdefiniowanej przez użytkownika:
function minOfList(numberList as Number[]) as Number {
var smallest := 0;
if (size(numberList) > 0)
smallest := numberList[0];
for (n as Number : numberList)
if (n < najmniejszy)
smallest := n;
return smallest;
}
neg
Nazwa |
neg |
Opis |
neg zwraca ujemną wartość liczby. |
Podpisy |
Number neg(Number value) |
Parametry |
value jest liczbą. |
Wynik |
Ujemna wartość value jako liczba. |
Źródła błędów |
Brak |
Przykłady |
neg(3.14159) zwraca -3.14159. neg(-3.14159) zwraca 3.14159. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
abs |
function create()
{
var p_number := parameters.NUMBER;
var r_neg := neg(p_number);
result.VALUE := r_neg;
}
round
Nazwa |
round |
Opis |
round zaokrągla liczbę. |
Podpisy |
Number round(Number value) Number round(Number value, Number scale) |
Parametry |
value to liczba, która ma zostać zaokrąglona. scale to liczba cyfr potomnych dla wyniku. |
Wynik |
Liczba value zaokrąglona do scale miejsc dziesiętnych. Jeśli wartość scale nie zostanie określona, przyjmowane jest 0 miejsc po przecinku. Jeśli scale jest liczbą ujemną lub nie jest liczbą całkowitą, używane jest round(abs(„scale”)). |
Źródła błędów |
Brak |
Przykłady |
round(3.14159) zwraca 3. round(-3.1415) zwraca -3. round(3.14159 4) zwraca 3.1416. round(-3.14159 4) zwraca -3.1416. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
ceil, floor |
function create()
{
var p_number := parameters.NUMBER;
var p_scale := parameters.SCALE;
var r_round := round(p_number, p_scale);
result.VALUE := r_round;
}
Funkcje logiczne (Logic functions)
Funkcja logiczna not może być użyta do odwrócenia wartości prawdy wyrażenia logicznego.
not
Nazwa |
not |
Opis |
not odwraca wartość prawdy (Boolean). |
Podpisy |
Boolean not(Boolean value) |
Parametry |
value jest liczbą. |
Wynik |
Jeśli value ma wartość true, zwracana jest wartość false. Jeśli value nie jest wartością true, zwracana jest wartość true. |
Źródła błędów |
Brak |
Przykłady |
not(true) zwraca wartość prawdy false. not(false) zwraca wartość prawdy true. not(isEmpty(intersection(list(format(today(), „EEE”, „en”)), list(„Sat”, „Sun”)))) zwraca true, jeśli dzisiaj jest sobota lub niedziela, w przeciwnym razie false. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
function create()
{
var p_number := parameters.NUMBER;
var r_not := not(p_number = 0);
result.VALUE := r_not;
}
Funkcje dla ciągów znaków (String functions)
Ciągi znaków można edytować i wyszukiwać za pomocą funkcji dla ciągów znaków. Funkcje dla ciągów znaków obejmują:
- char
- charAt
- decrypt
- encrypt
- endsWith
- format
- indexOf
- lastIndexOf
- lenght
- startsWith
- substring
- toHtml
- toLower
- toUpper
- trim
- unzipText
char
Nazwa |
char |
Opis |
char zwraca znak Unicode numerycznego punktu kodowego. |
Podpisy |
String char(Number codepoint) |
Parametry |
codepoint to punkt kodowy znaku Unicode. |
Wynik |
Znak Unicode punktu kodowego jako ciąg jednego znaku. |
Źródła błędów |
Brak |
Przykłady |
char(97) zwraca znak Unicode a. |
Kontekst |
ALL |
Uwagi |
Comarch ERP Enterprise wykorzystuje Unicode w całym systemie. Oznacza to, że wszystkie popularne znaki globalne mogą być używane i drukowane na formularzach. |
Zobacz także |
charAt |
function create()
{
var p_codepoint := parameters.CODEPOINT;
var r_char := char(p_codepoint);
result.VALUE := r_char;
}
charAt
Nazwa |
charAt |
Opis |
charAt zwraca numeryczny punkt kodowy znaku Unicode. |
Podpisy |
Number charAt(String text, Number index) |
Parametry |
text to ciąg znaków zawierający znaki Unicode. index to pozycja znaku Unicode w ciągu znaków. |
Wynik |
Punkt kodowy znaku Unicode na pozycji określonej przez index w łańcuchu znaków text. |
Źródła błędów |
Jeśli index nie jest prawidłową pozycją ciągu text, zwracana jest wartość zero. |
Przykłady |
charAt(„abc”, 1) zwraca wartość 98 dla znaku Unicode b. |
Kontekst |
ALL |
Uwagi |
Comarch ERP Enterprise wykorzystuje Unicode w całym systemie. Oznacza to, że wszystkie popularne znaki globalne mogą być używane i drukowane na formularzach. |
Zobacz także |
char |
function create()
{
var p_text := parameters.TEXT;
var p_index := parameters.INDEX;
var r_charAt := charAt(p_text, p_index);
result.IS_NULL := isNull(r_charAt);
result.VALUE := r_charAt;
}
decrypt
Nazwa |
decrypt |
Opis |
decrypt używa klucza, aby zwrócić zaszyfrowany tekst w postaci niezaszyfrowanej. |
Podpisy |
String decrypt(String key, String encryptedText) |
Parametry |
key to 32-cyfrowy klucz, za pomocą którego tekst został zaszyfrowany. encryptedText to zaszyfrowany tekst. |
Wynik |
Tekst encryptedText jako niezaszyfrowany ciąg znaków. |
Źródła błędów |
Jeśli klucz key nie ma długości 32 znaków, zwracana jest wartość zero. |
Przykłady |
decrypt(„u22Teu88mN/8hND92ch+hkDj84PlQMMWUE2Y4cnVuCk=”) odszyfrowuje zaszyfrowany tekst przy użyciu klucza standardowego i zwraca niezaszyfrowaną wartość jako ciąg znaków. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
encrypt |
function create()
{
var p_encrypted_text := parameters.ENCRYPTED_TEXT;
var p_key := parameters.KEY;
var r_decrypted_text as String;
r_decrypted_text := decrypt(p_key, p_encrypted_text);
result.IS_NULL := isNull(r_decrypted_text);
result.DECRYPTED_TEXT := r_decrypted_text;
}
encrypt
Nazwa |
encrypt |
Opis |
encrypt szyfruje tekst przy użyciu klucza i zwraca zaszyfrowany tekst jako ciąg znaków. |
Podpisy |
String encrypt(String plainText) String encrypt(String key, String plainText) |
Parametry |
plainText to ciąg znaków, który ma zostać zaszyfrowany. key jest kluczem. Jeśli nie określono klucza, plainText jest szyfrowany przy użyciu standardowego klucza. |
Wynik |
Tekst plainText jako zaszyfrowany ciąg znaków. |
Źródła błędów |
Jeśli klucz key nie jest znany systemowi, zwracana jest wartość zero. |
Przykłady |
encrypt(„abc”) szyfruje tekst abc przy użyciu standardowego klucza systemowego i zwraca zaszyfrowaną wartość jako ciąg znaków. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
decrypt |
function create()
{
var p_decrypted_text := parameters.DECRYPTED_TEXT;
var p_key := parameters.KEY;
var r_encrypted_text as String;
if(p_key <> „”)
r_encrypted_text := encrypt(p_key, p_decrypted_text);
inny
r_encrypted_text := encrypt(p_decrypted_text);
result.IS_NULL := isNull(r_encrypted_text);
result.ENCRYPTED_TEXT := r_encrypted_text;
}
endsWith
Nazwa |
endsWith |
Opis |
endsWith sprawdza, czy ciąg znaków kończy się określonym sufiksem. |
Podpisy |
Boolean endsWith(String text, String suffix) |
Parametry |
text to ciąg znaków, który ma zostać sprawdzony. suffix jest znakiem lub ciągiem znaków. |
Wynik |
Jeśli ciąg text kończy się na suffix, wynikiem jest true, w przeciwnym razie false. |
Źródła błędów |
Brak |
Przykłady |
endsWith(„ERP”, „P”) zwraca wartość true. endsWith(„ERP”, „E”) zwraca wartość false. endsWith(„Comarch”, „arch”) zwraca wartość true. endsWith(„Enterprise”, „”) zwraca wartość true. endsWith(„”, „CEE”) zwraca wartość false. endsWith(„”,””) zwraca wartość true. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
startsWith |
function create()
{
var p_text := parameters.TEXT;
var p_suffix := parameters.SUFFIX;
var r_endsWith := endsWith(p_text, p_suffix);
result.VALUE := r_endsWith;
}
format
Nazwa |
format |
Opis |
format zwraca parametr jako sformatowany ciąg znaków. Parametr jest formatowany w różny sposób w zależności od typu danych. |
Podpisy |
String format(CisDate date) String format(CisDate date, String pattern) String format(CisDate date, String pattern, String language) String format(Timestamp time) String format(Timestamp time, String pattern) String format(Timestamp time, String pattern, String language) String format(Number number) String format(Number number, String pattern) String format(Number number, String pattern, String language) String format(String text) String format(String text, String p1) String format(String text, String p1, String p2) String format(String text, String p1, String p2, String p3,…,String p8) String format(String text, String[] parameters) |
Parametry |
date jest CisDate. time to punkt w czasie (znacznik czasu). number jest liczbą. pattern to ciąg znaków z instrukcjami formatowania CisDate, godziny lub liczby. Jeśli format nie zostanie określony, wyprowadzana jest liczba w formacie # oraz CisDate lub godzina w formacie rrrrMMddHHmmssSSS. language to 2-literowy kod ISO służący do formatowania CisDate, godziny lub liczby zgodnie ze standardowym formatem krajowym. text to ciąg znaków, który może zawierać symbole zastępcze {0}, {1}, {2},…, {n}. p1 do p8 to ciągi do 8 znaków z określonymi wartościami dla symboli zastępczych w text. parameters to lista z dowolną liczbą symboli zastępczych. |
Wynik |
Jeśli parametr jest ciągiem znaków, format zastępuje symbole zastępcze w ciągu znaków. Dla wszystkich innych typów danych, format zwraca parametr jako sformatowany ciąg znaków. |
Źródła błędów |
Jeśli nie istnieje odpowiedni format dla określonego języka, wynikiem jest zero. |
Przykłady |
Dla ciągów znaków: format(„Hello {0}!”, „world”) zwraca Hello world!. format(„Hello {0}!”, list(„world”)) zwraca Hello world!. Dla CisDate: format(MIN_DATE, „dd MMMM rrrr”, „pl”)) zwraca 01 styczeń 0002. format(MIN_DATE)) zwraca 00020101000002. Dla punktów czasowych: Dla liczb: format(3,1415926)) zwraca 3. format(3,1415926, „###.##”, „de”)) zwraca 3,14. format(3,1415926, „0000.0000”, „de”)) zwraca 0003,1416. format(3,1415926, „#.00”, „en”)) zwraca 3.14. format(3,1415926, „#%”)) zwraca 314%. |
Kontekst |
ALL |
Uwagi |
Jeśli w tekście ma zostać zastąpionych więcej niż 8 symboli zastępczych, wartości muszą zostać przesłane jako lista ciągów znaków. |
Zobacz także |
dateString, timeString, toHtml |
Do formatowania liczb dostępne są następujące symbole:
Symbol |
Wyjaśnienie |
0 |
Liczba z zerem wiodącym |
# |
Liczba bez zera wiodącego |
. |
Separator dziesiętny w zależności od języka |
– |
Znak minus |
, |
Grupowanie znaków w zależności od języka |
; |
Oddziela formaty dodatnie i ujemne. |
% |
Mnoży liczbę przez 100 i wyświetla ją jako wartość procentową. |
’ |
Charakteryzuje znaki specjalne. |
Następujące symbole są dostępne do formatowania CisDate i czasu:
Symbol |
Opis |
G |
Era, np. GG->AD |
y |
Rok, np. rrrr->2021, rrrr->21 |
M |
Miesiąc, np. MM->08, MMM->sierpień, MMMM->sierpień, w zależności od języka. |
w |
tydzień w roku, np. ww->27 |
W |
tydzień na miesiąc, np. W->2 |
D |
dzień roku, np: DDD->183 |
d |
Dzień miesiąca, np. dd->05, d->5 |
F |
dzień tygodnia w miesiącu, np. F->2 |
E |
Dzień tygodnia, np. EEE->Tue, EEEE-> Tuesday, w zależności od języka. |
a |
am/pm, np. aa -> PM |
H |
godzin dziennie (0-23), np. 13 |
k |
Godzina na dzień (1-24), np. 24 |
K |
Godzina w am/ppm (0-11), np. 0 |
h |
Godzina w am/pm (1-12), np. 12 |
m |
minut na godzinę, np. 53 |
s |
Sekunda w minucie, np. 55 |
S |
Milisekunda w sekundzie, np. 978 |
Funkcji formatu można używać na przykład do następujących zadań:
- W opisie działania liczby całkowite powinny być zapisane bez miejsc dziesiętnych.
- Jeśli użytkownik chce sformatować liczby, CisDates i godziny zgodnie z językiem korespondencji odbiorcy wiadomości e-mail. Należy upewnić się, że funkcja zwraca zero, jeśli nie ma odpowiedniego formatu dla określonego języka.
- Do pliku eksportu, który ma zostać wygenerowany, należy przypisać unikatową nazwę z odniesieniem czasowym.
- Jeśli użytkownik chce utworzyć plik importu, aby zaimportować go później. W takim przypadku można zapisać plik szablonu importu z symbolami zastępczymi w Knowledge Store i odczytać go za pomocą funkcji readTextFile. Następnie należy użyc formatu, aby wypełnić symbole zastępcze określonymi wartościami, a następnie zapisać gotowy plik importu w Knowledge Store do importu za pomocą funkcji writeFile.
- W opisie działania należy użyć modułów tekstowych z symbolami zastępczymi, aby móc zarządzać opisami niezależnie od definicji działania.
function create()
{
var p_date as CisDate;
var p_timestamp as Timestamp;
var p_number := parameters.NUMBER;
var p_pattern := parameters.PATTERN;
var p_language := parameters.LANGUAGE;
var p_parameters := parameters.PARAMETERS;
var r_date as String;
var r_timestamp as String;
var r_number as String;
p_date := today();
p_timestamp := now();
/* format CisDate, Timestamp i Number zgodnie z wzorcem */
if (p_language = „”) {
r_date:= format(today(), p_pattern);
r_timestamp := format(p_timestamp, p_pattern);
r_number := format(p_number, p_pattern);
} else {
r_date := format(today(), p_pattern, p_language);
r_timestamp := format(p_timestamp, p_pattern, p_language);
r_number := format(p_number, p_pattern, p_language);
}
/* return result if not null */
if (not isNull(r_date)) result.VALUE_DATE := r_date;
if (not isNull(r_date)) result.VALUE_TIMESTAMP := format(p_timestamp, p_pattern);
if (not isNull(r_date)) result.VALUE_NUMBER := format(p_number, p_pattern);
if (isNull(r_date)) result.VALUE_DATE := „null”;
if (isNull(r_date)) result.VALUE_TIMESTAMP := „null”;
if (isNull(r_date)) result.VALUE_NUMBER := „null”
/* zastępuje parametry (symbole zastępcze) w łańcuchu */
var p_text := „p0={0}, p1={1}, p2={2}, p3={3}, p4={4}, p5={5}, p6={6}, p7={7}, p8={8}, p9={9}”;
var pList := split(p_parameters, ” „);
if (size(pList) = 1)
result.VALUE_STRING := format(p_text, p_parameters);
else
result.VALUE_STRING := format(p_text, pList);
}
/* Dzieli „p_text” na tablicę przy każdym wystąpieniu „p_separator” */
function split(p_text as String, p_separator as String) as String[]
{
if (p_separator = „”)
p_separator := ” „;
var increment := length(p_separator);
var sep as String;
var word as String;
var r_wordList as String[];
var i := 0;
var startPos := 0;
while (i + increment – 1 < length(p_text)) {
sep := substring(p_text, i, i + increment);
if (sep = p_separator) {
word := trim(substring(p_text, startPos, i));
i := i + przyrost;
startPos := i;
if (word <> „” and word <> p_separator)
add(r_wordList, word);
} else {
i := i + 1;
}
}
word := substring(p_text, startPos);
if (word <> „” and word <> p_separator)
add(r_wordList, word);
return r_wordList;
}[/example]
indexOf
Nazwa |
indexOf |
Opis |
indexOf określa pierwszą pozycję znaku lub ciągu znaków w tekście. |
Podpisy |
Number indexOf(String text, String searchValue) Number indexOf(String text, String searchValue, Number firstPos) |
Parametry |
text to tekst do przeszukania. searchValue to znak lub ciąg znaków, który ma zostać wyszukany. firstPos to pozycja w tekście, od której powinno rozpocząć się wyszukiwanie. |
Wynik |
Pozycja pierwszego wystąpienia searchValue w text od pozycji firstPos. Jeśli wyszukiwanie nie powiodło się, zwracane jest -1. |
Źródła błędów |
Brak |
Przykłady |
indexOf(„abcabc”, „a”) zwraca 0. indexOf(„abcabc”, „b”) zwraca 1. indexOf(„abcabc”, „z”) zwraca -1. indexOf(„abcabc”, „bc”) zwraca 1. indexOf(„abcabc”, „”) zwraca 0. indexOf(„”, „a”) zwraca -1. indexOf(„”, „”) zwraca 0. indexOf(„abcabc”, „c”, 2) zwraca 2. indexOf(„abcabc”, „c”, 3) zwraca 5. indexOf(„abcabc”, „c”, -10) zwraca 2. indexOf(„abcabc”, „c”, 10) zwraca -1. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
lastIndexOf, substring |
function create()
{
var p_text := parameters.TEXT;
var p_searchValue := parameters.SEARCH_VALUE;
var p_firstPos := parameters.FIRST_POS;
var r_indexOf as Number;
if (p_firstPos = 0)
r_indexOf := indexOf(p_text, p_searchValue);
inny
r_indexOf := indexOf(p_text, p_searchValue, p_firstPos);
result.VALUE := r_indexOf;
}
lastIndexOf
Nazwa |
lastIndexOf |
Opis |
indexOf określa ostatnią pozycję znaku lub ciągu znaków w tekście. |
Podpisy |
Number lastIndexOf(String text, String searchValue) Number lastIndexOf(String text, String searchValue, Number firstPos) |
Parametry |
text to tekst do przeszukania. searchValue to znak lub ciąg znaków, który ma zostać wyszukany. firstPos to pozycja w tekście, od której powinno rozpocząć się wyszukiwanie. |
Wynik |
Pozycja pierwszego wystąpienia searchValue w text od pozycji firstPos. W przeciwieństwie do funkcji indexOf, text jest przeszukiwany wstecz od firstPos. Jeśli wyszukiwanie nie powiodło się, zwracane jest -1. |
Źródła błędów |
Brak |
Przykłady |
lastIndexOf(„abcabc”, „a”) zwraca 3. lastIndexOf(„abcabc”, „b”) zwraca 4. lastIndexOf(„abcabc”, „d”) zwraca -1. lastIndexOf(„abcabc”, „bc”) zwraca 4. lastIndexOf(„abcabc”, „”) zwraca 5. lastIndexOf(„”, „a”) zwraca -1. lastIndexOf(„”, „”) zwraca 0. lastIindexOf(„abcabc” „a”, 2) zwraca 0. lastIndexOf(„abcabc”, „a”, 3) zwraca 3. lastIndexOf(„abcabc”, „a”, -10) zwraca -1. lastIndexOf(„abcabc”, „a”, 10) zwraca 3. substring(objectName(event.guid), lastIndexOf(objectName(event.guid), „.”)) zwraca nazwę jednostki biznesowej zdarzenia typu Jednostka biznesowa bez jej przestrzeni nazw. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
indexOf, substring |
function create()
{
var p_text := parameters.TEXT;
var p_searchValue := parameters.SEARCH_VALUE;
var p_lastPos := parameters.LAST_POS;
var r_lastIndexOf as Number;
if (p_lastPos = 0)
r_lastIndexOf := lastIndexOf(p_text, p_searchValue);
inny
r_lastIndexOf := lastIndexOf(p_text, p_searchValue, p_lastPos)
result.VALUE := r_lastIndexOf;
}
lenght
Nazwa |
lenght |
Opis |
length zwraca długość ciągu znaków. |
Podpisy |
Number (String text) |
Parametry |
text to ciąg znaków, którego długość ma zostać określona. |
Wynik |
Długość ciągu znaków text. |
Źródła błędów |
Brak |
Przykłady |
length(„abc”) zwraca 3. length(„”) zwraca 0. |
Kontekst |
ALL |
Uwagi |
Długość to liczba znaków w ciągu znaków. Pierwszy znak ma pozycję 0. Dlatego ostatni znak niepustego ciągu text ma pozycję length(text)-1. Liczba elementów na liście jest określana przez size. |
Zobacz także |
function create()
{
var p_text := parameters.TEXT;
var r_length := length(p_text);
result.VALUE := r_length;
}
startsWith
Nazwa |
startsWith |
Opis |
startsWith sprawdza, czy ciąg znaków zaczyna się od określonego prefiksu. |
Podpisy |
Boolean startsWith(String text, String prefix) |
Parametry |
text to ciąg znaków, który ma zostać sprawdzony. prefix to znak lub ciąg znaków. |
Wynik |
Jeśli ciąg text zaczyna się od prefix, wynikiem jest true, w przeciwnym razie false. |
Źródła błędów |
Brak |
Przykłady |
startsWith(„ERP”, „E”) zwraca wartość true. startsWith(„ERP”, „e”) zwraca wartość false. startsWith(„Comarch”, „Com”) zwraca wartość true. startsWith(„Enterprise”, „”) zwraca wartość true. startsWith(„”, „CEE”) zwraca wartość false. startsWith(„”,””) zwraca wartość true. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
endsWith |
function create()
{
var p_text := parameters.TEXT;
var p_prefix := parameters.PREFIX;
var r_startsWith := startsWith(p_text, p_prefix);
result.IS_NULL := isNull(r_startsWith);
result.VALUE := r_startsWith;
}
substring
Nazwa |
substring |
Opis |
substring zwraca wszystkie znaki ciągu znaków od określonej pozycji. |
Podpisy |
String substring(String text, firstIncluded) String substring(String text, firstIncluded, firstExcluded) |
Parametry |
text to ciąg znaków. firstIncluded to pozycja pierwszego znaku w parametrze text, który ma zostać zwrócony. firstExcluded to pozycja pierwszego znaku po firstIncluded, który nie powinien zostać zwrócony. |
Wynik |
Ciąg znaków zawierający wszystkie znaki w text od pozycji firstIncluded (włącznie) do pozycji firstExcluded (wyłącznie). |
Źródła błędów |
Jeśli wartość firstIncluded jest ujemna lub większa niż firstExcluded, zwracana jest wartość zero. |
Przykłady |
substring(„012345”, 2) zwraca 2345. substring(„012345”, 2, 4) zwraca 23. substring(„012345”, 2, 2) zwraca „”. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
indexOf, lastIndexOf |
function create()
{
var p_text := parameters.TEXT;
var p_firstIncluded := parameters.FIRST_INCLUDED;
var p_firstExcluded := parameters.FIRST_EXCLUDED;
var r_substring as String;
if (p_firstExcluded = 0)
r_substring := substring(p_text, p_firstIncluded);
else
r_substring := substring(p_text, p_firstIncluded, p_firstExcluded);
result.IS_NULL := isNull(r_substring);
result.VALUE := r_substring;
}
toHTML
Nazwa |
toHtml |
Opis |
toHtml zwraca ciąg znaków ze znakami specjalnymi jako encje HTML. |
Podpisy |
String toHtml(String plainText) |
Parametry |
plainText to ciąg znaków. |
Wynik |
|
Źródła błędów |
Brak |
Przykłady |
toHtml(„<p>text</p>”) zwraca ciąg znaków <p>text</p>. toHtml(„Pozdrowienia”) zwraca ciąg znaków Grüße. Poniższy przykład dodaje link do artykułu 10010 do opisu działania: formatDescriptionHTML(„company”, „<a href=\”” + getURL(getCustomizingValue(„com.cisag.app.General”)->Company) + „\”>” + toHtml(getCustomizingValue(„com.cisag.app.General”)->Company:searchString) + „</a>”) zastępuje parametr company w nazwie działania wyszukiwanym terminem partnera powiązanego z klientem i linkiem do otwarcia partnera. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
format |
function create()
{
var p_text := parameters.TEXT;
var var r_toHtml as String;
r_toHtml := toHtml(p_text);
result.VALUE := r_toHtml;
}
toLower
Nazwa |
toLower |
Opis |
toLower konwertuje wszystkie wielkie litery w ciągu znaków na małe litery. |
Podpisy |
String (String text) |
Parametry |
text to ciąg znaków, którego wielkie litery mają zostać zamienione na małe. |
Wynik |
Ciąg znaków text ze wszystkimi dużymi literami zamienionymi na małe. |
Źródła błędów |
Brak |
Przykłady |
toLower(„Abc123”) zwraca abc123. toLower(„ABC123”) zwraca abc123. toLower(„”) zwraca „”. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
toUpper |
function create()
{
var p_text := parameters.TEXT;
var r_toLower := toLower(p_text);
result.VALUE := r_toLower;
}
toUpper
Nazwa |
toUpper |
Opis |
toUpper konwertuje wszystkie małe litery w ciągu znaków na wielkie litery. |
Podpisy |
String (String text) |
Parametry |
text to ciąg znaków, którego małe litery mają zostać zamienione na duże. |
Wynik |
Ciąg znaków text ze wszystkimi małymi literami zamienionymi na wielkie. |
Źródła błędów |
Brak |
Przykłady |
toUpper(„Abc123”) zwraca ABC123. toUpper(„abc123”) zwraca ABC123. toUpper(„”) zwraca „”. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
toLower |
function create()
{
var p_text := parameters.TEXT;
var r_toUpper := toUpper(p_text);
result.VALUE := r_toUpper;
}
trim
Nazwa |
trim |
Opis |
trim usuwa spacje na początku i końcu ciągu znaków. |
Podpisy |
String (String text) |
Parametry |
string to ciąg znaków. |
Wynik |
Usunięto ciąg znaków text ze spacjami na początku i końcu. |
Źródła błędów |
Brak |
Przykłady |
trim(” JOB „) zwraca wartość JOB. |
Kontekst |
ALL |
Uwagi |
Spacje w ciągu znaków text nie są usuwane. |
Zobacz także |
function create()
{
var p_text := parameters.TEXT;
var r_trim as String;
result.VALUE := trim(p_text);
}
unzipText
Nazwa |
unzipText |
Opis |
unzipText rozpakowuje ciąg znaków z BLOB i zwraca go jako ciąg znaków. |
Podpisy |
String unzipText(Bytes blob) |
Parametry |
blob to ciąg znaków przechowywany jako BLOB. |
Wynik |
Rozpakowany ciąg znaków. |
Źródła błędów |
Jeśli BLOB nie zawiera żadnego spakowanego tekstu, wynikiem funkcji jest zero. |
Przykłady |
Jeśli parameters.object jest modułem tekstowym, wówczas unzipText(parameters.object:text) zwraca zawartość modułu tekstowego jako ciąg znaków. |
Kontekst |
ALL |
Uwagi |
W celu rozpakowania za pomocą funkcji unzipText, BLOB musi być spakowany zgodnie ze standardową procedurą. Nie dotyczy to wszystkich obiektów BLOB. |
Zobacz także |
function create()
{
var p_textModule := parameters.TEXT_MODULE;
var var r_unzipText as String;
var p_language := getByBusinessKey(CisObject(com.cisag.app.general.obj.Language), parameters.LANGUAGE);
if (not isNull(p_language)) {
var textModule := getByBusinessKey(CisObject(com.cisag.app.general.obj.Text), p_language:guid, ZERO_GUID, p_textModule);
r_unzipText := unzipText(textModule:text);
result.IS_NULL := isNull(r_unzipText);
result.VALUE := r_unzipText;
}
}
Funkcje daty i godziny (Date and time functions)
Funkcje daty i godziny mogą być używane do tworzenia i edytowania dat i godzin CisDates. Funkcje daty i godziny obejmują:
- addDays
- addHours
- addMilliseconds
- addMinutes
- addSeconds
- createCisDate
- createTimestamp
- day
- days
- dateString
- endOfDay
- hour
- hours
- isMaxDate
- isMinDate
- isUndefinedDate
- milisecond
- miliseconds
- minute
- minutes
- month
- months
- now
- second
- seconds
- startOfDay
- timeString
- timeZoneId
- timeZoneString
- today
- toTimestamp
- weeks
- year
- years
addDays
Nazwa |
addDays |
Opis |
addDays dodaje dni do CisDate lub punktu w czasie. |
Podpisy |
CisDate addDays(CisDate date, Number offset) Timestamp addDays(Timestamp time, Number offset) |
Parametry |
date jest CisDate. time to punkt w czasie. offset to liczba dni dodawana do parametru date lub time. |
Wynik |
CisDate lub Timestamp offset dni po parametrze date lub time. |
Źródła błędów |
Brak |
Przykłady |
addDays(today(), 7) zwraca CisDate za dokładnie jeden tydzień. addDays(now(), 7) zwraca czas za dokładnie jeden tydzień. addDays(startOfDay(now()), 1) zwraca czas jutro o godzinie 00:00:00.000. |
Kontekst |
ALL |
Uwagi |
Jeśli offset jest ujemny, wówczas addDays zwraca CisDate lub czas, który leży przed date lub time. |
Zobacz także |
addHours, addMilliseconds, addMinutes, addSeconds |
function create()
{
var p_offset := parameters.OFFSET;
var r_addDaysDate as CisDate;
var r_addDaysTime as Timestamp;
r_addDaysDate := addDays(today(), p_offset);
r_addDaysTime := addDays(now(), p_offset);
result.VALUE_DATE := dateString(r_addDaysDate);
result.VALUE_TIME := r_addDaysTime;
}
addHours
Nazwa |
addHours |
Opis |
addHours dodaje godziny do CisDate lub godziny. |
Podpisy |
CisDate addHours(CisDate date, Number offset) Timestamp addHours(Timestamp time, Number offset) |
Parametry |
date jest CisDate. time to punkt w czasie. offset to liczba godzin dodawana do parametru date lub time. |
Wynik |
CisDate lub Timestamp offset godzin po parametrze date lub time. |
Źródła błędów |
Brak |
Przykłady |
addHours(today(), 24) zwraca CisDate dokładnie za jeden dzień. addHours(now(), 24) zwraca czas za dokładnie jeden dzień. |
Kontekst |
ALL |
Uwagi |
Jeśli offset jest ujemny, wówczas addHours zwraca CisDate lub czas, który jest przed date lub time. |
Zobacz także |
addDays, addMilliseconds, addMinutes, addSeconds |
function create()
{
var p_offset := parameters.OFFSET;
var r_addHoursDate as CisDate;
var r_addHoursTime as Timestamp;
r_addHoursDate := addHours(today(), p_offset);
r_addHoursTime := addHours(now(), p_offset);
result.VALUE_DATE := dateString(r_addHoursDate);
result.VALUE_TIME := r_addHoursTime;
}
addMilliseconds
Nazwa |
addMilliseconds |
Opis |
addMilliseconds dodaje milisekundy do CisDate lub punktu w czasie. |
Podpisy |
CisDate addMilliseconds(CisDate date, Number offset) Timestamp addMilliseconds(Timestamp time, Number offset) |
Parametry |
date jest CisDate. time to punkt w czasie. offset to liczba milisekund dodawana do parametru date lub time. |
Wynik |
CisDate lub Timestamp offset milisekund po parametrze date lub time. |
Źródła błędów |
Brak |
Przykłady |
addMilliseconds(today(), 24*60*60*1000) zwraca CisDate dokładnie za jeden dzień. addMilliseconds(now(),24*60*60*1000) zwraca czas za dokładnie jeden dzień. addMilliseconds(endOfDay(now()), 1) zwraca jutrzejszą godzinę dokładnie jedną milisekundę po północy. |
Kontekst |
ALL |
Uwagi |
Jeśli offset jest ujemny, wówczas addMilliseconds zwraca CisDate lub czas, który leży przed date lub time. |
Zobacz także |
addDays, addHours, addMinutes, addSeconds |
function create()
{
var p_offset := parameters.OFFSET;
var r_addMillisecondsDate as CisDate;
var r_addMillisecondsTime as Timestamp;
r_addMillisecondsDate := addMilliseconds(today(), p_offset);
r_addMillisecondsTime := addMilliseconds(now(), p_offset);
result.VALUE_DATE := dateString(r_addMillisecondsDate);
result.VALUE_TIME := r_addMillisecondsTime;
}
addMinutes
Nazwa |
addMinutes |
Opis |
addMinutes dodaje minuty do CisDate lub godziny. |
Podpisy |
CisDate addMinutes(CisDate date, Number offset) Timestamp addMinutes(Timestamp time, Number offset) |
Parametry |
date jest CisDate. time to punkt w czasie. offset to liczba minut, która ma zostać dodana do parametru date lub time. |
Wynik |
CisDate lub Timestamp offset minut po parametrze date lub time. |
Źródła błędów |
Brak |
Przykłady |
addMinutes(today(), 24*60) zwraca CisDate za dokładnie jeden dzień. addMinutes(now(),24*60) zwraca czas za dokładnie jeden dzień. |
Kontekst |
ALL |
Uwagi |
Jeśli offset jest ujemny, wówczas addMinutes zwraca CisDate lub czas, który leży przed date lub time. |
Zobacz także |
addDays, addHours, addMilliseconds, addSeconds |
function create()
{
var p_offset := parameters.OFFSET;
var r_addMinutesDate as CisDate;
var r_addMinutesTime as Timestamp;
r_addMinutesDate := addMinutes(today(), p_offset);
r_addMinutesTime := addMinutes(now(), p_offset);
result.VALUE_DATE := dateString(r_addMinutesDate);
result.VALUE_TIME := r_addMinutesTime;
}
addSeconds
Nazwa |
addSeconds |
Opis |
addSeconds dodaje sekundy do CisDate lub godziny. |
Podpisy |
CisDate addSeconds(CisDate date, Number offset) Timestamp addSeconds(Timestamp time, Number offset) |
Parametry |
date jest CisDate. time to punkt w czasie. offset to liczba sekund dodawana do parametru date lub time. |
Wynik |
CisDate lub Timestamp offset sekund po parametrze date lub time. |
Źródła błędów |
Brak |
Przykłady |
addSeconds(today(), 24*60*60) zwraca CisDate dokładnie za jeden dzień. addSeconds(now(),24*60*60) zwraca czas za dokładnie jeden dzień. |
Kontekst |
ALL |
Uwagi |
Jeśli offset jest ujemny, wówczas addSeconds zwraca CisDate lub czas, który leży przed date lub time. |
Zobacz także |
addDays, addHours, addMilliseconds, addMinutes |
function create()
{
var p_offset := parameters.OFFSET;
var r_addSecondsDate as CisDate;
var r_addSecondsTime as Timestamp;
r_addSecondsDate := addSeconds(today(), p_offset);
r_addSecondsTime := addSeconds(now(), p_offset);
result.VALUE_DATE := dateString(r_addSecondsDate);
result.VALUE_TIME := r_addSecondsTime;
}
createCisDate
Nazwa |
createCisDate |
Opis |
createCisDate tworzy dowolną datę CisDate. |
Podpisy |
CisDate createCisDate(Number year) CisDate createCisDate(Number year, Number month) CisDate createCisDate(Number year, Number month, Number day) CisDate createCisDate(Number year, Number month, Number day, Number hour) CisDate createCisDate(Number year, Number month, Number day, Number hour, Number minute) CisDate createCisDate(Number year, Number month, Number day, Number hour, Number minute, Number second) CisDate createCisDate(Number year, Number month, Number day, Number hour, Number minute, Number second, Number millisecond) CisDate createCisDate(String timeZoneId, Number year) CisDate createCisDate(String timeZoneId, Number year, Number month) CisDate createCisDate(String timeZoneId, Number year, Number month, Number day) CisDate createCisDate(String timeZoneId, Number year, Number month, Number day, Number hour) CisDate createCisDate(String timeZoneId, Number year, Number month, Number day, Number hour, Number minute) CisDate createCisDate(String timeZoneId, Number year, Number month, Number day, Number hour, Number minute, Number second) CisDate createCisDate(String timeZoneId, Number year, Number month, Number day, Number hour, Number minute, Number second, Number millisecond) |
Parametry |
year oznacza rok. month oznacza miesiąc. day to dzień. hour oznacza godzinę. minute oznacza minutę. second to sekunda millisecond oznacza milisekundę. timeZoneId to strefa czasowa CisDate. Wszystkie parametry z wyjątkiem year są opcjonalne. Brakujące cząstki czasu są wypełniane wartością 0. Brakujące cząstki daty są wypełniane wartością 1. Jeśli nie określono strefy czasowej, jest ona pobierana z bieżącego kontekstu uruchomieniowego. |
Wynik |
A CisDate. |
Źródła błędów |
Brak |
Przykłady |
createCisDate(year(today()), 1, 1) zwraca CisDate na początku bieżącego roku. createCisDate(year(today()), 3, -4) zwraca CisDate 5 dni przed rozpoczęciem 3 miesiąca w bieżącym roku. createCisDate(„GMT”, 1980) zwraca CisDate 1980-01-01 GMT. createCisDate(„GMT”, 1980, 0, 0) zwraca CisDate 1979-11-30 GMT. |
Kontekst |
ALL |
Uwagi |
Dostępne identyfikatory stref czasowych można wyświetlić w kolumnie Identyfikacja w aplikacji Strefy czasowe. |
Zobacz także |
createTimestamp |
function create()
{
var p_timezoneId := parameters.TIMEZONE_ID;
var p_year := parameters.YEAR;
var p_month := parameters.MONTH;
var p_day := parameters.DAY;
var p_hour := parameters.HOUR;
var p_minute := parameters.MINUTE;
var p_second := parameters.SECOND;
var p_millisecond := parameters.MILLISECOND;
var r_createCisDate as CisDate;
if (p_timezoneId = „”)
r_createCisDate := createCisDate(p_year, p_month, p_day, p_hour, p_minute, p_second, p_millisecond);
else
r_createCisDate := createCisDate(p_timezoneId, p_year, p_month, p_day, p_hour, p_minute, p_second, p_millisecond);
result.VALUE_CISDATE := dateString(r_createCisDate);
result.VALUE_TIMEZONE_ID := timeZoneId(r_createCisDate);
}
createTimestamp
Nazwa |
createTimestamp |
Opis |
createTimestamp tworzy dowolny czas. |
Podpisy |
Timestamp createTimestamp(Number year) Timestamp createTimestamp(Number year, Number month) Timestamp createTimestamp(Number year, Number month, Number day) Timestamp createTimestamp(Number year, Number month, Number day, Number hour) Timestamp createTimestamp(Number year, Number month, Number day, Number hour, Number minute) Timestamp createTimestamp(Number year, Number month, Number day, Number hour, Number minute, Number second) Timestamp createTimestamp(Number year, Number month, Number day, Number hour, Number minute, Number second, Number millisecond) Timestamp createTimestamp(String timeZoneId, Number year) Timestamp createTimestamp(String timeZoneId, Number year, Number month) Timestamp createTimestamp(String timeZoneId, Number year, Number month, Number day) Timestamp createTimestamp(String timeZoneId, Number year, Number month, Number day, Number hour) Timestamp createTimestamp(String timeZoneId, Number year, Number month, Number day, Number hour, Number minute) Timestamp createTimestamp(String timeZoneId, Number year, Number month, Number day, Number hour, Number minute, Number second) Timestamp createTimestamp(String timeZoneId, Number year, Number month, Number day, Number hour, Number minute, Number second, Number millisecond) |
Parametry |
year oznacza rok. month oznacza miesiąc. day to dzień. hour oznacza godzinę. minute oznacza minutę. second oznacza sekundę millisecond oznacza milisekundę. timeZoneId to strefa czasowa, w której wyświetlane są cząsteczki czasu. Wszystkie parametry z wyjątkiem year są opcjonalne. Brakujące cząstki czasu są wypełniane wartością 0. Brakujące cząstki daty są wypełniane wartością 1 |
Wynik |
Znacznik czasu w strefie czasowej systemu. |
Źródła błędów |
Brak |
Przykłady |
createTimestamp(year(today()), 1, 1) zwraca czas na początku bieżącego roku. createTimestamp(year(today()), 3, -4) zwraca czas 5 dni przed rozpoczęciem 3 miesiąca w bieżącym roku. createTimestamp(„EST”, year(today()), 1, 1) zwraca czas na początku roku w określonej strefie czasowej. W zależności od strefy czasowej kontekstu uruchomieniowego i bieżącej daty, może to być na przykład 2019-12-31 14:00:00.000 w strefie czasowej CES. createTimestamp(1980) zwraca 1980-01-01 00:00:00.000 w strefie czasowej bieżącego kontekstu uruchomieniowego. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
createCisDate |
function create()
{
var p_timezoneId := parameters.TIMEZONE_ID;
var p_year := parameters.YEAR;
var p_month := parameters.MONTH;
var p_day := parameters.DAY;
var p_hour := parameters.HOUR;
var p_minute := parameters.MINUTE;
var p_second := parameters.SECOND;
var p_millisecond := parameters.MILLISECOND;
var r_createTimestamp as Timestamp;
if (p_timezoneId = „”)
r_createTimestamp := createTimestamp(p_year, p_month, p_day, p_hour, p_minute, p_second, p_millisecond);
inny
r_createTimestamp := createTimestamp(p_timezoneId, p_year, p_month, p_day, p_hour, p_minute, p_second, p_millisecond);
result.VALUE_TIMESTAMP := r_createTimestamp;
result.VALUE_TIMEZONE_ID := timeZoneString(r_createTimestamp);
}
day
Nazwa |
day |
Opis |
day zwraca dzień miesiąca jako liczbę dla CisDate lub punktu w czasie. |
Podpisy |
Number day(CisDate date) Number day(Timestamp time) |
Parametry |
date jest CisDate, którego dzień miesiąca jest określony. time to punkt w czasie, którego dzień miesiąca jest określony. |
Wynik |
Dzień miesiąca jako liczba. |
Źródła błędów |
Brak |
Przykłady |
day(createCisDate(1980, 1, 1) zwraca 1. day(today()) zwraca dzisiejszy dzień miesiąca. |
Kontekst |
ALL |
Uwagi |
Poszczególne części CisDate są dostępne ze strefą czasową wskazaną w CisDate. Na przykład day(createCisDate(„EET”, 1980, 1, 1) zwraca liczbę 1 niezależnie od strefy czasowej bieżącego kontekstu uruchomieniowego. Jeśli wygenerowana data CisDate zostanie przekonwertowana na punkt w czasie i zostanie określony jej rok, wynik zależy od strefy czasowej bieżącego kontekstu uruchomieniowego. Na przykład, day(toTimestamp(createCisDate(„EET”, 1980, 1, 1)) zwraca liczbę 31, jeśli bieżący kontekst runtime używa strefy czasowej, która jest na zachód od EET. |
Zobacz także |
hour, millisecond, minute, month, second, year |
function create()
{
var p_today := today();
var p_now := now();
result.VALUE_CISDATE := day(p_today);
result.VALUE_TIMESTAMP := day(p_now);
}
days
Nazwa |
days |
Opis |
days określa długość okresu między dwoma CisDates lub punktami w czasie w dniach. |
Podpisy |
Number days(CisDate from, CisDate to) Number days(Timestamp from, Timestamp to) |
Parametry |
from to pierwsza CisDate lub punkt w czasie. to jest drugą datą CisDate lub punktem w czasie. |
Wynik |
Funkcja zwraca długość okresu między from i to w dniach. Miejsca dziesiętne są obcinane w wyniku funkcji, tj. 1,9 dnia staje się 1 dniem. W przeciwieństwie do funkcji określających długość okresu w jednostkach czasu: godzina, minuta, sekunda i milisekunda, days zwraca wartość różną od 0, gdy tylko from i to przypadają na różne dni, nawet jeśli między nimi nie ma 24 godzin. Na przykład, days(addSeconds(today(), -1), today()) zwraca 1, a hours(addSeconds(today(), -1), today()) zwraca 0. Takie zachowanie wynika ze zmiennej długości miesięcy i przepisów dotyczących czasu letniego, roku przestępnego i sekundy przestępnej. |
Źródła błędów |
Brak |
Przykłady |
days(today(), addDays(today(), 7)) zwraca 7. days(today(), addHours(today(), 20)) zwraca 0. days(today(), addHours(today(), 36) zwraca 1. days(addHours(today(), 36), today()) zwraca -1. days(addHours(today(), -4), today()) zwraca 1. days(now(), addDays(now(), 7)) zwraca 7. days(createCisDate(year(today())), createCisDate(year(today()))) + 1)) > 365 jest prawdą, jeśli bieżący rok jest rokiem przestępnym. |
Kontekst |
ALL |
Uwagi |
Jeśli from i to są typu danych CisDate, są one konwertowane do strefy czasowej GMT+0 do obliczeń. days(createCisDate(„NST”, 1980), createCisDate(„NPT1”, 1980)) zwraca zatem -1, ponieważ strefa czasowa NST znajduje się na zachód, a strefa czasowa NPT1 na wschód od GMT+0. CisDate from przypada zatem na ostatni dzień 1979 roku ze strefy czasowej GMT+0. |
Zobacz także |
hours, milliseconds, minutes, months, seconds, weeks, years |
function create()
{
var p_today := today();
var r_dayOfYear := days(createCisDate(year(p_today)), today()) + 1;
result.VALUE := r_dayOfYear;
}
dateString
Nazwa |
dateString |
Opis |
dateString zwraca część daty CisDate lub punkt w czasie jako ciąg znaków. |
Podpisy |
String dateString(CisDate date) String dateString(Timestamp time) |
Parametry |
date to połączenie godziny i strefy czasowej. time to punkt w czasie z dokładnością do milisekund. |
Wynik |
Część daty date lub time. Jeśli parametrem jest czas, część daty jest zwracana w strefie czasowej bieżącego kontekstu uruchomieniowego. |
Źródła błędów |
Brak |
Przykłady |
dateString(today()) i dateString(now()) zwracają część dzisiejszej daty jako ciąg znaków. dateString(MIN_DATE) zwraca 1000-01-01 jako ciąg znaków zgodnie z formatowaniem w ustawieniach użytkownika. dateString(MAX_DATE) zwraca 9999-12-31 jako ciąg znaków zgodnie z formatowaniem w ustawieniach użytkownika. dateString(createCisDate(„NPT1”, 1980)) zwraca 1980-01-01. dateString(createTimestamp(„NPT1”, 1980)) zwraca 1979-12-31, jeśli strefa czasowa bieżącego kontekstu uruchomieniowego jest na zachód od Katmandu. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
format, timeString, timeZoneString |
function create()
{
result.VALUE1 := dateString(today());
result.VALUE2 := dateString(now());
}
endOfDay
Nazwa |
endOfDay |
Opis |
endOfDay określa ostatni czas na koniec dnia. |
Podpisy |
Timestamp endOfDay(CisDate date) Timestamp endOfDay(Timestamp time) |
Parametry |
date to CisDate, którego ostatni czas jest określany na koniec dnia. time to czas, którego ostatni czas jest określany na koniec dnia. |
Wynik |
Ostatni moment pod koniec dnia |
Źródła błędów |
Brak |
Przykłady |
endOfDay(today()) i endOfDay(now()) zwracają godzinę 23:59:59.999 dnia dzisiejszego. setActivityWorkDelay(seconds(activity:creationTime, endOfDay(today()))) + 1) ustawia czas rozpoczęcia działania na pierwszą sekundę po północy następnego dnia. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
startOfDay |
function create()
{
var p_now := now();
var r_endOfDay := endOfDay(p_now);
result.VALUE := r_endOfDay;
}
hour
Nazwa |
hour |
Opis |
hour zwraca godzinę w ciągu dnia jako liczbę dla CisDate lub punktu w czasie. |
Podpisy |
Number hour(CisDate date) Number hour(Timestamp time) |
Parametry |
date to CisDate, którego godzina jest określona. time to punkt w czasie, którego godzina jest określona. |
Wynik |
Godzina w ciągu dnia jako liczba. |
Źródła błędów |
Brak |
Przykłady |
hour(createCisDate(1980, 1, 1) zwraca 0. hour(createCisDate(1980, 1, 1, 7) zwraca 7. hour(now()) zwraca bieżącą godzinę dnia. |
Kontekst |
ALL |
Uwagi |
Poszczególne części CisDate są dostępne przy użyciu strefy czasowej określonej w CisDate. Na przykład hour(createCisDate(„EET”, 1980, 1, 1, 7) zwraca liczbę 7, niezależnie od strefy czasowej bieżącego kontekstu uruchomieniowego. Jeśli wygenerowana data CisDate zostanie przekonwertowana na czas i zostanie określona jej godzina, wynik zależy od strefy czasowej bieżącego kontekstu uruchomieniowego. Na przykład hour(toTimestamp(createCisDate(„EET”, 1980, 1, 1)) zwraca liczbę 23, jeśli istnieje różnica jednej godziny między EET a strefą czasową bieżącego kontekstu uruchomieniowego. |
Zobacz także |
day, millisecond, minute, month, second, year |
function create()
{
var p_today := today();
var p_now := now();
result.VALUE_CISDATE := hour(p_today);
result.VALUE_TIMESTAMP := hour(p_now);
}
hours
Nazwa |
hours |
Opis |
hours określa długość okresu między dwoma CisDates lub punktami w czasie w godzinach. |
Podpisy |
Number hours(CisDate from, CisDate to) Number hours(Timestamp from, Timestamp to) |
Parametry |
from jest pierwszą datą CisDate lub punktem w czasie. to jest drugą datą CisDate lub punktem w czasie. |
Wynik |
Funkcja zwraca długość okresu między from i to w godzinach. Miejsca dziesiętne są obcinane w wyniku funkcji, tj. 1,9 godziny staje się 1 godziną. |
Źródła błędów |
Brak |
Przykłady |
hours(today(), addHours(today(), 7)) zwraca 7. hours(today(), addMinutes(today(), 20)) zwraca 0. hours(today(), addMinutes(today(), 80) zwraca 1. hours(addMinutes(today(), 80), today()) zwraca -1. hours(addMinutes(today(), -4), today()) zwraca 0. hours(now(), addHours(now(), 7)) zwraca 7. |
Kontekst |
ALL |
Uwagi |
Jeśli from i to są typu danych CisDate, są one konwertowane do strefy czasowej GMT+0 do obliczeń. hours(createCisDate(„NPT1”, 1980), createCisDate(„NST”, 1980)) zwraca zatem 9, ponieważ istnieje różnica czasu wynosząca 9 godzin między strefami czasowymi NPT1 i NST. |
Zobacz także |
days, milliseconds, minutes, months, seconds, weeks, years |
function create()
{
var p_today := today();
var r_hourOfDay := hours(startOfDay(p_today), p_now);
result.VALUE := r_hourOfDay;
}
isMaxDate
Nazwa |
isMaxDate |
Opis |
isMaxDate sprawdza, czy CisDate lub czas ma największą wyświetlaną wartość. |
Podpisy |
Boolean isMaxDate(CisDate date) Boolean isMaxDate(Timestamp time) |
Parametry |
date jest CisDate. time to punkt w czasie. |
Wynik |
Jeśli date lub time ma największą wyświetlaną wartość, wynikiem funkcji jest true. |
Źródła błędów |
Brak |
Przykłady |
isMaxDate(MAX_DATE) zwraca wartość true. isMaxDate(MIN_DATE) zwraca wartość false. |
Kontekst |
ALL |
Uwagi |
Największa wyświetlana wartość CisDate lub czasu (znacznika czasu) może być używana na przykład dla zakresów ważności, które są otwarte u góry. |
Zobacz także |
isMinDate, isUndefinedDate |
function create()
{
var r_isMaxDate := isMaxDate(MAX_DATE);
result.VALUE := r_isMaxDate;
}
isMinDate
Nazwa |
isMinDate |
Opis |
isMinDate sprawdza, czy CisDate lub czas ma najmniejszą reprezentowalną wartość. |
Podpisy |
Boolean isMinDate(CisDate date) Boolean isMinDate(Timestamp time) |
Parametry |
date jest CisDate. time to punkt w czasie. |
Wynik |
Jeśli date lub time ma najmniejszą reprezentowalną wartość, wynikiem funkcji jest true. |
Źródła błędów |
Brak |
Przykłady |
isMinDate(MIN_DATE) zwraca wartość true. isMinDate(MAX_DATE) zwraca wartość false. |
Kontekst |
ALL |
Uwagi |
Najmniejsza wyświetlana wartość CisDate lub czasu (znacznik czasu) może być używana na przykład dla zakresów ważności, które są otwarte na dole. |
Zobacz także |
isMaxDate, isUndefinedDate |
function create()
{
var r_isMinDate := isMinDate(MIN_DATE);
result.VALUE := r_isMinDate;
}
isUndefinedDate
Nazwa |
isUndefinedDate |
Opis |
isUndefinedDate sprawdza, czy CisDate lub czas ma wartość, której nie można wyświetlić. |
Podpisy |
Boolean isUndefinedDate(CisDate date) Boolean isUndefinedDate(Timestamp time) |
Parametry |
date jest CisDate. time to punkt w czasie. |
Wynik |
Jeśli date lub time nie ma reprezentowalnej wartości, wynikiem funkcji jest true. |
Źródła błędów |
Brak |
Przykłady |
isUndefinedDate(UNEDFINED_DATE) zwraca wartość true. isMinDate(MAX_DATE) zwraca wartość false. isMinDate(MIN_DATE) zwraca wartość true. |
Kontekst |
ALL |
Uwagi |
Niezdefiniowana wartość jest używana dla CisDates i czasów przed przypisaniem konkretnej wartości, takiej jak czas ostatniej zmiany obiektu biznesowego (w atrybucie updateInfo.updateTime), który nie został zmieniony od czasu jego utworzenia. |
Zobacz także |
isMaxDate, isMinDate |
function create()
{
var r_isUndefinedDate := isUndefinedDate(UNDEFINED_DATE);
result.VALUE := r_isUndefinedDate;
}
millisecond
Nazwa |
milisecond |
Opis |
millisecond zwraca milisekundę jako liczbę dla CisDate lub punktu w czasie. |
Podpisy |
Number millisecond(CisDate date) Number millisecond(Timestamp time) |
Parametry |
date jest CisDate, którego milisekunda jest określona. time to punkt w czasie, którego milisekunda jest określona. |
Wynik |
Milisekunda jako liczba. |
Źródła błędów |
Brak |
Przykłady |
millisecond(createCisDate(1980, 1, 1) zwraca 0. millisecond(createCisDate(1980, 12, 31, 23, 59, 59, 999) zwraca 999. second(now()) zwraca bieżącą milisekundę. |
Kontekst |
ALL |
Uwagi |
Poszczególne części CisDate są dostępne w strefie czasowej określonej w CisDate. |
Zobacz także |
day, hour, minute, month, second, year |
function create()
{
var p_today := today();
var p_now := now();
result.VALUE_CISDATE := millisecond(p_today);
result.VALUE_TIMESTAMP := millisecond(p_now);
}
milliseconds
Nazwa |
milliseconds |
Opis |
milliseconds określa długość okresu między dwoma CisDates lub punktami w czasie w milisekundach. |
Podpisy |
Number milliseconds(CisDate od, CisDate do) Number milliseconds(Timestamp from, Timestamp to) |
Parametry |
from jest pierwszą datą CisDate lub punktem w czasie. to jest drugą datą CisDate lub punktem w czasie. |
Wynik |
Funkcja zwraca długość okresu między from i to w milisekundach. |
Źródła błędów |
Brak |
Przykłady |
milliseconds(today(), addMilliseconds(today(), 7)) zwraca 7. milliseconds(today(), addSeconds(today(), 7)) zwraca 7000. milliseconds(addMilliseconds(today(), -1), today()) zwraca 1. milliseconds(now(), addMilliseconds(now(), 7)) zwraca 7. |
Kontekst |
ALL |
Uwagi |
Jeśli from i to są typu danych CisDate, są one konwertowane do strefy czasowej GMT+0 na potrzeby obliczeń. |
Zobacz także |
days, hours, minutes, months, seconds, weeks, years |
function create()
{
var p_today := today();
var p_now := now();
var r_millisecondOfDay := milliseconds(startOfDay(p_today), p_now);
result.VALUE := r_millisecondOfDay;
}
minute
Nazwa |
minute |
Opis |
minute zwraca minutę jako liczbę dla CisDate lub punktu w czasie. |
Podpisy |
Number minute(CisDate date) Number minute(Timestamp time) |
Parametry |
date to CisDate, którego minuta jest określona. time to punkt w czasie, którego minuta jest określona. |
Wynik |
Minuta w godzinie jako liczba. |
Źródła błędów |
Brak |
Przykłady |
minute(createCisDate(1980, 1, 1) zwraca 0. minute(createCisDate(1980, 1, 1, 0, 5) zwraca 5. minute(now()) zwraca bieżącą minutę w godzinie. |
Kontekst |
ALL |
Uwagi |
Poszczególne części CisDate są dostępne ze strefą czasową wskazaną w CisDate. Na przykład, minute(createCisDate(„EET”, 1980, 1, 1, 0, 5) zwraca liczbę 5 niezależnie od strefy czasowej bieżącego kontekstu uruchomieniowego. Jeśli wygenerowana data CisDate zostanie przekonwertowana na czas i zostanie określona jej godzina, wynik zależy od strefy czasowej bieżącego kontekstu uruchomieniowego. Na przykład, minute(toTimestamp(createCisDate(„NPT1”, 1980, 1, 1, 12)) zwraca liczbę 15, ponieważ strefa czasowa bieżącego kontekstu uruchomieniowego („CET”) jest 4 godziny i 45 minut po strefie czasowej Katmandu. |
Zobacz także |
day, hour, millisecond, month, second, year |
function create()
{
var p_today := today();
var p_now := now();
result.VALUE_CISDATE := minute(p_today);
result.VALUE_TIMESTAMP := minute(p_now);
}
minutes
Nazwa |
minutes |
Opis |
minutes określa długość okresu między dwoma CisDates lub punktami w czasie w minutach. |
Podpisy |
Number minutes(CisDate from, CisDate to) Number minutes(Timestamp from, Timestamp to) |
Parametry |
from jest pierwszą datą CisDate lub punktem w czasie. to jest drugą datą CisDate lub punktem w czasie. |
Wynik |
Funkcja zwraca długość okresu między from i to w minutach. Miejsca dziesiętne są obcinane w wyniku funkcji, tj. 1,9 minuty staje się 1 minutą. |
Źródła błędów |
Brak |
Przykłady |
minutes(today(), addMinutes(today(), 7)) zwraca 7. minutes(today(), addSeconds(today(), 20)) zwraca 0. minutes(today(), addSeconds(today(), 80) zwraca 1. minutes(addSeconds(today(), 80), today()) zwraca -1. minutes(addSeconds(today(), -1), today()) zwraca 0. minutes(now(), addMinutes(now(), 7)) zwraca 7. |
Kontekst |
ALL |
Uwagi |
Jeśli from i to są typu danych CisDate, są one konwertowane do strefy czasowej GMT+0 do obliczeń. minutes(createCisDate(„NPT1”, 1980), createCisDate(„NST”, 1980)) zwraca zatem 555, ponieważ istnieje różnica czasu 555 minut między strefami czasowymi NPT1 i NST. |
Zobacz także |
days, hours, milliseconds, months, seconds, weeks, years |
function create()
{
var p_today := today();
var p_now := now();
var r_minuteOfDay := minutes(startOfDay(p_today), p_now);
result.VALUE := r_minuteOfDay;
}
month
Nazwa |
month |
Opis |
month zwraca miesiąc w roku jako liczbę dla CisDate lub punktu w czasie. |
Podpisy |
Number month(CisDate date) Number month(Timestamp time) |
Parametry |
date to CisDate, którego miesiąc jest określony w roku. time to punkt w czasie, którego miesiąc w roku jest określony. |
Wynik |
Miesiąc w roku jako liczba. |
Źródła błędów |
Brak |
Przykłady |
month(createCisDate(1980, 1, 10) zwraca 1. month(today()) zwraca dzisiejszy miesiąc w roku. |
Kontekst |
ALL |
Uwagi |
Poszczególne części CisDate są dostępne ze strefą czasową wskazaną w CisDate. Na przykład, month(createCisDate(„EET”, 1980, 1, 10) zwraca liczbę 1, niezależnie od strefy czasowej bieżącego kontekstu uruchomieniowego. Jeśli wygenerowana data CisDate zostanie przekonwertowana na punkt w czasie i zostanie określony jej rok, wynik zależy od strefy czasowej bieżącego kontekstu uruchomieniowego. Na przykład, month(toTimestamp(createCisDate(„EET”, 1980, 1, 1)) zwraca liczbę 12, jeśli bieżący kontekst runtime używa strefy czasowej, która jest na zachód od EET. |
Zobacz także |
day, hour, millisecond, minute, second, year |
function create()
{
var p_today := today();
var p_now := now();
result.VALUE_CISDATE := month(p_today);
result.VALUE_TIMESTAMP := month(p_now);
}
months
Nazwa |
months |
Opis |
months określa długość okresu między dwiema datami CisDate lub punktami w czasie w miesiącach. |
Podpisy |
Number months(CisDate od, CisDate do) Number months(Timestamp from, Timestamp to) |
Parametry |
from to pierwsza CisDate lub punkt w czasie. to jest drugą datą CisDate lub punktem w czasie. |
Wynik |
Funkcja zwraca długość okresu między from i to w miesiącach. Miejsca dziesiętne są obcinane w wyniku funkcji, tj. 1,9 miesiąca staje się 1 miesiącem. W przeciwieństwie do funkcji określających długość okresu czasu w jednostkach czasu godzina, minuta, sekunda i milisekunda, months zwraca wartość różną od 0, gdy tylko from i to przypadają na różne miesiące. Na przykład, months(addSeconds(createTimestamp(1980), -1), createTimestamp(1980)) zwraca 1, a hours(addSeconds(createTimestamp(1980), -1), createTimestamp(1980)) zwraca 0. Takie zachowanie wynika ze zmiennej długości miesięcy i przepisów dotyczących czasu letniego, roku przestępnego i sekundy przestępnej. |
Źródła błędów |
Brak |
Przykłady |
months(today(), addDays(today(), 20)) zwraca 0, jeśli do następnej zmiany miesiąca pozostało więcej niż 20 dni. months(addDays(today(), -20), today()) zwraca 0, jeśli od początku miesiąca nie minęło jeszcze 20 dni. |
Kontekst |
ALL |
Uwagi |
Jeśli from i to są typu danych CisDate, są one konwertowane do strefy czasowej GMT+0 do obliczeń. months(createCisDate(„NST”, 1980), createCisDate(„NPT1”, 1980)) zwraca zatem -1, ponieważ strefa czasowa NST znajduje się na zachód, a strefa czasowa NPT1 na wschód od GMT+0. Oznacza to, że CisDate from przypada na ostatni dzień 1979 roku, patrząc ze strefy czasowej GMT+0. |
Zobacz także |
days, hours, milliseconds, minutes, seconds, weeks, years |
function create()
{
var p_today := today();
var r_monthOfYear := months(createCisDate(year(p_today)), createCisDate(year(p_today), month(p_today))) + 1;
result.VALUE := r_monthOfYear;
}
now
Nazwa |
now |
Opis |
now zwraca bieżący czas. |
Podpisy |
Timestamp now() |
Parametry |
Brak |
Wynik |
Bieżący czas, tj. bieżąca data z dokładnością do milisekund. |
Źródła błędów |
Brak |
Przykłady |
now() zwraca aktualny czas systemu. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
today |
function create()
{
result.VALUE := now();
}
second
Nazwa |
second |
Opis |
second zwraca sekundę jako liczbę dla CisDate lub punktu w czasie. |
Podpisy |
Number second(CisDate date) Number second(Timestamp time) |
Parametry |
date to CisDate, którego druga wartość jest określona. time to punkt w czasie, którego druga część jest określona. |
Wynik |
Sekunda w minucie jako liczba. |
Źródła błędów |
Brak |
Przykłady |
second(createCisDate(1980, 1, 1) zwraca 0. second(createCisDate(1980, 1, 1, 0, 0, 5) zwraca 5. second(now()) zwraca bieżącą sekundę w minucie. |
Kontekst |
ALL |
Uwagi |
Poszczególne części CisDate są dostępne w strefie czasowej określonej w CisDate. |
Zobacz także |
day, hour, millisecond, minute, month, year |
function create()
{
var p_today := today();
var p_now := now();
result.VALUE_CISDATE := second(p_today);
result.VALUE_TIMESTAMP := second(p_now);
}
seconds
Nazwa |
seconds |
Opis |
seconds określa długość okresu między dwoma CisDates lub punktami w czasie w sekundach. |
Podpisy |
Number seconds(CisDate from, CisDate to) Number seconds(Timestamp from, Timestamp to) |
Parametry |
from to pierwsza CisDate lub punkt w czasie. to jest drugą datą CisDate lub punktem w czasie. |
Wynik |
Funkcja zwraca długość okresu między from i to w sekundach. Miejsca dziesiętne są obcinane w wyniku funkcji, tj. 1,9 sekundy staje się 1 sekundą. |
Źródła błędów |
Brak |
Przykłady |
seconds(today(), addSeconds(today(), 7)) zwraca 7. seconds(today(), addMilliseconds(today(), 800)) zwraca 0. seconds(today(), addMilliseconds(today(), 1000) zwraca 1. seconds(addMilliseconds(today(), -1000), today()) zwraca -1. seconds(addMilliseconds(today(), -1), today()) zwraca 0. seconds(now(), addSeconds(now(), 7)) zwraca 7. |
Kontekst |
ALL |
Uwagi |
Jeśli from i to są typu danych CisDate, są one konwertowane do strefy czasowej GMT+0 na potrzeby obliczeń. |
Zobacz także |
days, hours, milliseconds, minutes, months, weeks, years |
function create()
{
var p_today := today();
var p_now := now();
var r_secondOfDay := seconds(startOfDay(p_today), p_now);
result.VALUE := r_secondOfDay;
}
startOfDay
Nazwa |
startOfDay |
Opis |
startOfDay określa pierwszy raz na początku dnia. |
Podpisy |
Timestamp startOfDay(CisDate date) Timestamp startOfDay(Timestamp time) |
Parametry |
date to CisDate, której pierwsza godzina jest określana na początku dnia. time to czas, którego pierwsza godzina jest określana na początku dnia. |
Wynik |
Pierwszy raz na początku dnia |
Źródła błędów |
|
Przykłady |
startOfDay(today()) i startOfDay(now()) zwracają czas o godzinie 00:00:00.000 dnia dzisiejszego. setActivityWorkDelay(seconds(activity:creationTime, endOfDay(today()))) ustawia czas rozpoczęcia działania na ostatnią sekundę przed północą bieżącego dnia. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
endOfDay |
function create()
{
var p_now := now();
var r_startOfDay := startOfDay(p_now);
result.VALUE := r_startOfDay;
}
timeString
Nazwa |
timeString |
Opis |
timeString zwraca część czasową CisDate lub punkt w czasie jako ciąg znaków. |
Podpisy |
String timeString(CisDate date) String timeString(Timestamp time) |
Parametry |
date to CisDate, czyli połączenie punktu w czasie ze strefą czasową. time to punkt w czasie z dokładnością do milisekund. |
Wynik |
Część czasowa date lub time. |
Źródła błędów |
Brak |
Przykłady |
timeString(today()) zwraca część czasu na początku dnia dzisiejszego jako ciąg znaków. timeString(now()) zwraca część czasu bieżącego punktu w czasie jako ciąg znaków. timeString(createCisDate(„NPT1”, 1980)) zwraca 00:00. timeString(createTimestamp(„NPT1”, 1980)) zwraca 21:15:00, jeśli różnica między strefą czasową bieżącego kontekstu uruchomieniowego a strefą czasową Katmandu wynosi 2:45 godziny. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
dateString, format, timeZoneId, timeZoneString |
function create()
{
result.VALUE1 := timeString(today());
result.VALUE2 := timeString(now());
}
timeZoneId
Nazwa |
timeZoneId |
Opis |
timeZoneId zwraca identyfikator strefy czasowej CisDate lub punktu w czasie. |
Podpisy |
String timeZoneId(CisDate date) String timeZoneId(Timestamp time) |
Parametry |
date to CisDate, którego strefa czasowa jest określona. |
Wynik |
Identyfikacja strefy czasowej date. |
Źródła błędów |
Brak |
Przykłady |
timeZoneId(today()) zwraca identyfikator strefy czasowej bieżącego kontekstu uruchomieniowego. timeZoneId(createCisDate(„NPT1”, 1980)) zwraca NPT1. timeZoneId(createTimestamp(„NPT1”, 1980)) zwraca identyfikator strefy czasowej bieżącego kontekstu uruchomieniowego. |
Kontekst |
ALL |
Uwagi |
Dostępne identyfikatory stref czasowych można wyświetlić w kolumnie Identyfikacja w aplikacji Strefy czasowe. |
Zobacz także |
dateString, timeString, timeZoneString |
function create()
{
var p_today := today();
var r_timeZoneId := timeZoneId(p_today);
result.VALUE := r_timeZoneId;
}
timeZoneString
Nazwa |
timeZoneString |
Opis |
timeZoneString zwraca skrót strefy czasowej CisDate lub punktu w czasie. |
Podpisy |
String timeZoneString(CisDate date) String timeZoneString(Timestamp time) |
Parametry |
date to CisDate, którego strefa czasowa jest określona. time to punkt w czasie, którego strefa czasowa jest określona. |
Wynik |
Skrót strefy czasowej od date lub time. |
Źródła błędów |
Brak |
Przykłady |
timeZoneString(today()) zwraca skrót strefy czasowej bieżącego kontekstu uruchomieniowego. timeZoneString(createCisDate(„NPT1”, 1980)) zwraca NPT. timeZoneString(createTimestamp(„NPT1”, 1980)) zwraca skrót strefy czasowej bieżącego kontekstu uruchomieniowego. |
Kontekst |
ALL |
Uwagi |
Dostępne identyfikatory stref czasowych można wyświetlić w kolumnie Identyfikacja w aplikacji Strefy czasowe. |
Zobacz także |
dateString, timeString, timeZoneId |
function create()
{
result.VALUE1 := timeZoneString(today());
result.VALUE2 := timeZoneString(now());
}
today
Nazwa |
today |
Opis |
today zwraca bieżącą datę jako CisDate bez składnika czasu. |
Podpisy |
Timestamp today() Timestamp (String timeZoneId) |
Parametry |
timeZoneId jest identyfikatorem strefy czasowej. |
Wynik |
Funkcja zwraca bieżącą datę systemu jako CisDate, tj. dokładny czas milisekundowy ze strefą czasową. Jeśli określono identyfikację strefy czasowej, data jest generowana i wyprowadzana zgodnie z określoną strefą czasową. Jeśli nie podano identyfikacji strefy czasowej, strefa czasowa jest pobierana z bieżącego kontekstu wykonawczego. |
Źródła błędów |
Brak |
Przykłady |
today() zwraca bieżącą datę systemu. |
Kontekst |
ALL |
Uwagi |
Dostępne identyfikatory stref czasowych można wyświetlić w kolumnie Identyfikacja w aplikacji Strefy czasowe. |
Zobacz także |
now |
function create()
{
var p_timeZoneId := parameters.TIMEZONE_ID;
var r_today as CisDate;
if (p_timeZoneId = „”)
r_today := today();
else
r_today := today(p_timeZoneId);
result.IS_NULL := isNull(r_today);
result.VALUE := dateString(r_today) + ” ” + timeString(r_today);
}
toTimestamp
Nazwa |
toTimestamp |
Opis |
toTimestamp konwertuje CisDate na czas. |
Podpisy |
Timestamp toTimestamp(CisDate date) |
Parametry |
date to CisDate, która ma zostać przekonwertowana na czas. |
Wynik |
Parametr date jako godzina |
Źródła błędów |
Brak |
Przykłady |
toTimestamp(today) zwraca pierwszą godzinę bieżącego dnia. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
cast, createTimestamp |
function create()
{
var p_today := today();
var r_toTimestamp := toTimestamp(p_today);
result.VALUE := toCisDate(„”, r_toTimestamp);
}
weeks
Nazwa |
weeks |
Opis |
weeks określa długość okresu między dwiema datami CisDate lub punktami w czasie w tygodniach kalendarzowych. |
Podpisy |
Number weeks(CisDate od, CisDate do) Number weeks(Timestamp from, Timestamp to) |
Parametry |
from to pierwsza CisDate lub punkt w czasie. to jest drugą datą CisDate lub punktem w czasie. |
Wynik |
Funkcja zwraca długość okresu między from i to w tygodniach kalendarzowych. Miejsca dziesiętne są obcinane w wyniku funkcji, tj. 1,9 tygodnia staje się 1 tygodniem. W przeciwieństwie do funkcji określających długość okresu w jednostkach czasu: godzina, minuta, sekunda i milisekunda, weeks zwraca wartość inną niż 0, gdy tylko from i to przypadają na różne tygodnie. Na przykład funkcja weeks(addDays(createCisDate(2020), -1), createCisDate(2020)) zwraca 0, ponieważ 31 grudnia 2019 r. i 1 stycznia 2020 r. należą do tygodnia kalendarzowego 1 w 2020 r. Z drugiej strony funkcja weeks(addDays(createCisDate(2018), -1), createCisDate(2020)) zwraca 1, ponieważ 31 grudnia 2017 r. należy do tygodnia kalendarzowego 52 w 2017 r., a 1 stycznia 2018 r. należy do tygodnia kalendarzowego 1 w 2018 r. |
Źródła błędów |
Brak |
Przykłady |
weeks(createCisDate(year(today()))), today()) + 1 zwraca bieżący tydzień kalendarzowy. weeks(today(), addDays(today(), 2)) zwraca 0, jeśli bieżący tydzień kalendarzowy nadal ma co najmniej 2 dni. |
Kontekst |
ALL |
Uwagi |
Jeśli from i to są typu danych CisDate, są one konwertowane do strefy czasowej GMT+0 na potrzeby obliczeń. Uwaga Jeśli from i to jest datą w ostatnim lub pierwszym tygodniu kalendarzowym roku, funkcja weeks może zwrócić nieprawidłowy wynik, jeśli ostatni dzień roku należy do tygodnia kalendarzowego 1 następnego roku lub pierwszy dzień roku należy do ostatniego tygodnia kalendarzowego poprzedniego roku. |
Zobacz także |
days, hours, milliseconds, minutes, months, seconds, years |
function create()
{
var p_today := today();
var r_weekOfYear := weeks(createCisDate(year(p_today)), p_today) + 1;
result.VALUE := r_weekOfYear;
}
year
Nazwa |
year |
Opis |
year zwraca rok CisDate lub punkt w czasie jako liczbę. |
Podpisy |
Number year(CisDate date) Number year(Timestamp time) |
Parametry |
date to CisDate, którego rok jest określony. time to punkt w czasie, którego rok jest określony. |
Wynik |
Rok jako liczba. |
Źródła błędów |
Brak |
Przykłady |
year(createCisDate(1980, 1, 1) zwraca 1980. year(today()) zwraca bieżący rok. |
Kontekst |
ALL |
Uwagi |
Poszczególne części CisDate są dostępne ze strefą czasową wskazaną w CisDate. Na przykład year(createCisDate(„EET”, 1980, 1, 1) zwraca liczbę 1980, niezależnie od strefy czasowej bieżącego kontekstu uruchomieniowego. Jeśli wygenerowana data CisDate zostanie przekonwertowana na punkt w czasie i zostanie określony jej rok, wynik zależy od strefy czasowej bieżącego kontekstu uruchomieniowego. Na przykład, year(toTimestamp(createCisDate(„EET”, 1980, 1, 1)) zwraca liczbę 1979, jeśli bieżący kontekst runtime używa strefy czasowej, która jest na zachód od EET. |
Zobacz także |
day, hour, millisecond, minute, month, second |
function create()
{
var p_today := today();
var p_now := now();
result.VALUE_CISDATE := year(p_today);
result.VALUE_TIMESTAMP := year(p_now);
}
years
Nazwa |
years |
Opis |
years określa długość okresu między dwoma CisDates lub punktami w czasie w latach. |
Podpisy |
Number years(CisDate od, CisDate do) Number years(Timestamp from, Timestamp to) |
Parametry |
from jest pierwszą datą CisDate lub punktem w czasie. to jest drugą datą CisDate lub punktem w czasie. |
Wynik |
Funkcja zwraca długość okresu między from i to w latach. Miejsca dziesiętne są obcinane w wyniku funkcji, tj. 1,9 roku staje się 1 rokiem. W przeciwieństwie do funkcji określających długość okresu w jednostkach czasu: godzina, minuta, sekunda i milisekunda, funkcja years zwraca wartość inną niż 0, gdy tylko from i to przypadają na różne lata. Tak więc, years(addSeconds(createTimestamp(1980), -1), createTimestamp(1980)) zwraca 1, a hours(addSeconds(createTimestamp(1980), -1), createTimestamp(1980)) zwraca 0. Takie zachowanie wynika ze zmiennej długości miesięcy i przepisów dotyczących czasu letniego, roku przestępnego i sekundy przestępnej. |
Źródła błędów |
Brak |
Przykłady |
years(today(), addDays(today(), 100)) zwraca 0, jeśli do następnego przełomu roku pozostało więcej niż sto dni. years(addDays(today(), -100), today()) zwraca 0, jeśli od początku roku nie minęło jeszcze sto dni. |
Kontekst |
ALL |
Uwagi |
Jeśli from i to są typu danych CisDate, są one konwertowane do strefy czasowej GMT+0 do obliczeń. years(createCisDate(„NST”, 1980), createCisDate(„NPT1”, 1980)) zwraca zatem -1, ponieważ strefa czasowa NST znajduje się na zachód, a strefa czasowa NPT1 na wschód od GMT+0. CisDate from przypada zatem na ostatni dzień 1979 roku, patrząc ze strefy czasowej GMT+0. |
Zobacz także |
days, hours, milliseconds, minutes, months, seconds, weeks |
function create()
{
var p_dateOfBirth := parameters.DATE_OF_BIRTH;
var p_now := now();
result.VALUE := years(p_dateOfBirth, p_now);
}
Funkcje dla list (List functions)
Listy można tworzyć i edytować za pomocą funkcji list. Funkcje dla list obejmują:
- add
- addAll
- contains
- intersection
- isEmpty
- list
- minus
- size
- toCharList
- union
add
Nazwa |
add |
Opis |
add dodaje kolejny element do listy. |
Podpisy |
add(Unknown[] list, Unknown element) |
Parametry |
list jest listą. element to element, który ma zostać dodany do listy list. |
Wynik |
Element element jest dodawany do listy list jako ostatni element. Typ danych elementu element zostaje zachowany. |
Źródła błędów |
Element element może zostać dodany do listy list tylko wtedy, gdy typ danych elementu jest zgodny z typem danych elementu listy lub może zostać do niego przekonwertowany. Na przykład, jeśli lista list1 ma typ danych Number[], wówczas wyrażenie add(list1, „1”) prowadzi do błędu składniowego, ponieważ ciąg znaków nie może zostać przekonwertowany na liczbę. Jeśli natomiast list1 jest zadeklarowana jako String[], wówczas wyrażenie add(list1, 1) jest poprawne składniowo, ponieważ liczba może zostać przekonwertowana na ciąg znaków. |
Przykłady |
add(list1, 3) dodaje element 3 do listy list1. add(list1, now()) dodaje bieżący czas do listy list1 jako nowy element. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
addAll, list, union |
function create()
{
var p_text := trim(parameters.TEXT);
var p_text := trim(parameters.TEXT);
var r_wordList as String[];
var word as String;
var startPos := 0;
var i := 0;
while (i < length(p_text)) {
if (substring(p_text, i, i + 1) = ” „) {
word := trim(substring(p_text, startPos, i));
startPos := i;
if (word <> „”)
add(r_wordList, word);
}
i := i + 1;
}
word := trim(substring(p_text, startPos));
if (word <> „”)
add(r_wordList, word);
result.VALUE := r_wordList;
}
Jeśli lista ma typ danych Unknown[], można dodać elementy dowolnego typu danych, ponieważ wszystkie typy danych można przekonwertować na Unknown. Można zatem użyć funkcji add, na przykład, aby utworzyć listę parametrów dla funkcji getCisObjectList, jeśli zapytanie OQL ma parametry różnych typów danych, które nie mogą być automatycznie konwertowane na typ danych pierwszego parametru.
Poniższy przykład wykorzystuje listę parametrów typu danych Unknown[] do określenia pierwszych 100 osób wewnętrznych za pomocą funkcji getCisObjectList i wypisania ich na konsoli:
const PartnerType as valueSet(com.cisag.app.general.PartnerType);
const BlockSize := 100;
function create()
{
var partnerList as CisObject(com.cisag.app.general.obj.Partner)[];
var params as Unknown[];
var OQL :=
„SELECT FROM com.cisag.app.general.obj.Partner p ” +
„WHERE p:type = ? AND p:human = ? ” +
„ORDER BY p:number”;
add(params, PartnerType.INTERNAL);
add(params, true);
var cisObjectList := getCisObjectList(OQL, params, BlockSize);
for (p as CisObject(com.cisag.app.general.obj.Partner) : cisObjectList)
echo(p:number);
}
addAll
Nazwa |
addAll |
Opis |
addAll dodaje wszystkie elementy innej listy do listy. |
Podpisy |
addAll(Unknown[] list, Unknown[] listToAdd) |
Parametry |
list to lista, do której mają zostać dodane elementy innej listy. listToAdd jest listą, której elementy mają zostać dodane do listy list. |
Wynik |
Lista list jest rozszerzana o wszystkie elementy listy listToAdd. Typy danych elementów na liście listToAdd zostają zachowane. |
Źródła błędów |
Element listy listToAdd może zostać dodany tylko wtedy, gdy typ danych elementu jest zgodny z typem danych elementu listy list lub może zostać do niego przekonwertowany. Na przykład, jeśli list ma typ danych Number[], a element listy listToAdd ma typ danych elementu String, wówczas element list nie może zostać dodany, ponieważ ciąg znaków nie może zostać przekonwertowany na liczbę. Jeśli jednak list ma typ danych String[], a element listy listToAdd ma typ danych Number, wówczas element list może zostać dodany, ponieważ liczba może zostać przekonwertowana na ciąg znaków. |
Przykłady |
addAll(list1, list2) dodaje wszystkie elementy listy list2 do listy list1. Typy danych elementów są zachowywane. addAll(list1, list(now())) dodaje bieżący czas do listy list1 jako nowy element typu danych elementu Timestamp. addAll(list1, minus(list2, list1)) dodaje do listy list1 wszystkie elementy listy list2, które nie znajdują się jeszcze na liście list1. |
Kontekst |
ALL |
Uwagi |
Funkcja union(list1, list2) zwraca połączenie list list1 i list2. Należy użyć funkcji union, aby wykluczyć zduplikowane wartości. |
Zobacz także |
add, list, union |
function create()
{
var p_list1 as Unknown[];
var p_list2 as Unknown[];
add(p_list1, „carpe”);
add(p_list1, „diem”);
add(p_list2, now());
addAll(p_list1, p_list2);
result.VALUE := p_list1;
}
contains
Nazwa |
contains |
Opis |
contains sprawdza, czy lista zawiera określony element. |
Podpisy |
Boolean contains(Unknown[] list, Unknown element) |
Parametry |
list jest listą. element jest elementem. |
Wynik |
Jeśli lista list zawiera element element, zwracana jest wartość prawdy true, w przeciwnym razie false. |
Źródła błędów |
Brak. |
Przykłady |
contains(list(1, 2, 3), 1) zwraca wartość true. contains(list(1, 2, 3), 4) zwraca false. contains(list(1, 2, 3), „1”) zwraca false. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
intersection |
function create()
{
var p_text := parameters.TEXT;
var p_element := parameters.ELEMENT;
var p_list := new(String[], length(p_text));
var i := 0;
while (i < size(p_list)) {
p_list[i] := substring(p_text, i, i + 1);
i := i + 1;
}
result.VALUE_LIST := p_list;
result.VALUE := contains(p_list, p_element);
}
intersection
Nazwa |
intersection |
Opis |
intersection zwraca przecięcie dwóch lub więcej list. |
Podpisy |
Unknown[] intersection(Unknown[] list1, Unknown[] list2) Unknown[] intersection(Unknown[] list1, Unknown[] list2,…,Unknown[] listN) |
Parametry |
list1 to pierwsza lista. list2 to druga lista. listN jest ostatnią listą. |
Wynik |
Przecięcie przeniesionych list jako lista o tym samym typie danych co list1. Przecięcie składa się z elementów, które są zawarte we wszystkich przeniesionych listach list1, list2,…, listN i mają ten sam typ danych elementu. |
Źródła błędów |
Aby móc utworzyć zestaw różnic, typy danych elementów list list2, list3,…, listN muszą być w stanie zostać przekonwertowane na typ danych elementu listy list1. Jeśli na przykład list1 jest zadeklarowana jako Number[], a list2 jako String[], to intersection(list1, list2) spowoduje błąd składni, ale intersection(list2, list1) nie. |
Przykłady |
intersection(list(1, 2, 3), list(1, 2), list(2, 3)) zwraca listę typu danych Number[] z przecięciem 2 z elementem typu danych Number. intersection(list(1), list(2)) zwraca pustą listę danych typu Number[]. intersection(list(„1”), list(1)) zwraca pustą listę danych typu String[]. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
contains, minus, union |
function create()
{
var p_text1 := parameters.TEXT1;
var p_text2 := parameters.TEXT2;
var p_list1 := new(String[], length(p_text1));
var p_list2 := new(String[], length(p_text2));
var i := 0;
while (i < size(p_list1)) {
p_list1[i] := substring(p_text1, i, i + 1);
i := i + 1;
}
i := 0;
while (i < size(p_list2)) {
p_list2[i] := substring(p_text2, i, i + 1);
i := i + 1;
}
result.VALUE := intersection(p_list1, p_list2);
}
Można użyć funkcji union, intersection i minus, aby określić operatorów działania workflow w kontekście, jak pokazano w poniższym przykładzie.
Operatorzy działania workflow dla zatwierdzania zamówienia należy określić za pomocą roli workflow PO_APPROVERS. W tym celu należy najpierw wybrać operatora Wyrażenie w definicji działania. Następnie nalezy wprowadzić pracowników w polu Wyrażenie dla operatora i zadeklarować zmienną globalną workers poza funkcjami.
var workers as Guid[];
W ramach funkcji tworzenia przypisuje się pracownikom identyfikatory użytkownika właściciela roli workflow.
function create()
{
/* zatwierdzający zlecenia zakupu */
workers := resolveRole(„PO_APPROVERS”);
}
Jeśli kwota brutto zamówienia przekracza 10 000,00 EUR (w pierwszej walucie wewnętrznej), odpowiedzialny pracownik odbiorcy faktury powinien również zatwierdzić zamówienie.
W tym celu w funkcji create należy użyć funkcji union. Aby zapobiec zwracaniu przez funkcję union wartości zero, jeśli dla odbiorcy faktury nie jest zapisany żaden odpowiedzialny pracownik, należy sprawdzić wynik funkcji loadResponsibleOfPartner za pomocą funkcji isNull.
/* dodatkowa osoba zatwierdzająca duże zamówienia */
if (parameters.object:totalValues.grossValueDomestic.amount1 > 10000) {
var responsibleOfPartner := loadResponsibleOfPartner(parameters.object->InvoiceRecipientData:partner);
if (not isNull(responsibleOfPartner))
workers := union(workers, resolvePartner(responsibleOfPartner:guid));
}
Jeśli wnioskodawca nie jest upoważniony do zatwierdzania własnego zamówienia, należy wykluczyć wyzwalacz zdarzenia i pracownika odpowiedzialnego za zamówienie z zestawu procesorów za pomocą funkcji minus.
/* usunięcie żądającego */
workers := minus(workers, list(parameters.userGuid));
if (not isNull(parameters.object:responsible))
workers := minus(workers, resolvePartner(parameters.object:responsible), list(parameters.userGuid));
Aby wykluczyć pracowników, którzy są aktualnie nieobecni jako redaktorzy, należy użyć funkcji minus.
/* usunięcie nieobecnych pracowników */
var absentees as Guid[];
for (u as Guid : workers)
if (userAbsent(u))
add(absentees, u);
workers := minus(workers, absentees);
Jeśli zestaw operatorów jest pusty, przełożony osoby, która wyzwoliła zdarzenie, powinien zatwierdzić zamówienie. Jeśli użytkownik korzysta z zadań, można użyć funkcji przełożonego, aby określić przełożonego.
/* domyślnie użyj przełożonego użytkownika, który wywołał zdarzenie */
if (isEmpty(workers))
workers := superior(parameters.userGuid);
Gotowy przykład wygląda następująco:
var workers as Guid[];
function create()
{
/* zatwierdzający zlecenia zakupu */
workers := resolveRole(„PO_APPROVERS”);
/* dodatkowa osoba zatwierdzająca duże zamówienia */
if (parameters.object:totalValues.grossValueDomestic.amount1 > 10000) {
var responsibleOfPartner := loadResponsibleOfPartner(parameters.object->InvoiceRecipientData:partner);
if (not isNull(responsibleOfPartner))
workers := union(workers, resolvePartner(responsibleOfPartner:guid));
}
/* usunięcie żądającego */
workers := minus(workers, list(parameters.userGuid));
if (not isNull(parameters.object:responsible))
workers := minus(workers, resolvePartner(parameters.object:responsible), list(parameters.userGuid));
/* usuwanie nieobecnych pracowników */
var absentees as Guid[];
for (u as Guid : workers)
if (userAbsent(u))
add(absentees, u);
workers := minus(workers, absentees);
..
/* domyślnie użyj przełożonego użytkownika, który wywołał zdarzenie */
if (isEmpty(workers))
workers := superior(parameters.userGuid);
}
Jeśli zestaw operatorów jest pusty i nie zdefiniowano relacji nadrzędnej dla wyzwalacza w aplikacji Stanowiska właściciele roli workflow OLTP dla administratorów zapisanej w funkcji konfiguracyjnej Workflow Management są używani jako operatorzy. Jeśli w funkcji konfiguracji nie zdefiniowano roli workflow lub nie ma ona prawidłowego właściciela, jako operator używany jest administrator.
isEmpty
Nazwa |
isEmpty |
Opis |
isEmpty określa, czy lista jest pusta. |
Podpisy |
Boolean isEmpty(unknown[] list) |
Parametry |
list to lista, która ma zostać sprawdzona. |
Wynik |
Funkcja zwraca wartość true, jeśli list jest pusta. Jeśli list zawiera co najmniej jeden element, zwracana jest wartość false. |
Źródła błędów |
Brak |
Przykłady |
isEmpty(list()) zwraca wartość true. isEmpty(list(3)) zwraca wartość false. isEmpty(new(String[3])) zwraca wartość false. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
size |
function create()
{
var p_element := parameters.ELEMENT;
var r_isEmpty as Boolean;
var elementList as String[];
if (p_element <> „”)
add(elementList, p_element);
result.VALUE := isEmpty(elementList);
result.VALUE_LIST := elementList;
}
list
Nazwa |
list |
Opis |
list tworzy nową listę z określonymi elementami. |
Podpisy |
List list(Unknown e1, Unknown e2,…,Unknown eN) |
Parametry |
e1, e2,…, eN to elementy listy, która ma zostać wygenerowana. Wszystkie parametry są opcjonalne. |
Wynik |
Funkcja list tworzy nową, wypełnioną listę z elementami e1, e2,…, eN. Typ danych pierwszego elementu e1 określa typ danych listy. Jeśli nie podano żadnego parametru, funkcja zwraca pustą listę typu danych Unknown[]. Jeśli użytkownik użyje list do przypisania wartości do istniejącej listy, typ danych listy jest już ustalony i nie można go zmienić. W takim przypadku można przypisać tylko elementy, których typy danych elementów można przekonwertować na typ danych listy. Elementy przyjmują wówczas typ danych elementu listy. Jeśli użytkownik chce utworzyć listę z elementami o różnych typach danych elementów (np. jako listę parametrów dla aplikacji działającej w tle), musi wybrać pierwszy element, aby pozostałe elementy mogły zostać przekonwertowane na jego typ danych elementu. Na przykład liczby mogą być konwertowane na ciągi znaków, ale nie odwrotnie. Jeśli nie jest to możliwe, można zadeklarować listę jako Unknown[] i przypisać do niej elementy za pomocą funkcji add. |
Źródła błędów |
Jeśli elementy e2, e3,…, eN nie mają tego samego typu danych elementu co e1 i nie mogą zostać przekonwertowane na typ danych elementu e1, wówczas funkcja powoduje błąd składni. |
Przykłady |
list() zwraca pustą listę danych typu Unknown[]. list(1, 2, 3) zwraca listę typu danych Number[] z 3 elementami typu danych Number. list(„now”, now()) zwraca listę danych typu String[] z 2 elementami typu String lub Timestamp. list(1, 2, „three”) i list(1, 2, list(3)) powodują błąd składni, ponieważ typ danych String lub Number[] nie może zostać przekonwertowany na typ danych Number. list(null, now(), 1, „two”, 3) tworzy listę typu danych Unknown[] z 5 elementami o różnych typach danych elementów. Typ danych elementu pierwszego elementu null to Unknown. |
Kontekst |
ALL |
Uwagi |
Podczas korzystania z elementów listy, najpierw przyjmują one typ danych listy. Jeśli lista zawiera elementy o różnych typach danych, może być konieczne rzutowanie elementów za pomocą funkcji cast przed ich użyciem. Przykład var list1 as Unknown[];
list1 := list(null, now(), 1, „two”, 3); result.VALUE := cast(Number, list1[2]) + cast(Number, list1[4]); /* -> 4 */ |
Zobacz także |
add, addAll |
function create()
{
var p_element1 := parameters.ELEMENT1;
var p_element2 := parameters.ELEMENT2;
var r_list as String[];
r_list := list(p_element1, p_element2);
result.VALUE := r_list;
}
minus
Nazwa |
minus |
Opis |
minus zwraca różnicę między dwiema lub więcej listami. |
Podpisy |
Unknown[] minus(Unknown[] list1, Unknown[] list2) Unknown[] minus(Unknown[] list1, Unknown[] list2,…,Unknown[] listN) |
Parametry |
list1 to pierwsza lista. list2 to druga lista. listN jest ostatnią listą. |
Wynik |
Zbiór różnic przeniesionych list jako lista o tym samym typie danych co list1. Zbiór różnic składa się ze wszystkich elementów listy list1, które nie są zawarte w żadnej z list list2, list3,…, listN o tym samym typie danych elementu. |
Źródła błędów |
Aby utworzyć zestaw różnic, typy danych elementów list list2, list3,…, listN muszą być w stanie zostać przekonwertowane na typ danych elementu listy list1. Jeśli na przykład list1 jest zadeklarowana jako Number[], a list2 jako String[], to minus(list1, list2) spowoduje błąd składni, ale minus(list2, list1) nie. |
Przykłady |
minus(list(1, 2, 3), list(1), list(2)) zwraca listę typu danych Number[] z przecięciem 3 i elementem typu danych Number. minus(list(1), list(2)) zwraca pustą listę danych typu Number[]. minus(list(„1”), list(1)) zwraca pustą listę danych typu String[]. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
intersection, union |
function create()
{
var p_text1 := parameters.TEXT1;
var p_text2 := parameters.TEXT2;
var p_list1 := new(String[], length(p_text1));
var p_list2 := new(String[], length(p_text2));
var i := 0;
while (i < size(p_list1)) {
p_list1[i] := substring(p_text1, i, i + 1);
i := i + 1;
}
i := 0;
while (i < size(p_list2)) {
p_list2[i] := substring(p_text2, i, i + 1);
i := i + 1;
}
result.VALUE_LIST1 := p_list1;
result.VALUE_LIST2 := p_list2;
result.VALUE := minus(p_list1, p_list2);
}
size
Nazwa |
size |
Opis |
size określa liczbę elementów na liście lub w HashMap. |
Podpisy |
Number size(Unknown[] list) Number size(HashMap hashMap) |
Parametry |
list jest listą. hashMap to tablica skrótów (HashMap). |
Wynik |
Liczba elementów na liście list lub w tablicy hash hashMap. |
Źródła błędów |
Brak |
Przykłady |
size(list(1, 2, 3)) zwraca 3. size(new(String[10])) zwraca 10. size(new(HashMap)) zwraca 0. |
Kontekst |
ALL |
Uwagi |
Dwa wyrażenia size(list1) = 0 i isEmpty(list1) sprawdzają, czy lista list1 jest pusta. |
Zobacz także |
isEmpty |
function create()
{
var p_text := trim(parameters.TEXT);
var r_wordList as String[];
var word as String;
var startPos := 0;
var i := 0;
while (i < length(p_text)) {
if (substring(p_text, i, i + 1) = ” „) {
word := trim(substring(p_text, startPos, i));
startPos := i;
if (word <> „”)
add(r_wordList, word);
}
i := i + 1;
}
word := trim(substring(p_text, startPos));
if (word <> „”)
add(r_wordList, word);
result.VALUE_WORD_LIST := r_wordList;
result.VALUE := size(r_wordList);
}
toCharList
Nazwa |
toCharList |
Opis |
toCharList konwertuje ciąg znaków na listę znaków. |
Podpisy |
String[] toCharList(String text) |
Parametry |
text to ciąg znaków. |
Wynik |
Lista z jednym elementem dla każdego znaku w łańcuchu. |
Źródła błędów |
Brak |
Przykłady |
toCharList(„ABC”) zwraca listę zawierającą elementy [„A”], [„B”] i [„C”]. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
function create()
{
var p_text := parameters.TEXT;
var r_toCharList := „”;
var charList := new(String[]);
var lenText := length(p_text);
var i := 0;
while (i < lenText) {
add(charList, substring(p_text, i, i + 1));
i := i + 1;
}
for (char : charList)
r_toCharList := r_toCharList + ” [” + char + „]”;
result.IS_EMPTY := isEmpty(charList);
result.VALUE := trim(r_toCharList);
}
union
Nazwa |
union |
Opis |
union zwraca połączenie dwóch lub więcej list. |
Podpisy |
Unknown[] union(Unknown[] list1, Unknown[] list2) Unknown[] union(Unknown[] list1, Unknown[] list2,…,Unknown[] listN) |
Parametry |
list1 to pierwsza lista. list2 to druga lista. listN jest ostatnią listą. |
Wynik |
Związek przekazanych list jako lista o tym samym typie danych co list1. Zbiór unii składa się ze wszystkich elementów, które są zawarte w jednej z list list1, list2,…, listN i mają ten sam typ danych elementu. |
Źródła błędów |
Aby utworzyć zbiór unii, typy danych elementów list list2, list3,…, listN muszą być w stanie zostać przekonwertowane na typ danych elementu listy list1. Jeśli na przykład list1 jest zadeklarowana jako Number[], a list2 jako String[], to union(list1, list2) spowoduje błąd składni, ale union(list2, list1) nie. |
Przykłady |
union(list(1, 2, 3), list(1), list(2)) zwraca listę typu danych Number[] z elementami 1, 2, 3 typu danych Number. union(list(1), list(2)) zwraca listę typu danych Number[] z elementami 1, 2 typu danych Number. union(list(„1”), list(1)) zwraca listę typu danych String[] z elementami 1 i 1 odpowiednio typu danych String i Number. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
add, intersection, minus |
function create()
{
var p_text1 := parameters.TEXT1;
var p_text2 := parameters.TEXT2;
var p_list1 := new(String[], length(p_text1));
var p_list2 := new(String[], length(p_text2));
var i := 0;
while (i < size(p_list1)) {
p_list1[i] := substring(p_text1, i, i + 1);
i := i + 1;
}
i := 0;
while (i < size(p_list2)) {
p_list2[i] := substring(p_text2, i, i + 1);
i := i + 1;
}
result.VALUE_LIST1 := p_list1;
result.VALUE_LIST2 := p_list2;
result.VALUE := union(p_list1, p_list2);
}
Funkcje GUID (GUID functions)
Identyfikatory można tworzyć i edytować za pomocą funkcji dla identyfikatorów. Funkcje dla identyfikatorów obejmują
- guidToString
- newGuid
guidToString
Nazwa |
guidToString |
Opis |
guidToString konwertuje identyfikator GUID na ciąg znaków w 37-znakowym formacie Microsoft. Format ten jest używany na przykład przez BIS. |
Podpisy |
String (Guid guid) |
Parametry |
guid jest identyfikatorem GUID. |
Wynik |
Ciąg znaków dla guid w 37-znakowym formacie Microsoft. |
Źródła błędów |
Brak |
Przykłady |
guidToString(ZERO_GUID) zwraca 00000000-0000-00-00-00-00-000000000000 jako ciąg znaków. guidToString(INVALID_GUID) zwraca 00000000-0000-00-00-00-f000000000 jako ciąg znaków. guidToString(„0040509F68492E10926FAE1BAABC0000“ zwraca 9f504000-4968-102e-92-6f-0000bcaa1bae jako ciąg znaków. |
Kontekst |
ALL |
Uwagi |
guidToString należy wykorzystywać tylko wtedy, gdy użytkownik chce przekonwertować guid na 37-cyfrowy format Microsoft. Aby przekonwertować identyfikator Guid na ciąg znaków, należy użyć funkcji cast. Dla porównania, cast(String, ZERO_GUID) zwraca ciąg znaków z 32 zerami („00000000000000000000000000000000”). |
Zobacz także |
cast |
function create()
{
var p_guid := newGuid();
var r_guidToString := guidToString(p_guid);
result.VALUE_INTERNAL := p_guid;
result.VALUE_MS := r_guidToString;
}
newGuid
Nazwa |
newGuid |
Opis |
newGuid tworzy nowy unikalny identyfikator Guid. |
Podpisy |
Guid newGuid() |
Parametry |
Brak |
Wynik |
Nowy, przejrzysty identyfikator |
Źródła błędów |
Brak |
Przykłady |
newGuid() zwraca nowy unikalny identyfikator Guid. |
Kontekst |
ALL |
Uwagi |
Funkcji newGuid można użyć na przykład do przypisania unikalnej nazwy do pliku, który ma zostać utworzony za pomocą funkcji writeFile. |
Zobacz także |
function create()
{
result.VALUE := newGuid();
}
Funkcje dla zestawów wartości (ValueSet functions)
Funkcje ValueSets ułatwiają korzystanie z ValueSets w skryptach, np. w wynikach działania pola typu Pole wyboru. Funkcje ValueSets obejmują:
- valueSet
- valueSetDescription
- valueSetName
valueSet
Nazwa |
valueSet |
Opis |
valueSet tworzy zmienną typu Class z wpisami ze zbioru wartości. |
Podpisy |
<variableName> valueSet(valueSet) |
Parametry |
valueSet to w pełni kwalifikowana nazwa ValueSet bez cudzysłowów. |
Wynik |
Zmienna typu Class i stała z nazwą techniczną wpisu i jego numerycznym identyfikatorem dla każdego wpisu zestawu wartości. |
Źródła błędów |
Brak |
Przykłady |
const State as valueSet(com.cisag.sys.workflow.ActivityState);
function close(state as Number) { if (state = State.DONE) { } else { } } |
Kontekst |
ALL |
Uwagi |
valueSet może być używane tylko podczas deklarowania stałych. |
Zobacz także |
valueSetDescription, valueSetName |
valueSetDescription
Nazwa |
valueSetDescription |
Opis |
valueSetDescription zwraca opis wpisu ValueSet. |
Podpisy |
String valueSetDescription(Hashmap valueSet, Number id) String valueSetDescription(String valueSetName, Number id) |
Parametry |
valueSet to nazwa stałej zadeklarowanej jako ValueSet lub HashMap z wpisami dla ValuseSet. id to numeryczny identyfikator wpisu w ValueSet. |
Wynik |
Przetłumaczalny opis wpisu ValueSet jako ciąg znaków. |
Źródła błędów |
Jeśli ValueSet nie zawiera wpisu o identyfikatorze id, zwracana jest wartość zero. |
Przykłady |
ValueSet może być przekazany jako wyrażenie po deklaracji z const: const State as valueSet(com.cisag.sys.workflow.ActivityState); … formatDescription(„state”, valueSetDescription(State, activity:state); Zestaw ValueSet można jednak również przesłać przy użyciu pełnej nazwy technicznej: formatDescription(„state”, valueSetDescription(„com.cisag.sys.workflow.ActivityState”, activity:state); |
Kontekst |
ALL |
Uwagi |
Opisu można użyć na przykład do wyświetlenia użytkownikowi wartości atrybutu ValueSet w jego języku treści. |
Zobacz także |
valueSet, valueSetName |
const State as valueSet(com.cisag.sys.workflow.ActivityState);
function create()
{
var p_id := parameters.ID;
var r_name := „”;
var r_description := „”;
var name := valueSetName(State, p_id);
var description := valueSetDescription(State, p_id);
if (not isNull(name)) {
r_name := name;
r_description := description;
}
result.IS_NULL := isNull(name);
result.NAME := r_name;
result.DESCRIPTION := description;
}
valueSetName
Nazwa |
valueSetName |
Opis |
valueSetName zwraca nazwę wpisu ValueSet. |
Podpisy |
String valueSetName(Hashmap valueSet, Number id) String valueSetName(String valueSetName, Number id) |
Parametry |
valueSet to nazwa stałej zadeklarowanej jako ValueSet lub HashMap z wpisami dla ValuseSet. id to numeryczny identyfikator wpisu w ValueSet. |
Wynik |
Nazwa wpisu ValueSet jako ciąg znaków. |
Źródła błędów |
Jeśli ValueSet nie zawiera wpisu o identyfikatorze id, zwracana jest wartość zero. |
Przykłady |
ValueSet może być przekazany jako wyrażenie po deklaracji z const: const State as valueSet(com.cisag.sys.workflow.ActivityState); … formatDescription(„state”, valueSetName(State, activity:state); Zestaw ValueSet można jednak również przesłać przy użyciu pełnej nazwy technicznej: formatDescription(„state”, valueSetName(„com.cisag.sys.workflow.ActivityState”, activity:state); |
Kontekst |
ALL |
Uwagi |
Nazwy tej można użyć na przykład do wyraźnego wyświetlenia użytkownikowi wartości atrybutu ValueSet. |
Zobacz także |
valueSet, valueSetDescription |
const State as valueSet(com.cisag.sys.workflow.ActivityState);
function create()
{
var p_id := parameters.ID;
var r_name := „”;
var r_description := „”;
var name := valueSetName(State, p_id);
var description := valueSetDescription(State, p_id);
if (not isNull(name)) {
r_name := name;
r_description := description;
}
result.IS_NULL := isNull(name);
result.NAME := r_name;
result.DESCRIPTION := description;
}
Funkcje dla obiektów biznesowych (Business object functions)
Funkcje dla obiektów biznesowych mogą być używane do otwierania i analizowania dowolnych obiektów biznesowych z bazy danych. Funkcje dla obiektów biznesowych obejmują:
- getAttribute
- getByBusinessKey
- getByPrimaryKey
- getCisObjectList
- getURL
getAttribute
Nazwa |
getAttribute |
Opis |
getAttribute zwraca wartość atrybutu obiektu biznesowego lub widoku obiektu. |
Podpisy |
Unknown getAttribute(CisObject object, String path) Unknown getAttribute(DataView view, String path) |
Parametry |
obiect jest obiektem biznesowym. view jest widokiem obiektu. attribute to nazwa atrybutu. |
Wynik |
Funkcja zwraca wartość atrybutu obiektu biznesowego lub widoku obiektu z typem danych Unknown. |
Źródła błędów |
Jeśli atrybut ze ścieżką path nie istnieje, wystąpi błąd wykonania. |
Przykłady |
loadCurrency(getCorporateCurrency(cast(Guid, getAttribute(parameters.object, „_organisation”)))):isoCode zwraca kod ISO kluczowej waluty organizacji, w której kontekście zarejestrowano obiekt biznesowy, do którego odwołuje się parameters.object. |
Kontekst |
ALL |
Uwagi |
Funkcja ta służy do oceny atrybutów zaczynających się od podkreślenia. Przed użyciem atrybutu należy przekonwertować go na typ danych zgodny z atrybutem. |
Zobacz także |
- Strefa czasowa – atrybut _timeZoneGuid
- Organizacja – atrybut _organisation
- Data kursu wymiany – atrybut _conversionDate
- Kombinacja walut wewnętrznych – atrybut _currencyCombo
function create()
{
var p_organisation := parameters.ORGANIZATION;
var p_item := parameters.ORGANIZATION;
var r_timeZoneId := „”;
var r_organisation := „”;
var r_conversionDate := „”;
var r_currencyCombination := „”;
var itemValuationData := getByPrimaryKey(CisObject(com.cisag.app.inventory.obj.ItemValuationData), loadOrganisation(p_organization):guid, loadItem(p_item):guid, ZERO_GUID, ZERO_GUID, ZERO_GUID);
if (not isNull(itemValuationData)) {
r_timeZoneId := getByPrimaryKey(„REPOSITORY”, CisObject(com.cisag.sys.kernel.obj.TimeZone), (cast(Guid, getAttribute(itemValuationData, „_timeZoneGuid”)))):id;
r_organisation := loadOrganisation(cast(Guid, getAttribute(itemValuationData, „_organisation”)):code;
r_conversionDate := cast(Timestamp, getAttribute(itemValuationData, „_conversionDate”));
var currencyCombination := getByPrimaryKey(CisObject(com.cisag.app.multiorg.obj.DomesticCurrencyCombination), cast(Number, getAttribute(itemValuationData, „_currencyCombo”)));
r_currencyCombination := loadCurrency(currencyCombination:currency1):isoCode;
if (not isNull(currencyCombination:currency2))
r_currencyCombination := r_currencyCombination + ” ” + loadCurrency(currencyCombination:currency2):isoCode;
if (not isNull(currencyCombination:currency3))
r_currencyCombination := r_currencyCombination + ” ” + loadCurrency(currencyCombination:currency3):isoCode;
}
result.VALUE1 := r_timeZoneId;
result.VALUE2 := r_organisation;
result.VALUE3 := r_conversionDate;
result.VALUE4 := r_currencyCombination;
}
getByBusinessKey
Nazwa |
getByBusinessKey |
Opis |
getByBusinessKey otwiera obiekt biznesowy poprzez jego klucz biznesowy. |
Podpisy |
CisObject(X) getByBusinessKey(CisObject(X), A1, A2, … , An) CisObject(X) getByBusinessKey(String database, CisObject(X), A1, A2, … , An) |
Parametry |
X to w pełni kwalifikowana nazwa techniczna obiektu biznesowego. A1, A2, …, An to wartości atrybutów w kluczu biznesowym obiektu biznesowego. database to nazwa bazy danych, w której znajduje się obiekt biznesowy. Jeśli obiekt biznesowy nie znajduje się w bazie danych, w której przechowywane jest działanie, należy również określić bazę danych. Możliwe wartości to: OLTP, OLAP, REPOSITORY, CONFIGURATION. Alternatywnie można również podać nazwę bazy danych w systemie, np. QAS60010. |
Wynik |
Funkcja zwraca obiekt biznesowy jako typowany CisObject. |
Źródła błędów |
Jeśli nie istnieje żaden obiekt biznesowy z określonymi wartościami atrybutów, zwracana jest wartość zero. Należy upewnić się również, że wprowadzane są wartości atrybutów we właściwej kolejności klucza biznesowego. |
Przykłady |
getByBusinessKey(CisObject(com.cisag.app.general.obj.Partner), „10010”) daje taki sam wynik jak loadPartner(„10010”). getByBusinessKey(CisObject(com.cisag.app.sales.obj.SalesOrder), getByBusinessKey(CisObject(com.cisag.app.sales.obj.SalesOrderType), „100”):guid, „01234”) zwraca zamówienie sprzedaży 100-01234. |
Kontekst |
ALL |
Uwagi |
Ponieważ obiekt biznesowy jest otwierany za pośrednictwem usługi trwałości, funkcja ta nie może powodować żadnego dostępu do bazy danych. Dlatego funkcja getByBusinessKey jest lepsza od funkcji getCisObjectList, jeśli ma zostać otwarta tylko jedna instancja obiektu biznesowego. W przypadku wersjonowanych obiektów biznesowych można otworzyć tylko aktualnie obowiązującą wersję za pomocą funkcji getByBusinessKey. Jeśli użytkownik chce otworzyć przeszłą lub przyszłą wersję, może użyć funkcji getCisObjectList, na przykład określając atrybuty validFrom i validUntil. Atrybuty klucza biznesowego obiektu biznesowego są wyświetlane w aplikacji Obiekty deweloperskie. |
Zobacz także |
getByPrimaryKey |
function create()
{
var p_type := parameters.TYPE;
var p_number := parameters.NUMBER;
var r_customer := „”;
var salesOrder := getByBusinessKey(CisObject(com.cisag.app.sales.obj.SalesOrder), getByBusinessKey(CisObject(com.cisag.app.sales.obj.SalesOrderType), p_type):guid, p_number);
if (not isNull(salesOrder)) {
r_customer := salesOrder->CustomerData->CustomerPartner:number + ” ” + salesOrder->CustomerData->CustomerPartner:searchString;
}
result.IS_NULL := isNull(salesOrder);
result.CUSTOMER := r_customer;
}
getByPrimaryKey
Nazwa |
getByPrimaryKey |
Opis |
getByPrimaryKey otwiera obiekt biznesowy poprzez jego klucz podstawowy. |
Podpisy |
CisObject(X) getByPrimaryKey(CisObject(X), A1, A2, … , An) CisObject(X) getByPrimaryKey(String database, CisObject(X), A1, A2, … , An) |
Parametry |
X to w pełni kwalifikowana nazwa techniczna obiektu biznesowego. A1, A2, …, An to wartości atrybutów w kluczu podstawowym obiektu biznesowego. database to nazwa bazy danych, w której znajduje się obiekt biznesowy. Jeśli obiekt biznesowy nie znajduje się w bazie danych, w której przechowywane jest działanie, należy również określić bazę danych. Możliwe wartości to: OLTP, OLAP, REPOSITORY, CONFIGURATION. Alternatywnie można również podać nazwę bazy danych w systemie, np. QAS60010. |
Wynik |
Funkcja zwraca obiekt biznesowy jako typowany CisObject. |
Źródła błędów |
Jeśli nie istnieje żaden obiekt biznesowy z określonymi wartościami atrybutów, zwracana jest wartość zero. Należy upewnić się również, że wprowadzane są wartości atrybutów we właściwej kolejności klucza głównego. |
Przykłady |
getByPrimaryKey(CisObject(com.cisag.app.general.obj.Employee), loadPartner(„70010”):guid) otwiera dane pracownika partnera 70010. getByPrimaryKey(„CONFIGURATION”, CisObject(com.cisag.sys.configuration.obj.User), parameters.userGuid):emailAddress zwraca adres e-mail zapisany w danych systemowych użytkownika, który wywołał zdarzenie typu Jednostka biznesowa. |
Kontekst |
ALL |
Uwagi |
Ponieważ obiekt biznesowy jest otwierany za pośrednictwem usługi trwałości, funkcja ta nie może powodować żadnego dostępu do bazy danych. Dlatego funkcja getByPrimaryKey jest lepsza od funkcji getCisObjectList, jeśli ma zostać otwarta tylko jedna instancja obiektu biznesowego. W przypadku wersjonowanych obiektów biznesowych można otworzyć tylko aktualnie obowiązującą wersję za pomocą funkcji getByPrimaryKey. Jeśli użytkownik chce otworzyć przeszłą lub przyszłą wersję, może użyć funkcji getCisObjectList, na przykład określając atrybuty validFrom i validUntil. Atrybuty klucza głównego obiektu biznesowego są wyświetlane w aplikacji Obiekty deweloperskie. |
Zobacz także |
getByBusinessKey |
function create()
{
var p_partner := parameters.PARTNER;
var r_employeeNumber := „”;
var employee := getByPrimaryKey(CisObject(com.cisag.app.general.obj.Employee), loadPartner(p_partner):guid);
if (not isNull(employee)) {
r_employeeNumber := employee:employeeNumber;
}
result.IS_NULL := isNull(employee);
result.EMPLOYEE_NUMBER := r_employeeNumber;
}
getCisObjectList
Nazwa |
getCisObjectList |
Opis |
getCisObjectList zwraca listę instancji obiektów biznesowych, które zostały określone za pomocą instrukcji OQL. |
Podpisy |
CisObject[] getCisObjectList(String oql, Unknown[] parameters) CisObject[] getCisObjectList(String database, String oql, Unknown[] parameters) CisObject[] getCisObjectList(String oql, Unknown[] parameters, Number count) CisObject[] getCisObjectList(String database, String oql, Unknown[] parameters, Number count) |
Parametry |
oql jest instrukcją OQL. Musi być ona wprowadzona zgodnie ze wzorcem SELECT FROM…. Więcej informacji można znaleźć w artykule Składnia OQL. database to nazwa bazy danych, w której znajduje się obiekt biznesowy. Jeśli obiekt biznesowy nie znajduje się w bazie danych, w której przechowywane jest działanie, należy również określić bazę danych. Możliwe wartości to: OLTP, OLAP, REPOSITORY, CONFIGURATION. Alternatywnie można również podać nazwę bazy danych w systemie, np. QAS60010. parameters to lista wartości parametrów dla instrukcji OQL. Obsługiwane są typy danych Boolean, String, Number, Guid, Timestamp, CisDate i Bytes. Liczby i CisDate są traktowane specjalnie. Jeśli liczba jest przekazywana bez miejsc dziesiętnych, parametr jest traktowany jako liczba całkowita (int), w przeciwnym razie jako liczba dziesiętna (CisDecimal). Należy upewnić się, że nie przekazywane są żadne liczby z miejscami dziesiętnymi jako parametry dla atrybutów typów danych Java byte, short, int lub long. CisDate jest zazwyczaj konwertowana na znacznik czasu. count to maksymalna liczba zwracanych instancji obiektów biznesowych. Jeśli wartość count nie zostanie określona, zwracana jest maksymalnie jedna instancja CisObject. Należy określić jak najmniejszą wartość, ponieważ zbyt duża wartość może mieć negatywny wpływ na wydajność systemu. Maksymalna wartość jest ograniczona. Więcej informacji można znaleźć w rozdziale Ograniczanie złożoności wyrażeń w artykule Wprowadzenie: Język skryptowy systemu. |
Wynik |
Funkcja zwraca listę CisObjects, jeśli została wykonana bez błędów. Jeśli nie znaleziono żadnych rekordów danych, zwracana jest pusta lista. |
Źródła błędów |
Jeśli wystąpi błąd, zwracana jest wartość zero. |
Przykłady |
cast(CisObject(com.cisag.app.general.obj.Partner), getCisObjectList(„SELECT FROM com.cisag.app.general.obj.Partner p ORDER BY p:updateInfo.createTime ASC”, list(), 1)[0]):number zwraca identyfikator pierwszego zarejestrowanego partnera. cast(CisObject(com.cisag.app.general.obj.UserAssignment), getCisObjectList(„SELECT FROM com.cisag.app.general.obj.UserAssignment o WHERE o:user = ?”, list(userGuid(parameters.userGuid)), 1)[0]) zwraca partnera powiązanego z użytkownikiem, który wywołał zdarzenie typu Jednostka biznesowa. for (salesOrder as CisObject(com.cisag.app.sales.obj.SalesOrder) : getCisObjectList(„SELECT FROM com.cisag.app.sales.obj.SalesOrder so WHERE so:type IN (SELECT t:guid FROM com.cisag.app.sales.obj.SalesOrderType t WHERE (t:code = ? or t:code = ?) AND so:status = ? ORDER BY so:date DESC”, list(„100”, „200”, OrderStatus.ORDER_HELD), 10)) iteruje po dziesięciu zablokowanych zamówieniach sprzedaży typu 100 lub 200 z największą datą dokumentu. isEmpty(getCisObjectList(„SELECT FROM com.cisag.sys.workflow.obj.Process o WHERE o:code like ? AND o:processDefinition = ? AND (o:state = ? OR o:state = ?)”, list(„%”, definition->ProcessDefinition:guid, ProcessState.IN_PROCESS, ProcessState.OVERDUE), 1)) sprawdza w warunku przejścia węzła początkowego, czy istnieje otwarta instancja procesu z tej samej definicji procesu. Ten warunek przejścia gwarantuje, że proces nie zostanie uruchomiony więcej niż jeden raz. Należy pamiętać, że pierwszy element listy parametrów nie ma znaczenia funkcjonalnego. Został dodany tylko dlatego, że typy danych Guid i Number nie mogą być konwertowane na siebie nawzajem. Alternatywnie, wartości ValueSet można zakodować bezpośrednio w instrukcji OQL (choć może to negatywnie wpłynąć na wydajność) lub listę parametrów można utworzyć za pomocą funkcji add i sprawdzić warunek w funkcji create. Jeśli istnieje już otwarta instancja procesu, generowanie działania można anulować za pomocą polecenia abort lub abortProcess. |
Kontekst |
ALL |
Uwagi |
Parametry dla instrukcji OQL nie powinny być predefiniowane w instrukcji OQL, ale powinny być przekazywane do funkcji jako symbole zastępcze przy użyciu parametrów z ?. Jeśli parametry w instrukcji OQL są zakodowane jako stałe zamiast symboli zastępczych, może to mieć negatywny wpływ na wydajność systemu. Podczas tworzenia listy za pomocą funkcji list, elementy listy przyjmują typ danych pierwszego elementu. Jeśli instrukcja OQL ma parametry typów danych, które nie mogą być konwertowane na siebie nawzajem, można zadeklarować pustą listę typu danych Unknown[] i dodać elementy różnych typów danych za pomocą funkcji add, przykładowo var parameterList := new(Unknown[]); add(parameterList, now()); add(parameterList, 10); add(parameterList, „100”); Ponieważ funkcja zwraca nieoznaczoną listę CisObject, należy wpisać elementy listy przed ich użyciem. Ponieważ funkcja getCisObjectList powoduje dostęp do bazy danych, funkcja getByBusinessKey jest preferowana, jeśli ma zostać otwarta tylko jedna instancja obiektu biznesowego. |
Zobacz także |
getResultList |
function create()
{
var p_customer := parameters.CUSTOMER;
var r_salesOrders := „”;
var customer := loadPartner(p_customer);
if (not isNull(customer)) {
var oql :=
„SELECT FROM com.cisag.app.sales.obj.SalesOrder so ” +
„WHERE so:customerData IN ” +
” (SELECT ocdi:guid ” +
” FROM com.cisag.app.sales.obj.OrderCustomerDataInfo ocdi ” +
” WHERE ocdi:customer = ?) ” +
„ORDER BY so:date DESC”;
var soList := getCisObjectList(oql, list(customer:guid), 10);
for (so as CisObject(com.cisag.app.sales.obj.SalesOrder) : soList) {
r_salesOrders := r_salesOrders + ” ” + so->Type:code + „-” + so:number;
}
}
result.SALES_ORDERS := trim(r_salesOrders);
}
Poniższy przykład określa wszystkie wewnętrzne osoby w bazie danych. Ponieważ funkcja getCisObjectList nie może zwrócić dowolnej liczby instancji, osoby są odpytywane blok po bloku zgodnie z indeksowanym atrybutem number i dodawane do listy partnerList. Dopiero gdy zapytanie zwróci mniej instancji niż rozmiar bloku, zakończone zostanie określanie wszystkich osób wewnętrznych.
const PartnerType as valueSet(com.cisag.app.general.PartnerType);
const BlockSize := 100;
function create()
{
var partnerList as CisObject(com.cisag.app.general.obj.Partner)[];
var lastPartnerNumber := „”;
var allPartnersSearched := false;
var params as Unknown[];
while (not allPartnersSearched) {
var OQL :=
„SELECT FROM com.cisag.app.general.obj.Partner p ” +
” WHERE p:type = ? AND p:human = ? AND p:number > ? ” +
” ORDER BY p:number”;
params := new(Unknown[]);
add(params, PartnerType.INTERNAL);
add(params, true);
add(params, lastPartnerNumber);
var cisObjectList := getCisObjectList(OQL, params, BlockSize);
for (p as CisObject(com.cisag.app.general.obj.Partner) : cisObjectList)
add(partnerList, p);
lastPartnerNumber := partnerList[size(partnerList)-1]:number;
allPartnersSearched := size(cisObjectList) < BlockSize;
}
}
Poniższy przykład tworzy dynamiczną instrukcję OQL dla eksportu partnerów, którzy zostali wprowadzeni lub zmienieni wczoraj. Ponieważ definicja działania wykonuje aplikację w tle com.cisag.pgm.bi.Export, zmienna dynSQL musi zostać zadeklarowana poza funkcją create, a wartość musi zostać przekazana do aplikacji w tle za pośrednictwem parametru SearchName.
var dynOQL as String;
function create()
{
/* Pobierz czas rozpoczęcia i zakończenia dla dynamicznego OQL*/
var endTime := startOfDay(now());
var beginTime := addDays(endTime, -1);
/* Tworzenie cząstek czasu dla dynamicznego OQL */
var beginYear := format(year(beginTime), „0000”);
var beginMonth := format(month(beginTime), „00”);
var beginDay := format(day(beginTime), „00”);
var endYear := format(year(endTime), „0000”);
var endMonth := format(month(endTime), „00”);
var endDay := format(day(endTime), „00”);
/* Uzyskaj domyślny identyfikator strefy czasowej systemu */
var timeZoneId := timeZoneId(today());
/* Tworzenie dynamicznego OQL */
var dynOQL :=
„DynOQL:SELECT DISTINCT o:guid, o:number ” +
„FROM com.cisag.app.general.obj.Partner o ” +
„WHERE (o:updateInfo.updateTime >= ” +
„toTimestamp(„” + timeZoneId + „”, ” +
beginYear + „, ” + beginMonth + „, ” + beginDay +
„, 00, 00, 00, 000) ” +
„AND o:updateInfo.updateTime < ” +
„toTimestamp(„” + timeZoneId + „”, ” +
endYear + „, ” + endMonth + „, ” + endDay +
„, 00, 00, 00, 000)) ” +
„OR (o:updateInfo.createTime >= ” +
„toTimestamp(„” + timeZoneId + „”, ” +
beginYear + „, ” + beginMonth + „, ” + beginDay +
„, 00, 00, 00, 000) ” +
„AND o:updateInfo.createTime < ” +
„toTimestamp(„” + timeZoneId + „”, ” +
endYear + „, ” + endMonth + „, ” + endDay +
„, 00, 00, 00, 000) ” +
„AND o:updateInfo.updateTime = UNDEFINED_TIME_STAMP) ” +
„ORDER BY o:number”;
}
getURL
Nazwa |
getURL |
Opis |
getURL generuje adres URL dla obiektu biznesowego. |
Podpisy |
String getURL(CisObject object) String getURL(String serverName, CisObject object) String getURL(Guid databaseGuid, CisObject object) String getURL(String serverName, Guid databaseGuid, CisObject object) |
Parametry |
object to obiekt biznesowy, dla którego ma zostać wygenerowany adres URL. serverName to nazwa serwera aplikacji, na który powinien wskazywać adres URL. Jeśli nazwa serwera nie zostanie określona, używany jest bieżący serwer aplikacji. databaseGuid to baza danych, na którą powinien wskazywać adres URL. Jeśli nie określono identyfikatora bazy danych, bieżąca baza danych OLTP jest używana dla adresu URL dla działań OLTP i bazy danych repozytorium dla działań repozytorium. |
Wynik |
Adres URL obiektu biznesowego jako ciąg znaków. |
Źródła błędów |
Brak. |
Przykłady |
getURL(loadPartner(„10010”)) zwraca adres URL dla partnera 10010. formatDescriptionHTML(„process”, „<a href=\”” + getURL(getByBusinessKey(CisObject(com.cisag.sys.workflow.obj.Process), process.Code)) + „\”>” + toHtml(process.Code) + „</a>”) zastępuje symbol zastępczy {process} w opisie działania klikalnym linkiem do procesu. |
Kontekst |
ALL |
Uwagi |
Adresu URL można użyć na przykład w tagach HTML w opisie działania. |
Zobacz także |
function create()
{
var p_partner := parameters.PARTNER;
var p_server := parameters.SERVER;
var p_database := parameters.DATABASE;
var r_URL := „”;
var partner := loadPartner(p_partner);
if (not isNull(partner)) {
if (p_server = „” and p_database = „”)
r_URL := getURL(partner);
else if (p_server = „” and p_database <> „”)
r_URL := getURL(cast(Guid, p_database), partner);
else if (p_server <> „” and p_database = „”)
r_URL := getURL(p_server, partner);
inny
r_URL := getURL(p_server, cast(Guid, p_database), partner);
}
result.URL := r_URL;
}
Funkcje dla instrukcji OQL (Result list functions)
Z pomocą funkcji getResultList można odpytać bazę danych za pomocą instrukcji OQL. Funkcja zwraca wynik w postaci dwuwymiarowej listy wierszy i kolumn.
getResultList
Nazwa |
getResultList |
Opis |
getResultList otwiera dowolne dane z bazy danych za pomocą instrukcji OQL. |
Podpisy |
Unknown[][] getResultList(String oql, Unknown[] parameters) Unknown[][] getResultList(String database, String oql, Unknown[] parameters) Unknown[][] getResultList(String oql, Unknown[] parameters, Number count) Unknown[][] getResultList(String database, String oql, Unknown[] parameters, Number count) |
Parametry |
oql jest instrukcją OQL. Więcej informacji można znaleźć w dokumencie Składnia OQL. database to nazwa bazy danych, w której przechowywane są dane. Jeśli dane nie znajdują się w bazie danych, w której przechowywane jest działanie, należy również określić bazę danych. Możliwe wartości to: OLTP, OLAP, REPOSITORY, CONFIGURATION. Alternatywnie można również podać nazwę bazy danych w systemie, np. QAS60010. parameters to lista wartości parametrów dla instrukcji OQL. Obsługiwane są typy danych Boolean, String, Number, Guid, Timestamp, CisDate i Bytes. Liczby i CisDate są traktowane specjalnie. Jeśli liczba jest przekazywana bez miejsc dziesiętnych, parametr jest traktowany jako liczba całkowita (int), w przeciwnym razie jako liczba dziesiętna (CisDecimal). Należy upewnić się, że nie przekazuje się żadnych liczb z miejscami dziesiętnymi jako parametrów dla atrybutów typów danych Java byte, short, int lub long. CisDate jest zazwyczaj konwertowana na znacznik czasu. count to maksymalna liczba zwracanych rekordów danych. Jeśli wartość count nie zostanie określona, zwracany jest maksymalnie jeden rekord danych. Należy określić jak najmniejszą wartość, ponieważ zbyt duża wartość może mieć negatywny wpływ na wydajność systemu. Maksymalna wartość jest ograniczona. Więcej informacji można znaleźć w rozdziale Ograniczanie złożoności wyrażeń w artykule Wprowadzenie: Język skryptowy systemu. |
Wynik |
Jeśli funkcja zostanie wykonana bez błędów, zwraca listę wierszy wyników. Każdy wiersz wyników jest z kolei reprezentowany przez listę poszczególnych wartości. Jeśli nie znaleziono żadnych rekordów danych, zwracana jest pusta lista. |
Źródła błędów |
Jeśli wystąpi błąd, zwracana jest wartość zero. |
Przykłady |
cast(String, getResultList(„SELECT p:number FROM com.cisag.app.general.obj.Partner p ORDER BY p:updateInfo.createTime ASC”, list(), 1)[0][0]) zwraca identyfikator pierwszego zarejestrowanego partnera jako ciąg znaków. cast(Number, getResultList(„SELECT COUNT(*) FROM com.cisag.app.general.obj.Partner p WHERE p:human = ?”, list(true), 1)[0][0]) zwraca liczbę osób wprowadzonych jako partnerzy jako liczbę. for (soGuid as Guid[] : getResultList(„SELECT so:guid FROM com.cisag.app.sales.obj.SalesOrder so JOIN com.cisag.app.sales.obj.SalesOrderType t ON so:type = t:guid WHERE (t:code = ? or t:code = ?) AND so:status = ? ORDER BY so:date DESC”, list(„100”, „200”, OrderStatus.ORDER_HELD), 10)) iteruje po liście zawierającej guidy dziesięciu zablokowanych zamówień sprzedaży rodzaju 100 lub 200 z największą datą dokumentu. cast(Number, (getResultList(„SELECT COUNT(*) FROM com.cisag.sys.workflow.obj.Activity o WHERE o:code like ? AND o:definitionGuid = ? AND (o:state <> ? AND o:state <> ?)”, list(„%”, definition:guid, State.DONE, State.CANCELED), 1))) = 0 sprawdza w warunku przejścia definicji działania, czy istnieje otwarta instancja działania z tej samej definicji działania. Ten warunek przejścia zapewnia, że istnieje co najwyżej jedno otwarte działanie. Należy pamiętać, że pierwszy element listy parametrów nie ma znaczenia funkcjonalnego. Został dodany tylko dlatego, że typy danych Guid i Number nie mogą być konwertowane na siebie nawzajem. Alternatywnie, wartości ValueSet można zakodować bezpośrednio w instrukcji OQL (choć może to mieć negatywny wpływ na wydajność) lub listę parametrów można utworzyć za pomocą funkcji add i sprawdzić warunek w funkcji create. Jeśli istnieje już otwarta instancja procesu, generowanie działania można anulować za pomocą polecenia abort. |
Kontekst |
ALL |
Uwagi |
Parametry dla instrukcji OQL nie powinny być stałe w instrukcji OQL, ale powinny być przekazywane do funkcji jako symbole zastępcze przy użyciu parametrów z ?. Jeśli parametry w instrukcji OQL są zakodowane jako stałe zamiast symboli zastępczych, może to mieć negatywny wpływ na wydajność systemu. Podczas tworzenia listy za pomocą funkcji list, elementy listy przyjmują typ danych pierwszego elementu. Jeśli instrukcja OQL ma parametry typów danych, które nie mogą być konwertowane na siebie nawzajem, można zadeklarować pustą listę typu danych Unknown[] i dodać elementy różnych typów danych za pomocą funkcji add, przykładowo: var parameterList := new(Unknown[]); add(parameterList, now()); add(parameterList, 10); add(parameterList, „100”); Ponieważ określone rekordy danych są zwracane jako dwuwymiarowa lista danych typu Unknown[][], przed ich użyciem należy rzutować elementy listy. Ponieważ getResultList powoduje dostęp do bazy danych, funkcja getByBusinessKey jest preferowana, jeśli ma zostać otwarta tylko jedna instancja obiektu biznesowego. |
Zobacz także |
getCisObjectList |
function create()
{
var p_customer := parameters.CUSTOMER;
var r_salesOrders := „”;
var customer := loadPartner(p_customer);
if (not isNull(customer)) {
var so as CisObject(com.cisag.app.sales.obj.SalesOrder);
var oql :=
„SELECT o:guid FROM com.cisag.app.sales.obj.SalesOrder o ” +
„JOIN com.cisag.app.sales.obj.OrderCustomerDataInfo ocdi ” +
„ON o:customerData = ocdi:guid ” +
„WHERE ocdi:customer = ? ” +
„ORDER BY o:date DESC”;
var resultList := getResultList(oql, list(customer:guid), 10);
for (row as Guid[] : resultList) {
so := getByPrimaryKey(CisObject(com.cisag.app.sales.obj.SalesOrder), row[0]);
r_salesOrders := r_salesOrders + ” ” + so->Type:code + „-” + so:number;
}
}
result.SALES_ORDERS := trim(r_salesOrders);
}
Poniższy przykład z definicji działania typu Wywołanie funkcji zwraca wartości kilku innych pól partnera. Nazwy innych pól zaczynają się od przedrostka ft_, po którym następuje nazwa używanego typu pola.
function create()
{
var partner := loadPartner(parameters.PARTNER);
var ft_text as String;
var ft_URL as String;
var ft_eMail as String;
var ft_decimal as Number;
var ft_date as Timestamp;
var ft_dateTimeZone as Guid;
var ft_dateAndTime as Timestamp;
var ft_domesticAmount as Number;
var ft_foreignAmount as Number;
var ft_foreignAmountCurrency as Guid;
var ft_domesticPrice as Number;
var ft_foreignPrice as Number;
var ft_foreignPriceCurrency as Guid;
var ft_quantity as Number;
var ft_quantityUom as Guid;
var ft_classification as Guid;
var ft_valueSet as Number;
var ft_longText as Guid;
if (not isNull(partner))
{
var oql := „SELECT dbo:FT_TEXT, dbo:FT_URL, dbo:FT_EMAIL, dbo:FT_DECIMAL, dbo:FT_DATE.date, dbo:FT_DATE.timeZoneGuid, dbo:FT_DATE_AND_TIME.date, dbo:FT_DOMESTIC_AMOUNT.amount1, dbo:FT_FOREIGN_AMOUNT.amount, dbo:FT_FOREIGN_AMOUNT.currency, dbo:FT_DOMESTIC_PRICE.amount1, dbo:FT_FOREIGN_PRICE.amount, dbo:FT_FOREIGN_PRICE.currency, dbo:FT_QUANTITY.amount, dbo:FT_QUANTITY.uom, eeh:path, dbo:FT_VALUESET, dbo:FT_LONG_TEXT FROM com.cisag.app.general.obj.Partner p DYNAMIC_OBJECT JOIN EXTPartner dbo ON dbo = p WHERE p:guid = ?”;
var rList := getResultList(oql, list(partner:guid));
if (size(rList) > 0)
{
ft_text := cast(String, rList[0][0]);
ft_URL := cast(String, rList[0][1]);
ft_eMail := cast(String, rList[0][2]);
ft_decimal := cast(Number, rList[0][3]);
ft_date := cast(Timestamp, rList[0][4]);
ft_dateTimeZone := cast(Guid, rList[0][5]);
ft_dateAndTime := cast(Timestamp, rList[0][6]);
ft_domesticAmount := cast(Number, rList[0][7]);
ft_foreignAmount := cast(Number, rList[0][8]);
ft_foreignAmountCurrency := cast(Guid, rList[0][9]);
ft_domesticPrice := cast(Number, rList[0][10]);
ft_foreignPrice := cast(Number, rList[0][11]);
ft_foreignPriceCurrency := cast(Guid, rList[0][12]);
ft_quantity := cast(Number, rList[0][13]);
ft_quantityUom := cast(Guid, rList[0][14]);
ft_classification := cast(Guid, rList[0][15]);
ft_valueSet := cast(Number, rList[0][16]);
ft_longText := cast(Guid, rList[0][17]);
result.FT_TEXT := ft_text;
result.FT_DECIMAL := ft_decimal;
result.FT_EMAIL := ft_eMail;
result.FT_URL := ft_URL;
if (ft_date <> UNDEFINED_DATE) {
result.FT_DATE := ft_date;
result.FT_DATE_TIME_ZONE := getByPrimaryKey(„REPOSITORY”, CisObject(com.cisag.sys.kernel.obj.TimeZone), ft_dateTimeZone):id;
result.FT_DATE_AND_TIME := ft_dateAndTime;
}
result.FT_DOMESTIC_AMOUNT := ft_domesticAmount;
if (not isNull (ft_foreignAmountCurrency)) {
result.FT_FOREIGN_AMOUNT := ft_foreignAmount;
result.FT_FOREIGN_AMOUNT_CURRENCY := loadCurrency(ft_foreignAmountCurrency):isoCode;
}
result.FT_DOMESTIC_PRICE := ft_domesticPrice;
if (not isNull (ft_foreignPriceCurrency)) {
result.FT_FOREIGN_PRICE := ft_foreignPrice;
result.FT_FOREIGN_PRICE_CURRENCY := loadCurrency(ft_foreignPriceCurrency):isoCode;
}
if (ft_quantityUom <> ZERO_GUID) {
result.FT_QUANTITY := ft_quantity;
result.FT_QUANTITY_UOM := loadUom(ft_quantityUom):code;
}
if (not isNull(ft_classification))
result.FT_CLASSIFICATION_PATH := getByPrimaryKey(CisObject(com.cisag.app.general.extension.obj.EntityExtensionHierarchy), ft_classification):path;
result.FT_VALUE_SET := ft_valueSet;
if (not isNull(ft_longText))
result.FT_LONG_TEXT := unzipText(getByPrimaryKey(CisObject(com.cisag.app.general.obj.Text), ft_longText, getByBusinessKey(CisObject(com.cisag.app.general.obj.Language), getNLSContentLanguage()):guid):text);
}
}
}
Inne pole może być również odpytywane przy użyciu tak zwanej funkcji dbo. Ponieważ każda funkcja dbo powoduje dostęp do bazy danych, można użyć zapytania OQL z DYNAMIC_OBJECT JOIN, aby zapytać o wszystkie inne pola instancji obiektu biznesowego za pomocą jednego dostępu do bazy danych. Jeśli obiekt biznesowy ma wiele innych pól, można zmniejszyć liczbę dostępów do bazy danych. Zapytanie OQL może być również używane w kontekstach, w których funkcje dbo nie są dostępne, np. w indywidualnych kontrolach.
Należy pamiętać, że można wyszukiwać tylko pojedyncze wartości, a nie listy wartości. Inne pola typu Jednostka biznesowa również nie mogą być odpytywane za pomocą OQL.
Poniższy przykład definicji dzialania typu Wywołanie funkcji wykorzystuje funkcję getResultList do określenia liczby zleceń dostawy, które zostały odebrane, ale nie zostały jeszcze dostarczone. Wynik jest przypisywany do zmiennej wynikowej VALUE, dzięki czemu definicja działania może być używana w dynamicznym wskaźniku w aplikacji Dashboard.
const OrderStatus as valueSet(com.cisag.app.general.OrderStatus);
function create()
{
var oql :=
„SELECT COUNT(*) FROM com.cisag.app.sales.obj.ShippingOrder o WHERE o:pickingStatus = ? AND o:status = ?”;
var pickedShippingOrders := cast(Number, getResultList(oql, list(3, 10), 1)[0][0]);
result.VALUE := pickedShippingOrders;
}
Więcej informacji na temat wskaźników dynamicznych i ich wykorzystania na pulpicie nawigacyjnym można znaleźć w artykule Wskaźniki dynamiczne.
Funkcje NLS (NLS functions)
Funkcje NLS mogą być używane do otwierania obiektów Jednostka biznesowa w innych językach treści. Funkcje NLS obejmują:
- getNLSContentLanguage
- getNLSDisplayLanguage
- setNLSContentLanguage
- setNLSDisplayLanguage
- setNLSLanguages
getNLSContentLanguage
Nazwa |
getNLSContentLanguage |
Opis |
getNLSContentLanguage zwraca kod ISO bieżącego języka treści. |
Podpisy |
String getNLSContentLanguage() |
Parametry |
Brak |
Wynik |
Kod ISO bieżącego języka treści jako ciąg znaków. |
Źródła błędów |
Brak |
Przykłady |
getNLSContentLanguage() zwraca bieżący język treści. |
Kontekst |
ALL |
Uwagi |
Język treści określa między innymi język, w którym wielojęzyczne atrybuty obiektów są otwierane w bazie danych OLTP. |
Zobacz także |
getNLSDisplayLanguage |
function create()
{
var r_contentLanguage := getNLSContentLanguage();
result.CONTENT_LANGUAGE := r_contentLanguage;
}
getNLSDisplayLanguage
Nazwa |
getNLSDisplayLanguage |
Opis |
getNLSDisplayLanguage zwraca kod ISO bieżącego języka wyświetlania. |
Podpisy |
String getNLSDisplayLanguage() |
Parametry |
Brak |
Wynik |
Kod ISO bieżącego języka wyświetlania jako ciąg znaków. |
Źródła błędów |
Brak |
Przykłady |
getNLSDisplayLanguage() zwraca bieżący język wyświetlania. |
Kontekst |
ALL |
Uwagi |
Język wyświetlania określa między innymi język, w którym otwierane są wielojęzyczne atrybuty obiektów w bazie danych repozytorium. |
Zobacz także |
getNLSContentLanguage |
function create()
{
var r_displayLanguage := getNLSDisplayLanguage();
result.DISPLAY_LANGUAGE := r_displayLanguage;
}
setNLSContentLanguage
Nazwa |
setNLSContentLanguage |
Opis |
setNLSContentLanguage ustawia bieżący język treści. |
Podpisy |
setNLSContentLanguage(String language) |
Parametry |
language to kod ISO nowego języka treści. |
Wynik |
Po wywołaniu zmieniany jest język treści. Wielojęzyczne atrybuty wszystkich obiektów z bazy danych OLTP są następnie otwierane w zmienionym języku treści. Obiekty, które zostały otwarte przed wywołaniem funkcji, nie są zmieniane. |
Źródła błędów |
Brak |
Przykłady |
setNLSContentLanguage(„en”) ustawia bieżący język treści na angielski. |
Kontekst |
ALL |
Uwagi |
Gdy użytkownik uruchamia proces, jest on wykonywany w kontekście treści i języków wyświetlania zapisanych w ustawieniach użytkownika. |
Zobacz także |
setNLSDisplayLanguage, setNLSLanguages |
function create()
{
var p_item := parameters.ITEM;
var r_descriptions := „”;
var item := loadItem(p_item);
if (not isNull(item)) {
/* pobierz nazwy systemu i bazy danych */
var systemName := cast(String, call(„help.js.getSystemName”, hashMap()).NAME);
var databaseName := cast(String, call(„help.js.getDatabaseName”, hashMap()).NAME);
/* pobierz Guid systemu i bazy danych */
var system := getByBusinessKey(„CONFIGURATION”, CisObject(com.cisag.sys.configuration.obj.System), systemName, 1);
var database := getByBusinessKey(„CONFIGURATION”, CisObject(com.cisag.sys.configuration.obj.Database), system:guid, databaseName, 1);
/* zapytanie do bazy danych konfiguracji o aktywne języki treści */
var params as Unknown[];
add(params, database:guid);
add(params, 1); /* aktywna wersja */
var activeLanguages := getCisObjectList(„CONFIGURATION”, „SELECT FROM com.cisag.sys.configuration.obj.DatabaseLanguage o WHERE o:databaseGuid = ? AND o:version = ?”, params, 99);
/* pobierz opis przedmiotu we wszystkich aktywnych językach treści */
for (l as CisObject(com.cisag.sys.configuration.obj.DatabaseLanguage) : activeLanguages) {
r_descriptions := r_descriptions + ” [” + l:language + „] „;
setNLSContentLanguage(l:language);
item := loadItem(p_item);
r_descriptions := r_descriptions + item:description;
}
}
result.DESCRIPTIONS := trim(r_descriptions);
}
setNLSDisplayLanguage
Nazwa |
setNLSDisplayLanguage |
Opis |
setNLSDisplayLanguage ustawia bieżący język wyświetlania. |
Podpisy |
setNLSDisplayLanguage(String language) |
Parametry |
language to kod ISO nowego języka wyświetlania. |
Wynik |
Po wywołaniu, język wyświetlania zostanie zmieniony. Wielojęzyczne atrybuty wszystkich obiektów z bazy danych repozytorium są następnie otwierane w zmienionym języku wyświetlania. Obiekty, które zostały otwarte przed wywołaniem funkcji, nie są zmieniane. |
Źródła błędów |
Brak |
Przykłady |
setNLSDisplayLanguage(„en”) ustawia bieżący język wyświetlania na angielski. |
Kontekst |
ALL |
Uwagi |
Gdy użytkownik uruchamia proces, jest on wykonywany w kontekście treści i języków wyświetlania zapisanych w ustawieniach użytkownika. |
Zobacz także |
setNLSContentLanguage, setNLSLanguages |
const State as valueSet(com.cisag.sys.workflow.ActivityState);
function create()
{
var p_partner := parameters.PARTNER;
var r_description := „”;
var partner := loadPartner(p_partner);
if (not isNull(partner)) {
setNLSDisplayLanguage(cast(String, first(partner->Language:isoCode, getNLSDisplayLanguage())));
r_description := valueSetDescription(State, 10);
}
result.DESCRIPTION := r_description;
}
setNLSLanguage
Nazwa |
setNLSLanguages |
Opis |
setNLSLanguages ustawia zarówno bieżący język treści, jak i bieżący język wyświetlania. |
Podpisy |
setNLSLanguages(String language) |
Parametry |
language to kod ISO nowego języka treści i wyświetlania. |
Wynik |
Po wywołaniu zmieniane są języki zawartości i wyświetlania. Wielojęzyczne atrybuty wszystkich obiektów z repozytorium i bazy danych OLTP są następnie otwierane w zmienionym języku. Obiekty, które zostały otwarte przed wywołaniem funkcji, nie są zmieniane. |
Źródła błędów |
Brak |
Przykłady |
setNLSLanguages(„en”) ustawia bieżącą zawartość i język wyświetlania na angielski. setNLSLanguages(getCustomizingValue(„com.cisag.app.General”)->InternationalLanguge:isoCode) ustawia język treści i wyświetlania na język międzynarodowy przechowywany w funkcji konfiguracji Podstawowe dla klienta. setNLSLanguages(getCustomizingValue(„com.cisag.app.General”)->Company->AddressData->Country-> Language:isoCode) ustawia język treści i wyświetlania na język narodowy klienta. setNLSLanguages(parameters.object-> DeliveryCustomerData->CustomerPartner-> Language:isoCode) ustawia treść i język wyświetlania na język korespondencyjny odbiorcy dostawy zamówienia sprzedaży, do którego odwołuje się parameters.object. |
Kontekst |
ALL |
Uwagi |
Gdy użytkownik uruchamia proces, jest on wykonywany w kontekście treści i języków wyświetlania zapisanych w ustawieniach użytkownika. |
Zobacz także |
setNLSContentLanguage, setNLSDisplayLanguage |
function create()
{
var p_partner := parameters.PARTNER;
var r_description := „”;
var partner := loadPartner(p_partner);
if (not isNull(partner)) {
var company := getCustomizingValue(„com.cisag.app.General”):company;
var employers := loadTargetsOfPartnerRelations(partner:guid, company, „Employee”);
setNLSDisplayLanguage(cast(String, first(employers[0]->Language:isoCode, getNLSDisplayLanguage())));
r_description := valueSetDescription(„com.cisag.sys.workflow.ActivityState”, 10);
}
result.DESCRIPTION := r_description;
}
Funkcje dla plików
Polecenia i funkcje dla plików mogą być używane do odczytu i zapisu plików w Knowledge Store:
- readFile
- readTextFile
- writeFile
readFile
Nazwa |
readFile |
Opis |
readFile zwraca zawartość pliku jako strumień bajtów. |
Podpisy |
Bytes readFile(String path) |
Parametry |
path jest bezwzględną ścieżką do pliku. Plik można otworzyć z różnych źródeł:
|
Wynik |
Funkcja readFile zwraca zawartość pliku jako strumień bajtów. |
Źródła błędów |
Funkcja zwraca wartość zero, jeśli plik nie istnieje lub wystąpił błąd podczas odczytu. |
Przykłady |
readFile(„kstore:// + getDatabaseName() + „/Documents/Workflow/Mailtemplate_en.html”) zwraca zawartość pliku Test.txt jako bytestream (bajty). |
Kontekst |
ALL |
Uwagi |
Funkcję readFile można połączyć z poleceniem addMailAttachment, dzięki czemu funkcja readFile zwraca zawartość załącznika: addMailAttachment(„Anhang.txt”, readFile(„kstore://” + getDatabaseName() + „/Documents/Workflow/Mailtemplate_en.html „)) Na przykład, węzeł e-mail może wysłać do odbiorcy dokument już przechowywany w Knowledge Store. |
Zobacz także |
readTextFile, writeFile |
function create()
{
var p_item := parameters.ITEM;
var r_imageFiles as String;
var r_total_bytes as Number;
var imageFileName as String;
var imageFile as Bytes;
var item := loadItem(p_item);
if (not isNull(item)) {
/* pobierz obrazy przedmiotów */
var params as Unknown[];
add(params, 4);
add(params, item:number);
add(params, 1);
var entityImages := getCisObjectList(„SELECT FROM com.cisag.app.general.docman.obj.Document doc WHERE doc:status = ? AND doc:guid IN (SELECT ref:document FROM com.cisag.app.general.docman.obj.DocumentReference ref JOIN com.cisag.app.general.docman.obj.DocumentReferenceType typ ON ref:type = typ:guid JOIN com.cisag.app.general.obj.Item i ON ref:instance = i:guid WHERE i:number = ? and typ:type = ? and typ:code = „ENTITY_IMAGE”)”, params, 100);
for (document as CisObject(com.cisag.app.general.docman.obj.Document) : entityImages) {
imageFileName := document:folder + document:document;
imageFile := readFile(„kstore://” + databaseName() + „/Documents/” + imageFileName);
/* użyj addMailAttachment, aby dołączyć plik obrazu do wiadomości e-mail */
/*
addMailAttachment(document:document, imageFile);
*/
r_imageFiles := r_imageFiles + imageFileName + ” „;
}
result.ENTITY_IMAGES := trim(r_imageFiles);
}
}
readTextFile
Nazwa |
readTextFile |
Opis |
readTextFile zwraca zawartość pliku jako ciąg znaków. |
Podpisy |
Bytes readTextFile(String path) |
Parametry |
path jest bezwzględną ścieżką do pliku. Plik można otworzyć z różnych źródeł:
|
Wynik |
Funkcja readTextFile zwraca zawartość pliku jako ciąg znaków. |
Źródła błędów |
Funkcja zwraca wartość zero, jeśli plik nie istnieje lub wystąpił błąd podczas odczytu. |
Przykłady |
readFile(„kstore:// + getDatabaseName() + „/Documents/Workflow/Mailtemplate_en.html”) zwraca zawartość pliku Test.txt jako ciąg znaków. readFile(„http://www.zoll.de/SiteGlobals/Functions/Kurse/KursExport.xml?view=xmlexportkursesearchresultZOLLWeb&kursart=1&iso2code2=AU&startdatum_tag2=01& startdatum_monat2=01&startdatum_jahr2=2018&enddatum_tag2=31&enddatum_monat2 =12&enddatum_jahr2=2018&sort=asc&spalte=gueltigkeit”) zwraca kursy wymiany zgodnie z parametrami z Generalnej Dyrekcji Celnej w Bonn. readTextFile(„https://www.newyorkfed.org/medialibrary/media/xml/data/fx/EUR10.xml”) zwraca historyczne kursy wymiany Federalnej Rezerwy wymiany w Nowym Jorku Uwaga Comarch nie ponosi odpowiedzialności za linki zewnętrzne. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
readFile, writeFile |
function create()
{
var r_mailTemplate as String;
r_mailTemplate := readTextFile(„kstore://” + databaseName() + „/Documents/Workflow/” + „Mailtemplate_en.html”);
result.MAIL_TEMPLATE := r_mailTemplate;
}
writeFile
Nazwa |
writeFile |
Opis |
writeFile tworzy nowy plik z określoną zawartością w Knowledge Store. |
Podpisy |
writeFile(String path, Bytes content) writeFile(String path, String text) writeFile(String path, String text, String encoding) |
Parametry |
path jest bezwzględną ścieżką w Knowledge Store pliku, który ma zostać utworzony. Ścieżka musi zaczynać się od kstore://, np: kstore://ADV62010/Documents/Workflow/Test.txt. content to zawartość pliku, który ma zostać wygenerowany jako strumień bajtów, text to zawartość pliku, który ma zostać utworzony jako ciąg znaków. Kodowanie to kodowanie znaków text. Przykładami kodowania znaków są
Pełną dokumentację możliwych kodowań można znaleźć w dokumencie Java dla java.nio.charset.Charset. |
Wynik |
Polecenie writeFile tworzy nowy plik z określoną zawartością w Knowledge Store. Ścieżka do pliku jest określana w taki sam sposób, jak w przypadku funkcji readFile. Zawartość pliku może być binarna z typem danych Bytes lub ciąg znaków z typem danych String. Jeśli do pliku ma zostać zapisany ciąg znaków, opcjonalnie można określić kodowanie znaków. Jeśli kodowanie znaków nie jest określone, kodowanie znaków zależy od komputera, na którym działa serwer aplikacji. |
Źródła błędów |
Funkcja zwraca wartość zero, jeśli podczas zapisu wystąpi błąd. |
Przykłady |
writeFile(„kstore:// + getDatabaseName() + „/Documents/Workflow/Test.txt”, „Hello world!”, „UTF-8”) tworzy plik tekstowy w Knowledge Store. |
Kontekst |
ALL |
Uwagi |
Polecenie writeFile może być używane razem z funkcjami readTextFile i format, aby odczytać plik szablonu z symbolami zastępczymi, wypełnić je i zapisać gotowy plik w Knowledge Store. |
Zobacz także |
readFile, readTextFile |
function create()
{
var p_content := parameters.CONTENT;
var r_file as String;
var r_creator as String;
var r_creationDate as Timestamp;
var folder := „tmp/”;
var fileName := cast(String, newGuid()) + „.txt”;
writeFile(„kstore://” + databaseName() + „/” + folder + fileName, p_content, „UTF-8”);
var docs := getCisObjectList(„SELECT FROM com.cisag.sys.kstore.obj.KnowledgeDocument o WHERE o:pathName = ? ORDER BY o:creationDate DESC”, list(folder + fileName), 1);
for (doc as CisObject(com.cisag.sys.kstore.obj.KnowledgeDocument) : docs) {
r_creator := userName(doc:creator);
r_creationDate := doc:creationDate;
}
result.FILE_NAME := folder + fileName;
result.CREATOR := r_creator;
result.CREATION_DATE := r_creationDate;
}
Poniższy przykład pochodzi z definicji procesu dla tak zwanej inwentaryzacji zerowej, która importuje potwierdzenie inwentaryzacji dla pustego pojemnika magazynowego podczas kompletacji po tym, jak osoba kompletująca potwierdziła za pomocą zadania workflow, że pojemnik magazynowy był pusty po kompletacji.
Najpierw węzeł usługi odczytuje plik szablonu z Knowledge Store i dodaje do niego informacje specyficzne dla procesu. Plik jest następnie przechowywany w Knowledge Store pod inną nazwą, aby służyć jako plik importu dla potwierdzenia inwentaryzacji. Informacje wymagane do potwierdzenia spisu inwentarza z natury, takie jak identyfikacja spisu inwentarza z natury i lista zliczania zapasów, są przechowywane w zmiennych procesu.
var importFile as String;
function create()
{
/* pobierz partnera inicjatora procesu */
var userPartner := getByPrimaryKey(CisObject(com.cisag.app.general.obj.UserAssignment), userGuid(process.Initiator))->Partner:number;
/* odczyt pliku szablonu i zamiana parametrów */
var templateFile := „kstore://” + getDatabaseName() + „/” + „Documents/Workflow/EmptyStorageLocationsTemplate_Create.xml”;
var importFileContent := readTextFile(templateFile);
importFileContent :=
format(importFileContent,
list(userPartner, process.inventoryCountList:number, process.inventoryCount:number, process.inventoryCount->Type:code, process.warehouse:code, process.zone:code, process.location));
/* zapis pliku importu do folderu importu */
importFile := „kstore://” + getDatabaseName() + „/Documents/Workflow/EmptyStorageLocations/EmptyStorageLocation_” + + format(now(), „yyyyMMddHHmmssSSS”) + „_” + process.warehouse:code + „-” + process.zone:code + „-” + process.location + „.xml”;
writeFile(importFile, importFileContent, „UTF-8”);
}
W definicji działania węzła usługi aplikacja działająca w tle com.cisag.pgm.bi.Import jest przechowywana z następującymi wartościami parametrów aplikacji:
- ContentType – text/xml; charset=utf-8
- CorrectionMode – 1
- Baza danych – getDatabaseName()
- ErrorFileMode – 1
- FilterName – EMPTY_STORAGE_LOCATIONS
- ImportFile – importFile
- ImportFileMode – 1
- ObjectType – cisag.app.inventory.physical.obj.PhysicalInventoryCountList
- WarningsMode – 2
Opis parametrów aplikacji można znaleźć w rozdziale Import aplikacji dokumentu pomocy Interfejsy programowania wymiany danych.
W tym przykładzie użyto następującego pliku szablonu:
<?xml version=”1.0″ encoding=”UTF-8″?><semiramis xmlns=”com.cisag.app.inventory.physical.obj.PhysicalInventoryCountList” locale=”en-US-XMLSchemaCompliant” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”>.
<PhysicalInventoryCountList xmlns=”com.cisag.app.inventory.physical.obj.PhysicalInventoryCountList”>.
<ResponsibleEmployee>.
<numer>{0}</numer> <!– Numer partnera –>
</ResponsibleEmployee>.
<liczba>{1}</liczba> <!– Numer listy zliczania –>
<PhysicalInventory>
<liczba>{2}</liczba> <!– Liczba zapasów –>
<Typ>
<code>{3}</code> <!– Kod typu zliczania zapasów –>
</Type>
</PhysicalInventory>
<CountListReporting mode=”create”> <!– Tryb: create –>
<Przechowywanie>
<magazyn>{4}</magazyn> <!– Magazyn –>.
<strefa>{5}</strefa> <!– Strefa –>
<lokalizacja>{6}</lokalizacja> <!– Miejsce przechowywania –>
</storage>
</CountListReporting>.
</PhysicalInventoryCountList>.
</semiramis>
W poniższym przykładzie należy utworzyć definicję procesu, za pomocą której tworzone są podstawowe dane nowych pracowników wewnętrznych. Identyfikacja partnera ma być określona na podstawie schematu numeracji dla partnerów przechowywanych w konfiguracji.
Najpierw tworzona jest definicja procesu z węzłem skryptu do przechowywania pliku importu w Knowledge Store i węzłem usługi do importowania przechowywanego pliku przy użyciu aplikacji działającej w tle com.cisag.pgm.bi.Import.
W definicji działania dla węzła startowego należy wprowadzić pola wyników dla danych, które użytkownik musi lub może wprowadzić podczas uruchamiania procesu, np:
- Nazwisko i imię
- Adres wraz z kodem pocztowym i krajem
- Pracodawca i działalność
- Odpowiedzialny pracownik lub przełożony (poprzez relacje partnerskie)
Pola identyfikacyjne i obowiązkowe partnera można znaleźć w artykule Import partnerów.
W węźle początkowym generowany jest nowy numer na podstawie schematu numeracji partnerów zapisanych dla klienta w ustawieniach.
var company := getCustomizingValue(„com.cisag.app.General”):company;
var numberRange := getCustomizingValue(„com.cisag.app.general.Partners”, company):customerNumberRange;
var newNumber := nextNumberRangeNumber(numberRange);
Jeśli w konfiguracji nie zdefiniowano schematu numeracji, nowa liczba ma wartość zero. W takim przypadku należy wysłać komunikat o błędzie w funkcji walidacji za pomocą funkcji sendMessage, aby zapobiec rozpoczęciu procesu. Jeśli wprowadzono również pole wyniku dla numeru partnera, można wyświetlić komunikat o błędzie w zależności od jego wartości.
if (isNull(newNumber) and not validatePartner(results.partnerNumber))
sendMessage(results.partnerNumber_id, „EDU-00001”, list());
Użytkownik definiuje warunki dla numeru partnera wprowadzonego w funkcji validatePartner.
Funkcja zamykania umożliwia zapisanie wprowadzonych wyników w zmiennych procesu, które zostały wcześniej wprowadzone w definicji procesu. Na przykład, jeśli zarówno wynik, jak i zmienna procesu mają nazwę employeeFirstName, należy przenieść wartość w następujący sposób:
process.employeeFirstName := result.employeeFirstName;
Następnie utworzyć plik importu dla nowego pracownika w węźle skryptu. Najpierw użyć funkcji readTextFile, aby odczytać plik szablonu importu z Knowledge Store. Następnie użyć funkcji format, aby zastąpić symbole zastępcze w pliku szablonu wartościami do zaimportowania. Na koniec zapisać ukończony plik pod inną nazwą w Knowledge Store. Szczegółowy opis tych kroków można znaleźć w poprzednim przykładzie. Następnie zapisać pełną ścieżkę i nazwę pliku importu w zmiennej procesu.
W kolejnym węźle usługi zaimportować plik importu za pomocą aplikacji działającej w tle com.cisag.pgm.bi.Import.
Pomiędzy węzłem początkowym a węzłami skryptu i usługi dla importu można dodać kolejne węzły użytkownika w celu skompilowania informacji o nowym pracowniku. Do procesu można również dodać kolejne węzły działania w celu sprawdzenia i zatwierdzenia informacji przed ich zaimportowaniem.
Funkcje dla użytkowników (User functions)
Dane opisowe podstawowych obiektów, takich jak użytkownicy, bazy danych i serwery, są przechowywane w konfiguracyjnej bazie danych. Obiekty te są używane w całym systemie. Poniższe funkcje służą do rozwiązywania tych zastosowań:
- resolveRole
- userAbsent
- userFullName
- userGuid
- userMailAddress
- userName
resolveRole
Nazwa |
resolveRole |
Opis |
resolveRole zwraca identyfikatory użytkowników właścicieli roli workflow. |
Podpisy |
Guid[] resolveRole(Guid roleName) Guid[] resolveRole(String roleName) |
Parametry |
roleName to identyfikator roli workflow. |
Wynik |
Funkcja zwraca listę z identyfikatorami użytkowników właścicieli roli workflow roleName w bazie danych, w której funkcja jest wykonywana. |
Źródła błędów |
Właściciel roli workflow w bazie danych repozytorium nie może być określony w bazie danych OLTP i odwrotnie. Jeśli roleName nie jest prawidłową rolą workflow, zwracana jest wartość zero. |
Przykłady |
resolveRole(„SALES”) zwraca właścicieli roli workflow jako listę identyfikatorów. contains(resolveRole(„APPROVERS”), list(environment.userGuid)) zwraca wartość true w indywidualnym sprawdzeniu, czy użytkownik jest właścicielem roli workflow APPROVERS. Wyrażenia tego można użyć na przykład w celu zezwolenia na zmiany w dokumencie tylko dla określonych grup użytkowników lub posiadaczy zadań. Wyrażenie dla operatorów w definicji działania minus(resolveRole(„SALES”, list(parameters.userGuid)) tworzy zadanie dla właściciela roli workflow SALES. Funkcja minus oznacza, że żadne zadanie nie zostanie utworzone dla wyzwalacza przechowywanego w parameters.userGuid. Wyrażenie dla operatorów w definicji działania union(resolveRole(„SALES”, resolveRole(„SALESREPS”)) tworzy zadanie dla właścicieli obu ról workflow. Funkcja union oznacza, że tylko jedno zadanie jest tworzone dla użytkownika, który jest właścicielem obu ról workflow. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
function create()
{
var p_role := parameters.ROLE;
var r_users := „”;
var users := resolveRole(p_role);
if (not isNull(users)) {
for (u : users)
r_users := r_users + ” ” + userName(u);
}
result.IS_NULL := isNull(users);
result.USERS := substring(r_users, 1);
}
userAbsent
Nazwa |
userAbsent |
Opis |
userAbsent sprawdza, czy użytkownik jest nieobecny. |
Podpisy |
Boolean userAbsent(Guid user) Boolean userAbsent(Guid user, Timestamp time) Boolean userAbsent(Guid user, Timestamp from, Timestamp until) |
Parametry |
user to Guid lub nazwa użytkownika. time to punkt w czasie obserwacji. from oznacza początek analizowanego okresu. to oznacza koniec okresu obserwacji. |
Wynik |
Jeśli użytkownik jest nieobecny, funkcja zwraca wartość prawdy true, w przeciwnym razie false. Jeśli za pomocą parametru time zostanie przekazany czas obserwacji, ocena zostanie przeprowadzona dla tego czasu. Jeśli okres obserwacji jest przekazywany za pomocą parametrów from i until, użytkownik jest uważany za nieobecnego, jeśli jest nieobecny w dowolnym momencie w okresie obserwacji. Jeśli user nie jest prawidłowym użytkownikiem, zwracana jest wartość false. |
Źródła błędów |
Brak. |
Przykłady |
userAbsent(userGuid(„JOB”)) zwraca wartość prawdy true, jeśli użytkownik JOB jest nieobecny w bieżącym czasie. userAbsent(userGuid(„JOB”), addDays(now(), 7)) zwraca wartość true, jeśli użytkownik jest nieobecny dokładnie za siedem dni. userAbsent(userGuid(„JOB”), now(), addDays(endOfDay(now()), 13)) zwraca wartość true, jeśli użytkownik jest nieobecny w dowolnym momencie w ciągu następnych 14 dni kalendarzowych. Wyrażenie dla operatorów cast(Guid, if(not(userAbsent(parameters.userGuid)), list(parameters.userGuid), substitute(parameters.userGuid))) przypisuje działaniu dla zdarzenia typu Jednostka biznesowa do wyzwalacza. Jeśli wyzwalacz jest nieobecny, działanie jest przypisywane do zamiennika. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
function create()
{
var p_workflowRole := parameters.WORKFLOW_ROLE;
var p_time := parameters.TIME;
var p_from := parameters.FROM;
var p_until := parameters.UNTIL;
var r_nonAbsentUsers := „”;
var holders := resolveRole(p_workflowRole);
if (not isNull(holders)) {
holders := removeAbsentUsers(holders, p_time, p_from, p_until);
for (user : holders) {
r_nonAbsentUsers := r_nonAbsentUsers + ” ” + userName(user);
}
}
result.NON_ABSENT_USERS := trim(r_nonAbsentUsers);
}
function removeAbsentUsers(p_users as Guid[], p_time as Timestamp, p_from as Timestamp, p_until as Timestamp) as Guid[]
{
var nonAbsentUsers as Guid[];
for (user : p_users) {
if (p_time <> UNDEFINED_DATE) {
if (not userAbsent(user, p_time))
add(nonAbsentUsers, user);
} else if (p_from <> UNDEFINED_DATE and p_until <> UNDEFINED_DATE) {
if (not userAbsent(user, p_from, p_until))
add(nonAbsentUsers, user);
} else {
if (not userAbsent(user))
add(nonAbsentUsers, user);
}
}
return nonAbsentUsers;
}
userFullName
Nazwa |
userFullName |
Opis |
userFullName zwraca pełną nazwę użytkownika. |
Podpisy |
String userFullName(Guid user) |
Parametry |
user to identyfikator użytkownika. |
Wynik |
Pełna nazwa użytkownika przechowywana w aplikacji Panel System. Jeśli user nie jest prawidłowym użytkownikiem, zwracany jest pusty ciąg znaków. |
Źródła błędów |
Brak. |
Przykłady |
userFullName(userGuid(„JOB”)) zwraca pełną nazwę użytkownika. userFullName(parameters.userGuid) zwraca pełną nazwę użytkownika, który wywołał zdarzenie typu Jednostka biznesowa lub Działanie użytkownika lub rozpoczął proces bez definicji zdarzenia. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
userName |
function create()
{
var p_userName := parameters.USER_NAME;
var r_userFullName := „”;
var userGuid := userGuid(p_userName);
if (userGuid <> INVALID_GUID)
r_userFullName := userFullName(userGuid);
result.USER_FULL_NAME := r_userFullName;
}
userGuid
Nazwa |
userGuid |
Opis |
userGuid zwraca identyfikator Guid użytkownika. |
Podpisy |
String userGuid(String user) |
Parametry |
user to nazwa użytkownika. |
Wynik |
Identyfikator Guid użytkownika. Jeśli user nie jest prawidłowym użytkownikiem, zwracana jest wartość INVALID_GUID. |
Źródła błędów |
Brak. |
Przykłady |
userGuid(„JOB”) zwraca identyfikator Guid użytkownika. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
userName |
function create()
{
var p_userName := parameters.USER_NAME;
var r_userGuid := „”;
var userGuid := userGuid(p_userName);
if (userGuid <> INVALID_GUID)
r_userGuid := cast(String, userGuid);
result.USER_GUID := r_userGuid;
}
Poniższy przykład z definicji działania help.userDeactivated usuwa wszystkich nieaktywnych użytkowników z listy właścicieli ról workflow:
function create()
{
var p_workflowRole := parameters.WORKFLOW_ROLE;
var r_deactivatedUsers := „”;
var holders := resolveRole(p_workflowRole);
if (not isNull(holders)) {
holders := removeDeactivatedUsers(holders);
for (user : holders) {
r_deactivatedUsers := r_deactivatedUsers + ” ” + userName(user);
}
}
result.DEACTIVATED_USERS := trim(r_deactivatedUsers);
}
function userDeactivated(p_user as Guid) as Boolean
{
var r_userDeactivated := false;
var user := getByPrimaryKey(„CONFIGURATION”, CisObject(com.cisag.sys.configuration.obj.User), p_user);
if (not isNull(user)) {
r_userDeactivated := user:deactivated;
}
return r_userDeactivated;
}
function removeDeactivatedUsers(p_users as Guid[]) as Guid[]
{
var activatedUsers as Guid[];
for (user : p_users) {
if (not userDeactivated(user))
add(activatedUsers, user);
}
return activatedUsers;
}
Poniższy przykład z definicji działania help.userInteractive usuwa wszystkich nieinteraktywnych użytkowników z listy właścicieli ról workflow:
const UserType as valueSet(com.cisag.sys.configuration.UserType);
function create()
{
var p_workflowRole := parameters.WORKFLOW_ROLE;
var r_nonInteractiveUsers := „”;
var holders := resolveRole(p_workflowRole);
if (not isNull(holders)) {
holders := removeNonInteractiveUsers(holders);
for (user : holders) {
r_nonInteractiveUsers := r_nonInteractiveUsers + ” ” + userName(user);
}
}
result.NON_INTERACTIVE_USERS := trim(r_nonInteractiveUsers);
}
function userInteractive(p_user as Guid) as Boolean
{
var r_userInteractive := false;
var user := getByPrimaryKey(„CONFIGURATION”, CisObject(com.cisag.sys.configuration.obj.User), p_user);
if (not isNull(user)) {
r_userInteractive := user:type = UserType.INTERACTIVE;
}
return r_userInteractive;
}
function removeNonInteractiveUsers(p_users as Guid[]) as Guid[]
{
var interactiveUsers as Guid[];
for (user : p_users) {
if (userInteractive(user))
add(interactiveUsers, user);
}
return interactiveUsers;
}
userMailAddress
Nazwa |
userMailAddress |
Opis |
userMailAddress zwraca adres e-mail użytkownika. |
Podpisy |
String userMailAddress(Guid user) |
Parametry |
user to identyfikator użytkownika. |
Wynik |
Adres e-mail użytkownika wprowadzony w aplikacji Panel System. Jeśli dla użytkownika wprowadzono więcej niż jeden adres e-mail, wszystkie adresy e-mail są zwracane z takim samym separatorem (średnikiem) jak w dialogu systemowym. Separator ten jest również akceptowany przez funkcje wysyłania wiadomości e-mail, takie jak setMailRecipientsTo i setMailReplyTo. Jeśli w dialogu systemu nie zapisano adresu e-mail użytkownika, zwracany jest pusty ciąg znaków. Jeśli user nie jest prawidłowym użytkownikiem, zwracany jest pusty ciąg znaków. |
Źródła błędów |
Brak. |
Przykłady |
userMailAddress(userGuid(„JOB”)) zwraca adres e-mail użytkownika. userMailAddress(parameters.userGuid) zwraca adres e-mail użytkownika, który wywołał zdarzenie typu Jednostka biznesowa lub Działanie użytkownika lub rozpoczął proces bez definicji zdarzenia. setMailRecipientsTo(userMailAddress(parameters.userGuid)) w definicji działania typu Wiadomość e-mail, wysyła wiadomość e-mail na adres e-mail użytkownika, który wywołał zdarzenie lub rozpoczął proces. setMailRecipientsCC(userMailAddress(superior(parameters.userGuid)[0])) wysyła kopię wiadomości e-mail do przełożonego użytkownika, który wywołał zdarzenie lub rozpoczął proces. |
Kontekst |
ALL |
Uwagi |
Workflow używa adresu e-mail przechowywanego w aplikacji Panel System do wysyłania powiadomień do operatorów i właścicieli procesów. Wiadomość e-mail może zostać wysłana na adres e-mail zapisany w danych podstawowych partnera tylko wtedy, gdy używana jest definicja działania typu Wiadomość e-mail, Węzeł e-mail lub Interaktywny węzeł e-mail, a adres e-mail jest jawnie określony za pomocą funkcji setMailRecipientsTo. |
Zobacz także |
function create()
{
var p_userName := parameters.USER_NAME;
var r_userMailAddress := „”;
var userGuid := userGuid(p_userName);
if (userGuid <> INVALID_GUID)
r_userMailAddress := userMailAddress(userGuid);
result.USER_MAIL_ADDRESS := r_userMailAddress;
}
userName
Nazwa |
userName |
Opis |
userName zwraca nazwę użytkownika. |
Podpisy |
String userName(Guid user) |
Parametry |
user to identyfikator użytkownika. |
Wynik |
Nazwa użytkownika z aplikacji Panel System. Jeśli user nie jest prawidłowym użytkownikiem, zwracany jest pusty ciąg znaków. |
Źródła błędów |
Brak. |
Przykłady |
userName(userGuid(„JOB”)) zwraca JOB. userName(parameters.userGuid) zwraca nazwę użytkownika, który wywołał zdarzenie lub rozpoczął proces. userName(environment.userGuid) zwraca nazwę użytkownika, dla którego przeprowadzana jest kontrola indywidualna. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
userFullName, userGuid |
function create()
{
var r_userName := „”;
var company := loadOrganisation(getCustomizingValue(„com.cisag.app.General”):company);
r_userName := userName(company:updateInfo.createUser);
result.USER_NAME := r_userName;
}
Polecenia wyzwalania zdarzeń (Workflow events functions)
Zdarzenia workflow mogą być wyzwalane w aktywnej bazie danych lub w bazie danych repozytorium przy użyciu funkcji wyzwalania zdarzeń. Funkcje wyzwalania zdarzeń obejmują
- fireEvent
- fireRepositoryEvent
fireEvent
Nazwa |
fireEvent |
Opis |
fireEvent wywołuje ogólne zdarzenie w bieżącej bazie danych. |
Podpisy |
boolean fireEvent(String name, HashMap parameters) boolean fireEvent(String database, String name, HashMap parameters) boolean fireEvent(Number subtype, String name, HashMap parameters) boolean fireEvent(String database, Number subtype, String name, HashMap parameters) |
Parametry |
database to nazwa bazy danych podłączonej do systemu, w którym ma zostać wyzwolone zdarzenie ogólne. Jeśli database nie zostanie określone, zdarzenie generyczne zostanie wywołane w bieżącej bazie danych. subtype to podtyp zdarzenia ogólnego. Jeśli subtype nie jest dozwolonym podtypem, używany jest podtyp 0. Podtyp 0 jest również używany w przypadku wywołania funkcji bez parametru subtype. name to dowolnie wybierana identyfikacja zdarzenia, której można użyć do rozróżnienia różnych zdarzeń. Jeśli użytkownik tworzy definicję działania, która reaguje na zdarzenie ogólne, może zapytać o nazwę w warunku przejścia, aby sprawdzić znaczenie zdarzenia. Aby zsynchronizować ze sobą dwa procesy, należy wybrać unikalną nazwę, taką jak Guid działania, która wyzwala zdarzenie lub Guid utworzony za pomocą funkcji newGuid. Kolejny krok procesu typu zdarzenie pośrednie czeka, aż wywołane działanie lub proces wyzwoli zdarzenie ogólne, tym razem z przekazanym identyfikatorem Guid (Promise) jako nową nazwą. parameters to tablica mieszająca, która może zawierać dowolne wartości parametrów dla wywoływanego działania lub procesu. |
Wynik |
Funkcja fireEvent wywołuje zdarzenie com.cisag.pgm.workflow.GenericOLTPEvent dla działania w bazie danych OLTP oraz zdarzenie com.cisag.pgm.workflow.GenericRepositoryEvent dla działania w bazie danych repozytorium. |
Źródła błędów |
database musi być prawidłową bazą danych OLTP podłączoną do systemu. Aby wywołać zdarzenie w bazie danych repozytorium, należy użyć funkcji fireRepositoryEvent. |
Przykłady |
fireEvent(activity:code, hashMap(user:=userName(parameters.userGuid), order:=parameters.object:guid)) wyzwala zdarzenie generyczne w definicji działania z definicją zdarzenia typu Jednostka biznesowa i przekazuje identyfikację działania jako nazwę oraz nazwę wyzwalającego użytkownika, a także klucz główny zmienionego obiektu biznesowego jako parametry. fireEvent(7, „”, hashMap()) wywołuje zdarzenie ogólne z podtypem 7 i bez identyfikacji i parametrów. fireEvent(db, 7, „”, hashMap()) wywołuje zdarzenie generyczne o podtypie 7 w bazie danych o nazwie przechowywanej w zmiennej db. fireEvent(„NotifyByMail”, hashMap(recipient:=process.Initiator, textModule:=”PROCDONE”, process:=process.Code) wyzwala zdarzenie ogólne w celu wysłania wiadomości e-mail do wyzwalacza procesu. Identyfikacja definicji działania jest przekazywana jako nazwa. Wywołana definicja działania wykorzystuje parametry warunku przejścia transition.name = definition:code. |
Kontekst |
ALL |
Uwagi |
Można także użyć fireEvent w poszczególnych kontrolach, np. aby wysłać powiadomienie w przypadku określonych konstelacji danych lub rozpocząć proces zatwierdzania w przypadku próby zwolnienia bez autoryzacji. Jeśli określono podtyp, warunek przejścia jest oceniany tylko wtedy, gdy ten sam podtyp został wybrany w definicji działania. Należy użyć podtypów, aby zmniejszyć liczbę warunków przejścia, które mają zostać ocenione. Jeśli na przykład dziesięć definicji działania jest zarejestrowanych dla zdarzenia ogólnego, ale tylko jedna z nich ma wygenerować działanie, gdy zdarzenie zostanie rozwiązane, wówczas użycie podtypów może zmniejszyć liczbę ocenianych warunków przejścia o 90%. |
Zobacz także |
fireRepositoryEvent |
function create()
{
var p_message := parameters.MESSAGE;
if (p_message = „”)
p_message := „Czy ktoś tam jest?”;
var params := new(HashMap);
params.sender := „SETI”; /* Wyszukiwanie przechwytywaczy wyzwalaczy zdarzeń */
params.message := p_message;
fireEvent(definition:code, params);
}
Poniższy przykład z definicji działania help.fireEvent.catch opisuje, w jaki sposób definicja działania może przechwycić i ocenić ogólne zdarzenie z poprzedniego przykładu. Nazwa zdarzenia jest sprawdzana w warunku przejścia. Tylko jeśli identyfikacja definicji działania (tutaj: help.fireEvent.catch) zaczyna się od nazwy zdarzenia (tutaj: help.fireEvent), generowane jest działanie.
startsWith(definition:code, parameters.name)
Pozostałe parametry zdarzenia są oceniane w deklaracjach, a temat działania jest formatowany:
function create()
{
var p_params := parameters.parameters;
formatSubject(„sender”, cast(String, p_params.sender));
formatSubject(„message”, cast(String, p_params.message));
}
Poniższy przykład z definicji procesu wyzwala zdarzenie generyczne com.cisag.pgm.workflow.GenericOLTPEvent w bieżącej bazie danych w celu uruchomienia podprocesu ApproveGenericRequest. Identyfikacja definicji działania, dla której zdarzenie jest wyzwalane, jest używana jako nazwa zdarzenia. Identyfikacja działania jest również przekazywana jako parametr zdarzenia, dzięki czemu wywołany podproces może użyć identyfikacji jako nazwy zdarzenia podczas zwracania wyników. Ponieważ identyfikacja działania nie jest dostępna w funkcji create(), proces wyższego poziomu wyzwala zdarzenie tylko w funkcji close().
function close(state as Number)
{
/* Zapisanie kodu działania do przetworzenia (niedostępne podczas tworzenia) */
process.activityCode := activity:code;
/* Zbuduj parametr HashMap */
var params := new(HashMap);
params.caller := activity:code;
params.requester := process.Initiator;
params.beneficiary := process.employee->Partner:number;
params.superior := process.superior->Partner:number;
params.resourceType := process.resourceType;
params.requestedResources := process.requestedResources;
params.comment := process.comment;
params.notificationRecipients := list(process.Initiator);
params.activityWorkDuration := 3600 * 24 * 7;
params.activityPriority := 5;
/* Rozpoczęcie podprocesu */
fireEvent(„ApproveGenericRequest”, params);
}
Po wywołaniu zdarzenie pośrednie w procesie nadrzędnym oczekuje na zwrócenie wyników z procesu podrzędnego przy użyciu zdarzenia generycznego com.cisag.pgm.workflow.GenericOLTPEvent. Warunek przejścia w węźle pośrednim sprawdza, czy zdarzenie używa wcześniej przekazanego parametru caller jako nazwy:
parameters.name = process.activityCode
Podprocesy mają nie tylko tę zaletę, że ogólne kroki procesu, które występują w kilku procesach, można podsumować w celu uproszczenia wdrażania i konserwacji. Podproces może również mieć ustawienia autoryzacji, które różnią się od definicji procesu wyższego poziomu. Oznacza to, że na przykład proces onboardingu dla nowych pracowników może być lepiej chroniony przed nieautoryzowanym dostępem. Działania w działach HR i IT, które często obejmują dane osobowe i poufne, mogą być mapowane jako podprocesy, aby zachować je w tajemnicy przed innymi pracownikami w procesie wdrażania. Aby zwiększyć bezpieczeństwo, oba procesy mogą szyfrować wymieniane dane za pomocą funkcji szyfrowania i odszyfrowywania.
Używając następującej definicji działania JavaScript help.js.getProcessParameter typu Wywołanie funkcji, wywołujący proces wyższego poziomu może ocenić dowolne zmienne procesowe wywołanego procesu podrzędnego.
/* Zwraca wartość zmiennej procesu
* Parametry:
* PROCESS: Guid lub kod instancji procesu
* PARAMETER: nazwa zmiennej procesu
* Wyniki:
* DATATYPE: typ danych wyniku:
* 1 = String (użyj result.STRING)
* 2 = Liczba (użyj result.NUMBER)
* 3 = Boolean (użyj result.STRING lub result.NUMBER)
* 4 = Guid, Bajty (użyj result.STRING)
* 5 = CisObject, CisObjectReference (użyj instancji
* string in result.STRING)
* 7 = Lista, (użyj result.STRING)
* 8 = Znacznik czasu (użyj result.TIMESTAMP)
* 9 = HashMap (użyj result.STRING)
* 10 = CisObjectReference (nieużywane)
* 11 = CisDate (użyj result.TIMESTAMP)
* 103 = Nieznany
* STRING: wynik dla typów danych:
* String, Guid, Bytes, CisObject, CisObjectReference,
* Lista, HashMap
* NUMBER: wynik dla typów danych: Number, Boolean
* TIMESTAMP: wynik dla typów danych: Timestamp, CisDate
*/
function create() {
var p_process = parameters.PROCESS; /* Guid procesu lub kod */
var p_parameter = parameters.PARAMETER; /* nazwa parametru */
var env = Java.type(„com.cisag.pgm.appserver.CisEnvironment”).getInstance();
var om = env.getObjectManager();
var processGuid = p_process.length() == 32 ? Java.type(„com.cisag.pgm.datatype.Guid”).fromHexString(p_process) : null;
var Process = Java.type(„com.cisag.sys.workflow.obj.Process”);
if (processGuid == null) {
var oProcess = om.getObject(Process.buildByCodeKey(p_process));
if (oProcess != null)
processGuid = oProcess.getGuid();
}
if (processGuid == null)
powrót;
var proc = om.getObject(Process.buildPrimaryKey(processGuid));
var parserLogic = Java.type(„com.cisag.pgm.util.ParserLogic”).getInstance(10, 1);
var parserEnvironment = parserLogic.deserialzeEnvironment(proc.getParameters().getBinaryStream());
var data = parserEnvironment.get(„process”).getHashMap();
var obj = data.get(p_parameter);
if (obj != null) {
result.DATATYPE = obj.getDatatype();
result.STRING = obj.getString();
result.TIMESTAMP = obj.getTimestamp();
result.NUMBER = obj.getNumber();
if (obj.getDatatype() == 5 || obj.getDatatype() == 10) /* BO lub BO-REFERENCE */
result.STRING = obj.getCisObject().get_instanceString();
if (obj.getDatatype() == 3) /* Boolean */
result.NUMBER = obj.getString() == „true” ? 1 : 0;
}
}
Możliwe są również asynchroniczne podprocesy. W funkcji close() węzła startowego, podproces zwraca guid lub identyfikator (tzw. Promise) do procesu nadrzędnego synchronicznie. Oba procesy mogą następnie kontynuować działanie asynchronicznie. Proces nadrzędny sprawdza status procesu podrzędnego. Jeśli proces podrzędny jest ukończony, proces nadrzędny wysyła zapytanie o jego wyniki.
Poniższa definicja działania help.js.getProcessParameter.call zapisana w języku skryptowym systemu stanowi przykład tego, jak można wywołać definicję działania help.js.getProcessParameter zapisaną w JavaScript:
function create()
{
var p_process := parameters.PROCESS;
var p_parameter := parameters.PARAMETER;
var r_datatype := 0;
var r_string := „”;
var r_number := 0;
var r_timestamp := UNDEFINED_DATE;
var params := new(HashMap);
params.PROCESS := p_process;
params.PARAMETER := p_parameter;
var parameterValue := call(„help.js.getProcessParameter”, params);
result.DATATYPE := cast(Number, parameterValue.DATATYPE);
result.STRING := cast(String, parameterValue.STRING);
result.NUMBER := cast(Number, parameterValue.NUMBER);
result.TIMESTAMP := cast(Timestamp, parameterValue.TIMESTAMP);
}
fireRepositoryEvent
Nazwa |
fireRepositoryEvent |
Opis |
fireRepositoryEvent wywołuje ogólne zdarzenie w bazie danych repozytorium. |
Podpisy |
boolean fireRepositoryEvent(String name, HashMap parameters) boolean fireRepositoryEvent(Number subtype, String name, HashMap parameters) |
Parametry |
subtype to podtyp zdarzenia ogólnego. Jeśli subtype nie jest dozwolonym podtypem, używany jest podtyp 0. Podtyp 0 jest również używany w przypadku wywołania funkcji bez parametru subtype. name to dowolnie wybierana identyfikacja zdarzenia, której można użyć do rozróżnienia różnych zdarzeń. Jeśli użytkownik tworzy definicję działania, która reaguje na zdarzenie ogólne, może zapytać o nazwę w warunku przejścia, aby sprawdzić znaczenie zdarzenia. parameters to tablica hash, która może zawierać dowolne wartości parametrów. |
Wynik |
Funkcja fireRepositoryEvent wyzwala zdarzenie com.cisag.pgm.workflow.GenericRepositoryEvent w bazie danych repozytorium, gdy działanie występuje zarówno w bazie danych repozytorium, jak i w bazie danych OLTP. |
Źródła błędów |
Brak. |
Przykłady |
fireRepositoryEvent(„NotifyTrainer”, hashMap(student:=userName(parameters.userGuid), exercise:=results.EXERCISE, status:=”DONE”, comment:=results.COMMENT) uruchamia ogólne zdarzenie informujące trenera w CEE Academy, że uczestnik szkolenia ukończył ćwiczenie. fireRepositoryEvent(7, „”, hashMap()) wywołuje zdarzenie generyczne z podtypem 7 i bez identyfikacji i parametrów. |
Kontekst |
ALL |
Uwagi |
Jeśli określono podtyp, warunek przejścia jest oceniany tylko wtedy, gdy ten sam podtyp został wybrany w definicji działania. Nalezy użyć podtypów, aby zmniejszyć liczbę warunków przejścia, które mają zostać ocenione. Jeśli na przykład dziesięć definicji działania jest zarejestrowanych dla zdarzenia ogólnego, ale tylko jedna z nich ma wygenerować działanie, gdy zdarzenie zostanie rozwiązane, wówczas użycie podtypów może zmniejszyć liczbę ocenianych warunków przejścia o 90%. |
Zobacz także |
fireEvent |
function create()
{
var p_message := parameters.MESSAGE;
if (p_message = „”)
p_message := „Czy ktoś tam jest?”;
var params := new(HashMap);
params.sender := „SETI”; /* Wyszukiwanie przechwytywaczy wyzwalaczy zdarzeń */
params.message := p_message;
fireRepositoryEvent(definition:code, params);
}
Funkcje systemowe i konfiguracyjne (System and Configuration functions)
Funkcje systemowe i konfiguracyjne zwracają status systemu i właściwości bazy danych konfiguracji. Funkcje systemowe i konfiguracyjne obejmują:
- databaseName
- memoryLevel
- objectName
- serverLinkTarget
- serverName
- systemName
- versionString
databaseName
Nazwa |
databaseName |
Opis |
databaseName zwraca nazwę bazy danych. |
Podpisy |
String databaseName(Guid database) |
Parametry |
database to identyfikator bazy danych. |
Wynik |
Nazwa bazy danych w czytelnej formie jako ciąg znaków. |
Źródła błędów |
Brak. |
Przykłady |
databaseName(event.database) zwraca nazwę bazy danych, w której zdarzenie zostało wywołane. |
Kontekst |
ALL |
Uwagi |
Na przykład, identyfikator bazy danych jest przekazywany w parametrze zdarzenia event.database dla zdarzeń typu Jednostka biznesowa i Zaprogramowane zdarzenie. |
Zobacz także |
function create()
{
var p_guid := parameters.GUID;
var r_databaseName := „”;
var databaseGuid := cast(Guid, p_guid);
if (not isNull(databaseGuid))
r_databaseName := databaseName(databaseGuid);
result.DATABASE_NAME := r_databaseName;
}
Poniższy przykład z definicji działania JavaScript help.js.getDatabaseGuid określa identyfikator bazy danych i zwraca jej nazwę:
function create()
{
var cisEnvironment = Java.type(„com.cisag.pgm.appserver.CisEnvironment”).getInstance();
result.NAME = functions.databaseName(cisEnvironment.getDatabaseGuid());
}
memoryLevel
Nazwa |
memoryLevel |
Opis |
memoryLevel zwraca bieżący poziom ostrzegawczy pamięci serwera aplikacji. |
Podpisy |
Number memoryLevel() Number memoryLevel(Guid svmGuid) |
Parametry |
svmGuid to identyfikator serwera aplikacji. |
Wynik |
Bieżący poziom ostrzeżenia pamięci jako liczba całkowita. Możliwe poziomy ostrzeżeń pamięci są zdefiniowane w ValueSet com.cisag.sys.kernel.MemoryLevel: 1. W porządku 2. Ostrzeżenie 3. Niski 4. Krytyczny |
Źródła błędów |
Brak |
Przykłady |
valueSetDescription(„com.cisag.sys.kernel.MemoryLevel”, memoryLevel()) zwraca poziom ostrzeżenia o pamięci bieżącego serwera aplikacji. |
Kontekst |
ALL |
Uwagi |
Poziom ostrzeżenia o przechowywaniu jest również wyświetlany w aplikacji Panel System. |
Zobacz także |
function create()
{
var p_svmGuid := parameters.SVM_GUID;
var r_memoryLevel := „”;
if (p_svmGuid = „”)
r_memoryLevel := valueSetDescription(„com.cisag.sys.kernel.MemoryLevel”, memoryLevel());
else
r_memoryLevel := valueSetDescription(„com.cisag.sys.kernel.MemoryLevel”, memoryLevel(cast(Guid, p_svmGuid)));
result.MEMORY_LEVEL := r_memoryLevel;
}
objectName
Nazwa |
objectName |
Opis |
objectName zwraca pełną nazwę techniczną obiektu deweloperskiego. |
Podpisy |
String objectName(Guid objectGuid) |
Parametry |
objectGuid to identyfikator obiektu deweloperskiego. |
Wynik |
Pełna nazwa techniczna obiektu deweloperskiego, w tym jego ścieżka nazwy w postaci ciągu znaków. |
Źródła błędów |
Brak |
Przykłady |
objectName(event.Guid) zwraca pełną nazwę techniczną zaprogramowanego zdarzenia lub jednostki biznesowej. substring(objectName(event.guid), lastIndexOf(objectName(event.guid), „.”) + 1) zwraca nazwę techniczną zaprogramowanego zdarzenia lub jednostki biznesowej bez jej obszaru nazw. |
Kontekst |
ALL |
Uwagi |
Dane opisowe wszystkich obiektów deweloperskich są przechowywane w bazie danych repozytorium. |
Zobacz także |
function create()
{
var p_guid := parameters.GUID;
var r_objectName := „”;
var objectGuid := cast(Guid, p_guid);
if (not isNull(objectGuid))
r_objectName := objectName(objectGuid);
result.OBJECT_NAME := r_objectName;
}
serverLinkTarget
Nazwa |
serverLinkTarget |
Opis |
Zwraca nazwę serwera docelowego dla atrybutów linków. |
Podpisy |
serverLinkTarget() serverLinkTarget(Guid user) |
Parametry |
user to identyfikator użytkownika, dla którego ma zostać określony serwer docelowy. Serwer docelowy może zależeć od użytkownika. |
Wynik |
Funkcja zwraca nazwę serwera docelowego dla atrybutów linków (links) jako ciąg znaków. Serwer docelowy zależy od serwera aplikacji, na którym wykonywana jest funkcja. |
Źródła błędów |
Brak. |
Przykłady |
serverLinkTarget() zwraca nazwę serwera aplikacji, na którym wykonywana jest funkcja. serverLinkTarget(parameters.userGuid) zwraca nazwę serwera aplikacji, który jest używany dla atrybutów linków dla użytkownika, który wywołał zdarzenie dla definicji działania z definicją zdarzenia typu Jednostka biznesowa lub Działanie użytkownika. |
Kontekst |
ALL |
Uwagi |
W systemach z tylko jednym serwerem aplikacji dalsza konfiguracja nie jest konieczna. Serwerem docelowym jest serwer aplikacji, na którym uruchomiony jest silnik workflow. Jeśli system składa się z kilku serwerów aplikacji, należy wprowadzić serwer aplikacji dialogu w polu Docelowy serwer dla atrybutów linka dla wszystkich serwerów aplikacji w aplikacji Panel System. Serwer ten jest używany dla wszystkich łączy w wiadomościach e-mail workflow wysyłanych przez serwer wiadomości. Jeśli serwer docelowy jest zależny od użytkownika, można również przypisać serwery docelowe specyficzne dla roli workflow w aplikacji Role workflow. |
Zobacz także |
function create()
{
var p_user := parameters.USER;
var r_serverLinkTarget := „”;
var u := userGuid(p_user);
if (not isNull(u))
r_serverLinkTarget := serverLinkTarget(u);
else
r_serverLinkTarget := serverLinkTarget();
result.SERVER_LINK_TARGET := r_serverLinkTarget;
}
serverName
Nazwa |
serverName |
Opis |
serverName zwraca nazwę serwera aplikacji. |
Podpisy |
String serverName(Guid server) |
Parametry |
server to identyfikator Guid serwera. |
Wynik |
Nazwa serwera w czytelnej formie jako ciąg znaków. |
Źródła błędów |
Brak. |
Przykłady |
serverName(cast(Guid, „01200477BA652A10B51EAD1BAA7C0000”) zwraca ADV600. |
Kontekst |
ALL |
Uwagi |
Guid serwera jest wyświetlany w aplikacji Panel System. Można również użyć funkcji serverLinkTarget, aby określić nazwę serwera aplikacji, na którym działa silnik workflow. |
Zobacz także |
|
function create()
{
var p_guid := parameters.GUID;
var r_serverName := „”;
var serverGuid := cast(Guid, p_guid);
if (not isNull(serverGuid))
r_serverName := serverName(serverGuid);
result.SERVER_NAME := r_serverName;
}
Poniższy przykład z definicji działania help.js.getServerName zapisanej w JavaScript określa nazwę serwera aplikacji:
function create()
{
var serverInfo = Java.type(„com.cisag.pgm.util.ServerInfo”);
result.NAME = serverInfo.getSVMName();
}
systemName
Nazwa |
systemName |
Opis |
systemName zwraca nazwę systemu. |
Podpisy |
String systemName(Guid system) |
Parametry |
system to identyfikator systemu. |
Wynik |
Nazwa systemu w czytelnej formie jako ciąg znaków. |
Źródła błędów |
Brak. |
Przykłady |
systemName(cast(Guid, „4200C7558F652A1096A3AD1BA8550000”)) zwraca ADV600. |
Kontekst |
ALL |
Uwagi |
Identyfikator Guid systemu jest wyświetlany w aplikacji Panel System. |
Zobacz także |
function create()
{
var p_guid := parameters.GUID;
var r_systemName := „”;
var systemGuid := cast(Guid, p_guid);
if (not isNull(systemGuid))
r_systemName := systemName(systemGuid);
result.SYSTEM_NAME := r_systemName;
}
Poniższy przykład z definicji działania help.js.getSystemName utworzonej w JavaScript określa nazwę bieżącego systemu:
function create()
{
var serverInfo = Java.type(„com.cisag.pgm.util.ServerInfo”);
result.NAME = serverInfo.getSystemName();
}
Poniższy przykład z definicji działania help.js.getSystemDevelopmentPrefix zapisanej w JavaScript określa prefiks rozwoju bieżącego systemu:
function create()
{
var serverInfo = Java.type(„com.cisag.pgm.util.ServerInfo”);
result.PREFIX = serverInfo.getSystemDevelopmentPrefix();
}
versionString
Nazwa |
versionString |
Opis |
versionString zwraca wersję obiektu deweloperskiego. |
Podpisy |
String versionString(Guid versionGuid) |
Parametry |
versionGuid to identyfikator wersji obiektu deweloperskiego. |
Wynik |
Wersja obiektu deweloperskiego w czytelnej formie jako ciąg znaków. |
Źródła błędów |
Brak |
Przykłady |
versionString(versionGuid) zwraca wersję obiektu deweloperskiego z identyfikatorem wersji versionGuid. |
Kontekst |
ALL |
Uwagi |
Dane opisowe wszystkich obiektów deweloperskich są przechowywane w bazie danych repozytorium. |
Zobacz także |
function create()
{
var p_guid := parameters.GUID;
var r_versionString := „”;
var versionGuid := cast(Guid, p_guid);
if (not isNull(versionGuid))
r_versionString := versionString(versionGuid);
result.VERSION_STRING := r_versionString;
}
Funkcje wiadomości (Message functions)
Funkcje komunikatów mogą być używane do informowania użytkownika o określonych zdarzeniach lub statusach w aplikacji dialogowej. Dostępne są następujące funkcje komunikatów:
- popProgramMessagePath
- pushProgramMessagePath
- sendMessage
- setProgramMessageGroup
- setProgramMessageId
Komunikaty są wyświetlane na pasku stanu i w zakładce Informacje. Możliwe jest wskazanie odniesienia komunikatu do elementu GUI (np. pola wejściowego) poprzez oznaczenie elementu GUI odpowiednim rogiem komunikatu. Kolejka komunikatów, która jest dostarczana przez menedżera komunikatów, służy do zarządzania komunikatami wysyłanymi przez aplikację.
Wiadomość może zawierać identyfikatory, za pomocą których można ją powiązać z określonym polem lub określonym obiektem. Te identyfikatory to:
- Grupa wiadomości – zazwyczaj jest to obiekt i często odpowiada wierszowi w listach, tabelach lub edytorach pozycji.
- Ścieżka komunikatu – zazwyczaj jest to kategoria lub widok.
- Identyfikator wiadomości – zazwyczaj jest to pole.
Komunikat jest dodawany do kolejki komunikatów tylko wtedy, gdy nie zawiera już komunikatu o tej samej klasie komunikatów, numerze komunikatu itp. Umożliwia to na przykład potwierdzanie komunikatów typu ostrzeżenie. Służy to na przykład do potwierdzania komunikatów typu sstrzeżenie. Mogą one zostać potwierdzone przez użytkownika za pomocą pola wyboru i pozostać w kolejce wiadomości. Jeśli ostrzeżenie o tym samym identyfikatorze zostanie wysłane ponownie (tj. niepotwierdzone), nie będzie już uwzględniane w kolejce wiadomości.
Znaki zastępcze mogą być używane do dostosowywania wiadomości lub długiego tekstu. Symbol zastępczy jest reprezentowany przez liczbę w nawiasach klamrowych. Wiadomość może zawierać maksymalnie dziesięć różnych symboli zastępczych.
Podczas korzystania z symboli zastępczych należy upewnić się, że są one przeznaczone wyłącznie do danych takich jak identyfikacja partnera. Rzeczywisty tekst wiadomości jest zapisywany w bazie danych. Gwarantuje to, że teksty komunikatów pozostaną przetłumaczone i będą wyświetlane w języku wybranym przez użytkownika. W związku z tym należy zarejestrować kilka komunikatów, nawet jeśli występują niewielkie odchylenia w tekście komunikatu. Ponieważ dostępna przestrzeń jest ograniczona, tekst komunikatu nie powinien być zbyt długi. Długi tekst jest dostępny do dalszych wyjaśnień lub notatek.
popProgramMessagePath
Nazwa |
popProgramMessagePath |
Opis |
popProgramMessagePath usuwa najnowszą ścieżkę ze ścieżki wiadomości programu. |
Podpisy |
popProgramMessagePath() |
Parametry |
Brak. |
Wynik |
Usuwa najnowszą ścieżkę ze ścieżki wiadomości programu. |
Źródła błędów |
Brak. |
Przykłady |
popProgramMessagePath() |
Kontekst |
ALL |
Uwagi |
Ścieżka komunikatów programu jest używana podczas ponownego użycia komponentów GUI w aplikacji interaktywnej w celu jednoznacznej identyfikacji elementów GUI komponentów w różnych zastosowaniach. Ścieżka komunikatów programu składa się z kilku elementów analogicznych do stosu. Więcej informacji na temat komunikatów można znaleźć w Podręczniku programowania. |
Zobacz także |
pushProgramMessagePath |
pushProgramMessagePath
Nazwa |
pushProgramMessagePath |
Opis |
pushProgramMessagePath dodaje nową ścieżkę do ścieżki wiadomości programu. |
Podpisy |
pushProgramMessagePath(String path) |
Parametry |
path to ścieżka, która ma zostać dodana do ścieżki komunikatu programu. |
Wynik |
Dodaje ścieżkę path do ścieżki wiadomości programu. |
Źródła błędów |
Brak. |
Przykłady |
pushProgramMessagePath(„PATH”) dodaje ścieżkę PATH do ścieżki komunikatu programu. |
Kontekst |
ALL |
Uwagi |
Ścieżka komunikatów programu jest używana podczas ponownego użycia komponentów GUI w aplikacji interaktywnej w celu jednoznacznej identyfikacji elementów GUI komponentów w różnych zastosowaniach. Ścieżka komunikatów programu składa się z kilku elementów analogicznych do zestawu. Więcej informacji na temat komunikatów można znaleźć w artykule Podręcznik programowania. |
Zobacz także |
popProgramMessagePath |
sendMessage
Nazwa |
sendMessage |
Opis |
sendMessage wysyła wiadomość do kolejki wiadomości. |
Podpisy |
sendMessage(Unknown path, String message) sendMessage(Unknown path, String message, String p1) sendMessage(Unknown path, String message, String p1, String p2) sendMessage(Unknown path, String message, String p1, String p2, String p3) sendMessage(Unknown path, String message, String[] parameterList) |
Parametry |
path to ścieżka dostępu do atrybutu widoku obiektu. message jest identyfikatorem pojedynczego komunikatu. Jeśli nie ma indywidualnego komunikatu z identyfikatorem message, komunikat jest wysyłany z klasą komunikatu i numerem komunikatu zgodnie z message. p1, p2 i p3 to maksymalnie trzy parametry, które zastępują wszelkie symbole zastępcze w wiadomości konkretnymi wartościami. parameterList to lista z dowolną liczbą parametrów dla symboli zastępczych wiadomości. |
Wynik |
Wyświetla komunikat message. Jeśli komunikat jest wysyłany w indywidualnej kontroli w funkcjach validate i validatePostcondition lub gdy proces jest uruchamiany ręcznie, komunikat może być wyświetlany na określonym elemencie GUI. Element GUI jest identyfikowany za pomocą następujących właściwości:
Jeśli path ma wartość zero, komunikat jest wysyłany bez odniesienia do elementu GUI. Jeśli wiadomość zostanie wysłana w ramach działania workflow, zostanie ona zapisana w dzienniku wiadomości odpowiedniej bazy danych. |
Źródła błędów |
Nieprawidłowy komunikat w indywidualnej kontroli lub definicji działania może oznaczać, że obiekt biznesowy nie może zostać zmieniony lub działanie nie może zostać zakończone. |
Przykłady |
sendMessage(null, „ERROR”, „Permission denied.”) wysyła indywidualny komunikat WARNING z nieprzetłumaczalnym tekstem jako parametrem i bez wyświetlania komunikatu na atrybucie. sendMessage(null, „WFL-00024”, list()) wysyła indywidualny komunikat WFL-00024 bez parametrów i bez wyświetlania komunikatu dla atrybutu. Jeśli indywidualny komunikat nie istnieje, wysyłany jest komunikat systemowy com.cisag.sys.workflow.00024. sendMessage(persistent:number, „SAL-X0001”, list(valueSetDescription(„com.cisag.app.general.OrderStatus”, current:status)) wyświetla indywidualną wiadomość dla atrybutu status” widoku obiektu current pojedynczej kontroli. Opis przyszłego statusu sprawdzanego obiektu biznesowego w bieżącym języku wyświetlania jest przekazywany jako parametr. sendMessage(results.RESULT_id, „WFL-0001”, list(results.RESULT)) wyświetla indywidualną wiadomość w polu dla wyniku działania o nazwie RESULT w działaniu. Wartość pola jest przekazywana jako parametr. sendMessage(extension.RESULT_id, „GEN-0001”, extension.RESULT_val) wyświetla indywidualną wiadomość w indywidualnym sprawdzeniu dla dodatkowego pola RESULT jednostki biznesowej. sendMessage(new(DataView(com.cisag.app.general.partner.model.Partner)):searchString, „GEN-X00001”, list()) wyświetla indywidualną wiadomość dotyczącą wyszukiwanego terminu partnera w działaniu, które jest powiązane z aplikacją com.cisag.app.general.partner.ui.PartnerMaintenance. sendMessage(new(DataView(com.cisag.app.general.partner.model.Partner))->AddressData:country, „GEN-X00001”, list()) wyświetla indywidualną wiadomość w kraju danych adresowych partnera w działaniu powiązanym z aplikacją com.cisag.app.general.partner.ui.PartnerMaintenance. |
Kontekst |
ALL |
Uwagi |
Poszczególne wiadomości można wprowadzać w aplikacji Indywidualne komunikaty. Więcej informacji na temat komunikatów można znaleźć w artykule Podręcznik programowania. |
Zobacz także |
setProgramMessageGroup
Nazwa |
setProgramMessageGroup |
Opis |
setProgramMessageGroup ustawia grupę komunikatów programu. |
Podpisy |
setProgramMessageGroup(String group) |
Parametry |
group to grupa wiadomości programu. |
Wynik |
Ustawia grupę komunikatów programu na group. |
Źródła błędów |
Brak. |
Przykłady |
setProgramMessageGroup(objectGuid) ustawia grupę komunikatów programu w indywidualnej kontroli aplikacji tabeli na Guid obiektu biznesowego przechowywanego w zmiennej objectGuid. |
Kontekst |
ALL |
Uwagi |
W przypadku tabel ustawienie odpowiednich narożników dla komunikatów w polach tabeli jest nieco bardziej złożone. Jeśli komunikat ma zostać wysłany dla określonego pola w tabeli, menedżer komunikatów musi zostać poinformowany o polu, dla którego ma zostać wyświetlony narożnik komunikatu. W tym celu używana jest funkcja setProgramMessageGroup(), która przekazuje do menedżera komunikatów ciąg znaków identyfikujący wiersz tabeli. Odpowiedni identyfikator komunikatu jest następnie ustawiany w menedżerze komunikatów za pomocą funkcji setProgramMessageId(). Guid obiektu biznesowego wyświetlanego na przykład w wierszu tabeli, który jest konwertowany na ciąg znaków, jest odpowiedni do utworzenia unikalnego ciągu znaków dla funkcji setProgramMessageGroup(). Więcej informacji na temat komunikatów można znaleźć w artykule Podręcznik programowania. |
Zobacz także |
setProgramMessageId |
setProgramMessageId
Nazwa |
setProgramMessageId |
Opis |
setProgramMessageId ustawia identyfikator komunikatu programu. |
Podpisy |
setProgramMessageId(String id) |
Parametry |
id to identyfikator komunikatu programu. |
Wynik |
Ustawia identyfikator komunikatu programu na id. |
Źródła błędów |
Brak. |
Przykłady |
setProgramMessageId(„CODE”) ustawia identyfikator komunikatu programu na CODE. |
Kontekst |
ALL |
Uwagi |
W przypadku tabel ustawienie odpowiednich narożników dla komunikatów w polach tabeli jest nieco bardziej złożone. Jeśli komunikat ma zostać wysłany dla określonego pola w tabeli, menedżer komunikatów musi zostać poinformowany o polu, dla którego ma zostać wyświetlony narożnik komunikatu. Aby to zrobić, funkcja setProgramMessageGroup() jest używana do przekazania łańcucha znaków identyfikującego wiersz do menedżera komunikatów. Odpowiedni identyfikator komunikatu jest następnie ustawiany w menedżerze komunikatów za pomocą funkcji setProgramMessageId(). Identyfikatory komunikatów są rejestrowane w przykładowych polach GUI tabeli. Pola w kolumnie są kopiami pola szablonu GUI przypisanego do kolumny. Oznacza to, że odpowiedni identyfikator komunikatu jest również przypisany do tych pól GUI. Więcej informacji na temat komunikatów można znaleźć w artykule Podręcznik programowania. |
Zobacz także |
setProgramMessageGroup |
Funkcje dla wartości zerowych (Null functions)
Funkcje dla wartości null mogą być używane do sprawdzania, czy wyrażenie lub zmienna ma wartość null. Funkcje dla wartości null obejmują:
- first
- isNull
first
Nazwa |
first |
Opis |
first zwraca wartość pierwszego parametru, który nie jest zerem. |
Podpisy |
Unknown first(Unknown p1, Unknown p2,…,Unknown pN) |
Parametry |
p1, p2,…, p3 to wyrażenia, które mają być sprawdzane pod kątem wartości zero. |
Wynik |
Funkcja zwraca wynik pierwszego wyrażenia, które nie jest null. |
Źródła błędów |
Jeśli wszystkie parametry mają wartość null, zwracana jest wartość null. |
Przykłady |
first(null, 1) zwraca 1 z typem danych Unknown. cast(Number, first(null, 1)) zwraca liczbę 1. first(parameters.object:updateInfo.updateUser, parameters.object:updateInfo.createUser) zwraca użytkownika, który ostatnio zmienił odwołany obiekt biznesowy. Jeśli obiekt biznesowy nigdy nie został zmieniony, zwracany jest jego twórca. |
Kontekst |
ALL |
Uwagi |
Wartość zero odpowiada wartości niezdefiniowanej. Wartość może być niezdefiniowana, na przykład, jeśli w funkcji wystąpił błąd. Prawie wszystkie funkcje zwracają null jako wynik, jeśli jednym z parametrów wejściowych jest null. Często jednak konieczna jest oddzielna obsługa stanów błędów. Z tego powodu funkcje specjalne first i isNull mogą być również używane do oceny wartości null. Ponieważ wynik funkcji first jest typu danych Unknown, zwykle trzeba przekonwertować go na inny typ danych za pomocą funkcji cast, zanim będzie można go użyć. |
Zobacz także |
isNull |
function create()
{
var p_partner := loadPartner(parameters.PARTNER);
var r_responsible as Unknown;
if (not isNull(p_partner))
r_responsible :=
first(loadResponsibleOfPartner(p_partner:guid):number,
userName(p_partner:updateInfo.updateUser),
userName(p_partner:updateInfo.createUser));
result.IS_NULL := isNull(r_responsible);
result.VALUE := cast(String, r_responsible);
}
Funkcji first należy używać na przykład w następujących przypadkach:
- Jeśli funkcja języka skryptowego systemu może zwracać wartość zero, tak jak w przypadku funkcji loadResponsibleOfPartner.
- Jeśli istnieje wartość zastępcza dla wyrażenia, które może przyjąć wartość zero, np. dla atrybutów updateUser i updateInfo.createUser obiektu biznesowego.
- Aby ustawić wartości domyślne dla opcjonalnych danych wprowadzanych przez użytkownika w wynikach działania.
isNull
Nazwa |
isNull |
Opis |
isNull sprawdza, czy wartość jest null. |
Podpisy |
Boolean isNull(Unknown p) |
Parametry |
p to wyrażenie, które może mieć wartość zero. |
Wynik |
true, jeśli p ma wartość zero, w przeciwnym razie false. |
Źródła błędów |
Brak |
Przykłady |
isNull(null) zwraca wartość true. isNull(3) zwraca wartość false. isNull(loadResponsibleOfPartner(parameters.object:guid)) zwraca true, jeśli odpowiedzialny pracownik jest przechowywany dla partnera, do którego się odwołuje, w przeciwnym razie false. |
Kontekst |
ALL |
Uwagi |
Funkcji isNull należy używać na przykład w następujących przypadkach: · Jeśli funkcja języka skryptowego systemu może zwracać wartość zero, tak jak w przypadku funkcji loadPartner. · Jeśli atrybut obiektu biznesowego może mieć wartość zero, np. ponieważ specyfikacja jest opcjonalna, np. atrybut osoby odpowiedzialnej zamówienia sprzedaży lub zamówienia. Uwaga Jeśli Guid nie może mieć wartości zero, ale nadal jest niezdefiniowany, używana jest wartość ZERO_GUID. Dzieje się tak na przykład, gdy Guid jest częścią klucza głównego. |
Zobacz także |
first |
function create()
{
var p_partner := loadPartner(parameters.PARTNER);
var r_value := isNull(p_partner);
result.VALUE := r_value;
}
Inne funkcje (Miscellaneous functions)
Pozostałe funkcje dotyczą przede wszystkim elementów języka skryptowego systemu i wykonywania skryptów. Pozostałe funkcje obejmują
- call
- cast
- echo
- hashMap
- import
- if
- load
- sendMail
- new
call
Nazwa |
call |
Opis |
call wywołuje definicję działania typu Wywołanie funkcji. |
Podpisy |
HashMap call(String activityDefinition, HashMap parameters) |
Parametry |
activityDefinition to nazwa definicji działania typu Wywołanie funkcji parameters to tablica skrótów z wpisem dla każdego parametru definicji działania. Parametry są posortowane alfabetycznie. |
Wynik |
HashMap z wpisem dla każdego parametru zwrotnego wywołanej definicji działania. |
Źródła błędów |
Podczas wywołania, wartość musi być przypisana do każdego parametru wywoływanej definicji działania. |
Przykłady |
cast(String, call(„help.encrypt”, hashMap(PLAIN_TEXT:=”Hello world”, KEY:=””)).VALUE) szyfruje tekst Hello world przy użyciu standardowego klucza. cast(Number, call(„convertToFahrenheit”, hashMap(CELSIUS:=100)).FAHRENHEIT) wywołuje definicję działania z parametrem o wartości 100 i konwertuje wynik typu danych Unknown na liczbę. @convertToFahrenheit(CELSIUS:=100).FAHRENHEIT jest alternatywną składnią dla wywołania w poprzednim przykładzie. call(„getTopTenItems”, hashMap(CUSTOMER:=loadPartner(„10010”):number)) zwraca HashMap z numerami artykułów dziesięciu najczęściej kupowanych artykułów od klienta 10010. |
Kontekst |
ALL |
Uwagi |
Maksymalna głębokość rekurencji jest ograniczona. Więcej informacji można znaleźć w rozdziale Ograniczanie złożoności wyrażeń dokumentu Język skryptowy systemu. |
Zobacz także |
Więcej informacji na temat alternatywnej składni z @ można znaleźć w rozdziale Wywoływanie definicji działań dokumentu pomocy Język skryptowy systemu. |
function create()
{
var p_plainText := parameters.PLAIN_TEXT;
var key := cast(String, newGuid());
var params as HashMap;
params[„PLAIN_TEXT”] := p_plainText;
params[„KEY”] := key;
var encryptedText := cast(String, call(„help.encrypt”, params).VALUE);
params := new(HashMap);
params[„ENCRYPTED_TEXT”] := cast(String, encryptedText);
params[„KEY”] := key;
var decryptedText := cast(String, call(„help.decrypt”, params).VALUE);
result.DECRYPTED_TEXT := decryptedText;
}
cast
Nazwa |
cast |
Opis |
cast konwertuje wyrażenie na inny typ danych. |
Podpisy |
String cast(<datatype>, Unknown p) String[] cast(<datatype>, Unknown p) Number cast(<datatype>, Unknown p) itp. |
Parametry |
p to wyrażenie, które ma zostać przekonwertowane na inny typ danych. |
Wynik |
Wyrażenie jest konwertowane na typ danych <datatype>. |
Źródła błędów |
Nie wszystkie typy danych mogą być konwertowane na siebie nawzajem. W takim przypadku wystąpi błąd składniowy. Zasadniczo wszystkie typy danych można przekonwertować na typ danych Unknown. Odwrotna ścieżka od Unknown do dowolnego typu danych jest również możliwa. Następujące typy danych mogą być konwertowane na ciąg znaków: Boolean, Bytes, CisDate, Guid, Number, Timestamp. Ponadto ciąg znaków można przekonwertować na identyfikator Guid. Obiekt CisObject można również przekonwertować na CisObjectReference i odwrotnie. Następujące konwersje nie są możliwe: Timestamp to Number, Boolean to and from Number, CisDate to Timestamp. |
Przykłady |
cast(String, ZERO_GUID) zwraca ciąg znaków z 32 zerami. cast(Guid, cast(String, ZERO_GUID)) ponownie daje wynik ZERO_GUID. |
Kontekst |
ALL |
Uwagi |
Funkcji cast można użyć na przykład w następujących przypadkach:
Funkcja toTimestamp jest dostępna do konwersji CisDate na Timestamp. Konwersja list nie jest sprawdzana składniowo. |
Zobacz także |
guidToString, toChartList, toTimestamp |
function create()
{
var p_today := today();
var p_timestamp := now();
var r_cisDateToString := cast(String, p_today);
var r_timestampToString := cast(String, p_timestamp);
result.VALUE_CISDATE := r_cisDateToString;
result.VALUE_TIMESTAMP := r_timestampToString;
}
echo
Nazwa |
echo |
Opis |
echo wyświetla swój parametr na konsoli powłoki narzędziowej i zwraca wartość true. |
Podpisy |
Boolean echo(Unknown expression) |
Parametry |
expression to termin lub wyrażenie. |
Wynik |
Funkcja echo wyświetla wartość expression na konsoli powłoki narzędzi. Funkcja ta może być używana na przykład do monitorowania warunków w definicjach działania. Zwracana wartość jest zawsze prawdziwa, nawet jeśli parametr ma wartość null. |
Źródła błędów |
|
Przykłady |
echo(„A”) wyświetla ECHO: A na konsoli. echo(list(„A”, „B”, „C”, 1, 2, 3)) wyświetla ECHO: [[S=A], [S=B], [S=C], [N=1], [N=2], [N=3]] na konsoli. echo(hashMap(A:=1, B:=null, C:=day(today()), D:=new(Unknown[3])))) wypisuje ECHO: {A=[N=1], B=[103=null], C=[N=13], D=[L=[[103=null], [103=null], [103=null]]} na konsoli. Wartość klucza 103 oznacza typ danych Unknown. echo(loadPartner(„10010”)) wyświetla ECHO: Partner[10010] na konsoli. echo(definition:name) wyświetla nazwę definicji działania na konsoli. echo(activity:code) wyświetla identyfikator (numer) działania na konsoli. echo(activity->Process:code) i echo(process.Code) wyświetlają identyfikator (numer) procesu na konsoli. echo(„parameters.object:status=” + parameters.object:status) wyświetla na konsoli wartość atrybutu status obiektu biznesowego, do którego odwołuje się wyrażenie parameters.object. W warunku wyrażenie to ma wartość true. echo(„Activity definition ” + definition:code + ” evaluated event ” + valueSetName(EventType, event.type) + ” with subtype ” + valueSetName(ObjectChangeType, event.subtype) + ” for ” + objectName(event.guid) + ” ” + parameters.object:number + ” triggered by user ” + userName (parameters.userGuid) + ” in database ” + databaseName(event.database)) + „.” w warunku przejścia definicji działania z definicją zdarzenia typu Jednostka biznesowa powoduje wyświetlenie komunikatu ECHO: Activity definition exampleEcho|Start evaluated event TRANSACTION with subtype UPDATE for com.cisag.app.general.obj.Partner 10010 triggered by user JOB in database ADV60010.” w konsoli. |
Kontekst |
ALL |
Uwagi |
Dane wyjściowe są również zapisywane w dzienniku serwera aplikacji, na którym wykonywana jest funkcja echo. Dane wyjściowe w warunku przejścia są zapisywane w dzienniku serwera aplikacji, który przetwarza zdarzenie. Dane wyjściowe w warunku wstępnym są zapisywane w dzienniku serwera aplikacji, na którym działa silnik workflow lub harmonogram. Zazwyczaj jest to serwer komunikatów. |
Zobacz także |
function create()
{
echo(parameters.TEXT);
}
hashMap
Nazwa |
hashMap |
Opis |
hashMap tworzy tablicę i zwraca ją. |
Podpisy |
hashMap(key1:=value1, key2:=value2,…,keyN:=valueN) |
Parametry |
value1, value2,…, valueN to terminy określające wartości kluczy key1, key2,…, keyN generowanej tablicy. Wszystkie parametry są opcjonalne. |
Wynik |
Tablica hash z określonymi parami klucz-wartość. |
Źródła błędów |
Brak. |
Przykłady |
hashMap() zwraca pustą tablicę. hashMap(one:=1, two:=2, three:=3) zwraca tablicę hash {one=[N=1], two=[N=2], three=[N=3]}. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
new |
function create()
{
var r_hashMap := hashMap(one:=1, two:=2, three:=3);
echo(r_hashMap);
}
import
Nazwa |
import |
Opis |
import importuje obiekt skryptu lub bibliotekę do deklaracji wprowadzonej w języku skryptowym systemu. |
Podpisy |
import systemScript |
Parametry |
systemScript to techniczna nazwa obiektu deweloperskiego typu Script lub nazwa biblioteki zarejestrowanej w bazie danych OLTP. |
Wynik |
Jeśli określony obiekt skryptu lub biblioteka istnieją, są one zawarte w deklaracji. Zmienne, stałe, klasy i funkcje zawarte w obiekcie skryptu lub bibliotece są dostępne w deklaracjach. |
Źródła błędów |
Polecenie import musi znajdować się na pierwszym miejscu w deklaracjach. Zarówno zintegrowany obiekt skryptu lub biblioteka, jak i deklaracje muszą być wprowadzone w tym samym języku skryptowym. Ponieważ obiekt skryptu lub biblioteka są zintegrowane z deklaracją tekstowo, obiekt skryptu lub biblioteka nie mogą być sprzeczne z deklaracją. Może to mieć miejsce na przykład wtedy, gdy zarówno obiekt skryptu, jak i deklaracja zawierają funkcję o tej samej nazwie. |
Przykłady |
import com.pt.app.HelloWorld importuje obiekt skryptu o tej samej nazwie utworzony w produkcyjnym systemie testowym w języku skryptowym systemu. import help.stringUtilityFunctions importuje bibliotekę o tej samej nazwie. |
Kontekst |
ALL |
Uwagi |
Funkcja import jest dostępna tylko w języku skryptowym systemu. Obiekty skryptów wprowadza się w aplikacji Obiekty deweloperskie. Biblioteki są wprowadzane w aplikacji o tej samej nazwie. Jeśli istnieje zarówno obiekt skryptu, jak i biblioteka o określonej nazwie, biblioteka jest importowana jako pierwsza. Zarówno obiekt skryptu, jak i biblioteka są dostępne we wszystkich bazach danych systemu. Jako tzw. obiekt rozwojowy systemu produkcyjnego, obiekt skryptu może być transportowany z produkcyjnego systemu testowego do systemu produkcyjnego za pomocą aplikacji Lista: Obiekty deweloperskie systemu produkcyjnego. Jest to jeden z powodów, dla których zaleca się korzystanie z obiektów skryptów. |
Zobacz także |
load |
import help.stringUtilityFunctions;
function create()
{
var p_text := parameters.TEXT;
var p_separator := parameters.SEPARATOR;
var r_wordList := splitString(p_text, p_separator);
result.SPLIT_TEXT := r_wordList;
result.JOINED_TEXT := joinString(r_wordList, p_separator);
}
Dwie funkcje split i join muszą być zadeklarowane w bibliotece help.stringUtilityFunctions w języku skryptowym systemu, na przykład w następujący sposób:
function split(p_text as String, p_separator as String) as String[]
{
if (p_separator = „”)
p_separator := ” „;
var increment := length(p_separator);
var sep as String;
var word as String;
var r_wordList as String[];
var i := 0;
var startPos := 0;
while (i + increment – 1 < length(p_text)) {
sep := substring(p_text, i, i + increment);
if (sep = p_separator) {
word := trim(substring(p_text, startPos, i));
i := i + przyrost;
startPos := i;
if (word <> „” and word <> p_separator)
add(r_wordList, word);
} else {
i := i + 1;
}
}
word := substring(p_text, startPos);
if (word <> „” and word <> p_separator)
add(r_wordList, word);
return r_wordList;
}
function join(p_textList as String[], p_separator as String) as String
{
var r_text as String;
for (word as String : p_textList)
r_text := r_text + p_separator + word;
if (r_text <> „”)
r_text := substring(r_text, length(p_separator));
return r_text;
}
if
Nazwa |
if |
Opis |
if warunkowo ocenia jeden z dwóch wydruków. |
Podpisy |
Unknown if(Boolean condition, Unknown a, Unknown b) |
Parametry |
condition jest warunkiem typu danych Boolean. a to wyrażenie, którego wartość jest zwracana, jeśli warunek condition jest prawdziwy. b to wyrażenie, którego wartość jest zwracana, jeśli warunek condition jest fałszywy. |
Wynik |
Jeśli condition ma wartość true, obliczane jest wyrażenie a i zwracana jest jego wartość. Jeśli condition ma wartość false, obliczane jest wyrażenie b i zwracana jest jego wartość. |
Źródła błędów |
Brak |
Przykłady |
if(a > b, a, b)) zwraca większą z liczb a i b jako Unknown. cast(Number, if(a > b, a, b)) zwraca większą z liczb a i b jako liczbę. if(null, 1, 2) zwraca wartość null. if(true, i, i / 0) zawsze zwraca i jako Unknown. Ponieważ true jest zawsze prawdziwe, i / 0 nigdy nie jest obliczane, a wyrażenie nie powoduje błędu wykonania. |
Kontekst |
ALL |
Uwagi |
Funkcji if można użyć do mapowania warunku w polu wyrażenia (np. w warunku przejścia lub w wyrażeniu dla operatorow definicji działań). Ponieważ wynik funkcji if jest typu danych Unknown, zwykle trzeba przekonwertować go na inny typ danych za pomocą funkcji cast, zanim będzie można go użyć. |
Zobacz także |
Więcej informacji na temat poleceń warunkowych można znaleźć w artykule Język skryptowy systemu. |
function create()
{
var p_number1 := parameters.NUMBER1;
var p_number2 := parameters.NUMBER2;
var r_comparator := cast(String,
if(p_liczba1 > p_liczba2,”>”,
if(p_liczba1 < p_liczba2, „<„, „=”));
result.VALUE :=
cast(String, p_liczba1) + r_comparator + cast(String, p_liczba2);
}
load
Nazwa |
load |
Opis |
load integruje obiekt skryptu z deklaracją wprowadzoną w JavaScript. |
Podpisy |
load (scriptObject) |
Parametry |
scriptObject to techniczna nazwa obiektu deweloperskiego typu Script. |
Wynik |
Jeśli określony obiekt skryptu istnieje, jest on uwzględniany w deklaracji. Zmienne, stałe, klasy i funkcje zawarte w obiekcie skryptu są dostępne w deklaracjach. |
Źródła błędów |
Zarówno zintegrowany obiekt skryptu, jak i deklaracje muszą być wprowadzone w tym samym języku skryptowym. Ponieważ obiekt skryptu jest zintegrowany z deklaracją tekstowo, obiekt skryptu nie może być sprzeczny z deklaracją. Może to mieć miejsce na przykład wtedy, gdy zarówno obiekt skryptu, jak i deklaracja zawierają funkcję o tej samej nazwie. |
Przykłady |
load (com.pt.app.HelloWorld) importuje obiekt skryptu o tej samej nazwie utworzony w produkcyjnym systemie testowym w JavaScript. |
Kontekst |
ALL |
Uwagi |
Funkcja load jest dostępna tylko w JavaScript, więc obiekt skryptu zintegrowany z funkcją load musi być również wprowadzony w JavaScript. Obiekty skryptów tworzy się w aplikacji Obiekty deweloperskie. Obiekt skryptu jest dostępny we wszystkich bazach danych systemu. Jako tak zwany obiekt rozwojowy systemu produkcyjnego, obiekt skryptu może być transportowany z produkcyjnego systemu testowego do systemu produkcyjnego za pomocą aplikacji Lista: Obiekty deweloperskie systemu produkcyjnego. Jest to jeden z powodów, dla których zaleca się korzystanie z obiektów skryptów. |
Zobacz także |
import |
load(com.pt.app.HelloWorld);
function create()
{
var r_hello = hello();
result.VALUE = r_hello;
}
Funkcja „hello” musi być zadeklarowana w obiekcie skryptu o nazwie „com.pt.app.HelloWorld” w JavaScript, na przykład w następujący sposób:
function hello()
{
return „Hello world!”;
}
sendMail
Nazwa |
sendMail |
Opis |
sendMail wysyła wiadomość e-mail do jednego lub więcej odbiorców. |
Podpisy |
Boolean sendMail(String recipientTo, String subject, String descriptionHtml) Boolean sendMail(Guid recipientToUserGuid, String subject, String descriptionHtml) Boolean sendMail(Guid[] recipientToUserGuids, String subject, String descriptionHtml) |
Parametry |
recipientTo to adres e-mail odbiorcy. Jeśli wiadomość e-mail ma wielu odbiorców, należy oddzielić każdy adres e-mail przecinkiem. subject to temat wiadomości e-mail. descriptionHtml to opis wiadomości e-mail zakodowany jako ciąg znaków HTML. recipientToUserGuid to identyfikator użytkownika odbiorcy. recipientToUserGuids to lista identyfikatorów użytkowników odbiorcy. |
Wynik |
Wysyła wiadomość e-mail do odbiorcy (odbiorców). Nadawcą jest nadawca zdefiniowany w funkcji konfiguracji Ustawienia użytkownika dla systemu. |
Źródła błędów |
Błędy mogą być spowodowane między innymi nieautoryzowanymi adresami e-mail lub niepełną lub nieprawidłową konfiguracją funkcji e-mail. |
Przykłady |
sendMail(parameters.userGuid, „Test”, „<em>Hello World!</em>”) wysyła wiadomość e-mail do użytkownika, który wywołał zdarzenie. |
Kontekst |
ALL |
Uwagi |
Dla lepszej dokumentacji i identyfikowalności zaleca się wysyłanie wiadomości e-mail za pomocą węzłów e-mail. |
Zobacz także |
Więcej informacji na temat funkcji dla węzłów e-mail można znaleźć w artykule Język skryptowy systemu: Funkcje workflow. |
function create()
{
var p_user := parameters.USER;
var p_subject := parameters.SUBJECT;
var p_description := parameters.DESCRIPTION;
var r_sendMail := sendMail(userMailAddress(userGuid(p_user)), p_subject, toHtml(p_description));
result.SEND_MAIL := r_sendMail;
}
new
Nazwa |
new |
Opis |
new tworzy nową instancję typu danych. |
Podpisy |
new(Unknown type) new(Unknown listType, Number size) |
Parametry |
type to typ danych nowej instancji. size to rozmiar listy. |
Wynik |
Tworzona jest nowa instancja z określonym typem danych. Jeśli typem danych jest lista, funkcja new ma rozszerzoną funkcjonalność. W przypadku list o nieokreślonej długości można określić długość n dla new. Jeśli typ listy ma długość n lub długość n jest określona, tworzona jest lista z n pustymi elementami. Jeśli typ danych jest klasą, tworzona jest nowa instancja tej klasy. Wszystkie atrybuty nowej instancji są wypełniane wartościami domyślnymi. |
Źródła błędów |
Brak |
Przykłady |
new(HashMap) zwraca nową instancję typu danych HashMap. new(Number[]) zwraca nową pustą listę typu danych Number[]. new(Number[10]) zwraca nową listę typu danych Number[] z 10 elementami typu danych elementu Number z wartością domyślną 0. new(Number[], index) zwraca nową listę typu danych Number[] z elementami typu danych elementu Number określonymi w index. new(Number[index]) powoduje błąd składni. |
Kontekst |
ALL |
Uwagi |
|
Zobacz także |
hashMap, newGuid |
function create()
{
var p_size := parameters.SIZE;
var r_stringArray := new(String[], max(min(p_size, 10), 0));
/* alternatywny zapis: new(String[10]) */
result.VALUE := r_stringArray;
result.VALUE := new(Number[]);
}