BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Freischreiber
Beiträge: 755
Registriert: Fr 28. Mär 2014, 10:41

Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Beitrag von Freischreiber » Mi 19. Jul 2017, 15:13

Hallo,

ich habe eine Frage zu einem Makro, mit dem ich von einem Adressformular (dort Unterformular Auftragsliste zur Adresse) ein Auftragsformular aufrufe. Das Makro funktioniert und sieht bisher so aus:

Code: Alles auswählen

Sub fAuftragAufruf(oEvent) 
	oformAuftraege = oEvent.Source.Model.Parent 
	oformAuftrag = ThisDatabaseDocument.getformdocuments.GetByName("fAuftrag")
	
 	if oformAuftraege.RowCount = 0 Then goto Neuanlage
 	
	stAuftragID = oformAuftraege.getString(oformAuftraege.findcolumn("AuftragID")) 'nicht weil die Formularspalte so heißt, sondern die Spalte in der Abfrage, auf der das Unterformular beruht!
	oformAuftrag.open
	oformAuftrag = oformAuftrag.Component.drawpage.forms(0)


'SicherheitsfragenAuftrag()

'Ergänzung um Sicherheitsfragen für Auftrag (falls dort Änderungen ungespeichert sind).
   DIM intFrage As Integer
   with oFormAuftrag
   
         if .ismodified() then
            intFrage = MsgBox("Der angezeigte Datensatz wurde geändert. Änderungen speichern?", MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON1, "Makro BuchungAuftragsFormular")
         'MB_DEFBUTTON1 macht das Ja zur vorgeschlagenen Antwort.
               if intFrage = IDYES then
                  if .isnew() then
                     .insertrow
                     else
                     .updaterow
                 end if
               end if
         end if
   end with
'Ergänzung Ende.
   
   oformAuftrag.Filter = "AZ = '"+stAuftragID+"'"
   'oFormAuftrag.ApplyFilter = TRUE (geht hier ohne)
   oFormAuftrag.reload
   
   'Neuanlage: Leeren Auftrag aufrufen? Auch vorher Sicherheitsfrage, falls Auftragsformular schon offen ist
   
End Sub
Die "Sicherheitsfragen" sind eigentlich nur eine, nämlich die Prüfung, ob das zu öffnende Auftragsformular schon offen ist und eventuell ungespeicherte Änderungen enthält.

Jetzt wollte ich die Ergänzung um Sicherheitsfragen auslagern in ein eigenes Makro, Sub SicherheitsfragenAuftrag(), und in diesem Makro hier nur noch das ausgelagerte Makro aufrufen. Dabei erhalte ich aber die Fehlermeldung "Objektvariable nicht belegt" für .ismodified .

Was ist falsch? Bzw.: wie kriege ich das hin?

Ergänzungsfrage:
Am Ende des Makros soll für den Fall, daß die Auftragsliste für diese Adresse leer ist, ein neues leeres Auftragsformular erscheinen. Auch da soll vorher die Sicherheitsfrage kommen (deswegen der Wunsch nach Auslagerung) und dann vermutlich etwas mit "oformAuftrag.open", aber ohne Filterung, sondern mit einem leeren Datensatz. Wie geht das?

Schon mal vielen Dank für Hilfe.

Gruß
Freischreiber
Freischreiber nutzt seit 6/2023 LibreOffice Version: 7.2.7.2 (x64) unter Windows 10 und SplitDB mit HSQL 2.7.2.

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Beitrag von RobertG » Mi 19. Jul 2017, 15:36

Hallo Freischreiber,

Code: Alles auswählen

SicherheitsfragenAuftrag(oFormAuftrag)
vermutlich: Deine Auslagerung kennt oFormAuftrag nicht. Die muss von der ursprünglichen Prozedur weitergegeben werden.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
Beiträge: 755
Registriert: Fr 28. Mär 2014, 10:41

Re: Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Beitrag von Freischreiber » Mi 19. Jul 2017, 16:16

Hallo Robert,

jahaa! Vielen Dank. Hat sofort geklappt, und zwar muß sowohl im ausgelagerten Makro als auch im Aufruf die Klammer ausgefüllt sein mit "oFormAuftrag".

Das heißt: ein Makro, das für verschiedene Formulare taugt, kann man so nicht anlegen, weil der Formularname enthalten sein muß.

Das Ende des Makros sieht jetzt so aus:

Code: Alles auswählen

...
Neuanlage: 
   oFormAuftrag.open
   oFormAuftrag = oFormAuftrag.Component.drawpage.forms(0)
   SicherheitsfragenAuftrag(oFormAuftrag)
   oFormAuftrag.new
   
Ende:
End Sub

Mein Restproblem: so etwas wie "oFormAuftrag.new" oder "oFormAuftrag.afterlast" scheint nicht zu gehen. Wie stelle ich es an, daß das Auftragsformular einen neuen Datensatz erzeugt?

Gruß
Freischreiber
Freischreiber nutzt seit 6/2023 LibreOffice Version: 7.2.7.2 (x64) unter Windows 10 und SplitDB mit HSQL 2.7.2.

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Beitrag von RobertG » Mi 19. Jul 2017, 19:48

Hallo Freischreiber,

Du gibst mit dem Aufruf der 2. Prozedur nur ein Objekt weiter. Das kann genauso das Objekt eines anderen Formulars sein. Die Bezeichnung ist dabei unwichtig. In der 2. Prozedur zählt die Bezeichnung, die in der Klammer der 2. Prozedur steht.

Code: Alles auswählen

SUB Proz1(oEvent AS OBJECT)
	oForm = oEvent.Source.Model.Parent
	Proz2(oForm)
END SUB

SUB Proz2(oHallihallo AS OBJECT)
	oFeld = oHallihallo.getByName("Einnahmen")
END SUB
Mit der zweiten Prozedur greifst Du so auf das Formularfeld "Einnahmen" aus dem Formular der 1. Prozedur zu.

Mit

Code: Alles auswählen

oForm.moveToInsertRow()
müsste der Sprung zu einem neuen Datensatz gelingen.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
Beiträge: 755
Registriert: Fr 28. Mär 2014, 10:41

Re: Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Beitrag von Freischreiber » Do 20. Jul 2017, 09:04

Hallo Robert,
Du gibst mit dem Aufruf der 2. Prozedur nur ein Objekt weiter.
Sind das die "Objekte", von denen die "objektorientierte" Programmierung ihren Namen hat? Ich habe große Schwierigkeiten, mir diese Dinger vorzustellen und muß mich da mal reinlesen. Funktionieren tut es tatsächlich, für die Auslagerung einen eigenen Objektnamen zu verwenden. Faszinierend. :D

Und

Code: Alles auswählen

oFormAuftrag.moveToInsertRow() 
ist auch genau das gewesen, was gebraucht wurde.

Vielen herzlichen Dank!

Gruß
Freischreiber
Freischreiber nutzt seit 6/2023 LibreOffice Version: 7.2.7.2 (x64) unter Windows 10 und SplitDB mit HSQL 2.7.2.

Freischreiber
Beiträge: 755
Registriert: Fr 28. Mär 2014, 10:41

Re: Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Beitrag von Freischreiber » Mo 24. Jul 2017, 09:55

Hallo Robert,

mit moveToInsertRow() habe ich jetzt allerdings ein neues Problem. Die Neuanlage eines Auftrags will ich auf einem separaten Button anbieten mit diesem Makro:

Code: Alles auswählen

Sub Neuauftrag(oEvent as object)
	oformAuftraege = oEvent.Source.Model.Parent 
	oFormAuftrag = ThisDatabaseDocument.getformdocuments.GetByName("f-Auftrag")
	oFormAuftrag.open
	oFormAuftrag = oFormAuftrag.Component.drawpage.forms(0)
	Speicherfrage(oFormAuftrag)
	oFormAuftrag.moveToInsertRow()
End Sub
Das klappt aber nur, wenn das Auftragsformular schon offen ist und gefiltert hat, etwa nach Ablauf des ursprünglichen Makros (Filtern nach bestehender Auftragsnummer). Wenn das nicht vorher passiert ist, bekomme ich die Fehlermeldung
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.sdbc.SQLException
Message: Fehler in der Funktionsfolge..
Woran liegt das?

Gruß
Freischreiber
Freischreiber nutzt seit 6/2023 LibreOffice Version: 7.2.7.2 (x64) unter Windows 10 und SplitDB mit HSQL 2.7.2.

Freischreiber
Beiträge: 755
Registriert: Fr 28. Mär 2014, 10:41

Re: Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Beitrag von Freischreiber » Mo 24. Jul 2017, 11:05

Zwischenstand:

Die Fehlermeldung habe ich jetzt mit einem

Code: Alles auswählen

WAIT (1000)
vor dem oFormAuftrag.moveToInsertRow() wegbekommen. Allerdings springt das Formular nicht zu einem leeren/neuen Datensatz, sondern zu einem bestehenden. Was ist das nun wieder?

Gruß
Freischreiber
Freischreiber nutzt seit 6/2023 LibreOffice Version: 7.2.7.2 (x64) unter Windows 10 und SplitDB mit HSQL 2.7.2.

Freischreiber
Beiträge: 755
Registriert: Fr 28. Mär 2014, 10:41

Re: Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Beitrag von Freischreiber » Mo 24. Jul 2017, 18:00

Hallo Robert,

es ist offensichtlich dieser Bug:
https://bugs.documentfoundation.org/sho ... i?id=90088

Der Workaround des Users "robert" ;) , der dort steht, funktioniert auch bei mir:

Code: Alles auswählen

Sub Neuauftrag(oEvent as object)
	oformAuftraege = oEvent.Source.Model.Parent 
	oFormAuftrag = ThisDatabaseDocument.getformdocuments.GetByName("f-Auftrag")
	oFormAuftrag.open
	oFormAuftrag = oFormAuftrag.Component.drawpage.forms(0)
	Speicherfrage(oFormAuftrag)
	Wait(100) 'Damit das Formular soweit ist, sonst kommt "Fehler in der Funktionsfolge"
	oFormAuftrag.Last() 'Umgeht den Bug https://bugs.documentfoundation.org/show_bug.cgi?id=90088
	oFormAuftrag.MoveToInsertRow() 'erst nach Sprung zum letzten Datensatz kann neuer Datensatz angelegt werden.
End Sub
In der Bugsammlung diesen Bug mit meiner alten LO-Version nochmal zu bestätigen, wird vermutlich niemanden interessieren, oder?

Gruß
Freischreiber
Freischreiber nutzt seit 6/2023 LibreOffice Version: 7.2.7.2 (x64) unter Windows 10 und SplitDB mit HSQL 2.7.2.

Freischreiber
Beiträge: 755
Registriert: Fr 28. Mär 2014, 10:41

Re: Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Beitrag von Freischreiber » Mo 24. Jul 2017, 18:13

Überlegung:
Da der Bug offenbar mit gecacheten Tabellen zu tun hat, frage ich mich, ob man ihn für neuere HSQL-Versionen nicht vermeiden kann, indem man den Tabellen- oder Row-Cache erhöht, mit
SET FILES CACHE SIZE 10000
bzw. mit
SET FILES CACHE ROWS 50000

Siehe auch http://hsqldb.org/doc/guide/guide.html#N15DB9

Hat das schon mal jemand probiert?

Gruß
Freischreiber
Freischreiber nutzt seit 6/2023 LibreOffice Version: 7.2.7.2 (x64) unter Windows 10 und SplitDB mit HSQL 2.7.2.

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Makro auslagern und Aufruf eines Formulars mit neuem Datensatz

Beitrag von RobertG » Mo 24. Jul 2017, 21:24

Hallo Freischreiber,

über die kurze Zeit würde ich mich nicht aufregen. Wait(100) sind 0,1 Sekunde.

Für neuere HSQL-Versionen bist Du wohl die Person, die das am besten testen kann. Zuerst die Wartezeit so niedrig wie möglich ansetzen, ohne dass Du etwas veränderst. Dann den Cache ändern und sehen, was passiert, wenn Du jetzt die Wartezeit weiter herunterfährst.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten