AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Abfrage von doppelten Datensatzfeldern
Thema durchsuchen
Ansicht
Themen-Optionen

Abfrage von doppelten Datensatzfeldern

Ein Thema von DBman · begonnen am 9. Jun 2003 · letzter Beitrag vom 11. Jun 2003
Antwort Antwort
Seite 1 von 2  1 2      
DBman

Registriert seit: 31. Mai 2003
Ort: nähe hannover
77 Beiträge
 
#1

Abfrage von doppelten Datensatzfeldern

  Alt 9. Jun 2003, 14:28
Und zwar habe ich eine Paradox7 Datenbank.
Nun sind in dieser DB Namen mit entsprechenden Kundennummern.
Jede KuNr darf nur einmal vorkommen.

Frage: Wie kann ich eine Abfrage erstellen , ob die z.b. bei der Methode Insert neu eingegebene (oder durch TTable.Edit veränderte)
KuNr SCHON NOCHEINMAL EXISTIERT?

Mit der Funktion Findnearest kann man ja nach der KuNr suchen , aber dann wird die ja einmal gefunden , nämlich die die ich gerade eingegeben habe. (Äh hab ich das jetzt etwas kompliziert formuliert?)

Egal, Beispiel:

KuNr Name

003 Peter
004 Emil
015 Heinz
206 Jürgen
027 Ramona
820 Heino
324 Stefanie

NACH dem Einfügen einer neuen KuNr oder NACH dem Ändern einer neuen KuNr soll nun abgefragt werden , ob die KuNr bereits existiert....
Hm.. Also Findkey bringt mich da ja wie schon gesagt nich viel weiter.
Denn die Dinge , die wir erst lernen müssen , bevor wir sie tun , lernen wir beim Tun. - Aristoteles
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#2
  Alt 9. Jun 2003, 14:59
Ich würde die Kundennummer als eindeutigen Primärindex vereinbaren. Dann sorgt schon die Datenbank selbst dafür, dass es keine doppelten Nummern gibt. Anderfalls erhältst Du eine Fehlermeldung, die Du mit try ... except abfangen kannst!
  Mit Zitat antworten Zitat
Stargate3

Registriert seit: 11. Mai 2003
Ort: Greven
31 Beiträge
 
#3

Doppelte Eingabe abfragen!

  Alt 9. Jun 2003, 15:00
Hallo DB,
ich löse soetwas indem ich nach einer Neueingabe (Edit Feld) die Eingabe nutze um dann mit Locate nach einem gleichen Vorkommen in der DBank zu suchen. Ist gleicher Eintrag schon vorhanden wird das EDIT Feld selektiért zur Neueingabe.
Danach kann ich erst eine Save Taste drücken.
Hoffe das hilft dir etwas. Genau Befehle wenn es daran liegt kann ich dir mailen bei Bedarf.
Natürlich könntest du auch mit der Ereignisabfrage des EDIT Feldes OnChange bei jeder neuen Tasteneingabe nach dem <Namen> suchen.

Gruß Stargate3
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#4
  Alt 9. Jun 2003, 17:28
Hallo DBman,

als Primärindex verwende ich stets das Feld ID (= Identifikation) vom Typ AutoInc. Damit brauch man sich nicht mehr selber um die Eineindeutigkeit des Primärindex kümmern.

Ein zweites Feld DBID vom Typ Integer dient mir als Kopplung zu untergeordeneten Datenbanken.Für gewöhnlich ist dieses identisch mit ID. Manche Fehler in Paradox-DB lassen sich nur durch satzweises Kopieren der beschädigten Datenbank beheben. Danach stimmt aber die ID in der Kopie nicht unbedingt mit der ID aus der Ursprungsdatenbank überein, die DBID bleibt aber erhalten.

mfg
eddy
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#5
  Alt 9. Jun 2003, 18:30
Hallo DBman,

das mit dem Schlüssel und dem try ... except Block ist wohl der übliche Weg. Wenn du aber vorher bereits abfregen willst, musst du eine zweite TTable Komponente einfügen und die z.B. SuchTable nennen. Diese ist mit derselben Tabelle verbunden, in die du einen neuen Datensatz eintragen willst. Mit Findkey oder Locate suchst du nun in der Suchtabelle. Der Datensatz, den du gerade im Insert oder Append versuchst einzufügen wird dabei noch nicht gefunden! Dieser existiert erst nach einem "Post" Aufruf.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Specialwork
Specialwork

Registriert seit: 10. Jan 2003
Ort: Schwall
71 Beiträge
 
Delphi 8 Professional
 
#6
  Alt 10. Jun 2003, 00:04
Hallo DBMan,

Wenn Du Deine Tabellen, die sich bereits angesammelt haben nocheinmal verändern kannst, dann Tu dies. In diesem fall solltest Du unbedingt einen Primaerschlüssel mit Autoinc Funktion verwenden. Dies verhindert ausserdem, dass eine bereits vergebene ID noch einmal vergeben wird.

Kannst Du die Daten jedoch nicht mehr ohne weiteres verändern, dann solltest Du Die nächste freie Kundennummer mit einem Select Statement ermitteln.

Select Max(KD_NR)+1 from Customers Gruß, Tom
Thomas van Veen
Es gibt keine Probleme, nur Lösungen, auf die man nicht gleich kommt !
  Mit Zitat antworten Zitat
DBman

Registriert seit: 31. Mai 2003
Ort: nähe hannover
77 Beiträge
 
#7

Stack overflow

  Alt 10. Jun 2003, 14:44
Hm also ich wollte das jetzt eigentlich so wie Stargate3 lösen mit dem Edit-Feld , ist für mein Problem eigentlich das günstigste...
Ich dachte mir ich packe das in den Code an die Stelle , kurz vor dem Übernehmen der Daten... also in das BeforePost-Ereignis , richtig? Wenn nein , korrigiert mich.

In meinem Programm gibt es also die hier relevanten Komponenten :
TDBEdit , TTable , (Speicherbutton)
Naja das sieht dann bei mir so aus :
Code:
procedure Tfm_Main.tblKuDaBeforePost(DataSet: TDataSet);
var AlterIndex:String;
begin
   AlterIndex:=tblKuDa.IndexName;
   tblKuDa.IndexName:='KUNKZ';   //Kundenkürzel

{ if tblKuDa.Locate('KUNKZ', VarArrayOf([DBEd_KunKz.EditText]),  [loCaseInSensitive])= true } //ich machs besser mit Findkey..

 if tblKuDa.FindKey([DBEd_KunKz.EditText] )=true then
      begin ShowMessage(DBED_KunKz.EditText + 'GIBTS SCHON!!');
            DBEd_KunKz.SetFocus;
      end;
    tblKuDa.IndexName:=AlterIndex;
end;

... Aber ich kriege da immer die Meldung Exception : Stack Overflow.. hm
kann mir da nochmal nen Tipp geben woran es liegen könnte?
Denn die Dinge , die wir erst lernen müssen , bevor wir sie tun , lernen wir beim Tun. - Aristoteles
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#8
  Alt 10. Jun 2003, 16:28
Hallo DBman,

vermutlich landest Du in einer Unendlichschleife. Müßte sich über das setzen eines Haltepunktes und Einzelausführung der Anweisungen mit F7 finden lassen.

mfg
eddy
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#9
  Alt 10. Jun 2003, 17:29
Hallo DBman,

wenn du mal zufällig in mein Posting oben schauen solltest wirst du feststellen, dass ich empfohlen habe eine zweite Instanz (Suchtabelle) auf dieselbe Tabelle zu erstellen. Denn wenn du nicht im browse-Mode bist, kannst du nicht mit Locate oder so den Datensatzzeiger bewegen. Deshalb versucht dein Programm, bevor es "Post" ausführt ein Locate, dazu muss es aber "Post" ausführen, um in den browse-Mode zu kommen, dazu muss es aber Locate ausführen, davor aber Post und davor locate und davor ...
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
DBman

Registriert seit: 31. Mai 2003
Ort: nähe hannover
77 Beiträge
 
#10
  Alt 10. Jun 2003, 19:54
Hallo Mr.Spock.
Das klingt am Ende ja alles recht plausibel , was sie mir da sagen:
Also ich habe jetzt eine zweite (bzw. 3.) TTable und Dataset Komponente in mein Programm gesetzt.
Die TTable Suchtabelle habe ich über eine Master-Detail-Beziehung mit der ürsprünglichen Kundentabelle verbunden...

Aber jetzt is mir wirklich immer noch nicht klar was ich davon jetzt habe?
Soll ich jetzt die ganzen Datensätze etwa in die Suchtabelle.db kopieren??
Und wieso habe ich damit dann das Problem gelöst dass ich bereits vor Table1.Post überprüfen kann ?

Ich verstehe leider nicht so ganz.
Bitte freundlichst um Hilfe
Denn die Dinge , die wir erst lernen müssen , bevor wir sie tun , lernen wir beim Tun. - Aristoteles
  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 15:06 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