Un catalogue sur un seul formulaire avec des « Imprimer ligne »

Bertrand Soubeyrand

Les commandes 4D afférentes à l'impression ont beaucoup évolué depuis la version 4D 6.8.1. Cette Note technique met en exergue des changements étalés tout au long de ces mises à jour, jusqu'à la version actuelle, 4D 2004.3. ♪

- Titre : Un catalogue sur un seul formulaire avec des « Imprimer ligne »

- Auteur : Bertrand Soubeyrand

- Parution : 1 novembre 2005

- Licence : Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Sommaire

- Introduction

- Les modifications apportées par 4D 2004

- Une base exemple

- Codes pas à pas

- Codes complets

- Trois syntaxes pour « Imprimer ligne »

- Text2Array

- Conclusion

- Base exemple

Introduction

Cette note technique vient en complément de la note réf. 4D-200303-08-FR : « Remplacez vos IMPRIMER SELECTION par un module générique ».

Les commandes 4D afférentes à l'impression ont beaucoup évolué depuis la version 4D 6.8.1. Cette Note technique met en exergue des changements étalés tout au long de ces mises à jour, jusqu'à la version actuelle, 4D 2004.3.

Le tableau qui suit représente le thème « Impression » de 4D 2004. Il vous dresse un panorama de l'évolution de l'impression. Le premier numéro de version qui suit le nom de la commande correspond à sa version de création et les suivants aux versions de révisions.

(en rouge les commandes modifiées en 4D 2004)

Nom de la commande

Version de création

Version de révision

Version de révision

Lire taquet impression

6.8.1

2003.0

FIXER TAQUET IMPRESSION

6.8.1

2003.0

Lire hauteur imprimee

6.8.1

LIRE MARGE IMPRESSION

6.8.1

FIXER MARGE IMPRESSION

6.8.1

LIRE ZONE IMPRESSION

6.8.1

Imprimer ligne

5.0

2003.0

2004.0

SAUT DE PAGE

5.0

2003.0

LISTE IMPRIMANTES

2003.0

2004.2

FIXER IMPRIMANTE COURANTE

2003.0

Lire imprimante courante

2003.0

VALEURS OPTION IMPRESSION

2003.0

FIXER OPTION IMPRESSION

2003.0

2004.0

2004.3

LIRE OPTION IMPRESSION

2003.0

2004.0

2004.3

IMPRIMER ETIQUETTES

5.0

2004.0

IMPRIMER SELECTION

5.0

2004.0

IMPRIMER ENREGISTREMENT

5.0

2004.0

FIXER IMPRIMANTE COURANTE

5.0

IMPRESSION ECRAN

5.0

Niveau

5.0

NIVEAUX DE RUPTURES

5.0

Page impression

5.0

PARAMETRES IMPRESSION

5.0

Sous total

5.0

UTILISER PARAMETRES IMPRESSION

5.0

Les modifications apportées par 4D 2004

Imprimer ligne

Cette commande peut désormais être exécutée sur 4D Server dans le cadre d'une procédure stockée.

Dans ce contexte :

• il faut veillez à ce qu'aucune boîte de dialogue n'apparaisse sur le poste serveur (sauf besoin spécifique) Pour cela, il est nécessaire d'appeler la commande avec le paramètre * ou > ;

• en cas de problème sur l'imprimante (plus de papier, imprimante déconnectée, etc.), aucun message d'erreur n'est généré.

LISTE DES IMPRIMANTES

Sous MacOS, le deuxième paramètre de cette commande retourne désormais pour chaque imprimante son nom personnalisé, modifiable par l'utilisateur. Ce nom peut être utilisé par exemple dans des boîtes de dialogue.

FIXER OPTION IMPRESSION, LIRE OPTION IMPRESSION

2004.0. Introduction d'un nouveau paramètre : Option mode impression Mac

• Option mode impression Mac (13) : passez 0 pour fixer l'impression en mode PDF (valeur par défaut) et 1 pour « forcer » l'impression en mode Postscript dans valeur1. Cette option modifie également le mode d'impression des plug-ins 4D Write, 4D View et 4D Draw. En revanche, elle n'a pas d'effet sous Windows.

Note : Sous MacOS X, les impressions sont effectuées par défaut en mode PDF. Or, le pilote d'impression PDF ne prend pas en charge les images PICT encapsulant des informations Postscript -ces images sont générées notamment par des logiciels de dessin vectoriel. Pour résoudre ce problème, cette option permet de modifier le mode d'impression sous MacOS X pour la session courante. Attention, l'impression en mode Postscript peut entraîner des effets de bords indésirables.

Une fois fixée à l'aide de cette commande, une option d'impression sera conservée durant toute la session pour l'application 4D entière. Elle sera utilisée par les commandes IMPRIMER SELECTION, IMPRIMER ETIQUETTES, IMPRIMER ENREGISTREMENT, Imprimer ligne, QR ETAT et par toutes les impressions de 4e Dimension, y compris en mode Structure.

2004.3. Introduction d'un nouveau paramètre : Option masquer progression impr

• Option masquer progression impr (14). Cette nouvelle option permet de masquer toutes les fenêtres système de progression d'impression pour le process courant. Passez 1 dans valeur1 pour masquer les fenêtres de progression et 0 pour rétablir leur affichage (fonctionnement par défaut). Cette option est particulièrement utile dans le cadre des impressions en PDF sous Mac OS X.

Note : Il existe déjà une option d'affichage Progression de l'impression accessible via la boîte de dialogue des Préférences (page Application/Options). Toutefois, elle est globale à l'application et ne masque pas toutes les fenêtres sous Mac OS X.

IMPRIMER ETIQUETTES

4D Server : cette commande peut être exécutée sur 4D Server dans le cadre d'une procédure stockée.

Dans ce contexte :

• même mise en garde concernant les dialogues et l'absence de message d'erreur que pour les commandes précédentes… ;

• la syntaxe faisant apparaître l'éditeur d'étiquettes ne fonctionne pas avec 4D Server, dans ce cas, la variable système OK prend la valeur 0.

IMPRIMER SELECTION

4D Server : cette commande peut être exécutée sur 4D Server dans le cadre d'une procédure stockée. Même mise en garde concernant les dialogues et l'absence de message d'erreur…

IMPRIMER ENREGISTREMENT

4D Server : cette commande peut être exécutée sur 4D Server dans le cadre d'une procédure stockée. Attention également à ne pas afficher de dialogues et à l'absence de message d'erreur…

Une base exemple

La base qui accompagne cette note illustre la façon d'imprimer un catalogue de produits à partir d'un formulaire unique.

Notons que l'entête de ce catalogue contient deux variables (l'heure et la date d'impression) et le corps contient un champ qui détaille le produit.

La hauteur de ce champ s'adapte au texte contenu aussi nous devons prendre soin :

· d'ajuster l'objet sur le contenu texte
· déplacer les autres éléments situés sous l'objet
· déplacer les taquets d'impression pour le corps, mais aussi celui de rupture et de pied
· veiller à la place restante avant de lancer l'Imprimer ligne
· ne pas recalculer l'heure et la date à chaque produit !

Codes pas à pas

Méthode formulaire : le principe est de ne pas calculer quand ce n'est pas utile.

La méthode print_catalogue lance l'impression et distribue les ordres d'Imprimer ligne. Imprimons simplement l'entête du catalogue :

code 4D

$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Entête formulaire )

La Méthode formulaire est exécutée et les variables Date et Heure sont renseignées :

code 4D

Au cas ou
: (Evenement formulaire=Sur impression corps )
D_Date:=Date du jour
H_Heure:=Heure courante
Fin de cas

Maintenant n'imprimons que les produits :

code 4D

TOUT SELECTIONNER([TABLE_PRINT])

Tant que (Non(Fin de selection([TABLE_PRINT])))
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Corps formulaire )
ENREGISTREMENT SUIVANT([TABLE_PRINT])
Fin tant que

La Méthode formulaire est exécutée et nous redimensionnons la zone de texte de la description.

code 4D

Au cas ou

: (Evenement formulaire=Sur impression corps )
LIRE RECT OBJET([TABLE_PRINT]Detail_T;$L_Gauche;$L_Haut;$L_Droite;$L_Bas)
$L_Max:=$L_Droite-$L_Gauche
$L_Hauteur:=$L_Bas-$L_Haut
TAILLE OBJET OPTIMALE([TABLE_PRINT]Detail_T;$L_LargeurOpti;$L_HauteurOpti;$L_Max)
$L_Augmentation:=$L_HauteurOpti-$L_Hauteur
` D'abord déplacer le taquet
` Notez * dans FIXER TAQUET IMPRESSION qui permet de déplacer les taquets suivants
$L_C:=Lire taquet impression(Corps formulaire )
FIXER TAQUET IMPRESSION(Corps formulaire ;$L_C+$L_Augmentation;*)
` Ensuite déplacer les objets
DEPLACER OBJET([TABLE_PRINT]Detail_T;0;0;0;$L_Augmentation) ` par le bas
DEPLACER OBJET(*;"ligne1";0;$L_Augmentation;0;0) ` par le haut
DEPLACER OBJET(*;"ligneVd";0;0;0;$L_Augmentation)
DEPLACER OBJET(*;"ligneVg";0;0;0;$L_Augmentation)

Fin de cas

À l'issue de ces deux impressions, nous constatons qu'il y a comme deux méthodes formulaire distinctes à exécuter dans un formulaire unique « catalogue_demo ». Nous avons convenu au démarrage que, lors du calcul de l'heure et la date, on ne calcule pas la hauteur des produits et réciproquement.

Pour faire ce distinguo nous renseignons une variable process S020_ZoneTaquet qui indique à la méthode formulaire les traitements à réaliser.

code 4D

Au cas ou

: (S020_ZoneTaquet="corps")

: (S020_ZoneTaquet="tete")

: (S020_ZoneTaquet="pied")

Fin de cas

Retouchons la méthode print_catalogue :

code 4D

S020_ZoneTaquet:="tete"
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Entête formulaire )
Tant que (Non(Fin de selection([TABLE_PRINT])))
S020_ZoneTaquet:="corps"
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Corps formulaire )
ENREGISTREMENT SUIVANT([TABLE_PRINT])
Fin tant que

La méthode formulaire devient :

code 4D

Au cas ou
: (Evenement formulaire=Sur impression corps )

Au cas ou

: (S020_ZoneTaquet="corps")
LIRE RECT OBJET([TABLE_PRINT]Detail_T;$L_Gauche;$L_Haut;$L_Droite;$L_Bas)
$L_Max:=$L_Droite-$L_Gauche
$L_Hauteur:=$L_Bas-$L_Haut
TAILLE OBJET OPTIMALE([TABLE_PRINT]Detail_T;$L_LargeurOpti;$L_HauteurOpti;$L_Max)
$L_Augmentation:=$L_HauteurOpti-$L_Hauteur
` D'abord déplacer le taquet
` Notez * dans FIXER TAQUET IMPRESSION qui permet de déplacer les taquets suivants
$L_C:=Lire taquet impression(Corps formulaire )
FIXER TAQUET IMPRESSION(Corps formulaire ;$L_C+$L_Augmentation;*)
` Ensuite déplacer les objets
DEPLACER OBJET([TABLE_PRINT]Detail_T;0;0;0;$L_Augmentation) ` par le bas
DEPLACER OBJET(*;"ligne1";0;$L_Augmentation;0;0) ` par le haut
DEPLACER OBJET(*;"ligneVd";0;0;0;$L_Augmentation)
DEPLACER OBJET(*;"ligneVg";0;0;0;$L_Augmentation)

: (S020_ZoneTaquet="tete")
D_Date:=Date du jour
H_Heure:=Heure courante

Fin de cas

Nous touchons au but, mais n'oublions pas qu'il faut calculer la place nécessaire pour imprimer notre produit : si celle-ci est insuffisante, nous redémarrons sur une nouvelle page avec les têtes des colonnes. Pour réaliser cette tâche, nous allons utiliser une autre syntaxe de la fonction Imprimer ligne. Au lieu de désigner la portion de formulaire par son nom…

code 4D

$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Corps formulaire )

… nous indiquerons quelles coordonnées numériques nous voulons imprimer.

code 4D

$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";1;1 )

Comme nous choisissons de la position 1 pixel à 1 pixel la zone de formulaire imprimée sera de 0 pixel… mais la méthode formulaire sera exécutée. Nous en profitons pour créer une nouvelle valeur pour le tag S020_ZoneTaquet.

code 4D

S020_ZoneTaquet:="calcul"
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";1;1 )

La partie du code de la Méthode formulaire qui change devient :

code 4D

Au cas ou
: (Evenement formulaire=Sur impression corps )

Au cas ou

: (S020_ZoneTaquet="calcul")
` Le calcul va déterminer la hauteur totale à imprimer
$L_E1:=Lire taquet impression(Entête formulaire1 )
$L_C:=Lire taquet impression(Corps formulaire )
LIRE RECT OBJET([TABLE_PRINT]Detail_T;$L_Gauche;$L_Haut;$L_Droite;$L_Bas)
$L_Max:=$L_Droite-$L_Gauche
$L_Hauteur:=$L_Bas-$L_Haut
TAILLE OBJET OPTIMALE([TABLE_PRINT]Detail_T;$L_LargeurOpti;$L_HauteurOpti;$L_Max)
$L_Augmentation:=$L_HauteurOpti-$L_Hauteur
L_HauteurNominale:=($L_C+$L_Augmentation)-$L_E1

: (S020_ZoneTaquet="corps")

: (S020_ZoneTaquet="tete")

Fin de cas

Fin de cas

À l'issue de ce test, nous avons renseigné la variable process L_HauteurNominale qui contient la hauteur en pixel de la zone à imprimer. Cette variable est exploitée dans la méthode print_catalogue pour, si besoin, générer une nouvelle page.

code 4D

LIRE ZONE IMPRESSION($L_HauteurImpression;$L_LargeurImpression)

Tant que (Non(Fin de selection([TABLE_PRINT])))
` Cette section"calcul" va nous permettre de savoir si la ligne de catalogue peut être imprimée
S020_ZoneTaquet:="calcul"
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";1;1)
$L_HauteurDispo:=$L_HauteurImpression-Lire hauteur imprimee

Si ($L_HauteurDispo<L_HauteurNominale)
SAUT DE PAGE(*)
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Entête formulaire1 )
Fin de si

S020_ZoneTaquet:="corps"
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Corps formulaire )
ENREGISTREMENT SUIVANT([TABLE_PRINT])

Fin tant que

Codes complets

Pour conclure, voici le code complet de la méthode print_catalogue et de la méthode formulaire, rationalisé, afin de limiter les répétitions inutiles d'instructions.

• Méthode print_catalogue
En client/serveur elle s'exécutera sur le serveur (Nouveauté 2004) : dans ce cas gare aux alertes intempestives.

code 4D

Si (Nombre de parametres=0)
$L_Process:=Executer sur serveur(Nom methode courante;1024*100;"test";"Dummy";*)

Sinon
` En client serveur c'est le serveur qui gère l'impression et non plus le client
` Attention aux alertes inattendues !
FIXER OPTION IMPRESSION(Option orientation ;1) ` verticale
FIXER OPTION IMPRESSION(Option échelle ;100) `a 100%
FIXER OPTION IMPRESSION(Option nombre copies ;1) ` 1 Copie
FIXER OPTION IMPRESSION(Option destination ;1) ` 1 Imprimante
FIXER OPTION IMPRESSION(Option nom document à imprimer ;"test impression")
FIXER OPTION IMPRESSION(Option papier ;"A4")
FIXER MARGE IMPRESSION(-1;-1;-1;-1)
LIRE ZONE IMPRESSION($L_HauteurImpression;$L_LargeurImpression)
IMPRESSION ECRAN(Faux)
` Impression de l'entête, pas de difficulté
` On considère qu'il y a de la place pour imprimer cette zone
S020_ZoneTaquet:="tete"
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Entête formulaire )
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Entête formulaire1 )
$L_HauteurDispo:=$L_HauteurImpression-Lire hauteur imprimee
TOUT SELECTIONNER([TABLE_PRINT])
REDUIRE SELECTION([TABLE_PRINT];10)
DEBUT SELECTION([TABLE_PRINT])

Tant que (Non(Fin de selection([TABLE_PRINT])))
`
` Cette section "calcul" va nous permettre de savoir si la ligne de catalogue peut être imprimée
S020_ZoneTaquet:="calcul"
$L_HauteurDispo:=$L_HauteurImpression-Lire hauteur imprimee
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";1;1)
` L_HauteurNominale est renseignée dans la méthode formulaire du formulaire d'impression
Si ($L_HauteurDispo<L_HauteurNominale)
SAUT DE PAGE(>)
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Entête formulaire1 )
Fin de si
S020_ZoneTaquet:="corps"
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Corps formulaire )
ENREGISTREMENT SUIVANT([TABLE_PRINT])
Fin tant que

S020_ZoneTaquet:="pied"
$L_Size:=Imprimer ligne([TABLE_PRINT];"catalogue_demo";Pied de page formulaire )
SAUT DE PAGE

Fin de si

• La Méthode Formulaire

code 4D

Au cas ou
: (Evenement formulaire=Sur impression corps )
Si (S020_ZoneTaquet="calcul") | (S020_ZoneTaquet="corps")
LIRE RECT OBJET([TABLE_PRINT]Detail_T;$L_Gauche;$L_Haut;$L_Droite;$L_Bas)
$L_Max:=$L_Droite-$L_Gauche
$L_Hauteur:=$L_Bas-$L_Haut
TAILLE OBJET OPTIMALE([TABLE_PRINT]Detail_T;$L_LargeurOpti;$L_HauteurOpti;$L_Max)
$L_Augmentation:=$L_HauteurOpti-$L_Hauteur
$L_C:=Lire taquet impression(Corps formulaire )
Fin de si
Au cas ou
: (S020_ZoneTaquet="calcul")
` Le calcul va déterminer la hauteur totale à imprimer
$L_E1:=Lire taquet impression(Entête formulaire1 )
L_HauteurNominale:=($L_C+$L_Augmentation)-$L_E1
: (S020_ZoneTaquet="corps")
` D'abord déplacer le taquet
FIXER TAQUET IMPRESSION(Corps formulaire ;$L_C+$L_Augmentation;*)
` Ensuite les objets
DEPLACER OBJET([TABLE_PRINT]Detail_T;0;0;0;$L_Augmentation) ` par le bas
DEPLACER OBJET(*;"ligne1";0;$L_Augmentation;0;0)
DEPLACER OBJET(*;"ligneVd";0;0;0;$L_Augmentation)
DEPLACER OBJET(*;"ligneVg";0;0;0;$L_Augmentation)
: (S020_ZoneTaquet="tete")
D_Date:=Date du jour
H_Heure:=Heure courante
Fin de cas
Fin de cas

Trois syntaxes pour « Imprimer ligne »

Pour terminer ce tour d'horizon, voici les trois syntaxes possibles de l'Imprimer ligne :

• Méthode : imprimer_ligne_syntaxe1
Syntaxe historique : on imprime la zone de Corps.

code 4D

` ----------------------------------------------------
` Nom utilisateur (OS) : Bertrand
` Date et heure : 03/01/06, 20:19:35
` ----------------------------------------------------
` Méthode : imprimer_ligne_syntaxe1
` Description
` C'est la syntaxe historique : la zone de corps est imprimée
`
` Paramètres
` ----------------------------------------------------
C_ENTIER($zone)
$zone:=Imprimer ligne([TABLE_PRINT];"demo_zone")
SAUT DE PAGE ` Déclenche l'impression

• Méthode : imprimer_ligne_syntaxe2
Imprimer ligne reçoit la précision sur la zone formulaire à imprimer. Ces zones sont intimement liées au formulaire.

code 4D

` ----------------------------------------------------
` Nom utilisateur (OS) : Bertrand
` Date et heure : 03/01/06, 20:18:34
` ----------------------------------------------------
` Méthode : imprimer_ligne_syntaxe2
` Description
` Imprimer ligne reçoit la précision sur la zone formulaire
`à imprimer. Ces zones sont intimement liées au formulaire
`
` Paramètres
` ----------------------------------------------------
C_ENTIER ($zone1;$zone2;$zone3;$zone4)
$zone1:=Imprimer ligne([TABLE_PRINT];"demo_zone";Entête formulaire )
$zone2:=Imprimer ligne([TABLE_PRINT];"demo_zone";Corps formulaire )
$zone3:=Imprimer ligne([TABLE_PRINT];"demo_zone";Rupture formulaire0 )
$zone4:=Imprimer ligne([TABLE_PRINT];"demo_zone";Pied de page formulaire )
SAUT DE PAGE ` Déclenche l'impression

• Méthode : imprimer_ligne_syntaxe3
Vous passez une zone de début et une zone de fin.

code 4D

` ----------------------------------------------------
` Nom utilisateur (OS) : Bertrand
` Date et heure : 03/01/06, 20:21:45
` ----------------------------------------------------
` Méthode : imprimer_ligne_syntaxe3
` Description
` Vous passez une zone de début et une zone de fin
` les valeurs sont en pixels
`
` Paramètres
` ----------------------------------------------------
C_ENTIER($zone)
$zone:=Imprimer ligne([TABLE_PRINT];"demo_zone";42;155)
` avec ces valeurs nous rognerons dans le libellé "entête zone" et "rupture zone"
SAUT DE PAGE ` Déclenche l'impression

Text2Array

La prochaine évolution majeure serait une fonction qui permettrait de découper un texte par lignes à placer dans un tableau de type texte et ainsi rendre imprimables de longues zones de texte courant sur plusieurs pages.

En attendant, rappelons l'existence du plugin Text2Array développé par Dave BATTON :

http://e-node.fr/redir/FR/produit_id_90.html

Conclusion

Les méthodes utilisées pour l'impression évoluent comme le montre notre tableau d'entrée et donnent aux développeurs un nombre infini de possibilités.

Base exemple

Télécharger la base exemple.