Script PhP sur AS400

Kirito59
Invité n'ayant pas de compte PHPfrance

18 mars 2014, 09:51

Bonjour,

Je viens à vous aujourd'hui car malgrés plusieurs jours de recherche, je suis toujours bloqué au même point.

La situation est a suivante :

Je suis actuellement en stage au sein d'une mutuelle qui utilise différents serveurs, ainsi qu'un AS400.
Je dois réaliser une application intranet qui a pour but de modifier les données présentes dans ce fameux AS.

Mon problème :

Par le biais d'une liste déroulante, l'utilisateur sélectionne un code traitement (CODTRT) ainsi qu'une date au format SSAAMMJJ (DATE).
Une fois le formulaire envoyé, je récupère sur la page suivante les informations en sachant que les informations sont issues de la table YREFERENHD et YJOURS1HD.
Sur cette page, je dois réaliser une boucle (ou autre chose, mais l'idée de la boucle me paraît la plus appropriée) afin de ne choisir dans les deux tables, que les résultats correspondants au CODTRT précédemment choisis, à une DATE strictement supérieur à la date choisis. Jusque la, tout va bien.

Et c'est ici que ça se complique. En effet, un CODTRT possède plusieurs numéro d'ordre (NUORDR). Cela fonctionne sous forme de chaîne.
Par exemple, un CODTRT peut commencer le 20140314 avec un NUORDR à 05 pour finir le 20140316 avec un NUORDR à 99.
Le NUORDR commence toujours à 05, mais on ne sait jamais jusqu'a combien il monte. Le maximum possible étant 99.

Donc le CODTRT possède un NUORDR allant de 05 à 99, une fois le dernier NUORDR atteint, la chaîne recommence, donc de 05 à 99 etc etc

Voilà la véritable source du problème :

Je dois effectuer une requête SQL dans les tables YREFERENHD et YJOURS1HD en prennant soin de n'afficher que les résultats correspondants au CODTRT choisis, strictement supérieurs à la date choisis et ayant un NUORDR de 05 à 99 (Il me faut seulement la première chaine.)


Pour être plus claire et que cela soit plus compréhensible, en algorithmique, cela donnerait quelque chose du genre :

SI CODTRT Choisis = CODTRT dans la BDD ET que DATE choisis > DATE dans la BDD
LIRE LA BDD
SI NUORDR suivant EST INFERIEUR au NUORDR actuel
STOP.
AFFICHE RESULTAT.

Voilà, je ne suis pas réellement un expert du PhP, et encore moins de l'AS.
Mais pour le coup, je ne sais vraiment pas comment faire.
Tout en sachant que pour accèder à l'AS400 via PhP/SQL, il faut impérativement utiliser les pilotes ODBC.

Vous en remerciant d'avance
Cordialement.

Kirito59
Invité n'ayant pas de compte PHPfrance

18 mars 2014, 12:34

Bonjour,

Toujours pas de réponses...

J'ai trouvé une piste du côté des CURSEURS en SQL.
Malgrés ça, un petit problème persiste.

Voilà mon code :
                                                           DECLARE v_codtrt, v_date, v_nuordr VARCHAR(20);
                                                           DECLARE fin INT DEFAULT 0;
							   DECLARE i INT DEFAULT 0;
							   DECLARE curs_nuordr CURSOR
							       FOR SELECT IMNORD10F.YJOURS1HD.CODTRT, IMNORD10F.YJOURS1HD.DATE, IMNORD10F.YJOURS1HD.NUORDR
							       FROM IMNORD10F.YJOURS1HD
							       WHERE IMNORD10F.YJOURS1HD.CODTRT = '".$jobrecup."'
							       AND IMNORD10F.YJOURS1HD.DATE > '".$daterecup."';
							   DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = 99;
							   OPEN curs_nuordr;
							   loop_curseur LOOP
							       FETCH curs_nuordr INTO v_codtrt, v_date, v_nuordr;
							       IF v_nuordr > v_nuordr+1 THEN
							           LEAVE loop_curseur;
							       END IF;
								   SELECT CONCAT(v_codtrt,' ',v_date,' ',v_nuordr) AS 'JOB';
							END LOOP;
							CLOSE curs_nuordr;
Le problème se situe sur cette ligne : IF v_nuordr > v_nuordr+1 THEN

Comment faire pour traduire ça, car je ne pense pas que cela fonctionne si facilement.
En gros, comment faire pour dire " SI v_nuordr EST SUPÉRIEUR au v_nuordr SUIVANT ALORS...."

Merci d'avance.
Cordialement.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 mars 2014, 22:59

salut,

tu ne peux pas ce serais faire de la prédiction (enfin si il faut avancer le curseur lorsque tu as tes infos et ne faire qu'une fois et reprendre toutes les infos, bref un beau bordel )

ta question n'est pas claire
Donc le CODTRT possède un NUORDR allant de 05 à 99, une fois le dernier NUORDR atteint, la chaîne recommence, donc de 05 à 99 etc etc
tu veux dire qu'il y a des CODTRT avec deux NUORDR == 42 ? (et la ça me semblerait étonnant du coup ce numéro sert plus a rien ^^).

si ce n'est pas le cas une simple jointure devrait suffire.

après sans même un mcd c'est compliqué ;à


@+
Il en faut peu pour être heureux ......

kirito59
Invité n'ayant pas de compte PHPfrance

19 mars 2014, 09:57

Bonjour,

Oui je sais que je ne suis pas très claire, mais même moi j'ai dû mal à m'y retrouver ^^'

En fait, je dois faire une application intranet qui a pour but de modifier certaines lignes dans une base de données (AS400).

Par exemple :

-> L'utilisateur arrive sur la page 'index.php'
-> Par le biais d'un menu (De simple boutons), il sélectionne " Modification d'une chaîne "
-> Il sélectionne ensuite un CODTRT (Formaté sous la forme XX-YYY-ZZZ, où XX = String, YYY = String et ZZZ = INT) dans une liste déroulante puis une date dans un champ texte et envoi le formulaire. La liste déroulante est alimentée par une requête pointant sur la table YREFERENHD.
Voici la requête : "
SELECT DISTINCT * FROM IMNORD10F.YREFERENHD ORDER BY IMNORD10F.YREFERENHD.CODTRT ASC
"

NOTE : C'est à partir d'ici que sa coince

-> Une fois le formulaire envoyé, on récupère le CODTRT sélectionné ainsi que la date. Le but est d'afficher le Job que l'utilisateur a choisis à une date STRICTEMENT supérieure à celle choisie et d'en afficher que la première chaîne.

Une chaîne se compose comme ceci :
Le CODTRT EX-PAM-001 possède une date ainsi qu'un NUORDR.
Par exemple :
LIGNE | CODTRT | NUORDR | DATE | JOUR
001 | EX-PAM-001 | 05 | 20140403 | JE
002 | EX-PAM-001 | 10 | 20140403 | JE
003 | EX-PAM-001 | 15 | 20140403 | JE
004 | EX-PAM-001 | 18 | 20140403 | JE
005 | EX-PAM-001 | 20 | 20140403 | JE
006 | EX-PAM-001 | 25 | 20140404 | VE
007 | EX-PAM-001 | 30 | 20140404 | VE
008 | EX-PAM-001 | 35 | 20140404 | VE
009 | EX-PAM-001 | 05 | 20140502 | VE
010 | EX-PAM-001 | 10 | 20140502 | VE
011 | EX-PAM-001 | 15 | 20140502 | VE
012 | EX-PAM-001 | 18 | 20140502 | VE
013 | EX-PAM-001 | 20 | 20140502 | VE
014 | EX-PAM-001 | 25 | 20140503 | SA
015 | EX-PAM-001 | 30 | 20140503 | SA
016 | EX-PAM-001 | 35 | 20140503 | SA

Et recommence a 05 etc etc etc

Donc ici le but est de n'afficher que la premiere chaine, c'est a dire celle la :
001 | EX-PAM-001 | 05 | 20140403 | JE
002 | EX-PAM-001 | 10 | 20140403 | JE
003 | EX-PAM-001 | 15 | 20140403 | JE
004 | EX-PAM-001 | 18 | 20140403 | JE
005 | EX-PAM-001 | 20 | 20140403 | JE
006 | EX-PAM-001 | 25 | 20140404 | VE
007 | EX-PAM-001 | 30 | 20140404 | VE
008 | EX-PAM-001 | 35 | 20140404 | VE

Ses informations là se trouvent dans la table YJOURS1HD.

Voilà, en espèrant avoir été plus claire,
Merci d'avance.