Hier wird der Klassenaufbau des gleichen ORDERS-Objekts, nun aber für eine Datenbank Integration, dargestellt.
Die Klasse ORDERS implementiert hier die Schnittstelle DbAdapterTypeBase. Diese wandelt die Objektdefiniton bei Lesevorgängen auf der Quelldatenbank mit dem BackendObjectRetriever in das entsprechende SELECT-Statement um.
I.d.R. wird das Attribut ReadMarker() verwendet um Datensätze als gelesen zu vermerken. Dann wird nach dem SELECT auch ein UPDATE-Statement ausgeführt.
Bei Schreibvorgängen mit dem BackendObjectTransmitter werden entsprechende INSERT-Statements erzeugt.
using System; using System.Collections; using eBiss.Api; using eBiss.DbAdapter; namespace XYZ.DB { public class ORDERS : DbAdapterTypeBase { [MapTrigger, MapExternalName("ORDERSKOPF")] public ORDERS_HEADER HEADER; } public class ORDERS_HEADER : IMapObjectItem { public Decimal PK_ORDERSKOPF; [MapSize(35)] public string DOCNUMBER; public DateTime DOCDATE; [MapSize(35)] public string ORDERTYPE; public DateTime DELIVERYDATEFROM; public DateTime DELIVERYDATETO; [MapFrameDocumentRecipient, MapSize(13)] public string SU_GLN; [MapFrameDocumentSender, MapSize(13)] public string BUYERGLN; [MapSize(13)] public string DELIVERYPARTYGLN; [MapSize(13)] public string ULTIMATECONSIGNEEGLN; [MapSize(13)] public string INVOICERECEIPIENTGLN; [MapSize(3)] public string XYZ_WCD; //XYZ Währungscode [MapSize(1)] [ReadMarker(ReadMarkerType.CheckUpdate, "N", "V")] public string MUTATION_Type; [ReadMarker(ReadMarkerType.Timestamp)] public DateTime MUTATION_Date; [MapListType(typeof(ORDERS_DETAIL)), MapExternalName("ORDERSDETAIL")] public ArrayList DETAIL; } public class ORDERS_DETAIL : IMapObjectItem { public Decimal PK_ORDERSDETAIL; [Relation("PK_ORDERSKOPF")] public Decimal PK_ORDERSKOPF; public Int32 POSNUMBER; public string EAN; public int ORDEREDQUANTITY; public decimal PURCHASEPRICENET; [MapSize(3)] public string PURCHASEPRICENETCURRENCY; [MapSize(1)] } }
Die Klasse ORDERS_HEADER beinhaltet die Kopf-Informationen der ORDERS und implementiert die Schnittstelle IMapObjectItem. Diese Darf einmal je Datei vorkommen. Mit dem Attribut MapExternalName(„ORDERSKOPF“) wird explizit der Tabellenname der Kopfdaten bestimmt und mit MapExternalName(„ORDERSDETAIL“) ist der Tabellenname der Detaildaten deklariert. Die Relation der Details zu den Kopfdaten wird hier über das Mapping Attribut [Relation(„PK_ORDERSKOPF“)] auf Datenelement public Decimal PK_ORDERSKOPF; hergestellt.
Hinweis: using eBiss.DbAdapter;
Werden Daten ausgelesen, so muss man dies auf geeignete Art vermerken damit diese nicht wiederholt gelesen werden. In der Praxis kommen zwei Methoden zur Anwendung:
Das gezeigt Beispiel verwendet hierfür das Mappingattribut ReadMarker() wie folgt:
[ReadMarker(ReadMarkerType.CheckUpdate, "N", "V")] public string MUTATION_Type; [ReadMarker(ReadMarkerType.Timestamp)] public DateTime MUTATION_Date;
Das Attribut ReadMarkerType.CheckUpdate verwendet bei einem SELECT den ersten Parameter „N“ als Filter in der WHERE-Clause und nach dem Select wird ein UPDATE Statement mit dem zweiten Parameter „V“ auf dem attributierten Datenelement ausgeführt.
Eine Alternative zu Attribut ReadMarkerType.CheckUpdate gibt es mit Attribut ReadMarkerType.UpdateOnly:
[ReadMarker(ReadMarkerType.UpdateOnly, DoneVal = "UPDATED")] public string MUTATION_Type;
oder:
[ReadMarker(ReadMarkerType.UpdateOnly, DoneVal = "$UpdateVariable")] public string MUTATION_Type;
Dieses Attribut bietet die Möglichkeit einen Datensatz beim Commit feste Werte oder Werte aus Variablen mitzugeben ohne diese wie beim ReadMarker.CheckUpdate vorher zu überprüfen.
Hierachische Strukturen sind vorzugsweise in der Datenbank durch verschieden Tabellen etabliert, können aber auch mit Hilfe von Datensatztypen innerhalb einer Tabelle deklariert sein. Im Normalfall kann dies ausreichend mit dem Attribut Relation] erreicht werden. Im letzteren Fall kann zusätzlich zu dem Attribut [[transformation:mappings:objektdefinition:attribute#dbadapter_attribute|Relation mit dem Where_Attribut diese Beziehung hergestellt werden.