You are not logged in.
Actuellement, je n'ai trouvé aucun moyen de faire ce que je souhaite :
Trier tous mes logiciels en fonction du lieu de leur installation; Ces derniers étant installés à plusieurs reprises à des endroits différents.
Je ne sais pas si c'est fait ou prévu dans la 0.7....
En effet, nous pouvons afficher les ordinateurs et leur lieu, les ordinateurs et les logiciels dessus, tout comme afficher les logiciels, la quantité installée, puis aller voir sur quels postes.
Cependant, rien ne permet actuellement de chercher et de faire la somme d'un type de logiciel en fonction d'un lieu précis.
C'est pourquoi j'aimerai que quelqu'un m'aide à faire la requête SQL qui va bien, puis ultérieurement l'intégrer dans une page PHP pour GLPI.
Tables nécessaires :
glpi_software
glpi_computers
glpi_dropdown_location
glpi_inst_software
Champs : glpi_computers.location, glpi_dropdown_location.ID, glpi_dropdown_location.name, glpi_software.name, glpi_computers.ID, glpi_inst_software.cID, glpi_inst_software.ID, glpi_software.completename,
J'en oublie surement...
requêtes : SELECT, SUM, ORDER BY, WHERE, JOIN.... ???
Merci beaucoup pour votre aide.
Last edited by remy_d1 (2007-06-06 18:10:36)
Offline
Vous allez vite remarquer que je suis nul en SQL.
Voici tout de même une première piste :
SELECT glpi_dropdown_locations.completename, COUNT(glpi_software.name) as NbInstall
FROM glpi_dropdown_locations, glpi_software
WHERE glpi_dropdown_locations.ID=glpi_computers.location AND glpi_computers.ID=glpi_inst_software.cID AND
glpi_inst_software.license=glpi_software.ID
GROUP BY glpi_dropdown_locations.completename ORDER BY NbInstall, glpi_software_name;
Il serait peut-être bon de créer temporairement une table pour ça ?
Last edited by remy_d1 (2007-06-06 18:57:52)
Offline
Bonjour,
Si tu va dans le poste Rapport d’inventaire logiciel par poste tu as la solution a ton problème il te soufi de rajouter la table « glpi_dropdown_location » avec les liens qui vont bien
A+
Last edited by EDEOF (2007-06-15 12:50:19)
Offline
Bonjour,
Désolé j'étais très occupé ces derniers temps. Je pense aoir réussi à trouver la solution; Il faut encre que je vérifie le bon fonctionnement de mon code, mais ça a l'air de fonctionner :
<html>
<table summary="LISTING DES LOGICIELS SELON LEUR LIEU D'INSTALLATION">
<tr bgcolor=#FFFF00>
<th>Nb</th>
<th>Lieu</th>
<th ALIGN="CENTER">Nom</th>
</tr>
<?php
$cfgHote = "mon IP";
$cfgUser = "mon USER";
$cfgPass = "mon PASS";
$cfgBase = "GLPI";
$link = mysql_connect($cfgHote, $cfgUser, $cfgPass);
if (!$link) {
die('Non connecte : ' . mysql_error());
}
// Selection de la base de donnees db
$db_selected = mysql_select_db($cfgBase, $link);
if (!$db_selected) {
die ('Impossible d\'utiliser la base : ' . mysql_error());
}
// variables
$lieu = 'glpi_dropdown_locations.completename';
$nb = 'NbInstall';
$nom = 'glpi_software.name';
$sql = 'SELECT COUNT('.$nom.') AS '.$nb.', '
. $lieu.', '.$nom
. ' FROM glpi_dropdown_locations, glpi_software, glpi_computers, glpi_inst_software'
. ' WHERE glpi_dropdown_locations.ID = glpi_computers.location'
. ' AND glpi_computers.ID = glpi_inst_software.cID'
. ' AND glpi_inst_software.license = glpi_software.ID'
. ' GROUP BY '.$nom
. ' ORDER BY '.$lieu.' ,'.$nb.' DESC,'.$nom
. ' LIMIT 0 , 30000;'
;
$result = mysql_query($sql) or die( 'Erreur : ' . mysql_error() );
while($tab = mysql_fetch_array($result, MYSQL_NUM))
{
print "<tr>";
for($x=0; $x <= count($tab); $x++)
{
print "<th>";
echo $tab[$x];
print "</th>";
}
print "</tr>";
}
mysql_close($link);
?>
</table>
</html>
Offline
Bonjour
Je ne connais pas PHP mais je pense qu’avec votre script vous retrouverez le problème que j’explique dans le poste Rapport d’inventaire logiciel par poste et pour corriger ce problème vous devez rajouter la table glpi_license
A+
Offline
Bonjour,
Je viens de vérifier mon script et effectivement ça ne fonctionne pas.
Je suis allé voir votre post, et j'avoue que je suis un peu perdu avec ce "is_template". Effectivement, il se peut qu'il soit à l'origine d'un décallage, mais apparemment le rajout de la table glpi_license ne change rien.
Je vais continuer de chercher...
edit : je pense que le problème vient du fait que je compte les logiciels à chaque fois quelque soit le lieu et n'a rien à voir avec "is_template"
Last edited by remy_d1 (2007-07-03 14:42:34)
Offline
Bonjour ;
Je ne sais pas comment vous faites mais avec Access via une connexion ODBC
On créer une requête avec les tables, choisis: "glpi_computer", glpi_inst_software", "glpi_license" et "glpi_software". Avec des jointures comme ci dessus ca fonctionne pour les licences par poste:
- une entre ID de « glpi_computer » et cID de « glpi_inst_software »
- une entre licence de « glpi_inst_software » et ID de « glpi_license »
- une autre entre sID de « glpi_license » et ID de « glpi_software »
A+
Offline
Bonjour,
J'aime pas spécialement Access, d'autant plus que j'ai désinstallé Ms Office pour mettre OpenOffice.
Je reviens à mes moulins et mon script.
Je vois pas pourquoi ça marche pas, et toute aide supplémentaire sera bienvenue. Merci pour ton aide EDEOF; Je continue de chercher; Voilà mon nouveau code, composé de 3 fichiers php :
Le premier permet de choisir le lieu :
lieu.php :
<html>
<?php
$cfgHote = "mon_IP";
$cfgUser = "mon_user";
$cfgPass = "mon_pass!!";
$cfgBase = "GLPI";
$link = mysql_connect($cfgHote, $cfgUser, $cfgPass);
if (!$link) {
die('Non connecte : ' . mysql_error());
}
// Selection de la base de donnees db
$db_selected = mysql_select_db($cfgBase, $link);
if (!$db_selected) {
die ('Impossible d\'utiliser la base : ' . mysql_error());
}
// variables
$lieu = 'glpi_dropdown_locations.completename';
$sql = 'SELECT DISTINCT '.$lieu.' FROM glpi_dropdown_locations, glpi_computers'
. ' WHERE glpi_dropdown_locations.ID = glpi_computers.location'
;
$result = mysql_query($sql) or die( 'Erreur : ' . mysql_error() );
echo "<form method='post' action='result.php'>";
echo "Choisissez un lieu : <SELECT NAME=choix>";
while ($tab = mysql_fetch_array($result,MYSQL_NUM))
{
for($i=0; $i <= count($tab); $i++)
{
echo "<OPTION>";
echo $tab[$i];
echo "</OPTION>";
}
}
echo "</SELECT>";
echo "<input type='submit' value='Envoyer'>";
if (isset($_POST['choix']))
{
$_POST['choix'];
}
echo "</form>";
echo "<br>";
echo "<br>";
echo "<input type='button' value='Total' onclick=self.location.href='total.php'>";
mysql_close($link);
?>
</html>
Le deuxième me permet d'afficher les lieux, les logiciels et de faire un récapitulatif sur le nombre de fois où ils sont installés :
result.php
<html>
<table summary="LISTING DES LOGICIELS SELON LEUR LIEU D'INSTALLATION">
<tr bgcolor=#FFFF00>
<th>Nb</th>
<th>Lieu</th>
<th>Nom</th>
</tr>
<?php
$cfgHote = "mon_IP";
$cfgUser = "mon_user";
$cfgPass = "mon_pass!!";
$cfgBase = "GLPI";
$link = mysql_connect($cfgHote, $cfgUser, $cfgPass);
if (!$link) {
die('Non connecte : ' . mysql_error());
}
// Selection de la base de donnees db
$db_selected = mysql_select_db($cfgBase, $link);
if (!$db_selected) {
die ('Impossible d\'utiliser la base : ' . mysql_error());
}
// variables
$lieu = 'glpi_dropdown_locations.completename';
$nb = 'NbInstall';
$nom = 'glpi_software.name';
$choix = $_POST['choix'];
$sql = 'SELECT COUNT('.$nom.') AS '.$nb.', '
. $lieu.', '.$nom
. ' FROM glpi_dropdown_locations, glpi_software, glpi_computers, glpi_inst_software, glpi_licenses'
. ' WHERE glpi_dropdown_locations.ID = glpi_computers.location'
. ' AND glpi_computers.ID = glpi_inst_software.cID'
. ' AND glpi_inst_software.license = glpi_software.ID'
. ' AND glpi_licenses.sID = glpi_software.ID'
// . ' AND glpi_inst_software.license = glpi_licenses.ID'
// . ' AND glpi_computers.is_template != 1'
// . ' AND glpi_software.is_template != 1'
. ' AND glpi_dropdown_locations.completename = "'.$choix.'"'
. ' GROUP BY '.$nom
. ' ORDER BY '.$lieu.' ,'.$nb.' DESC,'.$nom
. ' LIMIT 0 , 30000;'
;
$result = mysql_query($sql) or die( 'Erreur : ' . mysql_error() );
while($tab = mysql_fetch_array($result, MYSQL_NUM))
{
print "<tr>";
for($x=0; $x <= count($tab); $x++)
{
print "<th>";
echo $tab[$x];
print "</th>";
}
print "</tr>";
}
?>
</table>
</html>
Et enfin, le troisième fait le total du nombre de logiciels, ce qui me permet de comparer plus rapidement avec ce que me sort glpi depuis Inventaire > logiciel
Le problème est que je ne trouve pas le code SQL qui permet de sortir cette magnifique page !
Bref voici ma page buggée :
total.php :
<html>
<table>
<?php
$cfgHote = "mon_IP";
$cfgUser = "mon_user";
$cfgPass = "mon_pass!!";
$cfgBase = "GLPI";
$link = mysql_connect($cfgHote, $cfgUser, $cfgPass);
if (!$link) {
die('Non connecte : ' . mysql_error());
}
// Selection de la base de donnees db
$db_selected = mysql_select_db($cfgBase, $link);
if (!$db_selected) {
die ('Impossible d\'utiliser la base : ' . mysql_error());
}
$lieu = 'glpi_dropdown_locations.completename';
$nb = 'NbInstall';
$nom = 'glpi_software.name';
$sql = 'SELECT COUNT('.$nom.') AS '.$nb.', '.$nom
. ' FROM glpi_software, glpi_computers, glpi_inst_software'
. ' WHERE glpi_computers.ID = glpi_inst_software.cID'
. ' AND glpi_inst_software.license = glpi_software.ID'
. ' GROUP BY '.$nom
. ' ORDER BY '.$nb.' DESC,'.$nom
. ' LIMIT 0 , 30000;'
;
$result = mysql_query($sql) or die( 'Erreur : ' . mysql_error() );
while($tab = mysql_fetch_array($result, MYSQL_NUM))
{
print "<tr>";
for($x=0; $x <= count($tab); $x++)
{
print "<th bgcolor=#c0ffa0>";
echo $tab[$x];
print "</th>";
}
print "</tr>";
}
mysql_close($link);
?>
</table>
</html>
C'est fou de gallérer pour un truc tout bête
Last edited by remy_d1 (2007-07-04 10:30:41)
Offline
Effectivement, il doit falloir faire une jointure; Je viens de voir le fichier software.function.php qui m'a l'air d'effectuer les requêtes nécessaires pour comptabiliser les licences.
ex : "SELECT count(*) FROM glpi_inst_software INNER JOIN glpi_computers ON ( glpi_inst_software.cID=glpi_computers.ID ) WHERE glpi_inst_software.license ='$ID' AND glpi_computers.deleted='N' AND glpi_computers.is_template='0' ";
Offline
C'est bon j'ai trouvé d'où venait mon erreur.
En fait, vous m'aviez expliqué l'erreur dans votre post, mais je n'avais pas compris l'implication de la table license dans la comptabilisation des softs.
En effet, Il faut comptabiliser "glpi_inst_software.license" ,
mais la condition :
' glpi_inst_software.license = glpi_software.ID'
est fausse, il faut mettre :
' glpi_inst_software.license = glpi_licenses.ID '
A modifier évidemment partout.
CQFD.
Offline
Un peu plus de détail :
Choix du lieu : lieu.php
<html>
<?php
$cfgHote = "mon_IP";
$cfgUser = "mon_user";
$cfgPass = "mon_pass";
$cfgBase = "GLPI";
$link = mysql_connect($cfgHote, $cfgUser, $cfgPass);
if (!$link) {
die('Non connecte : ' . mysql_error());
}
// Selection de la base de donnees db
$db_selected = mysql_select_db($cfgBase, $link);
if (!$db_selected) {
die ('Impossible d\'utiliser la base : ' . mysql_error());
}
// variables
$lieu = 'glpi_dropdown_locations.completename';
$sql = 'SELECT DISTINCT '.$lieu.' FROM glpi_dropdown_locations, glpi_computers'
. ' WHERE glpi_dropdown_locations.ID = glpi_computers.location'
;
$result = mysql_query($sql) or die( 'Erreur : ' . mysql_error() );
echo "<form method='post' action='result.php'>";
echo "Choisissez un lieu : <SELECT NAME=choix>";
while ($tab = mysql_fetch_array($result,MYSQL_NUM))
{
for($i=0; $i <= count($tab); $i++)
{
echo "<OPTION>";
echo $tab[$i];
echo "</OPTION>";
}
}
echo "</SELECT>";
echo "<input type='submit' value='Envoyer'>";
if (isset($_POST['choix']))
{
$_POST['choix'];
}
echo "</form>";
echo "<br>";
echo "<br>";
echo "<input type='button' value='Total' onclick=self.location.href='total.php'>";
mysql_close($link);
?>
</html>
En focntion du lieu choisi : result.php
<html>
<?php
cfgHote = "mon_IP";
$cfgUser = "mon_user";
$cfgPass = "mon_pass";
$cfgBase = "GLPI";
$link = mysql_connect($cfgHote, $cfgUser, $cfgPass);
if (!$link) {
die('Non connecte : ' . mysql_error());
}
// Selection de la base de donnees db
$db_selected = mysql_select_db($cfgBase, $link);
if (!$db_selected) {
die ('Impossible d\'utiliser la base : ' . mysql_error());
}
// variables
$choix = $_POST['choix'];
echo "<center><br>".$choix."<br><br><br>";
echo "<table summary='LISTING DES LOGICIELS SELON LEUR LIEU D'INSTALLATION'>";
echo " <tr bgcolor=#FFFF00>";
echo " <th>Nb</th>";
echo " <th>Nom</th>";
echo " </tr>";
$sql = 'SELECT COUNT(glpi_inst_software.license) AS NbInstall, glpi_software.name
FROM glpi_software, glpi_inst_software, glpi_computers, glpi_dropdown_locations, glpi_licenses
WHERE glpi_inst_software.license = glpi_licenses.ID
AND glpi_licenses.sID = glpi_software.ID
AND glpi_computers.ID = glpi_inst_software.cID
AND glpi_computers.location = glpi_dropdown_locations.ID
AND glpi_computers.deleted="N"
AND glpi_computers.is_template="0"
AND glpi_dropdown_locations.completename = "'.$choix.'"
GROUP BY glpi_software.name
ORDER BY NbInstall DESC, glpi_software.name;';
$result = mysql_query($sql) or die( 'Erreur : ' . mysql_error() );
while($tab = mysql_fetch_array($result, MYSQL_NUM))
{
print "<tr>";
for($x=0; $x <= count($tab); $x++)
{
print "<th>";
echo $tab[$x];
print "</th>";
}
print "</tr>";
}
?>
</center>
</table>
</html>
Et enfin, un fichier récapitulatif sur le total des installations... Je rapelle que GLPI fait déjà ce dernier petit truc sauf que ça n'affiche pas par ordre décroissant le nombre d'installs correspondants aux softs. ( Inventaire > logiciels ) : total.php
<html>
<table>
<?php
cfgHote = "mon_IP";
$cfgUser = "mon_user";
$cfgPass = "mon_pass";
$cfgBase = "GLPI";
$link = mysql_connect($cfgHote, $cfgUser, $cfgPass);
if (!$link) {
die('Non connecte : ' . mysql_error());
}
// Selection de la base de donnees db
$db_selected = mysql_select_db($cfgBase, $link);
if (!$db_selected) {
die ('Impossible d\'utiliser la base : ' . mysql_error());
}
$sql = "SELECT count(glpi_inst_software.license) AS NbInstall, glpi_software.name
FROM glpi_software, glpi_licenses, glpi_computers, glpi_inst_software
WHERE glpi_inst_software.license = glpi_licenses.ID
AND glpi_licenses.sID = glpi_software.ID
AND glpi_computers.ID = glpi_inst_software.cID
AND glpi_computers.deleted='N'
AND glpi_computers.is_template='0'
GROUP BY glpi_software.name
ORDER BY NbInstall DESC, glpi_software.name; ";
$result = mysql_query($sql) or die( 'Erreur : ' . mysql_error() );
while($tab = mysql_fetch_array($result, MYSQL_NUM))
{
print "<tr>";
for($x=0; $x <= count($tab); $x++)
{
print "<th bgcolor=#c0ffa0>";
echo $tab[$x];
print "</th>";
}
print "</tr>";
}
mysql_close($link);
?>
</table>
</html>
Hope this help
Offline
Je ne sais pas si ça intéresse quelqu'un... Enfin on ne sait jamais :
J'ai fait quelques modification aux deux premiers fichiers, parce que voir les correctifs Windows partout, tout le temps, je trouvais ça pas top... Même si c'est important de pouvoir faire le point sur les machines à jour et celles qui ne le sont pas :
lieu.php
<html>
<center>
<?php
$cfgHote = "...";
$cfgUser = "...";
$cfgPass = "...";
$cfgBase = "GLPI";
$link = mysql_connect($cfgHote, $cfgUser, $cfgPass);
if (!$link) {
die('Non connecte : ' . mysql_error());
}
// Selection de la base de donnees db
$db_selected = mysql_select_db($cfgBase, $link);
if (!$db_selected) {
die ('Impossible d\'utiliser la base : ' . mysql_error());
}
// variables
$lieu = 'glpi_dropdown_locations.completename';
$sql = 'SELECT DISTINCT '.$lieu.' FROM glpi_dropdown_locations, glpi_computers'
. ' WHERE glpi_dropdown_locations.ID = glpi_computers.location'
;
$result = mysql_query($sql) or die( 'Erreur : ' . mysql_error() );
echo "<form method='post' action='result.php'>";
echo "Choisissez un lieu : <SELECT NAME=choix>";
while ($tab = mysql_fetch_array($result,MYSQL_NUM))
{
for($i=0; $i <= count($tab); $i++)
{
if($tab[$i]!=NULL)
{
echo "<OPTION>";
echo $tab[$i];
echo "</OPTION>";
}
}
}
echo "</SELECT>";
echo "<br><br>Sans Windows et ses correctifs : <input type='checkbox' name='SansWindows[]' value='SansWindows'>";
echo "<br><br><input type='submit' value='Envoyer'>";
if (isset($_POST['choix']))
{
$_POST['choix'];
}
echo "</form>";
echo "<br><br><br> Tous les logiciels, partout : <input type='button' value='Total' onclick=self.location.href='total.php'>";
mysql_close($link);
?>
</center>
</html>
result.php
<html>
<?php
$cfgHote = "...";
$cfgUser = "...";
$cfgPass = "...";
$cfgBase = "GLPI";
$link = mysql_connect($cfgHote, $cfgUser, $cfgPass);
if (!$link)
{
die('Non connecte : ' . mysql_error());
}
// Selection de la base de donnees db
$db_selected = mysql_select_db($cfgBase, $link);
if (!$db_selected)
{
die ('Impossible d\'utiliser la base : ' . mysql_error());
}
// variables
$choix = $_POST['choix'];
$SansWindows = $_POST['SansWindows'];
echo "<center><br>".$choix."<br><br><br>";
echo "<table summary='LISTING DES LOGICIELS SELON LEUR LIEU D'INSTALLATION'>";
echo " <tr bgcolor=#FFFF00>";
echo " <th>Nb</th>";
echo " <th>Nom</th>";
echo " </tr>";
$sql = 'SELECT COUNT(glpi_inst_software.license) AS NbInstall, glpi_software.name AS name
FROM glpi_software, glpi_inst_software, glpi_computers, glpi_dropdown_locations, glpi_licenses
WHERE glpi_inst_software.license = glpi_licenses.ID
AND glpi_licenses.sID = glpi_software.ID
AND glpi_computers.ID = glpi_inst_software.cID
AND glpi_computers.location = glpi_dropdown_locations.ID
AND glpi_computers.deleted="N"
AND glpi_computers.is_template="0"
AND glpi_dropdown_locations.completename = "'.$choix.'"
GROUP BY name
ORDER BY NbInstall DESC, name;';
$result = mysql_query($sql) or die( 'Erreur : ' . mysql_error() );
if($SansWindows==FALSE)
{
while ($donnees = mysql_fetch_assoc($result))
{
print "<tr>";
{
print "<th>";
echo $donnees['NbInstall'];
print "</th>";
print "<th>";
echo $donnees['name'];
print "</th>";
}
print "</tr>";
}
}
else
{
while ($donnees = mysql_fetch_assoc($result))
{
if(!eregi("Windows",$donnees['name']))
{
print "<tr>";
{
print "<th>";
echo $donnees['NbInstall'];
print "</th>";
print "<th>";
echo $donnees['name'];
print "</th>";
}
print "</tr>";
}
}
}
?>
</center>
</table>
</html>
Je pense que je ferai pareil pour le fichier total.
Cordialement.
Offline
Les logiciels pourront être catégorisés dans la 0.7
MoYo - Julien Dombre - Association INDEPNET
Contribute to GLPI : Support Contribute References Freshmeat
Offline
Cool ! Enfin je me suis embêté pour rien :'(
Offline
Non vous avez progressé en sql
Oui c'est sûr ! Ou plutôt, disons que je me remémore certains trucs
Offline