===== DbAdapter Objekt Attribute =====
Abhängig von Klasse **eBiss.DbAdapter**.\\
[[howtos:dbadapter:start|DbAdapter]] Attribute werden i.d.R. bei Datenbank Integrationen benötigt.
==== DynamicTable ====
Mit diesem Attribut wird der Datentpy erst bei INSERT oder UPDATE Operationen gegen das DB Schema validiert.\\ SELECT Operationen können ausgeführt werden obwohl das eBiss Objekt Felder enthält die im DB Schema nicht vorhanden sind.\\ Bei eBiss Systemem mit mehreren Versionen einer Backend-DB sinnvoll.##DB Schema
CREATE TABLE DynamicTable
(
Id int IDENTITY(1,1) NOT NULL,
CommonField1 Varchar(50) NULL,
RecordType int NOT NULL,
)
GO
//CS Object:
public class DynamicTableDoc : IDbMapObjectRoot
{
[MapTrigger]
public DynamicTable DynamicTable;
}
[DynamicTable]
public class DynamicTable : IMapObjectItem
{
[PrimaryKey(PrimaryKeyType.Auto)]
public int Id;
public string CommonField1;
public int RecordType;
public string NonExistantStringField;
public int NonExistanteIntField;
}
eBiss Log:\\ {{:transformation:mappings:objektdefinition:dynamictablelog.png?nolink|}}
==== LookupReference ====
FIXME Mit diesem Attribut können Werte aus anderen Tabellen abgerufen werden.[LookupReference(LookupType.Optional, "RefTable", "FieldId", "FieldLookupValue = @VariableRefTableKey")]
public int RefTableRef;
==== PrimaryKey ====
Markieren und Verwendung des Primärschlüssels der Tabelle.
[PrimaryKey(PrimaryKeyType.Auto)]//Auto from DB. SQL int primary key field that the server will automatically generate.
public int PrimaryKey;
PrimaryKeyType.GUID //Globally Unique Identifier, if set as primary key field in the DB
[PrimaryKey(PrimaryKeyType.Counter, "TableCounters", "FieldName = 'ValueHeaderTable'", "FieldCurrent")]//Select FieldCurrent from TableCounters where FieldName = 'ValueHeaderTable'. Will read last counter and write the next (always +1)
[MapFrameDocumentNumber]
public int PrimaryKey;
PrimaryKeyType.Max//Not implemented
public int PrimaryKey;
==== ReadMarker ====
Markiert dieses Feld((Ausnahme ReadMarkerType.StatusTable, hier wird ein neuer Datensatz in eine dedizierte Tabelle INSERTed.)) beim erfolgreichen lesen des unter **MapTrigger** gelesenen Datensatzes. Es gibt drei verschiedene Typen:\\ [ReadMarker(ReadMarkerType.CheckUpdate, "$foo", "$bar")]//wenn FieldName == $foo dann aktualisiere mit $bar
public string FieldName;
[ReadMarker(ReadMarkerType.Timestamp)]//schreibt aktuelles DateTime(im DB ISO Format) des Selects
public DateTime FieldName;
[ReadMarker(ReadMarkerType.UpdateOnly, DoneVal = "$foo")]// aktualisiert FieldName mit $foo
public string FieldName;
[ReadMarker(ReadMarkerType.StatusTable, "StatusTable", true)]// INSERT eines neuen Records in die Tabelle "StatusTable", bei dem unter "DocumentId" der Wert von "DocNumber" mit "ReadTimeStamp" und "TypeName" eingetragen wird.
public string DocNumber;
$foo oder $bar dürfen als String oder auch als Variable verwendet werden.
==== Where ====
Ein Attribut welches die WHERE-Clause bei SELECT mit AND erweitert.[Where("( ReadTimestamp < $ReadTimestamp AND ReadTimestamp > $ReadTimestamp_2 ) ", true)]
public DateTime ReadTimestamp;
==== Join ====
Mit dem Join Attribut ist es möglich, einen zusätzlichen Select zu umgehen und direkt auf die Daten zuzugreifen. Man kann dieses Join Attribut auch mehrmals anwenden und so mehrere Fremdwerte direkt mit dem Join in den aktuellen Datensatz mit einbeziehen. Dies wirkt sich positiv auf die Performance aus.\\
[Join("JoinTable", "JoinTable.Id = HeaderTable.[Key]")]
[Join("JoinTable", "JoinTable.Id = HeaderTable.[Key]", Alias = "JT2")]
public class HeaderRecord : IMapObjectItem
{
[PrimaryKey(PrimaryKeyType.Counter, "Counters", "Name = 'HeaderTable' and @Name = @Name ", "Current_Val")]
[MapFrameDocumentNumber]
[ReadMarker(ReadMarkerType.StatusTable, "StatusTable", true)]
public int Key;
public string Name;
[ReadMarker(ReadMarkerType.CheckUpdate, 0, 1)]
public decimal TestDecimal;
[ReadMarker(ReadMarkerType.Timestamp), Where("< $LastExecutionStartDate")]
public DateTime ReadTimestamp = new DateTime(1900, 1, 1);
...
==== Relation ====
Mit dem Relation Attribut ist es möglich, die Beziehung zwischen Parent und Child Records herzustellen.\\
namespace SAMPLE
{
public class PRICAT : DbAdapterTypeBase
{
[MapTrigger, MapExternalName("PRICAT_HEADER")]
public HEADER HEADER;
}
}
public class HEADER : IMapObjectItem
{
public int ID;
[MapSize(35),MapFrameDocumentNumber]
public string DocNumber;
...
[MapExternalName("PRICAT_DETAILS")]
public List DETAILS;
}
public class DETAILS : IMapObjectItem
{
public int Id;
[Relation("ID")]
public int Pricat_ID;
....