HOWTO développement Sashipa
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 :
<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.
© 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.