Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Paradox-Tabellen per Programm ändern? (https://www.delphipraxis.net/5949-paradox-tabellen-per-programm-aendern.html)

FBrust 24. Jun 2003 15:32


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

MrSpock 24. Jun 2003 19:15

Hallo FBrust,

grundsätzlich wäre das per SQL möglich:

SQL-Code:
ALTER TABLE TestID
ALTER COLUMN ID TYPE VARCHAR(10)
Leider unterstütz lokal SQL dieses Statement nicht.

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:
ALTER TABLE TestID
ADD FeldNeu CHAR(10)
Dann läufst du durch die Tabelle und kopierts die Daten in das neue Feld.

Mit
SQL-Code:
ALTER TABLE TestID
DROP FeldAlt
löscht du dann das alte Feld.

FBrust 24. Jun 2003 20:58

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

Minz 25. Jun 2003 00:43

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

MrSpock 25. Jun 2003 07:19

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:
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;
[edit=MrSpock]Beispiel hinzugefügt[/edit]

FBrust 25. Jun 2003 16:50

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 07:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz