![]() |
Datenbank: Absolute Database • Version: 4.83 • Zugriff über: mitgelieferte Komponenten + TDataSource + TDBGrid
Doppelte Datensätze verhindern
Hi!
Ich habe folgendes Problem: Habe eine Absolute Database mit 1 Tabelle 'archiv' In dieser gibt es drei Spalten: autor (string), titel(string), isbn(string) Das Ganze dient der Erfassung von Büchern. Wichtig wäre, dass kein Buch doppelt erfasst werden darf. Problem: Es gibt keine Spalte, die man Unique machen kann. Grund: Es gibt Bücher ohne ISBN (vor allem ältere). Dort wäre der Wert der Spalte ISBN also mehrfach ''. Ein Freund hat mir dann etwas von UNIQUE KEY erzählt, aber irgendwie ließ sich das nicht umsetzen. Kann mir jemand ein Beispiel oder einen Tipp geben? Danke. Ciao Frederic |
Re: Doppelte Datensätze verhindern
Bei Absolute Database bin ich mir nicht sicher, weil ich noch nie mit gearbeitet habe. Aber prinzipiell kannst du ein UNIQUE INDEX auf das isbn Feld legen. Fehlt die isbd komplett, so kannst du NULL reinschreiben. Somit sollte es keine Probleme geben mit doppelten Einträgen, weil der UNIQUE INDEX auf NULL nicht greift.
Erzeugen kannst du den Index wie folgt:
SQL-Code:
alter table archive add UNIQUE KEY unqISBD (ISBN)
|
Re: Doppelte Datensätze verhindern
Hai Frederic
ich würde da so vorgehen: Wenn bei einem neueintrag eine ISBN angegeben wird prüfen ob es schon einen Eintrag mit dieser gibt. Wenn keine ISBN angegeben wird püfen ob es den Titel schon gibt. Wenn ja diesen Eintrag erst anzeigen. |
Re: Doppelte Datensätze verhindern
Hi!
@Jelly: Nein, auch doppelte Leerstrings akzeptiert er nicht. @Sharky: Wie kann ich denn die einzelnen Zeilen durchgehen? Und vor allem: Wie lange dauert das? Ich rechne mit bis zu 10.000 Büchern, die dann immer verglichen werden müssten. Ciao Frederic |
Re: Doppelte Datensätze verhindern
Zitat:
SQL-Code:
oder
insert into archiv (isbn,titel) values ('','Mein Titel')
SQL-Code:
schreibst.
insert into archiv (isbn,titel) values (null,'Mein Titel')
|
Re: Doppelte Datensätze verhindern
Zitat:
Delphi-Quellcode:
[Edit]Die lösung mit einem Index wie von Jelly vorgeschlagen ist aber besser[/edit]
procedure TForm1.Neues_BuchClick(Sender: TObject); // Neues Buch
begin if (Trim(ISBN.Text) <> '') then begin ABSQuery1.SQL.Text := 'SELECT ISBN FROM buecher WHERE ISBN = :isbn'; ABSQuery1.ParamCheck := True; ABSQuery1.ParamByName('isbn').AsString := ISBN.Text; ABSQuery1.Open; if (ABSQuery1.RecordCount > 0) then begin ShowMessage ('Diese ISBN ist schon eingetragen'); end else begin Trage_das_Buch_ein; end; end else begin Mache_das_selbe_mit_dem Titel; end; end; |
Re: Doppelte Datensätze verhindern
Grummel die Absolute DB scheint tatsächlich kein NULL einzutragen.
|
Re: Doppelte Datensätze verhindern
Hi!
Danke für die Tipps. @Jelly: Der Fehler ist in beiden Fällen der selbe: Zitat:
ABSQuery1.FieldByName('isbn').AsString := ''; bzw. ABSQuery1.FieldByName('isbn').AsVariant := NULL; Ciao Frederic |
Re: Doppelte Datensätze verhindern
Mmmmhh,
probier mal statt
Delphi-Quellcode:
das hier:
ABSQuery1.FieldByName('isbn').AsVariant := NULL;
Delphi-Quellcode:
ABSQuery1.FieldByName('isbn').Clear ;
|
Re: Doppelte Datensätze verhindern
Hi!
Auch das führt leider zum selben Fehler, sorry. Ciao Frederic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 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