[Résolu][Calc] Actualisation des données publipostage

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Frédérick
Membre lOOyal
Membre lOOyal
Messages : 49
Inscription : 05 déc. 2017 14:17

[Résolu][Calc] Actualisation des données publipostage

Message par Frédérick »

Bonjour à tous

Dans la foulée de mon post précédent sur le publipostage piloté depuis Calc (https://forum.openoffice.org/fr/forum/v ... 583922ac25), j'ai une nouvelle question.

Je ne sais pas trop si ça concerne la section calc ou writer, ou d'ordre plus général.
C'est un comportement que j'ai déjà observé depuis writer lorsque je fais en direct un publipostage. Si je modifie le contenu de la base sous calc avant de faire un publipostage, je dois commencer par fermer tous les documents libreoffice ouvert, et même tuer les processus quand il y en reste, afin de permettre au publipostage de prendre en compte les nouvelles données.
Moi, j'ai mis en place une macro calc qui lance le publipostage directement depuis le fichier calc qui me sert de base. C'est donc dommage de devoir tout refermer pour prendre en compte les nouvelles données.
Existe-t-il un moyen de forcer la mise à jours des données afin de pouvoir lancer le publipostage directement sur les nouvelles données ?

Merci à vous
Dernière modification par Frédérick le 22 févr. 2018 08:42, modifié 1 fois.
Windows 7
LibreOffice 4.3.7.2
Et en plus, on ne m'a pas demandé mon avis :-(
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Actualisation de la base de données publipostage

Message par Dude »

Frédérick a écrit :C'est donc dommage de devoir tout refermer pour prendre en compte les nouvelles données.
Ce qui est dommage, c'est de ne pas faire un minimum de recherche :
https://forum.openoffice.org/fr/forum/v ... blipostage
Frédérick
Membre lOOyal
Membre lOOyal
Messages : 49
Inscription : 05 déc. 2017 14:17

Re: [Calc] Actualisation de la base de données publipostage

Message par Frédérick »

J'avais vu ce sujet mais :

- l'auteur indique : "ce n'est surement pas la bonne solution" et comme votre politique de balisage est très stricte, ça peut avoir pour conséquence de laisser un doute sur l'aspect effectif de la solution proposée. J'ai récemment balisé résolu un post pour lequel je n'avais pas la solution. Et j'ai pris soin d'indiquer que je n'avais pas ccette solution pour ne pas laisser de place au doute.

- j'ai essayé à la fois le dispose et le store et ... ça ne marche pas

Voici mon code à l'état brut :

fonction de publipostage à proprement parler

Code : Tout sélectionner

Sub Publipostage (vModele as string, vRepDest as string, vNomSortie as string, vNomSource as string, vDonnees as string, vRequete as string, vMultiFichier as boolean) 

	dim vMailing, vLettreType as Object
	dim vProps() as string
	' variables pour le fonctionnement de la requête sql 
	dim vRowSet as Variant
	
	vRowSet = createUnoService("com.sun.star.sdb.RowSet")
	vRowSet.DataSourceName = vNomSource
	vRowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND
	vRowSet.Command = vRequete
	vRowSet.execute()
	
	vMailing = createUnoService("com.sun.star.text.MailMerge") 
	with vMailing 
		.DataSourceName = vNomSource 
		.CommandType = com.sun.star.sdb.CommandType.TABLE 
		.Command = vDonnees
		.ResultSet = vRowSet
		.SaveAsSinglefile = vMultiFichier
		.FileNamePrefix = vNomSortie
		.OutputType = com.sun.star.text.MailMergeType.FILE 
		.DocumentURL = ConvertToURL(vModele)
		.OutputURL = ConvertToURL(vRepDest)
		.Execute(vProps())
	end with
	
	vMailing.dispose()

End sub
et la fonction à partir de laquelle je lance le publipostage.

Code : Tout sélectionner

Sub ImprimePochettes()

	dim vModel, vRepDest, vNomSortie, vSource, vFeuille, vRequete as String
	dim vPochettes as Object
	dim PropFich(0) as New com.sun.star.beans.PropertyValue
		
	vModel = ConvertToURL(RepTravail & "chemises.odt")
	vRepDest = ConvertToURL(RepTravail & "Res\")
	vNomSortie = "Pochettes"
	vSource = "Programmation"
	vFeuille = "Courante"
	
	'on enregistre les données pour actualisation de la BdD
        thisComponent.store()
	
	'on supprime l'éventuel publipostage précédent qui n'a plus d'utilité
        if FileExists(vRepDest & "Pochettes0.odt") Then
		msgbox "Suppression du fichier existant"
		Kill(vRepDest & "Pochettes0.odt")
	end if

	
	'vRequete va contenir la requête sql à exécuter dans la table
	'sélecton sur le code, les dates, le nom et nom1 des animateurs
	'dates est le champ "du .. au" afin d'éviter les soucis liés aux requêtes SQL sur les format date 
	vRequete = "select * from " & vFeuille & " WHERE ""Observations"" = 'Impr'"
	
	Publipostage(vModel, vRepDest, vNomSortie, vSource, vFeuille, vRequete, True)
	
	' Ouvrir le document pour permettre son impression
	vPochettes = StarDesktop.LoadComponentFromURL(ConvertToURL(vRepDest & "Pochettes0.odt"),"_Default",0,propFich())
	
end sub
Voilà en pièce jointe un fichier anonyme sur lequel j'applique ces fonctions, sans succès.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Windows 7
LibreOffice 4.3.7.2
Et en plus, on ne m'a pas demandé mon avis :-(
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Actualisation de la base de données publipostage

Message par Dude »

Frédérick a écrit :comme votre politique de balisage est très stricte, ça peut avoir pour conséquence de laisser un doute sur l'aspect effectif de la solution proposée
Tu le précises toi-même :
Frédérick a écrit :j'ai mis en place une macro calc qui lance le publipostage directement depuis le fichier calc
Pour moi, un publipostage se lance depuis Writer.
Donc, la solution de faire cela dans Calc est effectivement batarde.
Frédérick
Membre lOOyal
Membre lOOyal
Messages : 49
Inscription : 05 déc. 2017 14:17

Re: [Calc] Actualisation de la base de données publipostage

Message par Frédérick »

Dude a écrit : Donc, la solution de faire cela dans Calc est effectivement batarde.
En fait, ma base excel est un fichier à partir duquel nous effectuons tout notre suivi d'activité.
Par exemple, je dois engager un animateur pour dispenser un stage, je dois dans ce fichier indiquer le stage, le contenu, l'animateur, la date à laquelle j'ai obtenu son engagement ...
J'ai ensuite mis en place des macros pour faciliter le suivi. Par exemple, l'engagement de l'animateur est formalisé par un document que je dois lui faire parvenir et qu'il me retourne scanné signé. Ce document est une lettre type. J'ai donc commencé par mettre en place le publipostage qui me permet de générer ces lettres d'engagement. Et puis j'ai ensuite fait la macro qui va générer le mail, chercher les pièces à joindre et envoyer le tout (via thunderbird pour conserver la trace du mail).
Et là, pourquoi s'arrêter en si bon chemin ? Je suis pour le moment obligé d'un côté de générer la lettre d'engagement et de l'autre d'aller la chercher pour la joindre au mail. J'essaye donc de la générer à la volée. Et si j'excepte cette question de mise à jour / actualisation des données qui ne se fait pas, tout marche. Ça permet à la fois de standardiser notre fonctionnement et de le faire de manière efficace. Je génère au passage une série de documents auditables stockés de manière intelligente plutôt qu'en vrac.
Mais le point de départ, l'élément central de tout cela reste notre fichier calc de suivi. Et le tout juste en appuyant sur 6 boutons pour le moment dans une barre d'outils ad hoc.

Cela dit, je ne suis pas le premier à poser la question, ce qui prouve que le besoin existe. Partant de là, la seule question qui se pose est : est-ce que l'application est à la hauteur ? Quelque soient les griefs qu'on puisse faire à Microsoft, Excel est capable de faire cela. Calc pose problème. Pour ma part, je ne suis pas décisionnaire de l'appli que je dois utiliser donc je fais avec et c'est ce que j'essaye là.

Dernier point : même en travaillant à partir de Writer plutôt que Calc, il faut ouvrir le fichier Calc, ajouter les données, fermer toute fenêtre libre office puis ouvrir Writer et la lettre type pour faire le publipostage sur les nouvelles données même en ayant désactivé le lancement automatique. On peut difficilement dire que c'est efficace. Là encore mes lointains souvenirs de microsoft font état d'un fonctionnement direct. Tu enregistres sous Excel, tu lances sous Word sans avoir à tout fermer.
Windows 7
LibreOffice 4.3.7.2
Et en plus, on ne m'a pas demandé mon avis :-(
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Actualisation de la base de données publipostage

Message par Dude »

Frédérick a écrit :En fait, ma base excel est un fichier à partir duquel nous effectuons tout notre suivi d'activité.
Base Excel ou Calc est un oxymore.
Un tableur n'est pas un outil de base de données.
Sous OpenOffice et ses dérivés, il y a le module Base.
Frédérick a écrit :Cela dit, je ne suis pas le premier à poser la question, ce qui prouve que le besoin existe. Partant de là, la seule question qui se pose est : est-ce que l'application est à la hauteur ?
Deux choses à savoir également :
  1. Ce forum n'est animé que par des utilisateurs bénévoles. Donc si un besoin existe, il faut en faire part aux développeurs.
  2. Les modules ont chacun leurs fonctionnalités. Si tu veux visser avec un marteau, ne demande pas ensuite si le marteau est à la hauteur.
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: [Calc] Actualisation de la base de données publipostage

Message par jeanmimi »

Bonjour,
Frédérick a écrit : Tu enregistres sous Excel, tu lances sous Word sans avoir à tout fermer.
C'est le principe du publipostage comme le dit Dude, mais ce n'est pas ce que tu veux faire, puisque tu dis vouloir le lancer depuis Calc.
Frédérick a écrit :Par exemple, je dois engager un animateur pour dispenser un stage, je dois dans ce fichier indiquer le stage, le contenu, l'animateur, la date à laquelle j'ai obtenu son engagement .
Comme tu ne vas pas faire des calculs ou construire des diagrammes complexes, le module adapté est Base, d'autant que les versions les plus récentes permettent la réactualisation des enregistrements la base restant ouverte.
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Frédérick
Membre lOOyal
Membre lOOyal
Messages : 49
Inscription : 05 déc. 2017 14:17

Re: [Calc] Actualisation de la base de données publipostage

Message par Frédérick »

je suis tout à fait conscient que le module le plus adapté est base. En fait, pour être exact, je travaille dans une équipe de 15 personnes dispersées sur 4 sites entre la Normandie et les Hauts de France. Donc l'outil le plus adapté, ce serait php + sql. Il se trouve que parmi les 15, une partie influente n'ouvre un fichier informatique qu'avec un coup de pied dans l'arrière train.
En conséquence de quoi je suis à peine autorisé à faire du calc "avancé". Pas de base, pas de sql ! Ne reste que l'ingéniosité et les solutions de contournement.
Mais encore une fois, quand on regarde une application pro, que ce soit du base, du access ou du oracle, c'est souvent depuis l'application qu'on lance un mailing qui va chercher des modèles de documents lettres types figées et inaccessibles par l'opérateur. L'utilisateur lui ne se rend pas compte qu'il vient de faire un publipostage. Il était dans la fiche de son client, il a demandé l'édition d'un courrier et il récupère juste un document personnalisé qu'il peut envoyer à son client.
Et encore une fois, même si je lance à la main le publipostage depuis Writer, je dois commencer par fermer tout processus libreoffice pour prendre en compte les nouvelles données envoyées dans la base. Je suppose donc qu'au moment de cette fermeture l'ouverture, il y a une vérification des liaisons existantes et une actualisation si nécessaire.
Et je souhaitais juste savoir si ce comportement de libreoffice était contournable dans une macro via une liaison forcée ou quelque chose du genre. Je commence à comprendre que non.

Merci à vous
Dernière modification par Frédérick le 22 févr. 2018 08:41, modifié 1 fois.
Windows 7
LibreOffice 4.3.7.2
Et en plus, on ne m'a pas demandé mon avis :-(
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: [Calc] Actualisation de la base de données publipostage

Message par jeanmimi »

Avais-tu exploré ce fil sur la même problématique ?
https://forum.openoffice.org/fr/forum/v ... es#p287178
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Frédérick
Membre lOOyal
Membre lOOyal
Messages : 49
Inscription : 05 déc. 2017 14:17

Re: [Calc] Actualisation de la base de données publipostage

Message par Frédérick »

bonjour JeanMimi

c'est sur ce fil que j'ai vu l'auteur utiliser le thisComponent.store(). Mais ça ne marche pas. Je suppose que ça enregistre mon fichier calc mais ça ne fait pas la mise à jour de la base.
J'ai trouvé la solution qui fut donnée par P'tite Sandrine guidée par Dude, dont j'ai trouvé la trace sur un autre forum avant d'arriver à l'original ici :
https://forum.openoffice.org/fr/forum/v ... =8&t=16686

Puisque l'actualisation à proprement parler ne semble pas possible, on va désinscrire la source de données avant de la recréer en conséquence de quoi elle va être créée à jour.

Ci dessous le code complet de mon publipostage, lancé depuis un bouton Calc, sur des données actualisées, et appliquant une requête pour sélectionner une partie de ces données seulement :

Code : Tout sélectionner

Sub LanceMailing()

	dim vModel, vRepDest, vSource, vRequete as String
	dim vContexte as Object
	
	vModel = ConvertToURL("C:\BricoMacro\TestPubli.odt")
	vRepDest = ConvertToURL("C:\BricoMacro\Res\")
	vSource = "TestPubli"
	'requete va contenir la requête sql à exécuter dans la table
	vRequete = "select * from Feuille1 Where ""Nom animateur"" = 'MOI'"
	
	thisComponent.store()
	ActualiserSource(vSource, "C:\BricoMacro")
	
	Publipostage(vModel, vRepDest, "pochettes", vSource, "Feuille1", vRequete, False)
	
end sub


Sub Publipostage (vModele as string, vRepDest as string, vNomSortie as string, vNomSource as string, vDonnees as string, vRequete as string, vMultiFichier as boolean) 

	dim vMailing, vLettreType as Object
	dim vProps() as string
	' variables pour le fonctionnement de la requête sql 
	dim vRowSet as Variant
	
	vRowSet = createUnoService("com.sun.star.sdb.RowSet")
	vRowSet.DataSourceName = vNomSource
	vRowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND
	vRowSet.Command = vRequete
	vRowSet.execute()
	
	vMailing = createUnoService("com.sun.star.text.MailMerge") 
	with vMailing 
		.DataSourceName = vNomSource 
		.CommandType = com.sun.star.sdb.CommandType.TABLE 
		.Command = vDonnees
		.ResultSet = vRowSet
		.SaveAsSinglefile = vMultiFichier
		.FileNamePrefix = vNomSortie
		.OutputType = com.sun.star.text.MailMergeType.FILE 
		.DocumentURL = ConvertToURL(vModele)
		.OutputURL = ConvertToURL(vRepDest)
		.Execute(vProps())
		.dispose()
	end with

End sub


Sub ActualiserSource(vSource as String, vChemin as String)

	Dim vBase as string
	Dim vContexte, vSrcODB as Object
	
	vBase = vChemin & "\" & vSource & ".odb"
	
	' on vérifie que la source est déclarée et, dans ce cas, on casse le lien
	vContexte = createUnoService("com.sun.star.sdb.DatabaseContext")
	If vContexte.hasByName(vSource) Then
		vContexte.revokeObject(vSource)
	end if

	' désormais, la source n'est plus enregistrée, on recrée le lien avec le fichier Base (.odb)
	' la création du lien va forcer l'actualisation de la source
	vSrcODB = vContexte.getByName(ConvertToURL(vBase))
	vContexte.registerObject(vSource, vSrcODB)
   
end sub
Windows 7
LibreOffice 4.3.7.2
Et en plus, on ne m'a pas demandé mon avis :-(