Home Forum Nuclos Entwicklung Makros und Regeln Anlegen und Löschen von Objekten mittels neuer API

Ansicht von 5 Beiträgen - 1 bis 5 (von insgesamt 5)
  • Autor
    Beiträge
  • #6134
    Matthias Haake
    Teilnehmer

    Hallo.

    Im Wiki vermisse ich noch Beispiele, wie neue Objekte mit der API erstellt oder auch wie verknüpfte Objekte in einem Subform angelegt werden. Auch das Löschen von Objekten ist noch nicht dokumentiert.

    Aktuell sieht man dort zwar ein wenig Code – aber das ist exakt der gleiche Klassenrumpf, den ich auch erhalte, wenn ich eine neue Regel anlege.

    Das der Editor (noch) keine Codevervollständigung anbietet, ist man auf Beispiele echt angewiesen… Wäre super, wenn das nachgepflegt werden könnte.

    Vielen Dank und Grüße,
    Matthias

    #6216
    Matthias Reichart
    Teilnehmer

    Hallo,

    so, das Wiki ist jetzt auf dem neusten Stand, heißt, der aktuellen Entwicklung. Beschrieben sind Kontexte, Provider-Klassen, etc. Für die einzelnen Punkte habe ich Beispiele mit aufgenommen.

    Gruß,
    Matthias

    #6274
    Matthias Haake
    Teilnehmer

    Ich tue mich grade ein bisschen schwer mit dem QueryProvider.

    Installiert ist 3.9.4 bei uns. Ich versuche grade, eine „equals“-Bedingung über ein Datumsfeld zu konstruieren… dafür ist leider noch kein Beispiel im Wiki. Daher versuchte ich mein Glück in der API-Dokumentation. Anscheinend sind die nicht synchron.

    Das Beispiel im Wiki
    http://wiki.nuclos.de/pages/viewpage.action?pageId=820011
    passt gar nicht zur API
    http://api.nuclos.de/org/nuclos/api/businessobject/Query.html

    Konkret brauche ich für die Berechnung von Überstunden eine Angabe, ob ein Datum ein Feiertag ist. Dafür gibt es bei uns unterschiedliche Feiertags-Modelle für die einzelnen Standorte (wo die Feiertage konfiguriert werden). Über einen Job werden daraus Einträge (Feiertage) generiert (Entität „holiday“). Jetzt habe ich ein Datum (date) und eine ID des entsprechenden Feiertags-Modells (holidayModelId) und möchte abfragen, ob ein Feiertag dazu existiert:


    // create query
    Query queryHoliday = QueryProvider.create(holiday.class);

    queryHoliday.where(holiday.Date.EQUALS(date)).and(new SearchExpression(holiday.Holidaymodel, holidayModelId, QueryOperation.EQUALS)));

    Fehler: Methode „Equals(java.util.Date)“ nicht in NumericAttribute gefunden. Ich habe schon alles mögliche probiert: „Eq“, „EQUALS“, „equals“… funktioniert nicht.

    Hat jemand einen Tipp? Es ist wirklich schwer bis unmöglich so ohne Codevervollständigung und Doku… will aber nur ungerne neue Aufgaben mit der alten API erledigen, da doppelte Arbeit.

    Danke für jeden Tipp.
    Matthias

    #6574
    Matthias Reichart
    Teilnehmer

    Hallo,

    die folgende Anmerkung werde ich auch im Wiki zur Verfügung stellen.

    Das Query-Interface besitzt folgende Methoden:

    • . where
    • . and
    • . exist
    • . orderBy

    Jede dieser Methoden gibt das Query-Objekt selbst zurück, was ein „Stapeln“ von Bedingungen ermöglicht.
    Die Methoden where() und and() erhalten als Parameter sogenannte SearchExpression, wie etwa: Rechnung.Auftragsnr.notNull().

    Eine SearchExpression bietet die Möglichkeit, Felder miteinander oder Felder mit konkreten Werten zu vergleichen. Damit der Programmierer nicht immer mit dem komplexen Ausdruck new SearchExpression(…) arbeiten muss (dient auch nicht der Übersichtlichkeit), werden alle Felder innerhalb von BOs (z.b. Auftragsnr in Rechnung) mit Vergleichsoperatoren versehen (z.b. isNull(), notNull(), gte()), die zu diesem Datentyp passen und als Rückgabewert eine komplette SearchExpression zur Verfügung stellen: qryRechnung.where(Rechnung.Auftragsnr.notNull())

    Je nach Feldtyp werden unterschiedliche Vergleichsoperatoren angeboten. Das Feld „Auftragsnr“ ist als Key eine Zahl und kann numerische Vergleiche vornehmen. Das Feld „Bemerkung“ bietet als reiner String-Wert dagegen keine Vergleiche wie gte() oder lte() an.

    Gemeinsam haben alle Felder folgende Vergleiche:

    • . eq
    • . neq
    • . isNull
    • . notNull

    Wichtig hier: Da es sich bei Querys wie auch bei SearchExpressions um Java-Klassen handelt, werden sie immer die equals()-Methoden besitzen. Diese Methode wird in Java für Vergleiche auf Objektebene verwendet, aber bei Querys innerhalb von Nuclos ignoriert.

    Etwas komplizierter wird es nun beim „Stapeln“ von Suchbedingungen. Da gibt es zwei Möglichkeiten.

    1. Verknüpfung mittels Query-Object.

    Wie oben beschrieben, kann das Query-Objekt nebst where() und orderBy() mit Hilfe der and()-Methode mehrere SearchExpressions aufnehmen und miteinander verknüpfen. Die Methode or() gibt es an dieser Stelle nicht.

    2. Verknüpfung mittels SearchExpression.

    Die SearchExpression bietet außer den Vergleichsmöglichkeiten (Feld-Feld, Feld-Wert) auch die Möglichkeit eine andere SearchExpression „in sich aufzunehmen“. Die Methoden innerhalb der SearchExpression lauten dazu:

    public SearchExpression and(SearchExpression pParentSearchExpression) {}

    bzw.

    public SearchExpression or(SearchExpression pParentSearchExpression) {}

    Damit könnte folgendes Gebilde programmiert werden:

    Query qryRechnung = QueryProvider.create(Rechnung.class);

    Calendar today = Calendar.getInstance();
    Calendar yesterday = Calendar.getInstance();
    yesterday.add(Calendar.DAY_OF_WEEK, -1);

    qryRechnung.where(Rechnung.Rechnungsdatum.eq(today.getTime()).or(
    Rechnung.Rechnungsdatum.eq(yesterday.getTime())))
    .and(Rechnung.Auftragsnr.notNull())
    .and(Rechnung.Rechnungsnr.notNull())
    .and(Rechnung.Waehrung.eq("EUR").or(
    Rechnung.Waehrung.eq("USD"))
    .orderBy(Rechnung.Rechnungsnr, true);

    List results = QueryProvider.execute(qryRechnung);

    Gerade diese zweite Variante ermöglicht mit der or()-Methode das Verschachteln von Abfragen. or() wie auch and() geben als Methoden der SearchExpression immer selbige zurück, weshalb sie miteinander verknüpft und als „Block“ der Query übergeben werden können.

    #6575
    Matthias Haake
    Teilnehmer

    Vielen Dank für die aussagekräftigen Beispiele. Das hilft definitiv weiter.

Ansicht von 5 Beiträgen - 1 bis 5 (von insgesamt 5)