AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Primärindex nachträglich hinzufügen?
Thema durchsuchen
Ansicht
Themen-Optionen

Primärindex nachträglich hinzufügen?

Ein Thema von FBrust · begonnen am 12. Jan 2004 · letzter Beitrag vom 13. Jan 2004
Antwort Antwort
Benutzerbild von FBrust
FBrust

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

Primärindex nachträglich hinzufügen?

  Alt 12. Jan 2004, 21:38
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.
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
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

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

Re: Primärindex nachträglich hinzufügen?

  Alt 12. Jan 2004, 21:48
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?

Grüße

Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Primärindex nachträglich hinzufügen?

  Alt 13. Jan 2004, 09:45
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#4

Re: Primärindex nachträglich hinzufügen?

  Alt 13. Jan 2004, 19:06
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
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

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

Re: Primärindex nachträglich hinzufügen?

  Alt 13. Jan 2004, 22:49
Hallo Eddy,

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

Grüße

Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  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 10:39 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