Inside Oracle APEX auf Deutsch (von Patrick Wolf)

Zurücksetzen der Seitennummerierung bei einem Master-Detail Bericht in Oracle APEX

Nach dem "Oracle APEX Round Table Talk mit Mike Hichwa" wurde mir von einem anderen teilnehmenden Entwickler eine interessante Frage gestellt.

Gibt es eine Möglichkeit nur die Seitennummerierung des Detail Berichts zurückzusetzen, wenn man einen Master-Detail Bericht auf einer Seite in einer Oracle Application Express (APEX) Applikation hat?

Aber was ist eigentlich genau das Problem warum man das machen will?

Schaut Euch mal mein Beispiel eines Master-Detail Berichts an und für die angegebenen Schritte durch.

Wenn Ihr das macht, dann werdet Ihr den Fehler


"Ungültige Zeilenmenge angefordert, die Quelldaten des Berichts wurden geändert." bekommen. Grund ist das es Oracle APEX nicht möglich ist eine zweite Seite von Detail Datensätzen für diesen Master Datensatz anzuzeigen. Es gibt einfach nicht genug. Unabhängig von dieser Tatsache, ist es immer netter wenn die Detail Datensätze von Vorne angezeigt werden, wenn ein neuer Master Datensatz ausgewählt wurde! :-)

Ich dachte mir, eigentlich sollte es nicht so schwierig sein nur eine bestimmte "Region" zurückzusetzen. Die Checkbox "Seitennummerierung zurücksetzen" welche für einen bestimmten Link/Branch gesetzt werden kann ist nicht wirklich eine Option, denn damit werden immer alle Berichte einer Seite zurückgesetzt. Gerade bei der Auswahl eines neuen Master Datensatzes wäre das nicht so Cool, wenn man sich urplötzlich wieder am Beginn befinden würde...

Was ist also wirklich zu tun um das hinzubekommen? Das Oracle APEX OTN forum ist immer eine gute Quelle für solche Probleme. Nach einer kurzen Suche habe ich den folgenden alten Thread vom Vikas gefunden wo er die selbe Frage stellt. Aber wie es aussieht wurde keine befriedigende Antwort dafür gefunden. Ich musste mir also eine eigene Lösung überlegen.

Daraufhin habe mir angesehen, was Oracle APEX eigentlich so treib wenn es zum nächsten Datensatz-Set wechselt. Habe mir die dazu verwendeten URLs etwas genauer angesehen und habe daraus folgende Lösung entwickelt.

Wenn der Detail Bericht synchronisiert wird, dann müssen wir im Detail Bericht die Navigation zum ersten Datensatz simulieren. Möglich ist das wenn wir als REQUEST Wert die Region ID setzen und noch ans Ende des URLs &pg_min_row=1 dranhängen.

Probiert mal mein Beispiel aus.

Die folgenden Schritte könnt Ihr verwenden um die Lösung in Eure Applikation einzubauen.
  1. Setzt die "Statische ID" Eigenschaft der Detail Bericht Region auf einen eindeutigen Namen. (Überspringt diesen Punkt wenn Ihr noch nicht Oracle APEX 3.0 verwendet)
  2. Erstellt ein "Hidden" Page Item (zB. P3_REGION_ID) welches der Region des Master Berichts zugewiesen wird
  3. Als "Source Type" wird "SQL Query" gesetzt
  4. Als "Source value or expression" verwendet für Oracle APEX 3.0 folgende Abfrage
    SELECT 'pg_R_'||TO_CHAR(REGION_ID)
    FROM APEX_APPLICATION_PAGE_REGIONS
    WHERE APPLICATION_ID = :APP_ID
    AND PAGE_ID = :APP_PAGE_ID
    AND STATIC_ID = 'Wert den Ihr für den Detail Bericht gesetzt habt'

    Oder
    SELECT 'pg_R_'||TO_CHAR(REGION_ID)
    FROM APEX_APPLICATION_PAGE_REGIONS
    WHERE APPLICATION_ID = :APP_ID
    AND PAGE_ID = :APP_PAGE_ID
    AND REGION_NAME = 'Employees for department '||CHR(38)||'P3_DNAME.'

    für ältere Oracle APEX Versionen. "Employees for ..." muss durch den exakten Namen Eurer Bericht Region ersetzt werden.
  5. Im Master Bericht öffnet die "Spalten-Link" Eigenschaften Eurer Link Spalte und fügt &P3_REGION_ID. in die "Anfordern" Eigenschaft ein.
  6. Bei der letzten "Wert" Zuordnung, gehört ein &pg_min_row=1 am Ende hinzugefügt (zB. #DNAME#&pg_min_row=1).

Warum "Hardcoden" wir nicht einfach pg_R_6721068803959845958 in die "Anfordern" Eigenschaft? Der Grund ist, dass sich die interne Region ID ändern kann/wird wenn Ihr die Applikation erneut importiert. Darum ist es besser die aktuelle ID aus dem Oracle APEX Repository auszulesen.

Das wars auch schon wieder! Viel Spass beim erstellen von Master-Detail Berichten!

PS: Der nächste Artikel wird wieder kürzer, ist einfach so viel zum Übersetzen! :-)

Labels: , , , ,