Serienbriefe + MySQL Datenbank + OpenOffice Writer

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

Moderator: Moderatoren

Heinz Bär
****
Beiträge: 130
Registriert: Mo, 28.03.2005 11:20
Wohnort: CH-6467 Schattdorf

Re: Serienbriefe + MySQL Datenbank + OpenOffice Writer

Beitrag von Heinz Bär »

Hallo Toby

Ich habe dies mit OpenOffice-Makros gemacht und es funktioniert. Ob es mit Java geht, kann ich nicht beantworten.

Gruss
Heinz
Heinz Bär
****
Beiträge: 130
Registriert: Mo, 28.03.2005 11:20
Wohnort: CH-6467 Schattdorf

Re: Serienbriefe + MySQL Datenbank + OpenOffice Writer

Beitrag von Heinz Bär »

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:

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
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.

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
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
office123
Beiträge: 3
Registriert: Sa, 17.03.2007 14:38

Re: Serienbriefe + MySQL Datenbank + OpenOffice Writer

Beitrag von office123 »

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
Heinz Bär
****
Beiträge: 130
Registriert: Mo, 28.03.2005 11:20
Wohnort: CH-6467 Schattdorf

Re: Serienbriefe + MySQL Datenbank + OpenOffice Writer

Beitrag von Heinz Bär »

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
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Serienbriefe + MySQL Datenbank + OpenOffice Writer

Beitrag von eBayer »

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
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
Antworten