![]() |
Paradox-Tabellen per Programm ändern?
Hallo,
ich suche eine Möglichkeit, bei Paradox-Tabellen Feldeigenschaften zu ändern. Mein Problem ist, dass bei einem bestimmten Feld der Vorgabewert falsch ist und ich dies ändern muss. Allerdings stehen schon Werte in dieser Tabelle so dass ich nicht einfach eine neue Tabelle drüberinstallieren kann. Ich habe zwar eine Delphi-Unit, die (mit Hilfe einer INI-Datei) Felder hinzufügen/ändern/löschen kann, aber Feldeigenschaften kann sie leider nicht ändern. Hat vielleicht jemand eine Idee? Grüsse Frank |
Hallo FBrust,
grundsätzlich wäre das per SQL möglich:
SQL-Code:
Leider unterstütz lokal SQL dieses Statement nicht.
ALTER TABLE TestID
ALTER COLUMN ID TYPE VARCHAR(10) Die einfachste Möglichkeit wäre die Änderung über die Datenbankoberfläche. Wenn es jedoch über ein Programm gehen muss, könntest du mit
SQL-Code:
Dann läufst du durch die Tabelle und kopierts die Daten in das neue Feld.
ALTER TABLE TestID
ADD FeldNeu CHAR(10) Mit
SQL-Code:
löscht du dann das alte Feld.
ALTER TABLE TestID
DROP FeldAlt |
Hallo MrSpock,
für das was Du da beschreibst, habe ich bereits eine Routine geschrieben, die (per INI-Datei) genau das macht. Die Frage ist: Was tue ich, wenn ich bei einem Feld z. B. einen Vorgabewert eingetragen habe und diesen ändern oder löschen möchte? Grüsse Frank |
Nur ums richtig zu verstehen:
Du hast eine Tabelle, mit beispielsweise 20 Zeilen Daten Jede Zeile hat 5 Spalten. Hast du jetzt in jeder Zeile in der gleichen Spalte diesen Vorgabewert drin? Oder hast du nur in einer Zeile diesen Wert drin? Oder geht es dir um eine komplette Spalteneigenschaft, die du z.B. von Real zu Integer ändern willst? Gruß Minz |
Hallo FBrust,
Informationen wie z.B. Vorgabewerte werden in einer internen Struktur CRTblDesc gespeichert. Diese kann man mit dem Aufruf der function DbiDoRestructure ändern. Hier ein Beispiel aus der OH zur BDE 4.0:
Delphi-Quellcode:
[edit=MrSpock]Beispiel hinzugefügt[/edit]
procedure fDbiDoRestructure(Tbl: TTable; Field: TField; MinVal, MaxVal, DefVal: pLongint; Required: Bool);
var hDb: hDbiDb; TblDesc: CRTblDesc; VChk: pVChkDesc; Dir: String; NumVChks: Word; OpType: CROpType; begin NumVChks := 0; SetLength(Dir, dbiMaxNameLen + 1); Check(DbiGetDirectory(Tbl.DBHandle, False, PChar(Dir))); SetLength(Dir, StrLen(PChar(Dir))); VChk := AllocMem(sizeof(VChkDesc)); try FillChar(TblDesc, sizeof(CRTblDesc), #0); VChk.iFldNum := Field.Index + 1; Tbl.DisableControls; Tbl.Close; Check(DbiOpenDatabase(nil, nil, dbiReadWrite, dbiOpenExcl, nil, 0, nil, nil, hDb)); Check(DbiSetDirectory(hDb, PChar(Dir))); with VChk^ do begin bRequired := Required; if MinVal <> nil then begin Inc(NumVChks); bHasMinVal := True; move(MinVal^, aMinVal, sizeof(MinVal^)); end else bHasMinVal := False; if MaxVal <> nil then begin Inc(NumVChks); bHasMaxVal := True; move(MaxVal^, aMaxVal, sizeof(MaxVal^)); end else bHasMaxVal := False; if DefVal <> nil then begin Inc(NumVChks); bHasDefVal := True; move(DefVal^, aDefVal, sizeof(DefVal^)); end else bHasDefVal := False; end; TblDesc.iValChkCount := NumVChks; TblDesc.pVChkDesc := VChk; OpType := crADD; TblDesc.pecrValChkOp := @OpType; StrPCopy(TblDesc.szTblName, Tbl.TableName); StrCopy(TblDesc.szTblType, szParadox); Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False)); finally Check(DbiCloseDatabase(hDb)); FreeMem(VChk, sizeof(VChkDesc)); Tbl.EnableControls; Tbl.Open; end; end; |
Hallo,
@Minz: Ich habe, als ich die Tabelle angelegt habe, in der Datenbank- oberfläche einen Vorgabewert angegeben, der sich aber als, naja, sagen wir "suboptimal" herausgestellt hat. Jetzt wird bei jedem Neuanlegen dieser falsche Wert eingetragen. Ich kann aber nicht ohne weiteres die Tabelle ändern, da sie a) bereits Werte beinhaltet b) sie sich nicht in meinem direkten Zugriff befindet. Also muss ich in mein Programm eine Routine einbauen, die dies beim nächsten Update ändert. @MrSpock: Ja, das sieht sehr gut aus. Ich werd mal versuchen es zu verstehen und dann ausprobieren (oder umgekehrt 8) ) Danke für Deine Hilfe. Grüsse Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz