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