Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Platzhalter - Wert/Inhalt ermitteln für bedingte Textanzeige

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

von DPunch » Mi, 10.03.2010 21:50

tom670 hat geschrieben:DPunch, auch dein neues Listing zeigt keinerlei Wirkung in dem Dokument.
Es passiert einfach gar nichts, nicht einmal eine Fehlermeldung?

Das kommt mir extrem komisch vor - kannst Du überhaupt mit irgendeinem (eigenen) Makro in dem Dokument irgendetwas machen?

Ansonsten würde mich mal interessieren, wie der entsprechende Abschnitt des Dokuments aussieht, wenn Du (Fantasie-)Daten eintragen lässt, sowohl mit als auch ohne Datum (sprich: wenn die Werte in die Platzhalter eingesetzt worden sind).

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

von turtle47 » Mi, 10.03.2010 21:41

Hi Tom,

bei OO.o ist es so (das reimt sich sogar :lol: ), dass wenn man ein Dokument welches selbst Makros enthält mittels eines Makros aufruft die Makros in dem aufzurufenden Dokument unterdrückt werden. Das kann man umgehen, in dem man entsprechende Parameter beim Öffen mitgibt.

Ich weis jetzt nicht genau, ob das auch zutrifft wenn man das Dokument aus einer externen Anwendung aufruft.

Vielleicht hilft Dir der Hinweis das Problem einzugrenzen.

Jürgen

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

von tom670 » Mi, 10.03.2010 21:20

Hallo ihr beiden,

ich habe alles ausprobiert.

Jürgen, deine beiden Dateien funktionieren problemlos. Sowie ich deinen Quellcode allerdings in meiner Vorlage verwende, welche aus dem Programm Büro easy aufgerufen wird, passiert nichts bzw. erhalte ich die Fehlermeldungen.

DPunch, auch dein neues Listing zeigt keinerlei Wirkung in dem Dokument.

Ich vermute schon das hier vielleicht irgendwas gesperrt wird. Ich werde meine Vorlage nochmal komplett neu gestalten. Wobei es auch hier schon Probleme gab und ich eine vorhandene Büro easy Vorlage einfach umgestaltet habe. Und vielleicht liegt genau hier der Grund begraben.

Ich möchte mich bei euch beiden für die Mühe die ihr euch genmacht und die Zeit die ihr investiert habt nochmal recht herzlich bedanken.

Sollte ich zu einer Lösung kommen (oder euch noch etwas einfallen) so werde ich hier das auf alle Fälle posten.

Bis denn,

Tom

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

von DPunch » Mi, 10.03.2010 17:21

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

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

von turtle47 » Di, 09.03.2010 22:12

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) 48-mal heruntergeladen
Feldbefehl prüfen vorhanden.ott
(11.5 KiB) 33-mal heruntergeladen

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

von tom670 » Di, 09.03.2010 21:47

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) 2246 mal betrachtet
Fehler1_turtle47.JPG
Fehler1_turtle47.JPG (15.21 KiB) 2246 mal betrachtet

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

von DPunch » Di, 09.03.2010 13:50

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.

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

von turtle47 » Mo, 08.03.2010 23:04

Hallo Tom,

ersetze die fehlerhafte Zeile durch:

Code: Alles auswählen

oItemServiceDate = false
Jürgen

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

von tom670 » Mo, 08.03.2010 22:59

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) 2272 mal betrachtet

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

von DPunch » Mo, 08.03.2010 12:33

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.

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

von turtle47 » Mo, 08.03.2010 07:46

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

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

von tom670 » So, 07.03.2010 22:56

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

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

von turtle47 » So, 07.03.2010 18:36

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

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

von tom670 » So, 07.03.2010 17:47

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) 2323 mal betrachtet

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

von turtle47 » So, 07.03.2010 03:55

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

Nach oben