Delphi-PRAXiS

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 10: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 10: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 10: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 10: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 10: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 10: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 11:07

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

fkerber 9. Feb 2005 11: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 11: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 11:22

Re: Doppelte Datensätze verhindern
 
Hi!

Auch das führt leider zum selben Fehler, sorry.


Ciao Frederic

Jelly 9. Feb 2005 11:25

Re: Doppelte Datensätze verhindern
 
Dann scheints wirklich am DBMS zu liegen. :cry: Wie Sharky festgestellt hat, seh ich grad.

Sharky 9. Feb 2005 11:37

Re: Doppelte Datensätze verhindern
 
Zitat:

Zitat von Jelly
Dann scheints wirklich am DBMS zu liegen. ..

Jup. Die Absolute DB kennt zwar den "Wert" NULL aber berücksichtigt ihn dummerweise bei einem Unique Index :-(

fkerber 9. Feb 2005 11:39

Re: Doppelte Datensätze verhindern
 
Hi!

Das ist bedauerlich. Dann also doch einzeln durchgehen...


Ciao Frederic

Jelly 9. Feb 2005 11:40

Re: Doppelte Datensätze verhindern
 
Vielleicht gibts ne Einstellung im DBS... Bei MSSQL kann man so Dinge auch selbst festlegen. Hab nur noch nie mit Absolute gearbeitet.

Sharky 9. Feb 2005 11:42

Re: Doppelte Datensätze verhindern
 
Zitat:

Zitat von fkerber
... Dann also doch einzeln durchgehen.....

Nein einzeln durchgehen. Nur bei einem neuen Buch prüfen ob die Nummer oder der Titel schon in der Tabelle sind. Siehe meinen Code oben.

fkerber 9. Feb 2005 11:44

Re: Doppelte Datensätze verhindern
 
Hi!

:wall:
Stimmt, ist ja viel sinnvoller.
Danke.


Ciao Frederic

Jelly 9. Feb 2005 11:46

Re: Doppelte Datensätze verhindern
 
Zitat:

Zitat von Sharky
Siehe meinen Code oben.

Vorsicht bei Verwendung von RecordCount bei Queries. Je nachdem welcher DatenbankCursor verwendet wird, liefert RecordCount immer 0. Ich würd die Query bischen umändern, in
SQL-Code:
select count(isbn) as N from archiv where isbn = :isbn
Und dann direkt fieldbyname('N').AsInteger als Kriterium nehmen.

Sharky 9. Feb 2005 11:49

Re: Doppelte Datensätze verhindern
 
Zitat:

Zitat von Jelly
...Ich würd die Query bischen umändern,...

Ich auch ;-)
Wobei es bei der Absolute DB egal sein sollte. Das ist keine Server-DB sondern eine auf Dateibasierende DB ohne die BDE.


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