![]() |
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 |
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 |
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. |
Re: Primärindex nachträglich hinzufügen?
Hallo FBrust,
Code:
Getestet und funktionsfähig.
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; mfg eddy |
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