| Auszug |
|---|
|
Nuclos DatasourceProvider: run, DatasourceResult, rows, columns, Datenquelle, callDBFunction, Oracle, Map Parameter. |
Sprache: Deutsch · English
DatasourceProvider
Datenquellen aus Regeln ausführen – run(), DatasourceResult, rows/columns und Datenbankfunktionen.
| Status |
|---|
| colour | Blue |
|---|
| title | Entwickler |
|---|
|
| Status |
|---|
| colour | Green |
|---|
| title | Stand: Jul 2026 |
|---|
|
| Status |
|---|
| colour | Grey |
|---|
| title | gilt fuer Nuclos 4.2026.x |
|---|
|
Wozu dient der DatasourceProvider?
Der DatasourceProvider führt eine Datenquelle (aus Report und Formular) programmatisch aus.
run(datasourceClass[, params])
Führt die Datenquelle aus und liefert ein DatasourceResult mit Zeilen (rows) und Spalten (columns). Parameter werden optional als Map übergeben.
Allgemein
Der DatasourceProvider ist eine Hilfsklasse, die alle notwendigen Methoden zur Ausführung eines Datenquellen-Abfrage beinhaltet.
Funktionsumfang
...
Diese Methode ermöglicht die Ausführung einer Datenbankabfrage. Im Methodenaufruf muss die Datenquelle aus "Report und Formular" angegeben werden.
Der Rückgabewert der Methode ist ein DatasourceResult-Objekt, das die gefundenen Treffer (rows) und die abfragbaren Spalten (columns) beinhaltet.
...
public DatasourceResult run(Class<? extends Datasource> datasourceClass) throws BusinessException; |
...
Für eine Datenabfrage können u.U. Parameter zur Präzisierung der Abfrage notwendig sein. In diesem Fall gibt es eine zweite run-Methode(), die eine Map mit den Werten an die Abfrage weiterleiten kann:
...
public DatasourceResult run(Class<? extends Datasource> datasourceClass, Map<String, Object> params) throws BusinessException; |
Das DatasourceResult - Objekt stellt das Suchergebnis der Datenbankabfrage dar. Hauptbestandteile sind:
- rows (Gefundene Zeilen/Treffer der angegebenen Datenbankabfrage; Jede Zeile wird als Object[] -Array dargestellt, wobei jedes Object in diesem Array den Inhalt der entsprechenden Spalte aufnimmt)
- cols (Spalten vom Typ DatasourceColumn, welches die Metainformationen Spaltenname und Spalten-Datentyp beinhaltet; Jede gefundene Zeile/row besitzt die hier hinterlegten Spalten)
Die Abfrage der Ergebnisse basiert auf folgendem Prinzip: Iteriert werden die Ergebnisse mittels getRow(Zeilenindex). Jede Zeile wird als Object[] Array zurückgeliefert. Möchte man auf einen bestimmten Spaltenwert in diesem Object[] typisiert zugreifen, erhält man mittels Aufruf getColumns().get(Spaltenindex) die Metainformation der gewünschten Spalte und kann den Wert getRow(Zeilenindex)[Spaltenindex] dem Klassentyp entsprechend casten oder mit dem Spaltennamen beschriften.
Ein Beispiel finden Sie hier.
|
Unter Oracle funktioniert dies nur für Datenquellen, die keine Daten schreiben – innerhalb eines SELECT dürfen dort keine Daten verändert werden. |
Ergebnis auswerten
rows ist eine Liste von Object[]; über getColumns() erhält man Name und Datentyp je Spalte und kann typgerecht casten.
| Codeblock |
|---|
|
public class AuftragAbschliessen implements UpdateFinalRule {
public void updateFinal(UpdateContext context) throws BusinessException {
// Als Parameter geben wir die ID mit
Map<String, Object> map = new HashMap<String, Object>();
map.put("intid", er.getId().intValue());
DatasourceResult run = DatasourceProvider.run(AuftragDS.class, map);
for (Object[] rowWithColumns : run.getRows()) {
for (int idx=0; idx < run.getColumns().size(); idx++) {
DatasourceColumn datasourceColumn = run.getColumns().get(idx);
ctx.log("Feld: " + datasourceColumn.getName() + " hat den Wert: " +
run.getColumns().get(idx).getType().cast(rowWithColumns[idx]).toString());
}
}
} |
Datenbankfunktion aufrufen
Der Provider ersetzt das alte callDBFunction: Die Funktion wird in einer Datenquelle gekapselt und indirekt aufgerufen.
| Codeblock |
|---|
|
SELECT CA_MYDBFUNCTION('$parameter')::numeric(9,2) "result" |
| Codeblock |
|---|
|
package org.nuclet.test;
import org.nuclos.api.exception.BusinessException;
import org.nuclos.api.provider.DatasourceProvider;
import org.nuclos.api.datasource.DatasourceResult;
@Rule(name="Test", description="Test")
public class Test {
public static Double callFunction() throws BusinessException {
DatasourceResult ds = DatasourceProvider.run(MyDatasourceDS.class);
Double result = (Double)(ds.getRows().iterator().next()[0]);
return result;
}
} |
Verwandte Seiten
BusinessObjectProvider
BOs schreiben.
Öffnen →
...