Hallo Toby
Ich habe dies mit OpenOffice-Makros gemacht und es funktioniert. Ob es mit Java geht, kann ich nicht beantworten.
Gruss
Heinz
Serienbriefe + MySQL Datenbank + OpenOffice Writer
Moderator: Moderatoren
Re: Serienbriefe + MySQL Datenbank + OpenOffice Writer
Hallo Tobyy
Ich habe dir einen Teil aus meinem OpenOffice-Projekt. Dieses läuft unter Linux, Mac und Windows.
Die Abfragen zu den Serienbriefen habe ich in der Datei "boot_db.odb" gespeichert. Die Serienbriefe funktionieren zur Zeit nur mit einem Datenbankbenutzer ohne Passwort.
Die Verbindung zur Datenbank habe ich über ODBC gelöst.
Als erstes muss die Verbindung zur Datenbank hergestellt werden:
In der folgenden Makro wird abgefragt, welcher Serienbrief ausgegeben werden soll. Als nächstes wird die Datenbanktabelle "serienbrief" gefüllt. Diese wird dann für die Serienbriefe wieder eingelesen.
Am besten suchst du im Code nach "SB_mail_merge", dann findest du die relevanten Teile für die Serienbrief-Erstellung.
Falls weitere Fragen auftauchen, kannst du dich wieder melden.
Gruss
Heinz
Ich habe dir einen Teil aus meinem OpenOffice-Projekt. Dieses läuft unter Linux, Mac und Windows.
Die Abfragen zu den Serienbriefen habe ich in der Datei "boot_db.odb" gespeichert. Die Serienbriefe funktionieren zur Zeit nur mit einem Datenbankbenutzer ohne Passwort.
Die Verbindung zur Datenbank habe ich über ODBC gelöst.
Als erstes muss die Verbindung zur Datenbank hergestellt werden:
Code: Alles auswählen
REM ***** BASIC *****
Option explicit
function dbConnection ' Verbindung zur Datenbank herstellen
Dim oBaseContext as object
Dim oDataSource as object
Dim oCon as object
dim dbname as string
dim dbUser as string
dim dbPassword as string
dbname = global_DB_Name
dbUser = global_Ben_Name
dbPassword = global_Ben_Passwd
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
if oBaseContext.hasByName(dbname)=true then
oDataSource = oBaseContext.getByName(dbname)
oCon = oDataSource.getConnection(dbUser,dbPassword)
dbConnection = oCon
else
msgbox "Achtung. Es gibt keine angemeldete Datenbank mit dem Namen" & dbname & _
"Die Datenbank muss unter -> Optionen -> Datenquellen zuerst angemeldet werden.", 16, _
"Verbindung zur Datenbank"
end if
end function
Code: Alles auswählen
REM ***** BASIC *****
Option Explicit
Public SB1Dlg as Object
Public SB2Dlg as Object
Public SB3Dlg as Object
Public sb_inArray(30)
Public sb_array(30)
Public anz_sb as integer
Public eg_inArray(10)
Public bo_inArray(17)
Public pr_inArray(7)
Public pu_inArray(4)
Public pe_inArray(4)
Public bo_ResSet as object
Public eg_ResSet as object
Public pu_ResSet as object
Public pr_ResSet as object
Public pe_ResSet as object
Public oConn as object
Public oStatement as Object
Public sqlString as string
Public sqlString1 as string
Public sqlString2 as string
Public table as string
Public oResultSet as object
Public sb_option_einfach as object
Public sb_option_komplex as object
Public sb_option_alle as object
Public sb_option_mit as object
Public sb_option_ohne as object
Public sb_option_pruef as object
Public sb_option_pend as object
Public sb_option_druck_dr as object
Public sb_option_druck_dt as object
Public sb_doc_name as string
Public sb_anzahl_monat as integer
Public sb_ho_prio as string
Public sb_url as string
Public Print_auf as string
Public sb_name(100)
Public z as integer
Public z1 as integer
Public s_name as string
Public s_plz as string
Public s_typ as string
Public s_hafen as string
dim v1feld as string
dim v2feld as string
dim iCount as integer
dim boot_found as integer
' ************************************** Start Serienbrief ***************************************
Sub serienbrief_steuerung
' Dialog dlgSB1
DialogLibraries.LoadLibrary("Serienbriefe")
SB1Dlg = createUNODialog(DialogLibraries.Serienbriefe.dlgSB1)
Dim sb1_ret as integer
sb1_ret = SB1Dlg.execute() ' Warten auf Eingabe
if sb1_ret = 0 then ' Abbruch / Ende
SB1Dlg.EndExecute() ' Dialog "dlgSB1" schliessen
SB1Dlg.Dispose()
Exit Sub
end if
' Button "Weiter" betätigt
sb_option_einfach = SB1Dlg.GetControl("SB1_OB_einfach")
sb_option_komplex = SB1Dlg.GetControl("SB1_OB_komplex")
if sb_option_einfach.state = true then
einfacher_serienbrief ' Einfacher Serienbrief ausgeben
else
komplexer_serienbrief ' Komplexer Serienbrief ausgeben
end if
msgBox "Serienbrief ist fertig aufbereitet", , "Serienbrief"
End Sub
' ********************************************* Einfacher Serienbrief **************************************
Sub einfacher_serienbrief
' Dialog dlgSB2
DialogLibraries.LoadLibrary("Serienbriefe")
SB2Dlg = createUNODialog(DialogLibraries.Serienbriefe.dlgSB2)
z = 0
getdirs("Einfach", sb_name(), z)
For z1 = 0 to z-1
SB2Dlg.getControl("SB2_LB_Serienbrief").addItem(sb_name(z1),z1)
Next z1
Dim sb2_ret as integer
sb2_ret = SB2Dlg.execute() ' Warten auf Eingabe
if sb2_ret = 0 then ' Abbruch / Ende
SB2Dlg.EndExecute() ' Dialog "dlgSB2" schliessen
SB2Dlg.Dispose()
Exit Sub
end if
' Button "Weiter" betätigt
s_name = SB2Dlg.getControl("SB2_TX_Name").text
s_plz = SB2Dlg.getControl("SB2_TX_Plz").text
sb_option_alle = SB2Dlg.GetControl("SB2_OB_alle")
sb_option_mit = SB2Dlg.GetControl("SB2_OB_mit")
sb_option_ohne = SB2Dlg.GetControl("SB2_OB_ohne")
sb_doc_name = SB2Dlg.getControl("SB2_LB_Serienbrief").SelectedItem
if sb_doc_name = "" then
msgBox "Kein Serienbrief ausgewählt", 48, "Serienbrief"
Exit Sub
end if
s_name = s_name & "%"
s_plz = s_plz & "%"
oConn = dbConnection
oStatement = oConn.createStatement()
sqlString = "SELECT * from eigner WHERE ( eg_name LIKE '" & s_name & "' AND eg_plz LIKE '" & s_plz & "')"
eg_ResSet = oStatement.executeQuery(sqlString)
if not IsNull(eg_ResSet) Then
while eg_ResSet.next ' Datenbank-Felder übertragen
eg_inArray(0) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_id"))
eg_inArray(1) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_anrede"))
eg_inArray(2) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_name"))
eg_inArray(3) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_vorname"))
eg_inArray(4) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_adresse"))
eg_inArray(5) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_plz"))
eg_inArray(6) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_ort"))
eigner_einfach_verarb
wend
end if
Print_auf = "1" ' Ausgabe auf Drucker
sb_url = global_sb_einfach_url & sb_doc_name
SB_mail_merge(global_DB_Name, sb_url, "Serienbrief_einfach") ' Serienbrief drucken
info_loeschen ' Serienbrief-Infos (Sätze) löschen
End Sub
' Satz vom Eigner verarbeiten
Sub eigner_einfach_verarb
if sb_option_alle.state = true then ' Alle Eigner ?
schreiben_serienbrief_einfach
Exit Sub
end if
if sb_option_mit.state = true then ' Eigner mit Boot ?
boot_found = 0
lesen_boot_einf
if boot_found = 1 then
schreiben_serienbrief_einfach
end if
Exit Sub
end if
if sb_option_ohne.state = true then ' Eigner ohne Boot ?
boot_found = 0
lesen_boot_einf
if boot_found = 0 then
schreiben_serienbrief_einfach
end if
Exit Sub
end if
End Sub
' Boot-Info holen
Sub lesen_boot_einf
oConn = dbConnection
oStatement = oConn.createStatement()
sqlString = "SELECT * from boot WHERE ( bo_eigner = '" & eg_inArray(0) & "' AND bo_aktiv IS NULL) LIMIT 1"
bo_ResSet = oStatement.executeQuery(sqlString)
if not IsNull(bo_ResSet) Then
while bo_ResSet.next
bo_inArray(0) = bo_ResSet.getString(bo_ResSet.findcolumn("bo_nummer"))
bo_inArray(1) = bo_ResSet.getString(bo_ResSet.findcolumn("bo_kennzeichen"))
bo_inArray(2) = bo_ResSet.getString(bo_ResSet.findcolumn("bo_eigner"))
bo_inArray(3) = bo_ResSet.getString(bo_ResSet.findcolumn("bo_typ"))
boot_found = 1
Wend
End If
End Sub
' Serienbrief-Info in Tabelle "serienbrief" schreiben
Sub schreiben_serienbrief_einfach
anz_sb = 29
sb_array(0) = "sb_user"
sb_array(1) = "sb_eigner"
sb_array(2) = "sb_anrede"
sb_array(3) = "sb_name"
sb_array(4) = "sb_vorname"
sb_array(5) = "sb_adresse"
sb_array(6) = "sb_plz"
sb_array(7) = "sb_ort"
sb_array(8) = "sb_boot"
sb_array(9) = "sb_kennzeichen"
sb_array(10) = "sb_typ"
sb_array(11) = "sb_jahrgang"
sb_array(12) = "sb_hafen"
sb_array(13) = "sb_anz_pruef"
sb_array(14) = "sb_pruef_1"
sb_array(15) = "sb_termin_1"
sb_array(16) = "sb_pruef_2"
sb_array(17) = "sb_termin_2"
sb_array(18) = "sb_pruef_3"
sb_array(19) = "sb_termin_3"
sb_array(20) = "sb_pruef_4"
sb_array(21) = "sb_termin_4"
sb_array(22) = "sb_pruef_5"
sb_array(23) = "sb_termin_5"
sb_array(24) = "sb_anz_pend"
sb_array(25) = "sb_pendenz_1"
sb_array(26) = "sb_pendenz_2"
sb_array(27) = "sb_pendenz_3"
sb_array(28) = "sb_pendenz_4"
sb_array(29) = "sb_pendenz_5"
sb_inArray(0) = global_Ben_Name ' Name user
sb_inArray(1) = eg_inArray(0) ' Eigner-Nr.
sb_inArray(2) = eg_inArray(1) ' Anrede
sb_inArray(3) = eg_inArray(2) ' Name
sb_inArray(4) = eg_inArray(3) ' Vorname
sb_inArray(5) = eg_inArray(4) ' Adresse
sb_inArray(6) = eg_inArray(5) ' PLZ
sb_inArray(7) = eg_inArray(6) ' Ort
sb_inArray(8) = 0 ' Boot_Nr.
sb_inArray(13) = 0 ' Anzahl Prüfungen
sb_inArray(24) = 0 ' Anzahl Pendenzen
' INSERT-String für Datenbank erstellen
v1feld =" ("
v2feld = " ("
For iCount = 0 To anz_sb
v1feld = v1feld + sb_array(iCount)
v2feld = v2feld + """" & sb_inArray(iCount) & """"
if iCount < anz_sb then
v1feld = v1feld + ", "
v2feld = v2feld + ", "
end if
Next iCount
v1feld = v1feld + ")"
v2feld = v2feld + ")"
oConn = dbConnection
oStatement = oConn.createStatement()
sqlString1 = "INSERT INTO "
table = "serienbrief"
sqlString2 = " VALUES "
sqlString = sqlString1 + table + v1feld + sqlString2 + v2feld
oStatement.executeUpdate(sqlString)
End Sub
' ***************************************************** Komplexer Serienbrief ********************************
Sub komplexer_serienbrief
' Dialog dlgSB3
DialogLibraries.LoadLibrary("Serienbriefe")
SB3Dlg = createUNODialog(DialogLibraries.Serienbriefe.dlgSB3)
z = 0
getdirs("Komplex", sb_name(), z)
For z1 = 0 to z-1
SB3Dlg.getControl("SB3_LB_Serienbrief").addItem(sb_name(z1),z1)
Next z1
Dim sb3_ret as integer
sb3_ret = SB3Dlg.execute() ' Warten auf Eingabe
if sb3_ret = 0 then ' Abbruch / Ende
SB3Dlg.EndExecute() ' Dialog "dlgSB3" schliessen
SB3Dlg.Dispose()
Exit Sub
end if
' Button "Weiter" betätigt
s_name = SB3Dlg.getControl("SB3_TX_Name").text
s_plz = SB3Dlg.getControl("SB3_TX_Plz").text
s_typ = SB3Dlg.getControl("SB3_TX_Typ").text
s_hafen = SB3Dlg.getControl("SB3_TX_Hafen").text
sb_option_pruef = SB3Dlg.GetControl("SB3_CB_Pruefung")
sb_anzahl_monat = SB3Dlg.getControl("SB3_LB_Monat").SelectedItem
sb_option_pend = SB3Dlg.GetControl("SB3_CB_Pendenz")
sb_ho_prio = SB3Dlg.getControl("SB3_LB_Priorität").SelectedItem
sb_doc_name = SB3Dlg.getControl("SB3_LB_Serienbrief").SelectedItem
if sb_doc_name = "" then
msgBox "Kein Serienbrief ausgewählt", 48, "Serienbrief"
Exit Sub
end if
sb_option_druck_dr = SB3Dlg.GetControl("SB3_OB_Drucker")
sb_option_druck_dt = SB3Dlg.GetControl("SB3_OB_Datei")
if sb_option_druck_dr.state = true then
Print_auf = "1" ' Ausgabe auf Drucker
else
Print_auf = "2" ' Ausgabe in Datei
end if
s_name = s_name & "%"
s_plz = s_plz & "%"
oConn = dbConnection
oStatement = oConn.createStatement()
sqlString = "SELECT * from eigner WHERE ( eg_name LIKE '" & s_name & "' AND eg_plz LIKE '" & s_plz & "')"
eg_ResSet = oStatement.executeQuery(sqlString)
if not IsNull(eg_ResSet) Then
while eg_ResSet.next ' Datenbank-Felder übertragen
eg_inArray(0) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_id"))
eg_inArray(1) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_anrede"))
eg_inArray(2) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_name"))
eg_inArray(3) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_vorname"))
eg_inArray(4) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_adresse"))
eg_inArray(5) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_plz"))
eg_inArray(6) = eg_ResSet.getString(eg_ResSet.findcolumn("eg_ort"))
lesen_boot_kom
wend
end if
sb_url = global_sb_komplex_url & sb_doc_name
SB_mail_merge(global_DB_Name, sb_url, "Serienbrief_komplex") ' Serienbrief drucken
info_loeschen ' Serienbrief-Infos (Sätze) löschen
End Sub
' Serienbrief-Info in Tabelle "serienbrief" schreiben
Sub schreiben_serienbrief_komplex
anz_sb = 29
sb_array(0) = "sb_user"
sb_array(1) = "sb_eigner"
sb_array(2) = "sb_anrede"
sb_array(3) = "sb_name"
sb_array(4) = "sb_vorname"
sb_array(5) = "sb_adresse"
sb_array(6) = "sb_plz"
sb_array(7) = "sb_ort"
sb_array(8) = "sb_boot"
sb_array(9) = "sb_kennzeichen"
sb_array(10) = "sb_typ"
sb_array(11) = "sb_jahrgang"
sb_array(12) = "sb_hafen"
sb_array(13) = "sb_anz_pruef"
sb_array(14) = "sb_pruef_1"
sb_array(15) = "sb_termin_1"
sb_array(16) = "sb_pruef_2"
sb_array(17) = "sb_termin_2"
sb_array(18) = "sb_pruef_3"
sb_array(19) = "sb_termin_3"
sb_array(20) = "sb_pruef_4"
sb_array(21) = "sb_termin_4"
sb_array(22) = "sb_pruef_5"
sb_array(23) = "sb_termin_5"
sb_array(24) = "sb_anz_pend"
sb_array(25) = "sb_pendenz_1"
sb_array(26) = "sb_pendenz_2"
sb_array(27) = "sb_pendenz_3"
sb_array(28) = "sb_pendenz_4"
sb_array(29) = "sb_pendenz_5"
sb_inArray(0) = global_Ben_Name ' Name user
sb_inArray(1) = eg_inArray(0) ' Eigner-Nr.
sb_inArray(2) = eg_inArray(1) ' Anrede
sb_inArray(3) = eg_inArray(2) ' Name
sb_inArray(4) = eg_inArray(3) ' Vorname
sb_inArray(5) = eg_inArray(4) ' Adresse
sb_inArray(6) = eg_inArray(5) ' PLZ
sb_inArray(7) = eg_inArray(6) ' Ort
' INSERT-String für Datenbank erstellen
v1feld =" ("
v2feld = " ("
For iCount = 0 To anz_sb
v1feld = v1feld + sb_array(iCount)
v2feld = v2feld + """" & sb_inArray(iCount) & """"
if iCount < anz_sb then
v1feld = v1feld + ", "
v2feld = v2feld + ", "
end if
Next iCount
v1feld = v1feld + ")"
v2feld = v2feld + ")"
oConn = dbConnection
oStatement = oConn.createStatement()
sqlString1 = "INSERT INTO "
table = "serienbrief"
sqlString2 = " VALUES "
sqlString = sqlString1 + table + v1feld + sqlString2 + v2feld
oStatement.executeUpdate(sqlString)
End Sub
' Boot-Info holen
Sub lesen_boot_kom
dim j as integer
oConn = dbConnection
oStatement = oConn.createStatement()
sqlString = "SELECT * from boot WHERE ( bo_eigner = '" & eg_inArray(0) & "' AND bo_aktiv IS NULL) "
bo_ResSet = oStatement.executeQuery(sqlString)
if not IsNull(bo_ResSet) Then
while bo_ResSet.next
bo_inArray(0) = bo_ResSet.getString(bo_ResSet.findcolumn("bo_nummer"))
bo_inArray(1) = bo_ResSet.getString(bo_ResSet.findcolumn("bo_kennzeichen"))
bo_inArray(2) = bo_ResSet.getString(bo_ResSet.findcolumn("bo_eigner"))
bo_inArray(3) = bo_ResSet.getString(bo_ResSet.findcolumn("bo_typ"))
bo_inArray(4) = bo_ResSet.getString(bo_ResSet.findcolumn("bo_jahrgang"))
bo_inArray(5) = bo_ResSet.getString(bo_ResSet.findcolumn("bo_hafen"))
sb_inArray(8) = bo_inArray(0) ' Boot-Nr.
sb_inArray(9) = bo_inArray(1) ' Kennzeichen
sb_inArray(10) = bo_inArray(3) ' Typ
sb_inArray(11) = bo_inArray(4) ' Jahrgang
sb_inArray(12) = bo_inArray(5) ' Hafen
sb_inArray(13) = 0
For j = 14 to 23
sb_inArray(j) = ""
next j
sb_inArray(24) = 0
For j = 25 to 29
sb_inArray(j) = ""
next j
if sb_option_pruef.state = 1 then
lesen_pruefung ' Prüfungen lesen
end if
if sb_option_pend.state = 1 then
lesen_pendenz ' Pendenzen lesen
end if
schreiben_serienbrief_komplex ' Info Serienbrief schreiben
Wend
End If
End Sub
' Prüfungen lesen
Sub lesen_pruefung
dim i as integer
dim zw_string as string
dim v_datum as string
v_datum = neues_datum_rechnen(sb_anzahl_monat)
i = 0
oConn = dbConnection
oStatement = oConn.createStatement() ' Periodische Prüfung lesen und sortieren
sqlString = "SELECT * from pruefung WHERE ( pr_boot = '" & bo_inArray(0) & "' AND pr_sort_date <= '" & v_datum & _
"' AND pr_sort_date > '1910-01-01' ) ORDER BY pr_sort_date ASC LIMIT 5"
pr_ResSet = oStatement.executeQuery(sqlString)
if not IsNull(pr_ResSet) Then
while pr_ResSet.next ' Datenfelder übertragen
pr_inArray(0) = pr_ResSet.getString(pr_ResSet.findcolumn("pr_id"))
pr_inArray(1) = pr_ResSet.getString(pr_ResSet.findcolumn("pr_boot"))
zw_string = pr_ResSet.getString(pr_ResSet.findcolumn("pr_pruef"))
lesen_pruef(zw_string)
zw_string = pr_ResSet.getString(pr_ResSet.findcolumn("pr_sort_date"))
if zw_string <= v_datum then
if zw_string = "1910-01-01" then
pr_inArray(6) = ""
else
pr_inArray(6) = umf_sql_date(zw_string)
end if
end if
if i = 0 then
sb_inArray(14) = pu_inArray(1)
sb_inArray(15) = pr_inArray(6)
end if
if i = 1 then
sb_inArray(16) = pu_inArray(1)
sb_inArray(17) = pr_inArray(6)
end if
if i = 2 then
sb_inArray(18) = pu_inArray(1)
sb_inArray(19) = pr_inArray(6)
end if
if i = 3 then
sb_inArray(20) = pu_inArray(1)
sb_inArray(21) = pr_inArray(6)
end if
if i = 4 then
sb_inArray(22) = pu_inArray(1)
sb_inArray(23) = pr_inArray(6)
end if
i = i + 1
wend
End If
sb_inArray(13) = i
End Sub
' Pendenzen lesen
Sub lesen_pendenz
dim i as integer
dim zw_string as string
i = 0
oConn = dbConnection
oStatement = oConn.createStatement() ' Periodische Prüfung lesen und sortieren
sqlString = "SELECT * from pendenzen WHERE ( pe_boot = '" & bo_inArray(0) & "' AND pe_prio <= '" & _
sb_ho_prio & "' ) ORDER BY pe_prio ASC LIMIT 5"
pe_ResSet = oStatement.executeQuery(sqlString)
if not IsNull(pe_ResSet) Then
while pe_ResSet.next ' Datenfelder übertragen
pe_inArray(0) = pe_ResSet.getString(pe_ResSet.findcolumn("pe_id"))
pe_inArray(1) = pe_ResSet.getString(pe_ResSet.findcolumn("pe_boot"))
pe_inArray(2) = pe_ResSet.getString(pe_ResSet.findcolumn("pe_text"))
if i = 0 then
sb_inArray(25) = pe_inArray(2)
end if
if i = 1 then
sb_inArray(26) = pe_inArray(2)
end if
if i = 2 then
sb_inArray(27) = pe_inArray(2)
end if
if i = 3 then
sb_inArray(28) = pe_inArray(2)
end if
if i = 4 then
sb_inArray(29) = pe_inArray(2)
end if
i = i + 1
wend
End If
sb_inArray(24) = i
End Sub
' ***************************************************** Funktionen ******************************************
' Serienbrief-Namen aus Verzeichnis holen
Function getdirs(art, liste(),z)
dim oSimpleFileAccess as object
dim aFolders as object
dim url as string
dim sFile as string
dim wFile as string
dim x as integer
dim y as integer
dim pos as integer
dim last_pos as integer
dim i as integer
if art = "Einfach" then
url = global_sb_einfach_url
else
url = global_sb_komplex_url
end if
sb_url = url
liste(0) = ""
z = 0
y = 1
oSimpleFileAccess = createUnoService( "com.sun.star.ucb.SimpleFileAccess" )
aFolders = oSimpleFileAccess.getFolderContents( url,true )
For i = LBound( aFolders ) To UBound( aFolders )
sFile = aFolders( i )
if oSimpleFileAccess.isFolder( sFile ) then
x = 0
else
x = Len(sFile)
Do While x > y
pos = InStr(y, sFile, "/")
if pos > 0 then
last_pos = pos
end if
y = y + 1
Loop
liste(z)=Mid(sfile, last_pos+1, x-last_pos)
z = z + 1
end if
Next i
sort_tabelle( liste(),z)
End Function
' Serienbrief-Verzeichnis sortieren
Function sort_tabelle( liste(),z)
Dim Count As Integer
Dim Count2 As Integer
Dim Temp As String
For Count = 0 To z-1
For Count2 = Count + 1 To z-1
if liste(Count) > liste(Count2) Then
Temp = liste(Count)
liste(Count) = liste(Count2)
liste(Count2) = Temp
end If
Next Count2
Next Count
End Function
' Serienbrief ausgeben
Function SB_mail_merge(b_db, url_vorlage, abfr)
Dim MailMerge as object
'Print_auf = "2" ' Druck in Datei <------- wieder entfernen
MailMerge = createunoservice("com.sun.star.text.MailMerge")
MailMerge.ActiveConnection=oConn
MailMerge.DataSourceName=b_db
MailMerge.DocumentURL=url_vorlage
MailMerge.CommandType=com.sun.star.sdb.CommandType.QUERY
MailMerge.Command=abfr
MailMerge.OutputType=Print_auf ' 1 = Drucker, 2 = Datei
if Print_auf = 2 then
MailMerge.OutputType=com.sun.star.text.MailMergeType.FILE
MailMerge.SaveAsSingleFile=True
MailMerge.OutputUrl=global_dr_url
end if
MailMerge.execute(Array())
End Function
' Serienbrief-Info in Tabelle "serienbrief" löschen
Function info_loeschen
oConn = dbConnection
oStatement = oConn.createStatement()
sqlString = "DELETE FROM serienbrief WHERE sb_user = '" & global_Ben_Name & "'"
oStatement.executeUpdate(sqlString)
End Function
' Datum umformen (SQL -> Macro)
Function umf_sql_date(datum)
dim zw_dd as string
dim zw_mm as string
dim zw_yyyy as string
dim zw_datum as date
zw_yyyy = left(datum,4)
zw_mm = mid(datum,6,2)
zw_dd = mid(datum,9,2)
zw_datum = DateSerial(zw_yyyy, zw_mm, zw_dd)
umf_sql_date = zw_datum
End Function
' Lesen Prüfung
Function lesen_pruef(pruef)
oConn = dbConnection
oStatement = oConn.createStatement() ' Periodische Prüfung lesen und sortieren
sqlString = "SELECT * from per_ueberpr WHERE ( pu_id = '" & pruef & "')"
pu_ResSet = oStatement.executeQuery(sqlString)
if not IsNull(pu_ResSet) Then
while pu_ResSet.next ' Datenfelder übertragen
pu_inArray(0) = pu_ResSet.getString(pu_ResSet.findcolumn("pu_id"))
pu_inArray(1) = pu_ResSet.getString(pu_ResSet.findcolumn("pu_text"))
pu_inArray(2) = pu_ResSet.getString(pu_ResSet.findcolumn("pu_periode"))
pu_inArray(3) = pu_ResSet.getString(pu_ResSet.findcolumn("pu_zeit"))
wend
End If
End function
Function neues_datum_rechnen(a_monat)
dim heute as date
dim tag as integer
dim monat as integer
dim jahr as integer
dim neu_date as string
dim form_xxxx as string
dim form_xx as string
dim zw_string as string
form_xxxx = "0000"
form_xx = "00"
heute = date
tag = Day(heute)
monat = Month(heute)
jahr = Year(heute)
monat = monat + a_monat
if monat > 12 then
jahr = jahr + 1
monat = monat - 12
end if
zw_string = Format(jahr, form_xxxx)
neu_date = zw_string & "-"
zw_string = Format(monat, form_xx)
neu_date = neu_date & zw_string & "-"
zw_string = Format(tag, form_xx)
neu_date = neu_date & zw_string
neues_datum_rechnen = neu_date
End Function
Falls weitere Fragen auftauchen, kannst du dich wieder melden.
Gruss
Heinz
Re: Serienbriefe + MySQL Datenbank + OpenOffice Writer
Hi,
ich merk doch so langsam, dass ich von dem ganzen Thema leider überhaupt keine Ahnung hab.
Hab das gleiche Prob, komme aber nicht so richtig klar ....
Ziel ist: Ich suche über mein Formular (Base + MySQL) einen Datensatz und ich erhalte z.B. Name, Ort, etc...
Und nun möchte ich einen Button im Formular drücken, sodass sich ein Dokument (Rechnung) öffnet, welches z.B. Name, Ort, etc.. des ausgewählten Datensatzes in den entsprechenden Serienbrieffeldern enthält.
Bisher hab ich das über eine Dokumentvorlage als Serienbrief mit der gleichen Datenbank gemacht. Jedoch fänd ich es besser, wenn ich einfach 'nen Datensatz aussuchen könnten und dann halt den o.g. Knopf drücken könnte.
Ich such also 'ne Möglichkeit, die Daten eines Formulares in die Serienbrieffelder einer Dokumentvorlage zu schreiben.
Viele Grüße
Rainer
ich merk doch so langsam, dass ich von dem ganzen Thema leider überhaupt keine Ahnung hab.
Hab das gleiche Prob, komme aber nicht so richtig klar ....
Ziel ist: Ich suche über mein Formular (Base + MySQL) einen Datensatz und ich erhalte z.B. Name, Ort, etc...
Und nun möchte ich einen Button im Formular drücken, sodass sich ein Dokument (Rechnung) öffnet, welches z.B. Name, Ort, etc.. des ausgewählten Datensatzes in den entsprechenden Serienbrieffeldern enthält.
Bisher hab ich das über eine Dokumentvorlage als Serienbrief mit der gleichen Datenbank gemacht. Jedoch fänd ich es besser, wenn ich einfach 'nen Datensatz aussuchen könnten und dann halt den o.g. Knopf drücken könnte.
Ich such also 'ne Möglichkeit, die Daten eines Formulares in die Serienbrieffelder einer Dokumentvorlage zu schreiben.
Viele Grüße
Rainer
Re: Serienbriefe + MySQL Datenbank + OpenOffice Writer
Hallo Rainer
Ich habe diese Problem folgendermassen gelöst:
- Datensatz (z.B. Kunde) suchen
- Info z.B. Kunden-Nr. in einen Datenbanksatz (Info-Satz) schreiben
- Writer-Dokument (Vorlage) öffnen
- Makro in Writerdokument führt folgendes aus:
- liest diesen Info-Satz,
- liest den Datensatz (Kunde)
- baut Tabellen auf (für Adresse usw.)
- überträgt die Datenbankfelder (Name usw.) in Tabellenfelder
- druckt diese Dokument aus
Es ist etwas kompliziert. Ev. gäbe es eine einfacher Lösung, aber ich habe keine gefunden.
Gruss
Heinz
Ich habe diese Problem folgendermassen gelöst:
- Datensatz (z.B. Kunde) suchen
- Info z.B. Kunden-Nr. in einen Datenbanksatz (Info-Satz) schreiben
- Writer-Dokument (Vorlage) öffnen
- Makro in Writerdokument führt folgendes aus:
- liest diesen Info-Satz,
- liest den Datensatz (Kunde)
- baut Tabellen auf (für Adresse usw.)
- überträgt die Datenbankfelder (Name usw.) in Tabellenfelder
- druckt diese Dokument aus
Es ist etwas kompliziert. Ev. gäbe es eine einfacher Lösung, aber ich habe keine gefunden.
Gruss
Heinz
Re: Serienbriefe + MySQL Datenbank + OpenOffice Writer
Ich habe das in verschiedenen Varianten gelöst ( aus Calc, aber auch aus ooBase mit MySql-DB heraus )
Die Mimik ist aber immer gleich.
Ich suche mir den passenden Satz aus der Datenbank oder aus dem Calc-Dokument, werfe die zu druckenden Felder in ein Array ud rufe die Druckroutine auf: RunBriefAndReplaceFields(sSource As String, aFields())
In sSource stelle ich den Namen der Vorlage mit den Benutzerfeldern (nicht als Serienbrief - also keine Datenbankanbindung!)
sSource, also die Vorlage erwarte ich im Verzeichnis meiner Anwendung: siehe getLoadedUrl()
Den Rest solltest Du aus dem unten stehenden Code lesen können.
Zum Test beiliegend das Dokument mit den Benutzerfeldern.
Gruß und viel Erfolg
eBayer
Function getLoadedUrl() As String
Dim i As Integer, sURL As String
sURL = ThisComponent.location
i = instr(sURL, "BriefAdressen.ods") - 1
getLoadedUrl = ConvertFromUrl(left(sURL, i))
End Function
Sub RunBriefAndReplaceFields(sSource As String, aFields())
Dim oDesktop As Object, oDocument As Object
Dim myFileProp(0) As New com.sun.star.beans.PropertyValue
oDesktop = createUnoService("com.sun.star.frame.Desktop")
if uCase(GetFileNameExtension(sSource)) = "OTT" then
myFileProp(0).Name = "AsTemplate"
else
myFileProp(0).Name = ""
end if
myFileProp(0).Value = True
oDocument = oDesktop.loadComponentFromURL( sSource, "_blank", 0, myFileProp() )
ReplaceFieldsWithText(oDocument, aFields) ' Eingabefelder werden nun automatisch aus Array "aFields" gefüllt
AutoDruck(oDocument) ' Druck wird nun automatisch gestartet
End Sub
Sub AutoDruck(oDoc)
Dim iCnt As Integer, iMax As Integer
Dim printProp(4) as New com.sun.star.beans.PropertyValue
printProp(0).Name = "Pages"
printProp(0).Value = "1-2"
printProp(1).Name = "CopyCount"
printProp(1).Value = 1
printProp(2).Name = "PaperOrientation"
printProp(2).Value = PORTAIT
printProp(3).Name = "PaperFormat"
printProp(3).Value = A4
oDoc.Print(printProp())
iMax = 1
for iCnt = 0 to iMax
On Error Goto Weiter
wait 1000 ' Druck ist aktiv, darum warten bis fertig
oDoc.close(false)
exit for
Weiter:
next
end sub
Sub ReplaceFieldsWithText(oDoc, aFields)
oTextFieldMasters = oDoc.TextFieldMasters
sTarget = "com.sun.star.text.FieldMaster.User.Zeile1"
sSource = aFields(1) ' Titel
oTextFieldMasters.getByName(sTarget).content = sSource
sTarget = "com.sun.star.text.FieldMaster.User.Zeile2"
sSource = aFields(2) ' Name
oTextFieldMasters.getByName(sTarget).content = sSource
sTarget = "com.sun.star.text.FieldMaster.User.Zeile3"
sSource = aFields(3) ' 2. Name
if len(sSource) = 0 then ' kein 2. Name
sSource = aFields(4) ' Strasse
oTextFieldMasters.getByName(sTarget).content = sSource
sTarget = "com.sun.star.text.FieldMaster.User.Zeile5"
sSource = aFields(5) ' Ort
oTextFieldMasters.getByName(sTarget).content = sSource
else
oTextFieldMasters.getByName(sTarget).content = sSource ' 2. Name vorhanden
sTarget = "com.sun.star.text.FieldMaster.User.Zeile4"
sSource = aFields(4) ' Strasse
oTextFieldMasters.getByName(sTarget).content = sSource
sTarget = "com.sun.star.text.FieldMaster.User.Zeile6"
sSource = aFields(5) ' Ort
oTextFieldMasters.getByName(sTarget).content = sSource
end if
sTarget = "com.sun.star.text.FieldMaster.User.Anrede"
sSource = aFields(6)
if len(aFields(7)) = 0 then
sSource = sSource + "," ' kein Kontakt vorhanden
else
sSource = sSource + " " + aFields(7) + "," ' Kontakt vorhanden
end if
oTextFieldMasters.getByName(sTarget).content = sSource
oDoc.getTextFields().refresh()
End Sub
Die Mimik ist aber immer gleich.
Ich suche mir den passenden Satz aus der Datenbank oder aus dem Calc-Dokument, werfe die zu druckenden Felder in ein Array ud rufe die Druckroutine auf: RunBriefAndReplaceFields(sSource As String, aFields())
In sSource stelle ich den Namen der Vorlage mit den Benutzerfeldern (nicht als Serienbrief - also keine Datenbankanbindung!)
sSource, also die Vorlage erwarte ich im Verzeichnis meiner Anwendung: siehe getLoadedUrl()
Den Rest solltest Du aus dem unten stehenden Code lesen können.
Zum Test beiliegend das Dokument mit den Benutzerfeldern.
Gruß und viel Erfolg
eBayer
Function getLoadedUrl() As String
Dim i As Integer, sURL As String
sURL = ThisComponent.location
i = instr(sURL, "BriefAdressen.ods") - 1
getLoadedUrl = ConvertFromUrl(left(sURL, i))
End Function
Sub RunBriefAndReplaceFields(sSource As String, aFields())
Dim oDesktop As Object, oDocument As Object
Dim myFileProp(0) As New com.sun.star.beans.PropertyValue
oDesktop = createUnoService("com.sun.star.frame.Desktop")
if uCase(GetFileNameExtension(sSource)) = "OTT" then
myFileProp(0).Name = "AsTemplate"
else
myFileProp(0).Name = ""
end if
myFileProp(0).Value = True
oDocument = oDesktop.loadComponentFromURL( sSource, "_blank", 0, myFileProp() )
ReplaceFieldsWithText(oDocument, aFields) ' Eingabefelder werden nun automatisch aus Array "aFields" gefüllt
AutoDruck(oDocument) ' Druck wird nun automatisch gestartet
End Sub
Sub AutoDruck(oDoc)
Dim iCnt As Integer, iMax As Integer
Dim printProp(4) as New com.sun.star.beans.PropertyValue
printProp(0).Name = "Pages"
printProp(0).Value = "1-2"
printProp(1).Name = "CopyCount"
printProp(1).Value = 1
printProp(2).Name = "PaperOrientation"
printProp(2).Value = PORTAIT
printProp(3).Name = "PaperFormat"
printProp(3).Value = A4
oDoc.Print(printProp())
iMax = 1
for iCnt = 0 to iMax
On Error Goto Weiter
wait 1000 ' Druck ist aktiv, darum warten bis fertig
oDoc.close(false)
exit for
Weiter:
next
end sub
Sub ReplaceFieldsWithText(oDoc, aFields)
oTextFieldMasters = oDoc.TextFieldMasters
sTarget = "com.sun.star.text.FieldMaster.User.Zeile1"
sSource = aFields(1) ' Titel
oTextFieldMasters.getByName(sTarget).content = sSource
sTarget = "com.sun.star.text.FieldMaster.User.Zeile2"
sSource = aFields(2) ' Name
oTextFieldMasters.getByName(sTarget).content = sSource
sTarget = "com.sun.star.text.FieldMaster.User.Zeile3"
sSource = aFields(3) ' 2. Name
if len(sSource) = 0 then ' kein 2. Name
sSource = aFields(4) ' Strasse
oTextFieldMasters.getByName(sTarget).content = sSource
sTarget = "com.sun.star.text.FieldMaster.User.Zeile5"
sSource = aFields(5) ' Ort
oTextFieldMasters.getByName(sTarget).content = sSource
else
oTextFieldMasters.getByName(sTarget).content = sSource ' 2. Name vorhanden
sTarget = "com.sun.star.text.FieldMaster.User.Zeile4"
sSource = aFields(4) ' Strasse
oTextFieldMasters.getByName(sTarget).content = sSource
sTarget = "com.sun.star.text.FieldMaster.User.Zeile6"
sSource = aFields(5) ' Ort
oTextFieldMasters.getByName(sTarget).content = sSource
end if
sTarget = "com.sun.star.text.FieldMaster.User.Anrede"
sSource = aFields(6)
if len(aFields(7)) = 0 then
sSource = sSource + "," ' kein Kontakt vorhanden
else
sSource = sSource + " " + aFields(7) + "," ' Kontakt vorhanden
end if
oTextFieldMasters.getByName(sTarget).content = sSource
oDoc.getTextFields().refresh()
End Sub
- Dateianhänge
-
- MeinBrief.ott
- (7.34 KiB) 53-mal heruntergeladen
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008