HSQLDB Automatisch nächste freie Nummer ausgeben

MichaProgs

Aktives Mitglied
Guten Tag,

ich möchte für meine CRM-System die Kundennummern vorgeben. Dazu soll aus der HSQLDB die nächste freie Nummer ausgegeben werden. Die Kundentabelle ist wie folgt angelegt:

Kundennummer
Name
etc.

Was bisher zustande kam:
Wenn Kundennummern von 1-10 in der Tabelle vorhanden sind, wird 11 ausgegeben - richtig.
Wenn Kundennummer von 1-5 und 7-10 in der Tabelle vorhanden sind, wird ebenfalls 11 ausgegeben - falsch.

Ich möchte, dass wirklich von 0 aufwärts gezählt wird und die nächste freie Nummer ausgegeben wird. Gibt es die Möglichkeit?!

Und da wir gerade beim Thema sind: wenn die Kundennummer von Hand verändert wird und dadurch gleich ist wie eine bereits in der Datenbank vorhandene Kundennummer, möchte ich eine Fehlermeldung ausgeben. Wie kann ich am einfachsten die Exception abfangen und als Errormessage ausgeben?

Ich bedanke mich schonmal für eure Hilfe.

Gruß
TB94
 

Joose

Top Contributor
ich möchte für meine CRM-System die Kundennummern vorgeben. Dazu soll aus der HSQLDB die nächste freie Nummer ausgegeben werden. Die Kundentabelle ist wie folgt angelegt:
......

Ich möchte, dass wirklich von 0 aufwärts gezählt wird und die nächste freie Nummer ausgegeben wird. Gibt es die Möglichkeit?!

Ja das sollte mit Hilfe von StoredProcedures möglich sein :)
Beispiel: HSQLDB and Stored procedures - Stack Overflow

Und da wir gerade beim Thema sind: wenn die Kundennummer von Hand verändert wird und dadurch gleich ist wie eine bereits in der Datenbank vorhandene Kundennummer, möchte ich eine Fehlermeldung ausgeben. Wie kann ich am einfachsten die Exception abfangen und als Errormessage ausgeben?

Ich finde es einen Designfehler wenn ich eine Kundennummer händisch anpassen kann auch sehe ich keinen Grund warum man das machen sollte.
Diese sollte eindeutig sein und 1x beim Anlegen der Stammdaten vergeben werden.
 
Zuletzt bearbeitet:

MichaProgs

Aktives Mitglied
Ja das sollte mit Hilfe von StoredProcedures möglich sein :)
Beispiel: HSQLDB and Stored procedures - Stack Overflow

Hi Joose,

danke für deine schnelle Antwort. Mit Stored Procedures hast du mich schonmal ein gutes Stück voran gebracht. Werde es gleich ausprobieren!

Ich finde es einen Designfehler wenn ich eine Kundennummer händisch anpassen kann auch sehe ich keinen Grund warum man das machen sollte.
Diese sollte eindeutig sein und 1x beim Anlegen der Stammdaten vergeben werden.

Ok, nehmen wir ein anderes Beispiel. Eine Artikelnummer soll sich in einem bestimmen Bereich aufhalten. Hauptartikel zwischen 1000-1500, Zusatzprodukte 1501-2000 etc. Hier sollte man den Spielraum lassen, um die Nummern selbstständig zu vergeben. Wenn nun versehentlich eine bereits verwendete Artikelnummer verwendet wird, soll die Exception als Errormessage ausgegeben werden.

Vielen Dank schonmal für deine Hilfe!

Gruß
TB94
 

Joose

Top Contributor
Ok, nehmen wir ein anderes Beispiel. Eine Artikelnummer soll sich in einem bestimmen Bereich aufhalten. Hauptartikel zwischen 1000-1500, Zusatzprodukte 1501-2000 etc. Hier sollte man den Spielraum lassen, um die Nummern selbstständig zu vergeben. Wenn nun versehentlich eine bereits verwendete Artikelnummer verwendet wird, soll die Exception als Errormessage ausgegeben werden.

Hier würde ich ähnliche wie bei der Kundennummer arbeiten: mit einer StoredProcedure kontrollieren ob diese Artikelnummer schon verwendet wird.
 

MichaProgs

Aktives Mitglied
Hier würde ich ähnliche wie bei der Kundennummer arbeiten: mit einer StoredProcedure kontrollieren ob diese Artikelnummer schon verwendet wird.

Das mit den StoredProcedures geht mir noch nicht richtig in den Kopf. Zumindest habe ich noch keinen Ansatz wie ich das in meinem Fall anwenden soll. Für die freie Nummer müsste ich praktisch sagen, er soll von 0 anfangen zu zählen und sobald eine Lücke entsteht den entsprechenden Wert zurückgeben.

In einer Testrun-Datei von HSQLDB habe ich folgendes gefunden:

Java:
-- simple WHILE
CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA
  BEGIN ATOMIC
  DECLARE counter INT;
  DECLARE temp INT;
  SET counter = val;
  SET temp = 0;
  WHILE counter < 10 DO
     SET temp = temp + counter;
     SET counter = counter + 1;
  END WHILE;
  SET retval = temp;
  END
call procedure_test(0, test_retval)
/*r45*/CALL test_retval;
call procedure_test(5, test_retval)
/*r35*/CALL test_retval;
call procedure_test(10, test_retval)
/*r0*/CALL test_retval;
call procedure_test(100, test_retval)
/*r0*/CALL test_retval;
DROP PROCEDURE procedure_test;

Wie kann ich nun einbauen, dass er die fehlende ID zurückliefert?

Kann ich im Fall der bereits belegten Artikelnummer nicht auch einfach die Exception abfangen und darauf eine Fehlermeldung ausgeben? Wäre das nicht einfacher?

Java:
java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: unique constraint or index violation; SYS_PK_10108 table: ARTICLE

Danke für deine Hilfe!

Gruß
TB94

EDIT: Habe das mit der belegten Artikel nun wie folgt gelöst:

Java:
}catch(SQLIntegrityConstraintViolationException e){
			new ErrorDialog("Ungültige Eingabe", "Die Artikelnummer ist bereits vergeben", "Bitte wählen Sie eine neue Artikelnummer");
}

Finde es so ehrlich gesagt einfacher, als eine ganze StoredProcedure dafür zu schreiben.
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben