Seite 1 von 2

[gelöst] Bericht für Datensatz per Makro öffnen

Verfasst: Mo, 14.03.2011 01:02
von eve
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

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Mo, 14.03.2011 14:36
von gogo
Makro posten am besten mit der Zeile in der der Fehler auftritt - in dem Thread gibt's ja mehrere Makros ;)

Alternativ: XRAY

g

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Mo, 14.03.2011 15:12
von eve
Oh, ja klar, das hatte ich gar nicht realisiert. Es war wohl einfach schon zu spät.

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
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

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Mo, 14.03.2011 18:26
von gogo
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

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Di, 15.03.2011 11:02
von eve
Ist verwirrend - aber auch irgendwie logisch....
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:
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

Verfasst: Di, 15.03.2011 11:15
von gogo
Worauf bezieht sich das NoSuchElement?
in welcher Zeile kommt denn der Fehler? ;)
Und was sollte man denn Alternativ zu "ThisComponent" verwenden?
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.

g

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Di, 15.03.2011 23:06
von eve
in welcher Zeile kommt denn der Fehler? ;)
In genau der gleichen Zeile, in der vorher der "drawpage" Fehler aufgetaucht ist, also:
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

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Mi, 16.03.2011 04:23
von komma4
eve hat geschrieben:sText = thisComponent.drawpage.forms.getByName("Formular1").getByName("ID").Text
Bin mir ziemlich sicher, dass Du hier den intern vergebenen Namen MainForm des Formulars verwenden musst

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.
Solange OOoMacros nicht erreichbar ist kannst Du XRAY auch von der Website des Authors laden:

http://bernard.marcelly.perso.sfr.fr/index2.html


Viel Erfolg!

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Mi, 16.03.2011 08:00
von eve
Bin mir ziemlich sicher, dass Du hier den intern vergebenen Namen MainForm des Formulars verwenden musst
Soweit war ich auch schon und habe daher den internen Namen unter Eigenschaften auf "Formular1" geändert. Das half aber leider auch nichts.

eve

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Mi, 16.03.2011 08:15
von Stephan
Der Fehler kommt, weil Du "ThisComponent" verwendest und das Makro aus dem Basic "Modul" heraus startest ...
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.
Ist verwirrend - aber auch irgendwie logisch....
Und warum? VBA kommt jedenfalls ohne solches Geraffel aus.
Und was sollte man denn Alternativ zu "ThisComponent" verwenden?
StarDEsktop.CurrentComponent, aber das sollte hier gerade nicht verwendet werden, falls es darum ginge aus der Basic-IDE heraus zu starten.

Gruß
Stephan

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Mi, 16.03.2011 11:38
von gogo
vergiss mal die Drawpage (die Du eh nicht findest ;) ) und verwende statt:

thisComponent.drawpage.forms

thisComponent.formdocuments

g

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Mi, 16.03.2011 11:57
von DPunch
Aloha
gogo hat geschrieben:vergiss mal die Drawpage (die Du eh nicht findest ;) ) und verwende statt:
thisComponent.drawpage.forms
thisComponent.formdocuments
Macht keinen Sinn, da:
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
Es gibt in dieser Zeile genau zwei mögliche Fehlerquellen, die zu der von Dir geschilderten Meldung führen können:

Code: Alles auswählen

getByName("Formular1")
und

Code: Alles auswählen

getByName("ID")
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.

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Mi, 16.03.2011 13:20
von gogo
an

Code: Alles auswählen

getByName("ID")
habe ich auch schon gedacht.

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

Re: Bericht für Datensatz per Makro öffnen

Verfasst: Mi, 16.03.2011 23:13
von eve
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

Re: [gelöst] Bericht für Datensatz per Makro öffnen

Verfasst: Do, 17.03.2011 12:23
von gogo
Haha - gelöst ;)

Code: Alles auswählen

.getByName("ID").Text
... wird einen Fehler ergeben wenn es ein numerisches Feld ist!

Den Wert eines numerischen Feldes musst Du mit:

Code: Alles auswählen

.getByName("ID").value
auslesen.

g