' Cette macro permet d'automatiser la cration de courriers types  partir d'une base de donnes .
' Cette macro ralise un mailing/publipostage  un tour (ou plusieurs) en fonction des donnes issue d'une base de donnes.
' Les donnes proviennent pour cet exemple d'un fichier texte qui s'appelle TRT.DAT '
' Ce fichier est cr  partir de l'mulateur et provient d'une autre base de donnes car notre base de donnes 
' n'tait pas disponible par ODBC ou JDBC.
' La contrainte lie  cette situation est que Openoffice doit tre referm systmatiquement ( dsactivation du lancement
' rapide avant toute regnration du fichier texte "trt.dat " ce qui ralentit un peu il est vrai la production des courriers.
' Avec une vraie base ODBC , nous n'aurions pas besoin de fermer Openoffice et de dsaciver le lancement rapide.
'
' Le fichier trt.dat contient deux lignes de donnes : le nom des champs et leur contenu
' 1ere ligne : Nom;prnom;age;pronom;fin_adjectif;Civilit;Typcour;.;..;Champ_N         
' 2ime ligne: Michu;Marcelle;63;elle;e;Mme;Convocation_prefecture;...;...;Contenu_N   <-- pas de ";"  la fin !!
' (Pour l'exemple , vous pouvez en crer un  la main avec notepad)
' Attention , il doit y avoir le mme nombre de champs que de contenu et les listes ne se terminent pas par un ";"
'
' Un des courriers s'apellera Convocation_prefecture.sxw et contiendra le texte suivant :
' <Civilit> <Prnom> <Nom> , vous tes convoqu<fin_adjectif>  la prfecture : ce qui ditera automatiquement:
' Mme Michelle Michu, vous tes convoque  la prfecture 
'
'
'
'
' La macro ncessite que la source de donnes soit dj dclare par dfaut pour Openoffice.
'
'	
'	I )Installer Openoffice.org 1.1 fr sans le lancement rapide
'	II)Dsactiver le lancement rapide en cliquant sur l'icne Openoffice.org et
'	dsactiver le lancement automatique systme (Dans le cas ou vous auriez loup
'	l'tape I)
'	III)Faire de trt.dat qui doit se trouver dans le rpertoire c:\fpm une base de donnes
'	Pour a :
'	1)copier le trt.dat dans le rpertoire c:\fpm
'	2)ouvrir le menu Outil-source de donnes
'	3)cliquer sur nouvelle source de donnes
'	4)rciser son nom :trt (en minuscule)
'	5)Dans le menu type de BD :choisir fichier texte 
'	6)dans le menu URL :prciser le chemin c:\fpm
'	Puis rajouter  la main trt.dat afin d'obtenir :sdbc:flat:file:///c:/fpm/trt.dat
'	Cliquer sur Appliquer !
'	Openoffice propose de sauver le nouveau chemin :cliquer sur OK
'	Openoffice refuse :cliquer sur annuler.
'	Passer sur l'onglet texte :choisir comme s arateur de texte :AUCUN
'	et sur extension  ::dat ( rentrer  la main)
'	Cliquer sur Appliquer
'	Dans l'onglet Table :selectionner toutes les tables  et trt 
'	Vrification:
'	Cliquer sur l'icne source de donnes  situe  gauche (petit carr,4ime icone en partant du bas)
'	Selectionner la table trt:la base doit pouvoir se charger.
'	IV Installer la macro Openoffice
'	1)cliquer dans le menu Outil-Macro
'	Sous windows :Copier dans le presse papier le contenu texte du fichier macro_courpubimp.txt
'	Avec Openoffice :donner le nom de la macro :macro_courpubimp
'	diter la macro et copier le contenu du presse papier dans cette macro.
'	Sauvegarder.
'
'
' Les Courriers types (convocation_prefectures.sxw) sont placs dans le rpertoire  C:/Program Files/OpenOffice.org1.1/share/template
' FAQ -> Pourquoi le fichier de donne s'appelle trt.dat : Parce que !
' En fait , les noms de champs , de rpertoires et de procdures ont t gard parce que cette macro 
' fonctionne rellement en prfecture avec un historique  prserver (macro Word)
' Cette macro peut tre certainement amliore (supression du wait 2000 pour les impressions,
' ouverture dynamique du fichier de donnes trt.dat qui permettrait de garder Openoffice en lancement rapide etc...
' Elle peut tre lance par un programme extrieur par la commande :"C:\Program Files\OpenOffice.org1.1\program\soffice.exe"  macro:///Standard.module1.macro_courpubimp
'
' 
'
'						TEXTE DE LA MACRO COURRIER/PUBLIPOSTAGE/IMPRESSION
'--------------------------------------------------------------------------------------------------------
Sub macro_courpubimp
							' Dimensionnement de la valeur de retour de la fonction PubliPostage,
							' pour savoir si la fonction s'est bien passe
	Dim RetourValeur as long
	
							' Lancement de la procdure de publi-postage : attention au chemin d'Openoffice
	RetourValeur = Publipostage("C:/Program Files/OpenOffice.org1.1/share/template/", "trt", "trt")
	
	If RetourValeur then
							' Si problme, on informe l'utilisateur
		MsgBox("Un problme a eu lieu lors de la fonction PubliPostage. Vrifiez votre impression s'il vous plait.")
	endif
 
end sub

Function Publipostage(Chemin as string, ArgNomBase As String, ArgNomTable as String)

on error goto ErreurPubliPostage

' Ouverture du modle et cration d'un nouveau document
Dim oDesktop As Object
Dim oDocument As Object 							' Nouveau document cr  partir du modle
dim tUrl as String 									' Contiendra le chemin complet du fichier modle
Dim NoArgs() as New com.sun.star.beans.PropertyValue' Servira au chagrment du document...et encore on pourrait s'en passer.
Dim oDocClose

' Ncessaire  la fermeture du fichier : on croit rver l !
Dim dispatcher as Object
Dim parser as Object
Dim disp as Object
Dim url	as new com.sun.star.util.URL
Dim oFrame as Object

' Vrification si Chemin possde un "/"  la fin, si non, on en met un. On enlve les espaces devant/derriere.
Chemin=trim(Chemin)
If Right(Chemin,1) <>"/" then
	Chemin=Chemin+"/"
endif

' Connexion au service, ncessaire pour le fonctionnement de toutes les proprits et mthodes
 oDesktop = createUnoService("com.sun.star.frame.Desktop")

' Connexion  la base de donnes et rcupration des enregistrements.
' Celle-ci doit avoir t renseigne dans le menu Outils/Source de donnes, avec les noms indiqus
' Dans la ligne de commande lanant la macro (gnralement "trt", "trt").
' Le premier terme dsigne la base de donnes, le deuxime la table dans la base de donnes.
dim oRowSet as object								' Equivalent d'un Dynaset, autrement dit
													' une "image" dynamique de la table.
dim ChaineSQL as String								' Chaine qui contiendra la requte SQL de chargement du RowSet

' Connexion au service de gestion des base de donnes
 oRowSet = createUnoService("com.sun.star.sdbc.RowSet")

' Dfinition de la base de donnes  atteindre
 oRowSet.SetPropertyValue("DataSourceName",ArgNomBase)

' Chargement de la chane contenant la requte SQL
 ChaineSQL = "select * from " + ArgNomTable

' Affectation de la requte SQL 
 oRowSet.SetPropertyValue("Command",ChaineSQL)

' Excution de la requte SQL
 oRowSet.execute

 'Rcupration du nom des colonnes
dim mData as object									' Contiendra les donnes du RowSet

dim n as integer									
dim NbColonnes as integer							' Le nombre de colonnes du RowSet

    mData = oRowSet.getMetaData() 
	NbColonnes= mData.ColumnCount
	
dim NomColonnes(NbColonnes) As String				' Dimensionnement du tableau des noms de colonnes

   if oRowSet.RowCount > 0 then						' S'il existe des lignes dans la table...
     oRowSet.next()
     for n=0 to NbColonnes - 1
       NomColonnes(n) = mData.getColumnName(n+1)	' On charge le nom des colonnes (1ere ligne)
	 next n
   endif

 'Remplissage des champs
Dim oChamps, tfm, InpFieldEnum, InpField As Object
dim NomColonneChamps as String

  do while not oRowset.isAfterLast  				' Teste si Fin de fichier (EOF)  
	
	' Ouverture du document de la ligne d'enregistrement
	for n=0 to NbColonnes-1
		if NomColonnes(n)="TYPCOUR" then			' Nom de la colonne contenant le nom du fichier modle
			' Chargement de l'Url menant au fichier modle, il faudrait modifier le chemin absolu,
			' Pour le placer en variale de ligne de commande par exemple
			tUrl="file:///" + Chemin + oRowSet.getString(n+1) +".sxw" ' on apelle : convocation_prefecture.sxw
		endif
	next n

	' Chargement du document
	oDocument = oDesktop.LoadComponentFromURL(tUrl,"_blank",0,NoArgs())
	
	' Important : on charge dans oChamps tous les champs du modle,
	' Comprendre les champs qui peuvent tre modifis dans le document modle.
    oChamps = oDocument.getTextFields

	
	' Cration d'une numration des champs texte du modle
	InpFieldEnum = oChamps.createEnumeration()
	
	do while InpFieldEnum.hasMoreElements			' Tant qu'il reste des champs texte pas numrs
		InpField = InpFieldEnum.nextElement()		' Champ suivant : cela signifie que l'numration
													' ne positionne pas au premier champ : IMPORTANT

		' Aucune ide de l'utilit de cette condition...
	    if InpField.supportsService("com.sun.star.text.TextField.Database") then
	      tfm = InpField.getTextFieldMaster()		' Aucune ide de l'utilit de cette ligne...
        											' Apparemment, connecte un objet au champ, pour pas s'en servir...
        											' un peu l'impression qu'on charge beaucoup
        											' trop de valeurs la-dedans...
     
          ' Chargement du nom du champ texte dans le modle, pour vrification ensuite avec le nom des colonnes
          ' dans la base de donnes
          NomColonneChamps = InpField.getTextFieldMaster.getPropertyValue("DataColumnName")
          for n=0 to NbColonnes-1					' De la premire  la dernire colonne de la base donnes...
            if NomColonneChamps = NomColonnes(n) then ' Le nom de la colonne est-il le nom du champ texte ?
               InpField.Content = oRowSet.getString(n+1) ' Si oui, la valeur du champ est charge depuis la BDD
               exit for								' et on sort de la boucle
            endif
          next n
   		endif
    loop  

    oChamps.Refresh 								' Rafraichir tous les champs du document modle
   
    oDocument.print(NoArgs()) 						' Impression...

	oDocClose=StarDesktop.ActiveFrame.Dispose		' Fermeture du document courant
	
 oRowset.next  										' On passe  la ligne suivante
 loop												' Retour case dpart
wait 2000							' Bon, l c'est pas trs propre ! J'aurai prfr avoir une 
								' routine qui attends que l'impression soit termine.
PubliPostage=0

Goto FinPubliPostage

ErreurPubliPostage:
PubliPostage = ERR
MsgBox ("Erreur" & ERR & "." & chr$(13) & ERROR$)

FinPubliPostage:
End Function

'--------------------------------------------------------------------------------------------------------
' Cette macro a t ralise par la simple lecture des documentations Openoffice.org 
' Cette macro est simplement un enchainement de tches lmentaires d'Openoffice.org
' Elle a t ralise par les quipes de la Direction des Systmes d'Information et de Communication 
' du Ministre de l'Intrieur Franais pour ses besoins et avec l'aide de Frdric Vuillod 
' Le code de cette macro est plac sous la licence LGPL (The GNU Lesser General Public License)
' par la volont de ses auteurs.
'						
'					Version 2.1, February 1999
'
'					Copyright (C) 1991, 1999 Free Software Foundation, Inc.
'					59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
'					Everyone is permitted to copy and distribute verbatim copies
'					of this license document, but changing it is not allowed.
'