Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Doppelte Datensätze verhindern (https://www.delphipraxis.net/39931-doppelte-datensaetze-verhindern.html)

fkerber 9. Feb 2005 09:26

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

Jelly 9. Feb 2005 09:33

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)

Sharky 9. Feb 2005 09:34

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.

fkerber 9. Feb 2005 09:46

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

Jelly 9. Feb 2005 09:52

Re: Doppelte Datensätze verhindern
 
Zitat:

Zitat von fkerber
Nein, auch doppelte Leerstrings akzeptiert er nicht.

Bist du sicher, daß du Leerstring nicht mit NULL verwechselst? Bei Datenbanken ist es ein Unterschied, ob du
SQL-Code:
insert into archiv (isbn,titel) values ('','Mein Titel')
oder
SQL-Code:
insert into archiv (isbn,titel) values (null,'Mein Titel')
schreibst.

Sharky 9. Feb 2005 09:53

Re: Doppelte Datensätze verhindern
 
Zitat:

Zitat von fkerber
....Wie kann ich denn die einzelnen Zeilen durchgehen?...

Mache das einfach mit einem Query.
Delphi-Quellcode:
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;
[Edit]Die lösung mit einem Index wie von Jelly vorgeschlagen ist aber besser[/edit]

Sharky 9. Feb 2005 10:07

Re: Doppelte Datensätze verhindern
 
Grummel die Absolute DB scheint tatsächlich kein NULL einzutragen.

fkerber 9. Feb 2005 10:08

Re: Doppelte Datensätze verhindern
 
Hi!

Danke für die Tipps.

@Jelly:
Der Fehler ist in beiden Fällen der selbe:
Zitat:

---------------------------
Bücher-Archiv
---------------------------
Absolute Engine Error # -8 Constraint unique 'C_Unique$ISBN' violated. Duplicate found. - Native error: 30320.
---------------------------
OK
---------------------------
Mein Eintragen:
ABSQuery1.FieldByName('isbn').AsString := '';
bzw.
ABSQuery1.FieldByName('isbn').AsVariant := NULL;


Ciao Frederic

Jelly 9. Feb 2005 10:18

Re: Doppelte Datensätze verhindern
 
Mmmmhh,
probier mal statt
Delphi-Quellcode:
ABSQuery1.FieldByName('isbn').AsVariant := NULL;
das hier:
Delphi-Quellcode:
ABSQuery1.FieldByName('isbn').Clear ;

fkerber 9. Feb 2005 10:22

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 15:37 Uhr.
Seite 1 von 2  1 2      

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