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é #16

Décembre 1998



Fin


Version 4.30 de l'OS/400


 GRANDES ORIENTATIONS


 1/ support de WARP server et de novell sur IPCS jusqu'en 2001 !


    (sous entendu, après on ne sait pas)


    les deux produits sités vont restés figés


 ==> HORS de NT, point de salut !


 2/ IBM annonce que NT TSE (Terminal Server Edition, la suite de WInFrame)


     est compatible avec NT sur IPCS


 3/ Rochester propose sur son site WEB une pré-version de la prochaine
     édition de Client Access : "Client Access Express"


    Il s'agit d'une version FULL IP (plus d'APPC, plus de routeur)

              


 Détail de la 4.30




 WEB :


       + support de la certification X.509 (auparavent par API uniquement)
          et de SSL (sessions cryptées)


       + fonction cache amméliorée et fonctionnement en multi-thread.


            (c'est le deuxième produit après DOMINO)


       + Servlets JAVA (Applets s'exécutant sur le serveur)






       + NetQuestion : produit d'indexation et de recherche de vos pages WEB







              

 TCP/IP  Filtrage IP


             Limitation et/ou journalisation des accès


         NAT Network Adresse Translation


             on construit une table des correspondances


                adresse-ip-locale/adresse-ip-externe


             et on masque complètement le réseau aux yeux extérieurs
              en fournissant des adresses Ip fictives (externes).


        LOAD BALANCING


             attribution d'une même adresse IP à deux cartes LAN.


             le système répartie la charge sur les deux cartes


        Dial ON Demand


             la connexion ne se fait qu'en cas de besoin (NUMERIS)


 Programmation :


 pas grand chose,


                  - le compilateur C accepte les entiers sur 64 bits


                  - le compilateur C admet comme source un fichier IFS


                  - le compilateur C++ admet le SQL intégéré




                  - java Toolbox for JAVA revue et intégrée à Visual Age
                                                              for JAVA v2.0


  Euro :


 support de l'Euro pour la version 4.30 ainsi que pour les versions :


            - V3R20           --
                                > via PTF
            - V4R10 & V4R20   --

 Client Access :


             - nouvelle version 3.20


                   >support de WIndows 98


                   >ODBC version 3.0


                   >AFP Workbench version 32 bits et complète


                        visualisation de spools AFP et d'images (TIFF, GIF)


                        génération en mode WYSIWYG de *PAGSEG et *OVL


                  >installation plus granulaire


                  >support de TCP/IP sur Twinax


             - Pour Windows 3.1


                  >IP : support des noms d'écran et des sessions imprimantes

              


 IBM AS/400 SDK for ActiveX and OLE DB


     norme Microsoft (successeur d'ODBC ?) pour accèder à des inforamtions
      diverses.


     le problème d'ODBC est qu'il ne permettait d'accèder qu'à des bases
      de données relationnelles.


      or il existe d'autres types d'informations
         > annuaires par exemple ...


     ADO propose l'accès à des informations distribuées en retournant
      les données sous forme de fichiers à plats séparés par des tabulations
      et en technologie objet (ADO = ActiveX Data Object).


   le produit IBM (intégré à Client Access) permet donc l'accès
        - à la base de données en SQL
        - à la base en mode ligne à ligne (comme read, chain, ...)
        - aux données comme les data area, les dtaq, etc...
        - aux des commandes ou aux procédures cataloguées
        - ....




 L'accès peut se faire à partir de tout produit (sur palteforme Windows)
   supportant ActiveX.


   + Visual Basic (pour celui-ci il existe un assistant)


   + Delphi, Powerbuilder, Visual C++, ...


   + IIS (serveur Web de Microsoft sur NT)


   + Lotus 123, Excel, Access et autres produits bureautique






 Le produit AS/400 OLE DB Data Provider est la partie Run-time




 Ces deux produits sont livrés sur le CD-ROM de Client Access





              


Operation navigator


 Ce produit a été complètement revu :


    l'installation est modulaire.


    les options suivantes sont nouvelles :


    > Envoi de messages (avant seule la visu était possible)


    > paramétrage des nouveautés TCP/IP (NAT, filtrage, ...)


    > Gestion des annuaires LDAP


    > gestion des actions admises
              des répertoires admis par utilisateur ! (V4r30 impératif)


    > Assistant de configuration de la sécurité (analyse ET propose)


    > Visualisation des performances de vos AS en mode graphique

              


Operation navigator


    > gestion des journaux remote.


    > gestion des alias (voir ci-après)


    > Mise à jour des tables possible


    > copie/déplacement possible entre systèmes


Netserver


   implémenté en V4R20, c'est la fonction voisinnage réseau de l'AS/400


   > utilisation complète de LM 0.12(en V4r20 on utilisait seulement SMB)
         ==> performances accrues


   > l'AS/400 CLIENT des serveurs NT (nouvelle racine IFS : /QNTC)


      l'OS voit tous les serveurs NT du sous réseau IP, pour les autres,
       lancer la commande MD '/QNTC/192.168.1.5 (si telle est son adresse)


 DB2/400 


  C'est la partie la plus spectaculaire :


   - gestion des ALIAS


     un ALIAS permet de renommer un fichier (lui donner un nom long)


     ou préciser un membre pour un fichier multi-membres.




  CREATE ALIAS MABIB.MBR2_ALIAS FOR MABIB.FIC1P1 (MBR2)


 mettre à jour MBR2_ALIAS revient à mettre à jour MBR2 dans FIC1P1


ATTENTION : DROP TABLE nom-alias détruit le fichier PHYSIQUE


               il faut écrire DROP ALIAS pour supprimer l'ALIAS


            Un alias portant sur un fichier inconnu, peut exister.

              


  Sous sélection admise dans l'ordre UPDATE


  la notion de sous-sélection permettait de mettre un ordre SELECT dans la
     clause WHERE d'un ordre SQL.


  SUPPRIMER les clients sans commande :


            Delete from client C where not exists
               ( select * from commande where nocli = C.nocli )


  Cette synatxe est maintenant acceptée dans la clause SET du UPDATE


  UPDATE command C set priha = (select pritarif from article
                                       WHERE codart = C.codart )
         WHERE  priha = 0




  UPDATE recap R set SALAIRAN = (select sum(salair + primes)
                                  from personp1
                                  where matricule = R.matricule)

              


 Les nouveaux Index EVI (Encoded Vector Index)


 à l'origine était l'index b-tree :


                           +-------+
                  de A à N |AN - OZ| de O à Z 
                           +-------+
                          /         \
                         /           \
                   +-------+
          de A à M |AM - N.| (tout ce qui est Nxxx)
                   +-------+
                  /         \
                            +------+ (tout ce qui est NAxxx)
                            |  A.  |       ____________
                            +------+       |TES=878787|      <-- NANTES
                           /        \    /
                                 +------+
                                 |  N.  |
                                 +-------  ____________
                                         \ |CY =124578|      <-- NANCY


 Ces index fonctionnent très bien quand il s'agit de retrouver un petit
  nombre de clés dans un grand nombre d'enregistrements (type CHAIN)


 mais ils sont assez lents si vous réalisez une requête retournant 80 %
  des enregistrements, particulièrement lors des tris.




  En effet les enregistrements doivent être retournés dans l'ordre des clés
   et ils sont stockés dans physiquement sur le n° de RANG(dans le physique)


 Vous multipliez alors les E/S disque


      sauf si vous réorganisez souvent vos fichier par RGZPFM KEYFILE(xxx)
                                                                       ^
      en indiquant le nom de l'index le plus fréquement utilisé ici ---!




 Certains SGBD utilisent la technique des index bitmap





              


  soit la table suivante :
                                 l'index bitmap associé sera
     ##################### 
rang #  client   ville   #           valeur    bitmap
     #####################         ......................
 1   #  1        NANTES  #         : NANTES : 10000100  :
 2   #  6        ANGERS  #         : ANGERS : 01000000  :
 3   #  3        RENNES  #         : RENNES : 00100010  :
 4   #  7        CHOLET  #         : CHOLET : 00010000  :
 5   #  8        BREST   #         : BREST  : 00001000  :
 6   #  5        NANTES  #         : VANNES : 00000001  :
 7   #  4        RENNES  #         :........:...........:
 8   #  2        VANNES  #                    12345678
     #                   # 
     #####################      On place un "1" pour chaque enregistrement
                                 ayant cette clé à la position du n° de rang


                                pour NANTES les enregistrements 1 et 6.





              


 Cette technique pose plusieurs problèmes :


   1/ la place utilisée peut-être importante pour des clés composées.


   2/ la maintenance d'une clé génère DEUX E/S


       (sur l'ancienne clé et sur la nouvelle)


  L'AS/400 n'utilise pas les index bitmap, par contre la technologie bitmap
     est utilisée pour gérer vos requêtes avec des tests depuis la V4R20.


  Il utilise un index B-tree pour chaque critère et construit un nuage de
      point (bitmap) sur chaque résultat, et applique une fonction booleènne
      AND/OR sur les deux.


  le résultat indique par un "1" la liste des enregistrements ayant vos
      un (OR) ou deux (AND) critères vrais.


  NANTES ou ANGERS fournit 10000100
                   puis    01000000 
                           11000100 ==> les lignes 1,2 et 6.


 EVI pour finir, qui est un concept Rochester (il y a un brevet), l'AS/400
  étant le premier à l'utiliser.


 EVI est une utilisation avancèe des index Bitmap


                                                               Vecteur
     #####################                                  +-------------+
rang #  client   ville   #  ...........................     | code | rang |
     #####################  : Table des symboles      :     +------+------+
 1   #  1        NANTES  #  :.........................:     |   1  |  1   |
 2   #  6        ANGERS  #  :Valeur:code:Deb:Fin: nbre:     |   2  |  2   |
 3   #  3        RENNES  #  :      :    :   :   :     :     |   3  |  3   |
 4   #  7        CHOLET  #  :NANTES: 1  : 1 : 6 :  2  :     |   4  |  4   |
 5   #  8        BREST   #  :ANGERS: 2  : 2 : 2 :  1  :     |   5  |  5   |
 6   #  5        NANTES  #  :RENNES: 3  : 3 : 7 :  2  :     |   1  |  6   |
 7   #  4        RENNES  #  :CHOLET: 4  : 4 : 4 :  1  :     |   3  |  7   |
 8   #  2        VANNES  #  :BREST : 5  : 5 : 5 :  1  :     |   6  |  8   |
     #                   #  :VANNES: 6  : 8 : 8 :  1  :     +-------------+
     #####################  :......:....:...:...:.....:



              


 Le vecteur contient un poste par enregistrement, la position donnant le
   n° de rang, MAIS on indique un code et non une valeur de clé.


    tout cela lève les deux désavantages des index bitmap.


 On indique en plus une table des symboles qui contient


    - la correspondance entre chaque valeur de clé et son code associé


    - des statistiques destinées au "Query Governor" l'optimiseur de
                                                                  requêtes


 Il faut simplement indiquer le nombre de valeurs différentes lors de la
  création afin de savoir s'il faut créér un vecteur sur 1,2 ou 4 octets


 si vous ne connaissez pas ce nombre de valeurs différentes SQL va les
    rechercher pour vous et la création de l'index sera un peu plus longue


    CREATE ENCODED VECTOR INDEX on fichier(clé1, clé2, ...)


                   FOR x DICTINCT VALUES

 On parle de place occupée divisée par 16


          de temps de réponse divisés par 10


 --> tout cela reste à vérifier sur VOTRE BASE !


Mais quand même, les tests du lab sont les suivants :


 sur un 53S (4 voies) avec une table de 255 GO


     sans index : 30 minutes
     b-tree     : 18 minutes
     EVI        : 0,58 minutes (il n'y a pas d'erreur de frappe !)




ATTENTION :


     les index EVI sont destinés à SQL (et QUERY, QM, ...)


     ILS NE SONT PAS UTILISABLES PAR PROGRAMME (CHAIN, READ, etc)


il nous faudra donc probablement faire cohabiter les deux !


 DIVERS DB2/400
 --------------


 deux nouvelles commandes


      CPYTOIMPF (copy to imported file)


 et


       CPYFRMIMPF (from imported file)




  permettent l'importation/exportation de fichiers physiques de/vers des
   fichiers à plat avec séparateurs (type CSV).













              




















   le point sur les variables de type DATE





















              


   Les nouveaux types de variables de la base de donnée OS/400


   date et heure


   - SQL : DATE, TIME, TIMESTAMP (CURRENT DATE, CURRENT TIME, ... valides)


   - SDD = type de donnée L -> date  mots-clés DATFMT() et DATSEP()
                          T -> heure mots-clés TIMFMT() et TIMSEP()
                          Z -> horodatage (pas de mot-clé)


 Fonctions SQL :


              CHAR(date) renvoie la représentation caractère d'une date
                          (suivant DATFMT sur STRSQL ou CRTSQLxxx)


  SQL et MANIPULATION DE DATES


              DATE(expression)


                  convertit "expression" au format DATE

              

                  formats admis: TIMESTAMP (extrait la partie DATE)
                                 7 ALPHA   (format julien AAAAJJJ)
                                 ALPHA représentant une date éditée
                                 (AAAA-MM-JJ, par exemple)
                                 numérique représentant (nbr de jours - 1)
                                  depuis le 1er janvier de l'AN 1.


  pour une zone numérique, écrire


   date(
        substr(digits(dat6), 5, 2 ) !! '/' !! substr(digits(dat6), 3, 2)
        !! '/' !! substr(digits(dat6), 1, 2)
       )


              DAY, MONTH, YEAR


                  renvoient la partie concernée d'une expression date
                   (voir ci dessus + variable de type DATE)


              DAYS(expression)
                  renvoie le nombre de jours -1 séparant cette date du
                   1er janvier de l'an 1.


MANIPULATION D'HORAIRES


              TIME(expression)


                  convertit "expression" au format TIME


                  formats admis: TIMESTAMP (extrait la partie TIME)
                                 ALPHA représentant une heure éditée
                                 (HH:MM:SS)


              HOUR, MINUTE, SECOND
                  renvoient la partie concernée d'une expression TIME
                   (voir ci dessus + variable de type TIME)




              TIMESTAMP(expression)
                  convertit "expression" (horodatage édité)


              TIMESTAMP(date heure)
                  produit l'horodatage correspondant (microsec. à zéro)

              


NOTION DE DUREE:


              Durées explicites


                  YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS, MICROSECONDS


                   servent aux calculs (ARRIVEE + 6 MONTHS + 15 DAYS)


                  ainsi que CURRENT DATE, CURRENT TIME et CURRENT TIMEZONE


                  (CURRENT TIMEZONE représente le décalage avec GMT
                    ==> CURRENT TIME - CURRENT TIMEZONE = temps universel)


              Durées numériques


                  pour une date  = valeur numérique 8,0 aaaaammjj
                  pour une heure = valeur numérique 6,0 hhmmss
                  pour un horodatage = 20,6 (décimales = microsecondes)


                  CURRENT DATE + 0615 = aujourd'hui + 6 mois et 15 jours

              


 INCREMENTATION, DECREMENTATION, DIFFERENCE




              AJOUT (+)


                  TOUJOURS Date + durée = date
                           heure + durée = heure


                  si le mois est modifié en dépassant 12, il est ajusté et
                   l'année est incrémentée (idem jours, minutes, secondes)


              RETRAIT (-)


                  DATE - durée = DATE : il s'agit d'une décrémentation


                  DATE - DATE = durée : il s'agit d'une différence


                   la durée est exprimée en durée numérique s'il s'agit
                    d'une colonne résultat.
                   une durée explicite peut être utilisée lors d'un test
                     WHERE (DAT1 - DAT2) > 2 MONTHS

 Fonctions V3R60 : 




 CURDATE()          = idem au registre CURRENT DATE


 CURTIME()          =   "      "       CURRENT TIME


 NOW()              =   "      "       CURRENT TIMESTAMP




 DAYOFMONTH(date)   = jour dans le mois      (idem DAY().)


 DAYOFWEEK(date)    = jour dans la semaine  (1=dimanche)


 DAYOFYEAR(date)    = jour (julien) dans l'année.


 QUARTER(date)      = N° du trimestre


 WEEK(date)         = N° de la semaine





              

OPNQRYF


 1/comparaison avec une variable de même type   'DATCHG > DATCRT'
                  avec une constante (charactère)  'DATCHG > "01/01/94" '


                  attention, respecter le format et les séparateurs.


 2/calcul


   avec des fonctions intégrées de durée :
        %DURYEAR( ) %DURMONTH( ) %DURDAY( )
        %DURHOUR( ) %DURMINUTE( ) %DURSEC    %DURMICSEC( )


 OU
   avec une durée numérique :
        date = décimale 8,0 sous forme yyyymmdd (nombre d'années-mois-jours)
          (le résultat d'une opération date-date est sous ce format)
        heure= décimale 6,0 sous forme hhmmss   (nombre d'heures-minutes-s)
          (le résultat d'une opération heure-heure est sous ce format)
        horodatage= décimale (20,6) sous forme yyyymmddhhmmsscccccc
          (le résultat d'une opération timestamp-timestamp est sous ce
                                                               format)


 3/ avec des opérations + et - .


    + : Ajout d'une durée (incrémentation)


        DATE + 215 (date + 2 mois et 15 jours)


        DATE + %DURMONTH(2) + %DURDAY(15)  (idem)


        si l'on ajoute une durée en mois (%DURMONTH) le jour reste inchangé
         sauf s'il est plus grand que le dernier jour du mois auquel cas il
         est remplacé par le dernier jour du mois.


        %DATE('30/01/1994') + %DURMONTH(1) devient 28/02/94


        Modifier une partie de date affecte les éléments dépendants


         Ajouter un nombre de jours peut modifier le mois et l'année


         Ajouter un nombre de mois peut modifier l'année



              


    - : différence entre ....


        DATE1 - DATE2 (résultat sous forme de durée)


        %DATE('15/3/2000') - %DATE('31/12/1999') = 215 (2 mois et 15 jours)


      : retrait d'une durée (décrémentation)


        DATE - 215 (date - 2 mois et 15 jours)


         mêmes remarques que pour l'incrémentation






    Pour une variable de type horodatage


     la modification de l'heure(+ ou -)
       peut entrainer la modification de la date.
     la modification des microsecondes
       peut entrainer une modification de l'heure.

              


 OPNQRYF - Liste des Fonctions associées:


 %CURDATE, %CURTIME, %CURTIMESTP  sans argument, donnent date/heure en cours


   QRYLST('DATCRT = %CURDATE')


 %DATE, %TIME, %TIMESTP renvoient date/heure de l'argument


         l'argument peut être une variable horodatage pour %DATE, %TIME
                              une constante caractère (attention au format)
                              une variable caractère


   QRYSLT('%DATE(DAT8) = %CURDATE) ou %DATE(VHORO) = "12/12/94"   ....


 %DAY, %MONTH, %YEAR, %HOUR, %MIN, %SECOND, %MICSEC


                         renvoient une PARTIE de l'argument (Binaire 4)




    QRYSLT('%MONTH(DATE1) = 12)  ou %MONTH(DATE1 - DATE2) > 1

              


 %CHAR(date/heure format)


      renvoie date ou heure sous format caractère


   QRYLST('%CHAR(DATE1 "EUR") = "28.02.1994")


   sont admis ISO, EUR, USA et JIS. Par défaut c'est le format du job.




 %DAYS( )               renvoie une date sous format numérique (Binaire 4)


                         sous la forme nombre de jours -1 depuis 01/01/0001




         date1 - date2      produit un résultat aaaammjj = une durée


         %days(date1) - days(date2) un résultat   jjjjjj = un nbr de jours




 %MIN et %MAX acceptent les variables de type DATE, HEURE, HORODATAGE
       comme SQL


QUERY/400


 CHAR(date) renvoie la représentation caractère d'une date


                 (suivant le format de la date par défaut)




  ...........................................................
  :     Pour connaitre les formats en cours, utilisez F17   :
  :.........................................................:




MANIPULATION DE DATES


              DATE(expression)  convertit "expression" au format DATE


                  formats admis: TIMESTAMP (extrait la partie DATE)
                                 7 ALPHA   (format julien AAAAJJJ)
                                 une chaîne de car. représentant une date
                                 numérique représentant (nbr de jours - 1)
                                  depuis le 1er janvier de l'AN 1.


    en générale on utilise l'option chaîne de caractères, qe qui
        signifie qu'il faut fournir à la fonction DATE( ) une
        information sous la forme JJ/MM/AA. (par ex '15/12/99')




   si vous avez trois zones Numériques (toujours AN, MOIS, JOUR)


           écrivez DATE(DIGITS(JOUR) !! '/' !!
                        DIGITS(MOIS) !! '/' !!
                        DIGITS(AN) )




  si vous avez UNE SEULE zone numérique (DAT6), il faut en faire trois
      avec la fonction SUBSTR() :


 ........................................................................
 : Zone        Expression                         En-tête de colonne    :
 : DATE        DATE(substr(digits(dat6), 5, 2) !! '/'    date           :
 :              !! substr(digits(dat6), 3, 2) !!                        :
 :             '/' !! substr(digits(dat6), 1, 2) )                      :
 :......................................................................:


              DAY, MONTH, YEAR


                  renvoient la partie concernée d'une expression date


              exemple : MONTH(datcdm) = mois de commande




              DAYS(expression)
                  renvoie le nombre de jours -1 séparant cette date du
                   1er janvier de l'an 1.


  et aussi :


              CURRENT(DATE)     = date en cours


              CURRENT(TIME)     = heure en cours


              CURENT(TIMESTAMP) = horodatage en cours





              


 pour pouvoir comparer votre date de commande à aujourd'hui vous devez


 1/ transformer date de commande en "DATE"


 ........................................................................
 : Zone        Expression                         En-tête de colonne    :
 : DATE        DATE(substr(digits(dat6), 5, 2) !! '/'    date           :
 :              !! substr(digits(dat6), 3, 2) !!                        :
 :             '/' !! substr(digits(dat6), 1, 2) )                      :
 :......................................................................:


 2/ définir une variable "CEJOUR"


 ..........................................................................
 : Zone        Expression                             En-tête de colonne  :
 : CEJOUR      CURRENT(DATE)                           cejour             :
 :.................................................


 3/ comparer les deux variables



              


MANIPULATION D'HORAIRES


              TIME(expression)


                  convertit "expression" au format TIME


                  formats admis: TIMESTAMP (extrait la partie TIME)


                                 Chaîne de car. (HH:MM:SS)




              HOUR, MINUTE, SECOND
                  renvoient la partie concernée d'une expression TIME




              TIMESTAMP(expression)
                  convertit "AAAA.MM.JJ.HH:MM:SS.mmmmmm" en TIMESTAMP
       ou
              TIMESTAMP(date heure)
                  produit l'horodatage correspondant (microsec. à zéro)

              


NOTION DE DUREE:


              Durées explicites


                  YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS, MICROSECONDS


                   servent aux calculs (et UNIQUEMENT dans un calcul)




                     (ARRIVEE + 6 MONTHS + 15 DAYS)




              Durées numériques


                  pour une date  = valeur numérique 8,0 aaaaammjj
                  pour une heure = valeur numérique 6,0 hhmmss
                  pour un horodatage = 20,6 (décimales = microsecondes)


                  CURRENT DATE + 0615 = aujourd'hui + 6 mois et 15 jours



              


 INCREMENTATION, DECREMENTATION, DIFFERENCE




              AJOUT (+)


                  TOUJOURS Date + durée = date
                           heure + durée = heure


                  si le mois est modifié en dépassant 12, il est ajusté et
                   l'année est incrémentée (idem jours, minutes, secondes)


              RETRAIT (-)


                  DATE - durée = DATE : il s'agit d'une décrémentation


                  DATE - DATE = durée : il s'agit d'une différence


                   la durée est exprimée en durée numérique s'il s'agit
                    d'une colonne résultat.



              


 pour pouvoir comparer votre date de commande à hier vous devez


 1/ transformer date de commande en "DATE"


 ........................................................................
 : Zone        Expression                         En-tête de colonne    :
 : DATE        DATE(substr(digits(dat6), 5, 2) !! '/'    date           :
 :              !! substr(digits(dat6), 3, 2) !!                        :
 :             '/' !! substr(digits(dat6), 1, 2) )                      :
 :......................................................................:


 2/ définir une variable "HIER"


 ........................................................................
 : Zone        Expression                           En-tête de colonne  :
 : HIER        CURRENT(DATE) - 1 DAY                 hier               :
 :......................................................................:


 3/ comparer les deux variables


 

début   

              

©AF400