![]() |
Abfrage von doppelten Datensatzfeldern
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. :freak: |
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!
|
Doppelte Eingabe abfragen!
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 |
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 |
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. |
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.
SQL-Code:
Gruß, Tom
Select Max(KD_NR)+1 from Customers
|
Stack overflow
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? :bounce2: |
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 |
Hallo DBman,
wenn du mal zufällig in mein Posting oben schauen solltest :mrgreen: 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 ... :mrgreen: |
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 :freak: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 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