Höhe eines Shuttle-Items dynamisch anpassen

Folgender Code passt die Höhe eines Shuttle-Items dynamisch an das Browser-Fenster an. Ich benötige das in einer Applikation, um ein Shuttle mit vielen Elementen möglichst groß zu gestalten, ohne das ein Scrollbalken auf der rechten Seite des Browsers erscheint. (UX: Mehrfache Scrollbalken — hier im Shuttle als auch im Browserfenster — sind unerwünscht.)

apex.jQuery(window).on('apexwindowresized', function() {
    console.log('Window resized.');
    if ($("body").hasClass("js-regionIsMaximized")) {
        $('select#P1_SHUTTLE_LEFT').height(window.innerHeight-165);
        $('select#P1_SHUTTLE_RIGHT').height(window.innerHeight-165);
    } else {
        $('select#P1_SHUTTLE_LEFT').height(window.innerHeight-340);
        $('select#P1_SHUTTLE_RIGHT').height(window.innerHeight-340);
    }
});

Der Trigger “apexwindowresized” reagiert sowohl auf die Größenveränderung des Browser-Fensters, als auch auf das Maximieren und Wiederherstellen von Regionen (aktivierbar per Template Option “Show Maximize Button”).
In meinem Beispiel heißt das Item P1_SHUTTLE. Da das Shuttle aus zwei Select-Listen (…_LEFT und …_RIGHT) besteht, müssen wir beide in der Größe verändern.
Um die Höhe auszurechnen, ziehe eine bestimmte Pixelhöhe von der Fensterhöhe ab (window.innerHeight-340). Die 340 Pixel hab ich durch ausprobieren bestimmt. Dieser Wert ist je nach Seitenlayout anzupassen.
Falls die Region maximiert wurde (das Body-Tag besitzt die CSS-Klasse “js-regionIsMaximized”), wird eine noch größere Höhe für das Shuttle gesetzt.

Das funktioniert schon fast so wie gewünscht. Nur das erste mal nach dem Laden der Seite funktioniert das noch nicht. Die Höhe wird in diesem Fall schon berechnet, bevor die Region maximiert wurde. Beim zweiten Maximieren wird komischerweise “apexwindowresized” 2x ausgeführt. Das Problem habe ich dank Stack Overflow folgendermaßen gelöst:

var rtime;
var timeout = false;
var delta = 200;

apex.jQuery(window).on('apexwindowresized', function() {
    console.log('Window resized.');
    rtime = new Date();
    if (timeout === false) {
        timeout = true;
        setTimeout(resizeend, delta);
    }
});

function resizeend() {
    if (new Date() - rtime < delta) {
        setTimeout(resizeend, delta);
    } else {
        timeout = false;
        console.log('Done resizing.');
        if ($("body").hasClass("js-regionIsMaximized")) {
            $('select#P1_SHUTTLE_LEFT').height(window.innerHeight-165);
            $('select#P1_SHUTTLE_RIGHT').height(window.innerHeight-165);
        } else {
            $('select#P1_SHUTTLE_LEFT').height(window.innerHeight-340);
            $('select#P1_SHUTTLE_RIGHT').height(window.innerHeight-340);
        }
    }               
}

APEX 5.1: Icons auf Font APEX umstellen

Mit Oracle APEX 5.1 wird eine neue Icon-Sammlung “Font APEX” mitgeliefert.  Diese sehen nicht nur schöner aus, sondern bieten auch mehr Icons als das bisherige “Font Awesome 4.2”. Wer von Font Awesome auf Font APEX umstellen will, geht folgenden Weg:

Shared Components \ Themes \ Edit Theme \ Icons \ Library

APEX 5.1: Icons auf Font APEX umstellen weiterlesen

Wann findet in APEX ein Commit statt?

Diese Frage sollte eigentlich einfach zu beantworten sein, oder? Mit einem Submit werden alle Prozesse durchlaufen. Abschließend wird der Commit[1] ausgeführt. Wenn ein Fehler auftritt, wird per Rollback die Transaktion rückgängig gemacht.

Das bedeutet also das der Commit erst am Ende aller Submit-Prozesse durchgeführt wird. Normalerweise… Wann findet in APEX ein Commit statt? weiterlesen

SQL: Gestern, letzte Woche, letzter Monat

select
  -- Last month period
  trunc(sysdate, 'mm') - interval '1' month last_month_start,
  trunc(sysdate, 'mm') - interval '1' second last_month_end,
  -- Last week period
  trunc(sysdate, 'iw') - interval '7' day last_week_start,
  trunc(sysdate, 'iw') - interval '1' second last_week_end,
  -- Last day period
  trunc(sysdate, 'dd') - interval '1' day last_day_start,
  trunc(sysdate, 'dd') - interval '1' second last_day_end
from dual

SQL: Gestern, letzte Woche, letzter Monat weiterlesen

JasperReports-APEX-Integration: Vortrag, Source-Code und Demo

In dieser Woche habe ich einen Vortrag auf der DOAG-Konferenz 2016 gehalten. Das Thema lautete “Open-Source-Drucklösungen mit JasperReports”. Wie versprochen stelle ich hier das gezeigte PL/SQL-Package und die Demo-Applikation zum Download zur Verfügung. Außerdem findet ihr hier auch die eigentliche Präsentation.

jr_server_integration_package.zip
jr_server_integration_demo.zip
Drucklösung-mit-JasperReorts-und-APEX.pdf

JasperReports: Ein Überblick

In Software-Projekten erhalte ich oft die Anforderung zur Realisierung von Drucklösungen und formatierten Exporten. Rechnungen, Broschüren, Einsatzpläne und Statusberichte sind nur einige Beispiele – also Dokumente mit identischer Vorlage und unterschiedlichen Inhalten.

Dafür verwende ich gerne die Open-Source-Lösung von JasperReports, eine weit verbreitetes Reporting-Tool JasperReports: Ein Überblick weiterlesen

IR: Alternativen Report per URL auswählen

Ein beliebtes Feature vom Interactive Report sind die alternativen Standardreports, zusätzlich zum Hauptreport. Ich wurde vor kurzem gefragt, ob man einen alternativen Report auch per URL setzen kann.

Wir sprechen hier von APEX, ‘türlich kann man das. ;-)Der Link muss nur folgendes Format haben:

f?p=&APP_ID.:2:&APP_SESSION.:IR[customer_ir]_12345

IR: Alternativen Report per URL auswählen weiterlesen