IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Au Pied Levé - À Main Levée

I-2.2.2. Règles de développement

Noter ce billet
par , 01/04/2020 à 11h00 (392 Affichages)
APL-AML est une monographie fragmentée en plusieurs billets pour des raisons de volume.
Un billet SYNOPSIS et un billet SOMMAIRE agrègent tous les billets du blog via des liens hypertextes.

■ ■ ■ SOMMAIRE DU BILLET ■ ■ ■

  1. Les écrans
    • Structure d’accueil
    • Convivialité
    • Ergonomie
  2. Les états
    • Structure d’accueil
    • Formulaires
    • Commandes HP PCL 5 et GPL/2
  3. Les shells
    • Adoption d’un standard
    • Exemple de shell invoqué via un item du menu ou depuis le prompt
    • Exemple de shell avec une fonction récursive
  4. Le système de menus
  5. Beauté du logiciel
L’objectif n’est rien d’autre que de concevoir un AGL de développement simple, non contraignant pour optimiser, standardiser la programmation, pour organiser la synergie des investissements.

Un exercice intéressant consiste à demander à un groupe de développeurs (ou d’étudiants) de concevoir l’écran répondant aux besoins exprimés par des gestionnaires à partir d’une description des données utiles de la base de données. Il est étonnant de constater la diversité et la complexité des propositions alors que l’on pourrait s’attendre à une convergence des réflexions et que les écrans proposés soient sinon identiques, du moins très ressemblants.

1. Les écrans

Structure d'accueil

La structure d’accueil d’un écran est relativement simple et peut se résumer en :

  • Définition des écrans
  • Liste des tables utilisées
  • Définition des attributs de chaque table
  • Instructions

Les sources de quelques écrans, spécifiques du SGBD/R « Informix ESQL », n’apporteront rien aux adeptes d’autres langages, ce n’est pas l’objectif.

Ce n’est même pas du 4GL, il n’y a pas de boîtes de dialogue qui transforment les gestionnaires en assistés-cliqueurs. Tout est dans l’épure ergonomique du mode caractère et la convivialité, concernant la fonctionnalité de l’IHM ; dans les règles de mise en page et les commentaires, concernant sa programmation.

NB : Des programmes écrans sont proposés dans les « Annexes ». Ils montrent la cohérence, la qualité, la rigueur, la lisibilité des développements pourtant réalisés dans un contexte APL-AML.

Convivialité

La convivialité s'intéresse au dialogue Logiciel <-> Terminaliste, donc au contenu :

  • regroupement des informations de même nature,
  • titres et messages explicites,
  • codification mnémonique,
  • conventions,
  • symbolisme,
  • logos,
  • etc.

Ergonomie

(du grec ergon, travail), l'ergonomie a pour objectif d'optimiser la productivité.

En informatique, l'ergonomie des écrans concerne leur contenant, à savoir leur aspect physique (équilibré, structuré), leur charte graphique, leur esthétique, leur dynamique (enchaînements, déplacement du curseur, raccourcis).

L'enchainement des fonctionnalités et leurs positionnements graphiques doivent permettre un parcours logique et fluide pour les utilisateurs.

Bien que l'on évoque moins l'ergonomie des états, les choix du format (A3/A4), du mode d'impression (portrait/paysage), de l'impression (recto/recto-verso), sont autant de critères ergonomiques auxquels il convient d'associer l'adoption de la même charte graphique, la même esthétique que celle des écrans.

À partir d’un écran (ou d’un état, d’ailleurs), on peut estimer le degré de réflexion du développeur et déceler, par exemple, s’il tient compte ou non des difficultés visuelles de beaucoup d’utilisateurs, de leur éventuelle fatigue mentale, ou du fait que la plupart des gens ne lisent pas (états). La simple conception d’un écran met en évidence l’esprit d’analyse et de synthèse, la créativité, la technicité, la simplicité, la qualité du message, la personnalité, l’humanité.

On peut certainement dire qu’il y a autant de versions d’écrans que de développeurs. Pourtant, à partir des mêmes besoins utilisateur, il ne devrait y avoir qu’une version idéale.

Au même titre que la graphologie est une technique d'analyse de l'écriture qui affirme pouvoir déduire systématiquement des caractéristiques psychologiques de la personnalité d’un individu à partir de l’observation de son écriture manuscrite, l’analyse d’un écran ou d’un état (Conceptologie ?) devrait pouvoir déduire la technicité et la personnalité du développeur.

Anecdote :


Dans le cadre d’un DUT en Formation Permanente, une question de DST très subtile demandait de dessiner un écran à partir de besoins utilisateurs et d’une description rudimentaire de quelques tables d’une BDD.

Sur 30 informaticiens aguerris, je suis le seul à proposer l’écran attendu. Il est intéressant de constater la diversité du degré de réflexion des protagonistes en situation de stress. La création d’un écran, d’un état, d’une application, d’une BDD, tout cela dépend finalement de la personnalité, de la psychologie du développeur, de son engagement et non d’une réflexion cartésienne aboutie débouchant vers La solution idéale.

2. Les états

Structure d'accueil

Même les langages structurés ne peuvent pas empêcher de programmer sans rigueur. Il appartient à chacun de créer ses propres bonnes pratiques de programmation. Ça n’est pas vraiment de la documentation mais des règles de mise en page à l’instar des règles de mise en page des livres. Personnellement, j’ai besoin d’au moins deux mois de pratique pour apprivoiser un nouveau langage, pour créer ce que j’appelle ma « Structure d’accueil ».

La « Structure d'accueil » standardise les conventions adoptées, les règles d'écriture et de présentation des programmes d’édition créés avec le générateur d’état ace (Informix) :

  • squelette du programme, canevas,
  • identification du programme,
  • méthodologie de programmation,
  • utilisation des majuscules et des minuscules,
  • indentation,
  • noms de variables communs à tous les programmes de l'application,
  • règle d'écriture des paramètres et variables spécifiques,
  • shell d'exécution, sous forme de commentaire, en fin de programme.

Discussion : Documentation sur la documentation

IFA2377 :
Une fois définie pour un langage, la difficulté réside dans son adaptation aux spécificités d'un nouveau langage. Une structure d'accueil n'a rien de contraignant car chaque nouveau programme s'écrit à partir d'une copie de programme(s) existant(s), et les éditeurs permettent de faire facilement des copier-coller. Certains développeurs pourraient cependant y voir un frein à leur créativité. Concevoir une structure d'accueil, n'est-ce pas précisément faire preuve d'imagination ? Certes, il s'agit de s'investir sur l'esthétique, la présentation, la lisibilité plutôt que sur les astuces de programmation, mais quel est l'intérêt de réinventer l'eau chaude à chaque nouveau programme ?

L'objectif de la structure d'accueil est de rendre le programme aussi lisible qu'un document écrit afin d'éviter le recours à tout dossier d’analyse ou de programmation, à tout organigramme. Tous les programmes étant construits d'après la même architecture, il suffit à une tierce personne de saisir le fil conducteur, de comprendre la logique qui a régi l'un des programmes de l'application pour qu'elle « décode » tous les autres sans difficulté. Rien n'est plus décevant, angoissant, déprimant que d'intervenir dans un programme sans personnalité, sans repères, sans la moindre trame décelable, susceptible d'en guider la lecture.

Certains artifices de forme ne sont pas à négliger. WINDEV, Delphi, les éditeurs utilisent la couleur pour distinguer instructions, données et variables. Dans le même esprit, sous UNIX, le seul fait d'utiliser des majuscules pour les instructions et des minuscules pour les données ou variables améliore considérablement la lecture des programmes (le compilateur Informix traite indifféremment les majuscules et les minuscules). En rendant les instructions suffisamment compréhensibles, les traitements se passent de commentaires. En résumé, un programme est un tout, pas seulement un cocktail de codes commentés, mais un véritable document lisible, digeste qui se suffit à lui-même.
Discussion : Qu’est-ce qu’un bon code ?

IFA2377 :
Je ne sais pas si tous les compilateurs l’acceptent, mais personnellement j’utilise les MAJUSCULES pour les INSTRUCTIONS et les minuscules pour les données. Ce n’est pas grand-chose mais cela apporte un peu de relief et je lis mieux mon code. Évidemment, toutes les données que je manipule sont préfixées.

J’exploite également les caractères début/fin de commentaire, pas forcément pour commenter mais pour structurer visuellement, pour habiller le programme afin de le rendre le plus lisible et le plus compréhensible possible. Je parle de structure d’accueil, de canevas, de squelette ou encore de skin.

Lorsque je m’initie à un nouveau langage, il me faut bien deux mois de développement pour créer et affiner mon environnement de développement. Je ne pense pas que cette démarche soit enseignée, en tout cas elle ne l’était pas dans les années 80.
yahiko :
…/… Je ne pense pas qu'il soit nécessaire de gaspiller un mois de temps de développeur pour concevoir un environnement de développement à chaque nouveau langage appris.
La réaction de yahiko illustre bien l’incompréhension de ma démarche. L’apprentissage procédural demande du temps. Ensuite, l’acquisition des automatismes s’entretient et se bonifie. Lorsque je parle d’affiner mon environnement de développement, il ne s’agit pas seulement des seuls développements mais également de ma mémoire procédurale. Je dois corréler mon nouveau langage avec les automatismes déjà « imprimés » sur mon petit disque dur, notamment ma démarche algorithmique. Et cela demande beaucoup de concentration, la volonté de trouver le meilleurs compromis.

Ainsi, le compilateur « ace » d’Informix ne nécessite pas de programmer les lectures et ne propose pas d’instruction « GO TO » ni « PERFORM ». Cela impose de s’adapter, d’utiliser des instructions de substitution. La démarche ne gaspille pas de temps de développement, le temps ne s’arrête pas, le nouvel environnement se construit en pratiquant le nouveau langage.

Structure d’accueil, canevas, squelette ou skin :

La structure d’accueil ci-après est en fait un programme tout-à-fait opérationnel, sans doute le plus minimaliste des programmes de l’application, déjà évoqué dans le Billet « Manuel utilisateur ».

Les informations « ACE », « Objet » et « Date » correspondent aux informations de l’IDENTIFICATION DIVISION du COBOL. Contrairement au COBOL, ces informations ne sont que des commentaires mais ont une certaine importance, surtout dans leur forme. La raison, c’est qu’avec une seule instruction unix, il est possible de créer un fichier de toutes les lignes « Objet » des programmes d’édition, par exemple, d’éditer le fichier créé pour alimenter par une requête SQL, une table spécifique dédiée à la gestion d’un atelier de génie logiciel.

Les clauses « BEFORE GROUP », « ON EVERY ROW » et « AFTER GROUP » ne sont rien d’autres que les « DÉBUT TRAITEMENT », « TRAITEMENT » et « FIN TRAITEMENT » de la structure itérative d’un algorithme LCP.

Les clauses « BEFORE GROUP » et « AFTER GROUP » sont ici en commentaires. Les structures itératives se déduisent de la clause « ORDER BY », laquelle figure également en commentaire dans ce petit programme.

Skin

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
{==================================== skin ====================================}
{                                                                              }
{   ACE    :  skin.ace                                                         }
{                                                                              }
{   SHELL  :  ../shell/skin                                                    }
{                                                                              }
{   AUTEUR :  IFA2377                                                          }
{                                                                              }
{   Objet  :  Structure d’accueil                                              }
{                                                                              }
{   Date   :  JJ MM AAAA                                                       }
{                                                                              }
{==============================================================================}

                           {========================}
{==========================} DATABASE mabase    END {==========================}
                           {========================}

{================================}  DEFINE  {==================================}
{}                                                                            {}
{}    PARAM[1] p_logname      CHAR(8)                                         {}
{}                                                                            {}
{}    VARIABLE ESC            CHAR(1)                                         {}
{}                                                                            {}
{==================================}  END  {===================================}

{==================================  INPUT  ===================================}
{}                                                                            {}
{     PROMPT FOR v_dp USING " STAGE : "                                        }
{}                                                                            {}
{===================================  END  ====================================}

{================================}  OUTPUT  {==================================}
{}                                                                            {}
{     REPORT TO PRINTER                                                        }
{}    REPORT TO PIPE "cat > ${LOGNAME}.prt"                                   {}
{}    TOP    MARGIN 0                                                         {}
{}    BOTTOM MARGIN 0                                                         {}
{}    LEFT   MARGIN 0                                                         {}
{}    PAGE   LENGTH 67                                                        {}
{}    TOP OF PAGE   "^L"                                                      {}
{}                                                                            {}
{==================================}  END  {===================================}

{=================================}  SELECT  {=================================}

           ln.papier_blanc     ln_papier_blanc,
           ln.destination      ln_destination

FROM       ln

WHERE      ln.logname        = $p_logname

{================================  ORDER  BY  =================================}

{==================================}  END  {===================================}

{=================================}  FORMAT  {=================================}

{-------------------------  BEFORE GROUP OF           -------------------------}

{---------------------------}  FIRST PAGE  HEADER  {---------------------------}

LET ESC = ASCII 027

PRINT ESC, "&k0g4S", ESC, "&l26a6.5c2e67f0o1X",
      ESC, ln_papier_blanc, ESC, ln_destination,
      ESC, "&a7L", ESC, "(s3B", ESC, "(10U"

{------------------------------}  PAGE  HEADER  {------------------------------}

SKIP 1 LINE

{------------------------------}  ON EVERY ROW  {------------------------------}

PRINT FILE "../shell/requete.prt"

{--------------------------  TRAITEMENT FIN DE PAGE  --------------------------}

{------------------------  TRAITEMENT EN-TÊTE DE PAGE  ------------------------}

{------------------------  TRAITEMENT  LIGNE COURANTE  ------------------------}

{-------------------------------  ON LAST ROW  --------------------------------}

{-------------------------  AFTER GROUP OF            -------------------------}

{-------------------------------  PAGE  TRAILER  ------------------------------}

{===================================}  END  {==================================}

Formulaires

Les démarches administratives des particuliers se font soit par internet, soit via un formulaire CERFA, c’est-à-dire un imprimé officiel dont le modèle est fixé par arrêté et téléchargeable en ligne sous forme de fichier PDF à imprimer puis à remplir. L'appellation "CERFA" provient du nom de l'organisme public chargé d'éditer ces formulaires : le centre d'enregistrement et de révision des formulaires administratifs (CERFA).

Dans une administration, il n’existe pas d’entité spécialisée dans la conception des états ou formulaires servant à la communication interne voire avec d’autres administrations. Certains de ces états peuvent être de véritables pièces comptables.

Le développeur est force de proposition et dans une démarche d’informatisation de type bottom-up, donc en situation d’urgence, il doit être performant, pertinent, administratif. Un programme d’édition se réalise entre quelques heures et quelques jours. L’état doit être soigné dans sa présentation, son orthographe, sa lisibilité, sa compréhension, etc.

Certains programmes d’édition peuvent être très complexes en termes de traitement d’informations fixes (tableaux, texte aligné/justifié, par exemple) et d’informations variables.

L’instruction « PRINT FILE "chemin_formulaire" » simplifie la programmation en traitant l’ensemble des informations fixes d’un état sous forme d’un fichier-formulaire imprimable.

Un simple traitement de texte mode caractère permet de créer sous MS/DOS un tel formulaire de qualité bureautique très convenable qui peut d’ailleurs éviter dans certains cas l’utilisation d’un pré-imprimé. Imprimer avec Informix des tableaux complexes, du texte aligné/justifié en différentes polices de tailles différentes, en variant l’interligne… devient facile.

SPRINT 1.5

Sprint a été le dernier traitement de texte en mode caractère des années 80. Il était capable d’imiter 4 ou 5 traitements de texte dont Word. Borland l’appelait « Le traitement de traitement de texte ». L’apparition du WYSIWYG l’a vite condamné.

Sa fonctionnalité géniale est de produire un fichier source « .prn » en langage HP PCL 5, éditable par lui-même. Il suffit d’ajouter une commande PCL 5 « Mémorisation de la position du curseur » en début de fichier puis de remplacer les deux dernières commandes « Saut de page » et « Initialisation de l’imprimante » par une commande « Rappel de la position du curseur » pour transformer le source en formulaire utilisable sous Unix.

  1. Sous MS/DOS : Tout d’abord, il faut ajouter un Carriage-return à la fin de chaque ligne du fichier .prn car sinon le fichier transféré sous Unix ne fera qu’un seul item. Il peut alors dépasser la taille maxi et surtout il devient ingérable sous l’éditeur Vi. L’opération peut se faire de différentes façons, soit avec le traitement de texte lui-même qui joue alors le rôle d’un excellent éditeur de texte, soit en convertissant le fichier MS/DOS en fichier Unix (en deux clics avec Notepad++).

  2. Sous MS/DOS ou Unix : Il convient d’intervenir en début de fichier pour dire à l’imprimante de mémoriser la position du curseur « [Esc]&f0S » et lui signifier un interligne nul « [Esc]&l0C » de façon à annihiler les Carriage-return ajoutés qui se traduiraient par des sauts de ligne. Les sauts de ligne sont déjà assurés par des commandes PCL de mouvement de l’index vertical « [Esc]&a+nnV »
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Esc]&l8c0e69F[Esc]&aR9[Esc]&l0O[Esc]&l0C
    
    [Esc]&f0S(10U(s0p12h10v0s0b3T[Esc]&a+190V(10U(s0p12h10v0s0b3T[Esc]&a2820H╔(10U(s0p12h10v0s3b3TFournisseur[Esc] (10U(s0p12h10v0s0b3T══════════════════════════════════╗
    [Esc]&a+20V(10U(s0p12h10v0s0b3T [Esc]&a266H(10U(s1p14v0s0b4148TXXXXXXXXXXXXXXXXXXX
    [Esc]&a+80V(10U(s1p14v0s0b4148T[Esc]&a2820H(10U(s0p12h10v0s0b3T║[Esc]&a5580H║
    [Esc]&a+60V(10U(s0p12h10v0s0b3T 
    
    …/…
  3. Toujours sous MS/DOS ou Unix : Il reste en fin de fichier à remplacer les commandes PCL de saut de page et réinitialisation de l’imprimante (générées par le traitement de texte) par la commande « Rappel de la position du curseur « [Esc]&f1S ».

Après l’exécution de l’instruction « PRINT FILE "chemin_formulaire" », le formulaire est donc imprimé et le curseur de l’imprimante repositionné au point d’origine du formulaire. Il ne reste plus au programme qu’à imprimer les variables éventuellement mises en forme par quelques commandes PCL de base (gras, italique, souligné, etc.) et pourquoi pas, à apporter quelques raffinements esthétiques simples grâce au langage GPL/2, comme griser ou encadrer une zone de texte.

Le principe peut bien sûr se sophistiquer pour imprimer en recto-verso sur format A4 ou A3.

Exemple de formulaire créé avec Sprint 1.5

Les caractères Escape (Alt/027) qui ne se voient pas ont été remplacés par « [Esc] » :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
[Esc]&l8c0e69F[Esc]&aR[Esc]9[Esc]&l0O[Esc]&l0C

[Esc]&f0S[Esc](10U[Esc](s0p12h10v0s0b3T[Esc]&a+130V[Esc](10U[Esc](s0p12h10v0s0b3T[Esc]&a3060H[Esc](10U[Esc](s0p10h12v0s0b3T┌─────────────────────┐
[Esc]&a+20V[Esc](10U[Esc](s0p10h12v0s0b3T   [Esc]&a266H[Esc](10U[Esc](s1p14v0s0b4148TACADEMIE DE CRETEIL
[Esc]&a+80V[Esc](10U[Esc](s1p14v0s0b4148T[Esc]&a3060H[Esc](10U[Esc](s0p10h12v0s0b3T│[Esc](10U[Esc](s0p10h12v0s3b3T ÉTAT DE LIQUIDATION[Esc](10U[Esc](s0p10h12v0s0b3T │
[Esc]&a+60V[Esc](10U[Esc](s0p10h12v0s0b3T         [Esc]&a672H[Esc](10U[Esc](s1p14v0s0b4148TRECTORAT
[Esc]&a+40V[Esc](10U[Esc](s1p14v0s0b4148T[Esc]&a3060H[Esc](10U[Esc](s0p10h12v0s0b3T└─────────────────────┘
[Esc]&a+80V[Esc](10U[Esc](s0p10h12v0s0b3T     [Esc]&a414H[Esc](10U[Esc](s1p12v0s0b4148T4, rue Georges Enesco
[Esc]&a+20V[Esc](10U[Esc](s1p12v0s0b4148T[Esc]&a2220H[Esc](10U[Esc](s0p12h10v0s0b3TDes indemnités d'enseignement dues au titre d'une action
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T     [Esc]&a343H[Esc](10U[Esc](s1p12v0s0b4148T94010  CRETEIL  CEDEX[Esc](10U[Esc](s0p12h10v0s0b3T       [Esc]&a2220Hde formation destinée aux personnels enseignants et mise
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T[Esc]&a2220Hen place par la[Esc](10U[Esc](s0p12h10v0s3b3T  C[Esc](10U[Esc](s0p12h10v0s0b3Tellule[Esc](10U[Esc](s0p12h10v0s3b3T A[Esc](10U[Esc](s0p12h10v0s0b3Tcadémique[Esc](10U[Esc](s0p12h10v0s3b3T F[Esc](10U[Esc](s0p12h10v0s0b3Tormation.
[Esc]&a+20V[Esc](10U[Esc](s0p12h10v0s0b3T             [Esc]&a804H────────
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T        [Esc]&a525H[Esc](10U[Esc](s1p8v0s0b4148TDIVISION DE L'ANIMATION
[Esc]&a+80V[Esc](10U[Esc](s1p8v0s0b4148T[Esc]&a614HET DE LA FORMATION
[Esc]&a+100V[Esc](10U[Esc](s1p8v0s0b4148T[Esc]&a804H[Esc](10U[Esc](s0p12h10v0s0b3T────────               [Esc]&a2220HAnnée Budgétaire :      Imputation :  Ch.        Art.
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T          [Esc]&a607H[Esc](10U[Esc](s1p8v0s0b4148TService de la Formation
[Esc]&a+80V[Esc](10U[Esc](s1p8v0s0b4148T[Esc]&a532Hdes Personnels Enseignants
[Esc]&a+20V[Esc](10U[Esc](s1p8v0s0b4148T[Esc]&a2220H[Esc](10U[Esc](s0p12h10v0s3b3TRÉFÉRENCES
[Esc](10U[Esc](s0p12h10v0s3b3T[Esc]&a2220H__________
[Esc]&a+60V[Esc](10U[Esc](s0p12h10v0s3b3T[Esc]&a1014H┘
[Esc]&a+40V[Esc](10U[Esc](s0p12h10v0s3b3T[Esc]&a2220H[Esc](10U[Esc](s0p16.66h8.5v0s0b0TDécret nø 83.1175 du 23 Décembre 1983
[Esc]&a+40V[Esc](10U[Esc](s0p16.66h8.5v0s0b0T          [Esc]&a454H[Esc](10U[Esc](s1p8v0s0b4148TTél. : 01.49.81.64.76 et 64.77
[Esc]&a+60V[Esc](10U[Esc](s1p8v0s0b4148T[Esc]&a2220H[Esc](10U[Esc](s0p16.66h8.5v0s0b0TContribution exceptionnelle de solidarité : Loi nø 82.939  du  4 novembre 1982
[Esc]&a+20V[Esc](10U[Esc](s0p16.66h8.5v0s0b0T[Esc](10U[Esc](s0p12h10v0s0b3T┌────────────────────────────────┐
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T[Esc]&a2220H[Esc](10U[Esc](s0p16.66h8.5v0s0b0TContribution Sociale Généralisée ........ : Loi nø 90.1168 du 29 décembre 1990
[Esc]&a+20V[Esc](10U[Esc](s0p16.66h8.5v0s0b0T[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a1980H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T[Esc]&a4120H[Esc](10U[Esc](s0p16.66h8.5v0s0b0T(art. 127 … 135)
[Esc]&a+20V[Esc](10U[Esc](s0p16.66h8.5v0s0b0T[Esc](10U[Esc](s0p12h10v0s0b3T└────────────────────────────────┘
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T┌┤[Esc](10U[Esc](s0p12h10v0s3b3TStage[Esc](10U[Esc](s0p12h10v0s0b3T├─────────────────────────────────────────────────────────────────────────────────────┐
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│        ┌───────────────────┐[Esc]&a5580H│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│Code  : │[Esc]&a1740H│[Esc]&a5580H│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│        └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘[Esc]&a5580H│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a5580H│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T└────────────────────────────────────────────────────────────────────────────────────────────┘
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T┌┤[Esc](10U[Esc](s0p12h10v0s3b3TFormateur[Esc](10U[Esc](s0p12h10v0s0b3T :      ├─────────────────────────────────────────────────────────────────────────┐
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a1500H┌[Esc](10U[Esc](s0p12h10v1s0b3T(Nø Ministère E.N.) [Esc](10U[Esc](s0p12h10v0s0b3T──────┐  Nø     ┌[Esc](10U[Esc](s0p12h10v1s0b3T(Nø Sécurité Sociale) [Esc](10U[Esc](s0p12h10v0s0b3T────┐┌Clé┐│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│ Personnel E.N. :  NUMEN│   │ │   │         │     │  INSEE :│ │   │   │   │     │     ││   ││
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a1500H└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘         └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘└─┴─┘│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│┌Civilité───────┐ ┌Nom d'usage[Esc](10U[Esc](s0p12h10v1s0b3T (d'épouse) [Esc](10U[Esc](s0p12h10v0s0b3T─────────┐ ┌Adresse───────────────────────────────┐│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T││               │ │[Esc]&a3060H│ │[Esc]&a5520H││
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│└───────────────┘ └───────────────────────────────┘ │[Esc]&a5520H││
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│┌Date naissance─┐ ┌Nom de naissance[Esc](10U[Esc](s0p12h10v1s0b3T (jeune fille) [Esc](10U[Esc](s0p12h10v0s0b3T─┐ │[Esc]&a5520H││
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T││   │   │       │ │[Esc]&a3060H│ │[Esc]&a5520H││
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│└─┴─┴─┴─┴─┴─┴─┴─┘ └───────────────────────────────┘ └──────────────────────────────────────┘│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│┌1%─┐ ┌RDS┐ ┌CSG┐ ┌Prénom─────────────────────────┐ ┌Grade ou Qualité──────────────────────┐│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T││   │ │   │ │   │ │[Esc]&a3060H│ │[Esc]&a5520H││
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│└───┘ └───┘ └───┘ └───────────────────────────────┘ └──────────────────────────────────────┘│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│┌Compte à créditer────────────────────────────────┐ ┌Résidence administrative :         ───┐│
[Esc]&a+50V[Esc](10U[Esc](s0p12h10v0s0b3T││[Esc]&a3060H│ │[Esc]&a5520H││
[Esc]&a+50V[Esc](10U[Esc](s0p12h10v0s0b3T││[Esc](10U[Esc](s0p16.66h8.5v0s0b0T┌────┬────┐[Esc](10U[Esc](s0p12h10v0s0b3T[Esc]&a3060H│ │[Esc]&a5520H││
[Esc]&a+50V[Esc](10U[Esc](s0p12h10v0s0b3T││[Esc](10U[Esc](s0p16.66h8.5v0s0b0T│MODE│    │[Esc](10U[Esc](s0p12h10v0s0b3T[Esc]&a3060H│ │[Esc]&a5520H││
[Esc]&a+50V[Esc](10U[Esc](s0p12h10v0s0b3T││[Esc](10U[Esc](s0p16.66h8.5v0s0b0T└────┴────┘[Esc](10U[Esc](s0p12h10v0s0b3T[Esc]&a3060H│ │[Esc]&a5520H││
[Esc]&a+50V[Esc](10U[Esc](s0p12h10v0s0b3T││[Esc]&a3060H│ │[Esc]&a5520H││
[Esc]&a+50V[Esc](10U[Esc](s0p12h10v0s0b3T││[Esc]&a3060H│ │[Esc]&a5520H││
[Esc]&a+50V[Esc](10U[Esc](s0p12h10v0s0b3T││[Esc]&a3060H│ │[Esc]&a5520H││
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T││┌Établiss.┐┌Guichet──┐┌Nø de compte─────────┬Clé┐│ │[Esc]&a5520H││
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│││         ││         ││[Esc]&a2760H│   ││ │[Esc]&a5520H││
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T└┴┴─┴─┴─┴─┴─┴┴─┴─┴─┴─┴─┴┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴┴─┴──────────────────────────────────────┴┘
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T┌┤[Esc](10U(s0p12h10v0s3b3TPrestation[Esc](10U[Esc](s0p12h10v0s0b3T├────────────────────────────────────────┬─────────────┬─────────────┬───────────┐
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│    Cours    │     T.P.    │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│Dates[Esc]&a3180H├──────┼──────┬──────┼──────┤Total  brut│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T├Interventions───────────────────────────────────────┬Heures┬Taux──┬Heures┬Taux──┼───────────┤
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T└────────────────────────────────────────────────────┼──────┼──────┼──────┼──────┼───────────┤
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T ┌───────────────────────────────┐[Esc]&a3180H│      │      │      │      │           │
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T┌┤[Esc](10U[Esc](s0p12h10v0s3b3TCertifié l'exécution du service[Esc](10U[Esc](s0p12h10v0s0b3T├─────────────┬─────┴──────┴──────┴──────┴──────┴───────────┤
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│└───────────────────────────────┘             │[Esc]&a5580H│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+100V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T│      Pour le Recteur et par délégation       │[Esc]&a5580H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T│         Pour le Secrétaire Général           │[Esc]&a5580H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T│             Le Chef de Division              │[Esc]&a5580H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T│[Esc]&a2820H│[Esc]&a5580H│
[Esc]&a+80V[Esc](10U[Esc](s0p12h10v0s0b3T└──────────────────────────────────────────────┴─────────────────────────────────────────────┘[Esc]&f1S

Commandes HP PCL 5 et GPL/2

Petit mémo du langage HP PCL 5 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
{----------------------------   COMMANDES PCL 5    ----------------------------}
{                                                                              }
{ IMPORTANT : Respecter l'ordre des commandes                                  }
{                                                                              }
{---------------------- COMMANDES DE CONTRÔLE DE TRAVAUX ----------------------}
{                                                                              }
{ ESC E       = RÉINITIALISATION      :                                        }
{ ESC &l0S    = RECTO SEUL            : Mode d'impression                      }
{ ESC &l1S    = RECTO VERSO           : Marge reliure en long                  }
{ ESC &l2S    = RECTO VERSO           : Marge reliure en large                 }
{ ESC &a0G    = PAGE SUIVANTE         : Sélection du côté de la feuille        }
{ ESC &a1G    = RECTO                 : Sélection du côté de la feuille        }
{ ESC &a2G    = VERSO                 : Sélection du côté de la feuille        }
{                                                                              }
{------------------------COMMANDES DE CONTRÔLE DE PAGE-------------------------}
{                                                                              }
{ ESC &k0G    = TERMINAISON DE LIGNE  : CR = CR; LF = LF; FF = FF              }
{                                                                              }
{ ESC &l1H    = PROVENANCE DU PAPIER  : Bac supérieur                          }
{ ESC &l4H    = PROVENANCE DU PAPIER  : Bac inférieur                          }
{ ESC &l5H    = PROVENANCE DU PAPIER  : Bac A3 (HP 5Si, HP 8000)               }
{                                                                              }
{ ESC &l26A   = FORMAT DU PAPIER      : Format A4                              }
{ ESC &l27A   = FORMAT DU PAPIER      : Format A3                              }
{                                                                              }
{ ESC &l1O    = ORIENTATION           : À l'italienne                          }
{ ESC &l0O    = ORIENTATION           : À la française                         }
{                                                                              }
{------------------------ MARGES ET LONGUEUR DU TEXTE  ------------------------}
{                                                                              }
{ ESC &9      = EFFACEMENT DES MARGES : Marges horizontales                    }
{ ESC &a6L    = MARGE DE GAUCHE       : 6 colonnes                             }
{ ESC &l90U   = MARGE DE GAUCHE       : 90 décipoints (200 = 12mm)             }
{ ESC &l#E    = MARGE SUPÉRIEURE      : # Nbre de lignes                       }
{ ESC &l0E    = MARGE SUPÉRIEURE      : En nombre de lignes (0)                }
{ ESC &l66F   = HAUTEUR DU TEXTE      : En nombre de lignes (66)               }
{ ESC &l57P   = HAUTEUR DE PAGE       : En nombre de lignes (57)               }
{                                                                              }
{----------------------- ESPACEMENT DES LIGNES --------------------------------}
{                                                                              }
{ ESC &l#C    = ESPACEMENT DES LIGNES : # Nbre de pas en 1/48"                 }
{ ESC &l0C    = ESPACEMENT DES LIGNES : Index vertical = 0                     }
{ ESC &l8C    = INDEX DE MOUVEMENT VMI: En 1/48" (=> 15 décipoints)            }
{ ESC &l0C    = INDEX DE MOUVEMENT VMI: Index vertical = 0                     }
{ ESC &l6D    = ESPACEMENT DES LIGNES : 6 lignes/pouce (=> ESC, "&l8C")        }
{ ESC &l8D    = ESPACEMENT DES LIGNES : 8 lignes/pouce (=> ESC, "&l6C")        }
{                                                                              }
{ ESC &k0G    = TERMINAISON DE LIGNE  : CR = CR; LF = LF; FF = FF              }
{                                                                              }
{----------------------------------POLICES-------------------------------------}
{                                                                              }
{ ESC (1F     = JEU DE SYMBOLE        : ISO 69 : Francais                      }
{ ESC (10U    = JEU DE SYMBOLE        : PC-8                                   }
{                                                                              }
{ ESC &k4S    = DENSITÉ DE LA POLICE  : Elite (12.0)                           }
{ ESC &k2S    = DENSITÉ DE LA POLICE  : Comprimé (16.5-16.7)                   }
{                                                                              }
{ ESC &(s0S   = STYLE   DE LA POLICE  : Romain                                 }
{ ESC &(s1S   = STYLE   DE LA POLICE  : Italique                               }
{                                                                              }
{ ESC &(s0B   = GRAISSE DE LA POLICE  : Normal                                 }
{ ESC &(s3B   = GRAISSE DE LA POLICE  : Gras                                   }
{                                                                              }
{ ESC (s0P    = ESPACEMENT POLICE PR. : Espacement fixe                        }
{ ESC (s1P    = ESPACEMENT POLICE PR. : Espacement proportionnel               }
{                                                                              }
{ ESC (s#H    = DENSITÉ POLICE PRINC. : # nbre de caractères par pouce         }
{ ESC &k0S    = DENSITÉ POLICE PRINC. : 10.0 caractères par pouce              }
{ ESC &k2S    = DENSITÉ POLICE PRINC. : Comprimé (16.5-16.7)                   }
{                                                                              }
{ ESC (s40V   = TAILLE POLICE PRINC.  : Taille en nombre de points             }
{                                                                              }
{ ESC (s3T    = TYPE POLICE PRINC.    : Type de caractères courrier            }
{ ESC (s4148T = TYPE POLICE PRINC.    : Type de caractères Univers             }
{ ESC (s4101T = TYPE POLICE PRINC.    : Type de caractères CG Times            }
{ ESC (s0T    = TYPE POLICE PRINC.    : Type de caractères LinePrinter         }
{ ESC (10U ESC (s0p16.67h8.5v0s0b0T   : Type de caractères LinePrinter         }
{                                                                              }
{--------------------------POSITIONNEMENT DU CURSEUR---------------------------}
{                                                                              }
{ ESC &f0S    = SAUVEGARDE CURSEUR    : Sauvegarde de la position du curseur   }
{ ESC &f1S    = RAPPEL     CURSEUR    : Rappel de la position du curseur       }
{                                                                              }
{ ESC &a#R    = POSITIONNEMENT CURSEUR: vertical en nombre de points           }
{ ESC &aR     = POSITIONNEMENT CURSEUR: En haut a gauche                       }
{ ESC &a#V    = POSITIONNEMENT CURSEUR: Vertical   en nombre de décipoints     }
{                                       RELATIF OU ABSOLU                      }
{                                       1 inch = 720 décipoints                }
{                                       (exemple : ESC &a+200V)                }
{ ESC &a#H    = POSITIONNEMENT CURSEUR: Horizontal en nombre de décipoints     }
{ ESC &a#C    = POSITIONNEMENT CURSEUR: Horizontal en nombre de colonnes       }
{ ESC =       = POSITIONNEMENT CURSEUR: 1/2 saut de ligne                      }
{                                                                              }
{-------------------------------Soulignement-----------------------------------}
{                                                                              }
{ ESC &d0D    = SOULIGNEMENT         : Soulignement actif continu              }
{ ESC &d3D    = SOULIGNEMENT         : Soulignement actif flottant             }
{ ESC &d@     = SOULIGNEMENT         : Soulignement désactivé                  }
{                                                                              }
{--------------------------Séquence d'initialisation---------------------------}
{                                                                              }
{ PRINT ESC, "E", ESC, "&l8c0e70F", ESC, "&aR",ESC, "9", ESC, "&l0o6.5C";      }
{ PRINT ESC, "(10U", ESC, "(s0p12h10v3b3T", ESC, "&a7L"                        }
{                                                                              }
{----------------------------impression LANDSCAPE------------------------------}
{                                                                              }
{ PRINT ESC, "&k2S", ESC, "&l1o76p4H", ESC, "&l6C", ESC, "&a15L", ESC, "(1F";  }
{                                                                              }
{------------------------------------------------------------------------------}
{                                                                              }
{ Impression A4 (Extrait de ../ace/om.ace)                                     }
{                                                                              }
{ PRINT ESC, "E", ESC, "&l8c0e70F", ESC, "&aR",ESC, "9", ESC, "&l0o6.5C";      }
{                                                                              }
{ IF if_omp_non = "N"                                                          }
{ THEN PRINT ESC, ln_pre_imprime,  ESC, ln_destination;                        }
{ ELSE PRINT ESC, ln_papier_blanc, ESC, ln_destination;                        }
{                                                                              }
{ IF p_traitement = "D"                                                        }
{ THEN PRINT ESC, "&l1X"                                                       }
{ ELSE PRINT ESC, "&l2X"                                                       }
{                                                                              }
{ SKIP 1 LINE                                                                  }
{                                                                              }
{ PRINT ESC, "(10U", ESC, "(s0p12h10v3b3T", ESC, "&a7L"                        }
{                                                                              }
{------------------------------------------------------------------------------}
{                                                                              }
{ Impression A4 ou A3 (Extrait de ../ace_1/confirme.ace)                       }
{                                                                              }
{ IF p_format = "A4"                                                           }
{ THEN PRINT ESC, "E", ESC, "&f0S", ESC, "&k0g4S", ESC, "&l26a1h0o1x7C",       }
{            ESC, "&a5L", ESC, "(10U", ESC, "(s3B";                            }
{ ELSE PRINT ESC, "E", ESC, "&f0S", ESC, "&k0g4S", ESC, "&l27a5h1o1x7C",       }
{            ESC, "&a105L", ESC, "(10U", ESC, "(s3B";                          }
{                                                                              }
{------------------------------------------------------------------------------}
{                                                                              }
{ Impression RECTO/VERSO + formulaire (Extrait de ../ace_mj/mj_convoc.ace)     }
{                                                                              }
{ 1. RECTO                                                                     }
{                                                                              }
{ IF PAGENO = 1                                                                }
{ THEN PRINT ESC, "&k0g4S", ESC, "(10U", ESC, "&l1S", ESC, "&l6.5c0e1X",       }
{            ESC, "&aR", ESC, "&a1g7L", ESC, "&9";                             }
{ ELSE PRINT ESC, "&l6.5c0E", ESC, "&aR", ESC, "&a1g7L", ESC, "&9";            }
{                                                                              }
{ etc.                                                                         }
{                                                                              }
{ 2. VERSO                                                                     }
{                                                                              }
{ PRINT ESC,"&a0G", ESC,"&a7480v1910H", ESC,"*c760a230b15g2P", ESC,"*v0n1O"    }
{                          Y    X             L   H                            }
{ IF  tj_c_tj   = "SE"                                                         }
{ THEN  PRINT FILE "../file/fd_se.file"                                        }
{ ELSE  PRINT FILE "../file/fd_ie.file"                                        }
{                                                                              }
{ 3. ../file/fd_se.file :                                                      }
{                                                                              }
{ ESC, "&l8c0e69F", ESC, "&aR", ESC, "9", ESC, "&l0O", ESC, "&l0C"             }
{                                                                              }
{ ESC, "&f0S", ESC, "(10U", ESC, "(s0p12h10v0s0b3T", ESC, "&a+180V, etc...     }
{ etc... ESC, "&l6D", ESC, "&f1S"                                              }
{                                                                              }
{------------------------------------------------------------------------------}

Premières séquences d'échappement d'un programme d'édition :

{================================}  DEFINE  {==================================}
{}                                                                            {}
{}    VARIABLE ESC             CHAR(1)                                        {}
{}                                                                            {}
{==================================}  END  {===================================}

{------------------------------}  PAGE  HEADER  {------------------------------}

LET ESC = ASCII 027

PRINT ESC, "E", ESC, "&l8c0e70F", ESC, "&aR",ESC, "9", ESC, "&l0o6.5C";
PRINT ESC, "(10U", ESC, "(s0p12h10v3b3T", ESC, "&a7L"

{------------------------------------------------------------------------------}

PRINT ESC, "(s1p14v3b16602T"
PRINT "BLABLABLA"
PRINT ESC, "(s0p10v0b3T"

{------------------------------------------------------------------------------}

Le mode graphique HP GL-2

Avec un minimum de HP GL-2, on peut facilement ajouter un peu de fantaisie à la qualité bureautique que permet déjà le langage HP PCL 5/6 avec ses commandes usuelles.

La séquence ci-dessous :

- génère un rectangle,
- grise l'intérieur de ce rectangle,
- imprime en défonce un texte en police Univers,
- remet le type de remplissage en noir pour mettre fin au remplissage "fantaisie" précédent,
- réinitialise la police principale.

Défonce : remplissage des caractères du texte en blanc uni.

PRINT COLUMN  20, ESC, "%0B", "IN", "SP1",
                  "PU2200,6600", "EA5680,6860", ESC, "%0A",
                  ESC, "*c1030a80b45g2P", ESC, "*v0n1O", ESC, "*v1T",
                  ESC, "(s1p14v3b4101T",
                  ESC, "*p+60y+60X", "ORDRE DE MISSION ",
                  ESC, "(s1p12v3b4101T",
                  " (modification)", ESC, "*v0T"
PRINT             ESC, "(s0p10v0b3T"

PCL2PDF : Si l'on est amené à utiliser ce logiciel pour générer un fichier PDF, il faut savoir qu'il gère mal cette séquence. Le rectangle apparaît dissocié de l'espace grisé. Par contre, le rendu du grisé est d'une bien meilleure qualité.

{------------------------------------------------------------------------------}

3. Les shells

Adoption d'un standard

Adopter un affichage standard comprenant :

  • La liste commentée des paramètres à renseigner
  • L’affichage éventuel d’un commentaire pour les gestionnaires
  • La saisie des paramètres
  • L’éventuel SQL sollicité en commentaire

# Le signe typographique croisillon « # » (appelé hash en anglais) indique que le texte qui suit est du commentaire.

Exemple de shell invoqué via un item du menu ou depuis le prompt

L’affichage du shell pour les gestionnaires ne se fait que sur 73 caractères sur les 80 possibles car la commande d’affichage d’une ligne prend 7 caractères : « echo "" ». Afficher une ligne de 80 caractères pour les gestionnaires pénaliserait le développement en affichant chaque ligne de 80 + 7 caractères sur deux lignes… Trop compliqué à gérer.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
# anonymat

# Ce shell est activé :
#
# - soit via un item du menu qui exporte auparavant le code complet du concours 
#   ex : AFFECTATION DES N° D'ANONYMAT 
#        P=AA-1C_CE_07; export P; ../shell_1/anonymat
#	
# - soit en ligne de commande, par le développeur, 
#   qui doit donc renseigner les code-type-session du concours 

clear

LENGTH=`expr "$P" : '.*'`
if test "$LENGTH" -eq 11
then 
     P_1=`expr "$P" : '\(.*\)......'`
     P_2=`expr "$P" : '......\(.*\)...'`
     P_3=`expr "$P" : '.........\(.*\)'`
fi
if test "$LENGTH" -eq 10
then
     P_1=`expr "$P" : '\(.*\)......'`
     P_2=`expr "$P" : '.....\(.*\)...'`
     P_3=`expr "$P" : '........\(.*\)'`
fi
if test "$LENGTH" -eq 9
then
     P_1=`expr "$P" : '\(.*\)......'`
     P_2=`expr "$P" : '....\(.*\)...'`
     P_3=`expr "$P" : '.......\(.*\)'`
fi
if test "$LENGTH" -eq 8
then
     P_1=`expr "$P" : '\(.*\)......'`
     P_2=`expr "$P" : '...\(.*\)...'`
     P_3=`expr "$P" : '......\(.*\)'`
fi
if test "$LENGTH" -eq 7
then
     P_1=`expr "$P" : '\(.*\)......'`
     P_2=`expr "$P" : '..\(.*\)...'`
     P_3=`expr "$P" : '.....\(.*\)'`
fi

echo "                              " $P_1 $P_2 $P_3
echo ""
echo "┌AFFECTATION DES N° D'ANONYMAT──────────────────────────────────────────┐"
echo "│                                                                       │"
echo "│ATTENTION : Ce traitement exécute au préalable un désistement global   │"
echo "│            suivi d'une suppression des pré-inscriptions désistées ou  │"
echo "│            refusées et seuls les présents sont pris en considération !│"
echo "├───────────────────────────────────────────────────────────────────────┤"
echo "│- 3 possibilités d'anonymer :                                          │"
echo "│                                                                       │"
echo "│1. soit en ordre croissant selon l'ordre alphabétique                  │"
echo "│   mais en décalant les N° de façon circulaire depuis un N° de place   │"
echo "│2. soit en affectant le N° de candidature seul connu d'INFORMIX        │"
echo "│3. soit en affectant le N° de place de l'admissibilité                 │"
echo "├───────────────────────────────────────────────────────────────────────┤"
echo "│ANONYMAT    :       [ <──┘ ]=[1], [2], [3]                             │"
echo "├───────────────────────────────────────────────────────────────────────┤"
echo "│N° DE PLACE :       [ <──┘ ]=[1], N° de départ (présent) du décalage   │"
echo "│N° ANONYMAT :       [ <──┘ ]=[1], N° d'anonymat pour ce N° de place    │"
echo "└───────────────────────────────────────────────────────────────────────┘"
echo ""

cd ../shell_1

SMSO=`tput smso`
RMSO=`tput rmso`

if [ "$LENGTH" = 0 ]
then

     tput cup 0 0
     echo " CONCOURS : "
     tput cup 0 12
     echo $SMSO"     "$RMSO
     tput cup 0 12
     read P_1
     if [ "$P_1" = "" ]
     then P_1=0
     fi

     tput cup 0 0
     echo "                              " $P_1 $P_2 $P_3
     tput cup 0 0
     echo " TYPE     : "
     tput cup 0 12
     echo $SMSO"  "$RMSO
     tput cup 0 12
     read P_2
     if [ "$P_2" = "" ]
     then P_2=0
     fi
     echo ""

     tput cup 0 0
     echo "                              " $P_1 $P_2 $P_3
     tput cup 0 0
     echo " SESSION  : "
     tput cup 0 12
     echo $SMSO"  "$RMSO
     tput cup 0 12
     read P_3
     if [ "$P_3" = "" ]
     then P_3=0
     fi
     echo ""

     tput cup 0 0
     echo "                              " $P_1 $P_2 $P_3
     tput cup 1 0
     echo "                              "
fi

# CHOIX D'ANONYMAT
  tput cup 15 15
  echo $SMSO" "$RMSO
  tput cup 15 15
  read P_4
  tput cup 15 15
  echo " "
  if [ "$P_4" = "" ]
  then P_4=1
  fi
  if [ "$P_4" != "1" -a "$P_4" != "2" -a "$P_4" != "3" ]
  then P_4=1
  fi
  tput cup 15 15
  echo $P_4

# N° DE PLACE
  if [ "$P_4" = "1" ]
  then tput cup 17 15
       echo $SMSO"     "$RMSO
       tput cup 17 15
       read P_5
       tput cup 17 15
       echo "     "
       if [ "$P_5" = "" ]
       then P_5=1
       fi
       tput cup 17 15
       echo $P_5
  else P_5=0
  fi

# N° ANONYMAT
  if [ "$P_4" = "1" ]
  then tput cup 18 15
       echo $SMSO"     "$RMSO
       tput cup 18 15
       read P_6
       tput cup 18 15
       echo "     "
       if [ "$P_6" = "" ]
       then P_6=1
       fi
       tput cup 18 15
       echo $P_6
  else P_6=0
  fi

tput cup 20 0
echo " Traitement en cours... \c"

cp ../sql_1/1_global.sed ${LOGNAME}.sql

ed - "${LOGNAME}.sql" << !
,s/PROCESS/$$/g
,s/C_EC/$P_1/g
,s/T_EC/$P_2/g
,s/S_EC/$P_3/g
,s/GLOBAL/D/g
w
q
!

if [ "$DBLANG" = "" ]
then isql -s concours -qcre ${LOGNAME} > /dev/null
else isql -s concours -lceq ${LOGNAME} > /dev/null
fi

cp ../sql_1/supprime.sed ${LOGNAME}.sql

ed - "${LOGNAME}.sql" << !
,s/C_EC/$P_1/g
,s/T_EC/$P_2/g
,s/S_EC/$P_3/g
w
q
!

if [ "$DBLANG" = "" ]
then isql -s concours -qcre ${LOGNAME} > /dev/null
else isql -s concours -lceq ${LOGNAME} > /dev/null
fi

sacego -q ../ace_1/anonymat $P_1 $P_2 $P_3 $P_4 $P_5 $P_6 $LOGNAME

cp ../sql_1/anonymat.sed ${LOGNAME}.sql

ed - "${LOGNAME}.sql" << !
,s/LOGNAME/$LOGNAME/g
,s/C_EC/$P_1/g
,s/T_EC/$P_2/g
,s/S_EC/$P_3/g
w
q
!

if [ "$DBLANG" = "" ]
then isql -s concours -qcre ${LOGNAME} > /dev/null
else isql -s concours -lceq ${LOGNAME} > /dev/null
fi

echo "TERMINE !"

# {
# cec_global.sed
# }
# {
# lock table cec in exclusive mode;
# }
# unload to "C_EC.T_EC.PROCESS"
# select   cec.*
# from     cec
# where    cec.c_ec        = "C_EC"
# and      cec.t_ec        = "T_EC"
# and      cec.s_ec        = "S_EC"
# and     (cec.c_decision is null or cec.c_decision  = " ")
# order by cec.n_pec,
#          cec.n_cec;
#
# update   cec
# set      cec.c_decision  = "GLOBAL"
# where    cec.c_ec        = "C_EC"
# and      cec.t_ec        = "T_EC"
# and      cec.s_ec        = "S_EC"
# and     (cec.c_decision is null or cec.c_decision = " ");
# {
# unlock table cec;
# }

# {
# supprime.sed
# }
# 
# lock table cec in exclusive mode;
# 
# delete
# from  cec
# where cec.c_ec        = "C_EC"
# and   cec.t_ec        = "T_EC"
# and   cec.s_ec        = "S_EC"
# and   cec.c_decision is not null
# and   cec.c_decision  = "D";
# 
# unlock table cec;

# {
# anonymat.sed
# }
# 
# lock table tmp in exclusive mode;
# 
# delete from tmp where tmp.n_cec is not null;
# load from "LOGNAME.out" insert into tmp;
# 
# update cec
# set   (cec.anonymat,
#        cec.admis_1)
#    = ((select tmp.place,
#               tmp.admis_1
#        from   tmp
#        where  cec.n_cec = tmp.n_cec))
# where  cec.c_ec = "C_EC"
# and    cec.t_ec = "T_EC"
# and    cec.s_ec = "S_EC";
# 
# unlock table tmp;

Exemple de shell avec une fonction récursive

Il s’agit de la convocation de stagiaires par mailing. La fonction s’exécute autant de fois qu’il y a de stagiaires inscrits au stage.

Outre sa fonction récursive, ce shell est un exemple réel d’utilisation des deux logiciels pcl2pdf et mutt. Ces deux logiciels sont décrits dans le Billet « Environnement de Développement Intégré (EDI) »

Les convocations sont envoyées par courriel au secrétariat de l’établissement dont dépendent les stagiaires. À charge au secrétariat d’imprimer ces convocations et au chef d’établissement de les signer puis de les transmettre aux intéressés.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
# CF_MAILING_0

#┌──────────┬────┬─────────────────────────────────────────────────────────────┐
#│CF_LIST_0 │.lst│Création de la mailing-list des destinataires (N°)           │
#├──────────┼────┼─────────────────────────────────────────────────────────────┤
#│CF_ITEM_0 │.out│Création du destinataire en cours de traitement N°/nom/prénom│
#│CONVOC_0  │.prt│Création du fichier d'impression de la convocation           │
#│iso2pcl   │.pcl│Transformation des caractères semi-graphiques non reconnus   │
#│pcl2pdf   │.pdf│Conversion de la convocation "PCL" en fichier "PDF"          │
#│CF_MAIL_0 │.mel│Création de l'adresse E-mail du destinataire du courrier     │
#│CF_MSG_0  │.msg│Création du message personnalisé                             │
#├──────────┼────┼─────────────────────────────────────────────────────────────┤
#│mutt      │    │Envoi de la convocation "PDF" en pièce jointe au message     │
#│          │    │"From"       est paramétré dans : ~home/.muttrc              │
#│          │    │"ReturnPath" est paramétré dans : /etc/postfix/canonical.dbm │
#├──────────┼────┼─────────────────────────────────────────────────────────────┤
#│CF_sh_0   │.prt│Impression de l'écran "sh" pour confirmer l'E-mailing REEL   │
#└──────────┴────┴─────────────────────────────────────────────────────────────┘

################################ DÉBUT FONCTION ################################

E_mailing()
{
for ITEM in `cat ${LOGNAME}.lst 2>/dev/null`
do CPT=`expr $CPT + 1`

   tput cup 12 0 > `tty`
   echo "┌──────────────┬────────────────────────────────────────────────────────┐" > `tty`
   echo "│EN COURS      │                                                        │" > `tty`
   echo "└──────────────┴────────────────────────────────────────────────────────┘" > `tty`

   sacego -q ../ace_0/CF_ITEM_0 $ITEM

#  cat ${LOGNAME}.out >> CF_MAILING_0.out # Trace des .out #####################

   OBJET=`cat ${LOGNAME}.out`

   tput cup 13 17 > `tty`
   echo "`cat ${LOGNAME}.out 2>/dev/null \c`" > `tty`
   tput cup 13 9  > `tty`
#  echo "$ITEM\c" > `tty`

   sacego -q ../ace_0/CONVOC_0 $BDD $P_1 $ITEM $P_3 $P_4 $P_5 $T_R $LOGNAME

   cat ${LOGNAME}.prt | sed -f ../bull/iso2pcl.sed > ${LOGNAME}.pcl

   ../bull/pcl2pdf ${LOGNAME}.pcl ${P_1}_${ITEM}.pdf

   sacego -q ../ace_0/CF_MAIL_0 $ITEM $T_R $LOGNAME

#  cat ${LOGNAME}.mel >> CF_MAILING_0.out # Trace des .mel #####################

   sacego -q ../ace_0/CF_MSG_0 $BDD $P_1 $ITEM $P_3 $P_J $T_R

   if test -f ../ftp/${P_1}.pdf
   then mutt -e "my_hdr From: DAFOR <DAFOR-stage@ac-creteil.fr>"    \
             -s "Convocation $OBJET au stage ${P_1}"                \
             -a ${P_1}_$ITEM.pdf                                    \
             -a "../ftp/${P_1}.pdf"                                 \
                `cat ${LOGNAME}.mel 2>/dev/null` < ${LOGNAME}.msg
   else mutt -e "my_hdr From: DAFOR <DAFOR-stage@ac-creteil.fr>"    \
             -s "Convocation $OBJET au stage ${P_1}"                \
             -a ${P_1}_$ITEM.pdf                                    \
                `cat ${LOGNAME}.mel 2>/dev/null` < ${LOGNAME}.msg
   fi

   if [ $? -ne 0 ]
   then tput cup 13 17 > `tty`
        echo "Erreur lors de la convocation de $ITEM !!!" > `tty`
        LST_KO="$LST_KO"`cat ${LOGNAME}.out 2>/dev/null`"\n"
        CPT_KO=`expr $CPT_KO + 1`
   else CPT_OK=`expr $CPT_OK + 1`

        ########################################################################
        # Mise à jour de la date du mailing de la candidature (cf_n.d_mailing) #
        ########################################################################

        if [ "$T_R" = "REEL" ]
        then cp ../sql_0/CF_d_cf_0.sed ${LOGNAME}.sql

ed - "${LOGNAME}.sql" << !
,s/C_SF/$P_1/g
,s/N_PF/$ITEM/g
w
q
!

             if [ "$DBLANG" = "" ]
             then isql -s osmose -qcre ${LOGNAME} > /dev/null
             else isql -s osmose -lceq ${LOGNAME} > /dev/null
             fi

        fi

   fi

#  ############################################################################
#  # E-MAILING REEL : Envoi d'un double ###@creteil.iufm.fr                   #
#  #                                  à #####@univ-paris12.fr                 #
#  ############################################################################
#                    
#   K_1=`cat ${LOGNAME}.mel 2>/dev/null`
#
#   if [ "$K_1" = "###@creteil.iufm.fr" ]
#   then
#
#ed - "${LOGNAME}.mel" << !
#,s/drh@creteil\.iufm\.fr/#####@univ-paris12\.fr/g
#w
#q
#!
#
#   if test -f ../ftp/${P_1}.pdf
#   then mutt -e "my_hdr From: DAFOR <DAFOR-stage@ac-creteil.fr>"    \
#             -s "Convocation $OBJET au stage ${P_1}"                \
#             -a ${P_1}_$ITEM.pdf                                    \
#             -a "../ftp/${P_1}.pdf"                                 \
#                `cat ${LOGNAME}.mel 2>/dev/null` < ${LOGNAME}.msg
#   else mutt -e "my_hdr From: DAFOR <DAFOR-stage@ac-creteil.fr>"    \
#             -s "Convocation $OBJET au stage ${P_1}"                \
#             -a ${P_1}_$ITEM.pdf                                    \
#                `cat ${LOGNAME}.mel 2>/dev/null` < ${LOGNAME}.msg
#   fi
#
#   fi

#  ############################################################################
#  # E-MAILING REEL : Envoi d'un double de la 1ère convocation au gestionnaire#
#  ############################################################################
#
#  if [ "$CPT" = "1" -a "$P_2" = "0" -a "$T_R" = "REEL" ]
#  then TEST=TEST
#
#       sacego -q ../ace_0/CF_MAIL_0 $ITEM $TEST $LOGNAME
#
#       if test -f ../ftp/${P_1}.pdf
#       then mutt -e "my_hdr From: DAFOR <DAFOR-stage@ac-creteil.fr>"    \
#                 -s "E-MAILING REEL stage ${P_1}"                       \
#                 -a ${P_1}_$ITEM.pdf                                    \
#                 -a "../ftp/${P_1}.pdf"                                 \
#                    `cat ${LOGNAME}.mel 2>/dev/null` < ${LOGNAME}.msg
#       else mutt -e "my_hdr From: DAFOR <DAFOR-stage@ac-creteil.fr>"    \
#                 -s "E-MAILING REEL stage ${P_1}"                       \
#                 -a ${P_1}_$ITEM.pdf                                    \
#                    `cat ${LOGNAME}.mel 2>/dev/null` < ${LOGNAME}.msg
#       fi
#  fi

   ############################################################################
   # E-MAILING TEST : Impression du 1er message et de la 1ère convocation     #
   ############################################################################

   if [ "$T_R" = "TEST" ]
   then cat ${LOGNAME}.prt | sed -f ../bull/iso2ascii.sed > ${LOGNAME}.tmp
        mv  ${LOGNAME}.tmp ${LOGNAME}.prt
        lp  ${LOGNAME}.prt > /dev/null

        cat ../doc/TOP_OF_PAGE  > ${LOGNAME}.tmp
        cat ${LOGNAME}.msg | sed -f ../bull/iso2ascii.sed >> ${LOGNAME}.tmp
        mv  ${LOGNAME}.tmp ${LOGNAME}.msg
        lp  ${LOGNAME}.msg > /dev/null
   fi

done

return
}

################################# FIN FONCTION #################################

################################# DÉBUT  SHELL #################################

# CONVOC_0

#           Paramètres
# BDD     = Code BDD
# P_1     = Stage
# P_2     = Numéro stagiaire
# P_3     = Nom    stagiaire
# P_4     = [M]odification
#           [R]égularisation
#           [D]uplicata
#           [A]dditif
#           [O]riginal
# P_5     = Signataire
# P_6     = Date mailing
# LOGNAME = Logname

#           Paramètres CF_LIST_0 CF_MAIL_0
# T_R     = [TEST] ou [REEL]
# P_J     = [OUI]/[NON] : Pièce jointe
# ITEM    = N° du stagiaire en cours de traitement dans la fonction "E_mailing"

clear

cd ../shell_0

if test -f ${LOGNAME}_log
then
echo "┌───────────────────────────────────────────────────────────────────────┐"
echo "│                                                                       │"
echo "├───────────────────────────────────────────────────────────────────────┤"
echo "│ATTENTION !                                                            │"
echo "│                                                                       │"
echo "│Un même utilisateur ne peut exécuter qu'un seul mailing à la fois.     │"
echo "│                                                                       │"
echo "│Si la trace d'un mailing en cours est la conséquence d'une interruption│"
echo "│(appui sur Ctrl/C), il est possible d'ignorer cet avertissement.       │"
echo "├───────────────────────────────────────────────────────────────────────┤"
echo "│TRAITEMENT ?   [ <──┘ ]=Ignorer l'avertissement                        │"
echo "│               [Ctrl/C]=Abandon                                        │"
echo "└───────────────────────────────────────────────────────────────────────┘"
tput cup 1 1
echo $LOGNAME "déjà en cours de mailing !..."
tput cup 10 14 
echo $SMSO" "$RMSO
tput cup 10 14 
read REPONSE # exit 1
clear
else echo $LOGNAME > ${LOGNAME}_log
fi

echo "┌E-MAILING CONVOCATION(S)───────────────────────────────────────────────┐"
echo "│                                                                       │"
echo "│STAGE         :            (en MAJUSCULES)                             │"
echo "│Nø  STAGIAIRE :            [ <──┘ ]=Tous, (Nø)                         │"
echo "│NOM STAGIAIRE :            [ <──┘ ]=Tous, (Nom sur 10 caractères maxi) │"
echo "│TRAITEMENT    :            [ <──┘ ],[M]odification                     │"
echo "│                                    [R]égularisation                   │"
echo "│                                    [D]uplicata                        │"
echo "│                                    [A]dditif                          │"
echo "│SIGNATAIRE    :            [ <──┘ ]=[RP] (Responsable Principal)       │"
echo "│                                    [RS] (Responsable Suppléant)       │"
echo "└───────────────────────────────────────────────────────────────────────┘"
echo "┌──────────────┬────────────────────────────────────────────────────────┐"
echo "│TEST ou REEL  │            [ <──┘ ]=[TEST], [REEL]                     │"
echo "└──────────────┴────────────────────────────────────────────────────────┘"

echo ""

if test -f ${LOGNAME}.*
   then rm ${LOGNAME}.*
fi

if test -f ../mutt_0/${P_1}.*
   then rm ../mutt_0/${P_1}.*
fi

SMSO=`tput smso`
RMSO=`tput rmso`
BLINK=`tput blink`

# STAGE
  tput cup 2 17
  echo $SMSO"          "$RMSO
  tput cup 2 17
  read P_1
  tput cup 2 17
  echo "          "
  if [ "$P_1" = "" ]
  then P_1=0
  else tput cup 2 17
       echo $P_1
  fi

# Nø STAGIAIRE
  tput cup 3 17
  echo $SMSO"     "$RMSO
  tput cup 3 17
  read P_2
  tput cup 3 17
  echo "          "
  if [ "$P_2" = "" ]
  then P_2=0
  else tput cup 3 17
       echo $P_2
  fi

# NOM STAGIAIRE
  if [ "$P_2" != "0" ]
  then P_3=0
  else tput cup 4 17
       echo $SMSO"          "$RMSO
       tput cup 4 17
       read P_3
       tput cup 4 17
       echo "          "
       if [ "$P_3" = "" ]
       then P_3=0
       else tput cup 4 17
            echo $P_3
       fi
  fi

# TRAITEMENT
  tput cup 5 17
  echo $SMSO" "$RMSO
  tput cup 5 17
  read P_4
  tput cup 5 17
  echo " "
  if [ "$P_4" = "M" -o "$P_4" = "R" -o "$P_4" = "D" -o "$P_4" = "A" ]
  then tput cup 5 17
       echo $P_4
  else P_4=O
  fi

# SIGNATAIRE
  tput cup 9 17
  echo $SMSO"  "$RMSO
  tput cup 9 17
  read P_5
  tput cup 9 17
  echo "  "
  if [ "$P_5" = "" -o "$P_5" = "RP" ]
  then P_5=RP
  else P_5=RS
  fi
  tput cup 9 17
  echo $P_5

# TEST ou REEL
if [ "$T_R" = "" ]
then tput cup 13 17
     echo $SMSO"    "$RMSO
     tput cup 13 17
     read T_R
     tput cup 13 17
     echo "    "
     if [ "$T_R" = "" ]
     then T_R=TEST
          tput cup 6 17
     fi
     if [ "$T_R" != "TEST" -a "$T_R" != "REEL" ]
     then T_R=TEST
     fi
     tput cup 13 17
     echo $T_R
else tput cup 13 17
     echo $T_R
fi

################################################################################
# Détermination de la présence d'une pièce jointe                              #
################################################################################

if test -f ../ftp/${P_1}.pdf
then P_J=OUI
else P_J=NON
fi

################################################################################
# Mise à Jour du nombre de candidatures acceptées (sf_n.ca)                    #
################################################################################

cp ../sql_0/CF_sf_CA_0.sed ${LOGNAME}.sql

ed - "${LOGNAME}.sql" << !
,s/C_SF/$P_1/g
w
q
!

if [ "$DBLANG" = "" ]
then isql -s osmose -qcre ${LOGNAME} > /dev/null
else isql -s osmose -lceq ${LOGNAME} > /dev/null
fi

################################################################################
# Création de la liste des candidats à convoquer                               #
################################################################################

sacego -q ../ace_0/CF_LIST_0 $BDD $P_1 $P_2 $P_3 $T_R

LST_OK=`cat ${LOGNAME}.lst 2>/dev/null | wc -l`

################################################################################
# Lancement de la fonction "E_mailing"                                         #
################################################################################

export CPT=0
export CPT_OK=0
export CPT_KO=0
export LST_KO=""

E_mailing 1>../mutt_0/${P_1}.trace.$$ 2>&1

if [ "$CPT" = 0 ]
then 
tput cup 12 0
echo "┌──────────────┬────────────────────────────────────────────────────────┐"
echo "│E-MAILING     │                                                        │"
echo "└──────────────┴────────────────────────────────────────────────────────┘"
tput cup 13 17
echo "Aucun stagiaire à convoquer par courrier électronique"
tput cup 15 0
else
tput cup 12 0
echo "┌CONVOCATIONS──┬────────────────────────────────────────────────────────┐"
echo "│Prévues       │                                                        │"
echo "│Traitées      │                                                        │"
echo "│Envoyées      │                                                        │"
echo "│Abortées      │                                                        │"

if [ "$CPT_KO" = "0" ]
then
echo "└──────────────┴────────────────────────────────────────────────────────┘"
else
echo "│Fichier trace │                                                        │"
echo "│Liste erreurs │                                                        │"
echo "└──────────────┴────────────────────────────────────────────────────────┘"
fi

# Prévues #####################################################################

tput cup 13 17
echo $LST_OK

# Traitées ####################################################################

tput cup 14 17
echo "$CPT"

# Envoyées ####################################################################

tput cup 15 17
echo "$CPT_OK"

# Abortées ####################################################################

tput cup 16 17
echo "$CPT_KO"

# Fichier trace ###############################################################

if [ "$CPT_KO" != "0" ]
then tput cup 17 17
     echo "../mutt_0/${P_1}.trace.$$"
fi

# Liste erreurs ###############################################################

if [ "$CPT_KO" != "0" ]
then tput cup 18 17 > `tty`
     echo $LST_KO > ../mutt_0/${P_1}.error.$$
     echo "../mutt_0/${P_1}.error.$$"
fi

# Affichage des N° de convocations abortées ###################################

if [ "$CPT_KO" = "0" ]
then tput cup 18 0
     rm ${P_1}*.pdf
     rm ../mutt_0/${P_1}.trace.*
else tput cup 20 0
     echo " [ <──┘ ]=Affichage des N° de convocations abortées"
     tput cup 20 0
     read REPONSE
     clear
     echo "$LST_KO"
fi

fi

################################################################################
# Mise à jour de la date d'exécution   de l'E-mailing réel (sf_n.d_mailing_cf) #
################################################################################

if [ "$T_R" = "REEL" -a "$P_2"  = "0" \
                     -a "$P_3"  = "0" \
                     -a "$CPT" != "0" ]
then

cp ../sql_0/CF_d_sf_0.sed ${LOGNAME}.sql

ed - "${LOGNAME}.sql" << !
,s/C_SF/$P_1/g
w
q
!

if [ "$DBLANG" = "" ]
then isql -s osmose -qcre ${LOGNAME} > /dev/null
else isql -s osmose -lceq ${LOGNAME} > /dev/null
fi

fi

################################################################################
# Traçabilité de l'E-mailing : sauvegarde du compte-rendu dans la table "sh"   #
################################################################################

if [ "$T_R" = "REEL" -a "$CPT" != "0" ]
then P_8=`cat ${LOGNAME}.lst 2>/dev/null | wc -l`

     echo $BDD "|" $P_1 "|cf||" "`date +'%d%m'`20`date +'%y'`"  \
          "|" "`date +'%r'`" "|" $P_4 "||" $LST_OK "|" $CPT "|" \
          $CPT_OK  "|" $CPT_KO "||" $P_2 "||" $P_J "|"          \
          $LOGNAME "|" > ${LOGNAME}.out

ed - "${LOGNAME}.out" << !
,s/ //g
w
q
!

#  cat ${LOGNAME}.out >> CF_MAILING_0.out # Trace des .out #####################

cp ../sql_0/CF_sh_0.sed ${LOGNAME}.sql

ed - "${LOGNAME}.sql" << !
,s/LOGNAME/$LOGNAME/
,s/C_SF/$P_1/
w
q
!

if [ "$DBLANG" = "" ]
then isql -s osmose -qcre ${LOGNAME} > /dev/null
else isql -s osmose -lceq ${LOGNAME} > /dev/null
fi

P_6=`date +'%d%m'`20`date +'%y'`

sacego -q ../ace_0/CF_sh_0 $P_1 $P_2 $P_6 $LOGNAME

cat ${LOGNAME}.prt | sed -f ../bull/iso2ascii.sed > ${LOGNAME}.tmp
mv  ${LOGNAME}.tmp ${LOGNAME}.prt
lp  ${LOGNAME}.prt > /dev/null

fi

if [ "$P_8" = "0" ]
then clear
     echo "┌──────────────┬────────────────────────────────────────────────────────┐"
     echo "│ATTENTION !...│ Mailing prévu = 0 (Prévenir IFA2377 immédiatement)     │"
     echo "└──────────────┴────────────────────────────────────────────────────────┘"
else rm ${LOGNAME}_log
fi

echo "\c"

################################## FIN  SHELL ##################################

4. Le système de menus

5. Beauté du logiciel

Ole Lensmar évoque la beauté du logiciel mais cette beauté n’a pas seulement un sens esthétique, ergonomique et convivial :

  1. c’est cette complicité, cette osmose constructive entre utilisateur et développeur,
  2. c’est cette écoute, cette attention du développeur à l’égard de l’utilisateur,
  3. c’est cette pulsion créatrice du développeur,
  4. c’est cette valeur ajoutée indicible que le développeur attentif crée :
    • en synthétisant, en structurant le savoir-faire de l’utilisateur,
    • en révélant le non-dit, en découvrant ce que l’utilisateur ne sait pas qu’il sait,
    • en informatisant judicieusement les vrais besoins de l’utilisateur,
    • en ouvrant de nouveaux horizons, en suscitant de nouveaux besoins,
    • en comprenant les rouages de la problématique,
    • en connectant des entités périphériques confinées dans leur bulle de compétences,
    • en rendant l’utilisateur autonome,
    • en faisant de l’outil un véritable support de formation au métier de l’utilisateur et non en réinventant son métier,
    • en insufflant aux gestionnaires la confiance, l’optimisme, l’enthousiasme, la sérénité, la complicité, l’humour…
    • en stimulant leur communication, leur imagination…
  5. c’est ce concentré invisible :
    • de poulpe attitude (utiliser son intuition pour prendre les bonnes décisions),
    • de positive attitude (vivre en mode chance, savoir lire la vie),
    • d’impulse attitude (se mettre en danger pour être performant).
    • de running attitude (Défier, s’adapter, maîtriser, être libre, autonome…)

Il n’existe pas de mot pour exprimer tout cela. Il faut seulement comprendre tout ce que recouvre le mot « beauté » ou utiliser plusieurs mots comme : sublime, ingénieux, inventif, pratique, pertinent, subtile, intelligent, judicieux, etc.

Ole Lensmar dit encore : « Une exigence clé pour créer une belle application est une véritable vision du produit, nourrie par son créateur, le propriétaire du produit et l'équipe produit, et cela ne peut pas être exprimé dans un carnet de commandes ou traduit par une expression de besoins des utilisateurs ». Le développeur doit aimer ses utilisateurs et investir dans leur interaction avec le logiciel.

Cette valeur ajoutée qui émane de la perception de l’indicible, suppose une vision élargie, débridée, disponible, de la problématique à informatiser. Et cette valeur ajoutée peut fort bien se concrétiser par autre chose que du code source, comme par exemple la refonte d’un document administratif, un changement de procédure, etc.

Comprendre les rouages d’une problématique, structurer le savoir-faire de l’utilisateur, découvrir ce qu’il ne sait pas qu’il sait, saisir une opportunité, exploiter une coïncidence, faire communiquer les entités administratives entre-elles, inventer « en live » avec la participation des gestionnaires une solution informatisée, tout cela procure bien des satisfactions. Cela n’exclue pas de réaliser… de beaux programmes mais c’est une autre histoire.

1ère anecdote :

Je suis en train de développer une application Examens-Concours que j’ai démarrée en une journée trois mois plus tôt. Dans le bureau des gestionnaires c’est l’effervescence, une trentaine de concours sont organisés entre mi-février et fin-juin. L’une d’elle vient s’installer en face de moi pour être tranquille et je la vois numéroter des bouts de papier.

- Vous faites quoi ?

- Je fais des numéros de table pour le concours qui va avoir lieu la semaine prochaine, j’ai besoin de calme, les collègues sont trop bruyantes.

- Mais c’est fastidieux, ce travail ! Vous ne faites quand même pas ça pour tous les concours ? Si ?... Pour le prochain concours, je résous votre problème…

… Et c’est parti pour un nouveau programme. Évidemment, il ne s’agit pas d’imprimer des numéros « 1, 2, 3, 4 » sur la première page etc., et remplacer l’inconvénient de les faire manuellement par l’inconvénient de devoir les trier. Je les imprime donc en piles (sous le 1, le 2, le 3, etc., deux coups de massicot, on rassemble les 4 piles et le tour est joué… Enfin presque, car évidemment, il faut tenir compte des possibles places libres (désistements de dernière minute au profit d’un autre concours).

Le plus : pour chaque numéro j’indique le concours, le lieu et la salle, les nom et prénom du candidat, ses éventuelles pièces manquantes à fournir le jour des épreuves.

PS : Je cite malicieusement cette anecdote pour les amateurs d’algorithmique. Intéressant ! Non ?


2ème anecdote :


J’entends les gestionnaires des Examens-Concours s’agiter en évoquant « la valise »… Je me renseigne, il s’agit en fait d’une grande malle métallique sécurisée par un cadenas dans laquelle les gestionnaires mettent tout le matériel nécessaire pour l’organisation d’un concours : les sujets prévus, les sujets de secours, la liste des candidats, les numéros de tables, les copies vierges, la liste d’émargement des surveillants, etc.

Immédiatement, j’ajoute dans le menu de l’application un item « La valise » regroupant tous les traitements à effectuer pour préparer… la valise.


3ème anecdote :


Il est 18:30, je pense être seul mais j’entends du bruit à côté, je vais voir et je surprends la responsable du service en train de calculer la moyenne des notes pour chaque candidat sur ma liste des notes.
- Vous savez qu’un ordinateur peut faire ça très bien ! Laissez-moi une demi-heure et vous pouvez rentrer chez vous avec vos moyennes.

Un peu vexé de ne pas y avoir pensé, je me rattrape en créant pour chaque épreuve un diagramme en bâtons de l’ensemble des notes de 0 à 20. Ça me coûte l’adaptation facile d’un programme produisant une pyramide des âges des candidats stagiaires que j’avais récemment écrit pour satisfaire une demande des formateurs.

L’aspect technique est une composante de la qualité de la communication mais ce n’est pas la plus importante, l'ergonomie et la convivialité sont l'art et la manière de savoir composer (signifiant) et transmettre (signifié) qui se manifestent dans toutes les composantes perceptibles par l'utilisateur :

  • les écrans,
  • les shells,
  • les états,
  • le système de menus.

Le logiciel doit être agréable, intuitif et facile d’utilisation.

Il y a lieu de différencier le "signifié" du "signifiant", le "signifié" désigne la représentation mentale du concept associé au signe, tandis que le "signifiant" désigne la représentation mentale de la forme et de l'aspect matériel du signe.

De même qu’en linguistique, le signifié et le signifiant sont les deux faces complémentaires du concept de signe linguistique, la convivialité et l’ergonomie sont les deux faces complémentaires du concept d’écran. La convivialité sollicite la compréhension, l’ergonomie sollicite l’utilisation.

Les bonnes pratiques de programmation

▲ I-2.2.1. Règles de nommage
► I-2.2.2. Règles de développement
▼ I-2.2.3. Méthodologie de programmation LCP

Envoyer le billet « I-2.2.2. Règles de développement » dans le blog Viadeo Envoyer le billet « I-2.2.2. Règles de développement » dans le blog Twitter Envoyer le billet « I-2.2.2. Règles de développement » dans le blog Google Envoyer le billet « I-2.2.2. Règles de développement » dans le blog Facebook Envoyer le billet « I-2.2.2. Règles de développement » dans le blog Digg Envoyer le billet « I-2.2.2. Règles de développement » dans le blog Delicious Envoyer le billet « I-2.2.2. Règles de développement » dans le blog MySpace Envoyer le billet « I-2.2.2. Règles de développement » dans le blog Yahoo

Mis à jour 24/02/2024 à 04h44 par APL-AML

Catégories
■ APL-AML , I- L’ART , I-2. Règles de réalisation