2. |
Grundidee
Use Case: Ein Kunde will an einer Konferenz teilnehmen. Zur Teilnahme wird ein
Ticket benötigt.
- Hierfür füllt er ein Formular in einer APEX Anwendung aus.
- Sobald er die Bestellung abgeschickt hat, bekommt er direkt sein individuelles
Ticket zum Download angeboten (finanzielle Transaktionen wurden der zur
Vereinfachung nicht berücksichtigt).
- Es wird nur eine Wordvorlage erstellt. Die einzelnen Tickets sollen automatisch
ausgefüllt werden.
Mtdoxx Webservice in APEX2
Über den Webservice-Aufruf die Formulardaten übergeben und direkt das ausgefüllte Dokument erhalten
4. |
Architektur
Der User schickt das Formular ab
„on submit“ wird ein Application
Process ausgelöst
- Hier wird der Prozess in der
Datenbank aufgerufen
Eine SOAP Envelope und die
benötigte XML werden dynamisch
erstellt und an den Webservice
gesendet.
- Im Application Process wird die
Rückgabe nun in der DB hinterlegt
Mtdoxx Webservice in APEX4
5. |
Quellcode: Beispiele (vereinfacht)
g_ws_url varchar2(500) := 'http://URL/Webservice/Service.svc?singleWsdl';
--Aufteilung der SOAP Envelope in mehrere Teile, da die base64 Dateien zu groß für replace sind
g_env_t1 CLOB:= '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:GenerateDocument>
<!--Optional:-->
<tem:xmlDataInput>'; g_env_t2 CLOB:= '</tem:xmlDataInput>
<!--Optional:--> <tem:masterTemplate>'; g_env_t3 CLOB:= '</tem:masterTemplate>
<!--Optional:--> <tem:createPdf>false</tem:createPdf>
</tem:GenerateDocument>
</soapenv:Body>
</soapenv:Envelope>';
--XML-Data-Input
g_xml CLOB := '<?xml version="1.0" encoding="iso-8859-1"?> <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> <asx:values>
<DATA_TABLE>
<item>
<MV_ALLG>
<Adresszeile1>#VORNAME# #NACHNAME#</Adresszeile1>
--Weitere XML tags
</MV_ALLG>
</item>
</DATA_TABLE>
</asx:values>
</asx:abap> ';
Mtdoxx Webservice in APEX5
Webservice Aufruf: SOAP Envelope und XML
6. |
Quellcode: Beispiele (vereinfacht)
function create_xml( p_vorname in VARCHAR2,
--weitere Input Parameter )
return CLOB
is value_xml CLOB;
l_anrede VARCHAR2(20);
--Weitere variablen
begin
value_xml:= g_xml;
--Werte über das Event aus DB laden
SELECT ticketpreis INTO l_ticketpreis FROM mtdoxx_ticketpklasse WHERE klassenid=p_ticketpklasse;
--...
--Werte einsetzen
value_xml := replace(value_xml, '#VORNAME#', p_vorname);
value_xml := replace(value_xml, '#NACHNAME#', p_nachname);
--...
return value_xml;
end create_xml;
Mtdoxx Webservice in APEX6
Webservice Aufruf: Funktion create_xml
7. |
Quellcode: Beispiele (vereinfacht)
function create_document(p_xml_data_input in CLOB, p_master_template in CLOB) return CLOB is
l_soap_env CLOB;
xml_base CLOB;
l_value_xml CLOB;
l_soap_response xmltype;
g_env_getstring CLOB;
begin
g_env_getstring := g_env_t1||p_xml_data_input||g_env_t2||p_master_template||g_env_t3;
l_soap_env := g_env_getstring;
l_soap_response := apex_web_service.make_request( p_url => g_ws_url, p_action => 'http://tempuri.org/IService/GenerateDocument',
p_envelope => l_soap_env );
l_value_xml := apex_web_service.parse_xml_clob( p_xml => l_soap_response,
p_xpath => '//soap:GenerateDocumentResult/text()',
p_ns => 'xmlns:soap="http://tempuri.org/"' );
return l_value_xml;
end create_document;
Mtdoxx Webservice in APEX7
Webservice Aufruf: Funktion create_document
8. |
Vorteile bei der Nutzung von Mtdoxx (als Webservice)
Einfaches Setup
Flexibel erweiterbar
Skalierbar
Einfache Massengenerierung – Optimale Performance
Schnelle Template-Erstellung direkt in Word
Anpassungen am Template werden direkt ohne aufwendige Programmierung
wirksam (teilweise XML Anpassung nötig)
8
10. |
Quellcode: Beispiele (vereinfacht)
Mtdoxx Webservice in APEX10
Application Process
DECLARE
xml_input_clob CLOB;
xml_input_blob BLOB;
xml_base_clob CLOB;
mt_file BLOB;
mt_base_clob CLOB;
doc_clob CLOB;
doc_result BLOB;
BEGIN SELECT mastertemplate into mt_file FROM mtdoxxmastertemplate;--Mastertemplate wird als BLOB aus der DB abgerufen. mt_base_clob:=
utl_base64.encode_base64(p_blob_in => mt_file);--Das Mastertemplate wird in das base64 Format codiert und als CLOB gespeichert
xml_input_clob:= ws_create_document_package.create_xml(--Aufruf des Prozesses, der die XML erstellt. Rückgabe erfolgt hier als CLOB
p_vorname => :P8_VORNAME,
p_nachname => :P8_NACHNAME,
--…
);
xml_input_blob:= WS_CREATE_DOCUMENT_PACKAGE.convert_toblob(xml_input_clob);--CLOB wird zu BLOB konvertiert
xml_base_clob:= utl_base64.encode_base64(p_blob_in => xml_input_blob);--XML wird als base64 codiert
doc_clob:= ws_create_document_package.create_document(xml_base_clob, mt_base_clob);--Das Mastertemplate und die XML werden codiert an
den Prozess zum Aufruf des Webservices übergeben
doc_result:= utl_base64.decode_base64(p_clob_in => doc_clob);--Das Ergebnis wird wieder decodiert
UPDATE TAB_DATEIEN--Das decodierte, ausgefüllte Dokument wird in einer Tabelle gespeichert, in der es für die Ausgabe in der Anwendung
bereitliegt
SET DATEIINHALT = doc_result
WHERE ID=1;
END;