Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/05/2011, 19h10   #1
Invité de passage
 
Inscription : septembre 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 5
Points : 0
Points : 0
Par défaut Boucle repeat qui s'arrête au premier enregistrement

Bonjour à tous,
j'essaie depuis des heures de trouver ce qui empêche ma proc. de "tourner rond" et je n'arrive à rien ! le premier curseur est censé être traité et inséré dans une table (préalablement vidée à chaque lancement de la procédure) mais une seule ligne est insérée (1er résultat de la requête) et j'ai bien vérifié le résultat de la requête du dit curseur, je suis censé avoir plus de 20000 enregistrements ! je ne comprends pas !

Help me please !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
DROP PROCEDURE IF EXISTS export;
CREATE PROCEDURE export()
general: BEGIN
 
	DECLARE exit_proc INT DEFAULT 0;
   DECLARE userid INT;
   DECLARE useremail CHAR(250);
   DECLARE titlech CHAR(250);
   DECLARE firstname CHAR(250);
   DECLARE lastname CHAR(250);
   DECLARE companych CHAR(250);
   DECLARE address1 CHAR(250);
   DECLARE address2 CHAR(250);
   DECLARE zipch INT;
   DECLARE citych CHAR(250);
   DECLARE countrych CHAR(250);
   DECLARE phone1 CHAR(250);
   DECLARE phone2 CHAR(250);
   DECLARE bdaych CHAR(250);
   DECLARE newsletterch CHAR(250);
   DECLARE lastvisitDatech CHAR(250);
   DECLARE formatmsgid INT DEFAULT 2;
   DECLARE date_bday CHAR(10);
   DECLARE date_lastvisite CHAR(10);
   DECLARE maxcouponval INT DEFAULT 0;
	DECLARE maxcouponcode CHAR(15) DEFAULT "RAZ-DOLIST";
	DECLARE maxcoupondate CHAR(10) DEFAULT "01/01/1900";
   DECLARE nbcmd INT DEFAULT 0;
   DECLARE date_cmd CHAR(10);
   DECLARE totalmontantcmd int DEFAULT 0;
   DECLARE orderid INT;
   DECLARE lastdatech CHAR(10);
   DECLARE ordertotal INT DEFAULT 0;
   DECLARE couponcode CHAR(10);
   DECLARE couponvalue INT DEFAULT 0;
   DECLARE datefincoup CHAR(10);
   DECLARE title INT DEFAULT 2;
   DECLARE countryid INT DEFAULT 1;
   DECLARE familial CHAR(1) DEFAULT '';
   DECLARE ambiance CHAR(1)  DEFAULT '';
   DECLARE geeks CHAR(1)  DEFAULT '';
   DECLARE duo CHAR(1)  DEFAULT '';
   DECLARE enfants CHAR(1)  DEFAULT '';
   DECLARE cursorallclients CURSOR FOR SELECT DISTINCT inf.user_id,user_email,title,first_name,last_name,company,address_1,address_2,zip,city,country,phone_1,phone_2,date_format(bday, '%Y-%m-%d') bday,newsletter,date_format(lastvisitDate, '%Y-%m-%d') lastvisitDate FROM jos_vm_user_info inf,jos_users us WHERE inf.user_id=us.id AND inf.address_type = 'BT' AND inf.address_1 <> '' AND inf.user_id NOT IN (62,63) AND user_email NOT LIKE '%@espritjeu.com' ORDER BY inf.user_id DESC;
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET exit_proc = 1;
 
	TRUNCATE exportdolist;
   OPEN cursorallclients;
   REPEAT
		SET date_bday = '1900-01-01';
      SET formatmsgid = 2;
      SET date_lastvisite = '1900-01-01';
      FETCH cursorallclients INTO userid,useremail,titlech,firstname,lastname,companych,address1,address2,zipch,citych,countrych,phone1,phone2,bdaych,newsletterch,lastvisitDatech;
      /*formatage titre */
    	IF(titlech = 'Mr')then
			SET title = '3';
		elseif(titlech = 'Mme')then
			SET title = '1';
		end IF;
      /*Formatage Adresse*/
      SET address1 = "";
		SET address1 = REPLACE(address1,"\'", "'");
		SET address1 = REPLACE(address1,"\r", "");
		SET address1 = REPLACE(address1,"\n", "");
		SET address1 = REPLACE(address1,'\"', '"');
		SET address2 = REPLACE(address2,"\'", "'");
		SET address2 = REPLACE(address2,"\r", "");
		SET address2 = REPLACE(address2,"\n", "");
		SET address2 = REPLACE(address2,'\"', '"');
      /*Formatage Pays*/
		IF(countrych = "BEL")then
			SET countryid = "2";
		elseif(countrych = "SUI")then
			SET countryid = "36";
		elseif(countrych = "FIN")then
			SET countryid = "32";
		elseif(countrych = "ROY")then
			SET countryid = "61";
		end IF;
 
      /*format des mails par défaut (2 = html; 1 = texte ; 3 = AOL)*/
      SET formatmsgid = 2;
      IF(LOCATE('aol.', useremail) <> 0)then
			SET formatmsgid = 3;
		end IF;
		/*formatage date anniversaire*/
		IF(bdaych = '0000-00-00' || bdaych = '1930-01-01')then
			SET date_bday = '1900-01-01';
		else
			SET date_bday = bdaych;
		end IF;
		/*formatage date dernière visite*/
		IF(lastvisitDatech = '0000-00-00')then
			SET date_lastvisite = '1900-01-01';
		else
			SET date_lastvisite = lastvisitDatech;
		end IF;
		/* recup des commandes validées ou réglées ou expédiées pour chaque client*/
      cmd: BEGIN
   		DECLARE nborder int DEFAULT 0;
   	  	DECLARE cursorcmd CURSOR FOR SELECT DISTINCT order_id,from_unixtime(cdate, '%Y-%m-%d') lastdate, order_total FROM jos_vm_orders WHERE user_id = userid AND order_status NOT IN ('p','x','r','l') ORDER BY cdate ASC;
         OPEN cursorcmd;
         SELECT count(order_id) INTO nborder FROM jos_vm_orders WHERE user_id = userid AND order_status NOT IN ('p','x','r','l') ORDER BY cdate ASC;
         SET maxcouponval = 0;
   		SET maxcouponcode = "RAZ-DOLIST";
         SET maxcoupondate = "1900-01-01";
      	SET nbcmd = 0;
         SET totalmontantcmd = 0;
      	SET date_cmd = '1900-01-01';
   		REPEAT
            FETCH cursorcmd INTO orderid,lastdatech,ordertotal;
            SET nbcmd = nbcmd +1;
            SET date_cmd = lastdatech;
            SET totalmontantcmd = totalmontantcmd + ordertotal;
            /*recherche d'un coupon valide correspondant à la commande en cours*/
            SELECT coupon_code,coupon_value,DATE_FORMAT(coupon_datef, '%Y-%m-%d') datef INTO couponcode,couponvalue,datefincoup FROM jos_vm_coupons 
                  WHERE (coupon_code LIKE concat(orderid,'D%') OR coupon_code LIKE concat(orderid,'B%') OR coupon_code LIKE concat(orderid,'A%')) AND coupon_used = 0 AND CURDATE() BETWEEN coupon_dated AND coupon_datef;
 
   			      IF(couponvalue >= maxcouponval)then
      					SET maxcouponval = round(couponvalue,0);
      					SET maxcouponcode = couponcode;
      					SET maxcoupondate = datefincoup; 
      				End IF;
 
         UNTIL nbcmd >= nborder  END REPEAT;
         close cursorcmd;
      END cmd;
 
		/*classement par type de joueur*/
		/*Familial*/
		SELECT DISTINCT "F" INTO familial FROM jos_vm_orders WHERE order_id IN (
    				SELECT order_id FROM jos_vm_order_item WHERE product_id IN (
      					SELECT product_id FROM jos_vm_product_category_xref WHERE category_id IN (36,19,52,2))) AND user_id = userid;
 
		/*Ambiance*/
		SELECT DISTINCT "A" INTO ambiance FROM jos_vm_orders WHERE order_id IN (
    				SELECT order_id FROM jos_vm_order_item WHERE product_id IN (
      					SELECT product_id FROM jos_vm_product_category_xref WHERE category_id IN (40,17,7,8,18,51))) AND user_id = userid;
 
		/*Geeks*/
		SELECT DISTINCT "G" INTO geeks FROM jos_vm_orders WHERE order_id IN (
    				SELECT order_id FROM jos_vm_order_item WHERE product_id IN (
      					SELECT product_id FROM jos_vm_product_category_xref WHERE category_id IN (21,3,53))) AND user_id = userid;
 
		/*Duo*/
		SELECT DISTINCT "D" INTO duo FROM jos_vm_orders WHERE order_id IN (
    				SELECT order_id FROM jos_vm_order_item WHERE product_id IN (
      					SELECT product_id FROM jos_vm_product_category_xref WHERE category_id IN (13,14,15))) AND user_id = userid;
 
		/*Enfants*/
		SELECT DISTINCT "E" INTO enfants FROM jos_vm_orders WHERE order_id IN (
    				SELECT order_id FROM jos_vm_order_item WHERE product_id IN (
      					SELECT product_id FROM jos_vm_product_category_xref WHERE category_id = "12") ) AND user_id = userid;
 
		/*Tramage de la ligne*/
                /*set ligne ="Email\tSalutationId\tFirstName\tLastName\tCompany\tAddress 1\tAddress 2\tAddress 3\tZipCode\tCity\tCountryID\tPhone\tFax\tMobile Phone\tMsgFormatId\tSaleMgt\tBirthdate\tCustomDate1\tCustomDate2\tCustomDate3\tCustomStr1\tCustomStr2\tCustomStr3\tCustomStr4\tCustomStr5\tCustomStr6\tCustomStr7\tCustomStr8\tCustomStr9\tCustomStr10\tCustomStr11\tCustomStr12\tCustomStr13\tCustomStr14\tCustomStr15\tCustomStr16\tCustomStr17\tCustomStr18\tCustomStr19\tCustomStr20\tCustomStr21\tCustomStr22\tCustomStr23\tCustomStr24\tCustomStr25\tCustomStr26\tCustomStr27\tCustomStr28\tCustomStr29\tCustomStr30\tCustomInt1\tCustomInt2\tCustomInt3\tCustomInt4\tCustomInt5\tCustomInt6\tCustomInt7\tCustomInt8\tCustomInt9\tCustomInt10\n" ;
                /*set ligne = $row['user_email'] ."\t". title ."\t". ucfirst($row['first_name']) ."\t". ucfirst($row['last_name']) ."\t".$row['company']."\t".$address1."\t".$address2."\t\t".$row['zip']."\t".ucfirst($row['city'])."\t".$countryid."\t\t\t\t".$formatmsgid."\t1\t".$date_bday."\t".$date_lastvisite."\t".$date_cmd."\t".$maxcoupondate."\t".$row['newsletter']."\t". $maxcouponcode ."\t". $familial ."\t". $ambiance ."\t". $geeks ."\t".$duo."\t".$enfants."\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t". round($maxcouponval,0) ."\t".$nbcmd."\t".round($totalmontantcmd,0)."\t\t\t\t\t\t\t\n";
		/*sortie en table EsportDolist*/
 
   INSERT INTO exportdolist VALUES(userid,useremail,title,firstname,lastname,companych,address1,address2,'',zipch,citych,countryid,NULL,NULL,NULL,formatmsgid,1,date_bday,date_lastvisite,date_cmd,maxcoupondate,newsletterch,maxcouponcode,familial,ambiance,geeks,duo,enfants,'','','','','','','','','','','','','','','','','','','','','','','',round(maxcouponval,0),nbcmd,round(totalmontantcmd,0),NULL,NULL,NULL,NULL,NULL,NULL,NULL);
 
	UNTIL exit_proc END REPEAT;
   CLOSE cursorallclients;
 
END general
Esprit Jeu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 07h10   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
Salut,

Essaye d'utiliser le type bool pour exit_proc déjà, 1 octect c'est mieux que 4 pour un pauvre vrai/faux

Ensuite, si tu as des curseurs et 1 seul continue handler général, tu dois sauvegarder l'état de la variable qu'il modifie avant d'entrer dans le curseur interne et le restituer en sortie de celui ci sous peine de ne lire que la première ligne du curseur externe et de sortir direct...

Comme là

2ème solution tu peux déclarer un handler dans ton begin end, celui de cmd ici, qui modifiera une autre variable bool déclarée avec lui...


tout bête
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 16h04   #3
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
Salut je ne sais pas si ça peut aider mais dans les procédures stockées dont j'ai hérité de la maintenance avant chaque repeat la variable qui sert pour le handler (en l'occurrence pour toi exit_proc) était initialisée à 0 ce que je n'ai pas vu avant ton premier repeat... Peut être que pour lui proc_exit vaut 1 tout de suite et il ne passe donc qu'une fois dans ta boucle...
__________________
[/HS]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 16h46   #4
Invité de passage
 
Inscription : septembre 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 5
Points : 0
Points : 0
bonjour et merci pour cette réponse, malheureusement j'ai beau essayer, je n'arrive à rien ! j'ai modifié le mode de sortie des boucles, cela fonctionne mieux mai il reste des résultats incohérents, je reviendrais poster dès que j'aurais trouvé la solution.

merci en tout cas,

bon week end
Esprit Jeu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 06h52   #5
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
salut,

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
delimiter |
DROP PROCEDURE IF EXISTS export;
CREATE PROCEDURE export()
BEGIN
 
	DECLARE exit_proc INT DEFAULT 0;
   DECLARE userid INT;
   DECLARE useremail CHAR(250);
   DECLARE titlech CHAR(250);
   DECLARE firstname CHAR(250);
   DECLARE lastname CHAR(250);
   DECLARE companych CHAR(250);
   DECLARE address1 CHAR(250);
   DECLARE address2 CHAR(250);
   DECLARE zipch INT;
   DECLARE citych CHAR(250);
   DECLARE countrych CHAR(250);
   DECLARE phone1 CHAR(250);
   DECLARE phone2 CHAR(250);
   DECLARE bdaych CHAR(250);
   DECLARE newsletterch CHAR(250);
   DECLARE lastvisitDatech CHAR(250);
   DECLARE formatmsgid INT DEFAULT 2;
   DECLARE date_bday CHAR(10);
   DECLARE date_lastvisite CHAR(10);
   DECLARE maxcouponval INT DEFAULT 0;
	DECLARE maxcouponcode CHAR(15) DEFAULT "RAZ-DOLIST";
	DECLARE maxcoupondate CHAR(10) DEFAULT "01/01/1900";
   DECLARE nbcmd INT DEFAULT 0;
   DECLARE date_cmd CHAR(10);
   DECLARE totalmontantcmd int DEFAULT 0;
   DECLARE orderid INT;
   DECLARE lastdatech CHAR(10);
   DECLARE ordertotal INT DEFAULT 0;
   DECLARE couponcode CHAR(10);
   DECLARE couponvalue INT DEFAULT 0;
   DECLARE datefincoup CHAR(10);
   DECLARE title INT DEFAULT 2;
   DECLARE countryid INT DEFAULT 1;
   DECLARE familial CHAR(1) DEFAULT '';
   DECLARE ambiance CHAR(1)  DEFAULT '';
   DECLARE geeks CHAR(1)  DEFAULT '';
   DECLARE duo CHAR(1)  DEFAULT '';
   DECLARE enfants CHAR(1)  DEFAULT '';
   DECLARE cursorallclients CURSOR FOR SELECT DISTINCT inf.user_id,user_email,title,first_name,last_name,company,address_1,address_2,zip,city,country,phone_1,phone_2,date_format(bday, '%Y-%m-%d') bday,newsletter,date_format(lastvisitDate, '%Y-%m-%d') lastvisitDate FROM jos_vm_user_info inf,jos_users us WHERE inf.user_id=us.id AND inf.address_type = 'BT' AND inf.address_1 <> '' AND inf.user_id NOT IN (62,63) AND user_email NOT LIKE '%@espritjeu.com' ORDER BY inf.user_id DESC;
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET exit_proc = 1;
 
	TRUNCATE exportdolist;
   OPEN cursorallclients;
   REPEAT
		SET date_bday = '1900-01-01';
      SET formatmsgid = 2;
      SET date_lastvisite = '1900-01-01';
      FETCH cursorallclients INTO userid,useremail,titlech,firstname,lastname,companych,address1,address2,zipch,citych,countrych,phone1,phone2,bdaych,newsletterch,lastvisitDatech;
      /*formatage titre */
    	IF(titlech = 'Mr')then
			SET title = '3';
		elseif(titlech = 'Mme')then
			SET title = '1';
		end IF;
      /*Formatage Adresse*/
      SET address1 = "";
		SET address1 = REPLACE(address1,"\'", "'");
		SET address1 = REPLACE(address1,"\r", "");
		SET address1 = REPLACE(address1,"\n", "");
		SET address1 = REPLACE(address1,'\"', '"');
		SET address2 = REPLACE(address2,"\'", "'");
		SET address2 = REPLACE(address2,"\r", "");
		SET address2 = REPLACE(address2,"\n", "");
		SET address2 = REPLACE(address2,'\"', '"');
      /*Formatage Pays*/
		IF(countrych = "BEL")then
			SET countryid = "2";
		elseif(countrych = "SUI")then
			SET countryid = "36";
		elseif(countrych = "FIN")then
			SET countryid = "32";
		elseif(countrych = "ROY")then
			SET countryid = "61";
		end IF;
 
      /*format des mails par défaut (2 = html; 1 = texte ; 3 = AOL)*/
      SET formatmsgid = 2;
      IF(LOCATE('aol.', useremail) <> 0)then
			SET formatmsgid = 3;
		end IF;
		/*formatage date anniversaire*/
		IF(bdaych = '0000-00-00' || bdaych = '1930-01-01')then
			SET date_bday = '1900-01-01';
		else
			SET date_bday = bdaych;
		end IF;
		/*formatage date dernière visite*/
		IF(lastvisitDatech = '0000-00-00')then
			SET date_lastvisite = '1900-01-01';
		else
			SET date_lastvisite = lastvisitDatech;
		end IF;
		/* recup des commandes validées ou réglées ou expédiées pour chaque client*/
      cmd: BEGIN
      	DECLARE exit_cmd bool DEFAULT 0;
   		DECLARE nborder int DEFAULT 0;
   	  	DECLARE cursorcmd CURSOR FOR SELECT DISTINCT order_id,from_unixtime(cdate, '%Y-%m-%d') lastdate, order_total FROM jos_vm_orders WHERE user_id = userid AND order_status NOT IN ('p','x','r','l') ORDER BY cdate ASC;
   	  	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET exit_cmd = 1;
         OPEN cursorcmd;
         SELECT count(order_id) INTO nborder FROM jos_vm_orders WHERE user_id = userid AND order_status NOT IN ('p','x','r','l') ORDER BY cdate ASC;
         SET maxcouponval = 0;
   		SET maxcouponcode = "RAZ-DOLIST";
         SET maxcoupondate = "1900-01-01";
      	SET nbcmd = 0;
         SET totalmontantcmd = 0;
      	SET date_cmd = '1900-01-01';
   		REPEAT
            FETCH cursorcmd INTO orderid,lastdatech,ordertotal;
            SET nbcmd = nbcmd +1;
            SET date_cmd = lastdatech;
            SET totalmontantcmd = totalmontantcmd + ordertotal;
            /*recherche d'un coupon valide correspondant à la commande en cours*/
            SELECT coupon_code,coupon_value,DATE_FORMAT(coupon_datef, '%Y-%m-%d') datef INTO couponcode,couponvalue,datefincoup FROM jos_vm_coupons 
                  WHERE (coupon_code LIKE concat(orderid,'D%') OR coupon_code LIKE concat(orderid,'B%') OR coupon_code LIKE concat(orderid,'A%')) AND coupon_used = 0 AND CURDATE() BETWEEN coupon_dated AND coupon_datef;
 
   			      IF(couponvalue >= maxcouponval)then
      					SET maxcouponval = round(couponvalue,0);
      					SET maxcouponcode = couponcode;
      					SET maxcoupondate = datefincoup; 
      				End IF;
 
         UNTIL nbcmd >= nborder  END REPEAT;
         close cursorcmd;
      END cmd;
 
		/*classement par type de joueur*/
		/*Familial*/
		SELECT DISTINCT "F" INTO familial FROM jos_vm_orders WHERE order_id IN (
    				SELECT order_id FROM jos_vm_order_item WHERE product_id IN (
      					SELECT product_id FROM jos_vm_product_category_xref WHERE category_id IN (36,19,52,2))) AND user_id = userid;
 
		/*Ambiance*/
		SELECT DISTINCT "A" INTO ambiance FROM jos_vm_orders WHERE order_id IN (
    				SELECT order_id FROM jos_vm_order_item WHERE product_id IN (
      					SELECT product_id FROM jos_vm_product_category_xref WHERE category_id IN (40,17,7,8,18,51))) AND user_id = userid;
 
		/*Geeks*/
		SELECT DISTINCT "G" INTO geeks FROM jos_vm_orders WHERE order_id IN (
    				SELECT order_id FROM jos_vm_order_item WHERE product_id IN (
      					SELECT product_id FROM jos_vm_product_category_xref WHERE category_id IN (21,3,53))) AND user_id = userid;
 
		/*Duo*/
		SELECT DISTINCT "D" INTO duo FROM jos_vm_orders WHERE order_id IN (
    				SELECT order_id FROM jos_vm_order_item WHERE product_id IN (
      					SELECT product_id FROM jos_vm_product_category_xref WHERE category_id IN (13,14,15))) AND user_id = userid;
 
		/*Enfants*/
		SELECT DISTINCT "E" INTO enfants FROM jos_vm_orders WHERE order_id IN (
    				SELECT order_id FROM jos_vm_order_item WHERE product_id IN (
      					SELECT product_id FROM jos_vm_product_category_xref WHERE category_id = "12") ) AND user_id = userid;
 
		/*Tramage de la ligne*/
                /*set ligne ="Email\tSalutationId\tFirstName\tLastName\tCompany\tAddress 1\tAddress 2\tAddress 3\tZipCode\tCity\tCountryID\tPhone\tFax\tMobile Phone\tMsgFormatId\tSaleMgt\tBirthdate\tCustomDate1\tCustomDate2\tCustomDate3\tCustomStr1\tCustomStr2\tCustomStr3\tCustomStr4\tCustomStr5\tCustomStr6\tCustomStr7\tCustomStr8\tCustomStr9\tCustomStr10\tCustomStr11\tCustomStr12\tCustomStr13\tCustomStr14\tCustomStr15\tCustomStr16\tCustomStr17\tCustomStr18\tCustomStr19\tCustomStr20\tCustomStr21\tCustomStr22\tCustomStr23\tCustomStr24\tCustomStr25\tCustomStr26\tCustomStr27\tCustomStr28\tCustomStr29\tCustomStr30\tCustomInt1\tCustomInt2\tCustomInt3\tCustomInt4\tCustomInt5\tCustomInt6\tCustomInt7\tCustomInt8\tCustomInt9\tCustomInt10\n" ;
                /*set ligne = $row['user_email'] ."\t". title ."\t". ucfirst($row['first_name']) ."\t". ucfirst($row['last_name']) ."\t".$row['company']."\t".$address1."\t".$address2."\t\t".$row['zip']."\t".ucfirst($row['city'])."\t".$countryid."\t\t\t\t".$formatmsgid."\t1\t".$date_bday."\t".$date_lastvisite."\t".$date_cmd."\t".$maxcoupondate."\t".$row['newsletter']."\t". $maxcouponcode ."\t". $familial ."\t". $ambiance ."\t". $geeks ."\t".$duo."\t".$enfants."\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t". round($maxcouponval,0) ."\t".$nbcmd."\t".round($totalmontantcmd,0)."\t\t\t\t\t\t\t\n";
		/*sortie en table EsportDolist*/
 
   INSERT INTO exportdolist VALUES(userid,useremail,title,firstname,lastname,companych,address1,address2,'',zipch,citych,countryid,NULL,NULL,NULL,formatmsgid,1,date_bday,date_lastvisite,date_cmd,maxcoupondate,newsletterch,maxcouponcode,familial,ambiance,geeks,duo,enfants,'','','','','','','','','','','','','','','','','','','','','','','',round(maxcouponval,0),nbcmd,round(totalmontantcmd,0),NULL,NULL,NULL,NULL,NULL,NULL,NULL);
 
	UNTIL exit_proc END REPEAT;
   CLOSE cursorallclients;
 
END|
delimiter ;
ça devrait marcher
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h06   #6
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
j'ai le même problème...
j'ai ajouté une variable pour compter le nombre de passage dans la boucle et cela vaut toujours 1...
voici mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
begin	
 
	declare vAmount float;
	declare vUnitPriceMorningBegin float;
	declare vUnitPriceMorningEnd float;
	declare vUnitPriceAfternoonBegin float;
	declare vUnitPriceAftenoonEnd float;
	declare vUnitPriceAllTimes float;
 
    declare vAmountMorningBegin float;
    declare vAmountMorningEnd float;
    declare vAmountAfternoonBegin float;
    declare vAmountAfternoonEnd float;
    declare vAmountAllTimes float;
 
	declare vQuantityMorningBegin integer;
	declare vQuantityMorningEnd integer;
	declare vQuantityAfternoonBegin integer;
	declare vQuantityAfternoonEnd integer;
	declare vQuantityAllTimes integer;
 
    declare vScheduleMorningBegin integer;
    declare vScheduleMorningEnd integer;
    declare vScheduleAfternoonBegin integer;
    declare vScheduleAfternoonEnd integer;
 
 
 
	declare vLabelItem varchar(255);	
 
 
	-- GBAR - 23/05/2011 - Répercussion de la réduction sur la facturation
 
	declare vNbJoursInscriptions integer;
 
	declare vIdSchool integer;
 
	declare vNbSchoolDiscount integer;
 
	declare vOsMorningBegin integer;
 
	declare vOsMorningEnd integer;
 
	declare vOsAfternoonBegin integer; 
 
	declare vOsAfternoonEnd integer;
 
	declare vCsDate date;
 
	declare vNbJoursOuvres integer;
 
	declare vIsDayOff BOOLEAN;
 
	declare vPourcentPresence float;
 
	declare vPresenceThreshold integer;
 
	declare vDiscountRatio integer;
 
	declare vRoundDown BOOLEAN;
 
	declare vMontantReduction float;
 
      declare vFamiliy_quotient float;
 
	declare done int DEFAULT 0;
 
	declare cpt int DEFAULT 0;
 
	declare cCompteJoursinscription cursor FOR SELECT cs_date, os_morning_begin, os_morning_end, os_afternoon_begin, os_afternoon_end FROM t_calendar_school WHERE cs_date BETWEEN pFromDate AND pThruDate;
 
	declare continue handler FOR sqlstate '02000' SET done = 1;
 
	-- Fin GBAR - 23/05/2011 - Répercussion de la réduction sur la facturation
 
 
	SELECT get_out_school_child_unit_price(pIdChild, 'SCHEDULE_MORNING_BEGIN')    INTO vUnitPriceMorningBegin;
	SELECT get_out_school_child_unit_price(pIdChild, 'SCHEDULE_MORNING_END')      INTO vUnitPriceMorningEnd;
	SELECT get_out_school_child_unit_price(pIdChild, 'SCHEDULE_AFTERNOON_BEGIN')  INTO vUnitPriceAfternoonBegin;
	SELECT get_out_school_child_unit_price(pIdChild, 'SCHEDULE_AFTERNOON_END')    INTO vUnitPriceAftenoonEnd;
	SELECT get_out_school_child_unit_price(pIdChild, 'SCHEDULE_ALL_TIMES')        INTO vUnitPriceAllTimes;
 
 
 
 
  SELECT count(id_enum_hour_type) INTO vScheduleMorningBegin
    FROM t_out_school_schedule, t_out_school, t_child
   WHERE t_child.id_child = pIdChild
     AND t_child.id_school = t_out_school.id_school
     AND t_out_school_schedule.id_out_school = t_out_school.id_out_school
     AND t_out_school_schedule.id_enum_hour_type = "SCHEDULE_MORNING_BEGIN";
 
  SELECT count(id_enum_hour_type) INTO vScheduleMorningEnd
    FROM t_out_school_schedule, t_out_school, t_child
   WHERE t_child.id_child = pIdChild
     AND t_child.id_school = t_out_school.id_school
     AND t_out_school_schedule.id_out_school = t_out_school.id_out_school
     AND t_out_school_schedule.id_enum_hour_type = "SCHEDULE_MORNING_END";
 
  SELECT count(id_enum_hour_type) INTO vScheduleAfternoonBegin
    FROM t_out_school_schedule, t_out_school, t_child
   WHERE t_child.id_child = pIdChild
     AND t_child.id_school = t_out_school.id_school
     AND t_out_school_schedule.id_out_school = t_out_school.id_out_school
     AND t_out_school_schedule.id_enum_hour_type = "SCHEDULE_AFTERNOON_BEGIN";
 
  SELECT count(id_enum_hour_type) INTO vScheduleAfternoonEnd
    FROM t_out_school_schedule, t_out_school, t_child
   WHERE t_child.id_child = pIdChild
     AND t_child.id_school = t_out_school.id_school
     AND t_out_school_schedule.id_out_school = t_out_school.id_out_school
     AND t_out_school_schedule.id_enum_hour_type = "SCHEDULE_AFTERNOON_END";
 
  IF (vUnitPriceAllTimes = -1) then
 
 
    SET vQuantityAllTimes = 0;
    IF (vUnitPriceMorningBegin <> -1) then
      SELECT count(cs_date) INTO vQuantityMorningBegin
      FROM t_calendar_school
      WHERE id_child = pIdChild AND cs_date BETWEEN pFromDate AND pThruDate AND
        os_morning_begin = '1' AND os_unsubscr_morning_begin = '0'
        AND cs_date NOT IN (
          SELECT csu_date
          FROM  t_calendar_school_urgency
          WHERE os_morning_begin = '1' AND
                id_school = (SELECT id_school FROM t_child WHERE t_child.id_child = pIdChild) AND 
          csu_date BETWEEN pFromDate AND pThruDate
        );
    else
      SET vQuantityMorningBegin = 0;
    end IF;
    IF (vUnitPriceMorningEnd <> -1) then
 
      SELECT count(cs_date) INTO vQuantityMorningEnd
      FROM t_calendar_school
      WHERE id_child = pIdChild AND cs_date BETWEEN pFromDate AND pThruDate AND
        os_morning_end = '1' AND os_unsubscr_morning_end = '0'
        AND (sm_lunch = '0' OR sm_unsubscr_lunch = '1')
        AND cs_date NOT IN (
          SELECT csu_date
          FROM  t_calendar_school_urgency
          WHERE os_morning_end = '1' AND
                id_school = (SELECT id_school FROM t_child WHERE t_child.id_child = pIdChild) AND
          csu_date BETWEEN pFromDate AND pThruDate
        );
    else
      SET vQuantityMorningEnd = 0;
    end IF;
 
    IF (vUnitPriceAfternoonBegin <> -1) then
 
      SELECT count(cs_date) INTO vQuantityAfternoonBegin
      FROM t_calendar_school
      WHERE id_child = pIdChild AND cs_date BETWEEN pFromDate AND pThruDate AND
        os_afternoon_begin = '1' AND os_unsubscr_afternoon_begin = '0'
        AND (sm_lunch = '0' OR sm_unsubscr_lunch = '1')
        AND cs_date NOT IN (
          SELECT csu_date
          FROM  t_calendar_school_urgency
          WHERE os_afternoon_begin = '1' AND
                id_school = (SELECT id_school FROM t_child WHERE t_child.id_child = pIdChild) AND
          csu_date BETWEEN pFromDate AND pThruDate
        );
    else
      SET vQuantityAfternoonBegin = 0;
    end IF;
 
    IF (vUnitPriceAftenoonEnd <> -1) then
 
      SELECT count(cs_date) INTO vQuantityAfternoonEnd
      FROM t_calendar_school
      WHERE id_child = pIdChild AND cs_date BETWEEN pFromDate AND pThruDate AND
        os_afternoon_end = '1' AND os_unsubscr_afternoon_end = '0'
        AND cs_date NOT IN (
          SELECT csu_date
          FROM  t_calendar_school_urgency
          WHERE os_afternoon_end = '1' AND
                id_school = (SELECT id_school FROM t_child WHERE t_child.id_child = pIdChild) AND  
          csu_date BETWEEN pFromDate AND pThruDate
        );
    else
      SET vQuantityAfternoonEnd = 0;
    end IF;
 
 
  else
 
 
    IF (vUnitPriceMorningBegin = -1 AND
        vUnitPriceMorningEnd = -1 AND
        vUnitPriceAfternoonBegin = -1 AND
        vUnitPriceAftenoonEnd = -1) then
 
 
      SELECT count(cs_date) INTO vQuantityAllTimes
        FROM t_calendar_school
         WHERE id_child = pIdChild AND cs_date BETWEEN pFromDate AND pThruDate AND
          ((os_morning_begin = '1' AND os_unsubscr_morning_begin = '0') OR
          (os_morning_end = '1' AND os_unsubscr_morning_end = '0' AND (sm_lunch = '0' OR sm_unsubscr_lunch = '1')) OR
          (os_afternoon_begin = '1' AND os_unsubscr_afternoon_begin = '0' AND (sm_lunch = '0' OR sm_unsubscr_lunch = '1')) OR
          (os_afternoon_end = '1' AND os_unsubscr_afternoon_end = '0'))
          AND cs_date NOT IN (
            SELECT csu_date
            FROM  t_calendar_school_urgency
            WHERE (os_morning_end = '1' OR  os_morning_begin = '1' OR os_afternoon_begin = '1' OR os_afternoon_end = '1') AND
                  id_school = (SELECT id_school FROM t_child WHERE t_child.id_child = pIdChild) AND 
            csu_date BETWEEN pFromDate AND pThruDate
          );
    else 
 
 
 
      SELECT count(cs_date) INTO vQuantityAllTimes
        FROM t_calendar_school
         WHERE id_child = pIdChild AND cs_date BETWEEN pFromDate AND pThruDate AND
          ((os_morning_begin = '1' AND os_unsubscr_morning_begin = '0' AND vScheduleMorningBegin = 1) OR
             vScheduleMorningBegin = 0) AND
          ((os_morning_end = '1' AND os_unsubscr_morning_end = '0' AND vScheduleMorningEnd = 1 AND (sm_lunch = '0' OR sm_unsubscr_lunch = '1')) OR
             vScheduleMorningEnd = 0) AND
          ((os_afternoon_begin = '1' AND os_unsubscr_afternoon_begin = '0' AND vScheduleAfternoonBegin = 1 AND (sm_lunch = '0' OR sm_unsubscr_lunch = '1')) OR
             vScheduleAfternoonBegin = 0) AND
          ((os_afternoon_end = '1' AND os_unsubscr_afternoon_end = '0' AND vScheduleAfternoonEnd = 1) OR
             vScheduleAfternoonEnd = 0)
          AND cs_date NOT IN (
            SELECT csu_date
            FROM  t_calendar_school_urgency
            WHERE (os_morning_end = '1' OR  os_morning_begin = '1' OR os_afternoon_begin = '1' OR os_afternoon_end = '1') AND
                  id_school = (SELECT id_school FROM t_child WHERE t_child.id_child = pIdChild) AND 
            csu_date BETWEEN pFromDate AND pThruDate
          );
 
 
      SELECT count(cs_date) INTO vQuantityMorningBegin
        FROM t_calendar_school
         WHERE id_child = pIdChild AND cs_date BETWEEN pFromDate AND pThruDate AND
          (os_morning_begin = '1' AND os_unsubscr_morning_begin = '0' AND vScheduleMorningBegin = 1)
          AND
          (((os_morning_end = '0' OR os_unsubscr_morning_end = '1') AND vScheduleMorningEnd = 1)
           OR
          ((os_afternoon_begin = '0' OR os_unsubscr_afternoon_begin = '1') AND vScheduleAfternoonBegin = 1) 
          OR
          ((os_afternoon_end = '0' OR os_unsubscr_afternoon_end = '1') AND vScheduleAfternoonEnd = 1))
          AND cs_date NOT IN (
            SELECT csu_date
            FROM  t_calendar_school_urgency
            WHERE os_morning_begin = '1' AND 
                  id_school = (SELECT id_school FROM t_child WHERE t_child.id_child = pIdChild) AND 
            csu_date BETWEEN pFromDate AND pThruDate
          );
 
 
      SELECT count(cs_date) INTO vQuantityMorningEnd
        FROM t_calendar_school
         WHERE id_child = pIdChild AND cs_date BETWEEN pFromDate AND pThruDate AND
          (os_morning_end = '1' AND os_unsubscr_morning_end = '0' AND vUnitPriceMorningEnd <> -1)
          AND
          (((os_morning_begin = '0' OR os_unsubscr_morning_begin = '1') AND vUnitPriceMorningBegin <> -1)
           OR
          ((os_afternoon_begin = '0' OR os_unsubscr_afternoon_begin = '1') AND vUnitPriceAfternoonBegin <> -1) 
          OR
          ((os_afternoon_end = '0' OR os_unsubscr_afternoon_end = '1') AND vUnitPriceAftenoonEnd <> -1))
          AND (sm_lunch = '0' OR sm_unsubscr_lunch = '1')
          AND cs_date NOT IN (
            SELECT csu_date
            FROM  t_calendar_school_urgency
            WHERE os_morning_begin = '1' AND 
                  id_school = (SELECT id_school FROM t_child WHERE t_child.id_child = pIdChild) AND 
            csu_date BETWEEN pFromDate AND pThruDate
          );
 
 
      SELECT count(cs_date) INTO vQuantityAfternoonBegin
        FROM t_calendar_school
         WHERE id_child = pIdChild AND cs_date BETWEEN pFromDate AND pThruDate AND
          (os_afternoon_begin = '1' AND os_unsubscr_afternoon_begin = '0' AND vUnitPriceAfternoonBegin <> -1)
          AND
          (((os_morning_begin = '0' OR os_unsubscr_morning_begin = '1') AND vUnitPriceMorningBegin <> -1)
           OR
          ((os_morning_end = '0' OR os_unsubscr_morning_end = '1') AND vUnitPriceMorningEnd <> -1)
          OR
          ((os_afternoon_end = '0' OR os_unsubscr_afternoon_end = '1') AND vUnitPriceAftenoonEnd <> -1))
          AND (sm_lunch = '0' OR sm_unsubscr_lunch = '1')
          AND cs_date NOT IN (
            SELECT csu_date
            FROM  t_calendar_school_urgency
            WHERE os_morning_begin = '1' AND 
                  id_school = (SELECT id_school FROM t_child WHERE t_child.id_child = pIdChild) AND 
            csu_date BETWEEN pFromDate AND pThruDate
          );
 
 
      SELECT count(cs_date) INTO vQuantityAfternoonEnd
        FROM t_calendar_school
         WHERE id_child = pIdChild AND cs_date BETWEEN pFromDate AND pThruDate AND
          (os_afternoon_end = '1' AND os_unsubscr_afternoon_end = '0' AND vUnitPriceAftenoonEnd <> -1)
          AND
          (((os_morning_begin = '0' OR os_unsubscr_morning_begin = '1') AND vUnitPriceMorningBegin <> -1)
           OR
          ((os_morning_end = '0' OR os_unsubscr_morning_end = '1') AND vUnitPriceMorningEnd <> -1)
          OR
          ((os_afternoon_begin = '0' OR os_unsubscr_afternoon_begin = '1') AND vUnitPriceAfternoonBegin <> -1))
          AND cs_date NOT IN (
            SELECT csu_date
            FROM  t_calendar_school_urgency
            WHERE os_morning_begin = '1' AND 
                  id_school = (SELECT id_school FROM t_child WHERE t_child.id_child = pIdChild) AND 
            csu_date BETWEEN pFromDate AND pThruDate
          );
 
    end IF;
 
 
  end IF;
 
  SET vAmountMorningBegin = vQuantityMorningBegin * vUnitPriceMorningBegin;
  SET vAmountMorningEnd = vQuantityMorningEnd * vUnitPriceMorningEnd;
  SET vAmountAfternoonBegin = vQuantityAfternoonBegin * vUnitPriceAfternoonBegin;
  SET vAmountAfternoonEnd = vQuantityAfternoonEnd * vUnitPriceAftenoonEnd;
  SET vAmountAllTimes = vQuantityAllTimes * vUnitPriceAllTimes;
 
 
  SET vAmount = 0;
  IF ( vAmountMorningBegin IS NOT NULL ) then
    SET vAmount = vAmount + vAmountMorningBegin;
  end IF;
  IF ( vAmountMorningEnd IS NOT NULL ) then
    SET vAmount = vAmount + vAmountMorningEnd;
  end IF;
  IF ( vAmountAfternoonBegin IS NOT NULL ) then
    SET vAmount = vAmount + vAmountAfternoonBegin;
  end IF;
  IF ( vAmountAfternoonEnd IS NOT NULL ) then
    SET vAmount = vAmount + vAmountAfternoonEnd;
  end IF;
  IF ( vAmountAllTimes IS NOT NULL ) then
    SET vAmount = vAmount + vAmountAllTimes;
  end IF;
 
 
  -- GBAR - 23/05/2011 - Répercussion de la réduction sur la facturation 
 
  call debug(concat("On rentre dans la partie de la réduction. id_child : ", pIdChild));
 
  SELECT id_school
 
  INTO   vIdSchool
 
  FROM   t_child
 
  WHERE  id_child = pIdChild;
 
  call debug(concat("id_school : ", vIdSchool));
 
 
 
  SELECT familiy_quotient
 
  INTO vFamiliy_quotient
 
  FROM t_family_account, t_child
 
  WHERE t_child.id_family_account = t_family_account.id_family_account
 
  AND t_child.id_child = pIdChild; 
 
  call debug(concat("vFamiliy_quotient : ", vFamiliy_quotient));
 
 
  SELECT count(id_school)
 
  INTO   vNbSchoolDiscount
 
  FROM   t_out_school_discount
 
  WHERE  id_school = vIdSchool
 
  AND    fq_min <= vFamiliy_quotient
 
  AND    fq_max > vFamiliy_quotient;
 
  call debug(concat("vNbSchoolDiscount : ", vNbSchoolDiscount));
 
 
 
 
 
  IF (vNbSchoolDiscount > 0) then
 
    INSERT INTO t_proc_stock_debug (message) VALUES ("Il y a une réduction possible");
 
 
 
    SELECT presence_threshold, discount_ratio, round_down
 
    INTO   vPresenceThreshold, vDiscountRatio, vRoundDown
 
    FROM   t_out_school_discount
 
    WHERE  id_school = vIdSchool
 
    AND    fq_min <= vFamiliy_quotient
 
    AND    fq_max > vFamiliy_quotient;
 
    call debug(concat("vPresenceThreshold : ", vPresenceThreshold));
 
    call debug(concat("vDiscountRatio : ", vDiscountRatio));
 
    call debug(concat("vRoundDown : ", vRoundDown));
 
 
 
    SET vDiscountRatio = vDiscountRatio / 100;
 
    call debug(concat("vDiscountRatio : ", vDiscountRatio));
 
 
 
    SET vNbJoursInscriptions = 0;
 
    open cCompteJoursinscription;
 
    repeat
 
        fetch cCompteJoursinscription INTO vCsDate, vOsMorningBegin, vOsMorningEnd, vOsAfternoonBegin, vOsAfternoonEnd;
 
	  SET cpt = cpt + 1;
 
        IF (vOsMorningBegin = 1 OR vOsMorningEnd = 1 OR
 
            vOsAfternoonBegin = 1 OR vOsAfternoonEnd = 1) then
 
            SET vNbJoursInscriptions = vNbJoursInscriptions +1;
 
        end IF;
 
        SET vNbJoursOuvres = 0;
 
        SET vIsDayOff = is_day_off(vCsDate);
 
        IF (vIsDayOff = false) then
 
            SET vNbJoursOuvres = vNbJoursOuvres +1;
 
        end IF;
 
	  SET vPourcentPresence = (vNbJoursInscriptions/vNbJoursOuvres)*100;
 
        IF (vPourcentPresence >= vPresenceThreshold) then
 
            IF (vRoundDown = true) then
 
                SET vMontantReduction = floor(vAmount * vDiscountRatio);
 
            else
 
                SET vMontantReduction = ceil(vAmount * vDiscountRatio);
 
            end IF;
 
            SET vAmount = vAmount - vMontantReduction;
 
        end IF;
 
    until done end repeat;
 
    close cCompteJoursinscription;
 
    call debug(concat("vNbJoursInscriptions : ", vNbJoursInscriptions));
 
    call debug(concat("vNbJoursOuvres : ", vNbJoursOuvres));
 
    call debug(concat("vPourcentPresence : ", vPourcentPresence));
 
    call debug(concat("vMontantReduction : ", vMontantReduction));
 
    call debug(concat("cpt : ", cpt));
 
  end IF;
 
  -- Fin GBAR - 23/05/2011 - Répercussion de la réduction sur la facturation
 
	IF (pRecord = true) then
 
		IF (pItemAdvance = true) then
			SET vLabelItem = 'LBL_INVOICE_ITEM_ADVANCE';
		else
			SET vLabelItem = 'LBL_INVOICE_ITEM_PERIOD';
		end IF;
 
    IF (vQuantityMorningBegin > 0) then
      SET vLabelItem = 'LBL_OUT_SCHOOL_MORNING_BEGIN';	
		call create_invoice_item(pIdInvoice, pIdChild, 'LBL_OUT_SCHOOL', pItemAdvance, 
        vQuantityMorningBegin, vUnitPriceMorningBegin, vAmountMorningBegin, vLabelItem, false);
    end IF;
 
    IF (vQuantityMorningEnd > 0) then
      SET vLabelItem = 'LBL_OUT_SCHOOL_MORNING_END';	
      call create_invoice_item(pIdInvoice, pIdChild, 'LBL_OUT_SCHOOL', pItemAdvance, 
        vQuantityMorningEnd, vUnitPriceMorningEnd, vAmountMorningEnd, vLabelItem, false);
    end IF;
 
    IF (vQuantityAfternoonBegin > 0) then
      SET vLabelItem = 'LBL_OUT_SCHOOL_AFTERNOON_BEGIN';	
      call create_invoice_item(pIdInvoice, pIdChild, 'LBL_OUT_SCHOOL', pItemAdvance, 
        vQuantityAfternoonBegin, vUnitPriceAfternoonBegin, vAmountAfternoonBegin, vLabelItem, false);
    end IF;
 
    IF (vQuantityAfternoonEnd > 0) then
      SET vLabelItem = 'LBL_OUT_SCHOOL_AFTERNOON_END';	
      call create_invoice_item(pIdInvoice, pIdChild, 'LBL_OUT_SCHOOL', pItemAdvance, 
        vQuantityAfternoonEnd, vUnitPriceAftenoonEnd, vAmountAfternoonEnd, vLabelItem, false);
    end IF;
 
    IF (vQuantityAllTimes > 0) then
      SET vLabelItem = 'LBL_OUT_SCHOOL_ALL_TIMES';	
      call create_invoice_item(pIdInvoice, pIdChild, 'LBL_OUT_SCHOOL', pItemAdvance, 
        vQuantityAllTimes, vUnitPriceAllTimes, vAmountAllTimes, vLabelItem, false);
    end IF;
 
 
    -- GBAR - 23/05/2011 - Répercussion de la réduction sur la facturation
 
    IF (vNbSchoolDiscount > 0) then
 
         SET vLabelItem = 'LBL_OUT_SCHOOL_DISCOUNT';	
 
      call create_invoice_item(pIdInvoice, pIdChild, 'LBL_OUT_SCHOOL', pItemAdvance, 
 
        1, vMontantReduction*-1, vMontantReduction*-1, vLabelItem, false);
 
    end IF;
 
    -- Fin GBAR - 23/05/2011 - Répercussion de la réduction sur la facturation
 
	end IF;
	RETURN vAmount;	
end
PS : le curseur n'existait pas avant, il a été créé par mes soins donc le problème peut venir d'ici.
__________________
[/HS]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h31   #7
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
c'est une horreur ta procédure... ...539 lignes...

déjà je vais t'apprendre à bien utiliser un curseur...

fetch ne garantit jamais que tu récupère des données (si ton select du curseur ne renvoie rien par exemple) donc IL FAUT TOUJOURS TESTER QUE TU AS BIEN UN RETOUR GRACE A LA VARIABLE QUI EST GEREE PAR LE HANDLER CONTINUE:
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
declare fini bool DEFAULT 0;
declare lit cursor FOR SELECT......;
declare continue handler FOR sqlstate '0200' SET fini=1;
...
open lit;
repeat
fetch lit INTO .......;
IF NOT fini then
.... traitement en cas de résultat (éventuellement entre begin et end en cas de déclaration de variable ici)
end IF;
until fini end repeat;
close lit;
il faut toujours garantir ce que tu fais car sinon les variables touchées par le fetch ne sont juste pas mise à jour et tu auras un comportement indéterminé si tu les testes
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h37   #8
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
d'accord merci beaucoup pour cette explication qui ne m'était pas naturelle (puisque je viens du monde Oracle dans lequel mes variables sont toujours remplies lors du parcours d'un curseur..)

Désolé pour l'horreur mais je l'ai récupérée comme ça la procédure (en dehors des blocs délimités par les commentaires qui correspondent à mes modifications ) et j'ai dû la comprendre (ainsi que les 5 ou 6 autres du même style qui sont appelées avant elle)
__________________
[/HS]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h50   #9
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
oracle est loin d'être une bonne école car à force de compter sur le sgbd pour penser à tout un tas de détails les gens pondent souvent du code pas si propre et portable que ça... ^^
c'est comme une variable que tu initialise pas... elle pas null par défaut... null est bien une valeur et un état...
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h53   #10
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
j'ai fait les modifs que tu m'as conseillé :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
[...]
declare done bool DEFAULT 0;
declare cCompteJoursinscription cursor FOR SELECT cs_date, os_morning_begin, os_morning_end, os_afternoon_begin, os_afternoon_end FROM t_calendar_school WHERE cs_date BETWEEN pFromDate AND pThruDate;
declare continue handler FOR sqlstate '02000' SET done = 1;
 
[...]
 
repeat
        fetch cCompteJoursinscription INTO vCsDate, vOsMorningBegin, vOsMorningEnd, vOsAfternoonBegin, vOsAfternoonEnd;
        IF NOT done then
	      SET cpt = cpt + 1;
            IF (vOsMorningBegin = 1 OR vOsMorningEnd = 1 OR
                vOsAfternoonBegin = 1 OR vOsAfternoonEnd = 1) then
                SET vNbJoursInscriptions = vNbJoursInscriptions +1;
            end IF;
            SET vNbJoursOuvres = 0;
            SET vIsDayOff = is_day_off(vCsDate);
            IF (vIsDayOff = false) then
                SET vNbJoursOuvres = vNbJoursOuvres +1;
            end IF;
	      SET vPourcentPresence = vNbJoursInscriptions/vNbJoursOuvres)*100;
            IF (vPourcentPresence >= vPresenceThreshold) then
                IF (vRoundDown = true) then
                    SET vMontantReduction = floor(vAmount * vDiscountRatio);
                else
                    SET vMontantReduction = ceil(vAmount * vDiscountRatio);
                end IF;
                SET vAmount = vAmount - vMontantReduction;
            end IF;
        else 
            call debug("ton curseur est naze !");
        end IF;
    until done end repeat;
mais là je n'ai plus rien du tout dans ma table de debug (elle est rempli par la procédure debug) même lorsque les appels sont fait avant ou après la boucle...

PS : la dernière trace de debug (celle dans le else) ne t'es pas destinée mais à moi dans le sens : "t'es trop c*n t'as pas compris ce qu'il t'a dit le monsieur"

EDIT : si je ne voyais rien c'est que ma requête était mal faite au temps pour moi.... Par contre mon compteur de passages dans la boucle est toujours à 0 et j'ai toujours la trace que mon curseur est naze....
__________________
[/HS]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h11   #11
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
question est ce qu'il y aurait pas un truc qui mettrait done à 1 avant de rentrer dans le repeat?
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h14   #12
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
je viens de (re-re-re-re) vérifier et en fait il se trouve que je n'ai pas de données pour cette période... Je teste sur une période où j'ai des données et je te tiens au courant.

Désolé pour cette erreur de débutant....
__________________
[/HS]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h19   #13
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
bon c'était pas ça non plus...
j'ai toujours le même problème mais cette fois je suis sûr d'avoir des données
(j'ai exécuté la requête du curseur en remplaçant les variables par les valeurs retournées lors de la précédente exécution de mon curseur et j'ai bien des données...)

pour répondre à ta question vu que je ne sais pas ce qui pourrait faire passer done à 1 je ne sais pas...
__________________
[/HS]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h20   #14
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
recherche done dans le texte de ta procédure pour voir où il apparait

pour vérifier ton curseur simple exécute juste la requête pour voir ce qu'elle retourne ^^
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h11   #15
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
Citation:
Envoyé par ericd69 Voir le message
recherche done dans le texte de ta procédure pour voir où il apparait

pour vérifier ton curseur simple exécute juste la requête pour voir ce qu'elle retourne ^^
pour vérifier le curseur c'est ce que j'ai fait et ça m'a retourné des résultats...
quant au handler continue done c'est moi qui l'ai déclaré et utilisé donc il n'apparaît que dans mes modifs et donc que dans le parcours du curseur (j'ai re-vérifié)...
__________________
[/HS]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h18   #16
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
tu mets bien avant le repeat:
Code sql :
open cCompteJoursinscription;
et après la boucle:
Code sql :
close cCompteJoursinscription;
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h21   #17
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
oui
voilà le code :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
-- déclaration : 
declare done bool DEFAULT 0;
declare cCompteJoursInscription cursor FOR SELECT cs_date, os_morning_begin, os_morning_end, os_afternoon_begin, os_afternoon_end FROM t_calendar_school WHERE cs_date BETWEEN pFromDate AND pThruDate;
declare continue handler FOR NOT FOUND SET done = 1;
 
-- parcours :
open cCompteJoursInscription;
    repeat
        fetch cCompteJoursInscription INTO vCsDate, vOsMorningBegin, vOsMorningEnd, vOsAfternoonBegin, vOsAfternoonEnd;
        IF NOT done then
	      SET cpt = cpt + 1;
            IF (vOsMorningBegin = 1 OR vOsMorningEnd = 1 OR
                vOsAfternoonBegin = 1 OR vOsAfternoonEnd = 1) then
                SET vNbJoursInscriptions = vNbJoursInscriptions +1;
            end IF;
            SET vNbJoursOuvres = 0;
            SET vIsDayOff = is_day_off(vCsDate);
            IF (vIsDayOff = false) then
                SET vNbJoursOuvres = vNbJoursOuvres +1;
            end IF;
	      SET vPourcentPresence = (vNbJoursInscriptions/vNbJoursOuvres)*100;
            IF (vPourcentPresence >= vPresenceThreshold) then
                IF (vRoundDown = true) then
                    SET vMontantReduction = floor(vAmount * vDiscountRatio);
                else
                    SET vMontantReduction = ceil(vAmount * vDiscountRatio);
                end IF;
                SET vAmount = vAmount - vMontantReduction;
            end IF;
        else 
            call debug("ton curseur est naze !");
        end IF;
    until done end repeat;
    close cCompteJoursInscription;
__________________
[/HS]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h31   #18
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
mets SQLSTATE '02000' au lieu de not found dans ton gestionnaire plutot
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h33   #19
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
oui NOT FOUND était un essai.... si tu regardes mes bouts de code plus haut c'est SQLSTATE '02000'
__________________
[/HS]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h21   #20
Membre régulier
 
Avatar de magicbisous-nours
 
Inscription : octobre 2005
Messages : 201
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 201
Points : 82
Points : 82
Envoyer un message via MSN à magicbisous-nours
sinon il y a un moyen de savoir pourquoi le curseur s'arrête ? (un log, quelque chose ?)
__________________
[/HS]

une pétition pour la libération des drivers matériels ici
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source
magicbisous-nours est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h44.


 
 
 
 
Partenaires

Hébergement Web