Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi unique? (https://www.delphipraxis.net/53605-unique.html)

Sanguis 19. Sep 2005 21:43

Datenbank: Paradox • Version: 7 • Zugriff über: BDE

unique?
 
Hi,
ich habe da ein kleines Problem. Ich habe schon euer Forum ein wenig durchsucht, aber nicht das gefunden was für mich passt.

Ich arbeite mit einer Paradox Datenbank über die BDE (ja, ich weiss das die ADO Komponenten besser sind.. ich benutze in dem fall aber trotzdem die BDE)...

Jedenfalls habe ich jetzt das Problem, das ich ein Unique Feld brauche.
Ich habe ein ID Feld welches als Primärschlüssel auch hochzählt und irgendwo sicherlich Unique ist.
Aber ich brauche noch für ein anderes Feld in dem ein String gespeichert wird, das da nix doppelt vorkommt. Ich finde nur nirgens die Möglichkeit das bei der Paradox Tabelle zu machen.
Muss ich tatsächlich selbst manuell bei jedem neuen Eintrag die Datenbank durchsuchen?

marabu 20. Sep 2005 06:34

Re: unique?
 
Hallo Andy,

Zitat:

Zitat von Sanguis
Ich habe schon euer Forum ein wenig durchsucht

ist doch auch dein Forum - oder?

Zitat:

Zitat von Sanguis
Jedenfalls habe ich jetzt das Problem, das ich ein Unique Feld brauche.

Du kannst bei Paradox Tabellen nicht einfach einem Feld das Attribut UNIQUE zuweisen. Ab Paradox Version 5 wird aber das Indexattribut ixUnique unterstützt, welches beim Primärindex automatisch gesetzt wird. Du kannst also für dein String-Feld einen Sekundärindex definieren, den du als eindeutig festlegst. Das geht z.B. in der Datenbankoberfläche oder schau mal in der Delphi Online Hilfe unter TTable.AddIndex und TIndexOption.

Das Durchsuchen deiner Tabelle kannst du dir dann sparen und so vorgehen:

Delphi-Quellcode:
begin
  Table.Insert;
  Table.FieldByName('STRINGFELD').AsString := 'Nochmal';
  try
    Table.Post;
  except
    ShowMessage('Doppelter Wert');
  end;
end;
Grüße vom marabu

Sanguis 20. Sep 2005 11:44

Re: unique?
 
Hi,
erstmal danke für deine Antwort.
Ich habe gestern stundenlang die Datenbankoberfläche durchsucht.. ich habe sogar ein anderes Freeware Tool runtergeladen für die Datenbankverwaltung. Aber ich habe das nirgens gefunden. Auch die Hilfe hat mir leider nicht weitergeholfen.
Suche ich denn richtig, wenn ich einfach nur was suche wo ich nen Haken machen kann, quasi?

Danke für deinen Quellcode. Die Methode ist für mich irgendwie auch neu.
Ich habe Datensätze bisher immer richtig per SQL eingefügt.. das ist also eigentlich garnicht nötig?

marabu 20. Sep 2005 11:52

Re: unique?
 
Hi,

in der Datenbankoberfläche findest du die Indexoptionen, wenn du beim Umstrukturieren oder Neuanlegen einer Tabelle "Sekundärindizes" aus der Combobox Tabelleneigenschaften auswählst und dann einen Index definierst oder änderst.

Ob du SQL Statements für die Datenmanipulation verwendest oder es wie in meinem Beispiel machst - beides geht. So richtig Bedeutiúng bekommt diese Entscheidung aber erst, wenn du von einer local database auf einen sql server umsteigst.

marabu

Sanguis 20. Sep 2005 12:14

Re: unique?
 
Hi,
also ich glaube ich hab gefunden was du meinst. Ich habe dann auch mal einen Index definiert, allerdings ohne weitere Optionen anzuklicken (Eindeutig, Groß/Kleinschreibung usw...).. Aber da hatte ich keine Wirkung.
Hab direkt in der Datenbankoberfläche nen neuen Datensatz angelegt der in dem einen Feld eine Dublette hatte.. Und ich habe keine Fehlermeldung bekommen und es wurde alles angelegt.
Dann habe ich versucht den Index nochmal zu ändern und "Eindeutig" mit nem haken zu versehen. Als ich das speichern wollte, bekomme ich den Fehler "Ungültiger Indextyp" ?

marabu 20. Sep 2005 12:22

Re: unique?
 
Hi,

wenn du deine Tabelle in der Datenbankoberfläche mit "Umstrukturieren" oder "Strukturinfo" öffnest, dann siehst du in der Titelzeile des Fenster welcher Tabellentyp vorliegt. In der Delphi Online Hilfe unter TIndexOption findest du einige Hinweise, welche Tabellentypen welche Indexoptionen unterstützen. Für Paradox-Tabellen benötigst du minimal Version 4.

marabu

Sanguis 20. Sep 2005 12:37

Re: unique?
 
Hi,
Es ist definitiv Paradox 7.
Und laut Delphi Hilfe wird der Typ "Eindeutig" auch unterstützt (sonst würde ich da auch keinen Sinn drin sehen).. nur eben die anderen beiden zur auswahl stehenden Typen nicht. Die brauche ich aber auch nicht.
Trotzdem bekomme ich wenn ich die Option anklicke eine Fehlermeldung. Ohne die Option bekomme ich keinen Fehler, kann aber weiterhin Dublikate einfügen.
Irgendwie verwirrt mich das *g*

Tut mir auch leid das ich hier solche komischen, warscheinlich Anfängerfragen, stelle.. aber ich komme einfach nicht weiter..

Andy

marabu 20. Sep 2005 12:49

Re: unique?
 
Merke dir doch mal die Indexdefinition und den Namen, lösche den Index und lege ihn anschließend neu an. Eventuell ist ja eine Datei korrupt. Wenn du keine Paradox-Vollversion besitzt, dann kannst du hiermit reparieren: klick

marabu

Sanguis 20. Sep 2005 12:57

Re: unique?
 
Hi,
danke.. auch für den Link.
Ich muss jetzt leider zu nem Geburtstag. Aber ich werde das heute Abend weiter ausprobieren und danach nochmal schreiben ob es geht oder nicht.

Andy

Sanguis 21. Sep 2005 00:28

Re: unique?
 
Hi,
also ich hab das Tool drüberlaufen lassen. Es hat keine Fehler gefunden.
Aaaber, überraschung.. Danach konnte ich den Index ohne Probleme anlegen und er wurde auch gespeichert ohne das ich eine Fehlermeldung bekommen habe.
NUR:
Es bringt nichts.
Ich kann weiterhin in der Datenbankoberfläche 2 gleiche Datensätze in dem Feld eingeben ohne das gemeckert wird. Wird alles gespeichert.
Muss ich das ganze doch jedesmal per Hand durchsuchen ? :(

Hansa 21. Sep 2005 01:01

Re: unique?
 
Du hast mehrere Möglichkeiten :

1. Paradox wegschmeißen und anständige DB verwenden. Wäre beste Lösung. Kurz und schmerzhaft, aber dauerhaft schon sinnvoll. :mrgreen:

2. mit irgendwelchen Paradox-Tools den Logikfehler im Programm suchen und beseitigen

3. selber suchen nach Fehlern im DB-Design

4. damit leben. 8)

Ich weiß, daß die Tipps nicht viel helfen im konkreten Fall, aber Sackgassen in dieser Art tauchen immer noch zu oft auf.

Sanguis 21. Sep 2005 01:06

Re: unique?
 
Das Problem ist, das ich an einem recht komplexen Programm arbeite.
Bisher bin ich mit Paradox da immer sehr gut zurecht gekommen. Es ist wirklich das erste mal das ich ein Problem habe. Und wenn das gelöst ist, dann ist das Programm auch fast fertig.

Auf eine andere DB umsteigen ist nicht ganz so leicht zu lösen. Das Programm wurde mir von jemand anderem übergeben der es nicht weiter schreiben konnte (Zeitprobleme, andere Einsatzgebiete).. wenn ich es jetzt KOMPLETT auf ein anderes System umstelle, dann sitze ich da wochen dran.
Es ist wirklich "nur" das eine das gelöst werden muss. Der Rest funktioniert ohne Probleme.

Hansa 21. Sep 2005 01:22

Re: unique?
 
Zitat:

Zitat von Sanguis
...Und wenn das gelöst ist, dann ist das Programm auch fast fertig...

Wenn das "fast" nicht wäre, wärs wohl besser. Nur was kommt danach ??? Habe noch kein Programm gesehen, wo nicht automatisch Änderungsbedarf bestand. 8)

Sanguis 21. Sep 2005 01:25

Re: unique?
 
Das kann schon sein.. nur wird der änderrungsbedarf im Datenupdate liegen.
Oder eben dinge die mit Paradox zu lösen sind. Was ich weiss, weil es eben im Programm schon gemacht wurde.

Nur diese Unique Funktion brauche ich eben noch. Ich dachte eigentlich die wäre Standard bei Datenbanken. Sonst hätte ich mich nicht so ohne weiteres darauf eingelassen das Programm zu Ende zu schreiben.

marabu 21. Sep 2005 06:38

Re: unique?
 
Hi Andy,

Zitat:

Zitat von Sanguis
Danach konnte ich den Index ohne Probleme anlegen und er wurde auch gespeichert ohne das ich eine Fehlermeldung bekommen habe. NUR: Es bringt nichts.
Ich kann weiterhin in der Datenbankoberfläche 2 gleiche Datensätze in dem Feld eingeben ohne das gemeckert wird. Wird alles gespeichert.

Das deutet für mich darauf hin, dass du den Index für eine nicht leere Tabelle erzeugst bzw. änderst und für diesen Index das UNIQUE Kriterium von deinen Daten her nicht erfüllt ist. In der Datenbankoberfläche kannst du das daran erkennen, dass der Haken bei "eindeutig" fehlt, nachdem du ihn vermeintlich korrekt gespeichert hast. Nach dem Speichern der Einstellungen einfach nochmal öffnen und nachsehen. Um einen UNIQUE Index für Tabellen zu erstellen, deren Daten das Kriterium nicht erfüllen musst du anders vorgehen. Erstelle eine Kopie der Originaltabelle, leere die Originaltabelle, ändere dann den Index und kopiere die Daten dann zurück. Doppelte Schlüssel werden dann abgewiesen.

Unabhängig von den immer wieder zu lesenden Schmähungen für die BDE möchte ich dir versichern, dass diese Software funktioniert, wenn man mit ihr umzugehen weiß. Ich habe 10 Jahre lang eine Leasing-Anwendung in OPAL betrieben und einige noch ältere BDE-basierte Anwendungen sind noch heute im Einsatz. In allen Fällen wehren sich bzw. haben sich die Benutzer gegen eine Ablösung gewehrt. Die Leasing-Anwendung wurde vor 2 Jahren wegen SAP abgeschaltet. Probleme gibt es etwa alle 2 Jahre mal, weil bei einem Kunden eine Tabellenreparatur fällig ist - mal wegen Stromausfall, mal weil Spannungsspitzen von einer Straßenbahn durchschlagen.

@Hansa: was hältst du von dem Kfz-Sachverständigen, der dir nach Begutachtung eines Lackschadens an deinem Oldtimer den Kauf eines neuen Fahrzeugs empfiehlt, mit der Begründung, dass dein Fahrzeug veraltet sei?

Grüße vom marabu

Sanguis 21. Sep 2005 12:30

Re: unique?
 
Danke Marabu, vor allem für den Zuspruch.

Wäre wirklich viel arbeit alles umzustellen. Und Tabellenreperatur muss man irgendwann mal bei jeder Datenbank durchziehen, die länger im Einsatz ist. Hab ich selbst bei MySQL schon festgestellt.

Naja zum Thema. Ich habe tatsächlich eine Tabelle verwendet in der schon Daten waren. Diese waren aber alle Unique (hab ich selbst kontrolliert).. aber wenn es wirklich daran liegt, probier ich es nachher mal mit dem leeren und dann setzen aus.
Jetzt muss ich leider noch zu nem Kunden. Aber später probiere ich es und gebe Rückmeldung.
Danke schonmal, auch für die ganze Mühe.

Sanguis 21. Sep 2005 23:42

Re: unique?
 
Hi,
das scheint geklappt zu haben *S*
Ich habe also die Daten rausgeworfen, den Index nochmal angelegt und jetzt kann ich keinen Datensatz mehr doppelt eingeben *S*
Danke dafür :)

Ich weiss zwar noch nicht so ganz wie ich meine Daten jetzt da wieder einfach reinbekomme die ich exportiert hatte.. aber zur not schreib ich mir dafür ein kleines automatik Programm.. das geht ja schnell.

Also, danke nochmal.. Warst mir ne super Hilfe :)

Andy

marabu 22. Sep 2005 05:50

Re: unique?
 
Hi Andy,

die letzte Hürde nehmen wir auch noch:

SQL-Code:
INSERT INTO newtable SELECT * FROM oldtable
Grüße vom marabu

Sanguis 22. Sep 2005 12:05

Re: unique?
 
Hi,
*lach* Danke.. das hätte ich mir eigentlich denken können..
Aber auf die ganz einfachen Dinge kommt man nicht mehr wenn man erst anfängt kompliziert zu denken.. *g*

Hat prima funktioniert, vielen Dank :)


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