Consiglio struttura database mysql

  • Creatore Discussione Creatore Discussione Bivio
  • Data di inizio Data di inizio

Bivio

Utente Attivo
19 Mag 2010
91
0
6
Salve, vorrei qualche consiglio. Devo realizzare un piccolo programma, per la gestione di alcune persone. In pratica devo vedere se una determinata persona ha fatto quello che doveva fare in un range di tempo. Faccio un esempio

http://postimage.org/image/7379y0se9/

Se la persona e attiva ha 5 giorni di tempo per svolgere il suo compito, quindi se pinco e attivo in 20 ha tempo fino alla 25, fin qui non avrei problemi, la cosa si complica perche se sempre la stessa persona e attiva anche in 22 ha tempo fino alla 27 e cosi via. Come devo strutture la cosa secondo voi? :confused:
 
ciao
se non ho capito male il problema.
potresti fare una tabella delle persone
id_persona
nome_persona
ecc..
con tutti i dati che ti servono
poi fare una tabella periodo_attivita
id
id_persona
inizio
fine (se fine è sempre inizio+5 potresti non metterlo)

per cui nella prima tabella avrai (es.)
1 pinco ....
2 pallo ....
3 sempronio ....
........
nella seconda
1 2 22 27
2 3 21 26
3 2 25 30
.....
dalla seconda ricavi che la persona con id_persona = 2 è attiva dal 22 al 27 e dal 25 al 30
 
Vediamo se ho capito:

2012_06_06_125501.png


In questo modo però gestisco solo un inizio attività giusto?
 
ciao
nella tabella dati_anagrafici non devi mettere l'inizio dell'attività, la trovi (le trovi) per un tale id_cliente nella tabella periodo_di_attivita
le due tabelle sono collegate dall id_cliente
nella tabella periodo_di_attivita ho detto che puoi evitare di mettere la fine se la durata è sempre la stessa (es 5 gg) per cui la fine non è altro che
fine= inizio +5
ma se la durata è varia nella tabella devi inserire o la durata o la data di fine.
ti faccio un paio di esempi (poi userai le join se ti trovi meglio)
PHP:
<?php
//durata fissa
$durata =5
$q_cl=mysql_query("SELECT id_cliente FROM anagrafica");
while($r_cl=mysql_fetch_array($q_cl)){
	echo "il cliente id=".$r_cl['id_cliente']." ha le seguenti attività<br />";
	$q_at=mysql_query("SELECT * FROM periodo WHERE id_cliente =".$r_cl['id_cliente']);
	while($r_at=mysql_fetch_array($q_at)){
		$inizio=$r_at['inizio'];
		$fine = $inizio + $durata;
		echo "che iniziano il $inizio e finiscono il $fine<br />";
	}
}
?>
PHP:
<?php
//durata variabile
$q_cl=mysql_query("SELECT id_cliente FROM anagrafica");
while($r_cl=mysql_fetch_array($q_cl)){
	echo "il cliente id=".$r_cl['id_cliente']." ha le seguenti attività<br />";
	$q_at=mysql_query("SELECT * FROM periodo WHERE id_cliente =".$r_cl['id_cliente']);
	while($r_at=mysql_fetch_array($q_at)){
		//se usi data fine e data inizio
		$inizio=$r_at['inizio'];
		$fine = $r_at['fine'];
		echo "che iniziano il $inizio e finiscono il $fine<br />";
		/* se invece della fine usi la durata modifichi in
		$inizio=$r_at['inizio'];
		$fine = $inizio + $r_at['durata'];
		echo "che iniziano il $inizio e finiscono il $fine<br />";
		*/
	}
}
?>
 
Ciao borgo,

Ok, in questo modo ho quando iniziano e il tempo che ha a disposizione, ma come faccio a capire che in quel periodo è stato attivo?
2012_06_07_132440.png
 
ciao
se la durata è 6 giorni (da come mi sembra è sempre la stessa) potresti provare a fare così

tabella anagrafica:
id_cliente int(9) prymarikey autoincrement
nome varchar (250) //e altri dati che ti possono interessare nell'anagrafica

tabella attivita:
id_attivita int(12) prymarikey autoincrement
id_cliente int(9)
inizio int(2)
durata int(1) default 6
a_1 enum('0','1') default 0 // 0 = non attivo, 1 = attivo
a_2 //come sopra
a_3
a_4
a_5
a_6 //come sopra

poi lo script
PHP:
<?php
//dati di connessione
$q_cl=mysql_query("SELECT id_cliente FROM anagrafica");
while($r_cl=mysql_fetch_array($q_cl)){
    echo "il cliente id=".$r_cl['id_cliente']." ha le seguenti attività<br />";
    $id_c=$r_cl['id_cliente'];
	$q_at=mysql_query("SELECT * FROM periodo WHERE id_cliente =".$r_cl['id_cliente']);
    echo "<table>";
	while($r_at=mysql_fetch_array($q_at)){
        $id_at=$r_at['id_attivita'];
		$inizio=$r_at['inizio'];
		$durata=$r_at['durata'];
		$a[0]=$r_at['a_1'];
		$a[1]=$r_at['a_2'];
		$a[2]=$r_at['a_3'];
		$a[3]=$r_at['a_4'];
		$a[4]=$r_at['a_5'];
		$a[5]=$r_at['a_6'];
		$stile="";
		echo "<tr>";
		for($k=0; $k <$durata;$k++){
			$inizio +=$k;
			if($a[$k] == "0"){
				$stile="";
				$inverti="1";
			}elseif($a[$k] == "1"){
				$stile= "style='background-color:#FF0000'";
				$inverti="0";
			}
			$inverti="$id_at|$id_c|$k|$inverti";
			echo "<td $stile>";
			echo "<a href=\"modifica.php?mod=$inverti\">$inizio</a>";
			echo "</td>";
		}
		echo "</tr>";
    }
	echo "</table>";
}
?>
e la pag modifica.php
PHP:
<?php
$modifica=$_GET['mod'];
$dati=explode("|", $modifica);
$d_a=$dati[0];//conterrà l'id dell'attività
$d_c=$dati[1];//conterrà l'id del cliente
$d_gg=$dati[2];//il giorno da modificare
$d_at_na=$dati[3];//il valore di inversione, 1 se era 0 , 0 se era 1
switch($d_gg){
	case "0": $m= " a_1 = $d_at_na ";
	break;
	case "1": $m= " a_2 = $d_at_na ";
	break;
	case "2": $m= " a_3 = $d_at_na ";
	break;
	case "3": $m= " a_4 = $d_at_na ";
	break;
	case "4": $m= " a_5 = $d_at_na ";
	break;
	case "5": $m= " a_6 = $d_at_na ";
	break;
	default: $m=0;
	break;
}
if($m==0){
	echo "qualcosa è andato storto";
	echo "<meta http-equiv='Refresh' content='3; URL=alla_pag_precedente.php'>";
}else{
	$query = "UPDATE attivita SET $m WHERE id_attivita = $d_a AND id_cliente = $d_c";
	$ris=mysql_query($query);// or die....
	echo "<meta http-equiv='Refresh' content='0; URL=alla_pag_precedente.php'>";
}
?>
lo scrip "dovrebbe" funzionare in questo modo
la prima pagina ti presenta per ogni cliente (e per ogno sua attività) 6 caselle col il numero del giorno (es 22, 23, 24, 25, 26, 27)
cioè dall'inizio alla fine attività
se (es) il giorno 23 è attivo la cella ha un bck rosso
se vuoi modificare l'attività basta che tu clicci sul numero del giorno
es clicchi sul 24 in cui non era attivo:
si uppa la tabella attivita (per quell'attività e per quel cliente) portando il valore 0 a uno
quando torni alla pag iniziale il giorno 24 avrà il bck rosso
al contrario es. il giorno 23 era attivo e ci clicchi sopra
si uppa la tabella attivita (per quell'attività e per quel cliente) portando il valore uno a 0
tornando alla pag iniziale il bck del giorno 23 non sarà piu rosso

guarda che è un'idea che ho buttato giu , non l'ho testata quindi non è detto che funzi, o per errori di logica (grave) o perchè ho sbagliato qualche copy/paste ...
 
Grazie mille Borgo, adesso sto riuscendo a capire. Sistemando un po il tuo script sono riuscito a farlo funzionare, e diciamo che e una buona base di partenza. Adesso cerco di adattarlo meglio alle mie esigenze. La mia difficoltà era nel capire come strutturare la cosa, ora che ho una base dovrebbe risultare facile proseguire.

Grazie ancora per la disponibilità. :D
 

Discussioni simili