[Oracle & PHP] boucle if dans while : problème

boucle if dans while : problème [Oracle & PHP] - SQL/NoSQL - Programmation

Marsh Posté le 15-06-2009 à 17:58:11    

Bonjour,  
 
Je bosse sur la mise en plus d'un système de facturation, et j'ai un problème de boucle. Je vous explique : je récupère des données dans des variables dans un script, et les lis au moyen d'un while ($ligne=oci_fetch_array($ma_requete));  
 
Cette boucle marche niquel, tous mes résultats s'affichent dans un tableau que j'ai mis pour vérifier que ma sélection se passe bien.
 
Après cette requête, j'insère ces données dans une nouvelle table. L'insertion marche.  
 
Maintenant, je veux récupérer la valeur de la TVA pour chacuns de mes articles (de chacune de mes lignes sélectionnées plus haut, au moyen du while). Pour avoir un total de la TVA 19.6, et de celle en 5.5.
 
J'ajoute donc des boucles if() dans ma boucle while, et là, problème : ça ne boucle que sur la même ligne, mais le bon nombre de fois.
 
L'exemple que je prend contient 18 articles en TVA 19.6, et un en 5.5. La ligne 13 (article) est la seule qui est en 5.5.
 
Voilà la partie qui semble poser problème :

Code :
  1. while ($ligne=oci_fetch_array($ma_requete)) {
  2. // blabla, je fais mon affichage et ma requête d'insertion, ça marche bien
  3. // si la tva de la ligne est à 19.6, je calcule combien elle vaut
  4. if ($tva==0) {
  5.  $taux196=oci_parse($conn,"SELECT LINE_NO, SALESPRICE, (SALESPRICE/((VAT_RATE/100)+1))*(VAT_RATE/100) AS TX196
  6.  FROM DATA_OWNER.INV_LINES li, DATA_OWNER.VAT_CODE co
  7.  WHERE li.VAT_CODE=co.VAT_CODE
  8.  AND co.VAT_CODE='$tva'
  9.  AND INV_NO='$no_receipt'" ) or die ("erreur dans le calcul de TVA 19.6 par ligne" );
  10.  oci_execute($taux196,OCI_DEFAULT);
  11.  $commited = oci_commit($conn);
  12.  $tx0 = oci_fetch_array($taux196);
  13.  $tx196 = $tx0["TX196"];
  14.  $line = $tx0["LINE_NO"];
  15.  $prix = $tx0["SALESPRICE"];
  16.  $total_tx196=$total_tx196+$tx196;
  17.  echo "tx196 = $tx196";
  18.  echo " ; total_tx196 = $total_tx196";
  19.  echo "<h1>$line, $prix</h1>";
  20. }
  21. // si elle est à 5.5, pareil      
  22. if ($tva==1) {
  23.  $taux55=oci_parse($conn,"SELECT (SALESPRICE/((VAT_RATE/100)+1))*(VAT_RATE/100) AS TX55
  24.  FROM DATA_OWNER.INV_LINES li, DATA_OWNER.VAT_CODE co
  25.  WHERE li.VAT_CODE=co.VAT_CODE
  26.  AND co.VAT_CODE='$tva'
  27.  AND INV_NO='$no_receipt'" ) or die ("erreur dans le calcul de TVA 5.5 par ligne" );
  28.  oci_execute($taux55,OCI_DEFAULT);
  29.  $commited = oci_commit($conn);
  30.  $tx1 = oci_fetch_array($taux55);
  31.  $tx55 = $tx1["TX55"];
  32.  $line = $tx1["LINE_NO"];
  33.  $prix = $tx1["SALESPRICE"];
  34.  $total_tx55=$total_tx55+$tx55;
  35.  echo "tx55 = $tx55";
  36.  echo " ; total_tx55 = $total_tx55";
  37.  echo "<h1>$line, $prix</h1>"
  38. }
  39. // sinon aucun calcul, la TVA est à 0    
  40. if ($tva!=0 && $tva!=1) {
  41.  echo 'TVA 0';
  42. }
  43. }


Bon je sais que je peux faire un if/elseif/else, c'est ce que j'avais mis au départ, et le résultat est le même.
 
J'ai mis "<h1>$line, $prix</h1>" pour voir si la boucle bouclait. Oui, elle boucle bien 19 fois, mais toujours sur la même ligne : la 6ème (pourquoi 6 ? oô après tests avec d'autres valeurs, il se trouve que ça boucle aussi sur la 1, la 4, enfin ça dépend.), et ajoute à chaque fois le même montant à total_tx196. Donc vu que le premier résultat est 81, le total s'incrémente de 81 à chaque fois. Je me retrouve donc avec 18 lignes à 81.
 
Pour l'unique ligne à 5.5, le résultat est bon, vu que de toute manière le problème semble se poser dès qu'il s'agit de boucler sur plusieurs lignes.
 
A savoir, ma requête marche très bien sous SQL*Plus, regardez le résultat que je devrais avoir (en ne selectionnant que la TVA à 19.6) :
SQL> SELECT LINE_NO, (SALESPRICE/((VAT_RATE/100)+1))*(VAT_RATE/100) AS TX196 FROM DATA_OWNER.INV_LINES li, DATA_OWNER.VAT_CODE co WHERE li.VAT_CODE=co.VAT_CODE AND co.VAT_CODE=0 AND INV_NO=112815 ORDER BY LINE_NO;

Code :
  1. LINE_NO     TX196
  2. --------- ---------
  3.         1 1294.6488
  4.         2  490.8194
  5.         3  490.8194
  6.         4 344.14716
  7.         5 1130.7692
  8.         6  81.77592
  9. ..... ect


 
Et ce que j'ai à l'écran (j'ai initialisé total_tx196 et total_tx55 à 0 au tout début de mon script) :
 
tx196 = 81.77592 ; total_tx196 = 81.77592
6, 499
tx196 = 81.77592 ; total_tx196 = 163.55184
6, 499
tx196 = 81.77592 ; total_tx196 = 245.32775
6, 499
tx196 = 81.77592 ; total_tx196 = 327.10367
6, 499
tx196 = 81.77592 ; total_tx196 = 408.87959
6, 499
tx196 = 81.77592 ; total_tx196 = 490.65551
6, 499
tx196 = 81.77592 ; total_tx196 = 572.43143
6, 499
tx196 = 81.77592 ; total_tx196 = 654.20735
6, 499
tx196 = 81.77592 ; total_tx196 = 735.98327
6, 499
...
tx55 = 10.37441 ; total_tx55 = 10.37441  
13, 199
tx196 = 81.77592 ; total_tx196 = 1063.08695
6, 499
 
Et il m'affiche ça x fois selon le nombre de lignes de ma requête de selection : ça peux être 1 comme 100.
 
Un problème d'initialisation ? J'ai essayé de tourner le problème dans tous les sens, avec des for et des switch/case, mais le résultats est le même : ça boucle toujours sur la même ligne èé/
 
Si quelqu'un a une idée =)
 
Merci d'avance !

Message cité 1 fois
Message édité par Niwade le 15-06-2009 à 17:59:04
Reply

Marsh Posté le 15-06-2009 à 17:58:11   

Reply

Marsh Posté le 17-06-2009 à 12:16:48    

Niwade a écrit :


 
  $tx0 = oci_fetch_array($taux196);
 


 
Bonjour,
 
ça fait longtemps que je n'ai pas fait de php, mais tu ne devrais pas boucler  la dessus:
 
 "while($tx0 = oci_fetch_array($taux196))"
 
Parce que si ta requête retourne plusieurs valeurs, j'ai l'impression que tu prends tjrs la première.
 
+


Message édité par Seb39 le 17-06-2009 à 12:17:29
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed