Funktionswert als Default möglich?

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Comenius
Beiträge: 5
Registriert: Sa, 16.05.2009 13:48

Funktionswert als Default möglich?

Beitrag von Comenius »

Hallo Forum,

bin noch neu in Base und auch in SQL und habe prompt eine Frage :wink:

Ich habe den SQL-Befehl gefunden, das aktuelle Datum als Default-Wert in ein Timestamp-Feld zu setzen; laut SQL-Handbuch ist das wohl auch die einzige Möglichkeit, eine Nicht-Konstante als Default-Wert zu definieren. Ich möchte nun gern Folgendes bewerkstelligen: Base soll im Eingabeformular beim Anlegen eines neuen Datensatzes das Maximum aus dem Feld "Nummer" auslesen, dieses um 1 erhöhen und die neue Zahl als Defaultwert in das Feld "Nummer" eintragen (eine Art Auto-Increment, ich weiß - ich möchte aber nicht "Autowert" auf "Ja" setzen, denn Base nummeriert brav weiter, auch wenn Datensätze gelöscht werden).

Ist sowas möglich? Wenn ja, wäre ich für eine möglichst detaillierte Anweisung dankbar!

Schöne Grüße an alle
Jürgen

*edit*
Hm, da gäbe es noch ein ähnlich gelagertes Problem. Das Formular ist zur Eingabe der Bestellpositionen einer Bestellung gedacht; mit der Tabelle "Bestellpositionen" ist die Tabelle "Preise" verknüpft (über die Artikelnummer). Da Preise immer Verhandlungssache sind, gibt es unter "Bestellpositionen" nicht nur Felder für Anzahl und Artikelnummer, sondern auch für den tatsächlichen Preis. Base soll nun nach Eingabe der Artikelnummer (Formular für Tabelle "Bestellpositionen") den zugehörigen Preis (verknüpft in der Tabelle "Preise") als Defaultwert in das Feld "Bestellpositionen.Preis" eintragen. Auch das ist ja keine Konstante ... :(
*/edit*
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Funktionswert als Default möglich?

Beitrag von eBayer »

Hallo Jürgen,
was erreichst Du damit? Wenn Du Datensätze löscht, die sich mitten in der Tabelle befinden, bekommst Du doch auch Lücken in der Nummerierung. Falls Du es unbedingt trotzdem tun willst, bleibt Dir nur die Lösung über ein Makro.
Das könnte man natürlich recht simpel auf Formularebene mit last() lösen, aber wenn Dein Formular die Veränderung der Sortierung erlaubt, findest Du mit last() natürlich nicht den letzten (nicht die zuletzt vergebene Nummer). Also mußt Du dir eine SQL-Lösung einfallen lassen, die sich den höchsten vergebenen (aktiven) Wert aus der Datenbank sucht, um 1 erhöht und Dir das Ergebnis zur weiteren Verarbeitung zur Verfügung stellt. Die Funktion "MAX" wäre wohl im SQL-Statement dafür gut geeignet. Es könnte z.B. ein Makro sein, welches mit dem Ereignis "Vor der Datensatzaktion" verbunden wird und schnell noch das von Dir gewünschte Feld bei der Gelegenheit füllt.
Du wirst aber gut beraten sein, wenn Du trotzdem zusätzlich einen Primarykey mit Autoinkrement verwendest, weil Du dann zuverlässig eine Sortierung hast, die der physischen Entstehung der Daten entspricht. Abhängig von der Anzahl der Datensätze kann das natürlich im Laufe der Zeit immer länger dauern.
Ich hoffe, Dir damit zumindest einen Denkanstoß geliefert zu haben.
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Comenius
Beiträge: 5
Registriert: Sa, 16.05.2009 13:48

Re: Funktionswert als Default möglich?

Beitrag von Comenius »

Hallo eBayer,

danke für die schnelle Antwort! Hintergrund meiner Anfrage ist der: Ich habe neben der Kundendatei (Kundennummer als Primärschlüssel) auch noch eine Tabelle "Bestellungen" (dort ist die Bestellnummer der Primärschlüssel; der Datensatz enthält auch Kundenummer und Bestelldatum) und eine weitere Tabelle "Bestellpositionen". Die Beziehungen sind wohl klar (Kundennummer aus Tabelle "Kundendatei" ist 1:n-bezogen auf Kundennummer in Tabelle "Bestellungen"; Bestellnummer in Tabelle "Bestellungen" ist 1:n-bezogen auf Bestellnummer in Tabelle "Bestellpositionen").

Die Crux ist die: Wenn ich in Base bei der Tabelle "Bestellungen" den Primärschlüssel "Bestellnummer" auf "Auto-Inkrement" setze, dann ist das programmiertechnisch-logisch zwar gut, aber wenn ich bei der Dateneingabe im Formularfeld auf "neuen Datensatz" klicke, diesen aber leer lasse, dann zählt Base bereits diesen Versuch als neue Bestellnummer. In die Tabelle wird zwar nix reingeschrieben, aber bei der nächsten Bestellaufnahme ist der Primärschlüssel bereits eins zu hoch. Anders ausgedrückt: Durch die automatische Schlüsselvergabe werden einige Nummern gar nicht mit Datensätzen beschrieben, sondern übergangen, nämlich dann, wenn in der Formular-Eingabe auf "Neuer Datensatz" geklickt, dieser aber leer gelasen wird. Das möchte ich verhindern, indem nicht automatisch hochgezählt wird, sondern per Makro oder SQL-Befehl (MAX auslesen und von Hand um 1 erhöhen als neuer default-Wert). Dass ich später einmal - sollte ich Datensätze in der Bestellungen-Tabelle von Hand löschen - Lücken erzeuge, ist schon klar. Aber zumindest wurde bei der Eingabe mal jede Bestellnummer "zu recht" vergeben.

So, und nun? Mir fällt spontan was ein: Ein Befehlsknopf "neue Bestellnummer", der mit einem Makro gefüttert wird: Lese Max-Wert aus Spalte "Bestellnummer" in Tabelle "Bestellungen" aus, erhöhe um 1 und schreibe in Formularfeld "Bestellnummer". Dafür reicht aber mein Starbasic nicht aus ...

Mein zweites Problem ließe sich ebenso lösen: Sobald ein Wert in das Feld "Artikelnummer" eingegeben wurde, soll Base in der Tabelle "Produktpalette" nach dem passenden Datensatz mit dieser Artikelnummer suchen und den zugehörigen Wert "Preis" in das Formularfeld "Preis" eintragen.

Kennt sich vielleicht einer im Forum so gut mit der Makroprogrammierung aus? Das wäre wirklich klasse!

Viele Grüße
Jürgen
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Funktionswert als Default möglich?

Beitrag von eBayer »

Hallo Jürgen,
ich denke in den sauren Apfel wirst Du wohl beißen müssen..... ( Stück für Stück Makros üben - und wie man sie einsetzt)
Bei der von Dir beschriebenen Anforderung wirst Du noch wiederholt auf die Notwendigkeit der Makroprogrammierung stoßen.
Da hilft es Dir nicht viel weiter, wenn ich Dir eine Lösung für das beschriebene Problem liefere. Du mußt Dich da schon selber durchbeißen..... wenn Du allerdings Fragen zu einem konkreten Lösungsgedanken hast, wird Dir sicher jeder hier gerne Tipps geben und notfalls auch ein codiertes Beispiel.
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Comenius
Beiträge: 5
Registriert: Sa, 16.05.2009 13:48

Re: Funktionswert als Default möglich?

Beitrag von Comenius »

Hallo eBayer,

meine Zähne sind noch in Ordnung 8) Will sagen: Ich beiße mich gerne durch.

Ich hatte übrigens konkrete Lösungsgedanken aufgeschrieben, daher verstehe ich deinen Einwand nicht so ganz. Für 'ne Umsetzung in Code wäre ich dankbar. Ich bin erst seit gestern auf Anordnung vom Chef zu Datenbanken gekommen (wie die Jungfrau zum Kind gewissermaßen), meine Vorfahrungen in IT beschränken sich auf CMS (Typo3, Drupal), Netzwerk und das Übliche (Pascal, Basic, ...). Wer da Hilfe braucht, bitte sehr :)

Ala: Kann mir bitte jemand einen Surftipp geben, wo die Makrosprache von OOo möglichst von der Pike auf erklärt wird, am besten auch mit Code-Beispielen versehen? Im Wiki ist das nicht so dolle ... Dann kann ich anfangen zu beißen und bin nicht auf fremde Hilfe angewiesen.

Danke vorab für eure Rückmeldungen!

Viele Grüße
Jürgen
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Funktionswert als Default möglich?

Beitrag von eBayer »

Hallo Jürgen,
ich wollte damit zum Ausdruck bringen, daß es Dir nicht viel hilft, wenn man Dir dieses eine Problem löst und Du dann über ein Dutzend andere stolperst. Ok, ich schau mal, daß ich Dir ein abstraktes Makro zur Ermittlung der nächsten Nummer erstelle - nur, um meinen guten Willen zu zeigen. :) Dauert aber 1-2 Tage.
Was Deine Frage zu Makros generell angeht, so habe ich auch erst vor ein paar Monaten damit begonnen und mich überwiegend im Internet "schlau" gemacht..... bin sicher noch als Anfänger anzusehen. Aber ich gebe Dir mal ein paar Adressen, wo Du Dich gut einlesen kannst und wo Du Verweise auf andere Quellen findest.
http://www.pitonyak.org/oo.php ( gut, teilweise in deutsch, von simpel bis komplex)
http://www.dannenhoefer.de/faqstarbasic/ (komplett deutsch mit vielen Beispielen und Verweisen)
http://www.wienandt.de/seiten/openoffice.htm (komplett deutsch mit vielen Beispielen und Verweisen)

So, nun versuche mal, den Anfang des Knäuels zu finden..... danach geht's meistens etwas leichter.
Viel Erfolg und besten Gruß
eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Comenius
Beiträge: 5
Registriert: Sa, 16.05.2009 13:48

Re: Funktionswert als Default möglich?

Beitrag von Comenius »

Hallo eBayer,

du hast ja recht :D Es ist mir bewusst, dass da noch einiges auf mich zukommt und ich noch 'ne Menge zu lernen hab ... Naja, bei Ubuntu und Drupal und Apache und Typo3 und BSCW hat's geklappt, da wird's bei OpenBasic und SQL wohl auch funktionieren.

Danke jedenfalls für die Infos - morgen ist ja Sonntag, die beste Zeit also, um sich mit sowas zu beschäftigen *hmpf*
Viele Grüße
Jürgen
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Funktionswert als Default möglich?

Beitrag von eBayer »

Ich habe Dir mal ein kleines Testprogrämmelchen gebastelt.
Ich denke, daß ich darin das verpackt habe, was Du zum Start brauchst.
1. Kopiere die Datei Test2.odb in ein für Makros freigegebenes Verzeichnis (Dein oo-Testverzeichnis)
2. Starte die Datenbank (hört sich doll an) per Doppelklick.
3. Registriere die Anwendung unter Extras - Optionen - OpenOffice.org Base - Datenbanken
4. Doppelklick auf Formulare - TestFormular
5. PushButton anklicken und schaun was sich tut
6. Formular wieder schließen
7. Click mit rechter Maustaste auf TestFormular (dann bearbeiten auswählen)
8. im Formular auswählen:
Extras - Makros - Makros verwalten - OpenOffice.org Basic - Test2.odb - Standard - Module1 - bearbeiten

Jetzt siehst Du die Makros und ein bisschen SQL.
Viel Spaß ..... ab jetzt solltest Du versuchen vorerst allein klarzukommen.
Gruß eBayer
Dateianhänge
Test2.odb
(14.67 KiB) 96-mal heruntergeladen
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Comenius
Beiträge: 5
Registriert: Sa, 16.05.2009 13:48

Re: Funktionswert als Default möglich?

Beitrag von Comenius »

Hallo eBayer,

komme jetzt erst dazu, dein Programm zu testen; kurzum: Es funktioniert bestens! Danke für die viele Mühe und die Hilfe. Habe mir inzwischen ein Buch gekauft und werde nun mein Wissen über Makros und Datenbanken in ooo vergrößern (hoffentlich).

Wie gesagt: Merci vielmals
und schöne Grüße
Jürgen
Antworten