Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Primärindex nachträglich hinzufügen? (https://www.delphipraxis.net/14634-primaerindex-nachtraeglich-hinzufuegen.html)

FBrust 12. Jan 2004 21:38


Primärindex nachträglich hinzufügen?
 
Hallo,

ich habe eine Anwendung, die einige Tabellen mit der BDE benutzt.

Blöderweise habe ich bei einer Tabelle vergessen, einen Primärindex anzulegen, den ich jetzt bräuchte.:wall:
Dummerweise ist die Tabelle bereits im Einsatz, so dass sich nur die Möglichkeit anbietet, den Index durch Programmierung hinzuzufügen, allerdings habe ich keine Ahnung, wie.:?:

Hat da vielleicht jemand eine Idee?

Grüsse

Frank

FBrust 12. Jan 2004 21:48

Re: Primärindex nachträglich hinzufügen?
 
Ich nochmal,

ich habe gerade versucht, zu Testzwecken mit Hilfe der Datenbankoberfläche den Index hinzuzufügen, was im "Umstrukturierungsdialog" auch ohne weiteres möglich war (es war auch das erste Feld der Tabelle).

Aber hallooo, nach dem Klick auf "Speichern" wurden alle Datensätze bis auf einen kommentarlos und ohne Warnung gelöscht. Warum? :gruebel:

Grüße

Frank

MrSpock 13. Jan 2004 09:45

Re: Primärindex nachträglich hinzufügen?
 
Hallo FBrust,

das liegt in der Regel daran, dass alle anderen Datensätze dengleichen Wert im Indexfeld haben und damit einen Fehler auslösen, da der Primärindex ja eindeutig sein muss. Die Datensätze werden aber nicht einfach gelöscht, sondern in eine Tabelle verschoben, die IndexFehl.DB (oder so ähnlich) heißt. Diese wird aber beim nächsten Fehler einfach überschrieben.

eddy 13. Jan 2004 19:06

Re: Primärindex nachträglich hinzufügen?
 
Hallo FBrust,

Code:
procedure TFBrowser.GenerierePrimrIndexID1Click(Sender: TObject);
var i:Integer;
    fn,
    alterTabellenName:String;
    ztab, qtab : TTable;
begin
  qtab := TTable.Create(self);
  ztab := TTable.Create(self);
  try
    qtab.DatabaseName := Tab1.DatabaseName;
    qtab.TableName := Tab1.TableName;
    qtab.Active := true;

    ztab.DatabaseName := Tab1.DatabaseName;
    ztab.TableType := ttParadox;
    s := ExtractFileName(qtab.TableName);
    tx := ExtractFileExt(qtab.TableName);
    i := Pos(tx,s);
    if i > 0 then fn := copy(s,1,i-1) else fn := s;
    i := 1;
    repeat
      if i > 9 then s := fn + '_' + IntToStr(i) + tx
               else s := fn + '_0' + IntToStr(i) + tx;
      inc(i);        
    until not FileExists(AppBkSp(ztab.DatabaseName) + s);
    ztab.TableName := s;

    for i := 0 to qTab.Fields.Count-1 do
      if lower(qtab.FieldDefs.Items[i].Name) = 'ID' then exit;

    ztab.FieldDefs.Clear;
    //neue Felder hinzufügen
    ztab.FieldDefs.Add('ID', ftAutoInc, 0, false);

    for i:=0 to qTab.Fields.Count-1 do
      //Tabellenstruktur übernehmen
      ztab.FieldDefs.Add( qTab.Fields[i].FullName,
                          qTab.Fields[i].DataType,
                          qTab.Fields[i].Size,
                          qTab.Fields[i].Required);

    //neue Felder hinzufügen
    //    ztab.FieldDefs.Add('NVKsonst', ftFloat, 0, false);
    ztab.CreateTable;

    qtab.Active:=false;
    ztab.Active:=false;

    FBrowserInput.Tag := 102;
    FBrowserInput.lblHinw102.Caption := 'Datenstruktur von ' + qtab.TableName + ' wird angepasst';
    FBrowserInput.lblRecNoText.Caption := 'Bitte warten .....';
    FBrowserInput.Show;
    FBrowserInput.Refresh;

    Batchmove1.Mode:=batAppend;
//    i := Batchmove1.RecordCount;
    Batchmove1.Source := qtab;
    Batchmove1.Destination := ztab;

    qtab.Active:=true;
    BatchMove1.Mappings.Clear;
    for i:=0 to qtab.Fields.Count-1 do
    Batchmove1.Mappings.Add(qtab.Fields[i].FullName + '=' +  //Mappingsarray füllen
                           qtab.Fields[i].FullName );

    qtab.Active:=false;
    Batchmove1.Execute;
    // bewirkt den Aufruf von FBrowser.Activat
    FBrowser.Tag := 1;
    FBrowserInput.Close;
    Tab1.Close;

  //  Showmessage('ztab : ' + ztab.TableName);
  //  Showmessage('qtab: ' + qtab.TableName);
    alterTabellenName:=qTab.TableName;

    qTab.Active:=false;
    qTab.DeleteTable;
    ztab.RenameTable(alterTabellenName);
    ztab.Active:=False;
//    UP_DBActiv(Tab1, SessN, SysPath, fnDBIdx);
//    FAllgUP2.UP_GenIdx(Tab1, ztab, ChangeFileExt(FAuf.TabPP.TableName, ''));
    ztab.IndexDefs.Clear;
    try
      ztab.AddIndex('', 'ID', [ixPrimary]);
    except
      ShowMessage('Primär-Index ID konnte nicht erzeugt werden' + CRLF2 +
                  'Datei: ' + AppBkSp(ztab.DatabaseName) + ztab.TableName);
    end;


  finally; //wird auf jeden Fall ausgeführt, auch bei exit
    qtab.Close;
    ztab.Close;
    qtab.Destroy;
    ztab.Destroy;
  end;
  Tab1.Close;
  Tab1.Open;
end;
Getestet und funktionsfähig.

mfg
eddy

FBrust 13. Jan 2004 22:49

Re: Primärindex nachträglich hinzufügen?
 
Hallo Eddy,

danke für den Code, werd ihn einbauen (und natürlich Deinen Namen dabei erwähnen!) 8)

Grüße

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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