🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ 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. 🤗

Zugriff auf Formulare, die miitels Makro geöffnet wurden

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
NilsJ
Beiträge: 9
Registriert: So 27. Jul 2014, 14:48

Zugriff auf Formulare, die miitels Makro geöffnet wurden

Beitrag von NilsJ » So 27. Jul 2014, 15:38

Liebe Leute,

ich habe ein Formular für Kundendaten und ein anderes Formular für Auftragsdaten. Im Kundenformular befindet sich ein Button, mit dem ich einen neuen Auftragsdatensatz erzeugen möchte. Das Formular für die Auftragsdaten wird auch prima geöffnet, aber es gelingt mir nicht, anschließend auf dieses Formular zuzugreifen, um einen neuen Datensatz zu erzeugen und die Kunden-ID einzutragen.
In der Zeile "oForm2.moveToInsertRow()" bekomme ich folgende Fehlermeldung:
BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: moveToInsertRow.

Ich bin blutiger Anfänger in der Makro-Programmierung, daher vermute ich, dass es sich um ein ganz triviales Problem handelt.
Schon jetzt bedanke ich mich für Eure Mühe und hoffe, dass ich niemanden hier langweile.

Sub neuerAuftrag
DIM oForm1 AS OBJECT
DIM oForm2 AS OBJECT
DIM iKunde AS Integer

oForm1 = ThisComponent.drawpage.forms.getByName ("Kunde")
iKunde = oForm1.getInt(1)
oForm2 = ThisDatabaseDocument.FormDocuments.getByName("Auftrag").open
oForm2.moveToInsertRow()
oForm2.updateInt(11, iKunde)
oForm2.insertRow()
End Sub

Liebe Grüße
Nils

Acco
Beiträge: 94
Registriert: Fr 31. Jan 2014, 16:41

Re: Zugriff auf Formulare, die miitels Makro geöffnet wurden

Beitrag von Acco » Mo 28. Jul 2014, 17:30

Hallo Nils,

willkommen im Forum.

Dein Makro ist noch unvollständig, z.B. fehlt bei
NilsJ hat geschrieben:iKunde = oForm1.getInt(1)
die Angabe des Formularfeldes. Wahrscheinlich ist die Kunden_ID gemeint. Das könnte so heißen:

Code: Alles auswählen

Kunde_ID = oForm.getInt(oForm.findColumn("ID")) 
Natürlich ist da der richtige Feldname anzugeben.

Das gesamte Makro könnte so lauten:

Code: Alles auswählen

	
    oDoc = ThisComponent
    oForm = oDoc.Drawpage.Forms.MainForm
    Kunde_ID = oForm.getInt(oForm.findColumn("ID")) ' ID als angenommener Feldname, gegf. ändern
    
'Verbindung zur DatenQuelle erstellen
	oDatenquelle = oDoc.Parent.DataSource
	oVerbindung = oDatenquelle.GetConnection("","")
	
'SQL Verarbeitung vorbereiten	
	oStatement = oVerbindung.createStatement
	
'SQL String formulieren
	stSQL="INSERT INTO ""Auftrag"" (""K_ID"") VALUES " + "(" + Kunde_ID + ")"  ' Tabellenspalte K_ID entsprechend ändern
	
'SQL Befehl ausführen
	oStatement.executeUpdate(stSQL)	
	
    oFormDocAuftrag = ThisDatabasedocument.FormDocuments.getByName("Auftrag").open  ' Formular öffnen
    oFormAuftrag = oFormDocAuftrag.Drawpage.Forms.MainForm
    oFormAuftrag.Filter = "(""K_ID"" = '"+ Kunde_ID + "')"  ' Formular-Filter setzen für alle Aufträge dieses Kunden  
Probiers mal aus. Viel Erfolg mit Deiner DB.

Gruß acco
openSUSE Tumbleweed - LibreOffice 24.8.2.1

NilsJ
Beiträge: 9
Registriert: So 27. Jul 2014, 14:48

Re: Zugriff auf Formulare, die miitels Makro geöffnet wurden

Beitrag von NilsJ » Mo 28. Jul 2014, 19:26

Hallo Acco,

vielen Dank für Deine Mühe!!! Es ist ein schönes Gefühl, wenn man Hilfe bekommt.

Habe Dein Makro angepasst und ausprobiert, aber leider gibt es für die Zeile: oStatement.executeUpdate(stSQL)
nun die Meldung: Column not found: 11 in statement [INSERT INTO "Auftrag" ("11")].
Es ist aber ganz sicher, dass die Kunden_ID bei einer Auftragszeile in Spalte 11 eingetragen wird.

Viel wichtiger:
Wenn ich Dein Makro richtig verstanden habe, liefert es alle Aufträge für einen bestimmten Kunden.
In meinem Formular für Kundendaten werden aber schon alle Aufträge zu diesem Kunden in einem Subformular angezeigt.

Ich stehe nun vor der Aufgabe, einen neuen Auftrag für diesen Kunden zu erzeugen. Bisher öffne ich zu diesem Zweck manuell das Auftragsformular, erzeuge über die Steuerung einen neuen Datensatz und suche den Kunden in der Auswahlliste. Dies möchte ich zukünftig von dem Makro ausführen lassen.

Das Auslesen der Kunden-ID funktioniert in meinem Makro ja schon und das Auftragsformular wird auch geöffnet. Ich habe nur den Verdacht, dass ich keinen richtigen Wert für oForm2 zurückbekomme. Jedenfalls scheitert jeder Zugriff auf oForm2.
Mit einem ganz ähnlichen Makro erzeuge ich aber im Auftragsformular neue Auftragspositionen. Dort muss ich aber nicht auf zwei Tabellen zugreifen.

Oder habe ich da was völlig falsch verstanden?

Liebe Grüße
Nils

Acco
Beiträge: 94
Registriert: Fr 31. Jan 2014, 16:41

Re: Zugriff auf Formulare, die miitels Makro geöffnet wurden

Beitrag von Acco » Mo 28. Jul 2014, 19:51

Hallo Nils,

am einfachsten ist, wenn Du eine verfremdete Datenbank hier hochlädst.

Grundsätzlich ist mit dem Makro auch möglich neue Datensätze anzulegen. Ist halt die Frage wie die DB konkret aufgebaut ist.
Zur Analyse von Problemen empfehle ich Werkzeuge wie Xray, damit kannst Du u.a. Formulare bis in tiefe Strukturen untersuchen. Das gibt es auch auf Deutsch.

Hier der Link: http://r.search.yahoo.com/_ylt=A7x9UkjK ... HrTEH_siA-

Gruß acco
openSUSE Tumbleweed - LibreOffice 24.8.2.1

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

Re: Zugriff auf Formulare, die miitels Makro geöffnet wurden

Beitrag von F3K Total » Mo 28. Jul 2014, 20:01

Hi,
es ist so, dass die Verbindung zur Datenbank beim Öffnen eines Formulares per Makro nicht hergestellt wird, daher kann dies per Makro wie folgt erledigt werden:

Code: Alles auswählen

oController = ThisDatabaseDocument.CurrentController
If not oController.isconnected then oController.connect
Also alles zusammen:

Code: Alles auswählen

Sub neuerAuftrag
    DIM oForm1 AS OBJECT
    DIM oForm2 AS OBJECT
    DIM iKunde AS Integer
    oController = ThisDatabaseDocument.CurrentController
    If not oController.isconnected then oController.connect
    oForm1 = ThisComponent.drawpage.forms.getByName ("Kunde")
    iKunde = oForm1.getInt(1)
    oForm2 = ThisDatabaseDocument.FormDocuments.getByName("Auftrag").open
    oForm2.moveToInsertRow()
    oForm2.updateInt(11, iKunde)
    oForm2.insertRow()
End Sub

HTH R
Windows 11: AOO, LO Linux Mint: AOO, LO

Acco
Beiträge: 94
Registriert: Fr 31. Jan 2014, 16:41

Re: Zugriff auf Formulare, die miitels Makro geöffnet wurden

Beitrag von Acco » Di 29. Jul 2014, 09:21

Hi,

schönes Makro, F3K Total.
F3K Total hat geschrieben:iKunde = oForm1.getInt(1)
und
F3K Total hat geschrieben:oForm2.updateInt(11, iKunde)
diese Kurzformen kannte ich noch nicht, sorry Nils. Gefällt mir besser als meine Lösung und ist auch kürzer.

Alledings bekomme ich die gleiche Fehlermeldung wie Nils in seinem ersten Post:
NilsJ hat geschrieben:In der Zeile "oForm2.moveToInsertRow()" bekomme ich folgende Fehlermeldung:
BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: moveToInsertRow.


@Nils
in meinem Makro muß der Spaltenname (im Beispiel oben "K_ID"), nicht die Spaltennummer (11) angegeben werden. Das Makro trägt nur die Kunden_ID in die Tabelle Auftrag ein und öffnet das Formular mit allen Datensätzen (Aufträgen) des Kunden. Auch mit dem Neuen. Wenn Du ein Tabellenkontollfeld zur Anzeige benutzt, siehst Du das. Falls Du nur einen Datensatz im Formular anzeigen läßt, ist es der letzte des jeweiligen Kunden. Um direkt auf den neuen Datensatz zu springen füge am Ende des Makros noch an:

Code: Alles auswählen

wait 20 ' Millisekunden, sonst ist das Makro zu schnell und bringt eine Fehlermeldung
oFormAuftrag.Last
Wenn Du den Kundenfilter nicht haben willst, lasse die Filter-Zeile einfach weg.

Gruß acco
openSUSE Tumbleweed - LibreOffice 24.8.2.1

Acco
Beiträge: 94
Registriert: Fr 31. Jan 2014, 16:41

Re: Zugriff auf Formulare, die miitels Makro geöffnet wurden

Beitrag von Acco » Di 29. Jul 2014, 15:49

Hi,

kurze Ergänzung zu obigem Laufzeitfehler:

oForm2 bringt den Fehler hervor, weil es keine Databaseform, sondern ein swXTextDocument ist. Und das kennt kein "moveToInsertRow". ThisComponent bleibt weiterhin oForm1 (Kunde). Wie man dies korrigiert weiß ich im Moment noch nicht, vielleicht kann F3K Total oder jemand anders hier helfen?

Gruß acco
openSUSE Tumbleweed - LibreOffice 24.8.2.1

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

Re: Zugriff auf Formulare, die miitels Makro geöffnet wurden

Beitrag von F3K Total » Di 29. Jul 2014, 18:57

Acco hat geschrieben:... vielleicht kann F3K Total oder jemand anders hier helfen?
Nun, mit

Code: Alles auswählen

oForm2 = ThisDatabaseDocument.FormDocuments.getByName("Auftrag").open
öffnet man in der Tat das Formdokument, sollte besser

Code: Alles auswählen

oFormdoc2 = ThisDatabaseDocument.FormDocuments.getByName("Auftrag").open
genannt werden.
mit

Code: Alles auswählen

oForm2 = oFormdoc2.drawpage.forms.MainForm
oder

Code: Alles auswählen

oForm2 = oFormdoc2.drawpage.forms.getbyname("MainForm")

wenn das strukturelle Formular im Formularnavigator MainForm heißt, funzt es dann.
HTH R
Windows 11: AOO, LO Linux Mint: AOO, LO

NilsJ
Beiträge: 9
Registriert: So 27. Jul 2014, 14:48

Re: Zugriff auf Formulare, die miitels Makro geöffnet wurden

Beitrag von NilsJ » Di 29. Jul 2014, 20:36

Hi,
scheint doch alles ein bisschen komplizierter zu sein, als ich dachte.

Zunächst habe ich den Tipp von HTH R mit:
oController = ThisDatabaseDocument.CurrentController
If not oController.isconnected then oController.connect
ausprobiert.
Nun wissen wir auf jeden Fall mal, dass es daran nicht liegt.

Der Hinweis von acco, dass es sich bei oForm2 nicht um eine Databaseform handelt und damit ThisComponent weiterhin auf Kunde bzw. oForm1 zeigt, scheint mir sehr plausibel zu sein.

Dann habe ich den Vorschlag von F3K Total mit:
oFormdoc2 = ThisDatabaseDocument.FormDocuments.getByName("Auftrag").open
oForm2 = oFormdoc2.drawpage.forms.getbyname("Auftrag")
ausprobiert. Leider gibt es nun auf die Zeile: "oForm2.moveToInsertRow()" die Meldung:

BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.sdbc.SQLException
Message: Fehler in der Funktionsfolge.

Das kann ich auch nicht richtig interpretieren. Wie gesagt, bin noch ziemlicher Anfänger.

@acco
Die Änderungen für Deinen Makro-Vorschlag werde ich morgen ausprobieren. Habe jetzt nur noch wenig Zeit.
Wahrscheinlich muss ich wohl doch mal den betreffenden Datenbankausschnitt extrahieren und hochladen, dafür brauche ich aber auch ein bisschen Zeit.

Also zunächst mal vielen Dank an alle, die sich mittlerweile beteiligen.
Vielleicht fällt ja jemandem noch was ein.

Liebe Grüße
Nils

Acco
Beiträge: 94
Registriert: Fr 31. Jan 2014, 16:41

Re: Zugriff auf Formulare, die miitels Makro geöffnet wurden

Beitrag von Acco » Mi 30. Jul 2014, 11:43

Hi,

danke @ F3K Total. Schnell und gut wie immer.

@Nils
NilsJ hat geschrieben:Message: Fehler in der Funktionsfolge.
Den Fehler hatte ich auch. Er entsteht hier, weil das Makro zu schnell ausgeführt wird. Füge eine Zeile ein mit

Code: Alles auswählen

wait 20 ' Millisekunden
Diese Zusatzeit brauchts bei mir um die Methode "moveToInsertRow() zur Verfügung zu stellen. Wenn 20 nicht reicht, dann schrittweise erhöhen.

So funktioniert es bei mir einwandfrei:

Code: Alles auswählen

    DIM oForm1 AS OBJECT
    DIM oFormDok2 AS OBJECT
    DIM oForm2 AS OBJECT
    DIM iKunde AS Integer
    
    oController = ThisDatabaseDocument.CurrentController
    If not oController.isConnected then oController.Connect
    oForm1 = ThisComponent.Drawpage.Forms.getByName("MainForm")
    iKunde = oForm1.getInt(1)

    oFormDok2 = ThisDatabaseDocument.FormDocuments.getByName("Auftrag").open
    ' oForm2 - MainForm zur Drawpage machen
    oForm2 = oFormDok2.Drawpage.Forms.MainForm

    wait 20 ' sonst wird das Makro zu schnell ausgeführt

    oForm2.moveToInsertRow()
    oForm2.updateInt(11, iKunde)
    oForm2.insertRow()
Gruß acco
openSUSE Tumbleweed - LibreOffice 24.8.2.1


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