Imports:
import org.nuclos.api.provider.QueryProvider;
import org.nuclos.api.businessobject.Query;
Erstellen einer Datenbankabfrage (Query)
Methode | Beispiel |
---|---|
create | Allgemein: Mit Hilfe dieser Methode kann ein typisiertes Query-Object angelegt werden, mit dessen Hilfe Datenbankabfragen ausgeführt werden können. Dabei wird auf eine abstrakte Query-Language zurückgegriffen. Abfragen mit SQL-Syntax sind nicht möglich. boolean sortAscending = true; Query<Auftrag> queryAuftrag = QueryProvider.create(Auftrag.class); queryAuftrag.where(Auftrag.Auftragsnr.notNull()) .and(Auftrag.Bestellwert.Gt(BigDecimal.ZERO)) .orderBy(Auftrag.Auftragsnr, sortAscending); Folgende Bedingungen können verwendet werden:
Und für Numerische Attribute:
Weitere Informationen finden sich in folgenden Klassen (unter api.nuclos.de): org.nuclos.api.businessobject.attribute.Attribute<T> org.nuclos.api.businessobject.attribute.NumericAttribute<T> Suchen von Einträgen mit einem bestimmten Status Query<Bestellung> qry = QueryProvider.create(Bestellung.class); qry.where(Bestellung.NuclosStateId.eq(BestellungSM.State_60.getId())); Welchen Status ein BusinessObject einnehmen kann, hängt von dem zugewiesenen Statusmodel ab. Dazu gibt es für jedes Statusmodel eine entsprechende Klasse, hier "BestellungSM", die alle Status als Konstanten beinhaltet. |
execute | Diese Funktion führt eine Query aus und gibt eine typisierte Liste als Ergebnis zurück. List<Auftrag> results = QueryProvider.execute(queryAuftrag); for (Auftrag a :results) { BigDecimal bestellwert = a.getBestellwert(); } |
Erstellen einer Unterabfrage
Methode | Beschreibung |
---|---|
exist | Mit Hilfe der exist-Methode kann eine Subquery in eine äußere Query eingebunden werden. Die Verknüpfung von Query und Subquery findet ausschließlich über (Fremd)schlüssel statt. Hier ein Beispiel. Ziel der Abfrage ist die Ermittlung einer Liste von Bestellungen, für die Kunden mit vollständigen Zahlungsbedingungen hinterlegt sind: // Alle Kunden, fuer die Zahlungsbedingungen hinterlegt wurden Query<Kunde> qryKunden = QueryProvider.create(Kunde.class); qryKunden.where(Kunde.Zahlungsbedingung.notNull()); // Nun brauchen wir alle Bestellungen dieser Kunden Query<Bestellung> queryBestellungen = QueryProvider.create(Bestellung.class); queryBestellungen.where(Bestellung.Bestellnr.notNull()) .exist(qryKunden, Bestellung.KundeId) .orderBy(Bestellung.Bestellnr, true); List<Bestellung> results = QueryProvider.execute(queryBestellungen); Soll nicht der PrimaryKey als Referenzfeld der Subquery verwendet werden, sondern ein anderer ForeignKey, muss dieser beim Aufruf der exist()-Methode mit angegeben werden: Auftrag a = context.getBusinessObject(Auftrag.class); // Subquery zur Ermittlung der Produktgruppe, die im Auftrag angegeben wurde Query queryPg = QueryProvider.getById(Produktgruppe.class, a.getProduktgruppeId()); // Hauptabfrage des Bestands aller Produkte, die in der Produktgruppe hinterlegt wurden Query queryBestand = QueryProvider.create(Bestand.class); queryBestand.exist(queryPg, Bestand.Produkt, Produktgruppe.ProduktId); // Produktgruppe.ProduktId ist Fremdschlüssel in Produktgruppe List<Bestand> lstResults = QueryProvider.execute(queryBestand); for (Bestand b : lstResults) { // ... } Neu (Ab 4.34.0 und 4.33.6: Soll eine echte Subform-Suche ausgeführt werden, d.h. es werden Hauptdatensätze mit einer Subform-Bedingung gesucht, dann gilt folgendes Beispiel: // Alle Bestellungen, deren Betrag größer als 1000 ist. Query<Bestellung> queryBestellungen = QueryProvider.create(Bestellung.class); queryBestellungen.where(Bestellung.Betrag.Gte(1000)); // Nun brauchen wir alle Kunden die mindestens eine dieser Bestellungen haben. Query<Kunde> queryKunden = QueryProvider.create(Kunde.class); queryKunden.exist(queryBestellungen, null, Bestellung.KundeId); // Die Null im zweiten Argument kennzeichnet die Subform-Suche List<Kunde> results = QueryProvider.execute(queryKunden); Zu beachten ist, dass die Subquery selbst nicht vom QueryProvider ausgeführt werden muss. Sie wird in ihrer fertigen "Strduktur" der äußeren Query übergeben. |
Auslesen eines einzelnen Eintrages
Methode | Beispiel |
---|---|
getById | Mit Hilfe dieser Methode kann ein einzelnes BusinessObject anhand des Typs und der Id ausgelesen werden. // die Variable 'auftrag' stellt ein BusinessObject des Typs 'Auftrag' dar und besitzt eine Referenz auf ein Kundenobjekt Kunde k = QueryProvider.getById(Kunde.class, auftrag.getKundeId()); |
Suche anhand von Aktionen und Status
Methode | Beispiel |
---|---|
getByState | Mit Hilfe dieser Methode können Datenbankeinträge in Form von BusinessObjekten ermittelt werden, die einen bestimmten Status besitzen. Die Status befinden sich in den Statusmodell-Klassen. // Suche nach allen Bestellungen, die sich im Status 50 (storniert) oder Status 60 (beendet) befinden List<Bestellung> results = QueryProvider.getByState(Bestellung.class, BestellungSM.State_50, BestellungSM.State_60); context.log("Anzahl der abgeschlossenen Bestellungen: " + results.size()); // Suche nach allen Bestellungen, die sich im Status 50 (storniert) befinden List<Bestellung> results = QueryProvider.getByState(Bestellung.class, BestellungSM.State_50); context.log("Anzahl der stornierten Bestellungen: " + results.size()); |
getByProcess | Mit Hilfe dieser Methode können Datenbankeinträge in Form von BusinessObjekten ermittelt werden, die einer oder mehreren Aktionen angehören. Eine Aktion ist immer einem Businessobjekt zugewiesen, weshalb sie im Funktionsaufruf nicht extra angegeben werden muss. Aktionen werden in Nuclos konfiguriert und aufgrund ihrer Zugehörigkeit zum Businessobjekt in den BusinessObjekten als Konstanten hinterlegt, z.B. Auftrag.Sonderauftrag oder Auftrag.Normalauftrag // Liste aller Sonderaufträge List<Auftrag> results = QueryProvider.getByProcess(Auftrag.Sonderauftrag); context.log("Anzahl der Sonderaufträge: " + results.size()); Anmerkung: Aktionen können in den Businessobjekten direkt gesetzt werden. Wichtig dabei ist, dass aufgrund der Typsicherheit einem Businessobjekt nur die Aktionen zugewiesen werden können, die auch zur entsprechenden Businessobjekt gehören. // Hier wird ein bestimmter Auftrag einer Aktion zugewiesen Auftrag a = QueryProvider.getById(Auftrag.class, 40297631L); a.setNuclosProcess(Auftrag.Sonderauftrag); BusinessObjectProvider.update(a); |
4 Comments
Matthias Haake
Wäre es möglich, eine komplette Dokumentation der oben erwähnten abstrakten Query-Language online zu stellen?
Unter anderem habe ich folgende Fragen:
Ramin Göttlich
Beispiel für OR:
Frank Pavlic
Version 3.14.11 und höher gibt es kein setNuclosProcess für die Business-Objekte, wohl aber ein setNuclosProcessId. Ist das ein Bug?
Oder Wiki-Seite beim Aufruf
a.setNuclosProcess(Auftrag.Sonderauftrag);
fehlerhaft?
Desweiteren gibt es für definierte Aktionen keine Konstanten in den Business-Objekten? Auch ein Bug?
Falls dies keine Fehler sind, wie können dann Aktionen in Business-Objekten gesetzt werden ? Da für setNuclosProcessId ein Long-Parameter
benötigt wird, muss es möglich sein, die Aktionen in irgendeiner Form anzusprechen, sei es über QueryProvider oder direkt über ein Business-Objekt "NuclosProcess" o. ä.
Konstantin Röhl
Beispiel für Einschränkung auf Statusnumeral: