APEX - Download vorgegebenes Format
In APEX gibt es eine Reihe bereits mitgelieferter Download-Möglichkeiten:
- im Classic-Report
- im Interactiv Report
Manchmal reichen diese allerdings nicht aus. Z.B. wenn die Darstellung in APEX und der Download abweichen, oder die Download-Performance ein Problem ist.
Auf Basis der Vorlage SCOTT SPENDOLINI (URL https://spendolini.blogspot.de/2006/04/custom-export-to-csv.html) schaut meine Lösung wie folgt aus:
Auf der eigentlichen Seite einen Button (Region Button) erstellen, mit einem Redirect zu einer neuen, leeren, eigens für den Download angelegten Seite verweist.
Auf dieser Download-Seite (diese bekommen bei mir immer eine Seiten-Nummer höher als die Button-Seite) wird im BEFORE HEADER ein Process vom Typ PL/SQL angelegt.
Dieser Process übernimmt den eigentlichen Download.
Aufbau des PL-Blocks:
declare
v_quartal number;
begin
-- Set the MIME type
owa_util.mime_header('text/csv', false, 'ISO-8859-1');
--Dateinamen flexibilisieren
SELECT quartal
INTO v_quartal
FROM myTBL
WHERE zvl_run_key = :P13_ABC
AND ROWNUM < 2;
-- Set the name of the file
htp.p('Content-Disposition: attachment; filename="MyFilename_'||v_quartal||'.csv"');
-- Close the HTTP Header
owa_util.http_header_close;
-- Kopfzeile
htp.prn(
'QUARTAL;SP_A;SP_B;SP_C;'|| chr(13)
);
-- Über alle Zeilen loopen
for x in (
SELECT QUARTAL,
SP_A,
SP_B,
SP_C
FROM myTBL2
WHERE zvl_run_key = :P13_ABC
)
loop
-- Zeile schreiben, Semikolon-getrennt und mit CR beendet
htp.prn(
x.QUARTAL ||';'||
x.SP_A ||';'||
x.SP_B ||';'||
x.SP_C ||chr(13)
);
end loop;
-- Fehlercode senden, damit HTML nicht gerendert wird
htmldb_application.g_unrecoverable_error := true;
end;
Fertig!
Klappt wunderbar und ist sehr schnell (650tsd Zeilen in ca. 20sec).
- im Classic-Report
- im Interactiv Report
Manchmal reichen diese allerdings nicht aus. Z.B. wenn die Darstellung in APEX und der Download abweichen, oder die Download-Performance ein Problem ist.
Auf Basis der Vorlage SCOTT SPENDOLINI (URL https://spendolini.blogspot.de/2006/04/custom-export-to-csv.html) schaut meine Lösung wie folgt aus:
Auf der eigentlichen Seite einen Button (Region Button) erstellen, mit einem Redirect zu einer neuen, leeren, eigens für den Download angelegten Seite verweist.
Auf dieser Download-Seite (diese bekommen bei mir immer eine Seiten-Nummer höher als die Button-Seite) wird im BEFORE HEADER ein Process vom Typ PL/SQL angelegt.
Dieser Process übernimmt den eigentlichen Download.
Aufbau des PL-Blocks:
declare
v_quartal number;
begin
-- Set the MIME type
owa_util.mime_header('text/csv', false, 'ISO-8859-1');
--Dateinamen flexibilisieren
SELECT quartal
INTO v_quartal
FROM myTBL
WHERE zvl_run_key = :P13_ABC
AND ROWNUM < 2;
-- Set the name of the file
htp.p('Content-Disposition: attachment; filename="MyFilename_'||v_quartal||'.csv"');
-- Close the HTTP Header
owa_util.http_header_close;
-- Kopfzeile
htp.prn(
'QUARTAL;SP_A;SP_B;SP_C;'|| chr(13)
);
-- Über alle Zeilen loopen
for x in (
SELECT QUARTAL,
SP_A,
SP_B,
SP_C
FROM myTBL2
WHERE zvl_run_key = :P13_ABC
)
loop
-- Zeile schreiben, Semikolon-getrennt und mit CR beendet
htp.prn(
x.QUARTAL ||';'||
x.SP_A ||';'||
x.SP_B ||';'||
x.SP_C ||chr(13)
);
end loop;
-- Fehlercode senden, damit HTML nicht gerendert wird
htmldb_application.g_unrecoverable_error := true;
end;
Fertig!
Klappt wunderbar und ist sehr schnell (650tsd Zeilen in ca. 20sec).
Kommentare
Kommentar veröffentlichen