Hallo Sandstrahl,
Du wirst schon mit den punktgetrennten Wortungetümen zurechtkommen müssen. Ohne die kommst Du nicht bis zu Deinem Formular durch. Auch wenn Du es mit dem Handbuch nicht verstanden hast kommt jetzt hier eine kurze Erklärung mit Hilfe des Handbuchs:
Code: Alles auswählen
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Anzeige")
Nachdem zu Beginn die Variablen erstellt wurden ("DIM oDoc AS OBJECT" usw.) wird hier schritt für Schritt auf das Formular zugegriffen. "thisComponent" ist ein feststehender Begriff für das Dokument, aus dem heraus das Makro aufgerufen wird. Willst Du also auf Dein aktuelles Formular zugreifen, so ist der Startpunkt bei "thisComponent". Auf ein anderes Formular zuzugreifen erfordert da noch mehr "punktgetrennte Wortungetümer". oDoc bedeutet jetzt Makrointern für die Routine "thisComponent" - dieses Programmteil.
In der nächsten Zeile wird das dann direkt weiter verwendet. Die neue Variable oDrawpage soll auf die Zeichenoberfläche zugreifen, in der das Formular abgelegt ist. Auch diese Oberfläche hat eine festgelegte Bezeichnung: "drawpage". Dabei ist es für Makros unerheblich, ob das Ganze klein oder groß oder auch gemischt geschrieben wird. Wenn also jetzt oDrawpage = oDoc.drawpage dort formuliert ist, so ist die Benennung der Variablen nur dem Zufall oder der Übersichtlichkeitsliebe der programmierenden Person überlassen. Das kann auch oOberflaeche = oDoc.drawpage heißen. Oder, wenn die erste Variable umgangen werden soll, kann oDoc ganz wegfallen und stattdessen oOberflaeche = thisComponent.drawpage dort stehen. Die Punkte trennen die einzelnen Bestandteile von der obersten Ebene an abwärts. Je näher Du der einzelnen Komponente kommst, desto weitere rechts in der Punkthierarchie steht es.
In der dritten Zeile wird auf die 2. Variable Bezug genommen:
oForm = oDrawpage.forms.getByName("Anzeige")
Es geht also weiter in der Hierachie abwärts bis zum Formular. Am Ziel ist dies immer noch nicht, weil Du meist den Bezug zu einer Formularfeld brauchst. Auch diese zeile bezieht sich wieder auf eine Variable, die direkt davor geklärt wird. Du könntest also komplett ohne die beiden vorhergehenden Variablen auch schreiben:
oForm = thisComponent.drawpage.forms.getByName("Anzeige")
So kommen also die Wortungetümer zustande, die ein Kennzeichen des Zugriffs auf die Systemkomponenten sind. Du kannst sie nicht umgehen, aber einfacher fassen. Das Formular, auf das mit den drei Zeilen zugegriffen wurde, hat (im Formularnavigator sichtbar) den Namen "Anzeige". Es kann also ohne weiteres mehrere Formulare nebeneinander auf der einen "drawpage" geben. Zwischen diesen Formularen kannst Du per Namen oder per Index (Nummerierung) auswählen. Sicherer und übersichtlicher für mich ist die Wahl des Namens.
Ob "oform = ThisComponent.drawpage.forms.MainForm", wie von R angeführt, auch so zum Ziel führt kann ich nicht sagen. Die ersten 3 Bestandteile sind identisch zu dem oberen Code (Groß- oder Kleinschreibung egal). "MainForm" ist eigentlich der Name, den der Assistent dem ersten Formular zuweist. Ich würde da also getByName("MainForm") stehen haben.
Jetzt wieder der Hinweis auf das Handbuch:
Code: Alles auswählen
oDatenquelle = ThisComponent.Parent.DataSource
oVerbindung = oDatenquelle.GetConnection("","")
oSQL_Anweisung = oVerbindung.createStatement()
Das ist der Code, mit dem der Zugriff auf die gerade aktuelle Datenbankverbindung geregelt wird. Wieder taucht "ThisComponent" auf. Wieder jeder Punkt eine Ebene. Hier heißt die Variable "oSQL_Anweisung", in R's Beispiel "Sql_Statement" → Variablen, denen ein Wert zugewiesen werden, stehen links. Variablen, die nicht mit DIM vorher definiert werden, werden bei entsprechenden Makroeinstellungen ("strict") nicht berücksichtigt. Es kann dann nicht eine Variable mitten im Code plötzlich auftauchen - das Makro stoppt dann mit einer Fehlermeldung.
Eine Anmerkung noch zum Code von R: Der Code setzt ein Autoincrement-Feld auf den niedrigstmöglichen Wert zurück. Das macht Sinn, wenn viele Datensätze, vor allem am Ende einer Tabelle, gelöscht wurden. Das findest Du im Handbuch unter der Überschrift "Tabellenindex heruntersetzen bei Autowert-Feldern" in allgemeiner Form. Du möchtest aber nicht den Autoincrement-Wert bearbeiten. Bei Dir müsste also der in der SQL-Anweisung stehende Befehl nicht
"Alter table ""Tabelle1"" alter column ""ID"" restart with "+(nMaxID + 1)
lauten. Du möchtest von einem beliebigen Wert aus Deiner Tabelle den nächst höheren Wert unter bestimmten Bedingungen ermittelt haben. Außerdem willst Du diesen Wert in dem Formular sehen und in der Tabelle abspeichern. Im Formular arbeitetst Du da nicht mit einem SQL-Update-Befehl, sondern weist diesen Wert sichtbar dem Formular und dem Datensatz zu. Endgültig abgespeichert wird er nur, wenn Du den gesamten Datensatz abspeicherst.
Du musst also
- auf das Feld zugreifen, das den einen Wert enhält
- den Wert des neuen Feldes ermitteln (Siehe das Makro von R.)
- das neue Feld mit dem Wert füttern
---------------------
oForm war oben definiert
stFeld = oForm.getByName("Ausgangswert"). CurrentValue()
....jetzt wird damit nMaxID ermittelt wie im vorherigen Formular, entsprechender SQL-Code ist zu wählen, der unter Berücksichtigung von stFeld das Maximum für Dein Zielfeld ermittelt
oFeld = oForm.getByName("Zielwert")
oFeld.BoundField.updateInt(nMaxID+1)
→ Dann hast Du den Wert, den Du ermittelt hast, in Deinem Feld und auch zum Abspeichern bereit in Deinem Formular.
---------------------
Wenn Du mir sagst, an welcher Stelle Du konkret Verbesserungen bei dem Base-Teil des Handbuches sehen würdest, dann kann ich auch versuchen, das umzusetzen.
Gruß
Robert