Hilfe bei DB und Abfragen ob Nummer schon da
-
Hallo,
ich hab folgendes Problem: In einer DB-Tabelle stehen alle Auftrage(offene und fertige) drin. Über zwei Filter lass ich mir in zwei verschiedenen DB-Grids einmal die fertigen und einmal die offenen anzeigen. Die offenen kann ich bearbeiten und auch neue hinzufügen. Jetzt ist es aber so, dass es keine doppelten Auftragsnummern geben darf, d.h. wenn der Nutzer eine Nummer einträgt muss ich nachsehen ob es die schon gibt und wenn ja ne Meldung ausgeben und den Datensatz nicht in die DB schreiben. Könnt Ihr mir bitte sagen, wie ich das am besten realisiere. Ich hab da noch nicht so viel Erfahrung mit.
Danke
-
Hallo,
du fragst einfach per Sql-Statement ab, ob es schon einen Datensatz mit dieser Auftragsnummer gibt (SELECT Auftragsnummer FROM Tabelle WHERE Auftragsnummer = "+neuAuftragsnummer).
Wenn dann RecordCount von deiner Tabelle nicht Null ist, weisst du das es den Datensatz schon gibt.
-
Hallo,
dank für die Antwort. Ich hab mittlerweile auch die Funktion gefunden in der ich das von Dir beschrieben machen müßte. Das ist doch BeforePost() oder?
Die Abfage ist verständlich, wie ermittle ich aber in der Funktion die neue Auftragsnummer um dann meine Datensätze damit vergleiche zu können und wenn nötig über Abort() das speichern abzubrechen? Der Benutzer schreibt die ja in das DB-Grid in der Spalte rein. Wie komm ich da ran bevor es in der DB steht?
Steht das eventuell in DataSet drin?
-
Wie greifst du auf die Datenbank zu ?
Über ADO ? dann gibt es da eine Komponente TADOQuery die du mit deiner DB verbinden musst und der du dann überADOQuery1->SQL->Add("SELECT...")
dein SQL-Statement gibst und mit
ADOQuery1->ExecSQL()
abschickst.
Dann mit RecordCount die Abfrage ob Datensatz gefunden.
Wenn ja dann nächster SELECT (SELECT MAX(Auftragsnummer) AS groesste FROM Auftraege")
Mitint neunr=ADOQuery1->FieldByName("groesste")->AsInteger;
Das liefert dir die größte Auftragsnummer(voraussetzung Auftragsnummer ist nur Zahl).
Den Wert inkrementieren und als neue Auftragsnummer nehmen;
-
Wenn du es so haben willst, das der Benutzer im Grid selbst die Auftragsnummer eingeben kann, hast du das Problem, das die möglicherweise vergebene Auftragsnummer in die DB geschrieben wird(was beim Primary Key natürlich knallt.
Würde sowas über ein normales StringGrid lösen, wo du sowas vorm reinschreiben noch abfangen kannst.
-
Also die Auftragsnummern sind nicht nur Nummern und können auch so:
"2345/89","2345/78" aussehen.Und ich will genau das machen was du als letztes geschrieben hast.
Meine Funktion sieht im Moment so aus:void __fastcall TForm1::Table_offenBeforePost(TDataSet *DataSet) { QueryAuftragvorhanden->SQL->Add("Select Auftragsnummer from Auftragsdaten where Auftragsnummer = XXXXX"); QueryAuftragvorhanden->Open(); if(QueryAuftragvorhanden->RecordCount() >0) { ShowMessage("Die Auftragsnummer ist bereits vorhanden !"); // Abbrechen des Speicherns Abort(); } // sonst ganz normal weiter } QueryAuftragvorhanden->Close();
und ich weiß nun nur nicht wie das XXXXX ermittle was ja noch nicht in der Tabelle steht aber eventuell eingetragen werden soll, wenn es noch nicht vorhanden ist.
PS: TQuery *QueryAuftragvorhanden ist so dekalariert und als DataSource hab ich meine DB über BDE
-
Das Problem hast du jetzt ja schon erkannt.
Da man TDBGrid ja nur als eine "sichtbar gemachte Tabelle deiner Datenbank" behandeln kann, wird das so wohl nicht funktionieren.
Könnte mir höchstens vorstellen über das OnKeyPress Ereigniss von TDBGrid die Eingabe abzufangen bzw auf die Exception (ausgelöst durch den doppelten Primärschlüssel) zu reagieren.
Wesentlich eleganter kannst du wie schon erwähnt über TStringGrid lösen.Musst da natürlich alle Daten von Hand importieren.
Sonnst wüsste ich keine andere Möglichkeit.
-
Wie ist die Auftragsnummer aufgebaut ?
Müsstest die Auftragsnummer dann als String (AsString) einlesen und dann mit der Substring Methode zerlegen.Den Teil der Auftragsnummer der nur nummerisch ist und inkrementiert werden soll nimmst du dann. Zum Schluss String wieder zusammensetzen.