On m’a soumis récément un problème qui me semblait simple mais ne l’était pas tant que ça :
Dans un programme COBOL, comment concaténer un nom en PIC X(32) et un prénom en PIC X(32) dans un champ résultant en PIC X(32), sachant que le nom ou le prénom peuvent être composés d’1 ou plusieurs mots séparés par un espace et qu’en cas de troncature dans le champ résultant le nom prime.
Bouaaahhh! Facile! Avec une boucle lettre par lettre est un INSPECT qui va bien on doit pouvoir faire ça rapidos.
Je me suis amusé et bien c’etait pas jojo à voir!
C’est Homer-ac sur ce billet du forum Cobol de DVP qui m’a donné la piste du code final que voilà :
WORKING-STORAGE SECTION.
01 W-CPT PIC S9(4) COMP.
01 W-LONGUEUR-NOM PIC S9(4) COMP.
01 W-NOM PIC X(32).
01 W-NOM-REVERSE PIC X(32).
01 W-PRENOM PIC X(32).
01 W-NOMPRENOM PIC X(32).
PROCEDURE DIVISION.
INITIALIZE W-NOM W-NOM-REVERSE W-PRENOM W-NOMPRENOM.
IF W-NOM NOT = SPACE
MOVE FUNCTION REVERSE(W-NOM) TO W-NOM-REVERSE
MOVE 0 TO W-CPT
INSPECT W-NOM-REVERSE TALLYING W-CPT FOR LEADING SPACE
SUBTRACT W-CPT FROM LENGTH OF W-NOM-REVERSE GIVING
W-LONGUEUR-NOM
END-IF.
STRING W-NOM(1:W-LONGUEUR-NOM) SPACE W-PRENOM
DELIMITED BY SIZE INTO W-NOMPRENOM
END-STRING.
La fonction REVERSE permet d’inverser l’ordre de la donnée, les blancs de fin passent alors en première position, l’INSPECT TALLYING compte le nombre d’espace consécutif en début de chaîne, nombre qu’il suffit de soustraire à la longueur de la picture « nom» pour obtenir la position du premier espace à la fin de ce nom. Il suffit ensuite de concaténer nom et prénom avec STRING sans omettre d’indiquer la « portion» de nom qui doit être concaténer.
Navré pour les 2 mois sans article, je sors d’une mise en prod assez éprouvante.
Il ne reste plus que quelques problèmes BBCP en cours de correction et un peu d’optimisation DB2 pour stabiliser la nouvelle version de l’appli et je serais à nouveau un peu plus dispo pour rédiger régulièrement en ces lieux.
En attendant vous pouvez jetter un coup d’oeil à l’astuce SDSF laissée par Romain33. J’y reviendrais avec SE et XDC…
Arrêt du service pendant une 15aine de jours… je pars en vacance (ouf!)
Ça vous changera pas grand chose, c’est le rythme d’écriture de mes billets
Il est possible avec File-AID d’effectuer une recherche avec opérateurs.
Il suffit de rajouter dans votre recherche les opérateurs traditionnels : EQ, NE, LT, GT, LE et GE (=, <>, <, >, ≤, ≥).
Pour rechercher une date supérieure au 4 novembre 2008 en colonne 10 :
F GT '2008-11-04' 10
Attention la recherche avec colonne nommée ne fonctionne pas avec les opérateurs.
J’ai eu récemment besoin de savoir si DFSORT était installé avec le paramètre VLSCMP à YES, cela permet dans le cas d’enregistrements variables (VB) d’empêcher DFSORT de planter si le test de comparaison (INCLUDE, OMIT) se trouve plus « loin» que la longueur de l’enregistrement courant.
En effet, dans ce cas précis, VLSCMP indique à DFSORT qu’il doit remplacer temporairement par des zéros binaires (X’00′) les digits manquants.
Bref, pour connaître les paramètres par défaut DFSORT installés sur votre site, il suffit de soumettre le JCL suivant et de visualiser le résultat au niveau de SHOWDEF :
//ICETOOL EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//TOOLIN DD *
DEFAULTS LIST(SHOWDEF)
//SHOWDEF DD SYSOUT=*
N’oubliez pas la carte JOB.
Vous avez un gros fichier à découper en 3 pour faire un traitement en parallèle des 3 fichiers résultants, mais vous ne connaissez pas la volumétrie du gros fichier pour déterminer le nombre d’enregistrements à mettre dans chacun des 3 fichiers de sortie.
Comment faire ?
DFSORT propose les options SPLIT, SPLITBY et SPLIT1R qui permettent de distribuer les enregistrements comme suit :
SPLIT: Le premier enregistrement est écrit dans le premier fichier de sortie, le second enregistrement dans le second fichier de sortie et ainsi de suite jusqu’à ce que tous les fichiers de sortie comportent un enregistrement. Ensuite la distibution recommence au premier fichier de sortie,SPLITBYpermet la même chose queSPLITmais au lieu de distribuer enregistrement par enregistrement, vous pouvez lui indiquer le nombre d’enregistrement qui doivent être distribué à chaque fois,SPLIT1Rpermet de distribuer un nombre déterminé d’enregistrement dans chaque fichier de sortie et continue à distribuer les enregistrements restants dans le dernier fichier de sortie sans revenir au premier.
Supposons que l’on ait le fichier :
01
02
03
04
05
06
07
08
09
10
Si :
OPTION COPY
OUTFIL FNAMES=(SORTOF01,SORTOF02,SORTOF03),SPLIT
On obtient :
SORTOF01
01
04
07
10
SORTOF02
02
05
08
SORTOF03
03
06
09
Si :
OPTION COPY
OUTFIL FNAMES=(SORTOF01,SORTOF02,SORTOF03),SPLITBY=3
On obtient :
SORTOF01
01
02
03
10
SORTOF02
04
05
06
SORTOF03
07
08
09
Si :
OPTION COPY
OUTFIL FNAMES=(SORTOF01,SORTOF02,SORTOF03),SPLIT1R=2
On obtient :
SORTOF01
01
02
SORTOF02
03
04
SORTOF03
05
06
07
08
09
10
Pratique ?
Vous connaissez peut-être l’émulateur TN3270 de MoshaSoft pour Windows, et bien j’ai découvert il y a quelques jours que MoshaSoft avait crée une version pour iPhone.
Rien d’incroyable dans cette app (c’est un simple émulateur 3270) mais l’idée d’accéder à ce bon vieux TSO à partir de mon iPhone m’a transporté dans la 4ème dimension!
Quelques captures d’écran :
Liens vers l’App Store et apps connexes :
- Emulateur 3270 (version gratuite)
- Emulateur 5250 (version gratuite)
- Network Ping (version gratuite)
J’étais récemment en train de modifier un source COBOL, quand une urgence à la machine à café m’a fait quitter mon poste.
Quand je suis retourné à mon source, je n’arrivais pas à me rappeler les modifications déjà effectuées, heureusement ISPF à prévu le coup, en ligne de commande saisissez :
COMP *
Et le tour est joué !
NB : le dataset en edition ne doit pas avoir été sauvegardé
La documentation officielle File-AID Batch de Compuware est disponible sur MvsHelp
Rien de plus énervant que d’avoir à télécharger un PDF pour lire un document que vous ne conserverez peut-être pas ! Pourquoi ne pas le consulter directement comme un livre numérique en surimpression sur le site en cours de lecture ?
Fort de ce constat, depuis ce week-end j’utilise le plugin « Smart Look» d’issuu qui vous permet de feuilletter dans une lightbox tous les documents hebergés sur le domaine documentation-mainframe.net.
Les documents étant au préalable convertis en flash par issuu, leur affichage est 10 fois plus rapide qu’avec le plugin Acrobat reader et la navigation y est somme toute plus séduisante.
Voyez cet exemple : File-AID – Reformatage des données [Edit : ne fonctionne qu'à partir du site, pas d'un agrégateur]
Notez que les documents sont toujours téléchargeables en faisant un clique droit sur le lien puis enregistrer sous.
J’ai de bonnes habitudes qui peuvent parfois nuire à la productivité…
Quel que soit l’outil utilisé (Dslist, Platinum, File-AID…) quand je veux visualiser un fichier (un dataset ou une table) je le fais sagement en mode « browse» , cela m’évite de modifier les données sans m’en rendre compte. Eternel problème de gros doigts !
Cette bonne habitude s’est révélée être extrêmement contre-productive lorsque après avoir passé près d’une demi heure à chercher LA donnée qui vérolait un fichier très volumineux, j’ai voulu la modifier.
Arggh!!! On doit ressortir du fichier (2 x F3), on passe en mode « edit» et on recommence le boulot pour retrouver la donnée à modifier.
Heureusement grâce à moi (ou alors vous auriez dû me le dire plus tôt !), voici comment switcher du mode « browse» au mode « edit» sans sortir du fichier :
Sur la ligne Command ==> :
GO EDIT
ou
GO BROWSE
Elle est pas belle la vie ?
Le billet d’aujourd’hui n’a rien à voir avec le mainframe, c’est juste pour vous signaler une mise à jour de la sidebar du blog avec l’accès à mes différents profils LinkedIn, Viadeo et Ziki plus l’ajout d’un widget pour que les utilisateurs Viadeo de passage laissent leur trombine
N’hésité pas à me contacter.
ITS met à disposition sur son site la documentation officielle CA sur le produit de gestion de configuration « AllFusion Endevor Change Manager» :
- Administrator Guide
- API Guide
- Automated Configuration Option Guide
- CA Common Services CA-L-Serv Technical Bulletin
- Error Codes and Messages
- Exits Guide
- Extended Processors Guide
- Footprints Guide
- Getting Started
- Implementation Guide
- Interface for CA-Roscoe Administration Guide
- Interface for IBM Tivoli Information Management Administration Guide
- Interface for CA-Netman Administration Guide
- Inventory Analyzer
- Packages Guide
- Parallel Development Option Guide
- Quick Edit Option User Guide
- Quick Reference Guide for Administrators
- Quick Reference Guide for Users
- Release Summary
- Reports Guide
- SCL Reference Guide
- Security Guide
- User Guide
- Utilities Guide
Pour accéder à tous ces documents allez sur le sommaire en PDF et cliquez sur la documentation qui vous intéresse.
Il est possible avec File-AID de faire une recherche dans une colonne spécifique.
Si vous souhaitez chercher en colonne 10 (DATEMAJ) la valeur 2008-11-04 vous pouvez utiliser les 2 syntaxes suivantes en ligne de commande COMMAND ===> :
F /10 2008-11-04
ou bien :
F /DATEMAJ 2008-11-04
NB : Cela fonctionne aussi bien en mode FMT (Formaté) qu’en mode VFMT (Formaté verticalement) et quelque soit le mode d’affichage (Edit ou Browse)
N’avez-vous jamais entendu dans un open space le cri de douleur :
Mais putain, bordel de merde, qui est en edit sur le membre ?
Vous connaissez sans doute l’astuce pour savoir qui provoque ce member in use mais un petit rappel pour les moins aguerris peut-être utile :
Il suffit simplement de taper 2 fois F1 pour voir apparaître le panel suivant avec la réponse :
Data set ‘MON.SUPER.PDS(MEMBRE01)’
is in use by the following 1 user(s) and/or job(s):
————————————————————————————————————————————–
ZAA5084
————————————————————————————————————————————–
On terminals which support extended data streams, TSO user and Job
names have the following colors:
NAME1 – Normal Green – Owns data set shared
NAME2 – Normal Red – Owns data set exclusively
NAME3 – Reverse Video Green – Waiting for shared use
EBCDIC est un mode de codage sur 8 bits crée par IBM à l’époque des cartes perforées et toujours utilisé sur AS/400, OS/390 et z/OS.
Avec l’augmentation d’échanges de données entre milieux hétérogènes (Linux, UNIX, Windows) utilisant le codage ASCII de nombreux moyens de transcodification ont été mis en place au niveau des moyens d’échange (MQSeries, Synchrony Transfer ex Inter.Pel et CFT, CTG…) pour une transparence totale des utilisateurs.
Toutefois il est courant de se retrouver sur un site n’ayant pas de transcodification au niveau d’FTP et la simple remontée d’un fichier étendu en local pour envoi à une équipe sur UNIX peut entrainer quelques soucis. Afin d’éviter ces problèmes voici une table de conversion ASCII / EBCDIC avec bases décimale, hexadécimale et binaire qui se révelera bien pratique.
Pour info ce memento ASCII / EBCDIC a été créé avec le logiciel Open Source « Calc» de la suite OpenOffice avec les fonctions DECHEX et DECBIN.
En relation avec cet article je vous conseille la lecture très intéressante de ces différents liens :
- Extended Binary Coded Decimal Interchange Code sur Wikipedia
- Système hexadécimal sur Wikipedia
- Histoire de la carte perforée
- Générateur de carte perforée Arf
- Punch card codes
Ce memento a été rajouté aux autres ressources
Vous savez que pour sélectionner le compte rendu d’un job en queue SDSF vous pouvez utiliser « S» ou « ?» .
Dans ce dernier cas vous obtenez le détail du job organisé en sous-groupe (JESSMSGLG, JESJCL, JESYSMSG, SYSPRINT, SYSTSPRT…)
Comment utiliser la sélection du job complet (» S» ) et naviguer à l’intérieur par sous-groupe?
Il suffit d’utiliser en ligne de commande N (Next) ou P (Previous) pour sauter d’un sous-groupe à l’autre.
Connaissiez-vous cette astuce ?
Je viens d’ajouter dans les ressources Cobol la documentation officielle IBM :
- Enterprise COBOL for z/OS Programming Guide
- Enterprise COBOL for z/OS Language Reference
L’article précédent m’a inspiré cet article qui est le premier d’une série de billet que j’espère longue, régulière et intéressante de trucs et astuces qui font gagner du temps.
Let’s go…
Comment remplacer dans un fichier tous les low-values par des espaces ?
Il suffit d’utiliser ALTSEQ CODE
Voici un exemple pour changer tous les low-values (X’00′) par des espaces (X’40′) dans un fichier FB avec un LRECL=120.
ALTSEQ CODE=(0040)
OUTREC BUILD=(1,120,TRAN=ALTSEQ)
Vous l’aurez compris, si vous souhaitez remplacer tous les $ (X’5B’) par des ; (X’5E’) il faudra coder ainsi :
ALTSEQ CODE=(5B5E)
OUTREC BUILD=(1,120,TRAN=ALTSEQ)
Notez qu’avec OUTREC, INREC et OUTFIL il est préconisé d’utiliser BUILD à la place de FIELDS (ce dernier étant réservé à SORT et MERGE).







