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

Juin 2002

 

Client serveur, quel client ?

  • Le mode 5250 possède ses propres limites.

 

  • le choix d'une architecture pérène est un véritable défi :

    • Client / serveur traditionnel
      • le trio gagnant (dans la désordre) : VB , WINDEV, DELPHI (VisualAge RPG ?)
      • N'est-il pas trop tard ? (gros problèmes de déploiement)
      • Attention à limiter le rôle du client à la portion congrue
    • le client WEB
      • Scripts (NETDATA, PHP) ou JAVA (JSP/Servlets)
      • Impossible de tout ré-écrire.
      • rend primordiable le rôle du SGBD-R.

Dans tous les cas de figure, vous devez CENTRALISER afin de CAPITALISER.

Réutilisation des routines GAP (4 si possible), par le jeux des procédures cataloguées, des fonctions.

Développement du rôle central de la base de données et du langage SQL.

 

Dans ce cadre nous vous proposons une petite histoire de la base de données AS/400 :


 

DDS et Historique de la base de données sur AS/400

 

 

fichiers physiques


                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 




     C'EST LE RESERVOIR DE DONNEES 
           - DESCRIPTION  -----> Caractéristiques du Fichier                                   Format ou Longueur d'Enregistrement 
           - CHEMIN D'ACCES  ----!                                   !----> Autant que de Membres             - DONNEES         ----! 


C'est véritablement l'équivalent d'une TABLE SQL (plus la notion de membre)





                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 


     SPECIFICATIONS DE DESCRIPTIONS DE DONNEES 
        Permettent de:                  - donner le nom du format (qui sera désormais connu en tant                    que tel par le système)                  - décrire le dessin d'enregistrement (en citant dans l'ordre                    les zones composant le format)                  - solliciter certaines fonctions par l'intermédiaire de mots                   clés et de paramètres            NB: il n'y a qu'un seul format par FICHIER PHYSIQUE 
        chaque ligne est découpée comme suit :
                1 1        223   33333      4      6          7 9        890   45678      5      A..........T.NOM+++++++RLG+++TD+U......FONCTION+++++++++++++++++++++++

                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 


     SPECIFICATIONS DE DESCRIPTIONS DE DONNEES 
        Un source SDD est décomposé en QUATRE niveaux :
        +
 Niveau fichier (avant le premier format)                                                                                                définit les mots-clés valables pour l'ensemble du fichier
col 45 :                   
REF(fichier-répertoire)
UNIQUE
        + Niveau format (à partir du nom du format et jusqu'à la première                          définition de zone)                  col 17    : R (record)
                 col 19-28 : nom du format
                 col 45    : mots-clés

                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 


     SPECIFICATIONS DE DESCRIPTIONS DE DONNEES 
        Un source SDD est décomposé en QUATRE niveaux :
        +
 Niveau zone (avant le format suivant ou avant le niveau C.A)                                                                                                col 17    : à blanc
                 col 19-28 : nom de la zone
              __ col 29    : référence           OU |              |__ col 30-34 : longueur
                 col 35    : type
                 col 36-37 : nb de décimales

                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 


       NATURE ET LONGUEUR DE LA ZONE             1.  ZONE ALPHA      (nb de décimales à blanc)                type de zone  A ou BLANC  valeur par défaut 
           2 . ZONE NUMERIQUE  (nb de décimales renseigné)                - par défaut les zones numériques sont en condensé                 - la longueur fournie doit être la longueur totale(avec déc.)
              
 type de zone  P ou BLANC  packée (valeur par défaut)                               S           étendue (signée)                              B           binaire                               L           date                              T           horaire                              Z           horodatage:date,heure,microsecondes
  

                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 
   MOTS-CLE COMPLEMENTAIRES. 

     1) DOCUMENTATION D'APPLICATION (colonne 45) 
          TEXT('TEXTE DE LA ZONE OU DU FORMAT')            COLHDG('ENTET1' 'ENTET2' 'ENETET3') 
     2) CONTROLES DE SAISIE         (colonne 45) 
          COMP(XX val)   xx = EQ(=),NE(<>),GT(>),GE(>=),...           RANGE(borneinf bornesup)           VALUES(val1 val2 val3 ...)           CHECK(xx)      XX = VN nom valide,M10 = modulo 10,..(contraignant)
   
  3) PRESENTATION DES DONNEES NUMERIQUES      
          EDTCDE(x)         un édit-code prédéfini           EDTWRD('zzzzzzzz') masque d'édition
   


     EDTCDE       ------ --------------------------------------------------------------------------- ! Impression ! Impression !!  Pas  ! Symbole!   Symbole    ! X Ajout du   ! !    des     !  montants  !!  de   !   CR   !      -       !   signe +    ! !   points   !  nuls      !! signe !        ! à D  ! à G   ! Y Impression ! !--------------------------------------------------!-------!   d'une date ! !    OUI     !    OUI     !!   1   !    A   !   J  !   N   ! Z Suppression! !    OUI     !    NON     !!   2   !    B   !   K  !   O   !   des zeros  ! !    NON     !    OUI     !!   3   !    C   !   L  !   P   !   et enleve  ! !    NON     !    NON     !!   4   !    D   !   M  !   Q   !   le signe   ! ---------------------------------------------------------------------------
 4) DATES ET HEURE                          

 
          DATFMT, DATSEP, ...       DATFMT    !       DATSEP             !    exemple      ------    !       ------             !   -----------      *DMY      !       '/', '.', etc ..   !   15/02/98      *YMD      !        idem              !   98/02/15                !                          !      *ISO      !       imposé             !   1998-02-15      *EUR      !       par le format      !   15.02.1998                !                          !                      

 5) NOUVEAUTES V2R11                         

          ALWNULL Support de la valeur nulle
 

          VARLEN variable à lg variable

 


                             ######################## 
                             ##  FICHIER PHYSIQUE  ## 
                             ######################## 


     SPECIFICATIONS DE DESCRIPTIONS DE DONNEES 
        Dernier niveau (facultatif avec les PF) :
        +
 Niveau C.A (en fin de source, dernier niveau)                                                                                                col 17    : K = définition de clé
                 col 19-28 : nom de la zone
                 col 45    : définition complémentaire

ASCEND / DESCEND





Exemple :
                R CLIENTF1                  TEXT('FICHIER CLIENT')                   NOCLI          6  0       TEXT('N° CLIENT')                                             COLHDG('N°' 'du' 'Client')                                             EDTCDE(Z) COMP(GT 0)                   NOMCLI        30          TEXT('NOM CLIENT')                                             COLHDG('NOM Client')                                             COMP(NE ' ')                   DEP            2S 0       TEXT('DEPARTEMENT DU CLIENT')                                             COLHDG('DEPT')                                             RANGE(01 98)  ... / ///
                  DATCRT           L        TEXT('Date création')                                             COLHDG('Date' 'Création')                                             DATFMT(*EUR)                   CACLI         13  2       TEXT('CA ANNUEL')                                             COLHDG('CA' 'Annuel')                                             EDTCDE(L) 
ALWNULL) 


 

fichiers logiques



                          LES FICHIERS LOGIQUES

Un Fichier logique est un objet de type *FILE. Il possède une description et 1 ou plusieurs membres.
CES MEMBRES NE CONTIENNENT PAS DE DONNEES,
ils ne possèdent qu'un chemin d'accès qui pointe sur les données d'un ou plusieurs fichiers physiques.
 - historiquement : index sous forme d'arbre binaire [bi-tree].

- depuis la V4R20, il est possible de construire des index EVI






LES FICHIERS LOGIQUES VONT NOUS PERMETTRE :
                  - d'avoir une clé différente du fichier physique, donc                     d'accéder dans un nouvel ordre aux enregistrements
                  - de regrouper les données de plusieurs fichiers physiques
                  - de sélectionner une partie des enregistrements d'1 ou                     plusieurs fichiers physiques.


              Une Clé différente du fichier physique               --------------------------------------
              Prenons l'exemple du fichier CLIENTP1 ci-dessous.

     A************************      A*   FICHIER CLIENTP1      A************************      A                                      REF(REPERTP1)      A          R CLIENTF1                  TEXT('FORMAT DU FICHIER CLIENTP1')      A            NOCLI     R      A            NOM01     R      A            ADR01     R      A            ADR02     R      A            CODPS     R      A            CODEX     R      A            CRLIM     R      A            TOTAL     R      A          K NOCLI


MAINTENANT JE VEUX CREER UN CHEMIN D'ACCES SUR CES DONNEES DANS L'ORDRE DES NOMS DE CLIENT (ZONE NOM01). J'APPELLERAI CE FICHIER LOGIQUE CLIENTL1. Voici sa description:

     A************************      A*   FICHIER CLIENTL1      A************************      A          R CLIENTF1                  PFILE(CLIENTP1)      A          K NOM01                       ^                                               !                                               !                                       -----------------------                                       FONCTION NIVEAU FORMAT,                                       INDIQUANT LE NOM DU                                       FICHIER PHYSIQUE SUR                                       LEQUEL POINTE LE FICHIER                                       LOGIQUE.

CE FICHIER N'A PAS DE DESSIN D'ENREGISTREMENT, MAIS          A LE MEME NOM DE FORMAT QUE LE FICHIER PHYSIQUE          =====> IL A LA MEME DESCRIPTION DE ZONES QUE LE FICHIER PHYSIQUE

REGARDONS MAINTENANT LE MEME EXEMPLE MAIS CETTE FOIS-CI AVEC
UN DESSIN D'ENREGISTREMENT DIFFERENT DU FICHIER PHYSIQUE.



     A************************      A*   FICHIER CLIENTL2      A************************      A          R CLIENTF2                  PFILE(CLIENTP1)      A            NOM01      A            NOCLI      A            ADR01      A            ADR02      A            CODPS      A          K NOM01


CETTE FOIS-CI IL Y A UN NOM DE FORMAT DIFFERENT ====> JE DOIS INDIQUER   LES ZONES FAISANT PARTIE DE CE FORMAT. (CE QUI PERMET, PAR EXEMPLE,    DE NE "VOIR" QUE LES ZONES AUTORISEES A CERTAINS UTILISATEURS)


 Cette possibilité est intéressante pour des problèmes de confidentialité.

 En effet, c'est le physique qui possède les autorisations sur les données   (réservoir des données), mais CHAQUE fichier(PF ou LF) possède ses propres  droits niveau objet (donc des droits d'accès).
Il est par conséquent possible :  de limiter les autorisations sur le fichier physique (contenant TOUTES les  informations) et d'autoriser l'accès à une vue plus réduite des données  par le biais de logiques avec redéfinition de format.





 IL EST POSSIBLE DE FAIRE DES SELECTIONS D'ENREGISTREMENTS PAR LE BIAIS   DES FICHIERS LOGIQUES.
 Cette sélection se fait au niveau chemin d'accès, après la définition des   clés .
 Elle peut se faire en indiquant les enregistrements à sélectionner                                                        (S en col. 17)                     en indiquant les enregistrements à ommettre                                                        (O en col. 17)
 Puis en indiquant le nom de la zone sur laquelle porte le test   et le test à effectuer (en col. 45), en utilisant COMP, RANGE, VALUES.
      * si département = 75      A          S DEPT                      COMP(EQ 75)       * si département compris entre 11 et 33      A          S DEPT                      RANGE(11 33)       * si département = 44 ou 49 ou 85 ou 35.      A          S DEPT                      VALUES(44 49 85 35)




 Un fichier logique permet aussi de faire de la fusion d'enregistrements.
1/ FORMATS IDENTIQUES. (ex fichiers comptables, en cours et historique)
   Il faut indiquer plusieurs fichiers physiques dans le mot-clé PFILE
     A          R COMPTAF1                  PFILE(COMPTAP1 COMPTAH)      A          K NOECR
   les deux fichiers doivent avoir le format COMPTAF1.
 2/ FORMATS DIFFERENTS mais possédant des informations communes.    ex: fichiers entête et lignes de commandes.
  !n° cde!client!date cde!                !n° cde!n° li!code art.!quantité!              !                                     !             !---------------   -------------------!                             | |        entête->    !n° cde!client!date cde!    puis lignes ->   !n° cde!n° li!code art.!quantité!                     !n° cde!n° li!code art.!quantité! 


 Il faut alors définir plusieurs formats (on parle de logique multi-formats)
      * fichier entêtes de commande      A          R ENTCDEF1                  PFILE(ENTCDEP1)      A          K NOCDE       * fichier lignes de commande      A          R LIGCDEF1                  PFILE(LIGCDEP1)      A          K NOCDE
 Le classement se fera par n° de commande et pour en même n°, par ordre de   déclaration des formats.
 Il est possible d'indiquer une clé secondaire pour l'un des formats   (ici n° de ligne pour les lignes d'une même commande)       * fichier entêtes de commande      A          R ENTCDEF1                  PFILE(ENTCDEP1)      A          K NOCDE       * fichier lignes de commande      A          R LIGCDEF1                  PFILE(LIGCDEP1)      A          K NOCDE      A          K NOLI

 


                      FICHIERS LOGIQUES JOINTS                       ------------------------
1 JONCTION. -----------
         Fonction permettant d'obtenir par UNE SEULE OPERATION          un ensemble d'informations venant de FICHIERS PHYSIQUES          DIFFERENTS.


         Fichiers Référencés :
         - Physiques seulement : 32 maxi
         - 1 fichier primaire (guide)
         - 1 à 31 fichiers secondaires

- fichiers en lecture uniquement


   3/  S D D
   ---------

       - 6 mots-clés spécifiques
           JFILE(liste des fichiers à joindre)            JOIN(fic1 fic2)            JFLD(zone1 zone2)            JREF(nn) (n° fich pour nom de zones identiques)            JDUPSEQ(zone3..)            JDFTVAL(sélection enregistrement sans correspondance)


 Exemple : Soit les fichiers physiques suivants :
 
           STGP1 (fichier stagiaires)        | NOTP1 (fichier des notes) 

              R STGF1                        |   R NOTF1
                NUMSTG  6S 0 TEXT('N° stag') |     NUMSTG 6S 0 TEXT('N° stag')
                NOMSTG 20    TEXT('Nom')     |     LANG   3    TEXT('langage')
                VILSTG 20    TEXT('Ville')   |     NOTE   4P 2 ..
                DEPSTG  2P 0 TEXT('départ')  |

Source :
A JDFTVAL
A R JOINTF JFILE(STGP1 NOTP1)
A J JOIN(1 2)
A JFLD(NUMSTG NUMSTG)
A JDUPSEQ(LANG)
A NUMSTG JREF(1)
A NOMSTG
A LANG
A NOTE
A K NUMSTG

 



DB2/400 de la V3R10 à la V4R40

Rappel sur des fonctions de DB2/400 parfois sous-employées :

  • Variables de Type DATE, HEURE, HORODATAGE

    Remarques : ce n'est supporté QUE par le compilateur GAP 4 et SQL (Cobol depuis la V4R20)

  • Notion de variable obligatoire/facultative (valeur NULL)

    Remarques : le support de la valeur nulle est disponible pour GAP 4 depuis la .V3.7.

  • Les vues
(elles sont dans de nombreux cas plus puissantes que les fichiers logiques SDD):
 
  • On admet des vues portant sur des vues
  • des calculs, des sélections complexes
  • des vues de type traitement par groupe (group by)
... etc ...
 

Depuis la V3R10 :

1/ contraintes et intégrité référentielle.

  • contrainte d'entité : Notion d'unicité
Notion de clé primaire
  • intégrité référentielle une clé étrangère doit se rapporter à une clé primaire d'une table déclarée parente.
(On ne peut pas insérer une commande se rapportant à un client non enregistré dans le fichier client)

il est alors possible de préciser comment gérer l'intégrité dans le sens parent/enfant. 
C'est à dire que faire si l'on tente de supprimer un client ayant des commandes.

les deux grandes hypothèses sont :
 

  • action interdite.
  • action répercutée en cascade.
l'utilsation du commit est fortement conseillée et dans certains cas obligatoire.( particulièrement la suppression en cascade)
  • contraintes de domaine depuis la V4R20
vérification de type comp, range, values avec des constantes ou avec d'autres colonnes du même fichier.

quelques exemples

ADDPFCST FILE(CLIENT) TYPE(*PRIKEY) KEY(NOCLI) CST(client_unique)

ADDPFCST FILE(ENTCDE) TYPE(*REFCST) KEY(NOCLI) CST(client_existe) PRNFILE(CLIENT)

ADDPFCST FILE(ENTCDE) TYPE(*CHKCST) CST('commande_valide') CHKCST('nocde > 0 and datliv > datcde')

commandes et administration :



 Définition d'une contrainte d'unicité
              ADDPFCST    FILE(client)                           TYPE(*UNQCST)                           CST(client_unique) <- nom de la contrainte                           KEY(nocli)
 Définition d'une clé primaire
              ADDPFCST    FILE(client)                           TYPE(*PRIKEY)                           CST(num_client)  <- nom de la contrainte                           KEY(nocli)
  Une clé primaire est une forme particulière de contrainte d'unicité.       (valeur nulle non autorisée)
  Il peut y avoir plusieurs contraintes d'unicité (portant sur des zones   différentes), il ne peut y avoir qu'une seule clé primaire.



 Intégrité référentielle
              ADDPFCST    FILE(command)                           TYPE(*REFCST)                           CST(clicommand)                           KEY(numcli)      <- zone du fichier commande                           PRNFILE(client)  <- fichier parent                           PRNKEY(nocli)    <- clé candidate/fichier client                           UPDRULE(*NOACTION)                           DLTRULE(*CASCADE)
UPDRULE :  *NOACTION  contrôle lors du COMMIT (journalisation obligatoire)                                 et après l'appel du trigger            *RESTRICT  contrôle immédiat       (journalisation facultative) 
DLTRULE : les mêmes +  *CASCADE  , *SETNULL , *SETDFT

 Les attributs des clés candidates et parentes doivent être identiques :            même définition (type, lg, nombre de décimales)


 Si l'une des deux règles (UPDRULE ou DLTRULE) est différente de *RESTRICT :

  - vos fichiers DOIVENT être journalisés.
    s'ils ne le sont pas : - l'intégrité sera établie (ADDPFCST fonctionne).
                           - MAIS toutes vos demandes d'ouverture de fichier                               seront refusées (erreur d' E/S).
============================================================================

 Il y a 4 états possibles:  - Etablie/active       <-- OK, contrôle en cours
                            - Etablie/desactivée   <-- suspendue
                            - Définie/activée      <-- pas de membre
                            - Définie/désactivée   <-- idem, suspendue


 Une contrainte peut être momentanément "suspendue"

  Et donc, une contrainte établie peut s'avérer fausse


  Si une contrainte est fausse

     - soit suite à une restauration
     - soit suite à une désactivation , puis modifs dans le fichier
  Elle est notée "Check Pending" (verif en instance)


 Il faut utiliser la commande WRKPFCTS



   WRKPFCST
 ##########################################################################   #           Gestion des contraintes de fichier physique                  #   #                                                                        #   # 2=Modifier   4=Enlever  6=Afficher enreg en instance de vérif.         #   #                                                                        #   # Opt  Contrainte   Fichier   Biblio    Type    Etat    verif/instance   #   #      ARTICK1      ARTICP1   MABIB     *PRIKEY                          #   #      ARTICC1      ARTICP1   MABIB     *REFCST ETA/DES    Oui           #   #      ARTICC2      ARTICP1   MABIB     *REFCST ETA/ACT    Non           #   #       ....                                                             #   # ==>                                                                    #   #                                                                        #   ########################################################################## 
 2=CHGPFCST, 4=RMVPFCST, 6=DSPCPCST
 "Verif : Oui" signifie que le système à détecté au moins un incohérence   (visualisable par l'option 6)




  l'Option 6 affiche le(les) enregistrement(s) en erreur 
(ici date de livraison devrait être > à date de commande) :

  ..........................................................................   :                               Affichage du rapport                     :   :  Largeur . .:        71                                                :   :  Colonne . .:         1                                                :   :  Contrôle . . . .                                                      :   :  Ligne  ....+....1....+....2....+....3....+....4....+....5....+....6   :   :                N°       N°                                             :   :                CDE    CLIENT  DATE CDE    DATE LIV                     :   :           --------  --------  ----------  ----------                   :   :  000001         3         1   01.01.1940  01.01.1940                   :   :  ******  * * *  F I N  D E S  D O N N E E S  * * *                     :   :                                                                        :   :........................................................................:

   Après avoir modifié l'enregistrement il faut désactiver, puis réactiver     la contrainte, qui devient alors "établie / active".

2/ SQL - DDL

DDL (Data Definition Language) est la partie de SQL permettant de concevoir sa base.

Aujourd'hui IBM préconise d'utiliser largement SQL , y compris pour la création des fichiers.
D'ailleur nous verrons plus loin que les nouveautés base de données ne sont maintenant disponibles que sous SQL
(images par exemple)

vous retrouverez alors un seul source et un seul langage pour la structure et les contraintes :

-- table des pays
create table bdvin_00/pays (
pays char(20) ,
pays_code integer primary key ) ;

-- table des régions
create table bdvin_00/regions (
region char(30) ,
region_code integer primary key ,
pays_code integer references pays) ;

-- table des appellations (Coteau du Layon, Côtes roties ...)
create table bdvin_00/appellations (
appellation char(80) ,
region_code integer references regions ,
appel_code integer primary key ) ;

Les tables sont automatiquement créées avec SIZE(*NOMAX) REUSEDLT(*YES) et journalisées
(s'il existe un journal QSQJRN dans la bibliothèque)

LABEL ON permet de renseigner TEXT et COLHDG
ALTER TABLE propose de définir l'intégrité référentielle sur une table existante.

manque aujourd'hui :

- EDTCDE / EDTWRD

- la notion de référence qui arrive en V5R20

 

3/ triggers

Triggers Associé à une action base de donnée

(on associe un pgm "maison" à l'action «insérer un client» ou «modifier un client» ou «supprimer un client».)

Remarques :

Certains SGBD associent le trigger à la colonne (si je modifie la quantité) DB2/400 reste orienté ligne (si je manipule un enregistrement)

depuis la V3R70 un trigger peut modifier l'enregistrement base de données qu'il a recu en tant que paramètre.

(mettre date du jour dans «date de création» à chaque ajout)

Les triggers peuvent être écrit dans n'importe quel langage
C, RPG III ou IV ,COBOL

exemple :

ADDPFTRG FILE(ENTCDE) TRGTIME(*AFTER) TRGEVENT(*UPDATE) PGM(MONPGM) ALWREPCHG(*YES) 

c'est le dernier paramètre qui autorise la mise à jour de l'enregistrement

le pgm MONPGM doir recevoir deux paramètres:

A/ un buffer contenant

  • des infos systèmes (action BD, moment, ...)
  • la version avant de l'enregistrement (s'il y a lieu)
  • la version après de l'enregistrement (s'il y a lieu)

B/ la longueur du buffer

 

En V5R10, les triggers peuvent être écrits en PL/SQL

ils peuvent être liés à une colonne (300 Triggers possibles par fichier)

 

4/ jonction

DB2/400 admet maintenant la jonction norme SQL-92

C'est à dire SELECT * FROM CLIENT JOIN COMMANDE ON client.NOCLI = cde.NOCLI [WHERE ...]

Ce qui autorise les jointures externes :

(LEFT OUTER JOIN, c.a.d, tous les clients qu'ils possèdent ou non des commandes)

et les différences :

(EXCEPTION JOIN, c.a.d, les clients SANS commande))

 

V5R10 toujours, le RIGHT OUTER JOIN est admis

 

5/ vues

Vues SQL

Il est maintenant possible de placer une vue SQL dans une bibliothèque OS/400.

Une vue avec sélection, peut demander à ce que le contrôle soit fait y compris pour les enregistrements ajoutés, par l'intermédiaire de la vue avec WITH CHECK OPTION

l'odre SELECT en V4R20 admet les tests (CASE)

Select cours, texte, case sitfam
                        when 'C' then 'célibataire'
                        when 'M' then 'marié'
                        when ...
                    end AS situation
from ficpers

ou

Select noart, qtecde, puart,
case
     when codepays <> 'F' then puart
     when dep = 97 then puart *1,09
     else puart *1,206
end as TTC from cdecli

de telles requêtes peuvent être mémorisées dans une vue.

exemple

CREATE VIEW mabib.v1 AS

SELECT matricule, nom, prénom, salaire * 13 as annuel

CASE sitfam
    when 'C' then 'célibataire'
    when 'M' then 'marié'
    when 'D' then 'divorcé'
    when 'V' then 'veuf/veuve'
END AS situation

FROM ficpers WHERE datdep is null with check option

6/ DRDA

  • Two PHASES COMMIT
il est possible d'inclure dans une même transaction des fichiers se trouvant sur des bases de données différentes (dans le cadre de DRDA)

Exemple :

    connect to base 1

        moins 100 dans la quantité pour le produit A1

    connect to base 2

        plus 100 dans la quantité pour le produit A1

    Commit

la phase de validation sera réalisée en deux temps :
 

  • demande de préparation à la validation (prepared wave)
  • validation effective (commited wave)
en cas de problème, ROLLBACK sur les deux systèmes, ce qui vous garantit que le transfert de stock sera réalisé complètement ou pas du tout.
 
  • V4R20, DDM/DRDA sur IP
DMM et DRDA deviennent disponibles sur le protocole TCP/IP

(attention DRDA sur IP est en One phase commit, ce qui veut dire que vous devez valider avant de changer de sytème)

 

V5R10 : Two phases Commit sur IP
  • ODBC / JDBC
Le support d'ODBC est amélioré :

- Il est intégré pour les clients Windows:

- Il bénéficie de toutes les améliorations de SQL/400 (conformité aux standards), et est compatible DRDA :

    ainsi un micro connecté à l'AS/400, reconnaît toutes les bases connues de l'AS/400 lui-même.

- Client acces depuis la V3R1M3 propose e support de OLE DB
c'est à dire ODBC en plus lèger, plus universel (accès en mode ligne à ligne par exemple) et utilisé en tant que composant ACTIVE X.

7/ Procédures cataloguées

Un ensemble d'actions base de données devant être réalisées sur une base distante peut être demandé par l'appel à une procédure (un programme) stockée sur le serveur distant.

Cela normalise un ordre CALL (en tant qu'ordre SQL), avec passage de paramètres et ce, en étant affranchi de l'OS du serveur.

Sur l'AS/400 les procédures cataloguées peuvent être écrites dans n'importe quel langage et leur déclaration est optionnelle.

  • V4R20, on reconnait le PL/SQL pour l'écriture des procédures cataloguées. HELAS, il faut le compilteur C/400.

    V5R10 : le compilateur C n'est plus obligatoire
    (pseudo-compilateur intégéré à SQL/400)
exemple :

Create Procedure bib/p1
    (in nomatin DEC(6, 0),
    in newcoef DEC(3, 0),
    out codert int)
language SQL
P1:
Begin

Declare coeflu DEC(3, 0);
Declare Exit handler for SQLExecption Set codert=SQLCODE;

Select coef from personp1 into coeflu where nomat = nomatin;

if newcoef > coeflu then
    update personp1 set coef = newcoef
    where nomat = nomatin;
end if;

End

Divers

Une procédure cataloguée invoquée par ODBC peut renvoyer explicitement un groupe d'enregistrement par :

  • SET RESULT SETS CURSOR xxx (le curseur xxx, résultat d'une requête)
  • SET RESULT SETS ARRAY yyy (la table[tableau] yyy, chargée comme bon vous semble)
Optimiseur de requêtes :

Des outils de suivi et de contrôle de l'optimiseur de requêtes sont mis en place par la version 3.10 :

  •  PRTSQLINF : pour analyser les plans d'accès
  • CHGQRYA : pour limiter les requêtes, et gérer le parallélisme
  • STRDBMON et ENDDBMON pour analyser l'activité base de donnée (avec écriture dans un fichier)
  • Visual Explain (V4R50) pour une analyse graphique

8/ Alter TABLE

L'ordre ALTER TABLE permet maintenant de modifier la structure d'une table dynamiquement :

  • Modifier la notion de variable obligatoire/facultative
  • Modifier une colonne (taille, type, précision)
  • Ajouter, enlever une colonne.
Pour les programmes réalisant leur entrés/sorties à l'aide de SQL, cette seule action suffit, pour les autres il faut recompiler les programmes.

Cela apporte aussi une nouvelle commande OS :

CHGPF qui comporte un paramètre SRCFILE qui permet une Recréation

CHGPF FILE(clients) SRCFILE(QDDSSRC) SRCMBR(clients)

ATTENTION : la recopie se fait sur les noms de zone, vous ne pouvez donc
pas renommer des zones, mais les modifier, en ajouter
et modifier des paramètres comme EDTCDE, COLHDG, et, en règle générale, tout ce qui touche à :

  • la jonction
  • la définition du chemin d'accès
  • les sélections / omissions.

Pour les conversions nous sommes limités aux possibilités de la commande CPYF.

tout format numérique <--> tout format numérique
numérique étendu --> caractère
numérique étendu <--> date au format *YMD, *DMY , *MDY --> date au format *ISO, *USA, *EUR
caractère <--> date *YMD, *DMY, ...

(idem)     --> date *EUR, *USA, ...
caractère <--> timestamp (idem pour les formats)
date <--> date (changement de format transparent)
heure <--> heure

La valeur par défaut pour une date devient la date du jour, pour une heure cela devient l'heure en cours.

 

 

  • De nouvelles fonctions , dont un certains nombre d'ALIAS, montrant la volonté du constructeur de rendre DB2/400 compatible avec les standards.

9/ SYNTAXE SQL, nouveautés et récapitulatif : (en Bleu, les nouveautés V5R10)

Fonctions de groupe

Fonction(x) Retourne ? Exemple
AVG(x) la moyenne de X pour un groupe de ligne AVG(quantite)
COUNT(*) le nombre de lignes sélectionnées  
COUNT(DISTINCT X) le nombre de valeurs différentes pour X COUNT(dictinct nocli)
MAX(X) retourne la plus grande valeur sélectionnée MAX(DATLIV)
MIN(X) retourne la plus petite valeur sélectionnée MIN(prix)
SUM(x) retourne la somme de X SUM(qte * prix)
VAR(X) retourne la variance  
STDDEV(X) retourne l'écart type  

Fonctions ligne à ligne

Fonction(x) Retourne ? Exemple
MAX(X,Y) retourne la plus grande valeur de X ou de Y MAX(prixHA, pritarif) * qte
MIN(X,Y) retourne la plus petite valeur de X ou de Y MIN(datce, datliv)
ABSVAL(x) la valeur absolue de x ABSVAL(prix) * qte
CEIL(x) Retourne l'entier immédiatement supérieur à X
CEIL(2,42) = 3 CEIL(2,56) = 3 
RAND() Retourne un nombre aléatoire  
ROUND(x , y) Retourne l'arrondi comptable à la précision y
ROUND(2,42 , 1) = 2,40 
ROUND(2,56 , 1) = 2,60 
SIGN(x) Retourne -1 si x est négatif, 1 s'il est positif, 0 s'il est null Where SIGN(x) = -1
TRUNCATE(x , y) Retourne le chiffre immédiatement inférieur à X (à la précision y)
TRUNCATE(2,42 , 1) = 2,40 
TRUNCATE(2,56 , 1) = 2,50
DEC(x , l, d) x au format numérique packé avec la lg et la précision demandée. DEC(zonebinaire)
DEC(avg(prix), 9, 2
)
DIGITS(x) x en tant que chaîne de caractères DIGITS(datnum)
CHAR(x) x en tant que chaîne de car. (x étant une date) CHAR(current date)
FLOAT(x) x au format "virgule flottante" FLOAT(qte)
INT(x) x au format binaire INT(codart)
ZONED(x) x au format numérique étendu ZONED(prix)
CAST(x as typeSQL[lg])

x au format indiqué par typeSQL :

types valides
INT | INTEGER
SMALLINT
DEC(lg, nb-décimales)
NUMERIC(lg, nb-décimales)
FLOAT | REAL | DOUBLE
CHAR | VARCHAR
- --FOR BIT DATA-
-- -FOR SBCS ---
----FOR n°-ccsid *--
DATE
TIME
TIMESTAMP

* : un CSSID est un équivalent code-page associé à une donnée (france = 297)

CAST(qte AS CHAR(9))
Attention les zéros de gauche sont éliminés

CAST(prixchar as         NUMERIC(7, 2))

cast('123456,89' as      numeric(8, 2)) fonctionne

cast('123456,89' as      numeric(7, 2))
donne une erreur

(trop peu d'entiers)
 STRIP(x) ou
TRIM(x)
RTRIM(x) LTRIM(x)
supprime les blancs au deux extrémités de x.
• les blancs de droite
• les blancs de gauche
TRIM(raisoc)

LENGTH(x)

la longueur de x LENGTH(nom)

LENGTH(TRIM(nom))
CONCAT(x , y) concatene X et Y (aussi x CONCAT y ou X !! Y) CONCAT(nom, prenom)
SUBSTR(x, d, l) extrait une partie de x depuis D sur L octets SUBSTR(nom, 1, 10)
SUBSTR(nom, length(nom), 1)
LEFT(x, l) extrait une partie de x depuis 1 sur L octets LEFT(nom, 10)
SPACE(n) retourne n blancs nom concat space(5) concat prenom
MOD(x, y) le reste de la division de x par y MOD(annee, 4)
RRN(fichier) N° de rang RRN(clientp1)

TRANSALTE(x)
UPPER(x)
UCASE(x)

X en majuscule WHERE
UCASE(RAISOC) LIKE 'VO%'
LOWER(x)
LCASE(x)
x en minuscule (V4R40 uniquement) WHERE
LCASE(ville) LIKE 'nan%'
TRANSLATE( x, remplace, origine) Remplace tous les caractères de X présent dans origine par le caractère de même position dans remplace TRANSLATE(prixc, ' F', '0$')
remplace $ par F et 0 par sp
SOUNDEX( x) Retourne le SOUNDEX (représentation phonétique) de X
[basé sur un algorhytme anglo-saxon)
Where SOUNDEX(prenom) = SOUNDEX('Henri')
DIFFERENCE( x) Retourtne l'écart entre deux soundex
[0 = très différents, 4 = trés proches]
Where DIFFRENCE(prenom, 'HENRI)> 2
VALUE(x, y)
IFNULL(x, y)
retourne x s'il est non null, sinon y IFNULL(DEPT, 0)
LOCATE(x, y ,d) retourne la position à laquelle x est présent dans y ou 0 (la recherche commence en D, qui est facultatif) LOCATE(' ', raisoc)
POSITION(x
IN y)
idem LOCATE POSITION(' ' IN raisoc)
NULLIF(x, y) reourne NULL si X = Y NULLIF(Prix, 0)
CASE
when ... then ..
when ... then ..
[else]
END
retourne la valeur du premier THEN ayant la clause WHEN de vérifiée.

CASE dept
 WHEN 44 then 'NANTES'
 WHEN 49 then 'ANGERS'
 ELSE 'Hors région'
END AS METROPOLE

ou bien

CASE
 WHEN prix < 0 then 'négatif'
 WHEN codart = 0 then 'inconnu'
 ELSE 'positif ou nul'
END

 

Fonctions liées aux dates
Fonction(x) Retourne ? Exemple
DATE(x)
X doit être une chaîne au format du JOB
une date (sur laquelle les fonctions suivantes s'appliquent) DATE(
substr(digits(dat8), 7, 2)
 concat '/' concat
substr(digits(dat8), 5, 2)
 concat '/' concat
substr(digits(dat8), 3, 2) )
DAY(D)
DAYOFMONTH(D)
retourne la partie jour de D
(doit être une date ou un écart AAAAMMJJ).
DAY(DATCDE)
MONTH(D) retourne la partie mois de D (idem)

MONTH(current date)

YEAR(D) Retourne la partie année de D (idem) YEAR(current date - DATCDE)
DAYOFYEAR(D) retourne le n° de jour dans l'année (julien) DAYOFYEAR(datdep)
DAYOFWEEK(D) retourne le N° de jour dans la semaine
(1 = Dimanche, 2=Lundi, ...)
DAYOFWEEK(ENTRELE)
DAYOFWEEK_ISO(D) retourne le N° de jour dans la semaine
(1 = Lundi, ...)
DAYOFWEEK_ISO(ENTRELE)
DAYS(D) retourne le nbr de jours depuis 01/01/0001 DAYS(datcde)- DAYS(datliv)
QUARTER(D) retourne le n° du trimestre QUARTER(DATEFIN)
WEEK(D) retourne le n° de semaine
(Attention 01/01/xx donne toujours semaine 1)
WHERE
WEEK(DATLIV)= WEEK(DATCDE)
WEEK_ISO(D) retourne le n° de semaine
(la semaine 1 est celle qui possède un JEUDI dans l'année.)
WHERE
WEEK_ISO(DATLIV)= WEEK_ISO(DATCDE)
CURDATE() retourne la date en cours, comme CURRENT DATE  
CURTIME() retourne l'heure en cours, comme CURRENT TIME  
NOW() retourne le timestamp en cours  
JULIAN_DAYS(d) retourne le nbr de jours qui épare une date du 1er Janv. 4712 av JC.
JULIAN_DAYS(datcde)

Fonctions liées aux heures

Fonction(x) Retourne ? Exemple
TIME(T) une heure TIME(
substr(digits(h6), 1, 2)
 concat ':' concat
substr(digits(h6), 3, 2)
 concat ':' concat
substr(digits(h6), 5, 2) )
HOUR(T)
retourne la partie heure de T HOUR(Pointage)
MINUTE(D) retourne la partie minute de T

 

SECOND(T) Retourne la partie secondes de T  

Fonctions liées aux Timestamp

Fonction(x) Retourne ? Exemple
TIMESTAMP(T) un timestamp (date - heure - microsecondes) TIMESTAMP('
1999-10-06.15.45.00.000001 ')
TIMESTAMP
(D T)
un timestamp (microsecondes à 0) TIMESTAMP(datcde heure)
TIMESTAMPDIFF
(c 'DIFFERENCE')
C indique l'unité de mesure de l'écart que vous souhaitez obtenir
1 = fractions de s. 16 = jours
2 = secondes 32 = semaines
4 = minutes 64 = mois
8 = heures 128 = trimestres
  256 = Année

'DIFFERENCE' est la représentation caractères [ CHAR(22) ]
d'un écart entre deux timestamp.

TIMLESTAMPDIFF(32 ,
             CAST(CURRENT_TIMESTAMP 
             - CAST(DATLIV AS TIMESTAMP) 
             AS CHAR(22)) ) 

indique l'écart en semaines entre DATLIV
et aujourd'hui
MIDNIGHT_SECONDS retourne le nbr se secondes qui sépare un timestamp de minuit
MIDNIGHT_SECONDS(pointage)


Nouveaux types de verrouillage sous contrôle de validation.
 

valeur équivalent V3R10 enregistrement(s) verrouillé(s)
*NC *NONE aucun, commit/rollback inacif
*UR *CHG tous les enreisgtrements modifiés
*CS *CS identique à *CHG, plus UN enregistrement modifié par fichier lu
*RS *ALL tous les enregistrements (même lus)
*RR (nouveau) idem à *ALL plus ALCOBJ du fichier
(la lecture doit pouvoir être reproduite à l'indentique)

Cela peut s'indiquer maintenant sur le SELECT par la clause :

SELECT .... FROM ... WHERE .... WITH [RR!RS!CS!UR!NC] .

ainsi que sur les instructions :INSERT, UPDATE, DELETE.

10/ Options :

Les versions V3R20 / V3R70 ammènent à DB2 le parallèlisme :

l'utilisation de plusieurs processeurs pour un requête

"DB2 Symmetric Multiprocessing for OS/400" ou SMP
option (n° 26) de l'OS/400, facturable.

cette option se met en place par :

1/ la valeur système QQRYDEGREE
2/ qui donne la valeur par défaut pour la commande CHGQRYA DEGREE()

Le paramètre DEGREE qui autorisait déja le parallèlisme d'E/S,
admet maintenant *MAX et *OPTIMIZE qui permettent de répartir la
requête sur plusieurs processeurs.

L'option 27 de l'OS/400 (toujours facturable)

"DB2 Multi System for OS/400"

permet elle de répartir un fichier sur plusieurs machines
le principe est le suivant :

création d'un nouvel objet *NODGRP

CRTNODGRP NODGRP(basemulti) RDB(S441234 S445678)
(s44s1234 et s445678 sont les noms DRDA attribués par ADDRDBDIRE)

puis

CRTPF FILE(clientp1) SRCFILE(QDDSSRC) NODGRP(basemulti) PTNKEY(NOCLI)

11/ Sécurité (V4R20):

  • Sécurité (droits) à la colonne :
 Grant Select, :
    update(notel, adr1, adr2) :
    on table personp1 :
 to pdupont; :
 

ici on accorde le droit de lecture (toutes colonnes)
et le droit de modifier les colonnes N° de tel et adresses
à PDupont.

les commandes DSPOBJAUT et EDTOBJAUT montrerons les autorisations
de niveau zone, mais ne permetterons pas la modification.
les droits seront vérifiés aussi bien en SQL qu'en RPG/COBOL

  • remote journaling
Il est possible de déclarer un récepteur de journal DISTANT facilitant ainsi les solutions de BACKUP et de réplication

12/ V4R30:

- 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


- 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 )

supprimer les commandes quand la clause SELECT ne trouve
             pas de ligne (NOT EXISTS)
             ayant le n° de client lu dans le fichier client (C.nocli)

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

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

mettre à jour le fichier command, mettre dans priha la valeur retournée    par la clause select qui dit
      (je vais chercher le pritarif dans le fichier article,            de la ligne ayant le code article lu dans le fichier commande )

 

- Les nouveaux Index EVI (Encoded Vector Index)

 

13/ V4R40:

- tables dérivées :


  on peut indiquer un ordre SELECT dans la clause from d'un ordre SELECT
     ou bien déclarer juste avant le SELECT une "vue temporaire" par WITH.

exemple , soit un fichier des cours, chaque cours est enregistré sous  un module de cours.

 je veux le nombre de cours du module qui en a le plus.

with  temp as                                                       (select count(*) as nbr from Fmodules group by codmodul)                                                                         select max(nbr)                from temp            

 

 - deux nouveaux types de données apparaissent en V4R40 (ptf SF99104)
    les types de données LARGES (jusqu'à 15 Mo)
    les DATALINK (ou URL)

 

a/ les LOB (Large Object)

   ils sont de trois sortes
     + CLOB Chararcter Large Object, supportent la notion de CCSID
     + DBCLOB Double Byte CLOB, idem CLOB mais en DBCS
     + BLOB Binary Large Object, binaires, donc prévus pour les images                                                             la video, etc...
     ex: CREATE TABLE VOITURE (image as BLOB 2M)

 

b/ les types de colonne DATA LINK
  

il s'agit de colonnes dont le contenu référence un fichier externe.
     a/ le nom du fichier est donné sous forme d'URL
     b/ le fichier reste à l'exterieur de la base de données  (utilisable par votre serveur WEB, par exemple)
     c/ le serveur Base de données peut vous fournir un contrôle  de type:                      - je vérifie que le fichier existe lors de l'insertion
                     - je vérifie la présence du fichier tant qu'il est  référencé dans la base.

  vous devez lancer un serveur TCP/IP appelé DLFM       
 (DATA LINK FILE MANAGER), pour gérer ces contrôles temps réel.

 

 

ET ENFIN, orientation objets (toujours la group-ptf SF99104)

  • les fonctions définies par l'utilisateur        [UDF]
  • les types de données définies par l'utilisateur [UDT]

    une fonction est un programme ou une procédure dans un programme de service  enregistré(e) dans les catalogues SQL par CREATE FUNCTION.
     par exemple :

 

    CREATE FUNCTION AF4TEST/DT8_CHAR8 (DEC(8 , 0) )   
                            RETURNS  CHAR(8)
         
  EXTERNAL NAME 'AF4TEST/DT_SQL(DT8_CHAR8)'     (1)
 
   PARAMETER STYLE GENERAL                      (2)
     
   RETURNS NULL ON NULL INPUT  ;                (3)

 

(1) fait référence à DT8_CHAR8 dans DT_SQL (2) le passage de paramètres se fait sans gestion de la val. nulle (3) la fonction retourne nul si un des argument est nul      (il n'y aura pas d'appel)

Vous pouvez aussi créer des fonctions à l'aide du PL/SQL à condition d'avoir le compilateur C avant la V5.

 

Et pour terminer les types de données définis par l'utilisateur

 ils sont créés par :
     CREATE DISTINCT TYPE IMAGE AS BLOB(512K)
     CREATE DISTINCT TYPE EUROS AS DECIMAL(9, 2)
     CREATE DISTINCT TYPE FRANCS AS DECIMAL(9, 2)

 

vous pouvez maintenant créer une table par

     CREATE TABLE VOITURES
            (CODE CHAR(10) NOT NULL PRIMARY KEY,
             PRIXf FRANCS NOT NULL, PRIXe EUROS,
             PHOTO IMAGE)

la particularité de ces types est qu'ils sont fortement typés 
    c'est à dire que l'on ne PEUT PAS COMPARER DES FRANCS et DES EUROS.

   WHERE PRIXF > PRIXE   est syntaxiquement invalide !!!
   WHERE PRIXF > 10000 aussi !

seules des FONCTIONS supportant ces types sont habilitées à les manipuler.
 on parle alors de SGBDR-OO (ou orienté objet)

le système assure une conversion avec le type d'origine, (CAST ou le nom du type) ,
 WHERE PRIXE > EUROS(10000) est admis.

 

ici, le plus simple serait donc d'écrire deux fonctions

une fonction de convertion francs/euros
une fonction de convertion euros/francs

 create function af4test/franc_euros (VALEUR FRANCS) returns EUROS
 LANGUAGE SQL RETURNS NULL ON NULL INPUT STATIC DISPATCH          
        
 BEGIN  DECLARE VALEUROS DECIMAL ( 9 , 2 ) ;
   SET VALEUROS = CAST(VALEUR as decimal(9,2) ) / 6.55957;
   RETURN CAST(VALEUROS as euros);
   END;
  

14/ V5R10:

  • triggers, procédures cataloguées et fonctions peuvent être écrits en PL/SQL sans autre produit que 5722ST1.

  • triggers :
    • 300 triggers par fichier.
    • gestion des triggers (état *ENABLED / *DISBALED).
    • trigger à la colonne (le pgm n'est lancé que si CETTE ZONE est modifiée).
    • Condition complexe à l'exécution d'un trigger (clause WHEN ayant le même syntaxe qu'un WHERE).

       -- EXEMPLES DE TRIGGER 
       -- 
       -- SI PRXACTUEL < PRIX (D'ACHAT) LORS D'UNE MISE A JOUR 
       -- IL PREND LA VALEUR DE PRIX. 
       -- 
       CREATE TRIGGER MAJ_PRIX BEFORE UPDATE OF CAV_PRXACTUEL 
               ON BDVIN/CAVE 
               REFERENCING NEW ROW AS NOUVEAU 
               FOR EACH ROW MODE DB2ROW 
                     
               BEGIN 
                     
                     IF NOUVEAU.CAV_PRXACTUEL < NOUVEAU.CAV_PRIX THEN 
                       SET NOUVEAU.CAV_PRXACTUEL = NOUVEAU.CAV_PRIX ; 
                     END IF; 
                     
               END ; 
                   

  • Select admis dans la liste des colonnes
    • Select codart , qte * prix as montant, (select sum(qte * prix) from                                          commandes c2 where c2.famcod =                                          c1.famcod) / (c1.QTE * c1.prix)
           from commandes c1

  • FETCH FIRST x ROWS ONLY 

15/ V5R20: (nouvelle version disponible en Août 2002)

  • Plusieurs instances de DB2 pourraient tourner en parallèle.

  • même le produit 5722ST1 ne serait plus obligatoire pour créer triggers et fonctions en PL/SQL.

  • DEBUG possible au niveau SQL, pour les triggers, les fonctions et procédures écrits en PL/SQL

  • type de données "clé", automatiquement incrémenté par DB2.
    (pour un numérotation automatique des codes (clients/ commandes, etc...)

  • UNION, enfin accepté dans les vues SQL
        si un enregistrement peut se trouver soit dans un fichier (pointage) , 
    soit dans un autre (absences), il est possible de demander :
    SELECT nopers, nom, 'Présent : (' concat digists(nbheures) concat ') Heures' as presence from person P join pointage H on p.nopers = H.nopers UNION SELECT nopers, nom, motif from person P join absences A on P.nopers = A.nopers ce select peut maintenant être mémorisé dans une vue.(create view SQL)
  • LIKE admis au niveau zone dans le CREATE TABLE

  • nouveau gestionnaire de transaction
    • meilleure compatibilité avec JDBC et la notion de thread en général.
    • supervision des transactions sous Operation Navigator

  • améliorations pour SMAPP et la fonction journal.

13/ enfin , au fur et à mesure des versions, la possibilité d'avoir une administration graphique de la base de données via
Operation Navigator

permettant

  • une mise à jour directe des tables (si journalisées)
  • lancement et mémorisation de scripts SQL depuis le PC(même sans le produit 5722ST1)
  • Intégrant bien sûr, les toutes dernières nouveautés DB2/400:


 

Copyright © 1995,2002 VOLUBIS