You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2017-08-17 10:29:50

miss
Member
Registered: 2017-05-05
Posts: 108

Problème de recherche-glpi [Résolu]

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 smile
Versions:
plugin reports 1.10
GLPI 9.1

Last edited by miss (2017-08-17 14:28:56)

Offline

#2 2017-08-17 11:29:15

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,287

Re: Problème de recherche-glpi [Résolu]

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

#3 2017-08-17 11:37:04

miss
Member
Registered: 2017-05-05
Posts: 108

Re: Problème de recherche-glpi [Résolu]

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

#4 2017-08-17 11:44:29

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,287

Re: Problème de recherche-glpi [Résolu]

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

#5 2017-08-17 11:56:38

miss
Member
Registered: 2017-05-05
Posts: 108

Re: Problème de recherche-glpi [Résolu]

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

#6 2017-08-17 12:02:41

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,287

Re: Problème de recherche-glpi [Résolu]

<?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

#7 2017-08-17 12:05:03

miss
Member
Registered: 2017-05-05
Posts: 108

Re: Problème de recherche-glpi [Résolu]

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

#8 2017-08-17 12:19:32

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,287

Re: Problème de recherche-glpi [Résolu]

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

#9 2017-08-17 12:26:42

miss
Member
Registered: 2017-05-05
Posts: 108

Re: Problème de recherche-glpi [Résolu]

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

#10 2017-08-17 12:34:31

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,287

Re: Problème de recherche-glpi [Résolu]

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

#11 2017-08-17 13:56:09

miss
Member
Registered: 2017-05-05
Posts: 108

Re: Problème de recherche-glpi [Résolu]

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

#12 2017-08-17 14:16:43

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,287

Re: Problème de recherche-glpi [Résolu]

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

#13 2017-08-17 14:28:10

miss
Member
Registered: 2017-05-05
Posts: 108

Re: Problème de recherche-glpi [Résolu]

Merci beaucoup. Tout fonctionne bien smile

Offline

Board footer

Powered by FluxBB