Problème d'incrémentation
zerdg
Messages postés
86
Date d'inscription
Statut
Membre
Dernière intervention
-
zerdg Messages postés 86 Date d'inscription Statut Membre Dernière intervention -
zerdg Messages postés 86 Date d'inscription Statut Membre Dernière intervention -
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
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
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
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....
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....
zerdg
Messages postés
86
Date d'inscription
Statut
Membre
Dernière intervention
2
UP
le code que j'ai voulut simplifier (ce que j'ai tenté n'ai pas le résultat final que je souhaite atteindre):
ça marche mais c'est long et ça prend de la place pour rien du coup
//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
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 ?
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 ?
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 :
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));
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Tu sembles utiliser PDO pour te connecter à la BDD...
très bien.
Donc:
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)
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 ";