rechnungsformular mit fortlaufender rechnungsnummer

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

cashew
Beiträge: 8
Registriert: Sa, 05.05.2007 10:03

rechnungsformular mit fortlaufender rechnungsnummer

Beitrag von cashew »

Hallo Leute,
glaubt mir, ich habe nun stundenlang gesucht / probiert / verworfen, habe viele sehr ähnliche,
aber keinen mir weiterhelfenden Foren-Beitrag gefunden.
Es geht um folgendes:
Ich möchte mit BASE eine Datenbank inkl. Eingabeformular für Rechnungsstellung erstellen.
Dazu bräuchte ich ein Tabellenfeld mit einer fortlaufenden Nummer für die Rechnungsnummer, welche
- mit führenden Nullen versehen sein sollte.
- automatisch in die entsprechende Datenbankspalte eingetragen wird beim Abspeichern des Datensatzes.

An sich - zumindest manuell und direkt im SQL-Kommando-Fenster - ist dies ja per SQL-Befehl möglich zB:

Code: Alles auswählen

INSERT INTO "rechnung" ("nummer") ( SELECT MAX ("id")+1 FROM "rechnung")
aber das ist wohl ein Holzweg, da man in Abfragen keine manipulativen Kommandos verpacken darf. (warum eigentlich?)

der andere Weg, die Primärschlüssel-Spalte zu "missbrauchen" ist auch nicht ideal, da durchs evtentuelle Löschen
eines Datensatzes ja Lücken in der Nummerierung entstehen würden.

Bekommt man dies ohne Makros irgendwie gebacken? Oder ist es wirklich so, dass solcherlei (in meinen Augen simple) Dinge
die Möglichkeiten von BASE übersteigen?
Sollte jemand im Netz was gefunden haben, was ich übersehen hab, dann sehts mir nach, ich hab echt lang gesucht.

großes danke und grüße,
cashew
Benutzeravatar
lorbass
********
Beiträge: 4116
Registriert: Mo, 01.05.2006 21:29
Wohnort: Bonn

Re: rechnungsformular mit fortlaufender rechnungsnummer

Beitrag von lorbass »

Ich habe zwar keine Erfahrung mit BASE, aber vielleicht hilft's ja doch: Zur Verwaltung eindeutiger Nummern verwenden RDBMS typischerweise SEQUENCE-Objekte, die bei jedem Abruf einen Zähler automatisch inkrementieren.

Gruß
lorbass
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: rechnungsformular mit fortlaufender rechnungsnummer

Beitrag von F3K Total »

Hi,
ohne Makro wird es mit der eingebetteten HSQL DB schwierig, aber die paar Zeilen?

Code: Alles auswählen

Sub S_insert_next_number(event)
    oForm = event.source.model.parent
    oForm.movetoinsertrow
    oconnection = oform.activeconnection
    SQLStatement = oconnection.createstatement
    ssql = "SELECT MAX (""ID"") FROM ""rechnung"""
    sqlResult = SQLStatement.executequery(ssql)
    if sqlResult.next then nID = sqlResult.getint(1) + 1
    oform.updateint(1,nID)
    oform.insertrow
End Sub
Die führenden Nullen kannst Du ohne Makro, per Abfrage generieren, siehe Beispiel.

Viel Erfolg, Gruß R
Dateianhänge
Fortlaufende_Rechnungsnummer.odb
(13.37 KiB) 364-mal heruntergeladen
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: rechnungsformular mit fortlaufender rechnungsnummer

Beitrag von juetho »

Für die nächste Rechnungsnummer nutze ich praktisch dasselbe Verfahren wie im Vorschlag von F3K.
cashew hat geschrieben:An sich - zumindest manuell und direkt im SQL-Kommando-Fenster - ist dies ja per SQL-Befehl möglich zB:

Code: Alles auswählen

INSERT INTO "rechnung" ("nummer") ( SELECT MAX ("id")+1 FROM "rechnung")
aber das ist wohl ein Holzweg, da man in Abfragen keine manipulativen Kommandos verpacken darf. (warum eigentlich?)
Eine Abfrage ist eine Abfrage, also ein Holen von Informationen aus der Datenbank heraus zur weiteren Verarbeitung oder Anzeige. Es sollte selbstverständlich sein, dass dabei nichts in der Datenbank geändert werden darf; welchen Zustand sollte die Datenbank denn sonst beim SELECT liefern - den vorherigen, den geänderten oder irgendeinen Zwischenwert? SQL verarbeitet immer Datenmengen; alles andere widerspricht dem Wesen eines RDBMS.
cashew hat geschrieben:der andere Weg, die Primärschlüssel-Spalte zu "missbrauchen" ist auch nicht ideal, da durchs evtentuelle Löschen
eines Datensatzes ja Lücken in der Nummerierung entstehen würden.
So ist es.
Bekommt man dies ohne Makros irgendwie gebacken? Oder ist es wirklich so, dass solcherlei (in meinen Augen simple) Dinge
die Möglichkeiten von BASE übersteigen?
Das sind für ein spezielles Anwendungsgebiet "simple" Dinge, die haben aber nichts mit den eigentlichen Aufgaben einer Datenbank zu tun. Bei jeder Datenbank (egal ob HSQL oder MySQL oder M$-SQL oder Oracle oder ...) muss so etwas der Nutzer selbst regeln. Das geht entweder über eine StoredProcedure oder über ein solch einfaches Makro. Übrigens ist SEQUENCE kein SQL-Standard, sondern wird nur von einigen DBMS angeboten.

Für die führenden Nullen sehe ich im Eingabeformular keinen Sinn (beim Drucken schon, aber das ist ein anderes Thema). Aber wenn du es unbedingt machen willst: Ersetze das numerische Feld durch ein formatiertes Feld und lege bei der Eigenschaft Formatierung die Anzahl der führenden Nullen fest. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: rechnungsformular mit fortlaufender rechnungsnummer

Beitrag von juetho »

Gast hat geschrieben:SQL scheint ja alles mitzubringen, was dafür benötigt wird, warum aber kann ich diesen Schritt nur über Umwege (BASIC) automatisiert geschehen lassen?
Wie ich schon sagte: SQL (und damit die/jede Datenbank) stellt die Voraussetzungen zur Verfügung, aber machen muss es der Anwender oder derjenige, der ein Anwendungsprogramm erstellt.

Ohne Basic geht es beispielsweise über eine StoredProcedure (SP), also eine Möglichkeit der Datenbank. Dabei stößt man freilich an die Grenzen von HSQL, das insofern nur eine einfache Basis-Datenbank zur Verfügung stellt. SPs sind wohl möglich, aber noch viel komplizierter zu bauen als das o.g. Makro. Du solltest auch bedenken, dass Base keine Datenbank ist, sondern "nur" eine Benutzeroberfläche zur einfachen Arbeit mit einer Datenbank. Diese "einfache Arbeit" hat eben auch ihre Grenzen: Nicht alles, was mit einer Programmiersprache (Delphi/Pascal, C/C++/C#, Visual Basic) möglich ist, kann in einer solchen Benutzeroberfläche bereitgestellt werden.

Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Antworten