Problème d'incrémentation

Fermé
zerdg Messages postés 86 Date d'inscription jeudi 21 mai 2015 Statut Membre Dernière intervention 30 novembre 2017 - Modifié par zerdg le 8/06/2015 à 15:34
zerdg Messages postés 86 Date d'inscription jeudi 21 mai 2015 Statut Membre Dernière intervention 30 novembre 2017 - 10 juin 2015 à 12:52
Bonjour,
Ayant voulut alléger mon code je me suis dis que je pouvais fusionner plusieur boucle dans une seule et donc gagner de la place et réduire les ressources que prend le script
voici la boucle
$ligne1= 3;//correspond à la ligne où la formule est écrite
$ligne2=$ligne1+4;             
$a=2;//correspond à la ligne où la formule doit chercher la chaine de caractère
while($data2 = $req3->fetch(PDO::FETCH_ASSOC)){

    $heure1 =4;//initialisel'heure pour la chaine de caractère
    $heure2 =5;//
    $colonne  = 'A';//correspond à la colonne où la liste d'identifiant est écrite
    $colonne2 = 'B';//correspond à la colonne où la formule  est écrite
    $colonne3 = 'A';
 $colonne4 = 'B';
  
       foreach($data2 as $value){
 
           $sheet4->setCellValue($colonne.$ligne1, $value);//liste des identifiant
            $sheet4->setCellValue($colonne3.$ligne2, $value);
           for ($i=0; $i <=17 ; $i++) { 


            $sheet4->setCellValue( $colonne2++.$ligne1,'=COUNTIF(\'tout à fait\'!Q'.$a.',"*'.$heure1++.'H30*")',PHPExcel_Cell_DataType::TYPE_FORMULA);//la formule qui cherche dans la feuille tout à fait l'$heure1
            $sheet4->setCellValue( $colonne2++.$ligne1,'=COUNTIF(\'tout à fait\'!Q'.$a.',"*'.$heure2++.'H00*")',PHPExcel_Cell_DataType::TYPE_FORMULA);//''''''''''''''''''''''''''''''''''''''''''''''''''' l'$heure2
            $sheet4->setCellValue( $colonne4++.$ligne2,'=COUNTIF(\'tout à fait\'!R'.$a.',"*'.--$heure1.'H30*")',PHPExcel_Cell_DataType::TYPE_FORMULA);
            $sheet4->setCellValue( $colonne4++.$ligne2,'=COUNTIF(\'tout à fait\'!R'.$a.',"*'.--$heure2.'H00*")',PHPExcel_Cell_DataType::TYPE_FORMULA);        
    

              }
     $colonne2++;
     $colonne4++;
     $heure1++;
     $heure2++;
    }
  $ligne1++;
  $ligne2++;
 $a++;

le code entier permet d'exporter une base de donnée dans un fichier excel ce qui donne https://www.cjoint.com/c/EFinFFJk1ne
la boucle ci-dessus devrais normalement créer deux tableaux dans la feuille horaire_ oui_régulier mais là le premier mange le début du second comment puis-je faire?
merci d'avance

6 réponses

jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
8 juin 2015 à 15:50
Bonjour,

Pour nous aider à comprendre, le code d'origine que tu as voulu simplifié serait le bien venue.

Je suppose que, dans ton code actuel ..
$ligne .. correspond à la première ligne où écrire ton tableau 1 ... et $ligne2 ..; celle de ton tableau 2.
Que se passe t-il .. si ton tableau 1 comporte plus de 4 lignes ?
Il va forcément déborder sur ton second tableau....



0
zerdg Messages postés 86 Date d'inscription jeudi 21 mai 2015 Statut Membre Dernière intervention 30 novembre 2017 2
10 juin 2015 à 10:45
UP
0
zerdg Messages postés 86 Date d'inscription jeudi 21 mai 2015 Statut Membre Dernière intervention 30 novembre 2017 2
8 juin 2015 à 15:58
le code que j'ai voulut simplifier (ce que j'ai tenté n'ai pas le résultat final que je souhaite atteindre):
//lundi
$ligne1= 3;//correspond à la ligne où la formule est écrite
$a=2;//correspond à la ligne où la formule doit chercher la chaine de caractère
while($data2 = $req3->fetch(PDO::FETCH_ASSOC)){
    $heure1 =4;//incrémente l'heure pour la chaine de caractère
    $heure2 =5;//
    $colonne  = 'A';//correspond à la colonne où la liste d'identifiant est écrite
    $colonne2 = 'B';//correspond à la colonne où la formule  est écrite
  
		     foreach($data2 as $value){
		        $sheet4->setCellValue($colonne.$ligne1, $value);//liste des identifiant
			        for ($i=0; $i <=17 ; $i++) { 
				        $sheet4->setCellValue( $colonne2++.$ligne1,'=COUNTIF(\'tout à fait\'!Q'.$a.',"*'.$heure1++.'H30*")',PHPExcel_Cell_DataType::TYPE_FORMULA);//la formule qui cherche dans la feuille tout à fait l'$heure1
				        $sheet4->setCellValue( $colonne2++.$ligne1,'=COUNTIF(\'tout à fait\'!Q'.$a.',"*'.$heure2++.'H00*")',PHPExcel_Cell_DataType::TYPE_FORMULA);//''''''''''''''''''''''''''''''''''''''''''''''''''' l'$heure2
				

				    	     }
				 $colonne2++;
				}
		$ligne1++;
	$a++;

		   

}
//mardi
$ligne2=$ligne1+3;
$b = 2;
while($data2 = $req4->fetch(PDO::FETCH_ASSOC)){
	$heure1 =4;
	$heure2 =5; 
	$colonne  = 'A';
	$colonne2 = 'B';
     		foreach($data2 as $value){

		        $sheet4->setCellValue($colonne.$ligne2, $value);
			        for ($i=0; $i <=17 ; $i++) { 
			        $sheet4->setCellValue( $colonne2++.$ligne2,'=COUNTIF(\'tout à fait\'!R'.$b.',"*'.$heure1++.'H30*")',PHPExcel_Cell_DataType::TYPE_FORMULA);
			        $sheet4->setCellValue( $colonne2++.$ligne2,'=COUNTIF(\'tout à fait\'!R'.$b.',"*'.$heure2++.'H00*")',PHPExcel_Cell_DataType::TYPE_FORMULA);        }


		        $colonne2++;
		}
		$ligne2++;
		$b++;                                      
}

$ligne3=$ligne2+3;
$c=2;
while($data2 = $req5->fetch(PDO::FETCH_ASSOC)){
    $heure1 =4;
    $heure2 =5; 
                                                        $colonne  = 'A';
                                                        $colonne2 = 'B';
     foreach($data2 as $value){

        $sheet4->setCellValue($colonne.$ligne3, $value);
        for ($i=0; $i <=17 ; $i++) { 
        $sheet4->setCellValue( $colonne2++.$ligne3,'=COUNTIF(\'tout à fait\'!S'.$c.',"*'.$heure1++.'H30*")',PHPExcel_Cell_DataType::TYPE_FORMULA);
        $sheet4->setCellValue( $colonne2++.$ligne3,'=COUNTIF(\'tout à fait\'!S'.$c.',"*'.$heure2++.'H00*")',PHPExcel_Cell_DataType::TYPE_FORMULA);        }


        $colonne2++;
}
$ligne3++;   
$c++;                                   
}

$ligne4=$ligne3+3;
$d=2;
while($data2 = $req6->fetch(PDO::FETCH_ASSOC)){
    $heure1 =4;
    $heure2 =5; 
                                                        $colonne  = 'A';
                                                        $colonne2 = 'B';
     foreach($data2 as $value){

        $sheet4->setCellValue($colonne.$ligne4, $value);
        for ($i=0; $i <=17 ; $i++) { 
        $sheet4->setCellValue( $colonne2++.$ligne4,'=COUNTIF(\'tout à fait\'!T'.$d.',"*'.$heure1++.'H30*")',PHPExcel_Cell_DataType::TYPE_FORMULA);
        $sheet4->setCellValue( $colonne2++.$ligne4,'=COUNTIF(\'tout à fait\'!T'.$d.',"*'.$heure2++.'H00*")',PHPExcel_Cell_DataType::TYPE_FORMULA);        }


        $colonne2++;
}
$ligne4++;
$d++;                                      
}

$ligne5=$ligne4+3;
$e=2;
while($data2 = $req7->fetch(PDO::FETCH_ASSOC)){
    $heure1 =4;
    $heure2 =5; 
                                                        $colonne  = 'A';
                                                        $colonne2 = 'B';
     foreach($data2 as $value){

        $sheet4->setCellValue($colonne.$ligne5, $value);
        for ($i=0; $i <=17 ; $i++) { 
        $sheet4->setCellValue( $colonne2++.$ligne5,'=COUNTIF(\'tout à fait\'!U'.$e.',"*'.$heure1++.'H30*")',PHPExcel_Cell_DataType::TYPE_FORMULA);
        $sheet4->setCellValue( $colonne2++.$ligne5,'=COUNTIF(\'tout à fait\'!U'.$e.',"*'.$heure2++.'H00*")',PHPExcel_Cell_DataType::TYPE_FORMULA);        }


        $colonne2++;
}
$e++;
$ligne5++;                                      
}

ça marche mais c'est long et ça prend de la place pour rien du coup
0
jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
10 juin 2015 à 11:17
Tes tableaux semblent être identique (hormis le fait que tu sembles faire plusieurs requêtes différentes.. en fonction du jour....)

A mon avis.. la première chose à regarder serait :
Ne peut on pas faire UNE SEULE requête ?

Pourrais tu nous fournir la structure de tes tables ainsi que les requêtes que tu as fait pour tes différents tableaux ?


0
zerdg Messages postés 86 Date d'inscription jeudi 21 mai 2015 Statut Membre Dernière intervention 30 novembre 2017 2
10 juin 2015 à 11:28
En fait si j'utilise la même requête pour chaque tableaux le 1er tableau s'affiche correctement mais pour les suivant je n'arrive pas afficher autre chose que la dernière valeur de la table du coup j'ai fait comme ça en attendant de trouver autre chose. De plus les requêtes sont identique.
Pour la structure des mes tables j'en deux dont une seule qui m'est utile ici je dois poster un fichier export ou autre chose?
les requêtes :
    $code = $_POST['code']; 
           $sql3 = 'SELECT identifiant FROM reponses where maniere = "accueil régulier" AND employeur = "oui, tout à fait"  AND code ="' .$code. '"';
                $req3 = $bdd->prepare($sql3, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
                $req3 ->execute();  
                $sql4 = 'SELECT identifiant FROM reponses where maniere = "accueil régulier"AND employeur = "oui, tout à fait"AND code ="' .$code. '"';
                $req4 = $bdd->prepare($sql4, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
                $req4 ->execute();  
                $sql5 = 'SELECT identifiant FROM reponses where maniere = "accueil régulier"AND employeur = "oui, tout à fait"AND code ="' .$code. '"';
                $req5 = $bdd->prepare($sql5, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
                $req5 ->execute();  
                $sql6 = 'SELECT identifiant FROM reponses where maniere = "accueil régulier"AND employeur = "oui, tout à fait"AND code ="' .$code. '"';
                $req6 = $bdd->prepare($sql6, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
                $req6 ->execute();  
                $sql7 = 'SELECT identifiant FROM reponses where maniere = "accueil régulier"AND employeur = "oui, tout à fait"AND code ="' .$code. '"';
                $req7 = $bdd->prepare($sql7, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
10 juin 2015 à 11:51
Tu sembles utiliser PDO pour te connecter à la BDD...
très bien.

Donc:
$code = isset($_POST['code'])?$_POST['code']:NULL; 
if($code ){
 $sql = "SELECT identifiant 
         FROM reponses 
         WHERE maniere = 'accueil régulier' 
         AND employeur = 'oui, tout à fait' 
         AND code =:code ";
$params = array(":code"=>$code);
$req3 = $bdd->prepare($sql);
$req3 ->execute($params);

// on met tous les résultat dans un array:
$arr_result = $req3->fetchall();  

// le temps des tests.. pour voir ce que contient l'array :
print_r($arr_result);

}


Ensuite, pour générer tes tableaux... il te suffit de boucler (autant de fois que tu le veux) sur l'array.
cela permet de ne faire qu'une seule connextion à ta BDD et donc.. de gagner du temps.
PS : Penses aussi.. si ce n'est pas déjà fait, à INDEXER les champs de ta table.
Principalement ceux qui servent dans ta clausse WHERE ( maniere, employeur, code).

PS2 : Dans le cas où tu serais amené à ajouter des employeurs .. il serait préférable de te faire une table dédiée ... et de ne mettre dans ta table actuelle que l' ID correspondant

tableemployeur ( id, employeur, adresse, telephone etc ....)

=> Idem pour "maniere" : tablemaniere ( id, maniere ....)

===>> Il vaut mieux travailler avec des ID (numériques) que des champs textes !
et ainsi.. ta requête se transformerait de la façon suivante (avec des jointures)
$sql = "SELECT identifiant 
         FROM reponses R
         LEFT JOIN tablemaniere M ON  M.id = R.maniere
         LEFT JOIN tableemployeurs E  ON E.id = R.employeur
         WHERE M.maniere = 'accueil régulier' 
         AND E.employeur = 'oui, tout à fait' 
         AND R.code =:code ";

0
zerdg Messages postés 86 Date d'inscription jeudi 21 mai 2015 Statut Membre Dernière intervention 30 novembre 2017 2
10 juin 2015 à 11:57
Merci je vais tester ça.
En fait je n'ai pas les droits n'y le droit de toucher à la base de donnée sinon je l'aurais modifiée depuis le début car toutes les champs sont en varchar sauf l'identifiant ce qui me limite beaucoup.
0
jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > zerdg Messages postés 86 Date d'inscription jeudi 21 mai 2015 Statut Membre Dernière intervention 30 novembre 2017
10 juin 2015 à 12:01
toutes les champs sont en varchar sauf l'identifiant ce qui me limite beaucoup.

Arf... et ce qui peu aussi expliquer tes "lenteurs" ...
0
zerdg Messages postés 86 Date d'inscription jeudi 21 mai 2015 Statut Membre Dernière intervention 30 novembre 2017 2
10 juin 2015 à 12:29
Dans l'array il y a les identidiants
0
jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
10 juin 2015 à 12:49
Donc c'est bon non ?
0
zerdg Messages postés 86 Date d'inscription jeudi 21 mai 2015 Statut Membre Dernière intervention 30 novembre 2017 2
10 juin 2015 à 12:52
Il me reste toujours le problème de la boucle que je n'arrive pas a faire en faite
0