Kroki Edycja danych

Kroki Edycja danych udostępniają obszar o formacie swobodnym, w którym można wprowadzać polecenia sterujące przetwarzaniem skryptu.

W polu Edycja tekstu danych należy wprowadzić polecenia skryptu. Kliknąć sąsiadującą ikonę, aby otworzyć okno z większym obszarem służącym do definiowania kroku edycji danych.

Co do zasady składnia obowiązująca w obszarze edycji danych jest odzwierciedleniem poleceń dostępnych w jawnie określanych typach kroków. Istnieje jednak kilka poleceń dostępnych tylko w obszarze edycji danych. Przykładem są dwa polecenia strukturalne: For (Dla) orazIf (Jeżeli).

Uwaga: Nie wszystkie typy kroków skryptu asystenta procesów biznesowych są obsługiwane za pomocą składni edycji danych. Dodatkowe informacje na temat poleceń edycji danych oraz przykłady ich zastosowania można znaleźć poniżej.

W tematach tej sekcji opisano szczegóły składni obsługiwane przez typ kroku "Edycja danych".

Omawiane tematy

Komentarze

Zmienne tymczasowe

Zmienne kontekstowe

Instrukcja "move"

Instrukcja "go to"

Instrukcja "conditional branch"

Instrukcja "if"

Instrukcja "for"

Przetwarzanie listy

Funkcje służące do przetwarzania listy

Deklarowanie i wywoływanie obiektów opartych na schemacie

Zmienne systemowe i globalne

Wykonywanie skryptu i przekazanie

Instrukcja "navigate"

Instrukcja "invoke map"

Deklarowanie obiektu biznesowego z grupą obiektu biznesowego

Instrukcje "generate edit map"

Instrukcja "terminate"

Wywoływanie kodu Groovy

Debugowanie skryptu APB

Przydatne wskazówki i porady

Komentarze

Można wstawiać komentarze do skryptu, używając dwóch ukośników // jako dwóch pierwszych znaków kroku edycji danych. Przykład:

// 
// quit with error
//
if ("not(customer/securityEnabled)")
terminate with error (8000, 1001 %1="customer/id" %2='not allowed');
end-if;

Zmienne tymczasowe

Zmienne tymczasowe można deklarować we wszystkich typach skryptów. Należy przed nimi umieścić pojedynczy znak dolara ("$"). Jednakże zmienne tymczasowe działają odmiennie w różnych typach skryptów:

  • W skryptach APB zmienne tymczasowe przechodzą z jednego skryptu APB do drugiego (patrz Instrukcje "Wykonywanie skryptu" i "Przekazanie kontroli"), co oznacza, że można używać zmiennych tymczasowych do komunikacji między skryptami APB.

  • Zmiennych tymczasowych nie można przekazywać ze skryptu BPA do skryptu usługi ani wtyczki. Między tymi typami skryptów można przekazywać wyłącznie elementy obszaru danych.

  • W skryptach usługi i wtyczki zmienne tymczasowe istnieją jedynie przez czas wykonywania konkretnego skryptu, w którym zmienna została zadeklarowana. Oznacza to, że zmiennych tymczasowych nie można przekazywać między skryptami wtyczki i usługi. Między tymi rodzajami skryptów można przekazywać tylko zmienne globalne, zmienne kontekstowe oraz elementy obszaru danych.

Deklarowanie/inicjowanie/ustawianie wartości domyślnych zmiennych tymczasowych

Zmienną tymczasową należy zadeklarować lub zainicjować odpowiednią wartością przed jej użyciem. Typową metodą deklarowania zmiennej jest przykładowo przeniesienie do niej danych za pośrednictwem instrukcji move.

move "0" to $index;
Szybki dostęp: Więcej informacji o jawnej deklaracji zmiennej tymczasowej w instrukcji move można znaleźć w sekcji Przenoszenie do zmiennej tymczasowej.

W przypadku skryptów APB, jak wspominano wyżej, zmienne tymczasowe można przekazywać z jednego skryptu APB do drugiego. W związku z tym często odwołuje się do zmiennej tymczasowej w skrypcie APB, która powinna być zainicjowana w poprzednim skrypcie APB. Jeśli jednak z jakiejkolwiek przyczyny zmienna tymczasowa nie została zainicjowana w poprzednim skrypcie APB, odwołanie do niej spowoduje wystąpienie błędu. Dobrym nawykiem jest używanie instrukcji default, która będzie inicjować zmienne tymczasowe jeszcze nie utworzone lub nie zainicjowane.

  • Następująca instrukcja spowoduje zainicjowanie zmiennej tymczasowej $InputAction, ale tylko jeśli zmienna tymczasowa nie została jeszcze zainicjowana:

    default $InputAction;
  • Poniższa instrukcja spowoduje ustawienie wartości zmiennej tymczasowej $InputAction na "read", ale tylko jeśli zmienna nie została jeszcze zainicjowana:

    default $InputAction as 'read';
Uwaga: Należy zachować ostrożność, aby w skryptach nie definiować zmiennych za pomocą zarezerwowanych słów kluczowych. W poniższej tabeli przedstawiono zarezerwowane słowa kluczowe.
Słowo kluczowe
add
as
asError
bpa
branch
data
declareBO
declareBS
declareDA
declareMap
declareSS
default
delete
edit
element
else
end-edit
end-for
end-if
error
escape
evaluate
fastAdd
fastUpdate
for
goto
if
in
invokeBO
invokeBS
invokeMap
invokeSS
label
map
move
navigate
navigateAndReloadDashboard
null
page
performScript
popup
read
readWithoutVersion
replace
suppress
target
terminate
to
transferControl
update
using
warn
with

Zmienne kontekstowe

Zmienne kontekstowe są dostępne tylko w skryptach usługi. Zmienna kontekstowa jest dostępna tylko przez czas wykonywania skryptu usługi i wszystkich wywoływanych przez niego elementów. W związku z tym można używać zmiennej kontekstowej w skrypcie usługi, aby przekazywać informacje do skryptu usługi niższego poziomu lub schematu. Należy przed nimi umieścić podwójny znak dolara ("$$").

Uwaga: Ze względu na to, że zmienne kontekstowe są dostępne w skryptach niższego poziomu, mogą być czasami uznawane za zmienne globalne lub globalne zmienne kontekstowe. Nie można ich jednak mylić ze zmiennymi globalnymi.

Deklarowanie/inicjowanie/ustawianie wartości domyślnych zmiennych kontekstowych

Zmienną kontekstową należy zadeklarować lub zainicjować odpowiednią wartością przed jej użyciem. Typową metodą deklarowania zmiennej jest przykładowo przeniesienie do niej danych za pośrednictwem instrukcji move.

move 'context variable' to $$contextVariable;
Szybki dostęp: Więcej informacji można znaleźć w sekcji Przenoszenie do zmiennej kontekstowej.

Instrukcja "move"

Instrukcja move umożliwia skopiowanie wartości źródłowej do celu. W poniższej tabeli przedstawiono różne opcje obsługiwane przez instrukcję move.

Instrukcja Opis przykładu Składnia przykładu
Przenoszenie do elementu

move "xpath" to "xpath";

Uwaga: Wyrażenie XPath jest ujęte w podwójne cudzysłowy.
Instrukcja move z prostym odwołaniem XPath.
move "acct/totalBalance" to 
"parm/formattedValue";
Instrukcja move z funkcją łączenia XPath.
move "concat(person/firstName, ',', 
person/lastName)" 
to "parm/fullName";
Instrukcja move z funkcją substring-before XPath.
move "substring-before(parm/fullName,',')" 
to "person/firstName";
Instrukcja move z funkcją substring-after XPath.
move "substring-after(parm/fullName,',')" 
to "person/lastName";
Instrukcja move z funkcją substring XPath.
move "substring(parm/date,1,4)" 
to "parm/year";
Przenoszenie do elementu

move 'literal' to "xpath";

Uwaga: Wartość literału jest ujmowana w pojedyncze cudzysłowy.
Instrukcja move z ciągiem literałowym.
move 'okay for mailing' 
to "account/preferences[type="mail"]/text";
Przenoszenie do elementu

move 'Boolean' to "xpath";

Instrukcja move z wartością logiczną jako ciągiem literałowym.
if ("account/balance > 0") 
  move 'true' 
  to "account/hasDebitBalance"; 
end-if;
Przenoszenie wyrażenia, które zwraca wartość logiczną. Należy pamiętać, że filtr w poniższym przykładzie jest w węźle grupy.
<schema>
  <account>
    <hasDebitBalance type="boolean"/>
    <balance/>
  </account>
</schema>

move "boolean(account[balance>0])" 
to "account/hasDebitBalance";
Przenoszenie do grupy

move "xpath" to "xpath";

Przenoszenie zestawu elementów z jednej grupy do drugiej.

System dopasowuje początkowy poziom nazw elementów i nazw grup/list ze schematu źródłowego do schematu docelowego. W przypadku list i grup domyślnym zachowaniem jest przenoszenie wszystkich elementów w obrębie grupy/listy źródłowej do grupy/listy docelowej (nawet jeśli nie zostały one zdefiniowane w grupie/na liście docelowej).

Do bardziej szczegółowej kontroli przenoszenia (bez konieczności definiowania poszczególnych instrukcji przenoszenia) może zostać użyta usługa biznesowa F1-MoveByName.

move "account/custInfo" to "person";

Ta instrukcja jest odpowiednikiem następujących instrukcji:

move "account/custInfo/*" to "person/*";

Przenoszenie przy użyciu zmiennej tymczasowej

Przenosząc do lokalnej zmiennej tymczasowej, nie ujmuje się jej w podwójne cudzysłowy.

move "xpath" to $variable;

move "count(Person/names/personName) 
+ count(Person/ids/personId)" 
to $PersonChildCount;
Przenosząc ze zmiennej tymczasowej, zmienną ujmuje się w podwójne cudzysłowy.

move "$variable" to "xpath";

move "$AccountBalance" 
to "parm/formattedValue";

Przenoszenie przy użyciu zmiennej kontekstowej

move "xpath" to $$variable;

move $$variable to "xpath";

Odwołań do zmiennych kontekstowych, źródłowych lub docelowych, nie ujmuje się w podwójne cudzysłowy.
move 'context value' 
to $$contextVariable;
// 
// here, we move from a context variable.
move $$contextVariable 
to "MarketMessage/sender";
Przenoszenie przy użyciu dynamicznej lokalizacji

move "xpath" | 'literal' to evaluate("xpath" | $variable);

move evaluate("xpath" | $variable) to "xpath" | $variable;

Instrukcja evaluate umożliwia dynamiczne wyznaczanie lokalizacji źródłowej lub docelowej instrukcji move na podstawie zmiennej lub lokalizacji elementu schematu.
move 'literal' 
to evaluate("schemaLocation"); 
//
move "schemaLocation" 
to evaluate($Variable);
move evaluate("schemaLocation") 
to $Variable;
// 
move evaluate($Variable) 
to "schemaLocation";
Przenoszenie z funkcją escape

move escape("xpath" | $variable) to "xpath" | $variable;

Funkcji escape można używać w instrukcji move tylko w przypadku skryptów usługi i wtyczki. Funkcja escape umożliwia skanowanie źródłowej wartości tekstowej w poszukiwaniu zawartości HTML i wstawia przed nią znak zmiany znaczenia, tj. zmienia wszelkie znaki HTML na znaki specjalne, które nie będą renderowane jako kod HTML. W ten sposób tekst będzie wyświetlany jako zwykły tekst, gdy będzie wyświetlany jako część elementu HTML.
Uwaga: Tej funkcji należy używać tylko, jeśli tekst ma być wyświetlany w elemencie HTML i może zawierać znaki HTML lub nawet złośliwy kod HTML, który nie powinien być renderowany jako kod HTML. Jeśli znaki specjalne zmiany znaczenia są wyświetlane niepoprawnie przy użyciu elementu bez renderowania kodu HTML, będą widoczne jako część tekstu. Więcej informacji o definiowaniu elementów do wyświetlania zawartości HTML można znaleźć w sekcji Atrybuty i funkcje odwzorowania interfejsu użytkownika.
move escape("schemaLocation") 
to $Variable;
// 
move escape($Variable) 
to "schemaLocation";
Przenoszenie wartości null

move null to "xpath";

Możliwe jest usuwanie informacji z dokumentu wystąpienia XML za pomocą specjalnej składni instrukcji move 'null'. Należy pamiętać, że można określić albo nazwę węzła w wyrażeniu XPath, albo nazwę grupy. W przypadku określenia grupy, grupa i wszystkie jej elementy podrzędne zostaną wykluczone z przetwarzania.

Usuwanie węzła i wszystkich jego węzłów podrzędnych:

if ("boolean(customer/securityEnabled)")
  goto updateInfo;
else
  move null to "customer"; 
end-if;   

Wszystkie węzły podrzędne węzła grupy można usunąć za pomocą przyrostka "/*".

if ("boolean(customer/securityEnabled)")
  move null to "customer/*";
end-if;

Instrukcja "go to"

Krok edycji danych umożliwia korzystanie z funkcji podobnej do typu kroku Przechodzenie do. Składnia jest następująca: goto etykieta;, gdzie etykieta reprezentuje inną lokalizację w polu tekstowym edycji danych (identyfikowaną przez tę etykietę) lub reprezentuje inny krok w tym skrypcie.

Poniżej przedstawiono przykład przechodzenia do innej lokalizacji w tym samym kroku określanej przez etykietę addSpouse.

if ("string(parm/spouse/name) != $BLANK")
  goto addSpouse;
end-if;
addSpouse: invokeBO 'Person' using "parm/spouse" for add;

W tym przykładzie przedstawiono przechodzenie do innego kroku wewnątrz tego samego skryptu. Liczba porządkowa kroku jest odwołaniem używanym jako etykieta.

if ("string(parm/spouse/name) != $BLANK")
  goto 110;
end-if;
.
.
.
110: invokeBO 'Person' using "parm/spouse" for add;

Instrukcja "conditional branch"

Krok edycji danych umożliwia korzystanie z funkcji podobnej do typu kroku Przechodzenie warunkowe. Składania jest następująca branch ("xpath") goto etykieta else etykieta;, gdzie:

  • Warunek XPath w instrukcji branch musi mieć wartość logiczną prawda lub fałsz.

  • Celami instrukcji goto i else są etykiety reprezentujące inną lokalizację w polu tekstowym edycji danych (identyfikowaną przez tę etykietę) lub reprezentujące inny krok w tym skrypcie.

W poniższym przykładzie użyto etykiet addSpouse i addAccount

branch ("string(parm/spouse/name) != $BLANK") goto addSpouse else addAccount;

Instrukcja "if"

Instrukcja if jest podobna do instrukcji "conditional branch". Można ich używać do tworzenia wyborów logicznych w skrypcie. Ta instrukcja może opcjonalnie zawierać instrukcję else, ale powinna zawsze się kończyć instrukcją end-if.

Uwaga: To jest przykład instrukcji, która nie stanowi osobnego typu kroku. Jest dostępna tylko wewnątrz tekstu edycji danych.

Składnia jest następująca: if ("xpath") else end-if;. Warunek XPath musi mieć wartość logiczną prawda lub fałsz. Poniżej przedstawiono kilka przykładów.

Przykład, w którym ścieżka XPath zawiera prosty warunek logiczny.

if ("string(parm/spouse/name) != $BLANK")
  //
  // Create spouse since spouse name present
  goto addSpouse;
else
  //
  // Create account without spouse
  goto addAccount;
end-if;

Przykład, w którym ścieżka XPath zawiera złożony warunek.

if ("string(parm/spouse/name) != $BLANK and string(parm/hasSpouse) = true or boolean(parm/requireSpouse)")
  //
  // Create spouse since spouse name present
  goto addSpouse;
end-if;

Przykład stosu zbioru instrukcji służącego do oceny wielu możliwych wartości pola.

if ("parm/rowCount = 0")
  //
  // no rows found
  goto quit;
end-if;
if ("parm/rowCount = 1")
  //
  // one row found
  goto process;
end-if;
if ("parm/rowCount > 1")
  //
  // more than one row found
  goto quit;
end-if;
quit: terminate;

Następująca ścieżka XPath przedstawia wartość logiczną na podstawie informacji o tym, czy węzeł istnieje. W tym przykładzie, jeśli węzeł istnieje w przetwarzanym dokumencie wystąpienia XML, instrukcja zwróci wartość prawda. Jeśli żaden element nie zostanie znaleziony, instrukcja zwróci wartość fałsz.

Uwaga: Jeśli węzły XPath są obsługiwane jako zmienne logiczne, należy pamiętać o tym, że pusty węzeł ma wartość prawda. Tylko brakujący węzeł powoduje zwrócenie wartości fałsz.
if ("boolean(parm/spouse/name)")
  goto addSpouse;
else
  //
  // Create account without spouse
  goto addAccount;
end-if;
 
if ("not(parm/spouse/name)")
  //
  // Create account without spouse
  goto addAccount;
else
  goto addSpouse;
end-if;

Instrukcja "for"

Instrukcja for umożliwia tworzenie listy węzłów lub wartości w zależności od wyrażenia XPath. Jeśli zostanie określony węzeł listy, wtedy wszystkie węzły podrzędne tej listy, wraz z ich zawartością, będą dostępne wewnątrz tej pętli. W przypadku określenia bezpośrednio węzła podrzędnego wewnątrz pętli będzie dostępna tylko lista wartości.

Uwaga: Więcej informacji o tworzeniu nowych wpisów na liście można znaleźć w przykładzie Tworzenie nowego wystąpienia listy.
Uwaga: To jest przykład instrukcji, która nie stanowi osobnego typu kroku. Jest dostępna tylko wewnątrz tekstu edycji danych.

Składnia jest następująca: for ($variable in "xpathList") end-for;. Warunek XPath musi mieć wartość logiczną prawda lub fałsz.

Następujące przykłady są oparte na tym prostym schemacie:

<schema>
  <SAList type="list">
    <id/>
    <balance/>
  </SAList>
  <SAContributor type="list">
    <id/>
  </SAContributor>
</schema>

W tym przykładzie w wyrażeniu XPath określono węzeł listy, co powoduje że można przetwarzać wszystkie węzły podrzędne.

move "0" to $AccountBalance;
move "0" to $index;
for ($SAList in "SAList")
    move "$SAList/balance + $AccountBalance" to $AccountBalance;
    //
    // keep track of each SA contributing to the balance in the SA Contributor list
    move "1 + $index" to $index;
    move "$SAList/id" to "SAContributor[$index]/id";
end-for; 

Przykład, w którym w wyrażeniu XPath określono węzeł podrzędny z węzła listy. W takim przypadku można przetwarzać tylko wartości z tego węzła.

move "0" to $AccountBalance;
for ($SABalance in "SAList/balance")
    move "$SABalance + $AccountBalance" to $AccountBalance;
end-for;

Przykład przedstawiający użycie filtra do ograniczenia liczby wybieranych wierszy na potrzeby pętli for.

move "0" to $AccountDebitBalance;
for ($SAList in "SAList[Balance>0]")
    move "$SAList/balance + $AccountDebitBalance" to $AccountDebitBalance;
end-for; 

Przykład przedstawiający użycie filtra w trakcie określania węzłów podrzędnych.

move "0" to $AccountCreditBalance;
for ($SABalance in "SAList[Balance<0]/balance")                 
    move "$SABalance + $AccountCreditBalance" to $AccountCreditBalance;                
end-for;

Przetwarzanie listy

W tej sekcji opisano szczegółowo przetwarzanie list. Przykłady użyte w tej sekcji odnoszą się do następującego schematu:

<schema>
  <parm type="group">
    <name/>
  </parm>
  <Person type="group">
    <names type="list">
      <type/>
      <name/>
    </names>
  </Person>
</schema>

Odwoływanie się do elementu listy. Możliwe jest przeniesienie wartości do konkretnego wystąpienia listy, odwołując się w filtrze do identyfikującego węzła z listy. Składnia jest następująca: move "xpath" to "xpathList[filtr]/element"; Przykład:

move "parm/name" to "Person/names[type='main']/name";

Tworzenie nowego wystąpienia listy. Można użyć specjalnego zapisu w docelowej instrukcji move, aby wskazać, że konieczne jest utworzenie nowego wystąpienia listy. Znak "+" wskazuje procesorowi skryptu, że w odniesieniu do docelowego elementu należy zainicjować nowe wystąpienie listy. Składnia jest następująca: move "xpath" to "+xpathList"; Przykład:

move "parm/name" to "Person/+names/name";

Kasowanie wystąpienia listy. Wpis listy XML można skasować z bazy danych, przenosząc atrybut czynności "delete" do nazwy elementu. Aby spowodować skasowanie z bazy danych wpisu listy, wymagany jest atrybut action="delete" w węźle docelowym i kolejna aktualizacja interakcji obiektu biznesowego. Składania jest następująca: move 'delete' to "xpathList@action"); Przykład:

if ("parm/action = 'd'") 
    move "0" to $index;
    for ($CCList in "CCList")
        move "1 + $index" to $index;
        if ("$CCList/id = parm/id")
            move 'delete' to "CCList[$index]@action";
            goto update;
        end-if;
    end-for;
end-if;

Poniżej przedstawiono wynikowy kod XML.

<root>
  <CCList>
    <id>9876538976</id>
    <balance>309.98</balance>
  </CCList>
  <CCList action="delete">
    <id>4321125899</id>
    <balance>87.45</balance>
  </CCList>
</root>
Uwaga: Kasowanie wystąpienia listy za pomocą atrybutu czynności jest ryzykowne, jeśli iteracyjne interakcje obiektu biznesowego są wymagane. Dokument XML zawierający wystąpienie listy do skasowania nie zostanie zmieniony po pomyślnym zakończeniu interakcji obiektu biznesowego, co oznacza, że dokument nadal będzie zawierać wystąpienie listy, mimo że nie będzie ono istnieć. Aby rozwiązać ten problem, trzeba ponownie wczytać obiekt biznesowy po każdej aktualizacji obiektu biznesowego, w której użyto atrybutu czynności "delete".
Uwaga: Alternatywą do opisanego tutaj atrybutu "delete", jest użycie czynności obiektu biznesowego replace. Manipulowanie listą w celu użycia czynności "replace" pozwala uniknąć wyżej opisanego problemu dotyczącego nieodświeżonych informacji w dokumentach zlecenia po aktualizacji obiektu biznesowego.

Funkcje służące do przetwarzania listy

Język XPath udostępnia kilka funkcji przydatnych do przetwarzania elementów listy, w tym count, sum i last.

Następujące przykłady są oparte na tym prostym dokumencie XML:

<xml>
  <ft>
    <type>bill</type>
    <date>20100101</date>
    <amt>30.30</amt>
    <cat>tax</cat>
  </ft>
  <ft>
    <type>adj</type>
    <date>20100301</date>
    <amt>20.20</amt>
    <cat>int</cat>
  </ft>
  <ft>
    <type>bill</type>
    <date>20100201</date>
    <amt>10.10</amt>
    <cat>tax</cat>
  </ft>
</xml>

Poniżej przedstawiono przykład funkcji sum. Składnia jest następująca move "sum(xpathList/element)" to $variable; Przykład przedstawia sumowanie łącznego salda.

move "sum(ft/amt)" to $TotalBalance;

Poniżej przedstawiono przykład funkcji sum wykorzystującej filtr w celu uzyskania sumy częściowej. W tym przykładzie sumowane są wpisy z kategorii "tax".

move "sum(ft[cat='tax']/amt)" to $TaxBalance;

Poniżej przedstawiono przykład funkcji count. Składania jest następująca: move "count(xpathList)" to $variable; W tym przykładzie znajdowana jest liczba wpisów FT na liście.

move "count(ft)" to $TranCount;

Poniżej przedstawiono przykład funkcji "last", która służy do znajdowania ostatniego wpisu. Składnia jest następująca: move "last(xpathList)" to $variable; W tym przykładzie znajdowana jest ostatnia kwota z listy FT.

move "ft[last()]/amt" to $LastAmount;

Deklarowanie i wywoływanie obiektów opartych na schemacie

W kroku "Edycja danych" można wywoływać obiekt biznesowy, usługę biznesową lub skrypt usługi. Aby umożliwić dynamiczne wywoływanie, można zadeklarować nazwę obszaru danych dynamicznych.

Deklarowanym schematem może być schemat obiektu biznesowego (OB), schemat usługi biznesowej (UB), schemat skryptu usługi (SU), schemat obszaru danych (OD) lub schemat odwzorowania interfejsu użytkownika. Instrukcja "declare" będzie się różnić w zależności od typu schematu, ale składnia jest podobna.

  • declareBO 'nazwa obiektu biznesowego' | $variable | "xpath" as 'DynamicDataArea';

  • declareBS "nazwa usługi biznesowej" | $variable | "xpath" as 'DynamicDataArea';

  • declareSS 'nazwa skryptu usługi' | $variable | "xpath" as 'DynamicDataArea';

  • declareDA 'nazwa obszaru danych' | $variable | "xpath" as 'DynamicDataArea';

  • declareMap 'nazwa odwzorowania' | $variable | "xpath" as 'DynamicDataArea';

Podczas wywoływania obiektu biznesowego, usługi biznesowej lub skryptu usługi nazwę obiektu można określić jako literał albo za pomocą wartości elementu lub zmiennej. Każde wywołanie musi zawierać odwołanie XPath do nazwy grupy.

W przypadku wywoływania obiektu biznesowego należy określić czynność. Składnia jest następująca: invokeBO 'nazwa obiektu biznesowego' | $variable | "xpath" używając "xpath" dla czynności;. Poniżej podano poprawne czynności:

  • read. Ta czynność umożliwia odczytanie bieżącego widoku danych obiektu biznesowego.

  • add. Ta czynność spowoduje dodanie obiektu oraz wczytanie i zwrócenie wynikowego widoku obiektu biznesowego.

  • fastAdd. Ta czynność spowoduje dodanie obiektu, ale nie powoduje wykonania kolejnej czynności "read" w celu zwrócenia wynikowego widoku obiektu biznesowego. Opcja ta jest lepsza niż czynność "add" pod względem wydajności, jeżeli nie ma powodu do ponownego odczytania nagrania.

  • update. Ta czynność spowoduje zaktualizowanie obiektu oraz wczytanie i zwrócenie wynikowego widoku obiektu biznesowego. Ta czynność spowoduje wykonanie funkcji "merge" na informacjach określonych w dokumencie XML żądania instrukcji "invoke" z istniejącymi danymi obiektu biznesowego. Użycie tej czynności pozwala skryptowi na wskazywanie tylko elementów, które się zmieniają.

  • fastUpdate. Ta czynność spowoduje zaktualizowanie obiektu, ale nie powoduje wykonania kolejnej czynności "read" w celu zwrócenia wynikowego widoku obiektu biznesowego. Opcja ta jest lepsza niż czynność "update" pod względem wydajności, jeżeli nie ma powodu do ponownego odczytania nagrania.

  • delete. Ta czynność umożliwia skasowanie obiektu.

  • replace. Ta czynność jest zamiennikiem czynności "update". Czynność "replace" całkowicie zastępuje istniejące dane obiektu biznesowego informacjami z dokumentu żądania. Zwykle czynność "replace" jest używana, gdy obiekt biznesowy zawiera listę, ponieważ łatwiej jest zastąpić wszystkie wystąpienia listy niż podejmować próbę scalenia listy, co wymaga specjalnej logiki do jawnego skasowania wystąpienia listy.

    Uwaga: Czynności "replace" należy używać w przypadku funkcji odwzorowania interfejsu użytkownika na potrzeby ładowania pliku CSV.
    Uwaga: Czynność "replace" nie jest obecnie obsługiwana w przypadku obiektów obsługi, które są obsługiwane na "stałej" stronie wykorzystującej metaforę listy do jednoczesnego wyświetlania wszystkich rekordów na stronie. Przykładem strony tego typu jest "Waluta".

Przykłady:

invokeBO 'BusinessObject' using "dataArea" for fastAdd;
 
invokeBO $variableBO using "dataArea" for fastUpdate;
 
invokeBO "daName/boElement" using "dataArea" for replace;

Składnia instrukcji "invoke" jest podobna dla usługi biznesowej i skryptu usługi. Usługa biznesowa/skrypt usługi są określane wraz z odwołaniem XPath do nazwy grupy:

  • invokeBS 'nazwa usługi biznesowej' | $variable | "xpath" using "xpath";

  • invokeSS 'nazwa skryptu usługi' | $variable | "xpath" using "xpath";

W przykładach użyto instrukcji invokeBS, ale instrukcje są podobne do instrukcji invokeSS.

invokeBS 'BusinessService' using "dataArea";
 
invokeBS $variableBS using "dataArea";
 
invokeBS "daName/bsElement" using "dataArea";

Ostrzeżenia obiektu biznesowego. Należy pamiętać, że w przypadku skryptów APB instrukcje invoke mogą też wskazywać sposób obsługi ostrzeżeń.

Składnia Opis Przykłady

with warn asError

Umożliwia wskazywanie, że ostrzeżenia powinny być traktowane jako błąd wyświetlany w odwzorowaniu interfejsu użytkownika. Tekst asError jest opcjonalny.

invokeBO 'BusinessObject' using "dataArea" for add with warn asError;

invokeSS 'ServiceScript' using "dataArea" with warn;

with warn popup

Umożliwia wskazywanie, że ostrzeżenia powinny być przedstawiane w standardowym okienku framework. W tym scenariuszu użytkownikowi wyświetlane są standardowe przyciski OK i Anuluj. Naciśnięcie przycisku OK oznacza kontynuację procesu. Naciśnięcie przycisku Anuluj oznacza przerwanie procesu. Jest to zalecane ustawienie.

invokeBS "daName/bsElement" using "dataArea" with warn popup;

with warn suppress

Umożliwia wskazywanie, że ostrzeżenia powinny być pomijane. To jest ustawienie domyślne, jeśli składnia bez ostrzeżenia zostanie dodana do instrukcji invoke.

invokeBS "daName/bsElement" using "dataArea" with warn suppress;

invokeSS 'ServiceScript' using "dataArea";
Uwaga: W przypadku skryptów usług wszystkie obiekty wywoływane ze skryptu usługi będą dziedziczyć poziom ostrzeżenia. W związku z tym, jeśli skrypt usługi zostanie wywołany z ostrzeżeniem, wszystkie zagnieżdżone instrukcje invoke zostaną też wywołane z ostrzeżeniem.

W przypadku skryptów APB należy również użyć logiki stosowanej po wywołaniu do obsługi błędów i ostrzeżeń (w przypadku użycia składni with warn as popup). Jeśli użytkownik kliknął przycisk "Anuluj" w wyskakującym ostrzeżeniu, w zmiennej systemowej $WARNING jest ustawiana wartość true. Jeśli wyświetlono odwzorowanie, logika powinna ponownie wyświetlić odwzorowanie (w którym powinien zostać ponownie wyświetlony komunikat ostrzegawczy). Umożliwia to użytkownikowi wprowadzenie ewentualnych zmian i ponowne zapisanie. Jeśli przed ostrzeżeniem nie wyświetlono odwzorowania, powinno nastąpić zakończenie przetwarzania logiki.

Zmienna systemowa $ERROR wskazuje, że wystąpił błąd. Jeśli przed błędem wyświetlono odwzorowanie, logika powinna ponownie wyświetlić odwzorowanie, w którym będzie widoczny błąd. Jeśli nie wyświetlono odwzorowania, w produkcie udostępniono skrypt APB F1–HandleErr, którego należy użyć do wyświetlenia błędu. Poniżej przedstawiono przykład typowej logiki obsługi błędu.

invokeBO "F1-DetermineBo/output/bo" using "boSchema" for update with warn popup;
if ("$WARNING")
   if ("map_schema/action = 'DEL'")  
     terminate;
   else
     goto maintMap;   
   end-if;
end-if;
if ("$ERROR")
  if ("map_schema/action != 'DEL'")
    goto maintMap;
  else
    transferControl 'F1-HandleErr';
  end-if;
end-if;

Zmienne systemowe i globalne

W poniższych tabelach przedstawiono zmienne systemowe i globalne, których można używać w skryptach.

Zmienne systemowe - wszystkie typy skryptów

Poniższych zmiennych systemowych można używać we wszystkich typach skryptów (skrypty usługi, skrypty wtyczki i skrypty APB).

Zmienna Opis Przykład
$BLANK Reprezentuje pusty węzeł.
if ("string(parm/spouse/name) != $BLANK")
  goto addSpouse;
end-if;
$CURRENT-DATE Reprezentuje bieżącą datę.

W przypadku skryptów APB jest to data przeglądarki.

W przypadku skryptów po stronie serwera jest to data serwera(i wpływa na nią logika nadpisania daty systemowej).

move "$CURRENT-DATE" to $tempDate;
$CURRENT-STD-DTTM Reprezentuje bieżącą datę i godzinę wyrażone w czasie standardowym (tj. bez żadnych opłat dodatkowych wynikających z czasu letniego/zimowego).
move "$CURRENT-STD-DTTM" to $tempDateTime;
$DEVICE-OS Reprezentuje system operacyjny urządzenia użytkownika.
move "$DEVICE-OS" to $tempDeviceOs;
$DEVICE-BROWSER Reprezentuje przeglądarkę urządzenia użytkownika.
move "$DEVICE-BROWSER" to $tempDeviceBrowser;
$DEVICE-DISPLAY-TYPE Reprezentuje typ wyświetlacza urządzenia użytkownika, tj. czy jest rozmiaru stacjonarnego, średniego, czy małego. Zwracanymi wartościami mogą być oraDesktop, oraTablet i oraPhone.
move "$DEVICE-DISPLAY-TYPE" to $tempDeviceDisplayType;
$DEVICE-INFO Umożliwia uzyskanie dostępu do wszystkich trzech właściwości urządzenia (DEVICE-OS, DEVICE-BROWSER i DEVICE-DISPLAY-TYPE). Każda wartość właściwości jest rozdzielona średnikiem.
move "$DEVICE-INFO" to $tempDeviceInfo;

Zmienne systemowe - tylko skrypty APB

Poniższe zmienne systemowe są dostępne / dotyczą tylko skryptów APB.

Zmienna Opis Przykład
$DOUBLE_​QUOTE Reprezentuje podwójny cudzysłów.
move "$DOUBLE_QUOTE" to $tempField;
$SINGLE_​QUOTE Reprezentuje apostrof.
move "$SINGLE_QUOTE" to $tempField;
$SPACE Zawiera pojedynczą spację.
move "$SPACE" to $tempField;
$SYSTEM-DATE Reprezentuje datę serwera. Należy pamiętać, że na datę wpływa logika nadpisania daty systemowej.
move "$SYSTEM-DATE" to $tempDate;

Zmienne systemowe - tylko skrypty serwera

Poniższe zmienne systemowe są dostępne / dotyczą tylko skryptów usługi i skryptów wtyczki.

Zmienna Opis Przykład
$ADDITIONAL-IP-INFO Żądanie HTTP zawiera pole nagłówka "Dodatkowy adres IP". Może być wypełnione przez wdrożenie, jeśli dostępne są jakieś informacje o serwerze proxy lub moduł równoważenia obciążenia, np. początkowy adres IP.
move "$ADDITIONAL-IP-INFO" to "parm/request/headerIpAddress";
$CURRENT-DTTM Reprezentuje bieżącą datę i godzinę.
move "$CURRENT-DTTM" to $tempDateTime;
$F1-INSTALLATION-TIMEZONE Reprezentuje kod strefy czasowej zdefiniowany w opcjach instalacji.
move "$F1-INSTALLATION-TIMEZONE" to $timeZone;
$LANGUAGE Reprezentuje kod języka wykorzystywany przez skrypt. Zwykle jest to domyślny język użytkownika.
move "$LANGUAGE" to $tempLanguage;
$PROCESS-DATE Reprezentuje datę procesu. Data procesu różni się od bieżącej daty, ponieważ data procesu jest stała w całym czasie wykonywania procesu. Na przykład, jeżeli skrypt usługi zapisze kilka obiektów biznesowych - data procesu jest inicjowana na początku wykonywania skryptu usługi, a każdy obiekt biznesowy będzie mieć domyślnie tę samą datę procesu. Bieżąca data, szczególnie bieżąca dat i godzina, będą odzwierciedlać rzeczywistą godzinę przetworzenia.
move "$PROCESS-DATE" to $tempDate;
$PROCESS-DTTM Reprezentuje datę i godzinę procesu. Należy pamiętać, że data i godzina procesu są inicjowane na początku konkretnego procesu i nie będą odzwierciedlać dokładnej daty i godziny aktualizacji.
move "$PROCESS-DTTM" to $tempDateTime;
$REQUESTING-IP-ADDRESS Reprezentuje adres IP z żądania HTTP. Należy pamiętać, że jeżeli żądanie jest przekazywane przez serwer proxy lub moduł równoważenia obciążenia, ten adres IP będzie adresem IP serwera proxy lub modułu równoważenia obciążenia, a nie adresem IP użytkownika. Więcej informacji można znaleźć w opisie zmiennej $ADDITIONAL-IP-INFO.
move "$REQUESTING-IP-ADDRESS" to "parm/request/systemIpAddress";
$USER Reprezentuje identyfikator użytkownika wykonującego skrypt.
move "$USER" to $tempUser;

Informacje na temat skryptów APB, które muszą znać ID bieżącego użytkownika, znajdują się w sekcji Przydatne wskazówki i porady.

Zmienne globalne

Skrypty APB i skrypty usługi mają dostęp do wartości definiowanych w zmiennych kontekstowych.

Po uruchomieniu skryptu APB z interfejsu użytkownika te zmienne są inicjowane automatycznie. Można się do nich odwoływać, umieszczając jeden znak dolara przed nazwą pola. Na przykład, jeśli PER_ID jest obsługiwaną zmienną globalną, wtedy w skrypcie APB można użyć odwołania $PER_ID:

move "$PER_ID" to "schema/customerId";

W przypadku skryptów usługi do zmiennych globalnych można się odwoływać, tylko jeśli skrypt usługi został wywołany bezpośrednio ze skryptu APB lub strefy w portalu. Jeśli skrypt usługi zostanie wywołany ze skryptu APB lub strefy portalu, będzie mieć dostęp do zestawu globalnych zmiennych kontekstowych wypełnionych w sesji interfejsu użytkownika. W przypadku tworzenia skryptów usługi pola globalne należy poprzedzić dwoma znakami dolara (zamiast jednego jak w skryptach BPA). Na przykład, jeśli PER_ID jest obsługiwaną globalną zmienną kontekstową, wtedy w skrypcie usługi można użyć odwołania $$PER_ID:

move $$PER_ID to "schema/customerId";
Uwaga: Zgodnie z opisem w sekcji Zmienne kontekstowe w skrypcie usługi można deklarować zmienne kontekstowe, które wykorzystują tę samą składnie z dwoma znakami dolara.

Wykonywanie skryptu i instrukcje przekazywania sterowania

Krok edycji danych umożliwia korzystanie z funkcji podobnej do typu kroku Wykonywanie skryptu i Przekazywanie sterowania. Dotyczy to tylko skryptów APB.

Składnia Poprawne wartości Komentarze

performScript

"Nazwa skryptu APB" Jawne zadeklarowanie skryptu do wykonania.
$Zmienna Skrypt do wykonania jest określany za pomocą zmiennej.
"XPath" Skrypt do wykonania jest określany za pomocą odwołania do ścieżki XPath w elemencie.

transferControl

Analogiczne do instrukcji performScript
Uwaga: Po zakończeniu wykonywania skryptu określonego w instrukcji performScript sterowanie zostanie zwrócone do wywołującego skryptu APB. Po zakończeniu wykonywania skryptu określonego w instrukcji transferControl sterowanie nie zostanie przekazane do skryptu wywołującego. Pełne sterowanie zostanie przydzielone do przekazanego skryptu.

Instrukcja "navigate"

Krok edycji danych umożliwia korzystanie z funkcji podobnej do typu kroku Przechodzenie do strony. Dotyczy to tylko skryptów APB.

Składnia Poprawne wartości Komentarze

navigate

"Kod nawigacji" Jawne zadeklarowanie opcji nawigacji.
$Zmienna Opcja nawigacji jest określana za pomocą zmiennej.
"XPath" Opcja nawigacji jest określana za pomocą odwołania do ścieżki XPath w elemencie.

Ponadto krok edycji danych umożliwia wskazywanie konieczności odświeżenia kartoteki podczas nawigacji. Dotyczy wyłącznie skryptów APB.

Składnia Poprawne wartości

navigateAndReloadDashboard

Analogiczne do instrukcji navigate

Deklarowanie obiektu biznesowego z grupą obiektu biznesowego

Ta instrukcja jest przeznaczona do skryptów APB, w których ma być używany skrypt podstawowy przetwarzania obsługi głównego obiektu biznesowego (F1–MainProc) na potrzeby instrukcji "generate edit map". Skrypt oczekuje, że dane używane do wyświetlania w odwzorowaniu jest w znaczniku boGroup.

Składnia Poprawne wartości Komentarze

declareBOWithBOGroup

"Nazwa OB" Jawne zadeklarowanie obiektu biznesowego.
$Zmienna Obiekt biznesowy jest określany za pomocą zmiennej.
"XPath" Obiekt biznesowy jest określany za pomocą odwołania do ścieżki XPath w elemencie.

W poniższej tabeli przedstawiono informacje dotyczące składni tej instrukcji.

Składnia Poprawne wartości

as

"Nazwa dynamicznego schematu"

Przykłady:

declareBOWithBOGroup 'BusinessObject' as 'newMapSchema';
 
declareBOWithBOGroup $variableBO as 'newMapSchema';
 
declareBOWithBOGroup "daName/boElement" as 'newMapSchema';

Instrukcja "invoke map"

Krok edycji danych umożliwia korzystanie z funkcji podobnej do typu kroku Wywoływanie odwzorowania. Dotyczy to tylko skryptów APB.

Składnia Poprawne wartości Komentarze

invokeMap

"Nazwa odwzorowania" Jawne zadeklarowanie odwzorowania interfejsu użytkownika.
$Zmienna Odwzorowanie interfejsu użytkownika jest określane za pomocą zmiennej.
"XPath" Odwzorowanie interfejsu użytkownika jest określane za pomocą odwołania do ścieżki XPath w elemencie.

W poniższej tabeli przedstawiono informacje dotyczące składni tej instrukcji.

Składnia Poprawne wartości Komentarze

using

"Nazwa grupy obszaru danych" Wskazuje obszar danych, który ma być przekazywany do i z serwera podczas wyświetlania formularza HTML powiązanego z odwzorowania.

target

bpa

page

popup

Więcej informacji o wartościach celu można znaleźć w sekcji typu kroku Wywoływanie odwzorowania.

Jeśli odwzorowanie interfejsu użytkownika ma zwracać wartość, może być szacowane przy użyciu zmiennej $MAP-VALUE.

invokeMap 'UI Map' using "dataArea";
 
invokeMap $variableMap using "dataArea";
 
invokeMap "daName/mapElement" using "dataArea" target bpa;
 
// $MAP-VALUE is a variable returned by the invoked map.
if ("$MAP-VALUE='continue' ")
    goto 300;
else
    terminate;
end if;

Instrukcje "generate edit map"

Instrukcje 'generate edit map' służą do dynamicznego generowania i uruchamiania odwzorowań edycji interfejsu użytkownika na podstawie definicji schematu. Może być używany schemat obiektu biznesowego, schemat usługi biznesowej, schemat skryptu usługi lub schemat obszaru danych. Dotyczy to tylko skryptów APB. Instrukcja "generate" będzie się różnić w zależności od typu schematu, ale składnia jest podobna.

Składnia

generateBOEditMap

generateBSEditMap

generateSSEditMap

generateDAEditMap

Kod obiektu biznesowego/kod usługi biznesowej/kod skryptu usługi/kod obszaru danych można określać za pomocą literału (ujętego w pojedyncze cudzysłowy), jako zmienną tymczasową lub odwołując się do lokalizacji schematu XPath (ujętej w podwójne cudzysłowy).

W poniższej tabeli przedstawiono informacje dotyczące składni tej instrukcji.

Składnia Poprawne wartości Komentarze

using

"Nazwa grupy obszaru danych" Wskazuje obszar danych, który ma być przekazywany do i z serwera podczas wyświetlania formularza HTML powiązanego z odwzorowania.

target

bpa

page

popup

Wartości docelowe wskazują, gdzie generowane odwzorowanie ma być wyświetlane zgodnie z opisem w sekcji typu kroku Wywoływanie odwzorowania. Jeśli odwzorowanie interfejsu użytkownika ma zwracać wartość, może być szacowane przy użyciu zmiennej $MAP-VALUE.

W przykładach użyto instrukcji generateBOEditMap, ale instrukcje są podobne w innych typach schematów.

generateBOEditMap 'BO Name' using "dataArea";
 
generateBOEditMap $variableMap using "dataArea";
 
generateBOEditMap "daName/mapElement" using "dataArea" target bpa;
 
// $MAP-VALUE is a variable returned by the invoked map.
if ("$MAP-VALUE='continue' ")
    goto 300;
else
    terminate;
end if;

Instrukcja "terminate"

Krok edycji danych umożliwia korzystanie z funkcji podobnej do typu kroku Zakończenie.

Poniżej przedstawiono przykład prostego kroku Zakończenie, który spowoduje zatrzymanie skryptu.

if ("not(parm/spouse/name)")
  terminate;
else
  goto addSpouse;
end-if;

Instrukcja terminate with error jest dostępna tylko w skrypcie usługi.

Uwaga: Informacje na temat zgłaszania błędów przez skrypt APB można znaleźć w sekcji Przydatne wskazówki i porady.
Składnia Atrybuty Komentarze

terminate with error (x, y %n= element= )

"x" reprezentuje kategorię komunikatu Wymagane.
"y" reprezentuje numer komunikatu Wymagane.
%n="Element XPath" lub %n="literał" Należy określić parametry zamienne obsługiwane przez komunikat, używając wartości literałowych lub odwołań XPath. Jeśli wartość do zastąpienia jest elementem listy, należy użyć XPath elementu z listy zakwalifikowanej przez wystąpienie listy.
element="Element XPath" lub element=$variable Opcjonalnie można określić nazwę elementu w odwzorowaniu interfejsu użytkownika do wyróżnienia jako część błędu. Jeśli błędny element znajduje się na liście, należy użyć XPath elementu z listy zakwalifikowanej przez wystąpienie listy.

Przykład pola prostego:

if ("string(customer/lastName) = $BLANK")
  terminate with error (8000, 1001 %1="customer/lastName" %2='Last name required' element='customer/lastName');
end-if;

Przykład zakończenia, gdy element do oznaczenia znajduje się na liście:

for ($list in "parm/hard/newBusinessObject/listName") 
  if //** check some condition for elementName
      terminate with error (11000, 11000 %1="$list/elementName" element='$list/elementName');
  end-if;
end-for;
Szybki dostęp: Więcej informacji o przedstawianiu błędów w odwzorowaniu interfejsu użytkownika można znaleźć w sekcji Błędy wyświetlania.

Wywoływanie kodu Groovy

Jeśli istnieje skrypt wtyczki lub skrypt usługi, który zawiera zarówno skrypty XPath, jak i skrypty Groovy, w kroku Edycja danych obsługiwana jest możliwość wywoływania kodu Groovy przy użyciu składni invokeGroovy 'method'; gdzie "method" to nazwa metody zdefiniowana w kroku Elementy Groovy w ramach skryptu. W ten sposób można wywoływać tylko metody, które nie otrzymują argumentów i zwracają puste wartości. Natomiast metoda wywołana z kroku edycji danych może być obsługiwana przez dodatkowy kod Groovy w innych typach kroku Elementy Groovy.

Przykładowy krok Edycja danych:

invokeGroovy 'invoke';

Przykładowy krok Elementy Groovy:

void invoke() {
  initParms()
  readBO()
  initConfig()
  retrieve()
  updateBO()
}
Uwaga: Jak wspomniano w sekcji Użycie kodu Groovy w skryptach, jeśli jest to skrypt wtyczki, a kod to wyłącznie Groovy, należy użyć wersji motoru skryptu Groovy, a nie powyższej techniki. Jest to uważane za bardziej efektywne, ponieważ pozwala uniknąć konwersji danych na interfejs XML i z tego interfejsu.

Debugowanie skryptu APB

Jeśli skrypt APB ma wysokość większą niż zero, wtedy zaznaczone węzły obszaru danych skryptu można wyświetlać w czasie wykonywania. Dane XML są wyświetlane w trakcie wykonywania skryptu wewnątrz obszaru wyświetlania skryptu APB. Należy określić ścieżkę XPath węzła XML z dowolnego obszaru danych skryptu APB między parą znaków: "%+" i "+%".

Na przykład całą zawartość węzła grupy schematu o nazwie "input" i konkretna zawartość elementu schematu o nazwie "output/status" będą wyświetlane w obszarze wyświetlania skryptu APB. Tekst debugowania należy wprowadzić w obszarze tekstu skryptu APB, a nie w polu edycji danych skryptu. Tekst debugowania można deklarować dla dowolnego jawnego kroku skryptu.

display input: %+input+% , and output status: %+output/status+%

Przydatne wskazówki i porady

W tej sekcji przedstawiono kilka sugestii dotyczących sposobu wdrażania często stosowanej logiki.

Wyszukiwanie zalogowanego użytkownika w APB

W przypadku skryptów serwerowych zmienna $USER jest wypełniana danymi aktualnie zalogowanego użytkownika. Ta zmienna jest niedostępna dla skryptów APB. W razie potrzeby APB może wywołać skrypt usługi F1-GetUser.

Zgłaszanie błędu przez skrypt APB

W przypadku skryptów serwerowych należy użyć instrukcji terminate with error w celu zwrócenia komunikatu o błędzie wyświetlanego użytkownikowi. APB może wyświetlić ten błąd, przekazując kontrolę do F1-HandleErr zgodnie z opisem w sekcji Deklarowanie i wywoływanie obiektów opartych na schemacie. Nie jest to obsługiwane w przypadku skryptu APB. Techniką dostępną dla APB w celu zgłaszania błędu jest wywołanie usługi biznesowej F1-RethrowError z przekazaniem szczegółów błędu. Ta usługa biznesowa służy do wypełniania odpowiednich pól błędów systemowych wymaganych do zgłoszenia błędu. Następnie należy przekazać kontrolę do F1-HandleErr.

  if ("string($assignedToUser) != string(F1-GetUser/user)")
    declareBS 'F1-RethrowError' as 'errorMsg';
    move '11010' to "errorMsg/messageCategory";
    move '11511' to "errorMsg/messageNumber";
    move "$toDoEntryId" to "errorMsg/messageParameters/+parameters/parameterValue";
    invokeBS 'F1-RethrowError' using "errorMsg";
    transferControl 'F1-HandleErr';  
  end-if;