Seite 1 von 1
[gelöst] Drawpage in Makro löst exception aus?
Verfasst: So 4. Nov 2018, 11:39
von pschulze59
Hallo,
eigentlich wollte ich ohne Makros auskommen, aber jetz ist der Punkt, an dem ich doch damit einsteigen muss.
Meine erste Aufgabe lautet:
Aus dem MainForm "RB", welches ein SubForm "Kont" enthält und welches nur zur Darstellung der Tabelleneinträge berechtigt (also kein editieren, löschen und neu anlegen in "Kont"), soll im Falle, dass ein neuer Datensatz in "Kont" angelegt werden muss, das eigentliche Formular "Kont" aufgerufen werden, ein neuer leerer Datensatz angezeigt werden, der Feldwert "RBID" in "Kont" (entnommen als "ID" aus dem aktuellen Datensatz des vorher angezeigten MainForm "RB") voreingetragen werden und nachdem der Bediener die restlichen Felder ausgefüllt hat, mit dem Schließen des Formulars "Kont" der neue Satz natürlich in "Kont" gespeichert und im Subform "Kont" zum zurückgekehrten Form "RB" angezeigt werden, was eine vorherige Aktualisierung erforderlich macht. (Hoffentlich war der Satz verständlich

)
Beim Makro scheitere ich nun schon am Einlesen der Drawpage. LO-Basic sagt:
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.container.NoSuchElementException
Message: .
Das Makro steht erst am Anfang. Aber wenigstens die Deklaration der Variablen und Einlesen der Variablenwerte sollte doch gelingen. Vielleicht bin ich auch blind - manchmal sucht man ja ein Komma oder Punkt. Aber ich finde den Fehler nicht.
Hier der bisherige Code:
Code: Alles auswählen
Sub NewKont
DIM oDoc as Object
DIM oDrawpage as Object
DIM oForm1 as Object
DIM oForm2 as Object
DIM laktRBID as long
oDoc = thisComponent
oDrawpage = oDoc.Drawpage
oForm1 = oDrawpage.forms.getByName("RB")
laktRBID = oForm.getlong(1)
thisdatabasedocument.formdocuments.getByName("Kont").open
oForm2 = oDrawpage.forms.getByName("Kont")
oForm2.movetoinsertrow()
'Nach dem Speichern muss zurück zu Form "RB"
'und die Anzeige aktualisiert werden,
'so dass neuer Kontakt im SubForm "Kont" von Mainform "RB"
'angezeigt wird
End Sub
Der Fehler wird angezeigt bei
Ergänzende Infos: Ich verwende die interne Firebird-DB mit LO-Version 6.1.2.1 unter Linux.
Was mache ich falsch?
Peter
Re: Drawpage in Makro löst exception aus?
Verfasst: So 4. Nov 2018, 12:09
von F3K Total
Moin,
öffne im Formularentwurfsmodus mal den Formularnavigator. Du suchst das oberste Formular, und dass heißt mit großer Wahrscheinlichkeit nicht "RB" (com.sun.star.container.NoSuchElementException sagt, dass es dieses Objekt nicht gibt.), sondern vermutlich "MainForm".
Du kannst es natürlich umbennenen.
Eine zweite Fehlermöglichkeit ist es, wenn du das Makro aus der BASIC-Umgebung startest, dann ist THISCOMPONENT die Basic -Umgebung, und die hat keine Drawpage. Starte es vom Formular aus, über Extras/Makros ... oder einer anderen Quelle im Formular.
Gruß R
Re: Drawpage in Makro löst exception aus?
Verfasst: So 4. Nov 2018, 13:11
von pschulze59
Danke, Robert,
die erste Variante war es.
Da hatte ich einen Gedankenfehler. Ich dachte der Name des Formulars wie in der Base-GUI muss da bei "getbyname" eingetragen werden, weil bei der Form.Open-Methode wird ja auch der Formularname angegeben. Aber der Name des Formulars in diesem Fall ist der, der im Navigator angezeigt wird. Jetzt, wo ich den Unterschied von Dir aufgezeigt bekommen habe, habe ich auch die betreffende Stelle im Handbuch gefunden.
Nebenbei: Das kann natürlich weiter zu Verwechslungen führen, wenn man was beschreibt: Wenn der Formularname der Name ist, wie er im Formularnavigator angezeigt wird, wie ist dann die Bezeichnung des Formulars, wie er in der LO-Base-GUI unter Formulare angezeigt wird? Doch auch Formularname, oder?
Und noch eine Frage zum allgemeinen Verständnis: Wenn es die Methode "getbyname" gibt, gibt es doch auch sicher sowas wie "getbyid". Welche ID hat dann das Formular - in der Reihenfolge der Auflistung im Navigator? Wäre eine solche Ansprache von Objekten nicht eindeutiger, weil unabhängig von eventuellen späteren Namensänderungen?
Danke für Deine schnelle Hilfe!
Pete
Re: Drawpage in Makro löst exception aus?
Verfasst: So 4. Nov 2018, 13:37
von F3K Total
Hallo Pete,
Ich empfehle Dir die Verwendung eines Introspection-Tools wie
MRI oder
Xray
Damit kannst Du alle LO/OOo-Dokumente hinsichtlich ihres Aufbaues durchleuchten.
Es gibt bei den strukurellen Formularen z.B.
Code: Alles auswählen
.getbyName("Fomularname")
.getbyIndex(Nummer, beginnend bei 0)
Grundsätzlich muss man unterscheiden:
- zwischen einem Formulardokument, sprich dem Formular, was du siehst, wenn du es per Doppelklick öffnest
Code: Alles auswählen
oFormdocument = Thisdatabasedocument.Formdocuments.getbyname(Name des in der GUI angezeigten Formulars)
mit
kannst du es öffnen, und hast dann Zugriff auf
entspricht dann dem Einstiegspunkt in die interne Struktur
oFormdokument.Component entspricht Thiscomponent, wenn du ein Makro aus dem Formular startest.
- und strukturellen Formularen/Unterformularen die sich in diesem Formulardokument befinden (sieht man nicht), auf der die Kontrollelemente liegen, und die eine Verbindung in eine Datenbank haben können.
Code: Alles auswählen
ThisComponent.drawpage.forms.getbyname("Name des strukturellen Formulares")
Gruß R ... aber nicht Robert ...
Re: Drawpage in Makro löst exception aus?
Verfasst: So 4. Nov 2018, 13:48
von F3K Total
Probiere mal dies:
Code: Alles auswählen
Sub NewKont
DIM oDoc as Object
DIM oDrawpage as Object
DIM oForm1 as Object
DIM oForm2 as Object
DIM laktRBID as long
oDoc = thisComponent
oDrawpage = oDoc.Drawpage
oForm1 = oDrawpage.forms.getByName("MainForm")
laktRBID = oForm1.getlong(1)
oDoc2 = thisdatabasedocument.formdocuments.getByName("Kont").open
oForm2 = oDoc2.Drawpage.forms.getByName("Kont")'oder doch "MainForm???"
oForm2.movetoinsertrow()
'Nach dem Speichern muss zurück zu Form "RB"
'und die Anzeige aktualisiert werden,
'so dass neuer Kontakt im SubForm "Kont" von Mainform "RB"
'angezeigt wird
End Sub
Gruß R
Re: Drawpage in Makro löst exception aus?
Verfasst: So 4. Nov 2018, 15:19
von pschulze59
Vielen Dank R.!
Du hast mir beim Verständnis und dem Problem schon geholfen. Werde dann später weiter machen.
Melde mich später noch mal.
Gruß
Peter
Re: Drawpage in Makro löst exception aus?
Verfasst: So 4. Nov 2018, 18:06
von pschulze59
Hallo!
Also unter Berücksichtigung der Tipps, läuft das Makro jetzt bis zu der Stelle, an der im Form "Kont" das MainForm einen neuen leeren Datensatz anzeigen soll. Das geschieht auch tatsächlich - dann kommt die folgende Fehlermeldung:
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.sdbc.SQLException
Message: Fehler in der Funktionsfolge..
Code: Alles auswählen
Sub NewKont
DIM oDoc1, oDoc2 as Object
DIM oDrawpage1,oDrawpage2 as Object
DIM oForm1 as Object
DIM oForm2 as Object
DIM laktRBID as long
oDoc1 = thisComponent
oDrawpage1 = oDoc1.Drawpage
oForm1 = oDrawpage1.forms.getByName("MainForm")
laktRBID = oForm1.getlong(1)
thisdatabasedocument.formdocuments.getByName("RB").close
oDoc2 = thisdatabasedocument.formdocuments.getByName("Kont").open
oDrawpage2 =oDoc2.Drawpage
oForm2 = oDrawpage2.forms.getByName("MainForm")
oForm2.movetoinsertrow()
'Warum erfolgt an dieser Stelle ein Abbruch???
'Kann das an Pflichtfeldern im Formular liegen???
'Aber es wird ja noch nichts zugewiesen oder gespeichert?
'Es soll doch nur ein neuer leerer Datensatz angezeigt werden!
Msgbox("Bitte bearbeiten!") ' Nur als Kontrollstop eingebaut
'Wie wird der Wert laktRBID dem Feld "RBID" in "Kont" zugewiesen?
'"Kont"."RBID" ist ein Long-Wert und wird im Formular "Kont" als Listenfeld
'mit den verständlicheren Beraternamen angezeigt.
'Nach dem Speichern muss zurück zu Form "RB" - also wieder mit .open -
'und der Datensatz mit der alten ID in "RB" = RBID in "Kont" = laktRBID
'aufgerufen und die Anzeige aktualisiert werden,
'so dass der neue Kontakt im SubForm "Kont" von Mainform "RB"
'angezeigt wird. Also kein SELECT, sondern ein LOCATE?
End Sub
Ich habe im Makro als Kommentare gleich noch meine weiteren Fragen definiert, weil ich hier garantiert weitere Hilfe brauche.
Ich muss ehrlich sagen, dass ich mich noch mit keiner anderen Programmierung so schwer tat, wie mit dieser Makrosprache. Vielleicht werde ich zu alt, aber ich denke eher, dass mir einfach ein paar Grundsätze nicht klar sind.

Re: Drawpage in Makro löst exception aus?
Verfasst: So 4. Nov 2018, 18:47
von F3K Total
Jo,
das ist nicht so einfach, du bist wohl zu schnell, das Formular muss zunächst geladen sein, eine kleine loop hilft:
Code: Alles auswählen
Sub NewKont
DIM oDoc1, oDoc2 as Object
DIM oDrawpage1,oDrawpage2 as Object
DIM oForm1 as Object
DIM oForm2 as Object
DIM laktRBID as long
oDoc1 = thisComponent
oDrawpage1 = oDoc1.Drawpage
oForm1 = oDrawpage1.forms.getByName("MainForm")
laktRBID = oForm1.getlong(1)
thisdatabasedocument.formdocuments.getByName("RB").close
oDoc2 = thisdatabasedocument.formdocuments.getByName("Kont").open
oDrawpage2 =oDoc2.Drawpage
oForm2 = oDrawpage2.forms.getByName("MainForm")
do
wait 10
loop until oForm2.isloaded
oForm2.movetoinsertrow()
oForm2.Columns.RBID.updateint(laktRBID)
oForm2.insertRow
End Sub
So, Schluss für heute ...
Gruß R
Re: Drawpage in Makro löst exception aus?
Verfasst: So 4. Nov 2018, 19:01
von pschulze59
Vielen Dank R.,
bin jetzt wieder einen Schritt weiter. Hätte nicht gedacht dass eine "Pause" nötig wird - stand auch in all den Infos nichts dazu.
Da aber weitere Pflichtfelder (nicht nur RBID) erforderlich sind, muss das Insert nach dem kompletten Ausfüllen des Forms erfolgen. Der Bediener braucht also erst den Fokus, um alle Angaben zu machen und dann eine Speichern-Schaltfläche oder ein Ereignis (z.B. Verlust des Fokus im letzten auszufüllenden Feld), um zu speichern.
Ich probiere mal weiter.
Schönen Feierabend!
Peter