Page 1 sur 1

Affichage régional de la liste de rapports

Posté : 19 janv. 2012, 15:34
par ladinho58
Bonjour,

j'aurai souhaité réaliser un petit truc a l'aide d'une requête, mais je ne vois pas comment le faire. Peut-être pourriez-vous m'aider..
Dans une des pages Web, les utilisateurs peuvent jeter un œil sur toutes les études déjà réalisées. Mon souhait est de créer une page Manager où celui-ci pourrait observer uniquement les rapports de l'équipe régionale qu'il gère.
En gros, faire une requête qui n'affiche que les rapports des utilisateurs de la même région que le manager régional. Je ne voyais pas ça très compliqué à la base, mais étant un (vrai) débutant en SQL, je ne vois pas trop où et surtout comment faire ça.

Voici le code de ma page où le manager peut observer les rapports déjà créés par son équipe :

Ici, vous trouverez à titre informatif la création d'un formulaire de tri qui permet au manager de faire des recherches plus approfondies sur les rapports qu'il souhaite voir affiché. Il peut faire des recherches de tri sur les noms, sur la région du client en lien au rapport, sur les tarifs proposés...
//cette partie gère la partie "tri" en fonction du nom du commercial.
function addSelectAuteur($id, $selected, $afficheToutes=true,$onchange="",$size=0,$mode=0,$disabled=false){
	if($disabled)
		$dis = "disabled";
	else
		$dis = "";
	//Définition de la taille
	if($size==0)
		$attsize = "";
	elseif(is_numeric($size))
		$attsize = "style='width:".$size."px;'";
	//Affichage ou non de l'événement Javascript
	$varonchange = "";
	if($onchange != "")
		$varonchange = 'onchange="'.$onchange.'"';
	//Affichage de la balise
	echo '<select '.$dis.' '.$attsize.' name="'.$id.'" id="'.$id.'" '.$varonchange.'>';
	
	$req = 'SELECT id_utilisateur,prenom, nom FROM utilisateur WHERE id_region='.$_SESSION['id_region'].' ORDER BY nom';
	$result = mysql_query($req) or die('Requête invalide : ' . mysql_error() . "\n" . 'Requête complète : ' . $req);
	$padding="";
	if($afficheToutes){
		if(isset($selected) && $selected == "all")$select="selected='selected'"; else $select="";
		echo '<option '.$select.' style="font-weight: bold;" value="all">Tous vos utilisateurs</option>
		';
		$padding = 'style="padding-left: 25px;"';
	}
	// Création d'une ligne par utilisateur trouvé dans la liste déroulante
	// On lit une par une les lignes issues de la requête
	while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
		switch($mode){
				case 0 : $value = $row['nom']; break;
				case 1 : $value = $row['id_utilisateur']; break;
				default : $value = $row['nom']; break;
			}
			// On pré-sélectionne la région choisie dans la page vespa.php
			// On récupère l'adresse correspondante pour l'affichée dans le champ suivant
			if(isset($selected) && ($row['nom'] == $selected) || ($row['id_utilisateur'] == $selected)){
				echo '<option '.$padding.' value="' . $value . '" selected="selected">'.$row['prenom'].' '.$row['nom'].'</option>
				';
			}
			// sinon on la rentre simplement dans la liste déroulante
			else{
				echo '<option '.$padding.' value="' . $value . '">'.$row['prenom'].' '.$row['nom'].'</option>
				';
			}
		
	}
	echo "</select>";
	mysql_free_result($result);
	unset($row);
}


// la varibale $temps désigne en jours le temps au bout du quel les rapports sont automatiquements supprimés (0=illimité)
$temps = 0;
// La variable $pas désigne le nombre de résultat à faire apparaitre sur une page
$pas = 20;

// Par défaut(c'est à dire tant qu'on n'a pas cliqué sur les boutons précédents, suivants), l'affichage se fait à partir de la première page (page 1)
if(!isset($_GET['p'])){
	$page_courante = 1;
}
else
{
	$page_courante = $_GET['p'];
}
$filtres = "";
if(isset($_GET['NAF']) && ($_GET['NAF']!="")){
	$filtres.= " AND ((n.code_naf = '".$_GET['NAF']."') OR (di.id_division_naf = '".$_GET['NAF']."')) ";
}
if(isset($_GET['Num']) && ($_GET['Num']!="")){
	$filtres.= " AND (aff.id_affaire = '".$_GET['Num']."') ";
}
if(isset($_GET['Tarif']) && ($_GET['Tarif']!="")){
	$filtres.= " AND (lower(label_tarif) LIKE lower('%".$_GET['Tarif']."%')) ";
}
if(isset($_GET['OH']) && ($_GET['OH']!="")){
	$filtres.= " AND (lower(label_tarif) LIKE lower('%".$_GET['OH']."%')) ";
}
if(isset($_GET['NO']) && ($_GET['NO']!="")){
	$filtres.= " AND (lower(label_tarif) LIKE lower('%".$_GET['NO']."%')) ";
}
if(isset($_GET['Base']) && ($_GET['Base']!="")){
	$filtres.= " AND (lower(label_tarif) LIKE lower('%".$_GET['Base']."%')) ";
}
if(isset($_GET['EJP']) && ($_GET['EJP']!="")){
	$filtres.= " AND (lower(label_tarif) LIKE lower('%".$_GET['EJP']."%')) ";
}
if(isset($_GET['region_client']) && ($_GET['region_client']!="all")){
	$filtres.= " AND (soc.id_region = '".$_GET['region_client']."') ";
}
if(isset($_GET['region_utilisateur']) && ($_GET['region_utilisateur']!="all")){
	//$filtres.= " AND (aff.id_region_utilisateur = '".$_GET['region_utilisateur']."') ";
}
if(isset($GET['auteur']) && ($_GET['auteur']!='all')){
	$filtres.= " AND (aff.id_utilisateur = '".$_GET['auteur']."') ";
}


// On récupère le nombre d'archives qui existent dans la BDD (dans la variable $total), puis on en déduit le nombre de pages nécessaire,
//  en fonction du $pas, dans la variable $nbr_pages
if (!isset($_GET['auteur']))
{
$_GET['auteur']="all";
}

$arrayResult = informationsAffaire($_GET['auteur'], $filtres);

$total = $arrayResult[1];
$nbr_pages = (int)(($total + $pas - 1) / $pas);

$dossier = "../rapports".DIRECTORY_SEPARATOR;
?>

//Ici, le manager peut effectuer des filtres sur les dossiers qu'il souhaite voir affiché
	<form id="recherche" name="recherche" method="GET" action="manager.php">
	<fieldset id="chpRecherche"><legend>Recherche d'affaires</legend>
	<table>
	<tr>
		<td>
		<label for="auteur">Auteur</label>
		<!-- <select name="auteur" id="auteur">
		<option value="">Aucun filtre</option> -->
			<?php 
			if(isset($_GET['auteur']))
				addSelectAuteur("auteur", $_GET['auteur'],true,"",250,1);
			else
				addSelectAuteur("auteur", "all", true,"",250,1);
			?>
		<!--  </select>-->
		</td>	
		<td>
		<label for="searchNum">N° affaire</label>
		<input size=8 style="text-align:right;" type="text" id="searchNum" name="Num" <?php if(isset($_GET['Num'])) echo "value='".$_GET['Num']."'";?>>
		</td>
		<td>
		<label for="searchNAF">Code NAF</label>
		<input size =6 style="text-align:right;" type="text" id="searchNAF" name="NAF" <?php if(isset($_GET['NAF'])) echo "value='".$_GET['NAF']."'";?> >
		</td>
		<td>
		<label for="region_client">Région société</label>
		<!-- <select name="region_client" id="region_client">
		<option value="">Aucun filtre</option> -->
			<?php 
				if(isset($_GET['region_client']))
					addSelectRegion("region_client", $_GET['region_client'], true, true,"",250,1);
				else
					addSelectRegion("region_utilisateur", "all", true, true,"",250,1);
			?>
		<!--  </select>-->
		</td>
	</tr>
	<tr>
		<td>
		<label for="searchTarif">Tarif</label>
		<select id="searchTarif" name="Tarif">
		<option value="">Aucun filtre</option>
		<!--  <option value="particulier">Particulier</option>-->
		<option value="basse" <?php if(isset($_GET['Tarif']) && $_GET['Tarif']=="basse") echo "selected='selected'";?> >Basse tension</option>
		<option value="haute" <?php if(isset($_GET['Tarif']) && $_GET['Tarif']=="haute") echo "selected='selected'";?> >Haute tension</option>
		</select>
		</td>
		<td>
		<label for="searchOH">OH</label>	
		<input type="checkbox" id="searchOH" name="OH" value="oh" <?php if(isset($_GET['OH']) && $_GET['OH']=="oh") echo "checked";?> >				
		<label for="searchNO">NO</label>	
		<input type="checkbox" id="searchNO" name="NO" value="no" <?php if(isset($_GET['NO']) && $_GET['NO']=="no") echo "checked";?> >				
		</td>
		<td>
		<label for="searchBase">Base</label>	
		<input type="checkbox" id="searchBase" name="Base" value="base" <?php if(isset($_GET['Base']) && $_GET['Base']=="base") echo "checked";?> >				
		<label for="searchEJP">EJP</label>	
		<input type="checkbox" id="searchEJP" name="EJP" value="ejp" <?php if(isset($_GET['EJP']) && $_GET['EJP']=="ejp") echo "checked";?> >				
		</td>
		<td>
		<input type="submit" value="Rechercher">
		</td>			
	</tr>
			
</table>
</fieldset>
</form>
Voici ici à proprement parler la création du tableau qui pose problème
<table class="tablebleu" id="rapport" summary="Tableau récapitulatif des rapports précédemment faits">
		
<thead><tr>
	<th><a href="#" onclick="sortTable(this,0); return false;"></a></th>
	<th><a href="#" onclick="sortTable(this,1); return false;"></a></th>
	<th style="width: 75px;"><a href="#" onclick="sortTable(this,2); return false;">Numéro d'affaire</a></th>
	<th style="width: 250px;"><a href="#" onclick="sortTable(this,3); return false;">Société</a></th>
	<th style="width: 175px;"><a href="#" onclick="sortTable(this,4); return false;">Région client</a></th>
	<th style="width: 200px;"><a href="#" onclick="sortTable(this,6); return false;">Interlocuteur</a></th>
	<th style="width: 200px;"><a href="#" onclick="sortTable(this,7); return false;">Auteur</a></th>
	<th style="width: 50px;"><a href="#" onclick="sortTable(this,7); return false;">Naf</a></th>
	<th style="width: 200px;"><a href="#" onclick="sortTable(this,8); return false;">Tarif</a></th>
	<th><a href="#" onclick="sortTable(this,9); return false;">Date de création</a></th>
	<th><a href="#" onclick="sortTable(this,10); return false;">Dernière MAJ</a></th>
</tr></thead>
	
<tbody>
	<?php
        if ($total==0)
	echo "<tr><td style='text-align:center;font-weight:bold' colspan=12>Aucune affaire ne correspond à votre critere de recherche</td></tr>";

//la variable $arrayResult vient de la fonction informationsAffaire qui crée la requête :		
	$result = $arrayResult[0];
	$bis="SELECT"
	while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
		if($row['division'] != null)
                {
			$division = $row['division']."---";
			if(strlen($division)==4)
                        {
				$division = "0".$division;
			}
		}
		else	$division = "";

		$reqrapport = "SELECT id_rapport, fichier_pdf, fichier_doc, date FROM rapport WHERE id_affaire='".$row['id_affaire']."' ORDER BY DATE DESC LIMIT 1";
		$result_rapport = mysql_query($reqrapport) or die('Requête invalide : ' . mysql_error() . "\n" . 'Requête complète : ' . $reqrapport);
		$row_rapport = mysql_fetch_array($result_rapport, MYSQL_ASSOC);
		
//initialisation des variables
					
	$lien_word = '';
	$lien_pdf = '';

	if(file_exists($row_rapport['fichier_doc']) && stristr($row_rapport['fichier_doc'], ".doc"))
{

	//suppression des fichier word qui n'ont pas été ouverts depuis plus de $temps jours (si $temps est différent de la valeur 0)
	$stat = stat($row_rapport['fichier_doc']);
	if($temps != 0 and min((time() - $stat['ctime']), (time() - $stat['atime'])) > $temps*24*3600){
		unlink($row_rapport['fichier_doc']);
	}
	// Création du lien word
	else{
		$lien_word = '<a href="' .$row_rapport['fichier_doc']. '"><img src="../include/img/word.png" style="width: 24px;" alt="word"\></a>';
	}
}
if(file_exists($row_rapport['fichier_pdf']) && stristr($row_rapport['fichier_pdf'], ".pdf"))
{
	//suppression des fichier pdf qui n'ont pas été ouverts depuis plus de $temps jours (si $temps est différent de la valeur 0)
	$stat = stat($row_rapport['fichier_pdf']);
	if(min((time() - $stat['ctime']), (time() - $stat['atime'])) > $temps*24*3600 and $temps != 0){
		unlink($row_rapport['fichier_pdf']);
	}
	// Création du lien pdf
	else{
	$lien_pdf = '<a href="' .$row_rapport['fichier_pdf']. '" target="blank"><img src="../include/img/pdf.png" style="width: 24px;" alt="pdf"\></a>';
	}
}
				
// Création du tableau proprement dit

if(strlen($row['code_naf']) == 5)
	$affnaf = $row['code_naf'];
else
{
	if(strlen($row['division']) == 1)
		$affnaf = '0'.$row['division'].'---';
	else
		$affnaf = $row['division'].'---';
}

echo '<tr>
	<td>' . $lien_word . '</td>
	<td>' . $lien_pdf . '</td>
	<td onclick="document.location.href=\'rapport_fiche.php?loc=1&affaire='.$row['id_affaire'].'\'">' . $row['id_affaire'] . '</td>
	<td onclick="document.location.href=\'rapport_fiche.php?loc=1&affaire='.$row['id_affaire'].'\'">' . $row['nom_societe'] . '</td>
	<td onclick="document.location.href=\'rapport_fiche.php?loc=1&affaire='.$row['id_affaire'].'\'">' . $row['soc_nom_region'] . '</td>
	<td onclick="document.location.href=\'rapport_fiche.php?loc=1&affaire='.$row['id_affaire'].'\'">' . $row['civilite_interlocuteur'].' '.$row['nom_interlocuteur'].' '.$row['prenom_interlocuteur']. '</td>
	<td onclick="document.location.href=\'rapport_fiche.php?loc=1&affaire='.$row['id_affaire'].'\'">' . $row['util_civilite'].' ' .$row['util_nom'].' '.$row['util_prenom']. '</td>
	<td onclick="document.location.href=\'rapport_fiche.php?loc=1&affaire='.$row['id_affaire'].'\'">' . $affnaf .'</td>
	<td onclick="document.location.href=\'rapport_fiche.php?loc=1&affaire='.$row['id_affaire'].'\'">' . $row['label_tarif'] . '</td>
	<td onclick="document.location.href=\'rapport_fiche.php?loc=1&affaire='.$row['id_affaire'].'\'">' . $row['aff_date'] . '</td>
	<td onclick="document.location.href=\'rapport_fiche.php?loc=1&affaire='.$row['id_affaire'].'\'">' . $row['aff_derniereMAJ'] . '</td>			
';

// On affiche le bouton précédent si on ne se trouve pas à la première page
if($page_courante > 1)
{
	$page_precedente = $page_courante - 1;
        echo '<div class="faux_bouton" style="text-align: left;"><a href="archive_rapport.php?p=' . $page_precedente . '">Précédente</a></div>';
}
			
// On affiche le bouton suivant si on ne se trouve pas à la dernière page
if($page_courante < $nbr_pages)
{
	$page_suivante = $page_courante + 1;
	echo '<div class="faux_bouton" style="text-align: right;"><a href="archive_rapport.php?p=' . $page_suivante . '">Suivante</a></div>';
}						
			
// Libération des variables
mysql_free_result($result);
			
?>
</tbody>
</table>
Enfin, voici sans doute le plus important : la requête ! On utilise cette fonction pour la création de la variable $arrayResult[0] qui est la requête posant problème, ainsi que pour $arrayResult[1] qui va compter le nombre de pages
function informationsAffaire($userid,$where){

if($userid!="" && is_numeric($userid)){
	$user = "aff.id_utilisateur='".$userid."'";
}
else{
	$user = "";
}

if($where != "")
	if($user =="")
		$user.=substr($where, 4);
	else{
		$user.=$where;
	}
$req = "
	SELECT 
	aff.id_affaire, aff.id_region_etude, aff.id_region_utilisateur, aff.derniereMAJ AS aff_derniereMAJ,
	aff.id_utilisateur AS aff_util, util.civilite AS util_civilite, util.nom AS util_nom, util.prenom AS util_prenom, util.id_region AS util_region,
	aff.id_naf AS naf, n.code_naf, n.nom_sous_classe,
	aff.id_division_naf AS division, nom_division_naf,
	regutil.id_region AS util_id_region, regutil.nom_region AS util_nom_region, regutil.adresse AS util_adresse_region, 
	regsoc.id_region AS soc_id_region, regsoc.nom_region AS soc_nom_region, regsoc.adresse AS soc_adresse_region, 
	rep.id_region AS rep_id_region, regrep.nom_region AS rep_nom_region, regrep.adresse AS rep_adresse_region, 
	aff.id_societe AS soc_id_societe, nom_societe, adresse_societe, soc.derniereMAJ AS soc_derniereMAJ,
	aff.id_interlocuteur AS inter_id_interlocuteur, nom_interlocuteur, prenom_interlocuteur, civilite_interlocuteur, telephone_interlocuteur, portable_interlocuteur, fax_interlocuteur, email_interlocuteur, inter.derniereMAJ AS inter_derniereMAJ,
	aff.id_offre_commerciale AS offr_id_offre_commerciale, intitule_offre, active,
	aff.id_repertoire AS rep_id_repertoire, rep.email AS rep_email, rep.civilite AS rep_civilite, rep.nom AS rep_nom, rep.prenom AS rep_prenom, rep.telephone AS rep_telephone, rep.portable AS rep_portable, rep.fax AS rep_fax, rep.adresse AS rep_adresse, rep.dateajout AS rep_dateajout,
	aff.date AS aff_date, datecontact, label_tarif, commentaires, 
	pte, hph, hpd, hch, hcd, hpe, hce, ja, taille, fourchette, choix_taille, representation,
	datecontact, dateligne, dateeval, typecontact, libtarif, annee_etude
			
	FROM affaire aff
	LEFT OUTER JOIN utilisateur util ON (aff.id_utilisateur = util.id_utilisateur)
	LEFT OUTER JOIN societe soc ON (aff.id_societe = soc.id_societe)
	LEFT OUTER JOIN interlocuteur inter ON (inter.id_interlocuteur = aff.id_interlocuteur)
	LEFT OUTER JOIN region regutil ON (regutil.id_region = aff.id_region_utilisateur) 
	LEFT OUTER JOIN region regsoc ON (regsoc.id_region = soc.id_region) 
	LEFT OUTER JOIN naf n ON (aff.id_naf = n.id_naf)
	LEFT OUTER JOIN division di ON (di.id_division_naf = aff.id_division_naf)
	LEFT OUTER JOIN offre_commerciale offr ON (aff.id_offre_commerciale = offr.id_offre_commerciale)
	LEFT OUTER JOIN repertoire rep ON (aff.id_repertoire = rep.id_repertoire)
	LEFT OUTER JOIN region regrep ON (regrep.id_region = rep.id_region) 
";
		
if($user != ""){
	$req.="WHERE ".$user;
}

$req.= "	ORDER BY date desc";

$result = mysql_query($req) or die('Requête invalide : ' . mysql_error() . "\n" . 'Requête complète : ' . $req);
$count = mysql_num_rows($result);
return array($result,$count);
}
En fait, tout ce code est grosso modo repris de la page qui affiche tous les rapports, page que je n'ai pas moi réalisé mais l'ancien stagiaire à qui je succède
Je suis vraiment désolé de vous balancer tout ce code comme ça, je sais que ça n'est pas vraiment bien agréable mais n'ayant que peu d'expériences en SQL, je préfère vous donner le maximum d'informations sur mon code, même si ça n'est pas forcément la meilleur solution.

Grossièrement, je verrai un truc du type :

SELECT les informations du rapport FROM rapport WHERE utilisateur.id_region= $_SESSION['id_region']

Re: Affichage régional de la liste de rapports

Posté : 19 janv. 2012, 19:41
par ouckileou
Oui plutot que le PHP/HTML il nous faudrait la structure de la base et uniquement la requete. Mais tu as une idee, as-tu essaye et vu ce que ca donne ?