Leerzeilen/Leerzeichen beim Seriendruck aus Base in Richtung Writer mittels Platzhaltern

Hallo Experten!

Ich habe einen Serienbrief erstellt, der direkt aus der Base Datenbank heraus
mit Daten befruchtet wird, die Felder im Seriendokument sind dabei Platzhalter
(angelehnt an die Vorlage aus dem Base Handbuch von Robert Großkopf).
Funktionieren tut das auf Mausklick, die Daten werden brav befüllt. Allerdings
werden leere Felder einfach nur leer gelassen, d.h. es bleiben Leerzeichen und
Leerzeilen übrig. Wenn man den Serienbriefassistenten benutzt, gibt es
allerdings eine Möglichkeit, leere Felder auszulassen, da werden dann auch
Leerzeilen/zeichen nicht erstellt.

Gibt es eine Möglichkeit das auch für die Platzhalter zu aktivieren? Oder geht
das von der externen Steuerung her gar nicht?

Vielen Dank schon mal fürs Durchlesen.

glg,
fred

- --

Hallo Fred,

ich habe da etwas liegen gehabt, das hier gepostet wurde - gleiches
Problem:
http://www.libreoffice-forum.de/viewtopic.php?f=10&t=14988&sid=e3879a86d8d8b781c054fddc6e5d362c#p35780

Daraus habe ich jetzt den Code so übernommen, dass er auch zu dem
passt, was ich im Handbuch hinterlegt habe. Hier jetzt einfach einmal
der gesamte Code zum Füllen der Textfelder mit Löschmöglichkeit, wenn
ein Textfeld keinen Inhalt hat:
- ---------------
SUB Textfelder_Fuellen
'Zuerst muss im Writer eine Vorlage mit Platzhaltern erstellt werden.
'Einfügen → Feldbefehl → Funktionen → Platzhalter
'Den Platzhalter so nennen, wie die entsprechende Spalte in der
Tabelle / in der Abfrage heißt, deren Inhalt der Platzhalter annehmen
soll.
'Für einfache Zwecke einfach nur "Text" als Typ wählen, mit den
anderen Varianten, z.B. "Grafik" kann man dann fortgeschrittenere
Sachen umsetzen.
'In dem Makro Pfad zur Vorlage hinterlegen und vom Makro die
Platzhalter befüllen lassen.
'Es wird ein neues Dokument gegründet, das direkt mit den Inhalten
gefüllt wird.
'Das Dokument wird geöffnet, ist noch nicht gespeichert.
  DIM oForm AS OBJECT
  DIM oColumns AS OBJECT
  DIM oDB AS OBJECT
  DIM oNewDoc AS OBJECT
  DIM oTextfields AS OBJECT
  DIM oTextfield AS OBJECT
  DIM oViewCursor AS OBJECT
  DIM stColumnname AS STRING
  DIM stDir AS STRING
  DIM stContent AS STRING
  DIM inIndex AS INTEGER
  oForm = thisComponent.Drawpage.Forms.MainForm 'Das Hauptformular wird
angesteuert. Hier könnte auch die Lage des auslösenden Buttons das
Formular selbst ermitteln.
  oColumns = oForm.Columns
  oDB = ThisComponent.Parent ' Der Zugriff auf die URL ist nicht vom
Formular aus direkt möglich. Es muss auf den darüberliegenden Frame
der Datenbank Bezug genommen werden.
  stDir = Left(oDB.Location,Len(oDB.Location)-Len(oDB.Title)) ' Der
Titel der Datenbank wird von der URL abgetrennt.
  stDir = stDir & "Beispiel_Textfelder.ott"
  REM Vorlage öffnen
  DIM args(0) AS NEW com.sun.star.beans.PropertyValue
  args(0).Name = "AsTemplate"
  args(0).Value = True
  oNewDoc = StarDesktop.loadComponentFromURL(stDir,"_blank",0,args)
  REM Textfelder holen
  oViewCursor = oNewDoc.CurrentController.getviewCursor()
  oTextfields = oNewDoc.Textfields.createEnumeration
  DO WHILE oTextfields.hasMoreElements
    oTextfield = oTextfields.nextElement
    IF
oTextfield.supportsService("com.sun.star.text.TextField.JumpEdit") THEN
      stColumnname = oTextfield.PlaceHolder 'Placeholder ist Benennung
für das Textfeld
      IF oColumns.hasByName(stColumnname) THEN 'Wenn der Name des
Textfeldes gleich dem Spaltennamen der Daten ist, die dem Formular
zugrunde liegen ...
        inIndex = oForm.findColumn(stColumnname)
        stContent = oForm.getString(inIndex)
        oViewCursor.GotoRange(oTextfield.Anchor,false)
        oViewCursor.String = stContent
        IF stContent = "" THEN
          oViewCursor.goRight (1, true) 'Mit dieser und der folgenden Zeile
wird der Platzhalter und das anschließende Zeichen gelöscht
          oViewCursor.String = ""
        END IF
      END IF
    END IF
  LOOP
END SUB
- ---------------------------

Ist natürlich schlecht hier heraus zu kopieren. Schau Dir einfach
einmal alle Zeilen an, in der der ViewCursor vorkommt. Der Inhalt wird
jetzt über den Cursor in die Vorlage übertragen, nicht direkt in die
Platzhalter geschrieben.

Gruß

Robert

Hallo Robert,
ich danke Dir vielmals für den Code. Habs ein bisschen auf meine Bedürfnisse
modifiziert und funktioniert (fast) perfekt. Mit einem Leerzeichen hab ich
noch ein Problem aber wenn ich den Code mal verstanden habe, kann ich auch das
lösen =)

Mein nächstes Problem kommt dann mit neuem Thread :confused:

glg,
fred

Hallo Fred,

ich habe da etwas liegen gehabt, das hier gepostet wurde - gleiches
Problem:
http://www.libreoffice-forum.de/viewtopic.php?f=10&t=14988&sid=e3879a86d8d8b78

1c054fddc6e5d362c#p35780

Daraus habe ich jetzt den Code so übernommen, dass er auch zu dem passt,
was ich im Handbuch hinterlegt habe. Hier jetzt einfach einmal der gesamte
Code zum Füllen der Textfelder mit Löschmöglichkeit, wenn ein Textfeld
keinen Inhalt hat: --------------- SUB Textfelder_Fuellen 'Zuerst muss im
Writer eine Vorlage mit Platzhaltern erstellt werden. 'Einfügen →
Feldbefehl → Funktionen → Platzhalter 'Den Platzhalter so nennen, wie die
entsprechende Spalte in der Tabelle / in der Abfrage heißt, deren Inhalt
der Platzhalter annehmen soll. 'Für einfache Zwecke einfach nur "Text" als
Typ wählen, mit den anderen Varianten, z.B. "Grafik" kann man dann
fortgeschrittenere Sachen umsetzen. 'In dem Makro Pfad zur Vorlage
hinterlegen und vom Makro die Platzhalter befüllen lassen. 'Es wird ein
neues Dokument gegründet, das direkt mit den Inhalten gefüllt wird. 'Das
Dokument wird geöffnet, ist noch nicht gespeichert. DIM oForm AS OBJECT DIM
oColumns AS OBJECT DIM oDB AS OBJECT DIM oNewDoc AS OBJECT DIM oTextfields
AS OBJECT DIM oTextfield AS OBJECT DIM oViewCursor AS OBJECT DIM
stColumnname AS STRING DIM stDir AS STRING DIM stContent AS STRING DIM
inIndex AS INTEGER oForm = thisComponent.Drawpage.Forms.MainForm 'Das
Hauptformular wird angesteuert. Hier könnte auch die Lage des auslösenden
Buttons das Formular selbst ermitteln. oColumns = oForm.Columns oDB =
ThisComponent.Parent ' Der Zugriff auf die URL ist nicht vom Formular aus
direkt möglich. Es muss auf den darüberliegenden Frame der Datenbank Bezug
genommen werden. stDir =
Left(oDB.Location,Len(oDB.Location)-Len(oDB.Title)) ' Der Titel der
Datenbank wird von der URL abgetrennt. stDir = stDir &
"Beispiel_Textfelder.ott" REM Vorlage öffnen DIM args(0) AS NEW
com.sun.star.beans.PropertyValue args(0).Name = "AsTemplate" args(0).Value
= True oNewDoc = StarDesktop.loadComponentFromURL(stDir,"_blank",0,args)
REM Textfelder holen oViewCursor =
oNewDoc.CurrentController.getviewCursor() oTextfields =
oNewDoc.Textfields.createEnumeration DO WHILE oTextfields.hasMoreElements
oTextfield = oTextfields.nextElement IF
oTextfield.supportsService("com.sun.star.text.TextField.JumpEdit") THEN
stColumnname = oTextfield.PlaceHolder 'Placeholder ist Benennung für das
Textfeld IF oColumns.hasByName(stColumnname) THEN 'Wenn der Name des
Textfeldes gleich dem Spaltennamen der Daten ist, die dem Formular zugrunde
liegen ... inIndex = oForm.findColumn(stColumnname) stContent =
oForm.getString(inIndex) oViewCursor.GotoRange(oTextfield.Anchor,false)
oViewCursor.String = stContent IF stContent = "" THEN oViewCursor.goRight
(1, true) 'Mit dieser und der folgenden Zeile wird der Platzhalter und das
anschließende Zeichen gelöscht oViewCursor.String = "" END IF END IF END
IF LOOP END SUB ---------------------------

Ist natürlich schlecht hier heraus zu kopieren. Schau Dir einfach einmal
alle Zeilen an, in der der ViewCursor vorkommt. Der Inhalt wird jetzt über
den Cursor in die Vorlage übertragen, nicht direkt in die Platzhalter
geschrieben.

Gruß

Robert

- --