AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Doppelte Datensätze verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

Doppelte Datensätze verhindern

Ein Thema von fkerber · begonnen am 9. Feb 2005 · letzter Beitrag vom 9. Feb 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#1

Doppelte Datensätze verhindern

  Alt 9. Feb 2005, 09:26
Datenbank: Absolute Database • Version: 4.83 • Zugriff über: mitgelieferte Komponenten + TDataSource + TDBGrid
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
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Doppelte Datensätze verhindern

  Alt 9. Feb 2005, 09:33
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:
alter table archive add UNIQUE KEY unqISBD (ISBN)
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Doppelte Datensätze verhindern

  Alt 9. Feb 2005, 09:34
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#4

Re: Doppelte Datensätze verhindern

  Alt 9. Feb 2005, 09:46
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
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Doppelte Datensätze verhindern

  Alt 9. Feb 2005, 09:52
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
insert into archiv (isbn,titel) values ('','Mein Titel') oder
insert into archiv (isbn,titel) values (null,'Mein Titel') schreibst.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Doppelte Datensätze verhindern

  Alt 9. Feb 2005, 09:53
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]
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Doppelte Datensätze verhindern

  Alt 9. Feb 2005, 10:07
Grummel die Absolute DB scheint tatsächlich kein NULL einzutragen.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#8

Re: Doppelte Datensätze verhindern

  Alt 9. Feb 2005, 10:08
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
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Doppelte Datensätze verhindern

  Alt 9. Feb 2005, 10:18
Mmmmhh,
probier mal statt
ABSQuery1.FieldByName('isbn').AsVariant := NULL; das hier:
ABSQuery1.FieldByName('isbn').Clear ;
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#10

Re: Doppelte Datensätze verhindern

  Alt 9. Feb 2005, 10:22
Hi!

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


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:24 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