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)
|
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: parameters ist eine Liste mit Parameterwerten für die OQL-Anweisung. Unterstützt werden die Datentypen 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 null zurü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.
|
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 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 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.