System-Skriptsprache: Allgemeine Funktionen, Funktionen für OQL-Anweisungen (Result list functions)

Mithilfe der Funktion getResultList lässt sich die Datenbank per OQL-Anweisung abfragen. Die Funktion gibt das Ergebnis als eine zweidimensionale Liste von Zeilen und Spalten zurück.

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

getResultList

Name getResultList
Beschreibung getResultList öffnet mithilfe einer OQL-Anweisung beliebige Daten aus der Datenbank.
Signaturen 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)

Parameter oql ist eine OQL-Anweisung. Weitere Informationen finden Sie im Dokument OQL-Syntax, Abschnitt Abfrage über getResultSet.

database ist der Name der Datenbank, auf der sich die Daten befinden. Wenn sich die Daten nicht auf der Datenbank befinden, 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 Numberund CisDatebesonders 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 Datensätzen, die zurückgegeben werden. Wird count nicht spezifiziert, so wird maximal ein Datensatz 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 Ergebniszeilen zurück. Jede Ergebniszeile wird wiederum durch eine Liste von Einzelwerten dargestellt. Wurden keine Datensätze gefunden, wird eine leere Liste zurückgeben.
Fehlerquellen Im Fehlerfall wird der Wert nullzurückgeben.
Beispiele cast(String, getResultList("SELECT p:number FROM com.cisag.app.general.obj.Partner p ORDER BY p:updateInfo.createTime ASC", list(), 1)[0][0]) gibt die Identifikation des zuerst erfassten Partners als eine Zeichenkette zurück.

cast(Number, getResultList("SELECT COUNT(*) FROM com.cisag.app.general.obj.Partner p WHERE p:human = ?", list(true), 1)[0][0]) gibt die Anzahl der als Partner erfassten Personen als Zahl zurück.

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

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 prüft in der Übergangsbedingung einer Aktivitätsdefinition, ob eine offene Aktivitäts-Instanz aus derselben Aktivitätsdefinition existiert. Diese Übergangsbedingung stellt sicher, dass höchstens eine offene Aktivität vorhandenen ist. 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 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 ermittelten Datensätze als eine zweidimensionale Liste vom Datentyp Unknown[][]zurückgegeben werden, müssen Sie die Listenelemente typisieren, bevor Sie sie verwenden.

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

Siehe auch getCisObjectList

Folgendes Beispiel aus der Aktivitätsdefinition help.getResultList 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 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);
}

 

Beispiel: Weitere Felder abfragen

Folgendes Beispiel aus einer Aktivitätsdefinition des Typs Funktionsaufruf gibt die Werte mehrerer weiterer Felder eines Partners zurück. Die Namen der weiteren Felder fangen mit dem Präfix ft_ an gefolgt vom Namen des verwendeten Feldtypen.

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

Ein weiteres Feld kann auch mithilfe einer s. g. dbo-Funktion abgefragt werden. Da jede dbo-Funktion einen Datenbankzugriff verursacht, können Sie eine OQL-Abfrage mit einem DYNAMIC_OBJECT JOIN verwenden, um alle weiteren Felder einer Business Object-Instanz mit einem einzigen Datenbankzugriff abzufragen. Besitzt ein Business Object viele weitere Felder, lassen sich dadurch die Anzahl der Datenbankzugriffe reduzieren. Die OQL-Abfrage lässt sich auch in Kontexten verwenden, wo die dbo-Funktionen nicht zur Verfügung stehen, wie z. B. in individuellen Prüfungen.

Bitte beachten Sie, dass Sie nur Einzelwerte und keine Wertelisten abfragen können. Auch lassen sich weitere Felder des Feldtyps Business Object nicht per OQL abfragen.

Beispiel: Indikator für die Anzahl offener Kommissionen

Folgendes Beispiel einer Aktivitätsdefinition vom Typ Funktionsaufruf ermittelt mithilfe der Funktion getResultList die Anzahl der komissionierten aber noch nicht gelieferte Lieferaufträge. Das Ergebnis wird der Ergebnisvariablen VALUE zugewiesen, damit die Aktivitätsdefinition in einem dynamischen Indikator in der Anwendung Dashboard verwendet werden kann.

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

Weitere Informationen zu den dynamischen Indikatoren und ihrer Verwendung auf dem Dashboard finden Sie in im Hilfedokument Dynamische Indikatoren.

Czy ten artykuł był pomocny?