====== Beispiel für Datenbank Integration: ====== 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 [[prozessdefinition:jobs:jobsteps:kommunikation:backend:backendobjectretriever|]] in das entsprechende SELECT-Statement um. I.d.R. wird das Attribut [[transformation:mappings:objektdefinition:attribute:dbadapterobject#readmarker|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 [[prozessdefinition:jobs:jobsteps:kommunikation:backend:backendobjecttransmitter|]] werden entsprechende INSERT-Statements erzeugt. ===== Beispiel C# Code ===== 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. {{:images:sign_warning.png?nolink|}}**Hinweis:** using eBiss.DbAdapter; ===== Lesemarkierungen ===== 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: - Vermerken des Lesevorgangs in einer separaten STATUS((Diese Tabelle benötigt drei Felder und zwar **TypeName**(Char), **DocumentId**(Char) und **ReadTimeStamp**(DateTime).\\ {{images:statustable.png?nolink}}))-Tabelle.((Diese Methode kommt dann zur Anwendung wenn die Datenbank keine Markierungsfelder anbietet oder gar schreibgeschützt verbleiben soll.)) - Vermerken des Lesevorgangs auf den Datensätzen selbst.((Dies ist, aufgrund einfacher Anwendbarkeit und besseren Performance, die bevorzugt Methode.)) 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 ===== 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 [[transformation:mappings:objektdefinition:attribute#dbadapter_attribute|Relation] erreicht werden. Im letzteren Fall kann zusätzlich zu dem Attribut [[transformation:mappings:objektdefinition:attribute#dbadapter_attribute|Relation]] mit dem [[howtos:dbadapter:wherecondition|Where]]_Attribut diese Beziehung hergestellt werden.