Tabellenstruktur/Felder mit NexusDB nachträglich anpassen

Oft ergibt sich die Anforderung eine Tabellenstruktur nachträglich anzupassen. Die Gründe dafür sind unterschiedlich, in meinen Fall, weil schon eine Tabelle vorliegt, diese aber feingetunt werden soll, ohne komplett neu zu erstellen.

Unabhängig vom Beispiel davon zeigt es die grundsätzliche Vorgehensweise, wie man nachträglich sehr schnell und komfortabel mit NexusDB Anpassungen an Tabellen vornehmen kann, ohne dabei auf SQL zurückgreifen zu müssen.

In folgenden Beispiel bekommen alle Felder vom Typ Int32 und Double einen Defaulthandler zugewiesen, d.h. in diesem Fall: wann immer ein Datensatz angehängt wird, ist der Default-Wert für diese Felder 0.

NexusDB kennt dabei weitere DefaultHandler, z.B. zum automatischen Erzeugen von Guid-Werten oder z.B. zum automatischen Einfügen von Datumswerten in entsprechenden Feldern, wahlweise beim Neuinfügen oder beim Editieren eines Datensatzes (oder beides).

Procedure RestructureTable;
var
NewDict, Dict: TnxDataDictionary;
TaskInfo: TnxAbstractTaskInfo;
Completed: Boolean;
TableMapper: TnxTableMapperDescriptor;
TaskStatus: TnxTaskStatus;
TableList: TStringList;
zaehler,  z: Integer;
FIndex: Integer;
FType: TnxFieldType;

begin
// nimmt Liste aller Tabellen einer Datenbank auf
TableList := TStringList.Create;
//ermittelt Liste aller Tabellen
datenbox.NexusDBDatabase.GetTableNames(TableList);
// Schleife über alle Tabellen
for zaehler := 0 to tableList.Count – 1 do
begin
if TableList.Strings[zaehler] <> “ then   //zur Sicherheit
begin
// DataDictionary unserer DB erzeugen
Dict := TnxDataDictionary.Create;
TableMapper := TnxTableMapperDescriptor.Create;
// hole alte Dictionary für die aktuelle Tabelle in der Schleife
datenbox.NexusDBDatabase.GetDataDictionary(TableList.Strings[zaehler], “, Dict);
// Eine neue auf Basis des alten Dictionary erzeugen
NewDict := TnxDataDictionary.Create;
try
NewDict.Assign(Dict) ;
for z := 0 to newDict.FieldsDescriptor.FieldCount – 1 do    // durch alle Felder laufen
begin
FType := newDict.FieldsDescriptor.FieldDescriptor[z].fdtype;   // Feldtyp ermitteln
if (FType = nxtInt32) or (FType = nxtDouble) then                // wenn unser gewünschter Feldtyp, dann
begin
// Defaulthandler zuweisen für das Feld, für weitere Defaulthandler siehe NexusDB – Hilfe
with newDict.FieldsDescriptor.FieldDescriptor[z].AddDefaultValue(TnxConstDefaultValueDescriptor) as
TnxConstDefaultValueDescriptor do
AsVariant := 0;
end;
end;
// folgendes führt die Änderung an der Tabellenstruktur durch
TableMapper.MapAllTablesAndFieldsByName(Dict, NewDict);
nxCheck(datenbox.NexusDBDatabase.RestructureTableEx(TableList.Strings[zaehler],“, NewDict, TableMapper,     TaskInfo));
try
if Assigned(TaskInfo) then
begin
repeat
TaskInfo.GetStatus(Completed, TaskStatus);
if not Completed then
Sleep(500)
until Completed;
nxCheck(TaskStatus.tsErrorCode);
end;
finally
if Assigned(TaskInfo) then
TaskInfo.Free;
end;
finally
Dict.Free;
TableMapper.Free;
NewDict.free;
end;
end;
end;
tablelist.Free;

Werbung


Ashampoo Backup Pro – zuverlässige, einfach zu nutzende Backup Software zum kleinen Preis mit 40% Rabatt


Werbung



Bitdefender Angebote


Verwandte Themen:


Sorry! Unser Kommentarfunktion ist vorübergehend geschlossen.