Seite 1 von 1
Basic: ActiveDocument.MailMerge, Objektvariable nicht belegt
Verfasst: Di, 23.07.2013 14:17
von redderblock
Hallo Forum,
ich versuche mir die Werte eines Serienbriefeldes im Basic-Editor zurück geben zu lassen.
Ich habe in einer Calc-Datei (später auch in Base) eine Spalte names ID (Spalte1, Zeile1) mit einem Wert (55555Auftragsbestätigung, Spalte1, Zeile2) erstellt.
Diese Tabelle habe ich an ein Seriendruckdokument angebunden. Die Tabelle samt Wert sind über "Datenquellen(F4)" im Seriendokument sichtbar.
Ich habe folgendes versucht:
Code: Alles auswählen
Sub DokVariable()
Dim DataToFormat As String
DataToFormat = ActiveDocument.MailMerge.DataSource.DataFields("ID").Value
MsgBox DataToFormat
End Sub
Ich erhalte immer den Fehler, "Objektvariable nicht belegt". Laut meiner Recherche ist das ein Indiz dafür, dass mein Dokument kein echter Serienbrief ist. Das erschient mir aber unlogisch.
Das Feld selber wird als Barcodes3.Tabelle1.ID bzw. <ID> im Writer benannt, meines Wissen sollte es aber über DataFields("ID") ansteuerbar sein, richtig?
Screenshot: https://www.dropbox.com/s/aoumbtewz7mwm ... cSreen.jpg
Zum Hintergrund: Ich möchte später mit dem Mergefield.Value einen Barcode direkt im CodeBehind des Dokuments errechnen, da unsere aktuelle Datenbank keine Barcodes generiert.
Vielen Dank!
Chris
Re: Basic: ActiveDocument.MailMerge, Objektvariable nicht be
Verfasst: Mi, 24.07.2013 00:19
von Stephan
Ich erhalte immer den Fehler, "Objektvariable nicht belegt". Laut meiner Recherche ist das ein Indiz dafür, dass mein Dokument kein echter Serienbrief ist. Das erschient mir aber unlogisch.
Ich habe leider keine Zeit das im Detail zu erklären, nur mit der Zeile (die auch sonst noch Fehler hat):
Code: Alles auswählen
DataToFormat = ActiveDocument.MailMerge.DataSource.DataFields("ID").Value
nimmst Du Bezug auf Etwas was so nicht da ist, denn "ID" hat nicht einen bestimmten Wert, da ja im Normalfall eine ganze Liste von Werten für "ID" da ist.
Was Du brauchst ist nicht der Wert aus der Datenbank, sondern der momentan angezeigte Inhalt des Feldes im Dokument der der Eigenschaft .CurrentPresentation des Feldes entsprechen sollte.
Über das Feld erfährst Du mehr z.B. im Dokument von Pitoniak:
http://www.uni-due.de/~abi070/count.php ... eutsch.pdf
dort Kapitel 14.10. Textfelder und in der dortigen Tabelle wäre es der FEldtyp Database.
Gruß
Stephan
Re: Basic: ActiveDocument.MailMerge, Objektvariable nicht be
Verfasst: Mi, 24.07.2013 11:48
von redderblock
Vielen Dank, Du hast mein Ziel genau verstanden.
Ich habe mit Deinem PDF-Link und mit dieser Vorlage
http://www.oooforum.de/viewtopic.php?t=40434&p=149624
einen Code gebastelt, um überhaupt Zugriff auf meine Felder zu bekommen. Leider ohne Erfolg.
Je nachdem, was ich auskommentiere findet er entweder die Methode .currentpresentation nicht oder .VariableName. Was könnte mein Fehler sein? Ich habe "ID" mittlerweile in "Barcodenummer" umgetauft. Screenshots siehe unten - falls benötigt.
Vielen Dank.
Code: Alles auswählen
Sub DokTest()
Dim oTextFieldCon
Dim oTextFields
Dim field As String
oTextFieldCon = thisComponent.getTextFields()
oTextFields = oTextFieldCon.createEnumeration()
Do while oTextFields.hasMoreElements()
oTextField = oTextFields.nextElement()
field = oTextField.CurrentPresentation
MsgBox field
if oTextField.VariableName = "Barcodenummer" then
MsgBox oTextField.VariableName
end if
loop
End Sub
https://www.dropbox.com/s/b595dnlntxcpl ... tation.jpg
https://www.dropbox.com/s/q5g3lph4qfhjl ... leName.jpg
Re: Basic: ActiveDocument.MailMerge, Objektvariable nicht be
Verfasst: Mi, 24.07.2013 14:29
von Stephan
Was könnte mein Fehler sein?
das Dein Code alle Felder gleich behandelt und das es Felder im Dokument geben kann die garnicht über die Eigenschaft die Du abfragst verfügen.
In folgendem Code wird das, wenig elegant, mitels Rundumschlag per On Error Resume Next gefixt, der Code sollte ansonsten das Gewünschte tun.
Der richtigere Weg , statt On Error ..., wäre den Typ des Feldes zu prüfen und erst wenn tatsächlich ein Seriendruckfeld vorliegt dieses abzufragen.
Code: Alles auswählen
Dim oTextFieldCon
Dim oTextFields
Dim field As String
On Error Resume Next
oTextFieldCon = thisComponent.getTextFields()
oTextFields = oTextFieldCon.createEnumeration()
Do while oTextFields.hasMoreElements()
oTextField = oTextFields.nextElement()
if oTextField.TextFieldMaster.DataColumnName = "Barcodenummer" then
MsgBox oTextField.CurrentPresentation
end if
loop
Gruß
Stephan
Re: Basic: ActiveDocument.MailMerge, Objektvariable nicht be
Verfasst: So, 11.08.2013 14:59
von redderblock
Danke, das funktioniert. Da die Vorlage, die ich mittlerweile zum Bearbeiten erhalten habe keine MailMerge-Felder enthält, sondern lediglich text-input, habe ich es nun im Testcode wie folgt umgesetzt:
Code: Alles auswählen
Sub Newer
Dim oTextFieldCon
Dim oTextFields
Dim oTextField
'On Error Resume Next
oTextFieldCon = thisComponent.getTextFields()
oTextFields = oTextFieldCon.createEnumeration()
oTextField = oTextFields.nextElement()
MsgBox oTextField.TextFieldMaster.DependentTextFields(3).getPropertyValue("Content")
End Sub
Ist das so ok? Mich irritiert das ".nextElement()" ein wenig, da ich ja eigentlich nur einen Wert direkt ansprechen will...
Funktionieren tut das wie gewünscht, ich erhalte den Content im DependentTextField No. 3.
Sofern ihr den obigen Code nicht für grob verkehrt haltet, ist das Thema gelöst. Danke Dir Stephan,
Chris
Re: Basic: ActiveDocument.MailMerge, Objektvariable nicht be
Verfasst: So, 11.08.2013 17:47
von F3K Total
Hi,
Du willst Doch den Wert, der im Feld steht, auslesen, oder?
Wenn ja, geht es einfacher und richtiger. Da du den Namen des Textfeldes kennen solltest, kannst Du auch per "NameAccess" darauf zugreifen.
Angenommen es heißt "Eingabe_Barcode", dann geht dies:
Code: Alles auswählen
Sub Newer
oTextFieldMasters = thisComponent.TextFieldMasters
oTextField = oTextFieldMasters.getByName("com.sun.star.text.fieldmaster.User.Eingabe_Barcode")
msgbox oTextField.Content
End Sub
Gruß R
Re: Basic: ActiveDocument.MailMerge, Objektvariable nicht be
Verfasst: Mo, 12.08.2013 12:30
von redderblock
Hi - das Problem ist, dass mein Dokument keine Feldbezeichner hat. Keine MailMerge-Felder sondern lediglich Text-Input.
Das hat sich leider erst im Verlauf dieses Threads herausgestellt.
Daher bin ich direkt über den Index gegangen.
Re: Basic: ActiveDocument.MailMerge, Objektvariable nicht be
Verfasst: Mo, 12.08.2013 18:26
von F3K Total
Hi,
wenn ich ein Text-Input (Eingabefeld) aus einem Benutzerfeld erzeuge, dann hat es einen Namen.
Gruß R