pause-café
rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
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
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