[gelöst] Bericht für Datensatz per Makro öffnen
Moderator: Moderatoren
[gelöst] Bericht für Datensatz per Makro öffnen
Hallo,
Ich versuche mich gerade mit Makros in meiner ooBase Datenbank. Bisher habe ich nur etwas Erfahrung mit VBA in Excel. Soweit ich mittlerweile herausgefunden habe, muß ich hier aber OpenOffice Basic verwenden. Leider konnte ich dazu aber sonst nicht viel weitere Information finden. Wie oder wo kann ich denn mehr darüber lernen?
Ganz konkret benötige ich derzeit folgendes:
Ich habe eine Abfrage, ein Formular und einen Bericht. Im Formular habe ich eine Schaltfläche eingefügt, mit der der Bericht für den ausgewählten Datensatz geöffnet werden soll.
Dazu habe ich unter anderem auch das hier beschriebenem Makro versucht:
viewtopic.php?f=8&t=24562
Jedoch kriege ich hier die Fehlermeldung: „Eigenschaft oder Methode nicht gefunden: drawpage.“
Wodurch wird diese Fehlermeldung verursacht?
Gruß,
eve
Ich verwende OpenOffice 3.3.0 und Windows XP SP3
Ich versuche mich gerade mit Makros in meiner ooBase Datenbank. Bisher habe ich nur etwas Erfahrung mit VBA in Excel. Soweit ich mittlerweile herausgefunden habe, muß ich hier aber OpenOffice Basic verwenden. Leider konnte ich dazu aber sonst nicht viel weitere Information finden. Wie oder wo kann ich denn mehr darüber lernen?
Ganz konkret benötige ich derzeit folgendes:
Ich habe eine Abfrage, ein Formular und einen Bericht. Im Formular habe ich eine Schaltfläche eingefügt, mit der der Bericht für den ausgewählten Datensatz geöffnet werden soll.
Dazu habe ich unter anderem auch das hier beschriebenem Makro versucht:
viewtopic.php?f=8&t=24562
Jedoch kriege ich hier die Fehlermeldung: „Eigenschaft oder Methode nicht gefunden: drawpage.“
Wodurch wird diese Fehlermeldung verursacht?
Gruß,
eve
Ich verwende OpenOffice 3.3.0 und Windows XP SP3
Zuletzt geändert von eve am Mi, 16.03.2011 23:14, insgesamt 1-mal geändert.
Re: Bericht für Datensatz per Makro öffnen
Makro posten am besten mit der Zeile in der der Fehler auftritt - in dem Thread gibt's ja mehrere Makros 
Alternativ: XRAY
g

Alternativ: XRAY
g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Re: Bericht für Datensatz per Makro öffnen
Oh, ja klar, das hatte ich gar nicht realisiert. Es war wohl einfach schon zu spät.
Hier ist also das Makro:
Wenn ich den Code Schritt für Schritt durchgehe kommt in der Zeile
sText = thisComponent.drawpage.forms.getByName("Formular1").getByName("ID").Text ' Bericht für genau diesen Kunden drucken!
die Fehlermeldung: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden:drawpage.
eve
Hier ist also das Makro:
Code: Alles auswählen
Sub DruckAuftrag
Dim sText As String, sSQL As String
Dim oStatement As Object, oReportDoc As Object, oVerbindung As Object
Dim Args(1) As New com.sun.star.beans.PropertyValue
Dim oDataBaseContext As Object, oDataSource As Object
' die folgende Zeile übernimmt die Ausweis-Nummer aus einem Feld des aktiven Formulars
sText = thisComponent.drawpage.forms.getByName("Formular1").getByName("ID").Text ' Bericht für genau diesen Kunden drucken!
oDataBaseContext = CreateUnoService ( "com.sun.star.sdb.DatabaseContext" )
oDataSource = oDataBaseContext.getByName( "DB1" )
oVerbindung = oDataSource.getConnection( "" , "" )
oStatement = oVerbindung.createStatement
sSQL = "UPDATE ""DruckSteuerung"" SET ""ID"" = " + sText ' Hilfstabelle mit der Ausweisnummer des aktiven Kunden beschreiben
oStatement.executeUpdate( sSQL )
Args(0).Name="ActiveConnection" : Args(0).Value=oVerbindung
Args(1).Name="OpenMode" : Args(1).Value="open"
on Error goto Fehler
oReportDoc=oDataSource.DatabaseDocument.ReportDocuments.loadComponentFromURL("Bericht1","_self",2,Args) ' Aufruf des Berichts
oReportDoc.CurrentController.Frame.ContainerWindow.setFocus()
Fehler:
End Sub
sText = thisComponent.drawpage.forms.getByName("Formular1").getByName("ID").Text ' Bericht für genau diesen Kunden drucken!
die Fehlermeldung: BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden:drawpage.
eve
Re: Bericht für Datensatz per Makro öffnen
Der Fehler kommt, weil Du "ThisComponent" verwendest und das Makro aus dem Basic "Modul" heraus startest ... dieses Modul hat keine Drawpage. Wenn Du das Makro per Button aus einem Formualr heraus startest, dann dürfte es diesen Fehler nicht geben.
Ist verwirrend - aber auch irgendwie logisch....
g
Ist verwirrend - aber auch irgendwie logisch....
g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Re: Bericht für Datensatz per Makro öffnen
Doch, das leuchtet mir ein. Ich wollte den Code eben Schritt für Schritt durchgehen. Wenn ich den Code jetzt aber per Button aus dem Formular heraus starte, dann bekomme ich die Fehlermeldung:Ist verwirrend - aber auch irgendwie logisch....
Es ist eine Exception aufgetreten Type:com.sun.star.container.NoSuchElementException Message:.
Worauf bezieht sich das NoSuchElement?
Und was sollte man denn Alternativ zu "ThisComponent" verwenden?
eve
Re: Bericht für Datensatz per Makro öffnen
in welcher Zeile kommt denn der Fehler?Worauf bezieht sich das NoSuchElement?

Brauchst keine Alternative dazu, wenn Du ein Makro aus der dafür vorgesehenen Applikation heraus startest, Mit XRay könntest Du das Objekt "StarDesktop" abfragen, da kannst Du dann erkennen wie Du auf Deine Datei in der das Makro funktionieren soll zugreifen kannst. "ThisComponent" ermittelt einfach nur in welchem Teil des StarDesktops Du Dich derzeit befindest und sucht also Methoden und Properties in ebendiesem. Schau mal da: http://www.starbasicfaq.de/Worinbesteht ... hisCo.html nach - ist ganz informativ.Und was sollte man denn Alternativ zu "ThisComponent" verwenden?
g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Re: Bericht für Datensatz per Makro öffnen
In genau der gleichen Zeile, in der vorher der "drawpage" Fehler aufgetaucht ist, also:in welcher Zeile kommt denn der Fehler?
sText = thisComponent.drawpage.forms.getByName("Formular1").getByName("ID").Text
Ich habe versucht das X-Ray Tool herunterzuladen aber leider scheint das derzeit nicht möglich zu sein. Wenn ich die Seite http://www.ooomacros.org/dev.php#101416 öffne, kommt da nur eine Fehlermeldung.
Danke für den link, da steht ja einiges an Info drin.
eve
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Bericht für Datensatz per Makro öffnen
Bin mir ziemlich sicher, dass Du hier den intern vergebenen Namen MainForm des Formulars verwenden mussteve hat geschrieben:sText = thisComponent.drawpage.forms.getByName("Formular1").getByName("ID").Text
Solange OOoMacros nicht erreichbar ist kannst Du XRAY auch von der Website des Authors laden:eve hat geschrieben:Ich habe versucht das X-Ray Tool herunterzuladen aber leider scheint das derzeit nicht möglich zu sein. Wenn ich die Seite http://www.ooomacros.org/dev.php#101416 öffne, kommt da nur eine Fehlermeldung.
http://bernard.marcelly.perso.sfr.fr/index2.html
Viel Erfolg!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Re: Bericht für Datensatz per Makro öffnen
Soweit war ich auch schon und habe daher den internen Namen unter Eigenschaften auf "Formular1" geändert. Das half aber leider auch nichts.Bin mir ziemlich sicher, dass Du hier den intern vergebenen Namen MainForm des Formulars verwenden musst
eve
Re: Bericht für Datensatz per Makro öffnen
Nein, denn unter diesen Umständen käme der Fehler nur bei Verwendung von StarDesktop.CurrentComponent. ThisComponent hingregen verweist immer auf das, aus Sicht des Makros, letztaktive Dokumentobjekt/FEnster.Der Fehler kommt, weil Du "ThisComponent" verwendest und das Makro aus dem Basic "Modul" heraus startest ...
Und warum? VBA kommt jedenfalls ohne solches Geraffel aus.Ist verwirrend - aber auch irgendwie logisch....
StarDEsktop.CurrentComponent, aber das sollte hier gerade nicht verwendet werden, falls es darum ginge aus der Basic-IDE heraus zu starten.Und was sollte man denn Alternativ zu "ThisComponent" verwenden?
Gruß
Stephan
Re: Bericht für Datensatz per Makro öffnen
vergiss mal die Drawpage (die Du eh nicht findest
) und verwende statt:
thisComponent.drawpage.forms
thisComponent.formdocuments
g

thisComponent.drawpage.forms
thisComponent.formdocuments
g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Re: Bericht für Datensatz per Makro öffnen
Aloha
Es gibt in dieser Zeile genau zwei mögliche Fehlerquellen, die zu der von Dir geschilderten Meldung führen können:
und
Also:
Rechtsklick auf das Textfeld dass die ID enthält, im Kontextmenü -> Kontrollfeld. Dort den Namen rauskopieren oder auf "ID" ändern.
Dann Rechtsklick auf das Textfeld dass die ID enthält, im Kontextmenü -> Formular. Dort den Namen rauskopieren oder auf "Formular1" ändern.
Macht keinen Sinn, da:gogo hat geschrieben:vergiss mal die Drawpage (die Du eh nicht findest) und verwende statt:
thisComponent.drawpage.forms
thisComponent.formdocuments
eve hat geschrieben:Wenn ich den Code jetzt aber per Button aus dem Formular heraus starte
Code: Alles auswählen
sText = thisComponent.drawpage.forms.getByName("Formular1").getByName("ID").Text
Code: Alles auswählen
getByName("Formular1")
Code: Alles auswählen
getByName("ID")
Rechtsklick auf das Textfeld dass die ID enthält, im Kontextmenü -> Kontrollfeld. Dort den Namen rauskopieren oder auf "ID" ändern.
Dann Rechtsklick auf das Textfeld dass die ID enthält, im Kontextmenü -> Formular. Dort den Namen rauskopieren oder auf "Formular1" ändern.
Re: Bericht für Datensatz per Makro öffnen
an
habe ich auch schon gedacht.
Ein Versuch mit dem Index zu suchen könnte auch Klarheit bringen:
Code: Alles auswählen
getByName("ID")
Ein Versuch mit dem Index zu suchen könnte auch Klarheit bringen:
Code: Alles auswählen
Sub LookupFormsUndKontrollelemente
aFormnamen = thisComponent.drawpage.forms.getElementNames()
for iFZaehler = 0 to UBound(aFormnamen())
iAntwort = msgbox("Das Formular mit dem Index " & iFZaehler & " heisst: '" & thisComponent.drawpage.forms.getByindex(iFZaehler).name & "'. Kontrollelemente ansehen?", 4)
if iAntwort = 6 then
aKENamen = thisComponent.drawpage.forms.getbyindex(iFZaehler).getElementNames()
for iKEZaehler = 0 to UBound(aKENamen())
msgbox "Kontrollelement mit Index: " & iKEZaehler & " heisst: '" & thisComponent.drawpage.forms.getByindex(iFZaehler).getbyindex(iKEZaehler).name & "'"
next iKEZaehler
iAntwort = msgbox("Naechstes Formular?",4)
if iAntwort <> 6 then
end
end if
end if
next iFZaehler
msgbox "Fertig :)"
end sub
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Re: Bericht für Datensatz per Makro öffnen
Mann, das ist ja jede Menge Feedback. Ich habe also jetzt im Kontextmenü die Bezeichnungen kontrolliert und nochmal neu eingegeben, aber wieder die gleiche Meldung,... also weitergebastelt.....
Offensichtlich lag das Problem darin, daß ich das Testformular in der Datenblattansicht erstellt habe. Als ich die Darstellung dann über Textfelder gemacht habe, funktionierte es auf einmal. Warum das einen Unterschied macht ist mir (noch) nicht klar, aber irgendwann werde ich da vielleicht auch noch dahinter kommen.
Auf jeden Fall vielen Dank an Euch alle für die ausführliche Hilfe, von selbst hätte ich das nie geschafft.
eve
Offensichtlich lag das Problem darin, daß ich das Testformular in der Datenblattansicht erstellt habe. Als ich die Darstellung dann über Textfelder gemacht habe, funktionierte es auf einmal. Warum das einen Unterschied macht ist mir (noch) nicht klar, aber irgendwann werde ich da vielleicht auch noch dahinter kommen.
Auf jeden Fall vielen Dank an Euch alle für die ausführliche Hilfe, von selbst hätte ich das nie geschafft.
eve
Re: [gelöst] Bericht für Datensatz per Makro öffnen
Haha - gelöst 
... wird einen Fehler ergeben wenn es ein numerisches Feld ist!
Den Wert eines numerischen Feldes musst Du mit:
auslesen.
g

Code: Alles auswählen
.getByName("ID").Text
Den Wert eines numerischen Feldes musst Du mit:
Code: Alles auswählen
.getByName("ID").value
g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5