Problem mit Java + SQL

The_Answer1985

Erfahrenes Mitglied
Hallo alle miteinander,

ich habe folgendes Problem:
in meiner GUI werden Daten aus einer Datenbank manipuliert. Ein Teil der Daten ist eine Kundennummer, die eigentlich automatisch vergeben werden soll.
Die Datenbank, die in mein Programm eingebunden wird hat bereits einen Datenbestand, die mit Access verwaltet wurde und somit neue Kunden hinzugefügt und mal wieder gelöscht wurden...
somit ist die Kundennummer keine durchlaufende Nummer (1-2-3-4-5-...) sondern eher folgendermaßen: 1-3-4-5-9-11-usw.

Mein Problem ist jetzt:
Wenn in der GUI ein neuer Kunde angelegt werden soll, soll die KdNr automatisch vergeben werden und in ein Textfeld (nicht editierbar) geschrieben werden!

Aber wie bekomme ich die höchste Kundennummer aus der Datenbank?

Die Daten, die ich via SQL aus der DB erhalte sind zwar geordnet, aber nicht so, dass die höchste Kundennummer am Ende steht, sondern folgendermaßen:

11, 112, 12, 120, 13, 131, 135, 14, ...

also sind die Nummern zwar geordnet, aber doch nicht so, dass ich quasi den letzten Datensatz selektiere und gleichzeitig die höchste KdNr erhalte.

Gibt es eine Möglichkeit das zu umgehen?

Danke für eure Hilfe!

Liebe Grüße!
 
Die KDNR ist offensichtlich ein String. Ich würde Sie entweder im SQL-Statement in eine Zahl casten, oder mit einem concat führende Nullen anhängen und dann mit einem Befehl wie Right oder substring die Länge normieren. Danach kannst Du sortieren, oder mit einem Aggregat wie MAX die Zahl auslesen.


EDIT:

btw. ACCESS kennt doch Autoinkrementfelder, warum benutzt Du nicht diese Funktion?
 
...oder mit einem Aggregat wie MAX die Zahl auslesen.

EDIT:
btw. ACCESS kennt doch Autoinkrementfelder, warum benutzt Du nicht diese Funktion?

die MAX-Funktion hört sich gut (unkompliziert :) ) an, hast mir vllt ein Bsp oder nen Link dazu?

zu Letzterem, ich kenne Autoincrement zwar, aber weiss nicht wie ich das mit Java vereinbaren soll...
vllt kennst du/ihr da nen Weg?

Danke für deine Hilfe

Liebe Grüße
 
Normalerweise ist die Kundennummer der Primärschlüssel und eine Zahl, welcher automatisch nach Erstellen des Kundens, von der Datenbank erstellt wird.

Natürlich kannst du es wie bereits erwähnt selbst definieren, aber das birgt natürlich die Gefahr, wenn eine Nummer vergeben war...gelöscht wird und kurz danach wieder jemand anderem zugeordnet wird. Dadurch kann es zu Verwechslungen kommen. Darum werden bei autoinkrement Feldern immer hochgezählt...egal ob gelöscht worden ist oder nicht.
 
select MAX(kdnr) as MaxKdnr from kunden;

Das geht aber nur, wenn Du KDNR in ein Zahl umwandelst. Sonst hast Du wieder das Problem, dass z.B. 2 größer ist als 100.

Dies habe ich mit der Lieferantentabelle in der Nordwind-Beispiel DB getestet:

SELECT Max(Right("00000" & [Lieferanten-Nr],5)) AS MaxNr
FROM Lieferanten;

Ich habe es aber nicht mit Java getestet.
 
Normalerweise ist die Kundennummer der Primärschlüssel und eine Zahl, welcher automatisch nach Erstellen des Kundens, von der Datenbank erstellt wird.

Natürlich kannst du es wie bereits erwähnt selbst definieren, aber das birgt natürlich die Gefahr, wenn eine Nummer vergeben war...gelöscht wird und kurz danach wieder jemand anderem zugeordnet wird. Dadurch kann es zu Verwechslungen kommen. Darum werden bei autoinkrement Feldern immer hochgezählt...egal ob gelöscht worden ist oder nicht.


Das wusste ich schon, danke, nur mein Problem wäre dann folgendes:

Access vergibt die KdNr nur automatisch wenn ein neuer Datensatz erstellt wird. In meiner GUI ist das folgendermaßen. Klick auf Button leert alle Textfelder und soll in das Textfeld KdNr bereits automatisch (am besten die von Access erstellte KdNr) anzeigen.

Nur wie bekomm ich das hin?
Die einzige Möglichkeit, die mir gerade dazu einfällt, wäre:
Klick auf Button leert alle Textfelder, speichert den Inhalt dieser in der Datenbank, wodurch die KdNr vergeben wird. Diese Nummer hole ich im gleichen Vorgang mit SQL wieder aus der DB und lasse sie im Textfeld anzeigen.
Dann kann der User seine Eingaben machen, diese wiederrum werden in der DB gespeichert.

Aber geht das nicht anders, nicht ganz so umständlich? Im Prinzip will ich die Autoincrement Funktion schon nutzen, nur weiss ich nicht wie am effektivsten!

Hoffe ihr habt nen Vorschlag!

Liebe Grüße
 
Hallo,


Die einzige Möglichkeit, die mir gerade dazu einfällt, wäre:
Klick auf Button leert alle Textfelder, speichert den Inhalt dieser in der Datenbank, wodurch die KdNr vergeben wird. Diese Nummer hole ich im gleichen Vorgang mit SQL wieder aus der DB und lasse sie im Textfeld anzeigen.
Dann kann der User seine Eingaben machen, diese wiederrum werden in der DB gespeichert.

Aber geht das nicht anders, nicht ganz so umständlich? Im Prinzip will ich die Autoincrement Funktion schon nutzen, nur weiss ich nicht wie am effektivsten!
das machen Persistence-Frameworks nicht anders. Die werden in die Datenbank geschrieben und dann wird die ID(Primärschlüssel) in das Object geschrieben und zurück gegeben. Man bekommt es halt nur nicht mit.

Warum willst du denn die Kundennummer denn schon anzeigen bevor der Kunde überhaupt angelegt wurde. Du kannst den Kunden doch erst abspeichern und wenn er abgespeichert ist, kannst du die Kundennummer anzeigen.

MFG

zEriX
 
Warum willst du denn die Kundennummer denn schon anzeigen bevor der Kunde überhaupt angelegt wurde. Du kannst den Kunden doch erst abspeichern und wenn er abgespeichert ist, kannst du die Kundennummer anzeigen.

In den Txt-Feldern werden normalerweise die Daten der Datenbank angezeigt, wovon alle editierbar sind, bis auf die KdNr.
Diese soll automatisch vergeben werden. Willst du jetzt einen neuen Kunden anlegen, werden die Txt-Felder leer geräumt um die Eingaben zu machen. Damit das ganze gut aussieht, soll die KdNr bereits im Txt-Feld stehen.

Liebe Grüße
 
Warum machst Du es denn nicht mit meinem Vorschlag? Du bekommst immer die höchste Nummer. Falls mein Select in java nicht geht, mach dir einen Access-View (Abfrage).

Deine Lösung hat aber in einem Mehrplatzumfeld ein dickes Problem. Falls zwei Leute gleichzeitig einen neuen Kunden anlegen, bekommen sie die selbe Nummer, deswegen schlage ich eine Hilfstabelle (Sequenztabelle) vor, in der die letzte Nummer abgelegt wird. Eine simple Java-Methode kann die letzte Nummer auslesen und inkrementieren, dann die neue zurückschreiben.

So macht es z.B. auch Toplink oder andere Systeme...

Gruß
 
Warum machst Du es denn nicht mit meinem Vorschlag? Du bekommst immer die höchste Nummer. Falls mein Select in java nicht geht, mach dir einen Access-View (Abfrage).

Deine Lösung hat aber in einem Mehrplatzumfeld ein dickes Problem. Falls zwei Leute gleichzeitig einen neuen Kunden anlegen, bekommen sie die selbe Nummer, deswegen schlage ich eine Hilfstabelle (Sequenztabelle) vor, in der die letzte Nummer abgelegt wird. Eine simple Java-Methode kann die letzte Nummer auslesen und inkrementieren, dann die neue zurückschreiben.

So macht es z.B. auch Toplink oder andere Systeme...

Gruß

Das hört sich gut an, werde ich versuchen!
Aber noch eine Frage dazu: wenn ich immer die höchste Nummer aus der DB erhalte und die erhöhe, kann es doch zu Verwechslungen kommen:

Wird ein Kunde gelöscht, wird auch seine KdNr gelöscht. Leg ich einen neuen Kunden an, kann dieser ja die KdNr des gelöschten Kunden bekommen, das ist nicht so optimal.
Dazu müsste ich ja dann praktisch eine Hilfstabelle für gelöschte Kunden anlegen, deren Kundennummer ich dann mit der vergleiche, die neu angelegt werden muss.

Liebe Grüße
 
Zurück