You are not logged in.
Pages: 1
Topic closed
Bonjour à tous,
J'ai un code me permettant d'afficher tous les ordinateurs et leur espace disque restant en pourcentage ainsi que ceux dont les espaces sont de -10%. Récemment j'ai ajouté des champs de recherche qui fonctionnent bien mais qui bloque la première requête. C'est à dire que j'arrive à bien faire des recherches dans mes rapports mais je n'arrive plus à afficher les espaces de -10%. Pouvez-vous m'éclairer svp?
Ci-dessous mon code:
<?php
$USEDREPLICATE=1;
$DBCONNECTION_REQUIRED=0;
//Initialisation des variables
define('GLPI_ROOT', '../../../..');
include (GLPI_ROOT . "/inc/includes.php");
//Titre du rapport
$report= new PluginReportsAutoReport("Liste des ordinateurs et espaces disque restants");
$option= array(0 => 'Votre choix', 1 => 'Espace <= 10%');
$selection= new PluginReportsArrayCriteria($report,'espace','<b>Espace disque</b>',$option);
//Champs de recherches
$entites = new PluginReportsDropdownCriteria($report, 'glpi_computers.id', 'glpi_computers', '<b>Entités</b> <br/>(<i>Recherchez<br/>les ordinateurs<br/> par leur nom</i>)');
$recherche= new PluginReportsTextCriteria($report, 'glpi_computermodels.name', '<b>Lequel recherchez-vous?</b> <br/>(<i>Entrez uniquement le modèle <br/>de l\'ordinateur recherché ou <br/>un mot clé du modèle</i>)');
//Affichage des champs
$report->displayCriteriasForm();
//Définition des colonnes de l'affichage
$report->setColumns(array(new PluginReportsColumn('Inventaire_ordinateurs', "Inventaire_ordinateurs"), new PluginReportsColumn('Entités_ordinateurs', "Entités_ordinateurs"), new PluginReportsColumn('Ordinateurs', "Ordinateurs"), new PluginReportsColumn('OS', "OS"), new PluginReportsColumn('Version_OS', "Version_OS"), new PluginReportsColumn('No_série_ordinateurs', "No_série_ordinateurs"), new PluginReportsColumn('Modèles_ordinateurs', "Modèles_ordinateurs"), new PluginReportsColumn('Utilisateurs', "Utilisateurs"), new PluginReportsColumn('Type_disque', "Type_disque"), new PluginReportsColumn('Pourcentage_restant', "Pourcentage_restant")));
//Requête à exécuter
$query="SELECT DISTINCT glpi_computers.otherserial AS Inventaire_ordinateurs, glpi_entities.name AS Entités_ordinateurs, glpi_computers.name AS Ordinateurs, glpi_operatingsystems.name AS OS, glpi_operatingsystemversions.name AS Versions_OS, glpi_computers.serial AS No_série_ordinateurs, glpi_computermodels.name AS Modèles_ordinateurs, glpi_computers.contact AS Utilisateurs, glpi_computerdisks.name AS Type_disque, ((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize) AS Pourcentage_restant
FROM glpi_computers
JOIN glpi_computermodels ON glpi_computermodels.id=glpi_computers.computermodels_id
JOIN glpi_operatingsystems ON glpi_operatingsystems.id=glpi_computers.operatingsystems_id
JOIN glpi_operatingsystemversions ON glpi_operatingsystemversions.id=glpi_computers.operatingsystemversions_id
JOIN glpi_computerdisks ON glpi_computerdisks.computers_id=glpi_computers.id
JOIN glpi_entities ON glpi_entities.id=glpi_computerdisks.entities_id
WHERE 1=1 ";
switch ($selection->getParameterValue()){
//Espace disque moins de 10%
case 1:
$query .=" AND ((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize)<=10";
break;
}
//Exécution d'une recherche
if ($report->criteriasValidated()){
$query .= $report->addSqlCriteriasRestriction();
}
$report->setGroupBy('Inventaire_ordinateurs');
$report->setSqlRequest($query);
$report->execute();
Je pense que c'est la partie "if" qui le bloque. Merci d'avance pour vos réponses
Versions:
plugin reports 1.10
GLPI 9.1
Last edited by miss (2017-08-17 14:28:56)
Offline
Bonjour,
avez vous essayé de voir la requète en mode debug ou avec un
echo "<br/>".$query."<br/>";
vous n'avez pas d'espace après le AND ((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize)<=10 il est possible que le critère ajoute le and juste après et crée une erreur de syntaxe mysql.
WHERE 1=1 AND ((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize)<=10AND espace='1' AND glpi_computers.id='7262'
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Merci. Mais le résultat ne change pas.
Je ne sais pas comment envoyer une image sur le forum pour montrer ce que j'obtiens
Si non j'ai ceci en mode debug:
SELECT DISTINCT glpi_computers.otherserial AS Inventaire_ordinateurs, glpi_entities.name AS Entités_ordinateurs, glpi_computers.name AS Ordinateurs, glpi_operatingsystems.name AS OS, glpi_operatingsystemversions.name AS Versions_OS, glpi_computers.serial AS No_série_ordinateurs, glpi_computermodels.name AS Modèles_ordinateurs, glpi_computers.contact AS Utilisateurs, glpi_computerdisks.name AS Type_disque, ((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize) AS Pourcentage_restant FROM glpi_computers JOIN glpi_computermodels ON glpi_computermodels.id=glpi_computers.computermodels_id JOIN glpi_operatingsystems ON glpi_operatingsystems.id=glpi_computers.operatingsystems_id JOIN glpi_operatingsystemversions ON glpi_operatingsystemversions.id=glpi_computers.operatingsystemversions_id JOIN glpi_computerdisks ON glpi_computerdisks.computers_id=glpi_computers.id JOIN glpi_entities ON glpi_entities.id=glpi_computerdisks.entities_id WHERE 1=1 AND((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize)<=10 AND espace='1'
Last edited by miss (2017-08-17 11:43:50)
Offline
une fois le problème d'espace résolu, il vous reste un problème :
$selection= new PluginReportsArrayCriteria($report,'espace','<b>Espace disque</b>',$option);
ça vous ajoute dans la requete ( avec le $selection= new PluginReportsArrayCriteria($report,'espace','<b>Espace disque</b>',$option);)
AND espace='1'
en plus de votre requete ajoutée par le switch.
vous n'avez jamais défini d'alias pour espace dans votre query.
il faut indiquer :
$selection= new PluginReportsArrayCriteria($report,'1','<b>Espace disque</b>',$option);)
(replacer espace par 1) ce qui fait que 1=1 est toujours vrai. le filtre est assuré par la clause ajoutée par le "switch".
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
J'avoue que je ne comprends pas grand chose.
Lorsque j'indique cette ligne: $selection= new PluginReportsArrayCriteria($report,'1','<b>Espace disque</b>',$option), le résultat change. Le champ de sélection change et prend comme nom 1
Offline
<?php
$USEDREPLICATE=1;
$DBCONNECTION_REQUIRED=0;
//Initialisation des variables
define('GLPI_ROOT', '../../../..');
include (GLPI_ROOT . "/inc/includes.php");
//Titre du rapport
$report= new PluginReportsAutoReport("Liste des ordinateurs et espaces disque restants");
$option= array(0 => 'Votre choix', 1 => 'Espace <= 10%');
$selection= new PluginReportsArrayCriteria($report,'1','<b>Espace disque</b>',$option);
//Champs de recherches
$entites = new PluginReportsDropdownCriteria($report, 'glpi_computers.id', 'glpi_computers', '<b>Entites</b> <br/>(<i>Recherchez<br/>les ordinateurs<br/> par leur nom</i>)');
$recherche= new PluginReportsTextCriteria($report, 'glpi_computermodels.name', '<b>Lequel recherchez-vous?</b> <br/>(<i>Entrez uniquement le modele <br/>de l\'ordinateur recherche ou <br/>un mot cle du modèle</i>)');
//Affichage des champs
$report->displayCriteriasForm();
//Definition des colonnes de l'affichage
$report->setColumns(array(new PluginReportsColumn('Inventaire_ordinateurs', "Inventaire_ordinateurs"), new PluginReportsColumn('Entites_ordinateurs', "Entites_ordinateurs"), new PluginReportsColumn('Ordinateurs', "Ordinateurs"), new PluginReportsColumn('OS', "OS"), new PluginReportsColumn('Version_OS', "Version_OS"), new PluginReportsColumn('No_serie_ordinateurs', "No_serie_ordinateurs"), new PluginReportsColumn('Modeles_ordinateurs', "Modeles_ordinateurs"), new PluginReportsColumn('Utilisateurs', "Utilisateurs"), new PluginReportsColumn('Type_disque', "Type_disque"), new PluginReportsColumn('Pourcentage_restant', "Pourcentage_restant")));
//Requête à executer
$query="SELECT DISTINCT glpi_computers.otherserial AS Inventaire_ordinateurs, glpi_entities.name AS Entites_ordinateurs, glpi_computers.name AS Ordinateurs, glpi_operatingsystems.name AS OS, glpi_operatingsystemversions.name AS Versions_OS, glpi_computers.serial AS No_serie_ordinateurs, glpi_computermodels.name AS Modeles_ordinateurs, glpi_computers.contact AS Utilisateurs, glpi_computerdisks.name AS Type_disque, ((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize) AS Pourcentage_restant
FROM glpi_computers
JOIN glpi_computermodels ON glpi_computermodels.id=glpi_computers.computermodels_id
JOIN glpi_operatingsystems ON glpi_operatingsystems.id=glpi_computers.operatingsystems_id
JOIN glpi_operatingsystemversions ON glpi_operatingsystemversions.id=glpi_computers.operatingsystemversions_id
JOIN glpi_computerdisks ON glpi_computerdisks.computers_id=glpi_computers.id
JOIN glpi_entities ON glpi_entities.id=glpi_computerdisks.entities_id
WHERE 1=1 ";
switch ($selection->getParameterValue()){
//Espace disque moins de 10%
case 1:
$query .=" AND ((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize)<=10 ";
break;
}
//Execution d'une recherche
if ($report->criteriasValidated()){
$query .= $report->addSqlCriteriasRestriction();
}
$report->setGroupBy('Inventaire_ordinateurs');
$report->setSqlRequest($query);
$report->execute();
?>
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Je vous remercie, maintenant j'ai le résultat qu'il faut. Mais pourriez-vous m'expliquer pourquoi espace devient 1? merci
Je le demande parce que dans un autre rapport j'ai deux cas dans le switch. Le 1er cas affiche les ordinateurs sous contrat de moins d'1 mois et le second ceux sous contrat de moins de 3 mois.
En mode debug j'ai ceci:
SELECT DISTINCT glpi_computers.otherserial AS Numéro_inventaire, glpi_entities.completename AS Entités_ordinateurs, glpi_computers.name AS Ordinateurs, glpi_operatingsystems.name AS OS, glpi_operatingsystemversions.name AS Version_OS, glpi_computermodels.name AS Modèles_ordinateurs, glpi_computers.serial AS No_série_ordinateurs, glpi_computers.contact AS Utilisateurs, glpi_contracts.name AS Contrats, glpi_contracts.num AS No_série_contrats, glpi_contracttypes.name AS Type_contrat, DATE_ADD(begin_date, INTERVAL duration MONTH) AS Fin_contrat FROM glpi_computers JOIN glpi_entities ON glpi_entities.id=glpi_computers.entities_id JOIN glpi_operatingsystems ON glpi_operatingsystems.id=glpi_computers.operatingsystems_id JOIN glpi_operatingsystemversions ON glpi_operatingsystemversions.id=glpi_computers.operatingsystemversions_id JOIN glpi_computermodels ON glpi_computermodels.id=glpi_computers.computermodels_id JOIN glpi_contracts_items ON glpi_contracts_items.items_id=glpi_computers.id and glpi_contracts_items.itemtype='Computer' JOIN glpi_contracts ON glpi_contracts.id=glpi_contracts_items.contracts_id JOIN glpi_contracttypes ON glpi_contracttypes.id=glpi_contracts.contracttypes_id WHERE 1=1 AND DATE_ADD(glpi_contracts.begin_date, INTERVAL glpi_contracts.duration MONTH)>NOW() AND DATE_ADD(glpi_contracts.begin_date, INTERVAL glpi_contracts.duration MONTH)< DATE_ADD(NOW(), INTERVAL 3 MONTH) AND délai='2'
ici c'est 2 parce que j'ai choisi le 2nd cas mais comme pour espace, je ne peux pas remplacer délai par 1 ou 2. Comment faire svp, merci
Last edited by miss (2017-08-17 12:16:40)
Offline
la ligne $report->addSqlCriteriasRestriction(); ajoute les 3 filtres du formulaire de selection, même si vous avez géré "manuellement" AND((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize)<=10
donc dans la clause WHERE 1=1
$entites ajoute AND glpi_computers.id='7262'
$recherche ajoute AND glpi_computermodels.name LIKE '%vm%'
$selection ajoute AND espace='1'
comme vous avez déjà géré la recherche par espace disponible, il faut neutraliser l'effet de $selection.
si on appelle $selection '1' au ieu de 'espace' :
$selection ajoute AND '1'='1' ce qui n'a pas d'effet, c'est ce qu'on voulait.
EDIT :
si on met une chaine vide '' à la place de 'espace' $selection n'ajoute rien c'est ce qu'on voulait(en plus simple).
Last edited by LaDenrée (2017-08-17 12:36:06)
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
D'accord je comprends. Et dans la situation où j'ai 2 cas dans le switch? merci
Last edited by miss (2017-08-17 12:26:55)
Offline
c'est tout bête : il ne faut pas mettre de nom mais simplement '' (2 simples apostrophes).
ça marche aussi pour le cas espace ci dessus. (je n'avais pas bien vu ce truc dans le code).
EDIT : ça n'ajoute plus dans la query mais $recherche->getparametervalue reste vide ce n'etait pas la bonne solution.
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Lorsque je mets de simples apostrophes, j'ai pas le résultat qu'il faut. Je n'ai peut-être pas bien compris. Merci
Offline
oui, je l'ai vu après : quand on ne met pas de titre ça n'ajoute rien dans le sql (bien) mais getParameterValue() ne renvoie rien non plus (pas bien).
je vous propose donc le contournement ci dessous :
//Execution d'une recherche
if ($report->criteriasValidated()){
//met la valeur dans la recherche pour avoir une clause where toujours vraie pour $selection;
$selection->setsqlfield($selection->getParameterValue());
$query .= $report->addSqlCriteriasRestriction();
}
c'est l'équivalent du 1="1" sauf que le 1 n'est pas en dur mais change en fonction de votre selection.
ça vous permet donc d'avoir d'autres choix dans le dropdown :
<?php
$USEDREPLICATE=1;
$DBCONNECTION_REQUIRED=0;
//Initialisation des variables
define('GLPI_ROOT', '../../../..');
include (GLPI_ROOT . "/inc/includes.php");
//Titre du rapport
$report= new PluginReportsAutoReport("Liste des ordinateurs et espaces disque restants");
$option= array(0 => 'Votre choix', 1 => 'Espace <= 10%',2=> 'Espace <= 20%');
$selection= new PluginReportsArrayCriteria($report,'espace','<b>Espace disque</b>',$option);
//Champs de recherches
$entites = new PluginReportsDropdownCriteria($report, 'glpi_computers.id', 'glpi_computers', '<b>Entites</b> <br/>(<i>Recherchez<br/>les ordinateurs<br/> par leur nom</i>)');
$recherche= new PluginReportsTextCriteria($report, 'glpi_computermodels.name', '<b>Lequel recherchez-vous?</b> <br/>(<i>Entrez uniquement le modele <br/>de l\'ordinateur recherche ou <br/>un mot cle du modèle</i>)');
//Affichage des champs
$report->displayCriteriasForm();
//Definition des colonnes de l'affichage
$report->setColumns(array(new PluginReportsColumn('Inventaire_ordinateurs', "Inventaire_ordinateurs"), new PluginReportsColumn('Entites_ordinateurs', "Entites_ordinateurs"), new PluginReportsColumn('Ordinateurs', "Ordinateurs"), new PluginReportsColumn('OS', "OS"), new PluginReportsColumn('Version_OS', "Version_OS"), new PluginReportsColumn('No_serie_ordinateurs', "No_serie_ordinateurs"), new PluginReportsColumn('Modeles_ordinateurs', "Modeles_ordinateurs"), new PluginReportsColumn('Utilisateurs', "Utilisateurs"), new PluginReportsColumn('Type_disque', "Type_disque"), new PluginReportsColumn('Pourcentage_restant', "Pourcentage_restant")));
//Requête à executer
$query="SELECT DISTINCT glpi_computers.otherserial AS Inventaire_ordinateurs, glpi_entities.name AS Entites_ordinateurs, glpi_computers.name AS Ordinateurs, glpi_operatingsystems.name AS OS, glpi_operatingsystemversions.name AS Versions_OS, glpi_computers.serial AS No_serie_ordinateurs, glpi_computermodels.name AS Modeles_ordinateurs, glpi_computers.contact AS Utilisateurs, glpi_computerdisks.name AS Type_disque, ((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize) AS Pourcentage_restant
FROM glpi_computers
JOIN glpi_computermodels ON glpi_computermodels.id=glpi_computers.computermodels_id
JOIN glpi_operatingsystems ON glpi_operatingsystems.id=glpi_computers.operatingsystems_id
JOIN glpi_operatingsystemversions ON glpi_operatingsystemversions.id=glpi_computers.operatingsystemversions_id
JOIN glpi_computerdisks ON glpi_computerdisks.computers_id=glpi_computers.id
JOIN glpi_entities ON glpi_entities.id=glpi_computerdisks.entities_id
WHERE 1=1 ";
switch ($selection->getParameterValue()){
//Espace disque moins de 10%
case 1:
$query .=" AND ((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize)<=10 ";
break;
case 2:
$query .=" AND ((glpi_computerdisks.freesize*100)/glpi_computerdisks.totalsize)<=20 ";
break;
}
//Execution d'une recherche
if ($report->criteriasValidated()){
//neutralise l'action de selection;
$selection->setsqlfield($selection->getParameterValue());
$query .= $report->addSqlCriteriasRestriction();
}
$report->setGroupBy('Inventaire_ordinateurs');
$report->setSqlRequest($query);
$report->execute();
?>
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Merci beaucoup. Tout fonctionne bien
Offline
Pages: 1
Topic closed