Um neue Datenbanktabellen in SOG ERP in CSharp verarbeiten zu können, sind folgende Schritte notwendig:
Neu:
Über den SOGDevAssistant kann dies nun automatisiert erfolgen.
Ansonsten manuell wie folgt:
DevStudio: SqlDbEntity selektieren, Devassistant starten, "Generierte Klasse erzeugen". (Aktion: globaldbcs_sqldb, context: file)
Startet automatisch sogdd mit dem angegebenen Namen.
Dateinamen um "_gen" erweitern. Partial Haken entfernen (falls man auf SqlDbEntity-Ebene nichts programmieren will, was der Normalfall ist).
edit Cobol\Base\file\file.ccf
edit Cobol\Base\file\dbs.hhcsgen
edit sql\relation\relv2_base_cfg.xml => <Class Table="ddname" ObjectClass="#CsKlasse" />
DevStudio: In Entity im jeweiligem Ordner, z.B. Stammdarten zwei Partielle Klassen Anlegen "CsKlasse" und "CsKlasseTable" (z.B. Kundennstamm, KundenstammTable)
DevStudio: SOG.ERP / SOG.ERP / Entity / Generated : Generieren der Datei: SOGERPDatabase.soggenerate.cs
DevStudio: Hinzufügen der neu entstandenen Dateien: SOG.ERP / SOG.ERP / Entity / Generated / files Quelle: Sources\SOG.ERP\Entity\Generated\files Datei/en: ddname.soggenerate.cs
In dem Unterverzeichnis "generated" unterhalb Ihres Entwicklungsbereichs, werden bei der Generierung von Datenbank und Tabellen Dateien abgelegt, die zwar in das Projekt eingebunden werden müssen, nicht aber verändert werden dürfen, da diese bei jeder erneuten Durchführung der entsprechenden "hhcsgen" Anweisung durch neuen Standardcode ersetzt werden. Manuelle Änderungen in diesem Bereich gehen verloren!
Zugriff auf Datensätze mit Hilfe von SOGDataObject Klassen
Für den Zugriff auf eine SOGDataObject-Klasse benötigen Sie zuerst ein Objekt der konfigurierten SOGDatabase. Anschließend können Sie von der Datebase 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( v.Firma, 1, 1, 1 );
Diese Systematik erlaubt es, einzelne Objekttypen projektindividuell abzuleiten und mit neuen Funktionen zu versehen.
Implementierung von dynamischen SQL-Statements
Um alle SQL-Anweisungen die zu einer Tabelle existieren in einem Modul zu sammeln, sollten diese auf dem Tabellenobjekt der Tabelle (hier: RechnungsLeitsatzTable" implementiert werden. Dazu finden Sie am Anfang der Region "StandardImplementierung" einige Kommentarzeilen, die sie an das Ende der Quelle (außerhalb von StandardImplementierung") kopieren können, um sie dort anzupassen.
Beispiel für die Implementierung einer Where-Klausel mit Parametern in der Klasse RechnungsLeitsatzTable:
protected string Where_funkbelnr( int ek_vk, int belnr )
{
string key2 = RechnungsLeitsatz.BuildKey2( v.Firma, ek_vk, belnr );
string Where = string.Format( "where key_2='{0}'", key2 );
return Where;
}
protected string OrderBy_funkbelnr()
{
string Order = string.Format( "order by key_1" );
return Order;
}
public RechnungsLeitsatzDataSet Select_funkbelnr( int Start, int MaxAnz,
int ek_vk, int belnr )
{
return ListObjects( Start, MaxAnz,
Where_funkbelnr( ek_vk, belnr ), OrderBy_funkbelnr() );
}
Der Abruf einer entsprechende Menge von Objekten erfolgt dann mittels:
RechnungsLeitsatzDataSet li = rlTab.Select_funkbelnr( 0, 0, 1, 4711 );
Die Angabe von "Start=0" und "MaxAnz=0" sorgt dafür, dass alle Datensätze geliefert werden. Wahlweise könnte hier auch mit einem "Fenster" auf die Datensätze gearbeitet werden, wie es z.B. bei Web-Anwendungen üblich ist.
Implementierung von Datenaktualisierungen
Um Daten eines SOGDataObjects aktualisieren zu können reicht es nicht aus einfach nur die Membervariablen 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 Objekt 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 eine neue, bequemere Schreibweise verwendet werden, bei der die auszuführenden Anweisungen zur Aktualisierung als "Action" übergeben werden:
public void SetDocAnz( int DokAnz )
{
Update( () =>
{
m_anzdok=DokAnz;
} );
}
Oder noch kürzer als Lambda Expression:
public void SetDocAnz( int DokAnz )
{
Update( () => m_anzdok=DokAnz );
}