pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #45
Associé à MySQL, le langage PHP permet de développer des applications web puissantes en réutilisant des produits standards, souvent en mode "open source"
Novembre 2007, Zend annonce (en béta) Neon, successeur de Zend
Studio, ,
basé sur Eclipse 3
- cela amène un éditeur PHP comparable à Zend Studio, dans Eclipse (donc bientôt
WDS client)
- mais aussi un éditeur HTML, WYSIWYG
Les vues traditionnelles d'Eclipse, étant utilisées au mieux- Vue Outline (structure)
- Vue propriétés
- Vue Outline (structure)
Pour installer MYSQL, voyez http://www.zend.com/forums/index.php?t=msg&goto=9216&S=2a88332173cb39a2ac482b1e88c526b8
en un mot :
- Téléchargez la version AIX-64 Bits compatible OS/400 à restaurez (untar) les fichiers
- créez un utilisateur (MYSQL) et donnez lui tous les droits sur le répertoire
/QOpenSys/usr/local/var/mysqlxxx/data
- lancez le script mysql_install_db
- lancez MYSQL par /QOpenSys/usr/local/var/mysqlxxx/bin/mysqld_safe
- vous pourrez utiliser MYSQL en mode commande :
Mais vous pouvez aussi, (surtout) maintenant,
utiliser des produits écrits en php et utilisant mysql
PHPMyAdmin
ou
Mediawiki
Ansi que Joomla, sugarCRM, phpNuke, etc...
Petit nouveau dans cette liste : Mantis, produit de gestion et de suivi de bugs et d'incidents, en équipe,
pour lequel on vous propose une version spécifiquement System i , utilisant
DB2 sur mantis400.com
Téléchargez l'image ISO du CD et lancez LODRUN OPTxx sur une
session 5250, confirmez la licence (Open source),
le produit est installé dans www/zendcore/htdocs/mantis400
depuis votre navigateur, tapez http://votre-as400:89/mantis400/, la page suivante doit vous être affichée :
Saisissez les données suivantes
où :
- AS400 est le nom de votre base de données (enregistré oar WRKRDBDIRE),
- AS400/MANTIS le nom de la base suivi de la biblliothèque à créé
- MANTIS est le nom d'un utilisateur valide.
SI tout ce passe bien, vous devez voir :
LA bibliothèque MANTIS a été créé, renseignez
le fichier config_inc.php comme indiqué ici, puis loggez vous administrator/root
la première chose à faire est de cliquer sur "manage", afin de créer un autre administateur, puis un premier projet.
RPG-IV, presque 5
Quelques règles simples que nous vous proposons d'instaurer
autour du RPG4 :
- déclarer vos compteurs etc.. comme des zones 5I 0 ou 10I 0, quand vous n'avez pas besoin de décimales
- déclarer vos variables relativement à la base de données
avec like (on peut faire montant LIKE(prix) et + 10 en longeur)
- Utilisez les DS qualifiées, c'est mieux que les DS à occurrences
et ca permet plein de choses :
- les DS dans les DS (la V6 apportera les DS "modèles" avec TEMPLATE)
- les DS de type tableau ou à dimensions (DIM directement sur la déclaration)
- les tableaux à double entrée (DS à dimension dans une DS à dimension)
- Utilisez vos propres indicateurs ou variables booléennes
- type N , lors de la déclaration
- associez votre structure de 99 booléens, avec les DSPF à la place des indicateurs avec
INDDS(votre-ds) en spécif F
FECRAN02 CF E WORKSTN INDDS(indic)
.../...
Dindic DS 99 D exit N overlay(indic:3) D sflclr N overlay(indic:30) D err_client N overlay(indic:51)
etc...
- Utiliser les fonctions intégrées du langage à chaque
fois que c'est possible :
- For i = 1 to %elem(tbl) // pour passer en revue tous les postes d'un tableau
- if %subst(nom : %size(nom) : 1) // pour tester le dernier caractère
pour mémoire voici la liste des fonctions
Fonction(x) |
Retourne |
Exemple |
%ADDR | l'adresse d'une variable | EVAL prt= %addr(data) |
%PADDR | l'adresse d'une procédure (pour CALLB) | |
%ELEM | donne le nombre d'occurrences d'un tableau ou d'une DS | if I < %elem(tbl_tva) |
%SUBST | extraction d'une chaine de caractère | if %subst(raisoc : 1 : 1) <> ' ' |
%SIZE | donne la longueur déclarée d'une variable | if %SUBST(nom : %size(nom): 1) = *blank |
%DECPOS | donne le nombre de décimales | |
%TRIM | élimination des espaces d'extrémité | eval NP = %trim(nom) + ' ' + %trim(prenom) |
%TRIML|%TRIMR | élimination des blancs de gauche/de droite | |
%PARMS | indique le nombre de paramètres recus | if %parms > 2 |
%ABS | valeur absolue | |
%DEC %DECH |
transforme une valeur numérique (char
en V5.2,date en V5.3) en numérique condensé ou packé. |
eval DATAMJ = %dec(DATCDE : *YMD) |
%INT %INTH |
transforme une valeur numérique (ou
caractère en 5.20)au format binaire signé |
|
%UNS %UNSH |
transforme une valeur numérique (ou
caractère ) au format binaire non signé |
|
%FLOAT |
transforme une valeur numérique (ou caractère) au format virgule flottante | |
%EDITFLT |
transforme de virgule flottante vers chaîne | |
%EDITC |
transforme du numérique en chaine avec
application d'un edit code |
eval msg = 'date de traitement' + |
%EDITW |
idem %EDITC mais avec un mot d'édition | |
%CHAR | transforme date ou numérique en chaîne | ZoneChar=%CHAR(ZoneDec) // 000123,45- ==> '-123,45' |
%STR | transforme une chaine RPG en chaîne compatible C (pointeur vers une chaine terminée par x'00' ) |
|
%LEN |
retourne la longueur d'une expression | if %len(%trim(nom)) > 2 eval L = %len(zone-variable) |
%SCAN |
recherche si présence d'une chaîne de caractères | eval chaine = 'ILE/RPG-IV' |
%REPLACE | remplace par une chaîne l'information située à la position indiquée | [var1 = 'AS/400'] |
%NULLIND |
test la val.nulle sur un champ base de données | IF %NULLIND(datcmd) = *ON |
%OPEN |
indique si un fichier est ouvert | if %open(clients) |
%EOF |
indique si l'on est fin de fichier | dow not %eof(clients) |
%ERROR |
indique si on est en erreur (à utiliser suite à un code avec (E).) |
if %error |
%STATUS |
indique le n° d'erreur (code status) | if %error and %status(clients) = 1252 |
%EQUAL |
indique un positionnement par égalité (SETLL) une recherche aboutie par égalité (LOOKUP) |
|
%FOUND |
indique un positionnement réalisé(SETLL,SETGT) un recherche aboutie (CHAIN) |
|
---- V4R40 ---- |
||
%GRAPH |
conversion en DBCS | |
%UCS2 |
conversion en UNICODE | |
%XFOOT |
somme d'un tableau | eval total = %xfoot(tb_salaire) + prime |
%DIV |
résultat de la division (entiers uniquement) | |
%REM |
reste de la division (entiers uniquement) | if %rem(an : 4 )= 0 |
---- V5R10 ---- |
||
%ALLOC | l'adresse d'un nouvel espace mémoire | EVAL prt= %alloc(nboctets) |
%CHECK | la position du premier caractère invalide | Eval pos = %check('0123456789.' : variable) |
%CHECKR | Idem %CHECK, mais en commencant à droite. | |
%DATE | convertit une variable (alpha ou dec) en date ou retourne la date du jour. | eval datcmd = %DATE(datchar : *YMD0)//(c'est un zéro) |
%DAYS | indique un nombre de jours | eval datliv = datcmd + %DAYS(15) |
%DIFF | exprime un écart entre deux dates ou heures | eval ecart = %DIFF(datliv : datcmd : *DAYS) |
%SUBDT | extrait une partie d'une date | eval annee = %SUBDT(datliv : *YEARS) |
%HOURS | exprime un nombre d'heures | eval demain = maintenant + %hours(18) |
%LOOKUP |
indique si un élément est présent dans un tableau | eval pos = %lookup('$' : monnaies) |
%MINUTES | exprime un nombre de minutes | voir %HOURS() |
%MONTHS | exprime un nombre de mois | voir %DAYS() |
%MSECONDS | exprime un nombre de microsecondes |
voir %HOURS |
%OCCUR | positionne sur une occurrence de DS |
%OCCUR(DS1) = 7 ou x = %occur(DS2) |
%REALLOC | Réalloue un espace mémoire plus grand |
voir %ALLOC |
%SECONDS |
exprime un nombre de secondes | voir %HOURS() |
%SHTDN |
indique si le système est en phase d'arrêt | if %SHTDN |
%TIME |
convertit une variable (alpha ou dec) en heure ou retourne l'heure en cours. | if %time(pointage : *HMS) = T'23:59:59' |
%TLOOKUP[xx] |
indique si un élément est présent dans une table GAP | voir %lookup |
%XLATE | transforme une variable apha | eval resultat = %XLATE('abcdef' : 'ABCDEF' : origine) |
%YEARS | exprime un nombre d'années | voir %DAYS |
---- V5R20 ---- |
||
%KDS | Utilisation d'une DS en tant que liste de clés sur un CHAIN. | CHAIN %KDS(dscli) clientf1; |
%FIELDS | Mise à jour d'une liste finie de zones lors d'un UPDATE . | Update clientf1 %FIELDS(nomcli : depcli : ville) ; |
%BITNOT | inverse les bits | %BITNOT(x'00') = x'FF' |
%BITOR | applique un OU logique bit à bit | %BITOR(x'F0' : x'0F') = x'FF' |
%BITAND | applique un ET logique bit à bit | %BITAND(x'F1' : x'1F') = x'11' |
%BITXOR | applique un OU exclusif bit à bit | %BITXOR(x'F1' : x'1F') = x'EE' [1110 1110) |
---- V5R30 ---- |
||
%SUBARR | une partie d'un tableau | resultat = %xfoot( %subarr(tbl : i : 5) )// 5 postes |
---- V5R40 ---- |
||
%XML | coordonnées des données XML à lire (cf XML-INTO) | xml-into DS1 %xml(data : 'doc=string') |
- Ecrivez en format libre (nous sommes en 2007 ! )
Quelques propositions pour remplacer les codes opérations qui ne
"passent" pas :
Code Opération |
Remplacement |
Exemple |
ADD | + | EVAL A = A +1 ou A = A+1 ou A+=1 |
ADDDUR | + | Datliv = datcmd + %DAYS(45) |
ALLOC | %alloc | |
ANDxx | (test en libre) | if A=B AND compteur<>0 |
CABxx | (à éviter) | |
CALL | CALLP + EXTPGM | CALLP pgmA (parm1 : parm2) |
CALLB | CALLP + EXTPROC | idem |
CASxx | IF + EXSR | |
CAT | + | Message = 'date de traitement' + DATCHAR |
CHECK | %check | pos = %check('0123456789-+,' : qtechar) |
CHECKR | %checkr | idem |
*LIKE DEFINE | déclaration en D avec LIKE( ) | |
*DTAARA DEFINE | déclaration en D avec DTAARA( ) | |
DIV | / | |
DO | FOR | FOR i = 1 to 50 |
DOUxx | DOU | Dou %eof |
DOWxx | DOW | Dow not %eof |
END | ENDxx (déja recommandé avant) | |
ENDCS | cf CAS | |
EXTRCT | %subdt | mois = %SUBDT(DATCMD : *M) |
GOTO | c'est quoi ? ;-) | |
IFxx | IF | if GAP = 4 |
KFLD | %KDS ou directement (K1 :K2) | CHAIN (societe: nocli) clientf1 |
KLIST | (cf ci-dessus) | |
LOOKUP | %lookup | tva = %lookup(code : tbtva) |
MOVE | EVALR , Convertir avec les fonction intégrées | datcmd = %DATE(datchar:*ISO) ou chaine = %char(datcmd) |
MOVEL | EVAL, idem pour les conversions | |
MOVEA | Pas d'équivalent |
|
MULT | * | |
MVR | %rem | if %rem(AN : 4) = 0 |
OCCUR | %occur | |
ORxx | cf ANDxx | |
PARM | Prototype en spécif D * | |
PLIST | cf PARM | |
REALLAOC | %realloac | |
SCAN | %scan | QUATRE = %scan('4' : 'RPG4') |
SETOFF | *inxx = *off | |
SETON | *inxx = *on | |
SUB | - | |
SUBDUR | - | HIER = AUJOURDHUI - %days(1) |
ou SUBDUR | %diff | UN = %DIFF(aujourdhui : hier) |
SUBST | %subst | |
TAG | cf GOTO | |
TESTN | %check | if %check('0123456789' : QTECHAR) > 0 |
TIME | %date() ou %time() | aujourdhui = %date() |
WHENxx | WHEN | |
XFOOT | %xfoot | TVA = %xfoot(tbmt) * TAUX |
XLATE | %xlate | GRAND = %xlate(minuscles: majuscules: PETIT) |
Z-ADD | EVAL | |
Z-SUB | EVAL - |
- Utilisez les prototypes, ca sera toujours ça de gagné pour ILE
* CALLP est apparu en V3R60 et permet un appel en format libre :
il faut pour cela déclarer le programme et ses paramètres, avant, en spécif D, cela s'appelle un PROTOTYPE.
+-----------------------------------------------------------+
! DEXEC PR EXTPGM('QCMDEXC') !
! D 250 const !
! D 15P 5 const !
+-----------------------------------------------------------+ PR indique qu'il s'agit d'un prototype (même positions que DS)
EXTPGM le nom du pgm externe (peut être qualifié)
CONST sur un paramètre indique que ce paramètre peut ne PAS être unevariable (constante, calcul, fonction intégrée, ...)
VALUE passage de paramètre par valeur (pas de valeur retour)
OPTIONS(*NOPASS) ce paramètre peut ne pas etre transmis [tester le nombre de paramètres avec %parms() ]
OPTIONS(*OMIT) ce paramètre peut etre omis [tester le paramètre avec %addr(param) <> *NULL]
Exemple :
/free
exec('WRKSPLF': 7) ;
/end-free
la réception des paramètres peut elle même etre réalisée sur le même principe , avec prototype ET interface de procédure ( PI )
DProgrammeB PR EXTPGM('PROGRAMMEB') D 6 0
DProgrammeB PI D nocli 6 0
-
Utilisez une gestion fine d'erreur avec MONITOR/ON-ERROR/ENDMON /free MONITOR ; chain nocli clientf1 ; if %found ; chaine = %subst( tbl(x) : %scan('*':tbl(x)) + 1) endif;
On-error 1211 ; // fichier non ouvert ... On-error *FILE ; // autres erreurs fichier ... On error 00100:00121 ; // erreur de chaîne ou d'indice .... On-error *ALL ; // autres erreurs (MONMSG CPF0000) ... ENDMON; /end-free
- Apprenez ILE, particulièrement les programmes de service
- pour écrire vos propres fonctions (elles peuvent être communes
avec SQL)
- pour utiliser les fonctions destinées au C (sockets IP, manipulation
de fichiers IFS)
- pour utiliser JAVA (avec JNI) pour, par exemple, accéder à MYSQL ou Oracle en RPG
- pour écrire vos propres fonctions (elles peuvent être communes
avec SQL)
Procédures cataloguées
|
|
EXTERNAL NAME permet de définir le nom réel du pgm sur le serveur, si cette |
|
|
Vous pouvez faire cette déclaration depuis operation navigator
Détail de création d'une
procédure cataloguée externe (cliquez pour agrandir l'image) |
||
Nom de la procédure et attributs |
Définition des paramètres |
nom du programme "externe" |
Vous pourrez ensuite générer le source avec cette option :
|
|
|
|
|
|
|
|
|
|
|
|
|
Fonctions SQL
|
|
Exemples de fonctions SQL, utilisées sur les sites des
clubs régionnaux
|
|
Encore une fois, vous pourrez créer votre fonction depuis operation navigator,
puis retrouver le source de la déclaration ensuite
Triggers en SQL PSM
|
|
|
|
|
exemple, on trace cumul des prix modifiés : ....................................................................... : CREATE TRIGGER VIN_CUMUL AFTER UPDATE OF CAV_PRIX : : ON BDVIN9/MA_CAVE : : REFERENCING OLD TABLE AS OCAVE : : NEW TABLE AS NCAVE : : FOR EACH STATEMENT MODE DB2SQL : : : : BEGIN : : DECLARE AV_CUMUL DEC(11, 2); : : DECLARE AP_CUMUL DEC(11, 2); : : : : SELECT SUM(CAV_PRIX) INTO AV_CUMUL FROM OCAVE ; : : SELECT SUM(CAV_PRIX) INTO AP_CUMUL FROM NCAVE ; : : : : INSERT INTO AF4TEST/CUMUL VALUES(NOW() , AV_CUMUL, AP_CUMUL) ; : : END : :.....................................................................: suite à un ordre : update bdvin9/ma_cave set cav_prix = cav_prix * 1,5 |
|
|
|
Gestion des erreurs et triggers |
SQLSTATE est amené à remplacer SQLCOD/SQLCODE (orientation ISO) |
Tout cela pouvant être réalisé depuis iSeries Navigator
Puis propriétés
Copyright © 1995,2007 VOLUBIS