System-Skriptsprache: Allgemeine Funktionen, Funktionen für Business Objects (Business object functions)

Mithilfe der Funktionen für Business Objects lassen sich beliebige Business Objects aus der Datenbank öffnen und auswerten. Zu den Funktionen für Business Objects gehören:

Grundlegende Informationen zu den allgemeinen Funktionen der System-Skriptsprache erhalten Sie im Dokument System-Skriptsprache: Allgemeine Funktionen.

getAttribute

Name getAttribute
Beschreibung getAttribute gibt den Wert eines Attributs eines Business Objects oder einer Objektsicht zurück.
Signaturen Unknown getAttribute(CisObject object, String path)

Unknown getAttribute(DataView view, String path)

Parameter object ist ein Business Object.

view ist eine Objektsicht.

attribute ist der Name des Attributs.

Ergebnis Die Funktion gibt den Wert des Attributs des Business Objects bzw. der Objektsicht mit dem Datentyp Unknown zurück.
Fehlerquellen Wenn das Attribut mit dem Pfad path nicht existiert, dann entsteht ein Laufzeitfehler.
Beispiele loadCurrency(getCorporateCurrency(cast(Guid, getAttribute(parameters.object, "_organization")))):isoCodegibt den ISO-Code der Leitwährung der Organization zurück, in dessen Kontext das von parameters.object referenzierte Business Object erfasst wurde.
Kontext ALL
Hinweise Verwenden Sie diese Funktion, um Attribute, die mit einem Unterstrich anfangen, auszuwerten.

Bevor Sie das Attribut verwenden, sollten Sie es in einen zum Attribut passenden Datentyp umwandeln.

Siehe auch

Folgendes Beispiel aus der Aktivitätsdefinition help.getAttribute zeigt die Werte der internen Attribute des Business Objectsr für Artikelwerte (com.cisag.app.inventory.obj.ItemValuationData) an:

  • Zeitzone (Attribut _timeZoneGuid)
  • Organization (Attribut _organization)
  • Wechselkursdatum (Attibut _conversionDate)
  • Hauswährungskombination (Attribut _currencyCombo)
function create()
{
var p_organization := parameters.ORGANIZATION;
var p_item := parameters.ORGANIZATION;
var r_timeZoneId := "";
var r_organization := "";
var r_conversionDate := "";
var r_currencyCombination := "";

var itemValuationData := getByPrimaryKey(CisObject(com.cisag.app.inventory.obj.ItemValuationData), loadOrganization(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_organization := loadOrganization(cast(Guid, getAttribute(itemValuationData, "_organization"))):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_organization;
result.VALUE3 := r_conversionDate;
result.VALUE4 := r_currencyCombination;
}

 

getByBusinessKey

Name getByBusinessKey
Beschreibung getByBusinessKey öffnet ein Business Object über dessen Business Key.
Signaturen CisObject(X) getByBusinessKey(CisObject(X), A1, A2, … , An)

CisObject(X) getByBusinessKey(String database, CisObject(X), A1, A2, … , An)

Parameter X ist der vollqualizierte technische Name eines Business Objects.

A1, A2, …, An sind Werte für die Attribute im Business Key des Business Objects.

database ist der Name der Datenbank, auf der sich das Business Object befindet. Wenn sich das Business Object nicht auf der Datenbank befindet, auf der die Aktivität gespeichert ist, muss zusätzlich die Datenbank angegeben werden. Mögliche Werte sind: OLTP, OLAP, REPOSITORY, CONFIGURATION. Alternativ können Sie auch den Namen einer Datenbank in dem System angeben z. B. QAS60010.

Ergebnis Die Funktion gibt das Business Object als typisiertes CisObject zurück.
Fehlerquellen Existiert kein Business Object mit den angegebenen Attributwerten, so wird der Wert nullzurückgegeben.

Achten Sie auch darauf, dass Sie die Attributwerte in der korrekten Reihenfolge des Business Keys angeben.

Beispiele getByBusinessKey(CisObject(com.cisag.app.general.obj.Partner), "10010") hat das gleiche Ergebnis wie loadPartner("10010").

getByBusinessKey(CisObject(com.cisag.app.sales.obj.SalesOrder), getByBusinessKey(CisObject(com.cisag.app.sales.obj.SalesOrderType), "100"):guid, "01234") gibt den Vertriebsauftrag 100-01234 zurück.

Kontext ALL
Hinweise Da das Business Object über den Persistenzdienst geöffnet wird, verursacht die Funktion ggf. keinen Datenbankzugriff. Daher ist getByBusinessKey vor der Funktion getCisObjectList zu bevorzugen, wenn nur eine Instanz eines Business Objects geöffnet werden soll.

Bei versionierten Business Objects können Sie mit der Funktion getByBusinessKey nur die aktuell gültige Version öffnen. Möchten Sie eine vergangene oder künftige Version öffnen, dann können Sie z. B. die Funktion getCisObjectList unter Angabe der Attribute validFrom und validUntil verwenden.

Die Attribute des Business Keys eines Business Objects werden in der Anwendung Entwicklungsobjekte angezeigt.

Siehe auch getByPrimaryKey

Folgendes Beispiel aus der Aktivitätsdefinition help.getByBusinessKey öffnet einen Vertriebsauftrag über dessen Typ und Nummer und ermittelt den Kunden:

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

Name getByPrimaryKey
Beschreibung getByPrimaryKey öffnet ein Business Object über dessen Primärschlüssel.
Signaturen CisObject(X) getByPrimaryKey(CisObject(X), A1, A2, … , An)

CisObject(X) getByPrimaryKey(String database, CisObject(X), A1, A2, … , An)

Parameter X ist der vollqualifizierte technische Name eines Business Objects.

A1, A2, …, An sind Werte für die Attribute im Primärschlüssel des Business Objects.

database ist der Name der Datenbank, auf der sich das Business Object befindet. Wenn sich das Business Object nicht auf der Datenbank befindet, auf der die Aktivität gespeichert ist, muss zusätzlich die Datenbank angegeben werden. Mögliche Werte sind: OLTP, OLAP, REPOSITORY, CONFIGURATION. Alternativ können Sie auch den Namen einer Datenbank in dem System angeben z. B. QAS60010.

Ergebnis Die Funktion gibt das Business Object als typisiertes CisObject zurück.
Fehlerquellen Existiert kein Business Object mit den angegebenen Attributwerten, so wird der Wert nullzurückgegeben.

Achten Sie auch darauf, dass Sie die Attributwerte in der korrekten Reihenfolge des Primärschlüssels angeben.

Beispiele getByPrimaryKey(CisObject(com.cisag.app.general.obj.Employee), loadPartner("70010"):guid) öffnet die Mitarbeiterdaten des Partners 70010.

getByPrimaryKey("CONFIGURATION", CisObject(com.cisag.sys.configuration.obj.User), parameters.userGuid):emailAddress gibt die im Systemcockpit hinterlegte E-Mail-Adresse des Benutzers zurück, der das Ereignis vom Typ Business Event ausgelöst hat.

Kontext ALL
Hinweise Da das Business Object über den Persistenzdienst geöffnet wird, verursacht die Funktion ggf. keinen Datenbankzugriff. Daher ist getByPrimaryKey vor der Funktion getCisObjectList zu bevorzugen, wenn nur eine Instanz eines Business Objects geöffnet werden soll.

Bei versionierten Business Objects können Sie mit der Funktion getByPrimaryKey nur die aktuell gültige Version öffnen. Möchten Sie eine vergangene oder künftige Version öffnen, dann können Sie z. B. die Funktion getCisObjectList unter Angabe der Attribute validFrom und validUntil verwenden.

Die Attribute des Primärschlüssels eines Business Objects werden in der Anwendung Entwicklungsobjekte angezeigt.

Siehe auch getByBusinessKey

Folgendes Beispiel aus der Aktivitätsdefinition help.getByPrimaryKey öffnet die Mitarbeiterdaten eines Partners und gibt die Personalnummer zurück:

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

Name getCisObjectList
Beschreibung getCisObjectList gibt eine Liste von Business-Object-Instanzen zurück, die mithilfe einer OQL-Anweisung ermittelt werden.
Signaturen 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)

Parameter oql ist eine OQL-Anweisung. Sie muss nach dem Muster SELECT FROM… erfasst sein. Weitere Informationen finden Sie im Dokument OQL-Syntax, Abschnitt Einfache Abfrage über getObjectIterator.

database ist der Name der Datenbank, auf der sich das Business Object befindet. Wenn sich das Business Object nicht auf der Datenbank befindet, auf der die Aktivität gespeichert ist, muss zusätzlich die Datenbank angegeben werden. Mögliche Werte sind: OLTP, OLAP, REPOSITORY, CONFIGURATION. Alternativ können Sie auch den Namen einer Datenbank in dem System angeben z. B. QAS60010.

parameters ist eine Liste mit Parameterwerten für die OQL-Anweisung. Unterstützt werden die Datentypen Boolean, String, Number, Guid, Timestamp, CisDateund Bytes. Dabei werden Number und CisDate besonders behandelt. Wird eine Zahl ohne Nachkommastellen übergeben, so wird der Parameter als eine Ganzzahl (int) behandelt, ansonsten als eine Dezimalzahl (CisDecimal). Achten Sie darauf, dass Sie bei Parametern für Attribute von den Java-Datentypen byte, short, intoder longkeine Zahlen mit Nachkommastellen übergeben. CisDatewird generell in einen Timestampumgewandelt.

count ist die maximale Anzahl von Business-Object-Instanzen, die zurückgegeben werden. Wird count nicht spezifiziert, so wird maximal eine CisObject-Instanz zurückgegeben. Geben Sie einen möglichst kleinen Wert an, da ein zu groß gewählter Wert die Leistung des Systems negativ beeinflussen kann. Der Maximalwert ist beschränkt. Weitere Informationen finden Sie im Kapitel Komplexität von Ausdrücken beschränken des Hilfedokuments Einführung: System-Skriptsprache.

Ergebnis Die Funktion gibt bei einer fehlerfreien Ausführung eine Liste von CisObjects zurück. Wurden keine Datensätze gefunden, wird eine leere Liste zurückgeben.
Fehlerquellen Im Fehlerfall wird der Wert null zurückgeben.
Beispiele 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 gibt die Identifikation des zuerst erfassten Partners zurück.

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]) gibt den Partner zurück, der mit demjenigen Benutzer verknüpft ist, der das Ereignis vom Typ Business Entity ausgelöst hat.

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)) iteriert über die zehn gesperrten Vertriebsaufträge der Vertriebsauftragsart 100 oder 200 mit dem größten Belegdatum.

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)) prüft in der Übergangsbedingung des Startknotens, ob eine offene Prozess-Instanz aus derselben Prozessdefinition existiert. Diese Übergangsbedingung stellt sicher, dass der Prozess nicht mehrmals gestartet wird. Bitte beachten Sie, dass das erste Element der Parameterliste keine fachliche Bedeutung hat. Es wurde nur deshalb hinzugefügt, weil die Datentypen Guidund Numbernicht in einander umgewandelt werden können. Alternativ könnten die ValueSet-Werte direkt im OQL-Statement kodiert werden (auch wenn dies die Leistung negativ beeinflussen könnte), oder die Parameterliste könnte mithilfe der Funktion add erzeugt und die Bedingung in der Funktion create überprüft werden. Gibt es bereits eine offene Prozess-Instanz, dann kann die Aktivitätserzeugung mithilfe des Befehls abort bzw. abortProzess abgebrochen werden.

Kontext ALL
Hinweise Parameter für die OQL-Anweisung sollen nicht in der OQL-Anweisung fest vorgegeben werden, sondern über Parameter mit ? als Platzhalter an die Funktion übergeben werden. Wenn Parameter in der OQL-Anweisung als Konstanten statt mit Platzhaltern kodiert werden, kann die Leistung des Systems negativ beeinflusst werden.

Beim Erzeugen einer Liste mithilfe der Funktion list übernehmen die Listenelemente den Datentyp des ersten Elements. Besitzt die OQL-Anweisung Parameter von Datentypen, die nicht in einander umgewandelt werden können, dann können Sie eine leere Liste vom Datentyp Unknown[]deklarieren und mithilfe der Funktion add Elemente unterschiedlicher Datentypen hinzufügen.

Beispiel
var parameterList := new(Unknown[]);
add(parameterList, now());
add(parameterList, 10);
add(parameterList, "100");

Da die Funktion eine untypisierte Liste von CisObject zurückgibt, müssen Sie die Sie Listenelemente typisieren, bevor Sie sie verwenden.

Da getCisObjectList einen Datenbankzugriff verursacht, ist die Funktion getByBusinessKey zu bevorzugen, wenn nur eine Instanz eines Business Objects geöffnet werden soll.

Siehe auch getResultList

Folgendes Beispiel aus der Aktivitätsdefinition help.getCisObjectList gibt die 10 zuletzt erfassten Vertriebsaufträge eines Kunden zurück:

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);
}

 

Beispiel: Interne Personen abfragen

Folgendes Beispiel ermittelt alle internen Personen in der Datenbank. Da die Funktion getCisObjectList nicht beliebig viele Instanzen zurückgeben kann, werden die Personen nach dem indizierten Attribut number blockweise abgefragt und der Liste partnerList hinzugefügt. Erst wenn die Abfrage weniger Instanzen als die Blockgröße zurückgibt, ist die Ermittlung aller internen Personen abgeschlossen.

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;
}
}

 

Beispiel: Dynamische OQL-Anweisung

Folgendes Beispiel baut eine dynamische OQL-Anweisung für den Export von Partnern auf, die gestern erfasst oder geändert wurden. Da die Aktivitätsdefinition die Hintergrundanwendung com.cisag.pgm.bi.Export ausführt, muss die Variable dynSQL außerhalb der Funktion create deklariert und der Wert über den Parameter SearchName an die Hintergrundanwendung übergeben werden.

var dynOQL as String;

function create()
{
/* Get begin and end times for dynamic OQL*/
var endTime := startOfDay(now());
var beginTime := addDays(endTime, -1);

/* Create time particles for dynamic 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");

/* Get default time zone ID of the system */
var timeZoneId := timeZoneId(today());

/* Create dynamic 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

Name getURL
Beschreibung getURL erzeugt eine URL für ein Business Object.
Signaturen String getURL(CisObject object)

String getURL(String serverName, CisObject object)

String getURL(Guid databaseGuid, CisObject object)

String getURL(String serverName, Guid databaseGuid, CisObject object)

Parameter object ist das Business Object, für das die URL erzeugt werden soll.

serverName ist der Name eines Application Servers, auf den die URL zeigen soll. Wenn der Servername nicht angegeben wird, wird der aktuelle Application-Server verwendet.

databaseGuid ist die Datenbank, auf die die URL zeigen soll. Wenn keine Datenbank-Guid angegeben wird, so wird bei OLTP-Aktivitäten die aktuelle OLTP-Datenbank und bei Repository-Aktivitäten die Repository-Datenbank für die URL verwendet.

Ergebnis Eine URL für das Business Object als Zeichenkette.
Fehlerquellen Keine.
Beispiele getURL(loadPartner("10010")) gibt eine URL für den Partner 10010 zurück.

formatDescriptionHTML("process", "<a href=\"" + getURL(getByBusinessKey(CisObject(com.cisag.sys.workflow.obj.Process), process.Code)) + "\">" + toHtml(process.Code) + "</a>") ersetzt den Platzhalter {process} in der Aktivitätsbezeichnung durch einen klickbaren Link zum Prozess.

Kontext ALL
Hinweise Sie können die URL z. B. für HTML-Tags in der Bezeichnung von Aktivitäten verwenden.
Siehe auch

Folgendes Beispiel aus der Aktivitätsdefinition help.getURL erzeugt eine URL für einen Partner:

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);
else
r_URL := getURL(p_server, cast(Guid, p_database), partner);
}
result.URL := r_URL;
}

Czy ten artykuł był pomocny?