[Writer] Réaliser un publipostage de type "catalogue"

Venez découvrir tous les tutoriels, modèles et autres foires aux questions afin de maîtriser rapidement votre suite bureautique favorite.

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Cette section est faite pour présenter les tutoriels. Si vous avez une question sur l'installation, le fonctionnement ou l'utilisation, vous devez poster dans la section du module où se produit le problème.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

[Writer] Réaliser un publipostage de type "catalogue"

Message par Pierre-Yves Samyn »

Ce tutoriel est sous licence GNU F.D.L. (Licence de Documentation Libre GNU)
en français : http://cesarx.free.fr/gfdlf.html ou officiel : http://www.gnu.org/licenses/licenses.html#GPL
Vous êtes libre de le reproduire, le recopier, le réutiliser, l'améliorer, le modifier, le distribuer à condition de lui attribuer les mêmes libertés et de citer son origine :
Forum francophone OpenOffice

Writer ne propose pas dans ses menus l'équivalent du publipostage "catalogue" de Word.

Hormis l'utilisation du module de base de données et de l'extension Sun Report Builder, ce qui s'en rapproche le plus, en restant dans les limites du traitement de textes est l'outil "Données dans le texte" disponible dans la barre d'outils de la fenêtre des sources de données :
DonneesDansLeTexte.png
Si cet outil peut être adapté par exemple à l'impression d'une liste de destinataires on atteint toutefois rapidement ses limites, la principale étant la mise à jour "dynamique" en fonction du nombre d'enregistrements à imprimer.

Comme indiqué ci-dessus, l'utilisation du module Base de données permet de s'affranchir de ces limites mais :
  • tout le monde ne souhaite pas s'investir dans un nouveau module
  • l'extension Sun Report Builder n'est pas installée par défaut
Le présent tutoriel a pour objet de montrer comment résoudre ce problème, relativement simplement :
  • sans passer par le module Base
  • sans modification de la source de données ; seule condition : disposer d'un champ identifiant, c'est-à-dire ne comprenant que des données différentes
  • en recourant uniquement à l'insertion de "champs"
De manière à faciliter sa prise en main, ce tutoriel utilisera comme source de données la bibliographie installée par défaut avec OOo.

Un avantage induit est que cette source de données est référencée par défaut.

Autrement dit, elle directement utilisable pour le publipostage dans le traitement de textes (pour mémoire, ce référencement se fait par Outils > Options > OOoBase > Base de données).

Nous allons maintenant exposer la solution en complétant au fur et à mesure notre modèle. La longueur du tutoriel n'est pas proportionnelle à la difficulté de mise en oeuvre (qui ne repose que sur l'insertion de 3 variables et d'un champ). Au bout du compte rien que de très logique si on comprend bien chaque étape :)

Pour démarrer regardons le résultat produit par l'outil Données dans le texte après sélection de 4 enregistrements et des champs Identifier, Title, Pages :
Capture-1.png
Valider le dialogue puis passer en affichage des noms de champs (Ctrl+F9) pour ne plus visualiser le contenu des champs mais leur nom et obtenir cet affichage
  • Les champs sont insérés sous la forme : NomSource.NomTable.NomChamp
  • Hormis le dernier, OOo ajoute en fin de paragraphe un champ NomSource.NomTable.Enregistrement suivant
Le champ "Enregistrement suivant" permet d'avoir plusieurs enregistrements par page.

La présentation étant assez fruste nous allons l'enrichir en éditant le style de paragraphe (Corps de texte en l'occurrence).
  • Définir des tabulations "gauche" à 2 - 3,2 - 14,5 - 16 cm
  • Ajout d'une bordure supérieure en décochant la propriété Fusionner avec le paragraphe suivant
Nous pouvons désormais insérer des tabulations dans le texte et ajouter les libellés "Titre" et "Pages" pour obtenir :
StyleCorpsDeTexte.png
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Pierre-Yves Samyn le 10 janv. 2010 17:00, modifié 1 fois.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Notre catalogue n'est pas "dynamique"

Message par Pierre-Yves Samyn »

Nous avons désormais une ébauche de modèle de "catalogue". Lançons la commande Fichier > Imprimer.

OOo nous pose la question : Le document contient des champs de base de données d'adresses. Voulez-vous imprimer une lettre-type ?

Répondons oui (nous n'imprimerons pas ces exercices successifs bien sûr... et choisirons une sortie "Fichier dans un document unique" pour visualiser les résultats).

Que se passe-t-il si, au lieu de sélectionner 4 enregistrements nous en sélectionnons davantage, 7 par exemple ?
ImprimerDeUnASept.png
Le résultat :
SixFusionnes.png
  • OOo n'a "fusionné" que six enregistrements... Autrement dit, soit il faut ajouter un quand on demande de fusionner un nombre d'enregistrements, soit on sélectionne les enregistrements dans la grille et on utilise l'option "enregistrements marqués".
  • Notre catalogue ne prévoyant que 4 lignes, OOo ajoute automatiquement autant de pages que nécessaire pour fusionner le nombre d'enregistrements sélectionnés.
  • Bien que le dernier paragraphe du modèle ne comprenne pas le champ "Enregistrement suivant" OOo passe automatiquement au suivant quand il change de page. Il ne faut donc pas inclure ce champ sur le dernier paragraphe car on "perdrait" un enregistrement à chaque changement de page. Ceci est à retenir quand on copie-colle une ligne pour la reproduire.
  • Plus ennuyeux : notre dernière page n'imprimant que 2 enregistrements les libellés "Titre" et "Pages" prévus pour les 3ème et 4ème lignes apparaissent alors qu'on désirerait ne pas les voir...
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Pierre-Yves Samyn le 10 janv. 2010 17:09, modifié 1 fois.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Masquer les lignes superflues

Message par Pierre-Yves Samyn »

Nous allons voir maintenant comment masquer ces lignes superflues.

OOo permet de gérer des champs "paragraphe masqué sous condition".

On serait tenté d'utiliser comme condition :
  • Bibliography.biblio.Identifier == ""
  • NOT Bibliography.biblio.Identifier
  • ou encore !Bibliography.biblio.Identifier
Ce type de condition peut être utilisé dans un publipostage pour ne pas afficher un paragraphe (ou une section) quand un champ est non renseigné (une partie d'adresse par exemple).

Le problème est que dans ce cas de figure cela ne peut fonctionner puisque... il n'y a plus d'enregistrement courant quand le problème se pose ! Ce type de test n'est même pas exécuté...

On pourrait également être tenté d'utiliser le nombre d'enregistrements pour tester : quand on a fusionné le nombre prévu... on masque tous les paragraphes surnuméraires.

Problèmes :
  • ce nombre n'est en général pas disponible dans un champ de chaque enregistrement
  • la technique permettant de le calculer rompt la séquence "normale" du publipostage (je préfère ne pas détailler ce point ici pour ne pas s'éloigner du sujet)
Principes de la solution

La solution sera obtenue en insérant un champ Paragraphe masqué et trois variables :
  • Une pour mémoriser la valeur du champ identifiant au début du paragraphe
  • Une pour mémoriser la valeur du champ identifiant en fin de paragraphe après avoir fait le changement d'enregistrement.
  • Une pour tester l'égalité ou non de ces variables : l'égalité signifie que le dernier enregistrement a été traité.
Le dernier paragraphe dans lequel ne figure pas le champ Enregistrement suivant ne pose pas problème :
  • Soit c'est le dernier enregistrement à traiter : il doit être imprimé et il n'y aura pas de page supplémentaire et donc pas de lignes à masquer.
  • Soit ce n'est pas le dernier : il doit être imprimé et le changement de page génère automatiquement le passage à l'enregistrement suivant.

Mise en oeuvre de la solution

1) Insertion des variables "Avant-Apres"
  • Positionner le curseur au début du premier paragraphe
  • Faire Insertion > Champs > Autres (Ctrl+F2) > onglet Variables
  • Type de champ : Définir une variable
  • Nom : Avant
  • Valeur : faire glisser à la souris le champ Identifier depuis la fenêtre des sources de données (clic gauche sur l'en-tête, glisser-déposer dans la zone Valeur)
  • Cocher Invisible
  • Cliquer sur Insérer, ne pas fermer le dialogue,
  • Positionner le curseur au début de chaque ligne suivante et cliquer sur Insérer pour chacune (nota : notre exemple ne comprend que 4 lignes cette procédure est assez rapide ; pour un nombre de lignes plus important il sera plus rapide de copier-coller la ligne en faisant attention au dernier paragraphe qui ne doit pas contenir de champ Enregistrement suivant).
  • Garder le dialogue ouvert, modifier le nom de variable en Apres
  • Positionner le curseur en fin du premier paragraphe, cliquer sur Insérer
  • Procéder de même pour les paragraphes suivants (même remarque que ci-dessus pour le copier-coller de lignes).
  • Ne pas fermer le dialogue...
InsertionAvant.png

2) Insertion de la variable testant le "dernier"
  • Positionner le curseur à la fin du premier paragraphe
  • Toujours avec Insertion > Champs > Autres (Ctrl+F2) > onglet Variables
  • Insérer une variable nommée "Dernier" en définissant sa valeur à

    Code : Tout sélectionner

    Avant==Apres
    Quand le dernier enregistrement sera atteint les deux variables auront la même valeur.
  • Procéder de même pour toutes les lignes sauf la dernière puisque ne figure pas dans celle-ci le champ Enregistrement suivant (l'égalité serait donc toujours vérifiée).
  • Ne pas fermer le dialogue...
InsertionDernier.png
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Pierre-Yves Samyn le 10 janv. 2010 17:09, modifié 1 fois.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Insertion du champ Paragraphe Masqué

Message par Pierre-Yves Samyn »

3) Insertion du champ "Paragraphe masqué"
  • Positionner le curseur au début du premier paragraphe
  • Toujours avec Insertion > Champs > Autres (Ctrl+F2) > onglet Fonctions
  • Type de champ : Paragraphe masqué
  • Condition : Dernier
  • Cliquer sur Insérer
  • Procéder de même sur toutes les lignes (y compris la dernière)
Nota : en condition il suffit d'indiquer le nom de la variable testant l'égalité définie ci-dessus ; son contenu sera soit vrai, soit faux.
InsertionParaMasque.png
Et voila notre modèle opérationnel : quel que soit le nombre d'enregistrements sélectionnés, nous n'aurons bien que le nombre de lignes voulu. :)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Pierre-Yves Samyn le 10 janv. 2010 17:10, modifié 1 fois.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Synthèse de la démarche

Message par Pierre-Yves Samyn »

La démarche a été volontairement très détaillée ci-dessus. On pourrait la synthétiser :
  • Création du premier paragraphe
    • Insertion d'une variable "Avant" = au champ identifiant de la table
    • Insertion des champs à fusionner et des autres éléments de texte ("Titre" & "Pages" dans nos exemples).
    • Insertion du champ Enregistrement suivant
    • Insertion d'une variable "Apres" = au champ identifiant de la table
    • Insertion d'une variable "Dernier" testant l'égalité Avant == Apres
    • Insertion en début de paragraphe d'un champ Paragraphe masqué, condition : Dernier
  • Copier le paragraphe et le coller autant de fois que l'on désire de lignes
  • Supprimer dans le dernier paragraphe le champ Enregistrement suivant et la variable Dernier
Dernière modification par Pierre-Yves Samyn le 10 janv. 2010 17:10, modifié 1 fois.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Gestion d'une page de garde

Message par Pierre-Yves Samyn »

L'impression d'un catalogue (facture, etc.) commence rarement (voire jamais...) par les lignes. On fait précéder ces dernières d'un en-tête.

Le problème posé pour un publipostage est qu'on ne désire pas que cet en-tête soit réimprimé sur les pages suivantes.

La solution sera d'insérer la partie en-tête du texte (je ne fais pas référence ici à l'en-tête de page), dans une section qui sera masquée sous condition.

Code : Tout sélectionner

[NomSource.NomTable.Numéro d'enregistrement] G 1

Autrement dit, la section est masquée si le numéro d'enregistrement est supérieur à 1.

Noter la syntaxe (non documentée...:twisted: ) pour le numéro dans la condition qui diffère de celle employée par OOo quand on insère le numéro comme "champ" :

Code : Tout sélectionner

Numéro d'enregistrement:NomSource.NomTable
Dans l'exemple ci-dessous le texte "Impression de la bibliographie par défaut" est inséré dans une section :
SectionEnTete.png
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Pierre-Yves Samyn le 10 janv. 2010 17:11, modifié 1 fois.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Amélioration de la présentation

Message par Pierre-Yves Samyn »

On voudrait obtenir :
ResultatSection.png
Aucune notion nouvelle pour réaliser ceci... :)
  • Insertion de variables "Avant - Après"
  • Insertion de champ Enregistrement suivant
  • Insertion d'une variable "Dernier" pour tester l'égalité
Ce qui change : nous désirons plusieurs paragaphes par enregistrement. Il serait fastidieux de gérer autant de champs paragraphes masqués.

En revanche il est très simple de sélectionner tous les paragraphes concernés et de les insérer dans une section (menu Insertion > Section) masquée sous la même condition que celle mise en oeuvre précédemment : "Dernier".
SectionLigne.png
Nota :
  • aucun champ Paragraphe masqué n'est donc à introduire ici.
  • l'exemple montre qu'on peut aussi inclure des graphismes dans les sections
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Pierre-Yves Samyn le 10 janv. 2010 17:13, modifié 1 fois.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

[Writer] Réaliser un publipostage de type "catalogue"

Message par Pierre-Yves Samyn »

Aucune question dans cette section !

Cette section est faite pour présenter les tutoriels. Si vous avez une question sur l'installation, le fonctionnement ou l'utilisation, vous devez poster dans la section Traitement de textes.

Merci... :)