Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

tom670
*
Beiträge: 10
Registriert: So, 05.02.2006 16:57

Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von tom670 »

Hallo zusammen,

ich möchte gerne meine Rechnungsvorlage in dem Programm Büro easy von Lexware anpassen.

In dieser Vorlage hat man die Möglichkeit über die Menüleiste diverse vordefinierte Platzhalter einzufügen. Unter anderem gibt es da einen Platzhalter
für das sog. Leistungsdatum.

Da ich nicht bei jeder Position das Datum verwende bzw. vorhanden ist, möchte ich den Wert/Inhalt des Platzhalters (ItemServiceDate) beim Öffnen
der Rechnung für den Ausdruck abfragen, ob denn ein Wert sich in diesem Paltzhalter befindet. Wenn ja, dann soll der Text "Leistungsdatum: " und
danach der Inhalt (Datum) des Platzhalters eingefügt werden. Ist kein Wert vorhanden, dann einfach nichts drucken.

Ich weiß nicht wie die Tabellen oder Felder heißen. Das ist irgendwie gesperrt. Auch schaffe ich es nicht diese Abfrage zu integrieren. Auch mit der
Möglichkeit des bedingten Textes kam ich nicht zu dem gewünschten Erfolg. Entweder kann ich es nicht, oder es ist schlichtweg nicht möglich. Ich habe
auch Testweise versucht mit dem Print-Befehl ein "Hallo" auszugeben wenn sich die ausgefüllte Rechnungsvorlage öffnet. Aber auch das schaffe ich
nicht. Wo muss ich denn so etwas z.b. einfügen (welches Modul)? Vielleicht hilft mir das ja auch schon weiter.

Ich wende mich nun mit meinem Problem vertrauensvoll an euch, mit der Hoffnung, das mir geholfen werden kann.

Vielen, vielen Dank für eure Bemühungen.

Gruß
Tom
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von DPunch »

Aloha
Da ich nicht bei jeder Position das Datum verwende bzw. vorhanden ist, möchte ich den Wert/Inhalt des Platzhalters (ItemServiceDate) beim Öffnen der Rechnung für den Ausdruck abfragen, ob denn ein Wert sich in diesem Paltzhalter befindet.
Wenn ein Platzhalter einen Wert bekommen hat, ist es kein Platzhalter mehr, sondern einfacher Text und kann somit auch nicht mehr als Feld angesprochen werden.

Insofern müsstest Du vielleicht mal ein Beispiel hervorzaubern, wie es aussieht, wenn ein Wert eingetragen ist bzw. wenn kein Wert eingetragen ist.
Ansonsten könnte ich hier nur vollkommen im Dunkeln rumstochern.
tom670
*
Beiträge: 10
Registriert: So, 05.02.2006 16:57

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von tom670 »

Hallo DPunch,

ich habe mal einen Screenshot beigefügt wie das im Writer aussieht. Ich möchte nun, das der Text "Leistungserbringung inkl. Datum" nur angezeigt wird, wenn auch tatsächlich ein Datum (ItemServiceDate) dazu existiert. Das Datum selbst kann bei der Rechnungserstellung in Büro easy bei jeder Position angegeben werden (oder auch nicht). Wie oder mit welchen Mitteln kann ich das Abfragen?

Danke für die Unterstützung.

Gruß
Tom
Dateianhänge
Platzhalter Screenshot
Platzhalter Screenshot
Platzhalter.JPG (32.25 KiB) 2329 mal betrachtet
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von turtle47 »

Hi Tom,
tom670 hat geschrieben:Wie oder mit welchen Mitteln kann ich das Abfragen?
Versuche es mal so:

Code: Alles auswählen

Sub Platzhalter_finden
Dim oItemServiceDate as boolean
	oDoc = thisComponent
	oItemServiceDate = false
	oTxtFelder = oDoc.getTextFields().createEnumeration()
	do while oTxtFelder.hasmoreElements()
	oFeld = oTxtFelder.nextElement
'	xray ofeld
	if oFeld.Placeholder = "ItemServiceDate" then
	oItemServiceDate = True
	end if
	loop
	if oItemServiceDate = true then
	MsgBox "Mache nichts und beende weil kein Datum vorhanden! "
	Exit Sub
	end if
	MsgBox "Tu irgendwas weil Datum vorhanden! "
End Sub
Solche Dinge kann man sehr schnell rausfinden wenn man sich xray und das zugehörige SDK installiert.

Viel Erfolg.

Jürgen
Zuletzt geändert von turtle47 am Mo, 08.03.2010 23:05, insgesamt 1-mal geändert.
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
tom670
*
Beiträge: 10
Registriert: So, 05.02.2006 16:57

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von tom670 »

Hallo turtle47,

wo soll ich deinen Quellcode unterbringen, damit sich dieser automatisch beim Öffnen der Vorlage ausführt?

Wie du aus dem beigefügten Screenshot entnehmen kannst habe ich deine Prozedur in meiner Rechnungsvorlage unter "Standard - Default" abgelegt. Dort liegen auch schon Prozeduren für Büro easy.

Vielleicht ein Hinweis zu Büro easy:

Man erstellt in dem Programm seine Rechnung für einen Kunden indem man Position für Position eingibt. Wenn alle Positionen erfasst sind gibt es einen Button der da "OpenOffice" heißt. Sowie man diesen anklickt muss man noch seine Rechnungsvorlage auswählen. Anschließend öffnet sich Writer mit der bereits vollständig ausgefüllten Rechnung.

Danke für die Hilfe.

Gruß
Tom
Dateianhänge
Ort.JPG
Ort.JPG (33.52 KiB) 2309 mal betrachtet
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von turtle47 »

Hi Tom,
tom670 hat geschrieben: wo soll ich deinen Quellcode unterbringen, damit sich dieser automatisch beim Öffnen der Vorlage ausführt?
Das ist eigentlich egal in welchem Modul des Dokumentes er liegt.
Du musst Ihn nur unter Menue > Extras > Anpassen > Reiter Ereignisse der entsprechenden Aktion das Makro zuweisen.

Bei einer Vorlage (.ott) ist das "Neues Dokument"
Bei einem Dokument (.odt) ist das "Dokument öffnen"

Dir sollte aber klar sein, dass die Makros in jedem Dokument vorhanden sind und somit gespeichert und weitergegeben werden!

Wenn Du nur auf einem Rechner damit arbeitest kann man das umgehen, indem Du die Makros in einer eigenen Bibliothek unter "Meine Makros" ablegst.
Diese eigene Bibliothek kann man dann als Extension exportieren, für den Fall der Fälle, oder aber auch zur Übertragung auf andere Rechner.

Oder aber man löscht alle Module in dem Dokument mittels eines kleinen Skripts. Dann ist nur noch das Löschscript vorhanden.

Ich hoffe das bringt etwas Licht ins Dunkel?

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
tom670
*
Beiträge: 10
Registriert: So, 05.02.2006 16:57

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von tom670 »

Hallo turtle47,

erst einmal vielen Dank das du dir hier so die Zeit für mich nimmst.
Es geht immer Stück für Stück weiter und ich lerne hier dazu.

Ich habe das so gemacht wie du es mir beschrieben hast. (Meine Version von OpenOffice ist die 3.1)

Wenn sich nun das neue Dokument öffnet erhalte ich die Meldung, das eine Variable nicht deklariert ist.
Bei oDoc kann ich mir denken, das es sich um ein Objekt handelt. Aber was sind oTxtFelder und oFeld?

Danke für die Info.

Viele Grüße
Tom
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von turtle47 »

Hallo Tom,
tom670 hat geschrieben:Wenn sich nun das neue Dokument öffnet erhalte ich die Meldung, das eine Variable nicht deklariert ist.
Es ist immer wichtig zu wissen welche Zeile in der IDE angezeigt wird wenn die Fehlermeldung kommt.
tom670 hat geschrieben:Aber was sind oTxtFelder und oFeld?
Nun ja, das sind Variablen die hier in diesem Fall mit Objekten "gefüllt" werden.

Mehr zu Variablen findest Du auf Michaels Seite, sowie andere Dinge.

Jetzt zu Deinem Problem. Zuerst dachte ich, dass die Platzhalter nicht gefunden würden weil sie in einer Tabelle liegen.
Das habe ich jetzt aber ausgeschlossen.

Kannn es sein, dass Du in Deinem Modul oben

Code: Alles auswählen

Option Explicit
stehen hast?

Wenn das der Fall ist, dann muss wirklich jede einzelne Variable definiert werden.

Ersetze deshalb mal den oberen Teil der Sub wie folgt:

Code: Alles auswählen

Sub Platzhalter_finden
Dim oItemServiceDate as boolean
Dim odoc as Object
Dim oTxtFelder as Object
Dim oFeld as Object
   oDoc = thisComponent
Und, funktioniert es jetzt?

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von DPunch »

Aloha

Versuch mal das hier:

Code: Alles auswählen

	Dim oDoc as Object, TextFields as Object
	Dim thisField as Object, oCursor as Object, Anchor as Object
	oDoc = thiscomponent
	TextFields = oDoc.TextFields.createEnumeration
	
	Do While TextFields.hasMoreElements
		thisField = TextFields.NextElement
		If thisField.supportsService("com.sun.star.text.textfield.JumpEdit") Then
			If thisField.Placeholder = "ItemServiceDate" Then
				oCursor = oDoc.CurrentController.getViewCursor
				Anchor = thisField.Anchor
				oCursor.gotoRange(Anchor,False)
				oCursor.gotoStartOfLine(True)
				oCursor.Text.setString("")
				Exit Sub
			End If
		End If
	Loop
Hast Du zufällig Zugriff auf die Routinen, in denen die Werte in die Platzhalter eingetragen werden?
Ich halte es für besser, wenn der Text "Leistungserbringung:" Teil des in den Platzhalter eingetragenen Textes ist.
Sprich beim Ersetzen der Platzhalter wird nicht nur das Datum eingetragen, sondern eben direkt "Leistungserbringung: >>Datum<<".
Fehlt das Datum, steht auch keine einsame Leistungserbringung irgendwo im Raum.
tom670
*
Beiträge: 10
Registriert: So, 05.02.2006 16:57

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von tom670 »

Hallo turtle47,
Hallo DPunch,

ich habe eure Lösungsvorschläge ausprobiert.

@turtle47
Die Zeile "Option Explicit" existiert. Daher habe ich den Quellcode deines Programms entsprechend deiner Anleitung ersetzt.
Nun erhalte ich die Fehlermeldung s. Fehler_turtle47.jpg weiter unten.

@DPunch
Einen Zugriff auf die Routinen habe ich nicht. Die sind mit einem Passwort geschützt. Es existieren zwar einige Codezeilen welche sich auf Platzhalter beziehen, aber das sieht mir mehr nach dem Aufbau von den zur Verfügung gestellten Menüleisten aus. Hier ein Beispiel:

Code: Alles auswählen

	sub InsertBelegnummer
		InsertPlaceholder("TransNumber", "Belegnummer")
   end sub
Wenn ich deinen Lösungsvorschlag ausführe, dann ist die Artikelzeile inkl. der Zeile mit dem Leistungsdatum 'leer'. Also die ganze Zelle hat keinen Inhalt mehr. Dabei ist es egal, ob es ein Leistungsdatum gibt oder nicht.

Ferner sind mir noch 3 Prozeduren aufgefallen. Ich weiß nicht wann diese ausgeführt werden, aber eine ähnelt deinem Code. Vielleicht kannst du damit was anfangen:

Code: Alles auswählen

Sub Example_RemoveAllPlaceholders
	dim oDoc as object
	dim oEnum as object
	dim oTField as object
	dim anc as object
	dim StyleFamilies as object
	dim PageStyles as object
	dim DefPage as object
	dim header as object
	
	oDoc = ThisComponent	
	
     StyleFamilies = oDoc.StyleFamilies
     PageStyles = StyleFamilies.getByName("PageStyles")
     DefPage = PageStyles.getByName("Standard")

	
	header=DefPage.headertext
	header.TextFields.createEnumeration
  	header.setString("Hallo")
	
	oEnum = oDoc.TextFields.createEnumeration
	
	Do While oEnum.hasMoreElements
		oTField = oEnum.nextElement
		If oTField.supportsService("com.sun.star.text.TextField.JumpEdit") Then
			
			anc = oTField.getAnchor()
			oDoc.Text.insertString(anc, ">>>>test<<<<", true)
			'oDoc.Text.removeTextContent(oTField)
		End If
	Loop

End Sub


sub Test
	InsertPlaceholder("a1", "b1")
	InsertPlaceholder("a2", "b2")
	InsertPlaceholder("a3", "b3")
	InsertPlaceholder("a4", "b4")
	InsertPlaceholder("a5", "b5")
end sub

sub InsertPlaceholder(nameString as String, tipString as String)
	rem ----------------------------------------------------------------------
	rem define variables
	dim document   as object
	dim dispatcher as object
	rem ----------------------------------------------------------------------
	rem get access to the document
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

	rem ----------------------------------------------------------------------
	dim args1(5) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "Type"
	args1(0).Value = 38
	args1(1).Name = "SubType"
	args1(1).Value = 0
	args1(2).Name = "Name"
	args1(2).Value = nameString
	args1(3).Name = "Content"
	args1(3).Value = tipString
	args1(4).Name = "Format"
	args1(4).Value = 0
	args1(5).Name = "Separator"
	args1(5).Value = " "
	
	dispatcher.executeDispatch(document, ".uno:InsertField", "", 0, args1())

end sub
Danke für eure Hilfe.

Gruß
Tom
Dateianhänge
Fehler_turtle47.JPG
Fehler_turtle47.JPG (29.15 KiB) 2258 mal betrachtet
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von turtle47 »

Hallo Tom,

ersetze die fehlerhafte Zeile durch:

Code: Alles auswählen

oItemServiceDate = false
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von DPunch »

Aloha
tom670 hat geschrieben:Wenn ich deinen Lösungsvorschlag ausführe, dann ist die Artikelzeile inkl. der Zeile mit dem Leistungsdatum 'leer'. Also die ganze Zelle hat keinen Inhalt mehr. Dabei ist es egal, ob es ein Leistungsdatum gibt oder nicht.
Versuch mal, eine Rechnung zu erstellen, und dann erst manuell mein vorgeschlagenes Makro auszuführen.
Das hört sich stark so an, als wäre mein Makro vor dem anderen zum Einsatz gekommen, so dass in ItemServiceDate natürlich noch gar nichts drin stehen konnte und daher gelöscht wurde.
Dass die ganze Zelle leer ist, sollte eigentlich nicht sein, aber das lässt sich problemlos ändern.
Einen Zugriff auf die Routinen habe ich nicht. Die sind mit einem Passwort geschützt. Es existieren zwar einige Codezeilen welche sich auf Platzhalter beziehen, aber das sieht mir mehr nach dem Aufbau von den zur Verfügung gestellten Menüleisten aus.
Die Prozedur ruft eine andere Prozedur zum Einfügen der Platzhalter als solche in das Dokument auf und ist wohl nur bei der Erstellung der Rechnungsvorlage zum Einsatz gekommen.
Ferner sind mir noch 3 Prozeduren aufgefallen. Ich weiß nicht wann diese ausgeführt werden, aber eine ähnelt deinem Code. Vielleicht kannst du damit was anfangen(...)
Das sieht nach etwas holprigen ersten Schritten in der Makro-Programmierung aus, vermutlich waren das ein paar Test-Prozeduren, die der ursprüngliche Ersteller sich zusammengebastelt hat. Die können leider nicht zur Problemlösung beitragen.
tom670
*
Beiträge: 10
Registriert: So, 05.02.2006 16:57

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von tom670 »

Hallo turtle47,
hallo DPunch,

zuerst habe ich den Vorschlag von turtle47 ausprobiert. Nachdem ich den Variablennamen abgeändert habe und eine Rechnung erstellte bekam ich die Fehlermeldung <Fehler1_turtle47>.

Als ich es anschließend gleich nochmal versuchte, erhielt ich den Fehler <Fehler2_turtle47>.

Danach habe ich das automatische Ausführen des Makros beim öffnen des Dokumentes unterbunden und den Code von DPunch manuell ausgeführt. Ich hoffe ich habe das richtig gemacht. Als ich das Dokument vor mir hatte, klickte ich auf Extras - Makros - Makro ausführen und wählte die entsprechende Prozedur. Aber da passierte nichts. Egal ob ein Datum vorhanden war oder nicht.

Wäre vielleicht das eine Lösung:

Besteht die Möglichkeit nach dem Wort "Leistungsdatum" in allen Zellen zu suchen und ob anschließend noch ein paar Zeichen folgen (=Datum) bzw. ob danach überhaupt noch was kommt in dieser Zeile. Sollten noch Zeichen folgen, dann passt ja alles. Sollten allerdings keine Zeichen mehr folgen, dann das Wort "Leistungsdatum" bzw. die Zeile (nicht die Zelle) löschen.

Leider habe ich auch hier keine Ahnung wie das funktionieren könnte.

Danke für eure Unterstützung. Eure Geduld mit mir muss man wirklich an dieser Stelle hervorheben.

Gruß
Tom
Dateianhänge
Fehler2_turtle47.JPG
Fehler2_turtle47.JPG (44.85 KiB) 2232 mal betrachtet
Fehler1_turtle47.JPG
Fehler1_turtle47.JPG (15.21 KiB) 2232 mal betrachtet
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von turtle47 »

Hi Tom,

langsam hebe ich keinen Plan mehr was da bei Dir schiefläuft.
Ich hänge Dir mal zwei Dokmente an. Eine .odt und eine .ott.

Beide laufen bei mir einwandfrei.

Beim Öffnen wird die Meldung ausgegeben, dass kein Datum vorhanden ist.
Wenn Du den Platzhalter entfernst und die Schaltfläche drückst kommt die andere Medung.

Weiterhin viel Geduld.

Jürgen
Dateianhänge
Feldbefehl prüfen vorhanden.odt
(11.48 KiB) 47-mal heruntergeladen
Feldbefehl prüfen vorhanden.ott
(11.5 KiB) 33-mal heruntergeladen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Beitrag von DPunch »

Aloha
tom670 hat geschrieben:Wäre vielleicht das eine Lösung:

Besteht die Möglichkeit nach dem Wort "Leistungsdatum" in allen Zellen zu suchen und ob anschließend noch ein paar Zeichen folgen (=Datum) bzw. ob danach überhaupt noch was kommt in dieser Zeile. Sollten noch Zeichen folgen, dann passt ja alles. Sollten allerdings keine Zeichen mehr folgen, dann das Wort "Leistungsdatum" bzw. die Zeile (nicht die Zelle) löschen.
Ja, das ist machbar.

Code: Alles auswählen

   oDoc = thisComponent
	oSearchDescriptor = oDoc.createSearchDescriptor
	With oSearchDescriptor
		.searchWords = True
		.searchString = "Leistungserbringung:"
	End With
	oResult = oDoc.findAll(oSearchDescriptor)
	If oResult.Count = 0 Then
		Exit Sub
	End If
	oCursor = oResult(0).Text.createTextCursor
	oCursor.gotoRange(oResult(0),False)
	If NOT oCursor.gotoNextWord(False) OR NOT oCursor.isStartofWord Then
		oCursor.gotoRange(oResult(0),False)
		oCursor.gotoPreviousWord(False)
		oCursor.gotoStart(True)
		oCursor.Cell.String = oCursor.String
	End If
Hat irgendwie was von Holzhammer-Methode, aber seis drum.

Vorausgesetzt ist nur, dass die Leistungserbringung in einer Tabelle steht.
Dieses Makro einfach nach dem Makro für die Platzhalter laufen lassen
Antworten