pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #64
Quelques nouveautés Début 2013
Nouveautés SQL
SF99701, level 21
• Nouvelle fonction SQL_CHECK_AUTHORITY , permettant de vérifier les droits de l'utilisateur en cours sur une table
• Nouvelles procédures de comparaison de deux machines :
IBM fournit deux procédures dans SYSTOOLS utilisant le nommage en trois parties (serveur.schema.table)
- CHECK_SYSCST
Permettant de faire la liste des différences entre deux machines, pour une bibliothèque donnée, en ce qui concerne les contraintes
( le profil utilisant cette procédure doit pouvoir se connecter automatiquement (ADDSVRAUTE) )
- CHECK_SYSROUTINE
Permettant de faire la liste des différences entre deux machines, pour une bibliothèque donnée, en ce qui concerne les procédures enregistrées
Ces routines (dans SYSTOOLS) sont fournies à titre d'exemple et peuvent être modifiées
• Attention la PTF SF99701 level 22 est déclarée en erreur, ne l'installez pas, installez le level 23 à la place ou la SI49730
• La commande RGZPFM a été modifiée afin d'autoriser un critère de reprise
Nouveau Paramètre FROMRCD
- *START , comme aujourd'hui
- *PRVRGZ, repart de la dernière réorganisation incomplète
(cas d'ajouts de lignes pendant le RGZPFM)
==> ALWCANCEL(*YES)- un-chiffre, permet de démarrer la réorganisation à une ligne donnée
• Au même niveau, la création d'objets avec des noms longs admet maintenant
FOR SYSTEM NAME permettant d'indiquer un nom système (avant il fallait renommer)
• La création de triggers SQL admet plusieurs événements
CREATE TRIGGER PERSOTRGAFTER INSERT OR DELETE OR UPDATE OF SALAIRE ON PERSONP1
REFERENCING NEW AS N OLD AS O FOR EACH ROW
BEGIN
IF INSERTING
THEN UPDATE COMPANY_STATS SET NBREMP = NBREMP + 1;
END IF;
IF DELETING
THEN UPDATE COMPANY_STATS SET NBREMP = NBREMP - 1;
END IF;
IF UPDATING AND (N.SALAIRE > 1.1 * O.SALAIRE)
THEN SIGNAL SQLSTATE '75000'
SET MESSAGE_TEXT = 'Salaire augmenté de plus de 10%'
END IF;
END
• Structure de la table SYSIXADV suite à ce correctif :
nom de la colonne (zone) | nom système | Type de donnée | Description |
TABLE_NAME | TBNAME | VARCHAR(258) | Table sur laquelle l'index est suggéré |
TABLE_SCHEMA | DBNAME | CHAR(128) | Schéma de la table |
SYSTEM_TABLE_NAME | SYS_TNAME | CHAR(10) | nom système (court) de la table |
PARTITION_NAME | TBMEMBER | CHAR(10) | Partition |
KEY_COLUMNS_ADVISED | KEYSADV | VARCHAR(16000) | nom des clés suggérées |
LEADING_COLUMN_KEYS | LEADKEYS | VARCHAR(16000) | clé principale, dont le critère de tri (croissant/décroissant) n'importe pas. |
INDEX_TYPE | INDEX_TYPE | CHAR(14) | type d'index (normal ou EVI) |
LAST_ADVISED | LASTADV | TIMESTAMP | date/heure de suggestion |
TIMES_ADVISED | TIMESADV | BIGINT | nombre de fois la suggestion a été faite |
ESTIMATED_CREATION_TIME | ESTTIME | INT | nombre de secondes(estimées) pour la création |
REASON_ADVISED | REASON | CHAR(2) | Code raison (Sélection / tri ou groupage / les deux) |
LOGICAL_PAGE_SIZE | PAGESIZE | INT | taille des pages recommandée |
MOST_EXPENSIVE_QUERY | QUERYCOST | INT | temps d'exécution le plus long |
AVERAGE_QUERY_ESTIMATE | QUERYEST | INT | temps d'exécution moyen |
TABLE_SIZE | TABLE_SIZE | BIGINT | nombre de lignes dans la table (lors de la suggestion) |
NLSS_TABLE_NAME | NLSSNAME | CHAR(10) | Séquence de tri à utiliser |
NLSS_TABLE_SCHEMA | NLSSDBNAME | CHAR(10) | Bibliothèque de la séquence de tri |
MTI_USED | MTIUSED | BIGINT | Nombre
de fois ou cet MTI a été utilisé (le système n'utilise plus un MTI, dès qu'un index permanent existe) |
MTI_CREATED | MTICREATED | INT | Nombre
de fois ou cet MTI a été créé (rappel un index MTI disparaît à l'IPL) |
LAST_MTI_USED | LASTMTIUSE | TIMESTAMP | Date/heure de dernière utilisation de cet index MTI. |
AVERAGE_QUERY_ESTIMATE _MICRO | QRYMICRO | BIGINT | temps moyen d'exécution de la requête à l'origine de cette suggestion |
EVI_DISTINCT_VALUES | EVIVALS | INTEGER | Nombre de valeurs distinctes pour création index EVI |
INCLUDE_COLUMNS | INCLCOL | CLOB(10000) | INCLUDE pour création index EVI |
FIRST_ADVISED | FIRSTADV | TIMESTAMP | Première suggestion |
SYSTEM_TABLE_SCHEMA | SYS_DNAME | CHAR(10) | Nom système de la bibliothèque |
MTI_USED_FOR_STATS + | MTISTATS | BIGINT | Nbr de fois, Index MTI utilisé pour des statistiques |
LAST_MTI_USED_FOR_STATS * | LASTMTISTA | TIMESTAMP | dernière utilisation Index MTI pour des statistiques |
DEPENDENT_ADVICE_COUNT ** | DEPCNT | CHAR(10) | Nombre de dépendances d'index (traitement de OR) |
* SF99701, level 14 : les index MTI peuvent être utilisés pour collecter des performances
** SF99701, level 23 : les index proposés sont liés et utilisables par la même requête contenant des OR
si cette zone est différente de 0.
Exemple :
select * from vins where vin_cepage1 = 'Cabernet' or vin_cepage2 = 'Cabernet' or vin_cepage3 = 'Cabernet' Contenu de SYSIXADV
INDEX_TYPE DEPENDENT_ADVICE_COUNT KEY_COLUMNS_ADVISED
----------- --------------------- -------------------
RADIX 1 VIN_CEPAGE1
RADIX 1 VIN_CEPAGE3
RADIX 1 VIN_CEPAGE2
Enfin la PTF SF99701, level 23 apporte de nouvelles fonctions orientées web services
httpGetBlobhttpGetClobhttpPutBlobhttpPutClobhttpPostBlobhttpPostClobhttpDeleteBlobhttpDeleteClobhttpBlobhttpClobhttpHead- UrlEncode
UrlDecode
base64Encode
base64Decode
le but de ces fonctions est de consommer des services web plutôt orientés RESTful
Regardons à travers des exemplesValues SYSTOOLS.HTTPGETCLOB('http://www.volubis.fr' ,'') ;
Récupère dans une variable le contenu de notre page d'accueil
Le premier paramètre est de type VARCHAR(2048) et représente une URL
Le deuxième paramètre est de type CLOB(10K) et représente l'entête http
- vide ( '' ) , aucune entête n'est transmise
- une chaîne représentant l'entête HTTP, sous la forme
<httpHeader [options]>
<header name="entete" value="valeur" />
</httpHeader>
options possibles
- ConnectionTimeout = millisecondes
- readTimeout = millisecondes
- followRedirects = true|false (suivre les redirections en cas de status 3xx)
- useCaches = true|false (utiliser le cache, voir paramètres de la JVM)
- Voir les entêtes possible http://en.wikipedia.org/wiki/List_of_HTTP_header_fields
La valeur retour est la réponse fournie par le serveur (ce que vous aurait affiché votre navigateur)
Si le site retourne du XML, l'utilisation de la fonction XMLTABLE permettra de ne recevoir que les données utiles
Ici, le site www.redbooks.ibm.com propose des flux RSS donnant les publications récentes
le codeSELECT * FROM XMLTABLE('$result/rss/channel/item' PASSING XMLPARSE( DOCUMENT SYSTOOLS.HTTPGETBLOB('http://www.redbooks.ibm.com/rss/iseries.xml','') ) as "result" COLUMNS title VARCHAR(128) PATH 'title', description VARCHAR(1024) PATH 'description', link VARCHAR(255) PATH 'link', pubDate VARCHAR(20) PATH 'substring(pubDate, 1, 16)' ) AS RESULT;permet de lire les données de manière structurée :
Ce code permet de lire le fichier cours.xml , s'il est disponible via HTTP
SELECT cours, texte, motcle1, monthname(modif) concat '-' concat year(modif) FROM XMLTABLE('$result/AF400/COURS' PASSING XMLPARSE( DOCUMENT SYSTOOLS.HTTPGETBLOB('http://as400.volubis.intra/af4dir/courshtm/XML/cours.xml','') ) as "result" COLUMNS cours CHAR(10) PATH 'AF4MBR', texte CHAR(50) PATH 'AF4TXT', motcle1 VARCHAR(20) PATH 'MOTCL1', MODIF DATE PATH 'DATOUT' ) AS TABLEXML;
Ce code permet de le lire via HTTP, la page étant protégée par un mot de passe
-- LECTURE fichier XML via INTERNET avec authentification
SELECT cours, texte, motcle1, monthname(modif) concat '-' concat year(modif)
FROM XMLTABLE('$result/AF400/COURS'
PASSING XMLPARSE(
DOCUMENT
SYSTOOLS.HTTPGETBLOB('http://af400:motdepasse@as400.volubis.fr/af4dir/courshtm/XML/cours.xml','')
) as "result"
COLUMNS
cours CHAR(10) PATH 'AF4MBR',
texte CHAR(50) PATH 'AF4TXT',
motcle1 VARCHAR(20) PATH 'MOTCL1',
MODIF DATE PATH 'DATOUT'
) AS TABLEXML;
Vous pouvez aussi passer l'authentification dans les entêtes :
- Profil et mot de passe séparés par ":" (comme dans notre exemple) en UTF-8
- puis encodé en Base64 (voir la fonction base64ENCODE)
- enfin précédé du mot "basic"
<header name="Authorization" value="Basic bmljazpwYXNzdzByZA=="/>Appel d'un Web services, utilisation du deuxième paramètre permettant de fournir les entêtes http (ici, nous demandons la valeur de l'action IBM à aujourd'hui dans une enveloppe SOAP)
-- Appel d'un web service , récupération de l'enveloppe SOAP réponse dans une variable
VALUES SYSTOOLS.HTTPPOSTCLOB('http://www.webservicex.net//stockquote.asmx',
CAST ('<httpHeader>
<header name="Content-Type" value="text/xml;charset=utf-8"/>
<header name="SOAPAction" value=""http://www.webserviceX.NET/GetQuote""/>
</httpHeader>' AS CLOB(1K)),
CAST('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetQuote xmlns="http://www.webserviceX.NET/">
<symbol>IBM</symbol>
</GetQuote>
</soap:Body>
</soap:Envelope>' AS CLOB(10K)) ) ;-- Appel d'un web service , récupération de l'enveloppe SOAP, "parsée" -- il y a des espaces de nommage (xmlns) SOAP et d'autres propres au web service, d'où -> *:
-- les données extraites sont elles mêmes au format XML (on voit que l'action est à 210 $ 55 ) SELECT* FROM XMLTABLE('$result/*:Envelope/*:Body/*:GetQuoteResponse' PASSING XMLPARSE( DOCUMENT SYSTOOLS.HTTPPOSTCLOB('http://www.webservicex.net//stockquote.asmx', CAST ('<httpHeader> <header name="Content-Type" value="text/xml;charset=utf-8"/> <header name="SOAPAction" value=""http://www.webserviceX.NET/GetQuote""/> </httpHeader>' AS CLOB(1K)), CAST('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetQuote xmlns="http://www.webserviceX.NET/"> <symbol>IBM</symbol> </GetQuote> </soap:Body> </soap:Envelope>' AS CLOB(10K)) ) ) as "result" COLUMNS resultat VARCHAR(2000) PATH '*:GetQuoteResult' ) AS TABLEXML;-- Appel d'un web service , récupération de l'enveloppe SOAP, "parsée" pour lire le montant de l'action -- puis découpage du XML extrait à nouveau par la fonction XMLTABLE WITH temp as (SELECT resultat FROM XMLTABLE('$result/*:Envelope/*:Body/*:GetQuoteResponse' PASSING XMLPARSE( DOCUMENT SYSTOOLS.HTTPPOSTCLOB('http://www.webservicex.net//stockquote.asmx', CAST ('<httpHeader> <header name="Content-Type" value="text/xml;charset=utf-8"/> <header name="SOAPAction" value=""http://www.webserviceX.NET/GetQuote""/> </httpHeader>' AS CLOB(1K)), CAST('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetQuote xmlns="http://www.webserviceX.NET/"> <symbol>IBM</symbol> </GetQuote> </soap:Body> </soap:Envelope>' AS CLOB(10K)) ) ) as "result" COLUMNS resultat VARCHAR(2000) PATH '*:GetQuoteResult' ) AS TABLEXML )select * from temp, XMLTABLE ('$c/StockQuotes/Stock' passing XMLPARSE(DOCUMENT RESULTAT) as "c" COLUMNS symbol CHAR(30) PATH 'Symbol', prix dec(11, 2 ) PATH 'Last' ) AS X ;Les mails GMAIL sont accessibles depuis un navigateur (c'est même un peu le principe de base)
Mais aussi en web service REST :-- lecture de mes mails chez google, penser à changer le mot de passe -;)SELECT * FROM XMLTABLE('$result/*[local-name()=''feed'']/*[local-name()=''entry'']' PASSING XMLPARSE(DOCUMENT systools.HTTPGETBLOB('https://af400Volubis:motdepasse@gmail.google.com/mail/feed/atom/','')) AS "result" COLUMNS title VARCHAR(128) PATH '*[local-name()=''title'']', summary VARCHAR(1024) PATH '*[local-name()=''summary'']', author_name VARCHAR(255) PATH '*[local-name()=''author'']/*[local-name()=''name'']', author_email VARCHAR(255) PATH '*[local-name()=''author'']/*[local-name()=''email'']' ) AS RESULT;
-> Remarquez la fonction XPATH [local-name()= ] permettant de recherche un élément quelque soit sa localisation dans l'arborescence
- URLENCODE permet de coder une chaîne au format compatible URL
(le deuxième caractère, optionnel est un code page)
- URLDECODE fait le contraire
- base64ENCODE encode une donnée en base 64
- bien sûr base64DECODE fait le contraire
- Les fonction HTTP ont leur équivalent en mode VERBOSE, ce sont alors des fonctions table, retournant :
- le message (comme la fonction simple)
- l'entête
httpGetBlobVerbosehttpGetClobVerbosehttpPutBlobVerbosehttpPutClobVerbosehttpPostBlobVerbosehttpPostClobVerbosehttpDeleteBlobVerbosehttpDeleteClobVerbosehttpBlobVerbosehttpClobVerbosehttpHeadVerbose
Vous pouvez mettre des options à java, en créant un fichier d'options
-Xmx Mémoire pour java (par exemple -Xmx2g -> 2 Go) http.proxyHost Coordonnées du Proxy http.proxyPort port du proxy (80 par défaut) http.proxyUser Utilisateur pour proxy http.proxyPassword Mot de passe pour proxy http.nonProxyHosts Liste des serveurs pour lesquels ne pas utiliser le proxy javax.net.ssl.trustStore emplacement du fichier contenant la liste des certificats des sites de confiance javax.net.ssl.trustStorePassword mot de passe pour ouvrir le fichier trustStore javax.net.ssl.keyStore emplacement du fichier contenant la liste des certificats et des clés privées (keystore) javax.net.ssl.keyStorePassword mot de passe pour ouvrir le fichier keyStore
Le fichier de propriétés java peut être indiqué comme suit
- en créant une variable d'environnement indiquant sa localisation
ADDENVVAR ENVVAR(QIBM_JAVA_PROPERTIES_FILE)
VALUE(/QIBM/userdata/java400/mySystem.properties)- en créant un fichier SystemDefault.properties dans la home directory de l'utilisateur
- en créant un fichier SystemDefault.properties dans /QIBM/userdata/java400/
Attention
Toutes ces fonctions sont livrées dans SYSTOOLS, donc "as is' et ne peuvent faire l'objet d'une demande de support
XMLSERVICE
- Un web-service : c'est un logiciel qui interagis avec d'autres au moyen de protocoles universels (http, xml...)
-
Il existe deux types de services WEB
-
Les services dits WS, utilisant de nouveaux protocoles :
Il existe deux formes de services-web WS : SOAP et XML-RPC. SOAP est orienté objet et gère les états tandis que XML-RPC est procédural et sans gestion des états.
Les services web présentent les 2 caractéristiques suivantes :
enregistrement facultatif auprès d'un service de recherche (UDDI)
interface publique avec laquelle le client invoque le service (WSDL)
UDDI : Universal Desciption, Discovery and Integration peut être vu comme les pages blanches (ou jaunes) des services-web. C'est un annuaire permettant à des fournisseurs de présenter leurs services à des 'clients'.
WSDL : Web Service Description Language est un langage reposant sur XML dont on se sert pour décrire les services-web. Il est indispensable à UDDI pour permettre aux clients de trouver les méthodes leur permettant d'invoquer les services web. Beaucoup d'outils comme JBuilder, Delphi ou Office se servent de WSDL pour découvrir et générer les mécanismes d'invocation des services-web.
SOAP : Simple Object Access Protocol est un protocole basé sur XML et qui définit les mécanismes d'échanges d'information entre les clients et les fournisseurs de service-web. Les messages SOAP sont susceptibles d'être transportés en HTTP, SMTP, FTP...(souvent HTTP)
XML-RPC : protocole RPC (Remote Procedure Call) basé sur XML. Permet donc l'invocation de procédure distante sur internet.
Les services REST, utilisant uniquement des méthodes standard du WWW
- Accès par URI (comme une URL)
- HTTP comme méthode d'appel (GET, POST , PUT et DELETE)
- Retour de la donnée dans un format normalisé comme HTML, XML, ...
- il sont dit stateless, c'est à dire qu'ils fonctionnent comme le web classique, ils ne se souviennent de rien, tout paramètre doit être retransmis.
Exemple d'implémentation de services RESTful : projet XMLSERVICE
Ce projet qui était à l'origine en Opensource a été intégré à l'IBM i en V7 / TR5 par le biais de la bibliothèque QXMLSERV
Modification de la configuration ApacheScriptAlias /cgi-bin/ /QSYS.LIB/QXMLSERV.LIB/ <Directory /QSYS.LIB/QXMLSERV.LIB/> AllowOverride None order allow,deny allow from all SetHandler cgi-script Options +ExecCGI </Directory>
L'API s'utilise de la manière suivante
- db2 : nom de la base de donnée (*LOCAL pour travailler sur la même machine)
- uid : profil de connexion
- pwd : mot de passe
- ipc : répertoire dans lequel placer les informations de session
- ctl : Action
- *SBMJOB -> soumettre l'action (mode de fonctionnement "normal")
- *IMMED -> arrêt immédiat du service
- *DEBUG -> message dans QSYSOPR
- ... Voir la liste complète
- xmlin : document xml transmis (requête)
<?xml version='1.0' ?>
<script>
<keyword>voir les paramètres possibles</keyword>
</script> - xmlout : document réponse
Les mot-clés transmis peuvent être
<cmd>...commande 5250...</cmd>
<cmd>...commande PASE...</cmd>
<pgm name='PGM' lib='BIB' func='Fonction'>
<parm><data type='12P2'>...paramètre simple...</data></parm>
<parm><ds dim='xx'><data type='200A'>...paramètre complexe...</data></ds></parm>
<return><ds dim='xx'><data type='32A'>...paramètre retour...</data></ds></return>
</pgm><sql>
<query>select * from vins</query>
<fetch block='all|un chiffre' desc='on|off'/>
</sql>
Utilisation
Lancement d'un commande
Résultat
Lancement d'une commande PASE
Résultat
Lancement d'un ordre SQL
Résultat
Les nouvelles fonctions, HTTPPOSTCLOB , HTTPPOSTCLOBVerbose permetterons de les utiliser en SQL
Système Optique
- Bibliothèques optiques (souvent externes, matériel assez cher, voyez http://www-03.ibm.com/systems/power/software/i/management/storage/optical.html)
- Lecteur DVD intégré (Voyez ce lien pour la liste du matériel compatible)
- DVD en lecture
- DVD-ROM (réinscriptible)
- DVD-RAM (réinscriptible à la volée)
- WORM (archives)
- Unités RMS (Removable Média Storage)
- Unité de sauvegarde externes RDX
- Flash Drive (clé USB jusqu'à 32 Go, avec la TR6)
Pour les DVD, Seuls les formats DVD-RAM (4,7 G ou 9,4/double face) peuvent être des supports de sauvegarde à la volée
La doc leur donne ces caractéristiques
o Prise en charge d'opérations multiples de lecture et d'écriture.o Réutilisation de l'espace correspondant aux fichiers supprimés lors de la création de nouveaux fichiers ou de
l'extension d'un fichier existant.o Conservation des données préalablement sauvegardées lors de la réinitialisation du support, sauf demande explicite.
En effet Le DVD-RAM est un disque réinscriptible, il peut supporter jusqu'à 100.000 cycles d'écriture / réécriture.
A titre d'informations et de comparaisons, les DVD-RW et DVD+RW supportent eux 1.000 cycles d'écriture / réécriture.
Pour les DVD-ROM(RW) , il faudra donc passer par la commande DUPOPT (comme vu à la Pause-Café 61)Comment s'en servir ?
Vous Devez passer par une unité optique virtuelle
CRTDEVOPT DEVD(OPTVRT01) RSRCNAME(*VRT)pensez à mettre l'unité VARY ON par wrkcfgsts *dev optvrt01
Ensuite, créez un catalogue d'images
CRTIMGCLG IMGCLG(OPTVIR) DIR('/optvir') CRTDIR(*YES)
ADDIMGCLGE IMGCLG(OPTVIR) FROMFILE(*NEW) TOFILE(nom-de-fichier) IMGSIZ(*DVD4700)
LODIMGCLG IMGCLG(OPTVIR) DEV(OPTVRT01) VFYIMGCLG IMGCLG(OPTVIR) TYPE(*OTHER) SORT(*NO)Sauvegardez sur ce catalogue
INZOPT NEWVOL(VOLUMENAME) DEV(OPTVRT01) TEXT('volume pour xxx')
SAV DEV('/qsys.lib/optvrt01.devd') OBJ(('/xxx/*' *INCLUDE)) /* par exemple */Enfin, dupliquez vers le volume physique (c'est la seule action possible)
DUPOPT FROMVOL(*MOUNTED) TOVOL(*MOUNTED) NEWVOL(*FROMVOL)
FROMDEV(OPTVRT01) TODEV(OPT01) TOENDOPT(*UNLOAD)
Avec un DVD-RAM une fois l'initialisation faite (format UDF)
(Pour les DVD-RAM double face, il faut initialiser chaque face)
Après l'insertion d'un DVD-RAM vierge de marque Verbatim
Option 10 : Initialiser
==>
L'option 4, permet d'éjecter le DVD
Nous pouvons utiliser les commandes de sauvegarde :
• SAVLIB LIB(FORMATION) DEV(OPT01)
Mais nous pouvons aussi faire des copies :
• MKDIR DIR('/QOPT/DVDRAM47/Volubis')
• CPY OBJ('/volubis/*') TODIR('/QOPT/DVDRAM47/Volubis') SUBTREE(*ALL)
Attention les temps de réponses sont assez longs (1h30 pour 1580 objets et un volume de 380 Mo, notre DVD-RAM est en 3X seulement)
La PTF Technology Refresh 6 permet d'utiliser les clés USB jusqu'à 32 Go, qui vont apparaitre sous l'unité RMS01(créé automatiquement)
Cette fonction n'est proposée que sur un Power 7 (ou 7+) et n'est pas compatible avec VIOS à ce jour.
L'unité est de type 63BC (elle est partagée entre partitions "hostées", tout comme le lecteur DVD)
Vous devez voir alloué à cette partition le contrôleur USB
Qui, si nous regardons le détail, correspond aux trois ports UBS (2 à l'arrière, 1 en facade)
Si nous insérons une deuxième clé USB à l'arrière de notre 720
La clé apparaît aussi via WRKLNK dans /QOPT (elles font parties du système optique de l'IBM i)
elles doivent être formatées au format UDF (reconnu par Windows Seven)elles doivent être enlevées logiquement, avant d'être enlevées physiquement
- (RMVOPTVOL -> WRKOPTVOL/option 4)
- ou bien VRYCFG STATUS(*OFF)
Une clé USB accepte tout type de sauvegarde même un SAVSYS et peut être la source d'un IPL/D
passons l'option 3 pour vérifier :
Copyright © 1995,2013 VOLUBIS