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

Buttons mit Confirm-Message in Report einbauen

Links in Reports zu erstellen, ist in Oracle APEX denkbar einfach. Auch Font-Awesome-Icons lassen sind dabei verwenden, wie Tobias gezeigt hat.

Individuelle Buttons zum Kopieren oder Löschen von einzelnen Zeilen lassen sich damit ganz fix erstellen. Aktionen wie Löschen sollten vom Benutzer allerdings vorher bestätigt werden.

Und wie mache ich das am geschicktesten? Buttons mit Confirm-Message in Report einbauen weiterlesen

Report per DA aktualisieren: Geblätterte Seite beibehalten

Die Dynamic Action (DA) vom Typ „Refresh“ ist eine schöne Sache, um Items, Regionen und Reports zu aktualisieren. Allerdings bin ich dabei über ein Problem gestoßen:

Ich habe für einen Report eine DA  erstellt, die bestimmte Daten manipuliert und danach den Report aktualisiert. Das Problem war nur, dass der Report nicht die geblätterte Seite anzeigte, sondern wieder zur ersten Seite zurück sprang. Das klappte weder im Classic noch im Interactive Report.

Hier eine Demo: http://apex-experts.de/ords/f?p=130:2 Report per DA aktualisieren: Geblätterte Seite beibehalten weiterlesen

Benutzername (APEX/OS/Database) in PL/SQL ermitteln

In Oracle-Funktionen und -Triggern hole ich mir den aktuellen Benutzer meistens über folgende Logik:

coalesce(
    sys_context('apex$session', 'app_user')
  , sys_context('userenv', 'os_user')
  , sys_context('userenv', 'session_user')
);

Der Vorteil davon ist, dass das ganze sowohl mit APEX als auch unabhängig davon funktioniert. Benutzername (APEX/OS/Database) in PL/SQL ermitteln weiterlesen

Vorlage: create table + trigger + sequence

Wenn ich die Wahl habe, erstelle ich eine Tabelle meistens mit folgender Grundstruktur:

create table NEW_TABLE (
    id number not null 
  , my_column varchar2(200)
  , created_on date 
  , created_by varchar2(200)
  , updated_on date 
  , updated_by varchar2(200) 
);

create unique index NEW_TABLE_pk on NEW_TABLE (id asc);

alter table NEW_TABLE
add constraint NEW_TABLE_pk primary key (id)
using index NEW_TABLE_pk enable;


create sequence NEW_TABLE_seq increment by 1;


create or replace trigger NEW_TABLE_trg 
    before insert or update on NEW_TABLE
    for each row
declare
    v_user varchar2(200) := coalesce(
        sys_context('apex$session', 'app_user')
      , sys_context('userenv', 'os_user')
      , sys_context('userenv', 'session_user')
    );
begin
    if inserting then
        if :new.id is null then 
            select NEW_TABLE_seq.nextval into :new.id from dual; 
        end if;
       :new.created_on := sysdate;
       :new.created_by := v_user;
       :new.updated_on := sysdate;
       :new.updated_by := v_user;
    end if;
    if updating then
        :new.updated_on := sysdate;
        :new.updated_by := v_user;
    end if;
end; 
/

alter trigger NEW_TABLE_trg enable;

Vorlage: create table + trigger + sequence weiterlesen

Ist Benutzer angemeldet als Entwickler?

Manchmal muss man wissen, ob der angemeldete Applikations-Benutzer  auch als Entwickler im Workspace angemeldet ist. Das kann man über die undokumentierte PL/SQL-Funktion apex_application.g_edit_cookie_session_id herausfinden.

Die Funktion gibt uns die ID der Workspace-Session zurück. (Im Gegensatz zur Funktion apex_application.g_cookie_session_id bzw. zum Substitution String :APP_SESSION, die uns die Session ID der Anwendung zurück geben.)

Dieser Tipp wurde vor längerer Zeit schon von Patrick Wolf gepostet.

Is my application running in Developer Mode?

Weil ich nicht mit Google-Skills, sondern erst durch Zufall wieder auf diesen Beitrag gestoßen bin, erwähne ich es hier noch einmal.

Mit der Workspace-Session-ID kann man übrigens auch weitere interessante Sachen anstellen. Unter anderem ist damit ein Deep Link zum Workspace möglich und man kann z.B. eine bestimmte Stelle im Page Designer verklinken. Derartige Links sind ohne gültige Session nicht möglich, denn man landet nach dem Login immer auf der Startseite des Workspaces.

Übrigens: Wenn man wissen möchte, ob der angemeldete Benutzer prinzipiell Workspace-Rechte besitzt, auch wenn die Seite nicht im Developer Mode läuft, dann hilft sicher mein Tipp „Feststellen ob Benutzer APEX-Developer ist“.