❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
Unterstützen Sie das LibreOffice-Forum und helfen Sie uns, unser Ziel für 2025 zu erreichen!

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱


❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] Drawpage in Makro löst exception aus?

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

[gelöst] Drawpage in Makro löst exception aus?

Beitrag von pschulze59 » So 4. Nov 2018, 11:39

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

Code: Alles auswählen

oDrawpage = oDoc.Drawpage
Ergänzende Infos: Ich verwende die interne Firebird-DB mit LO-Version 6.1.2.1 unter Linux.

Was mache ich falsch?
Peter
Zuletzt geändert von pschulze59 am Mo 5. Nov 2018, 20:49, insgesamt 1-mal geändert.

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Drawpage in Makro löst exception aus?

Beitrag von F3K Total » So 4. Nov 2018, 12:09

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
Windows 11: AOO, LO Linux Mint: AOO, LO

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Drawpage in Makro löst exception aus?

Beitrag von pschulze59 » So 4. Nov 2018, 13:11

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

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Drawpage in Makro löst exception aus?

Beitrag von F3K Total » So 4. Nov 2018, 13:37

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

    Code: Alles auswählen

    oFormdocument.open
    kannst du es öffnen, und hast dann Zugriff auf

    Code: Alles auswählen

    oFormdocument.Component.drawpage.forms...

    Code: Alles auswählen

    oFormdocument.Component
    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 ...
Windows 11: AOO, LO Linux Mint: AOO, LO

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Drawpage in Makro löst exception aus?

Beitrag von F3K Total » So 4. Nov 2018, 13:48

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
Windows 11: AOO, LO Linux Mint: AOO, LO

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Drawpage in Makro löst exception aus?

Beitrag von pschulze59 » So 4. Nov 2018, 15:19

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

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Drawpage in Makro löst exception aus?

Beitrag von pschulze59 » So 4. Nov 2018, 18:06

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. :?

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Drawpage in Makro löst exception aus?

Beitrag von F3K Total » So 4. Nov 2018, 18:47

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
Windows 11: AOO, LO Linux Mint: AOO, LO

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Drawpage in Makro löst exception aus?

Beitrag von pschulze59 » So 4. Nov 2018, 19:01

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


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten