Mustercode 'WBI JDBC Adapter Migration' erweitern

Hier einige Beispiele, wie der Mustercode erweitert werden kann:

Rechnungen über mehrere Artikel unterstützen

Dieses Szenario stellt folgende Anforderungen:

Datenbanktabellen aktualisieren

Der folgende SQL-Code gilt für DB2 Universal Database. Falls Sie Oracle ausführen, müssen Sie ihn möglicherweise entsprechend anpassen (denken Sie daran, @ als Anweisungsabschlusszeichen festzulegen):

CREATE TABLE "ADAPTER_ITEM" (
		"PKEY" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY ( START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 NO CYCLE NO CACHE),
		"NAME" VARCHAR(20) NOT NULL,
		"INVOICE_KEY" VARCHAR(10) NOT NULL,
		"PRICE" FLOAT(53) DEFAULT 0
	)
	DATA CAPTURE NONE@

ALTER TABLE "ADAPTER_ITEM" ADD CONSTRAINT "ADAPTER_ITEM_PK" PRIMARY KEY
	("PKEY")@


Der SQL-Code erstellt eine neue Tabelle, ADAPTER_ITEM, mit vier Spalten für einen automatisch generierten Primärschlüssel, den Namen des Artikels, einen Verweis auf die Rechnung, zu der er gehört, und den Artikelpreis. Die neue Tabelle verwendet den Schlüssel INVOICE_KEY als Fremdschlüssel für die Tabelle ADAPTER_ITEM.

Nachrichtenmodell aktualisieren

  1. Wechseln Sie in die Datenperspektive.
  2. Ziehen Sie die Tabelle ADAPTER_ITEM aus dem Datenquellenexplorer in das Datenentwurfsprojekt 'AdapterMigration' im Datenprojektexplorer. Dadurch wird eine neue Datenbankmodelldatei erstellt.
  3. Wechseln Sie wieder zur Perspektive 'Anwendungsentwicklung'.
  4. Importieren Sie die neue Definition in das Eingabenachrichtenprojekt 'MigratedAdapter'. Klicken Sie mit der rechten Maustaste auf das Projekt, wählen Sie Neu>Nachrichtendefinitionsdatei aus>Datenbankdefinitionsdatei und dann die neue dbm-Datei im Arbeitsbereich aus.
  5. Öffnen Sie die neue .mxsd-Datei und benennen Sie das Element ADAPTER_ITEM in ADAPTERITEM um, damit es der von den Adaptern verwendeten Namenskonvention entspricht.
  6. Öffnen Sie ADAPTERINVOICE.mxsd.
  7. Ändern Sie den Namen von Item in Items und den Typ in (Neuer komplexer Typ); übernehmen Sie dabei die Standardwerte.
  8. Navigieren Sie in der Hierarchie zum neuen Element {Local Complex Type} (Lokaler komplexer Typ). Klicken Sie mit der rechten Maustaste auf {Local Complex Type}, wählen Sie Lokales Attribut hinzufügen aus und setzen Sie name auf size und type auf int.
  9. Klicken Sie erneut mit der rechten Maustaste auf {Local Complex Type} und wählen Sie Elementverweis hinzufügen aus, indem Sie den neuen Dialog ADAPTERITEM auswählen. Setzen Sie Maximale Anzahl auf -1.
  10. Speichern Sie die Nachricht.

Extended SQL des Flusses aktualisieren

Sie müssen nur den Teil des Nachrichtenflusses aktualisiern, der die ADAPTERINVOICE-Nachrichten erzeugt. Doppelklicken Sie auf den DatabaseInput-Knoten im Nachrichtenfluss 'MigratedAdapter', um den ESQL-Code zu öffnen, navigieren Sie zur Ansicht 'Quelle' und blättern Sie abwärts zu dem Abschnitt, in dem die ADAPTERINVOICE-Nachricht erzeugt wird:

SET Root.MRM = THE(
SELECT 
	DispatchedEvent.Usr.OBJECT_VERB AS verb,
	INVOICE.PKEY        AS Inv:PKEY,
	INVOICE.ITEM        AS Inv:"Item",
	INVOICE.QUANTITY    AS Inv:QUANTITY,
	INVOICE.CUSTOMER    AS Inv:CUSTOMER,
		'Retrieve'         AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.verb,
		CUSTOMER.PKEY      AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:PKEY,
		CUSTOMER.FIRSTNAME AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:FIRSTNAME,
		CUSTOMER.LASTNAME  AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:LASTNAME,
		CUSTOMER.ADDRESS   AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADDRESS,
			'Retrieve'         AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.verb,
			ADDRESS.PKEY       AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:PKEY,
			ADDRESS.FIRSTLINE  AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:FIRSTLINE,
			ADDRESS.SECONDLINE AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:SECONDLINE,
			ADDRESS.CODE       AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:CODE,
			ADDRESS.CITY       AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:CITY,
			ADDRESS.COUNTRY    AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:COUNTRY,
		CUSTOMER.CCODE    AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:CCODE ,
	'JDBCConnector_'
	 ||CAST(DispatchedEvent.Usr.EVENT_ID AS CHARACTER)
	 ||'ibm_events'
	 ||CAST(DispatchedEvent.Usr.EVENT_TIME AS CHARACTER FORMAT 'yyyyMMddhhmmss.SSS') AS Inv:ObjectEventId
	FROM Database.ADAPTER_INVOICE  AS INVOICE, 
		 Database.ADAPTER_CUSTOMER AS CUSTOMER, 
		 Database.ADAPTER_ADDRESS  AS ADDRESS
	WHERE INVOICE.PKEY  = DispatchedEvent.Usr.OBJECT_KEY AND 
		  CUSTOMER.PKEY = INVOICE.CUSTOMER AND 
		  ADDRESS.PKEY  = CUSTOMER.ADDRESS);

Fügen Sie die verschachtelten Artikel hinzu und setzen Sie das Größenattribut auf die Anzahl der abgerufenen Artikel.

  1. Da es sich bei der Verknüpfung Invoice->Item um eine Eins-zu-viele-Zurordnung handelt, können Sie die Elemente nicht in der SELECT-Anweisung abrufen, mit der Kunden- und Adressdaten abgerufen wurden.
  2. Um sich die Erstellung der SELECT-Anweisung zu erleichtern und unnötige Fehler zu vermeiden, können Sie die Basisversion der SELECT-Anweisung mit dem Codegenerator erzeugen. Wechseln Sie zum Fenster 'Database Event Design'.
  3. Wählen Sie ADAPTER_ITEM als Name der Anwendungstabelle aus. Die Felder Primärschlüssel und Ausgabenachrichtenelement werden automatisch gefüllt.
  4. Klicken Sie auf Abfrage generieren und springen Sie zurück zum Quellenfenster.
  5. Ändern Sie die neue Namensbereichsdeklaration am Anfang des Modulquellcodes in einen Wert, der lesbarer ist als "ns", z. B. "Ite".
  6. Blättern Sie abwärts zum Abschnitt BuildMessage auto-generated code. Kopieren Sie die SELECT-Klausel und löschen Sie die gesamte SET-Zeile.
  7. Ersetzen Sie INVOICE.ITEM im oben gezeigten Code durch die gerade kopierte SELECT-Klausel. Setzen Sie die SELECT-Klausel und runde Klammern und ändern Sie DispatchedEvent.Usr.OBJECT_KEY in INVOICE.PKEY. Ändern Sie die AS-Klausel von Inv:"Item" in Inv:ITEMS.Ite:ADAPTERITEM[]. Die neue Klausel sollte wie folgt aussehen:
    	
    (SELECT ADAPTER_ITEM.PKEY,
    		ADAPTER_ITEM.NAME,
    		ADAPTER_ITEM.INVOICE_KEY,
    		ADAPTER_ITEM.PRICE
    	FROM Database.ADAPTER_ITEM
    	WHERE ADAPTER_ITEM.INVOICE_KEY = INVOICE.PKEY) AS Inv:ITEMS.Ite:ADAPTERITEM[],
    

Füllen Sie jetzt das neue Attribut mit der Anzahl der abgerufenen ADAPTERITEM-Zeilen. Fügen Sie Folgendes hinter SELECT ein:

CREATE FIRSTCHILD OF Root.MRM.Inv:ITEMS TYPE NameValue NAME 'size' VALUE CARDINALITY(Root.MRM.Inv:ITEMS.Ite:ADAPTERITEM[]);

Normalerweise können Sie folgende Codezeile schreiben:

SET Root.MRM.Inv:ITEMS.size = CARDINALITY(Root.MRM.Inv:ITEMS.Ite:ADAPTERITEM[])
Da es sich bei der Nachricht jedoch um eine geordnete Folge handelt, müssen Sie sicherstellen, dass das Attribut das erste untergeordnete Element ist.
Hier der fertige ESQL-Code:
SET Root.MRM = THE(
SELECT 
	DispatchedEvent.Usr.OBJECT_VERB AS verb,
	INVOICE.PKEY        AS Inv:PKEY,
		(SELECT ADAPTER_ITEM.PKEY,
				ADAPTER_ITEM.NAME,
				ADAPTER_ITEM.INVOICE_KEY,
				ADAPTER_ITEM.PRICE
		FROM Database.ADAPTER_ITEM
		WHERE ADAPTER_ITEM.INVOICE_KEY = INVOICE.PKEY) AS Inv:ITEMS.Ite:ADAPTERITEM[],
	INVOICE.QUANTITY    AS Inv:QUANTITY,
	INVOICE.CUSTOMER    AS Inv:CUSTOMER,
		'Retrieve'         AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.verb,
		CUSTOMER.PKEY      AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:PKEY,
		CUSTOMER.FIRSTNAME AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:FIRSTNAME,
		CUSTOMER.LASTNAME  AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:LASTNAME,
		CUSTOMER.ADDRESS   AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADDRESS,
			'Retrieve'         AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.verb,
			ADDRESS.PKEY       AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:PKEY,
			ADDRESS.FIRSTLINE  AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:FIRSTLINE,
			ADDRESS.SECONDLINE AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:SECONDLINE,
			ADDRESS.CODE       AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:CODE,
			ADDRESS.CITY       AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:CITY,
			ADDRESS.COUNTRY    AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:ADAPTERADDRESS.Add:ADAPTERADDRESS.Add:COUNTRY,
		CUSTOMER.CCODE    AS Inv:ADAPTERCUSTOMER.Cus:ADAPTERCUSTOMER.Cus:CCODE ,
	'JDBCConnector_'
	 ||CAST(DispatchedEvent.Usr.EVENT_ID AS CHARACTER)
	 ||'ibm_events'
	 ||CAST(DispatchedEvent.Usr.EVENT_TIME AS CHARACTER FORMAT 'yyyyMMddhhmmss.SSS') AS Inv:ObjectEventId
	FROM Database.ADAPTER_INVOICE  AS INVOICE, 
		 Database.ADAPTER_CUSTOMER AS CUSTOMER, 
		 Database.ADAPTER_ADDRESS  AS ADDRESS
	WHERE INVOICE.PKEY  = DispatchedEvent.Usr.OBJECT_KEY AND 
		  CUSTOMER.PKEY = INVOICE.CUSTOMER AND 
		  ADDRESS.PKEY  = CUSTOMER.ADDRESS);
CREATE FIRSTCHILD OF Root.MRM.Inv:ITEMS TYPE NameValue NAME 'size' VALUE CARDINALITY(Root.MRM.Inv:ITEMS.Ite:ADAPTERITEM[]);

Neue Funktionen testen

Testen Sie die neue Funktion, indem Sie einige Artikel zur Tabelle ITEM hinzufügen und eine Rechnung hinzufügen oder ändern, die diese Artikel verwendet:

--<ScriptOptions statementTerminator="@"/>
INSERT INTO ADAPTER_ITEM (NAME,INVOICE_KEY,PRICE) 
  VALUES ('Trousers', 'inv10', 2.17)@
  
INSERT INTO ADAPTER_ITEM (NAME,INVOICE_KEY,PRICE)
  VALUES ('Jumpers', 'inv10', 12.00)@

INSERT INTO ADAPTER_INVOICE
  VALUES ('inv10', '', 10, 'cust1')@

Fügen Sie den oben gezeigten SQL-Code in ein neues SQL-Script im Datenentwurfsprojekt 'AdapterMigration' im Datenprojektexplorer ein. Klicken Sie dann mit der rechten Maustaste auf das Projekt in der Ansicht 'Datenprojektexplorer' und wählen Sie 'SQL ausführen' aus. Dadurch wird der Fluss ausgeführt und folgende Nachricht in der Warteschlange ADAPTERMIGRATION.INVOICE angezeigt:

<?xml version="1.0"?>
<Q1:ADAPTERINVOICE xmlns:Q1="http://www.ibm.com/websphere/crossworlds/2002/BOSchema/ADAPTERINVOICE" xmlns:Q4="http://dbinput/amartens" xmlns:Q3="http://www.ibm.com/websphere/crossworlds/2002/BOSchema/ADAPTERADDRESS" xmlns:Q2="http://www.ibm.com/websphere/crossworlds/2002/BOSchema/ADAPTERCUSTOMER" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" verb="Create">
 <Q1:PKEY>inv10</Q1:PKEY>
 <Q1:ITEMS size="2">
  <Q4:ADAPTERITEM>
   <PKEY>9</PKEY>
   <NAME>Trousers</NAME>
   <INVOICE_KEY>inv10</INVOICE_KEY>
   <PRICE>2.17E+0</PRICE>
  </Q4:ADAPTERITEM>
  <Q4:ADAPTERITEM>
   <PKEY>10</PKEY>
   <NAME>Jumpers</NAME>
   <INVOICE_KEY>inv10</INVOICE_KEY>
   <PRICE>1.2E+1</PRICE>
  </Q4:ADAPTERITEM>
 </Q1:ITEMS>
 <Q1:QUANTITY>10</Q1:QUANTITY>
 <Q1:CUSTOMER>cust1</Q1:CUSTOMER>
 <Q1:ADAPTERCUSTOMER>
  <Q2:ADAPTERCUSTOMER verb="Retrieve">
   <Q2:PKEY>cust1</Q2:PKEY>
   <Q2:FIRSTNAME>Barney</Q2:FIRSTNAME>
   <Q2:LASTNAME>Rubble</Q2:LASTNAME>
   <Q2:ADDRESS>add1</Q2:ADDRESS>
   <Q2:ADAPTERADDRESS>
    <Q3:ADAPTERADDRESS verb="Retrieve">
     <Q3:PKEY>add1</Q3:PKEY>
     <Q3:FIRSTLINE>MP211</Q3:FIRSTLINE>
     <Q3:SECONDLINE>IBM Hursley Park</Q3:SECONDLINE>
     <Q3:CODE>SO21 2JN</Q3:CODE>
     <Q3:CITY>Winchester</Q3:CITY>
     <Q3:COUNTRY>GB</Q3:COUNTRY>
    </Q3:ADAPTERADDRESS>
   </Q2:ADAPTERADDRESS>
   <Q2:CCODE>Dev</Q2:CCODE>
  </Q2:ADAPTERCUSTOMER>
 </Q1:ADAPTERCUSTOMER>
 <Q1:ObjectEventId>JDBCConnector_160ibm_events20101108020022.046</Q1:ObjectEventId>
</Q1:ADAPTERINVOICE>

Zurück zum Beginn des Mustercodes