AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Paradox-Tabellen per Programm ändern?
Thema durchsuchen
Ansicht
Themen-Optionen

Paradox-Tabellen per Programm ändern?

Ein Thema von FBrust · begonnen am 24. Jun 2003 · letzter Beitrag vom 25. Jun 2003
Antwort Antwort
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#1

Paradox-Tabellen per Programm ändern?

  Alt 24. Jun 2003, 15:32
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
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#2
  Alt 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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#3
  Alt 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
  Mit Zitat antworten Zitat
Minz

Registriert seit: 19. Dez 2002
476 Beiträge
 
#4
  Alt 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
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#5
  Alt 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]
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#6
  Alt 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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 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