|
HOWTO Accueil
HOWTO développement Sashipa
Imprimer des étiquettes.
Vous souhaitez associer un état à un formulaire listForm pour imprimer des
étiquettes.
Dans cette page nous décortiquons l'exemple fourni par l'application DemoContact.
Commençons par la vue générale :
<printReport name='PRtblContactadresse_Mailing'>
<pageFormat format='A4' orientation='portrait' />
<pageImageableArea x='40' y='35' w='515' h='772' relativeLocation='no' />
<caption>Etiquettes Adresses</caption>
<pageContent>
<mailingDistribution labelsInWidth='2' labelsInHeight='7'>
<mailingLabelSize w='217' h='95' />
<mailingLabelGap firstWidth='40' firstHeight='46' width='75' height='16' />
... dataRecordPrinter ...
</mailingDistribution>
</pageContent>
</printReport>
|
La première chose à faire est de définir le nombre d'étiquettes sur la largeur
(ici labelsInWidth='2') ainsi qu'en hauteur (dans notre cas
labelsInHeight='7'). On a aussi une idée des marges à laisser autour de
la zone imprimable. A partir de là il nous faut calculer les attributs
qui suivent. On remarque au passage que nos coordonnées sont calculées en absolu
par rapport à la page (relativeLocation='no').
Un format A4 fait 595 * 842. Voici le détail des calculs :
A4: page width = 595, page height = 842
Largeur d'une étiquette : 1er gap = 40; w; 2eme gap = 40
=> gap du milieu = 40 + 40 = 80
Hauteur d'une étiquette : 1er gap = 11; h; 2eme gap = 0
Largeur d'une page : gap page debut = 0 ; gap page fin = 0
Hauteur d'une page : gap page debut = 35 ; gap page fin = 35
w: (595 - 40*2 - 40*2) / 2 = 435 / 2 = 217 reste 1
h: (842 - 46 - 35 - 16*6) / 7 = 665 / 7 = 95 reste 0
|
Une fois ces formalités accomplies, on peut définir le contenu d'une étiquette.
On utilise un dataRecordPrinter, qui multipliera le serieDrawFigure
par le nombre de données renvoyées par le printerDataSource :
<dataRecordPrinter>
... serieDrawFigure ...
... printerDataSource ...
</dataRecordPrinter>
|
Commençons par le serieDrawFigure. On veut imprimer :
- Le Nom, puis le prénom à la suite
- La rue
- Le code postal, puis la ville à la suite
<serieDrawFigure locations='relativeVertical' atomic='yes' checkMaxHeight='no'>
<defaultFont name='arial' style='plain' size='10' />
<defaultSubDrawFigureAttributes maxHeight='26' />
<!-- ContactNom, ContactPrenom -->
<serieDrawFigure locations='relativeHorizontal' checkMaxWidth='no'>
<defaultSubDrawFigureAttributes y='0' maxHeight='26' />
<!-- ContactPrenom -->
<textDrawFigure x='0' maxWidth='150'>
<instanceColumn schemaColumn='tblContact_Contactprenom' />
</textDrawFigure>
<!-- ContactNom -->
<textDrawFigure x='4' maxWidth='150'>
<instanceColumn schemaColumn='tblContact_Contactnom' />
</textDrawFigure>
</serieDrawFigure>
<!-- rue -->
<textDrawFigure maxHeight='50'>
<instanceColumn schemaColumn='tblContactadresse_Adresserue' />
</textDrawFigure>
<!-- CP, ville -->
<serieDrawFigure locations='relativeHorizontal' checkMaxWidth='no'>
<defaultSubDrawFigureAttributes y='0' maxHeight='26' />
<!-- CP -->
<textDrawFigure x='0' maxWidth='38'>
<instanceColumn schemaColumn='tblContactadresse_Adressecp' />
</textDrawFigure>
<!-- ville -->
<textDrawFigure x='4' maxWidth='200'>
<instanceColumn schemaColumn='tblContactadresse_Adresseville' />
</textDrawFigure>
</serieDrawFigure>
</serieDrawFigure>
|
Quelques remarques :
Dans la plupart des cas on désactive le contrôle de cohérence des tailles
(checkMaxHeight='no', checkMaxWidth='no'). Ceci est à nos
risques et périls : si les données sont trop grandes, elles se
chevaucheront...
Le serieDrawFigure principal est en mode relativeVertical ce
qui signifie que l'ordonnée de chaque drawFigure enfant est relative à
la taille du drawFigure qui le précède. Autrement dit, si la rue est un
champ vide, alors le code postal et la ville prendront sa place sans
laisser une ligne vide.
Le serieDrawFigure enfant, pour le prénom et nom, est en mode
relativeHorizontal pour que le nom se mette à la suite du prénom
(sans apparaître "en colonne"). Idem pour le code postal et la ville.
Il nous reste à voir la source de donnée de notre état :
<printerDataSource>
<selectQuery db='dbDemoContact'>
<selectStatement>
<instancePk>
<instanceTable schemaTable='tblContactadresse' />
</instancePk>
<instanceColumnList>
<instanceColumn schemaColumn='tblContact_Contactprenom' />
<instanceColumn schemaColumn='tblContact_Contactnom' />
<instanceColumn schemaColumn='tblContactadresse_Adresserue' />
<instanceColumn schemaColumn='tblContactadresse_Adressecp' />
<instanceColumn schemaColumn='tblContactadresse_Adresseville' />
</instanceColumnList>
</selectStatement>
<fromStatement>
<mainInstanceTable schemaTable='tblContactadresse' />
<fkJoin join='inner'>
<instanceFk schemaFk='fk_tblContactadresse_tblContact' />
</fkJoin>
</fromStatement>
</selectQuery>
</printerDataSource>
|
C'est une requête simple (et non un selectQueryBuilder dynamique). Comme on ne
spécifie pas de mode au printerDataSource, il prendra sa valeur par défaut
pour le cas d'une simple requête : mode='merge'. On redéfinit ici les
clauses Select et From. La requête finale récupérera donc les clauses Where et
OrderBy dans la requête de la listForm.
Top
© Copyright 2003 Sashipa-Melba Team.
Ce document de la technologie Sashipa-Melba est
sous licence GNU FDL Vous
pouvez le copier et modifier librement les copies tant que cette mention apparaît clairement.
|