Pause-Café Volubis

pause-café

rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
Elle a lieu 3 à 4 fois par an : en Bretagne et sur internet.

Pause-café #28

Octobre 2002

PASE, Unix sur AS/400 (compatibilité complète avec AIX 4.3), gratuit à partir de la version 5.20

5799PTL, des outils d'origine universitaire portés sur AS/400 et comprenand un client X11 et un serveur VNC.

tout cela donne des outils Unix (éditeurs EZ et emacs, etc ...) sur AS/400, mais affichés dans un terminal X :


Websphere development studio client for iseries.

Il s'agit du produit venant remplacer la version Websphere dev. studio livrée en V5R10.

rappels :

  • ce produit s'inscrit dans le contexte Websphere Dev. Tools, contenant SEU, PDM, etc..,.coté serveur.
  • il s'agit , en fait, des outils de developpement. pour iseries, en utilisation client serveur, contenant :
    • RSE (équivalent PDM, trés réussi )
    • Code/400 (SEU, SDA et RLU à la souris)
    • et maintenant dans le cadre d' ECLIPSE, tout ce qu'il faut pour : JAVA, HTML, JSP et XML !!!
  • vous y avez droit dans le cadre de l'abonnement logiciel (même en V4R50 et V5R10).
  • la dernière version est la V4, mais est livrée, soit sur commande, soit avec la V5R20 de l'OS/400 et utilise maintenant Eclipse

premier aperçu :



Ce produit est aux développeur, ce que Operation navigator est aux hommes système/réseau et aux exploitants.

RSE vous permet d'accéder aux ressources suivantes :




  • Fichier locaux
    • explorateur Windows

  • Objets iseries
    • PDM (*LIBL, objets, membres)

      un éditeur est intégéré,
      mais vous pouvez aussi lancer CODE/400
  • Commandes iseries
    • passer des commandes (avec invite)





  • Travaux iseries
    • accès à vos JOB
  • Fichiers IFS
    • accès à l'arborescence de l'OS/400
  • l'éditeur intégré :

CODE/400, restant toujours disponible (particulièrement pour les DSPF et PRTF)

  • vos commandes (avec invite, svp...)

  • gestion de vos JOB

  • gestion des fichiers IFS

Vous pouvez ouvrir plusieurs perspectives (ensembe de fenêtres liées entre elles), afin d'accèder à WebFacing, par exemple.




Nouveautés V5R20 du compilateur ILE/RPG-IV





 RPG-IV en V5R20 :

 ° transformation directe de chaines en numérique (%DEC, %INT , etc...)
 ° Nombreuses améliorations sur les DS :
     - DIM admis      - DS dans une DS, ...      - DS par copie d'un format, plus souple.
 ° nouvelles fonctions de manipulation de bits
 ° une clé complexe peut être indiquée sur le CHAIN (sans KLIST)
 ° une liste des zones à mettre à jour peut être indiquée sur UPDATE
 ° nouveaux opérateurs += , -= , *= , /= (expressions en format libre)





 Data Structures :
 - rappels V5R10
   QUALIFIED, permet de manipuler une DS par nomDS.nomdezone
   LIKEDS   , permet de créer une DS identique à une autre               (QUALIFIED implicite)

 - le mot clé DIM est admis sur les DS (QUALIFIED obligatoire)
     D test            DS                  DIM(20) QUALIFIED      D  zone1                         4      D  zone2                         3  0
 puis manipulation par       /free         x += 1 ;                  // <- nouveauté V5R20, voir plus loin.         test(x).zone1 = 'toto';       /end-free



 - le mot clé LIKEDS est admis sur une sous-zone 
        > Dim est admis, pour des tableaux à n dimensions         > ALTSEQ est "hérité" de la DS d'origine         > OCCURS et INZ ne le sont PAS ==> utiliser INZ(*likeds)
     D test1           DS      D  zone1                         4      D  zone2                         3  0
     D test2           DS                  QUALIFIED      D  zonea                         4      D  zoneb                         3  0      D  zonec                              LIKEDS(test1)
 puis manipulation par       /free         test1.zone1 = 'toto';         test2.zonec.zone1 = 'truc';       /end-free

 


 pour déclarer une DS "modèle", uniquement pour utilisation avec LIKEDS :
     D wptr            S               *      D test1           DS                  based(wptr)
      /free          test2.zonec.zone1 = 'truc';          // ATTENTION : test1.zone1 = 'toto' ==> PLANTE le pgm !       /end-free
 - le mot clé LIKERCD permet une définition de DS par copie d'un format    (comme les DS externes) , mais avec choix des zones à copier.
   LIKERCD(nom-format : *ALL | *OUTPUT | *INPUT | *KEY)
           *ALL    copie de toutes les zones.            *INPUT  les zones en entrée (comme les DS externes)            *OUTPUT les zones en sorties            *KEY    uniquement les zones clés.
           cette dernière option permet : CHAIN %KDS(nom-ds) fichier



 -   modification des ordres de lecture (CHAIN, READ, etc...)
     - les ordres de lecture admettent un nom de DS en dernier argument        (format libre uniquement), permettant de placer la lecture        automatiquement dans une DS (avant c'était possible, mais en interne)
       READ   format   nom-de-ds ;

     - CHAIN, READE, SETLL, SETGT, DELETE
        admettent une définition de clé complexe, comme suit :

       CHAIN Klist fichier;
       CHAIN (zone1 : zone2 : zone4) fichier ;
       CHAIN %KDS(nom-de-DS) ; // (créé par LIKERCD(*KEY) ou non)





     - UPDATE admet une liste des zones à modifier (pour modif partielle)                avec la fonction %FIELDS() 

       UPDATE format  %FIELDS(zone1 : zone2 : zone4) ;

 -   transformation numérique, les fonctions :
     %DEC , %DECh , %INT, %INTh, %UNS , %UNSh , %FLOAT admettent un       argument de type chaine et le transforment en numérique.
     les signes + et - sont admis à gauche ou à droite.      la marque décimale peut être , ou .       les espaces sont ignorés.
      /free         R = %dec('+ 3,25') + 1; // retourne 4,25       /end-free



 -   fonctions de manipulation de bits      (manipulation d'attributs d'affichage ou fonctions réseau) :
     %BITNOT()    inverse les bits
         %BITNOT(x'00') = x'FF'
     %BITOR()     applique un OU logique, bit à bit
         %BITOR(x'F0' : x'0F') = x'FF'
     %BITAND()    applique un ET logique, bit à bit
         %BITAND(x'F1' : x'1F') = x'11'
     %BITXOR()    applique un ET exclusif, bit à bit
         %BITXOR(x'F1' : x'1F') = x'EE' :       1111 0001                                                 0001 1111                                                ----------                                                 1110 1110



 -   DTAARA(*VAR : ), le nom de la data-area peut être une variable.
        DATAARA(MADA) : on utilise MADA dans *LIBL
        DATAARA(*VAR:MADA) : on utilise le contenu de la variable RPG "MADA"
 -   les zones numériques acceptent un maximum de 31 chiffres      (avant c'était 30), RPG devenant pleinement compatible avec DB2/400.
 -   on admet de nouveaux opérateurs, dans les expressions :
       +=   : x += 1 identique à x = x + 1
       -=   : x -= 1             x = x - 1
       *=   : x *= 2             x = x * 2
       /=   : x /= 2             x = x / 2
     uniquement valide dans les expressions en format libre.


Nouveautés SQL en V5R20




 nouveautés SQL en V5R20 :
 - variables de type ROWID, permettant une génération automatique de clé

 - fonction SQL, retournant une table et utilisable dans la clause FROM
   (en fait la fonction retourne une ligne à la fois)

 - Notion de TABLE TEMPORAIRE  (DECLARE GLOBAL TEMPORARY TABLE)

 - HOLD LOCATOR

 - SAVEPOINT (ou point de reprise) permettant un retour arrière ROLLBACK,      avec choix du point du "moment" logique de reprise.





 - clé générée automatiquement, deux syntaxes :

   > dans les deux cas on peut préciser :
                  --ALWAYS--------      toujours      GENERATED ---                --->                   -- BY DEFAULT---      uniquement si la zone est nulle

   A/ ROWID. Il s'agit de variable VARCHAR(40) contenant des valeur générées               de manière non consécutive.
      Create TABLE test1 (ID AS ROWID GENERATED ALWAYS ,                           LIB CHAR(40), DATCRT DATE)

   B/ AS IDENTITY , est associé à un champ numérique sans décimales,
      Create TABLE test1 (ID INTEGER AS IDENTITY START WITH 100,                           LIB CHAR(40), DATCRT DATE)



      on peut alors préciser avec AS IDENTITY :
      --START WITH (valeur initiale)----------------->
      >-INCREMENT BY (incrément)---------------------->
          --MINVALUE (valeur mini) -       >--                           ----------------->           --NO MINVALUE ---------- -
         --MAXVALUE (valeur maxi) -       >--                           ----------------->          --NO MAXVALUE ---------- -
         -- CYCLE----------    ---ORDER-------       >--                  ----               ------->          --NO CYCLE--------    --- NO ORDER---
   avec CYCLE, quand MAXVALUE est atteint on recommence à MINVALUE.    NO ORDER indique une numérotation qui peut ne pas être réalisée dans     l'ordre  des requêtes.


 et enfin :

        -- CACHE x ----                  indique que DB2/400 peut garder    >----               -------------- .   en mémoire les x dernières valeurs         --NO CACHE----                    (plus rapide)

 AS IDENTITY est un attribut d'un champ numérique
 ROWID est un nouveau type de champ (à déclarer en RPG par SQLTYPE(ROWID).)
 Exemple :
 CREATE TABLE TABCDE      (CDENO SMALLINT NOT NULL         GENERATED ALWAYS AS IDENTITY                            (START WITH 500                             INCREMENT BY 1                             CYCLE),       LIVREA VARCHAR (36) ,       CDEDAT DATE)



 les ordres INSERT et UPDATE sont completés comme suit :
    UPDATE nom-table ----------------------------------SET ...  -->                        |                          |                        |-OVERRIDING SYSTEM VALUE--|                        |                          |                        |-OVERRIDING USER VALUE----|
     Avec OVERRIDING SYSTEM VALUE, on peut modifier une colonne ROWID ou            AS INDENTITY, avec GENERATED ALWAYS.
     Avec OVERRIDING USER VALUE, on peut modifier une colonne avec            GENERATED ALWAYS ou GENERATED BY DEFAULT.
     sans indication la clause SET ne peut PAS manipuler une clé générée       avec la clause GENERATED ALWAYS, mais on peut manipuler        une zone AS IDENTITY GENERATED BY DEFAULT.
     Par contre une zone de type ROWID avec GENERATED BY DEFAULT,         uniquement si la nouvelle valeur a elle même été génerée par DB2.         (copie de fichier, par exemple)



 - création de table par référence :
   en V5R10 CREATE TABLE admet la clause like
     si vous souhaitez dupliquer aussi la clause IDENTITY, il faut indiquer
      CREATE CLITEMP LIKE CLIENTS INCLUDING IDENTITY 
   SQL admet, en plus, en V5R20 la syntaxe suivante, permettant         une duplication partielle de la liste des zones [du format] :

      CREATE TABLE nom-fichier AS (sous-sélection)             WITH [NO] DATA [INCLUDING IDENTITY]
     avec WITH DATA, la table est créé et les données dupliquées.
  Exemple :
     CREATE TABLE CLITEMP AS (SELECT nomcli, adr1, adr2, dept, ville from CLI)             WITH NO DATA



 - tables temporaires  :
   DECLARE GLOBAL TEMPORARY TABLE (même syntaxe que CREATE TABLE) -->
                   --DELETE ROWS---             --DELETE ROWS---     >-- ON COMMIT--                -- ON DELETE                 ---->                    -PRESERVE ROWS--             - PRESERVE ROWS-

    >---------------------------------------        |                |   |             |        |--WITH REPLACE--|   |--NOT LOGGED-|

    créé une table dans QTEMP (peut être qualifiée aussi par "SESSION")
    WITH REPLACE permet une création avec remplacement, si la table existe      déja dans QTEMP
    NOT LOGGED, indique une table non journalisée (insensible aux ROLLBACK)



Exemples :
 DECLARE GLOBAL TEMPORARY TABLE CLIENTS          (nocli integer, raisoc char(50),            adr1 varchar(50) , ville varCHAR(50) )   WITH REPLACE

 DECLARE GLOBAL TEMPORARY TABLE CLITEMP AS          (SELECT nocli , raisoc, adr1 , ville             from clients) WITH DATA
Dans tous les cas de figure, la table n'apparait pas dans les catalogues SQL                                       est détruite en fin de session.
- SAVEPOINT
 Cette notion permet de matérialiser des étapes dans une transaction   offrant la possibilité de revenir à une étape précise et non au début   de la transaction en cas de ROLLBACK.



 un point de reprise est posé par l'instruction SAVEPOINT (un SEUL AS/400)
      UPDATE client ...                       ;
    SAVEPOINT MAJ ON ROLLBACK RETAIN CURSOR   ;
      DELETE FROM CLIENTS ...  ;       DELETE FROm COMMANDES    ;
    SAVEPOINT DLT              ;
      INSERT INTO ...          ;
    IF xxx ROLLBACK TO SAVEPOINT MAJ      ELSE RELEASE SAVEPOINT ;
 ON ROLLBACK RETAIN CURSOR, permet de garder le(les) curseur(s) ouverts  ON ROLLBACK RETAIN LOCKS , permet de garder les verrouillages/ligne
 RELEASE SAVEPOINT, libère (détruit) le point de reprise



Fonction retournant une table.
Vous pouvez écrire une fonction (PL/SQL ou RPG) retournant une table.
 il s'agit en fait d'un programme retournant des données non Base de données  (une ligne à la fois), permettant d'utiliser avec SQL des informations  externes (fichiers IFS, fichier en interne, XML, ...)
 la fonction est appellée une fois pour initialiser le dialogue  puis une fois par ligne à retourner et enfin une ultime fois à la fin.
 CREATE FUNCTION nom-fonction ( [param1 [,param2 ..]] )    RETURNS TABLE (zone1 char(50), zone2 dec(7, 2) ....)
 la fonction est utilisée ensuite directement dans la clause FROM, par :
 SELECT zone1 from TABLE( fonction(paramètre) )

    une jointure est possible



- Toutes les fonctions acceptent un nouveau paramètre :
     FENCED , la fonction s'exécute dans un thread à part
              (plus sûr, plus gourmand en ressources)
     NOT FENCED , le contraire.

- HOLD LOCATOR nom-variable.
  pour les variables contenant un pointeur sur un champ BLOB ou CLOB,    le pointeur reste valide après la transaction (COMMIT).
- UNION admis dans le CREATE VIEW

    CREATE VIEW v1 AS SELECT * FROM FACTURES                        UNION                       SELECT * FROM ARCHIVES



- les expressions utilisées dans ORDER BY, n'ont plus à être présentes dans    la liste des colonnes du SELECT.

- notion de CURRENT SCHEMA
   contient la base de données à utiliser pour les ordres non qualifiés
   à l'origine : USER (l'utilisateur en cours) en dénomination *SQL                  *LIBL en système de dénomination *SYS (système)
   modifiable maintenant par SET SCHEMA

   SET ----------------SCHEMA-----------------------------------------         |          |             |           |         |-CURRENT--|             |--un-nom---|                                  |           |                                  |--DEFAULT--|                                  |           |                                  |--USER-----|

Retourner au Début

Copyright © 1995,2002 VOLUBIS