Datenobjekte werden benötigt, wenn Daten aus Datenbanktabellen genutzt werden sollen. Für jede Datenbanktabelle muss dabei das eigentliche Datenobjekt als Datenhalter und eine korrespondierende Tabellenklasse vorhanden sein, die den Zugriff auf Datensätze gewährleistet.
Um Datenobjekte nutzen zu können müssen folgende Voraussetzungen geschaffen werden:
Erstellen Sie mit dem Programm "sogdd" ein Data Dictionary für alle gewünschten Tabellen. Tragen Sie die Tabelle in den Dateien "cobol\base\file\file.ccf" ein, wenn diese auch in echten Cobol-Programmen verwendet wird.
Tragen Sie die Tabelle in den Dateien "cobol\base\file\dbs.hhcsgen" ein. Aktivieren Sie "EnableNoneDbFields" wenn der Zugriff auf Datenfelder über Gruppenstufen unterstützt werden soll. (veraltet)
Führen Sie im Projektteil SqlDBEntity die Generierung für _GenerateAllFileModules.sogmangenerate.cs aus.
Fügen Sie ggf neu erzeugte Tabellen diesem Workspace hinzu.
Wurden neue Tabellen hinzugefügt, oder hat sich die Keystruktur von Key1 für eine Tabelle verändert, generieren Sie in "Entity" Verzeichnis "Generated" die Datei "SOGERPDatabase.soggenerate.cs" neu.
Für den Zugriff auf einen Datensatz benötigen Sie zuerst ein Datenbankobjekt.
Über die Klasse "SOGERPDatabase" können Sie diese aus der Eigenschaft "Current" erhalten.
Zur Vereinfachung implementieren viele SOG ERP (VACOS) -Klassen eine Eigenschaft "Dbs" die genau diese Datenbank zurückliefert.
Von dem Datenbankobjekt können Sie nun ein Tabellenobjekt für die Tabelle erhalten, auf die Sie zugreifen wollen. Mit Hilfe dieses Tabellenobjektes können Sie wiederum einzelne Datensätze abrufen, einfügen, oder Listen von Datensätzen erhalten oder zählen.
SOGERPDatabase Dbs = SOGERPDatabase.Current;
RechnungsLeitsatzTable rlTab = Dbs.GetTable<RechnungsLeitsatzTable>();
RechnungsLeitsatz rl = rlTab.GetRechnungsLeitsatz( Aph.Firma, 1, 1, 1 );
Diese Systematik erlaubt es, einzelne Objekttypen projektindividuell abzuleiten und mit neuen Funktionen zu versehen.
Um die Daten eines Datensatzes aktualisieren zu können reicht es nicht aus einfach nur die Membervariablen des Datenobjekts zu verändern. Die Membervariablen sind vielmehr normalerweise vor Überschreiben geschützt, um unberechtigte Veränderungen von vorn herein entgegen zu wirken.
Damit Daten aktualisiert werden können müssen entsprechende Aktualisierungsfunktionen auf dem Datenobjekt implementiert werden. Beispiel in der Klasse Notizen:
public void SetDocAnz( int DokAnz )
{
UpdateBegin();
try
{
m_anzdok=DokAnz;
Update();
}
finally
{
UpdateEnd();
}
}
Die Funktion "SetDocAnz" aktualisiert die Anzahl Dokumente. Die Aktualisierung wird mit "UpdateBegin" eingeleitet und mit "UpdateEnd" beendet. Der Try-Finally-Block sorgt dafür, dass der "UpdateEnd" auf jeden Fall durchlaufen wird.
Alternativ kann auch geschrieben werden:
rl.Update( () => rl.m_status = 4711 );
Innerhalb des Update-Ausdruck können Datenfelder verändert werden.
Um neue Datensätze in eine Datenbanktabelle einfügen zu können, gibt es in der Tabellenklasse eine Funktion "NewRecord". Diese liefert einen noch nicht eingefügrten, leeren Datensatz. Nun können die Datenfelder des neuen Satzes belegt werden. Der eingentliche Insert erfolgt dann über die Methode "Insert" der Tabellenklasse.
Hier ein Beispiel mit der Klasse "Notizen":
Notizen nRec = nTab.NewRecord();
nRec.m_firma = Aph.Firma;
nRec.m_bereich = Bereiche.BereichPersonen;
nRec.m_sa = sa;
nRec.m_sachnr = skto;
nRec.m_lnr = 1;
nRec.m_bereich2 = Bereiche.BereichPersonen;
nRec.m_txt = "Personendokumente";
nRec.m_ltz_dat = DateHelper.Now8();
nRec.m_ltz_user = ((SOGSession)v.sess).sach;
nRec.m_txt_zeilen = 1;
nTab.Insert(nRec);
Zum Löschen von Datensätzen aus einer Datenbanktabelle kann die Methode "Delete" des Datensatzes aufgerufen werden.
Sollen vor dem Löschen noch Konsistenzprüfungen durchgeführt werden, Kann hierfür die Virtualle Methode "OnDelete" überschrieben werden.
nRec.Delete();