Création de patch
Cette fonction vous permet de créer une archive contenant des développements créés dans un dossier donné (le dossier courant par défaut), ainsi qu'un certain nombre d'éléments de paramétrage. Elle est particulièrement intéressante si vous désirez reporter sur un dossier d'exploitation un ensemble de modifications cohérentes réalisées sur un dossier de paramétrage ou de test.
Outre les possibilités de regroupement d'un ensemble d'éléments, cette génération de patch permet de s'affranchir d'une contrainte de serveur unique ou de serveur interconnectés que nécessite l'utilisation du bouton Copie.
Le principe de cette fonction est d'extraire des éléments du dictionnaire de données d'un dossier, mais aussi des données (en principe des données de paramétrage en quantité limitée, car ce format n'est pas très compact). L'ensemble des éléments ainsi extraits est archivé dans un fichier qui peut alors être réintégré dans un autre dossier en utilisant la fonction d'intégration de patch. L'aspect multilingue du dictionnaire est géré par cet utilitaire, les messages liés aux éléments patchés pouvant être transférés dans plusieurs langues.
Chaque élément extrait est identifié à la fois par un code qui définit le type d'élément patché (un écran, un état, des données d'une table…) et par un élément d'information complémentaire (le code de l'écran, de l'objet, un critère de sélection…)
Cette fonction est utilisée :
- par les équipes de développement du standard pour créer des patches correctifs ou des livraisons fonctionnelles complémentaires,
- par des partenaires ayant développé des verticaux pour installer des modules complémentaires,
- par des développeurs pour transférer des spécifiques faits.
Gestion de l'écran
Ecran de saisie
Dans l'écran de saisie, vous définissez :
- le paramètres généraux du patch,
- les codes langues pour lesquelles l'extraction des textes doit être faite,
- la liste des éléments à patcher dans un tableau.
La saisie se fait sur un seul onglet.
Fichier
champ AW |
Type de destination (champ TYPEXP) |
Nom du fichier (champ VOLFIL) |
Type de patch
Type de patch (champ TYPPTC) |
Le type de patch peut prendre les valeurs suivantes :
Les patches contenant des éléments de documentation sont traités de façon un peu particulière, décrite dans l'annexe correspondante. |
Tableau Langues
Langue (champ LANGUE) |
Ce tableau permet de définir les langues que l'on désire patcher. En effet, tous les textes du dictionnaire de données (définis par le code type ATX) sont stockés dans une table séparée (la table ATEXTE) et sont identifiés par un numéro (inférieur à 100.000 pour les textes standard, et supérieur au delà). Ces textes sont transmis via patch sous leur forme littérale (le numéro n'a pas de sens puisqu'il peut varier) dans différentes langues. La liste des langues utilisées pour inclure les textes est donc donnée par ce tableau. |
Bloc numéro 6
Commentaire (champ COMMENT) |
Ce commentaire informatif permet de décrire le fichier patch (du point de vue de sa finalité ou de son contenu). Il sera visible dans la trace de l'intégration du patch. |
Dossier (champ DOSSIER) |
C'est le nom du dossier à partir duquel les éléments du patch vont être extraits. |
Release minimum (champ VERSION) |
Ce code version minimum permet d'éviter d'intégrer le patch dans une application de version inférieure. |
Produit (champ PRODUIT) |
Ce champ identifie l'article à partir duquel le patch est extrait. Ce champ n'est pas saisissable. |
Tableau Objets
Type (champ TYPOBJ) |
Ce tableau permet de saisir une liste d'objets à patcher. Cette liste est identifiée par un type d'objet et un nom. La définition des différents types et la signification du nom sont donnés en annexe. |
Nom objet (champ NOMOBJ) |
On saisit ici la clé de l'élément dont on a saisi le code, ou un complément d'information (condition dans le cas d'un patch de données). Il est à noter que si la clé de la fiche à patcher est en plusieurs parties, celles-ci sont séparées par le caractère tilde ( ~ ). |
Intitulé (champ INTITOBJ) |
Permet de définir un intitulé associé à chaque fiche. |
Tableau Codes activité
Code (champ ACTIV) |
Ce tableau permet de saisir une liste de codes activités spécifiques ou verticaux (c'est-à-dire commençant par X, Y ou Z). Dès que l'on désire créer un patch intégrant des développements de ce type, il est obligatoire de définir les codes activités concernés. En effet, les éléments du dictionnaire portant des codes activités spécifiques non listés seront ignorés à l'intégration du patch. Cette précaution est obligatoire, car sinon un patch standard serait en mesure de mettre à jour un objet marqué par un code activité spécifique ou vertical. C'est précisément le fait qu'aucun code activité spécifique ne soit donné en tête dans un patch standard qui permet de gérer ce fait. Ces codes activités ne sont donc pas un moyen de filtrer l'extraction des objets du patch, mais un moyen d'indiquer que les éléments marqués par ces codes d'activités spécifiques seront mis à jour à l'intégration du patch. Le chargement des éléments marqués par ces codes activité pourra être fait via une action accessible depuis l'icône Actions au niveau du tableau définissant le contenu du patch. |
Préchargement |
Cette action vous permet de pré-charger dans le tableau tous les éléments du dossier marqués par les codes activités listés dans le tableau correspondant. |
Différence objet courant |
Cette action vous permet de vérifier si l'objet de la ligne courante est ou n'est pas identique entre deux dossiers. Une fenêtre s'ouvre alors pour saisir les deux codes dossiers. Une fois cette fenêtre saisie, la comparaison se fait, et une fenêtre de trace donne le résultat. Si le nom de l'élément n'est pas mentionné comme différent, les deux éléments sont identiques dans les dossiers comparés.
|
Différence tous objets |
Cette action vous permet de vérifier si l'ensemble des objets situés dans le patch sont ou pas identiques entre deux dossiers. Une fenêtre s'ouvre alors pour saisir les deux codes dossiers. Une fois cette fenêtre saisie, la comparaison se fait, et une fenêtre de trace donne le résultat. |
Modèles de paramétrage |
Cette action vous permet d'appeler un modèle de paramétrage, afin de renseigner une liste de patches de type AAA (une ligne par modèle de données mentionné dans l'écran). Contrairement au fonctionnement obtenu lorsqu'on part de la fonction de copie de paramétrage, on ne génère ici que les lignes AAA (la ligne APH décrivant le modèle n'est pas incluse). Par ailleurs, la saisie du code législation n'étant pas faite à ce stade, tout filtre législation sera mal appliqué ici. Il est par contre possible de générer une ligne AAA pour un modèle de données unitaires, en cliquant sur Modèle de données depuis l'icône Actions sur le champ . Une fenêtre de sélection s'ouvre et vous permet de choisir le modèle, la législation, la clé ou la formule de sélection, afin de créer une ligne intégrant tous les éléments. |
Types d'éléments pouvant être patchés
Cette table permet de saisir une liste d'objets à patcher. Cette liste est identifiée par un type d'objet et un nom. La définition des différents types et la signification du nom sont données ci-après. La colonne Rang indique l'ordre dans lequel les types d'éléments sont rangés dans le fichier de patch (cf. le paragraphe ci-dessous). Les éléments qui ont le rang 100 dans la table sont toujours placés en fin de patch (dans l'ordre alphabétique des codes des éléments).
Code |
Signification |
Nom |
Rang |
AAA |
Lignes issues d'un modèle de paramétrage |
Format particulier, cf. paragraphe correspondant |
100 |
ABA |
Code de l'abonnement |
46 |
|
ABF |
Code de la table |
54 |
|
ABG |
Code du groupe |
47 |
|
ABI |
Dimension BI |
Code de la dimension |
55 |
ABM |
Datamart BI |
Code du datamart |
56 |
ABO |
Etat Business Objects |
Code de l'état |
58 |
ABT |
Code de la tâche |
45 |
|
ABV |
Code de la règle |
57 |
|
ACL |
Code de la table |
18 |
|
ACN |
Code de la consultation |
36 |
|
ACS |
Traité sous forme de condition (CODACS="valeur") |
14 |
|
ACT |
Code de l'action |
16 |
|
ACV |
Définition d'un code activité |
Code activité |
1 |
ADC |
Description d'un traitement (dictionnaire) |
Nom du traitement |
9 |
ADF |
Type ~ Code de l'élément |
50 |
|
ADI |
Contenu d'une table diverse |
Numéro de la table |
24 |
ADO |
Aide fonctionnelle (tous les paragraphes) |
Type ~ Code de l'aide |
49 |
ADP |
Paramètre (à la fois sa définition et sa valeur s'il en existe au niveau général) |
Code du paramètre |
32 |
ADV |
Paramétrage d'une table diverse |
Numéro de la table |
23 |
ADX |
Traitement (uniquement sous forme compilée) |
Nom du fichier de traitement |
11 |
ADZ |
Code de l'aide |
48 |
|
AEN |
Traité sous forme de condition (CODE="valeur") |
35 |
|
AFC |
Code de la fonction |
17 |
|
AGB |
Nom de la variable |
20 |
|
AHH |
Hiérarchie BI |
Code hiérarchie |
59 |
AHI |
Code de la formule |
7 |
|
AII |
Code condition |
60 |
|
ALH |
Code de la requête |
51 |
|
ALQ |
Code de la requête SQL |
52 |
|
ALT |
Code de la requête |
53 |
|
AMK |
Code de l'écran |
28 |
|
AML |
Numéro du menu local |
2 |
|
ANG |
Code de la navigation |
10 |
|
ANM |
Définition d'un compteur |
Code du compteur |
15 |
ANT |
Code objet pour widget |
65 |
|
AOB |
Définition d'objet |
Code de l'objet |
30 |
AOE |
Code du modèle |
34 |
|
AOP |
Propriétés d'objet |
Code de l'objet |
31 |
APH |
Code du modèle |
100 |
|
APR |
Code processus |
63 |
|
ARP |
Définition d'état dans le dictionnaire |
Code de l'état |
29 |
ASL |
Traité sous forme de condition (COD="valeur") |
19 |
|
ASU |
Description d'un sous-programme dans le dictionnaire |
Nom du sous-programme |
21 |
ASY |
Code du style |
61 |
|
ATB |
Définition d'une table (le contenu n'est pas transféré, la mise à jour de la structure est faite sans perdre les données communes) |
Code de la table |
25 |
ATN |
Transactions |
Code de la transaction |
8 |
ATY |
Code du type |
22 |
|
AUR |
Code de l'URL |
27 |
|
AVW |
Code de la vue |
26 |
|
AWA |
Code de la règle Workflow |
43 |
|
AWE |
Nom de publication |
64 |
|
AWI |
Définition de fenêtre |
Code de la fenêtre |
33 |
AWM |
Modèle de données Workflow |
Code modèle |
41 |
AWR |
Règle d'affectation Workflow |
Code de la règle d'affectation |
42 |
AWW |
Paramétrage du plan de travail Workflow |
Code du plan de travail |
44 |
BIA |
Objets BIAR |
Code objet |
4 |
ELT |
Elément de l'interface cliente (xsl, image, fichier divers) |
Chemin du fichier |
3 |
ETA |
Etat Crystal Reports (fichier d'extension rpt) |
Nom de l'état |
13 |
EXE |
Demande d'exécution d'un traitement |
Nom du traitement |
6 |
GAU |
Code de la pièce |
40 |
|
PS1 |
Code du déclencheur |
37 |
|
PS2 |
Code statistique |
38 |
|
TAB |
Structure et contenu complet d'une table (sa définition « dictionnaire » exclue). |
Code de la table |
39 |
TFO |
Code formule |
62 |
|
TRT |
Source d'un traitement (le traitement sera compilé à l'installation du patch) |
Nom du traitement |
12 |
TXT |
Fichier texte (dans le répertoire TXT) |
Nom du texte |
5 |
Abréviation d'une table |
Contenu partiel de la table |
Condition d'extraction (exprimée sous la forme d'une clause Where) |
100 |
Remarques importantes
- Transfert total des données d'une table
- Transfert partiel des données d'une table
- Exécution d'un traitement
- Traitements génériques à exécuter
- Patch de documentation
- Nommage des fichiers de patch
- Ordre des éléments dans un fichier de patch
- Eléments du dictionnaire non patchés
- Format particulier des éléments AAA
Transfert total des données d'une table
Le code TAB permet de transférer les données de la table, en la rechargeant dans la base avec sa structure et ses données. Par contre, les éléments du dictionnaire concernant cette table ne sont pas créés, elle peut ainsi ne pas apparaître comme visible. Aussi, ce code est-il bien adapté lorsque vous désirez recharger une table déjà créée dans les dossiers à patcher, et qui n'a pas changé de structure. Si tel n'est pas le cas, il faut mettre deux lignes dans la définition du patch : la première concerne la définition de la table (ATB XXXXX), la deuxième son contenu (TAB XXXXX). Même si elles ne sont pas placées dans cet ordre à la saisie, la fonction de patch va les replacer dans cet ordre. A l'intégration du patch, la table va être créée dans le dictionnaire et dans la base si elle n'existe pas (sinon, sa structure sera mise à jour si elle a varié). Puis le rechargement de la table avec les données sera réalisé.
Transfert partiel des données d'une table
La possibilité de transférer le contenu partiel d'une table est obtenue en donnant dans la colonne type l'abréviation de la table, et en indiquant dans la colonne Nom une condition logique qui sera utilisée pour l'extraction du dossier de départ, et pour l'intégration dans le dossier d'arrivée. Il est important de noter que les données ainsi extraites pourront modifier des données existant avec les mêmes clés, ou créer de nouvelles données. Par contre, et pour des raisons de sécurité, en aucun cas, il n'y aura d'effacement de données lors de l'intégration du patch. Ainsi, par exemple, si on considère la situation suivante, pour la table des pays (d'abréviation TCY) :
Dossier de départ |
Dossier d'arrivée |
||
Code pays |
Nom pays |
Code pays |
Nom pays |
AD |
Andorra |
AD |
Andorra |
AE |
United Arab Emirates |
AF |
Afghanistan |
AL |
Albanie |
AL |
Allemagne |
AR |
Argentine |
AU |
Australie |
BE |
Belgique |
BE |
Belgique |
… |
… |
Si dans le patch on indique une ligne avec TCY et la condition CRY="AL", le patch ne va contenir que la ligne correspondant au pays Albanie, et l'intégration du patch dans le dossier d'arrivée va réécrire AL , Allemagne pour le remplacer par AL, Albanie.
Si dans le patch on indique une ligne avec TCY et la condition pat(CRY,"A*"), le patch va contenir les 4 lignes AD, AE, AF et AR. A l'intégration, on va créer la fiche AE, United Arab Emirates, la fiche AR, Argentine, remplacer AL, Allemagne par AL, Albanie et garder A, Afghanistan, et AU, Australie, qui n'avaient pas été livrés, mais existaient déjà dans le dossier d'arrivée.
Si dans le patch on indique une ligne avec TCY et la condition find(CRY,"AD","AE","AL"), le résultat aurait été le même, sauf en ce qui concerne AR, Argentine, qui n'aurait pas été transféré.
La seule manière d'effacer des données consiste :
- soit à remplacer globalement le contenu d'une table complète (patch de type TAB),
- soit à livrer un traitement par le code EXE (cf. ci-dessous). Par exemple, si on avait voulu s'assurer que dans les pays commençant par A, seuls les pays de code AD, AE, AL restaient présents dans la liste, on aurait livré un traitement (appelé par exemple MAJPATCHnnn) qui aurait contenu les lignes décrites dans l'exemple ci-dessous.
Exécution d'un traitement
Un cas particulier doit être mentionné : le code EXE, qui permet de donner le nom d'un traitement ou script à exécuter. Malgré son numéro de rang, ce traitement est exécuté en fin d'intégration de patch (il peut exister au préalable ou être livré dans le patch lui-même, puisque l'exécution ne se fait qu'à la fin de l'intégration).
Ce traitement doit intégrer un sous-programme PATCH, avec un paramètre correspondant au code dossier. C'est ce sous-programme qui sera exécuté. Ainsi, pour le cas ci-dessus, on obtiendrait le programme suivant :
Subprog PATCH(NOMDOS)
Value Char NOMDOS
Local File =NOMDOS+".TABCOUNTRY" [TCU]
Trbegin [TCU]
Delete [TCU] Where pat(CRY,"A*")=1 & find(CRY,"AD","AE","AL")=0
Commit
End
Comme on peut le voir ci-dessus, il est donc nécessaire de déclarer les tables dans ce sous-programme en tenant clairement compte du fait qu'elles doivent être déclarées sur un dossier qui n'est pas forcément le dossier courant (c'est la syntaxe a syntaxe Local File = NOMDOS + ".NOMTABLE" qui l'assure)
Traitements génériques à exécuter
Lorsque des patches sont réalisés sur des éléments modèles de l'interface utilisateur (écrans modèles utilisés pour créer des fenêtres de transaction), une revalidation des écrans en question est nécessaire.
Cette revalidation peut être exécutée en déclarant, dans la maintenance, l'exécution du traitement approprié. On trouvera ci-dessous les traitements standard à lancer selon le type d'élément patché :
Elément patché |
Traitement |
Résultat |
Ecran servant de base à une consultation paramétrable |
SUBGTC |
Validation de tous les écrans de consultation |
Styles de présentation |
SUBASY |
Génération des styles |
Transaction système |
SUBAMI |
Validation des transactions système |
Paramètres statistiques |
SUBPS2 |
Revalidation de toutes les statistiques |
Ecran de base d'une transaction sur l'objet XXX |
SUBXXX |
Revalidation des transactions associées à l'objet |
Patch de documentation
La structure des données de la documentation est un peu particulière. En effet, par défaut les règles suivantes s'appliquent en création ou revalidation de dossier :
- Les textes et fichiers de la documentation (tables ADOCBLB et ADOCCLB) sont remplies dans le dossier superviseur et ne sont pas transférées dans les dossiers qui en dépendent (mais il est possible de créer des textes d'aide locaux à un dossier qui seront alors stockés localement).
- La structure de la documentation (liens de documentation, qui sont pratiquement des éléments du dictionnaire, et structure des paragraphes) est stockée dans chaque dossier et copiée dans les dossiers situés en dessous en cas de revalidation (avec le respect de codes activité verticaux ou spécifiques qui auraient pu être définis dans un dossier fille).
Aussi, quand on intègre un patch de doc (type ADO), le principe est le suivant :
- La structure de la documentation est intégrable dans tous les dossiers listés lors de l'application du patch, quel que soit le type de patch (en fonction de la liste des dossiers donnée à l'intégration).
- Les textes et fichiers sont intégrés uniquement dans le dossier superviseur si le type de patch est Superviseur (ce qui est le cas pour les patches de doc standard). Si le type de patch est autre, les textes et fichiers peuvent être intégrés dans tous les dossiers.
- Le patch de type ADF (liens) est intégrable dans tous les dossiers, même si le patch est de type Superviseur.
Nommage des fichiers de patch
L'intégration de patch vérifie la séquentialité de passage des fichiers de patch, dès lors qu'ils intègrent une séquence numérique dans leur nom. Il est conseillé d'appeler les fichiers de patch en utilisant un nom défini sous la forme X_yyyy_zzz.dat, avec les significations suivantes :
- X est un caractère (différent de P, car P est utilisé pour les patches standard) qui identifie le type de patch
- yyyy est un numéro séquentiel (commençant en principe à 0001).
- zzz est un identifiant de la version à intégrer.
Si cette norme est appliquée, lors de l'intégration d'un ensemble de fichiers de patches dans un répertoire, les contrôles suivants vont être faits :
- On ne mélange pas dans une même intégration des fichiers issus de versions différentes
- On ne saute pas de numéro séquentiel si des patches identifiés par le même caractère et le même numéro de version ont déjà été intégrés. Ainsi, par exemple, si le patch Z_0005_150.dat a été intégré, et si on essaye d'intégrer le patch Z_0007_150.dat sans avoir au préalable intégré le patch Z_006_150.dat, une erreur sera signalée à l'intégration.
Ordre des éléments dans un fichier de patch
Quand on crée un fichier de patch, la norme veut que l'on fasse en sorte que les éléments qui s'y trouvent forment un tout dont l'application laisse un dossier dans un état cohérent. En particulier, si on crée une nouvelle fonction par patch, que cette fonction soit définie par une action, une fenêtre, un écran, une table, et deux traitements, il paraît logique que l'ensemble de ces éléments soient présents dans le patch.
Lorsqu'un ensemble d'éléments sont utilisés pour former un fichier de patch, la fonction de création les range dans un ordre précis de types, afin d'éviter tant que faire se peut les erreurs à l'intégration. En effet, si par exemple on intègre une fenêtre avant les écrans qui la composent, une erreur Ecran inexistant va se produire lors de sa validation. Ainsi, on intègre toujours d'abord les types de données avant les écrans et les tables, les écrans avant les fenêtres, et ainsi de suite.
L'ordre utilisé lors de la génération du patch correspond au rang donné dans le tableau ci-dessus. C'est également l'ordre de proposition qui apparait dans la fonction de patch automatique.
Il faut toutefois remarquer qu'il est impossible de résoudre tous les conflits possibles. En effet, pour prendre un exemple, un type de données peut faire référence à une action, qui fait peut faire référence à une fenêtre, qui peut faire référence à un écran, qui peut faire référence à ce type de données. Pour résoudre ce type de cas de conflit (rare), il peut être nécessaire de décomposer le fichier patch en deux fichiers (le premier livrant tous les éléments avec un type de données ne faisant pas référence à l'action, le second livrant le type de données intégrant l'action, par exemple).
Eléments du dictionnaire non patchés
Lorsque vous installez un patch contenant des éléments du dictionnaire, veuillez noter que certains champs, considérés comme des éléments paramétrables du dictionnaire, sont respectés quelles que soient par ailleurs les protections par code activité dont ils bénéficient. C'et le cas par exemple pour une destination par défaut dans un état.
Une annexe technique présente le détail des champs respectés.
Format particulier des éléments AAA
Un patch de type AAA correspond à une ligne issue d'un modèle de paramétrage. Elle utilise un format particulier pour le code de l'élément. Ce format est l'un des deux formats suivants :
MODELE~CODE_LEG~CODE_TRS~='FORMULE_SELECTION'
MODELE~CODE_LEG~CODE_TRS~CLE~SOUS_CLE~SOUS_SOUS_CLE...
Dans ces lignes :
- MODELE correspond au modèle de données utilisé pour décrire les tables à extraire
- CODE_LEG correspond au code législation, qui peut être vide (on aura alors deux ~ qui se suivent)
- CODE_TRS correspond au code transaction, qui peut aussi être vide
- FORMULE_SELECTION est une condition de filtrage. Toute chaine littérale doit être exprimée "entre doubles quotes", puisque la formule est encadrée 'entre simple quotes'.
- CLE~SOUS_CLE~SOUS_SOUS_CLE (le nombre de sous-clés étant variable) correspond au cas particulier où on veut simplement sélectionner une valeur de clé correspondant à la table principale du modèle. Ce type de possible uniquement lorsqu'on appelle un modèle (code AAA) depuis la création de patch, et que l'on ouvre la fenêtre qui permet alors de sélectionner le modèle et de renseigne la clé par recherche directe.
Etats
Par défaut, les états suivants sont associés à la fonction :
PRTSCR : Impression écran
Mais ceci peut être modifié par paramétrage.
Tâche batch
Cette fonction peut être lancée en batch. La tâche standard ZPATCHC est prévue à cet effet.
Boutons spécifiques
Messages d'erreur
Outre les messages génériques, les messages d'erreur suivants peuvent apparaître lors de la saisie :
…. : répertoire inexistant
Le chemin d'accès au fichier patch n'existe pas
Type d'objet incorrect
Le type d'objet ne correspond ni à un des types d'objets prédéfinis, ni à l'abréviation d'une table existante.
Dictionnaire des … XXX fiche inexistante
On a essayé d'extraire un objet du dictionnaire inexistant
Valeur incorrecte
La condition d'extraction associée à l'extraction des données d'une table est syntaxiquement incorrecte.