Conta occorrenze ripetute

  • Creatore Discussione Creatore Discussione pup3770
  • Data di inizio Data di inizio

pup3770

Utente Attivo
30 Mag 2012
122
0
16
Ciao a tutti,
ho un piccolo problema. Credo sia semplice solo che mi confondo e non riesco a trovare una soluzione.

Sto facendo una semplice pagina web che permette il carico/scarico di farmaci.

Ho un DB in cui carico dei dati. Ogni riga contiene: barcode, nome, descrizione, tipo e robba varia.
Ogni volta che inserisco un barcode, quindi effettuo una operazione di carico, imposto in automatico (con la INSERT) un flag a "1"; ogni volta che elimino un barcone, quindi effettuo una operazione di scarico, imposto in automatico il flag a "-1" in modo che quando visualizzo il referto carico/scarico capisco se si tratta di un carico o scarico.

Il codice che utilizzo per visualizzare il contenuto del database è il seguente:

PHP:
<?php
		
	$connessione = mysql_connect("localhost","root","root") or die ("ATTENZIONE: Errore di connessione al server\n");	
	$selezione_db = mysql_select_db("Ospedale",$connessione) or die ("ATTENZIONE: Errore nella selezione del database\n");
    
	$query = "SELECT * FROM cariscoscarico WHERE NOT (quantita=0) ORDER BY barcode DESC ";
	
	$result = mysql_query($query, $connessione);
	
	$numrows = mysql_num_rows($result);
	

	echo "<big> Sono stati letti <span style=\"color:red\"> $numrows </span> valori diversi </big>"; //il tag big, ingranssa il testo, il tag span modifica lo stile del testo
	
	echo "<h2><big> Visualizzazione farmaci registrati </big></h2>";
	
		//se il database è vuoto lo stampo a video
if ($numrows==0){
	echo "<span style=\"color:red\"><big> Database vuoto! </big></span><b>";
}
//Se invece trovo delle occorrenze...
else
{
  //Avvio un ciclo for che si ripete per il numero di occorrenze trovate
  for($x=0; $x<$numrows; $x++){
    //Recupero il contenuto di ogni record rovato
    $resrow = mysql_fetch_row($result); //mysql_fetch_row() recupera il contenuto dei record trovati. Più precisamente restituisce un array contenente i valori di ogni campo riscontrati nel recordset
    
    $giorno = $resrow[0];
    $barcode = $resrow[1];
    $barcode2 = $resrow[2];
    $nome_farmaco = $resrow[3];
    $tipo_farmaco = $resrow[4];
    $descrizione_farmaco = $resrow[5];
    $data_scadenza = $resrow[12];
    $quantita = $resrow[13];
    $flag = $resrow[14];
    

if($quantita != "0"){


    //Stampo il risultato

    echo "<span style=\"color:red\"> Barcode: <b>" . $barcode . "</b><br/></span> ";
    echo "Barcode2: <b>" . $barcode2 . "</b><br/>";
    echo "Nome farmaco: <b>" . $nome_farmaco . "</b><br/>";
    echo "Tipo farmaco: <b>" . $tipo_farmaco . "</b><br/>";
    echo "Descrizone farmaco: <b>" . $descrizione_farmaco . "</b><br/>";
    echo "Data scadenza: <b>" . $data_scadenza . "</b><br/>";

    echo "Data carico: <b>" . $giorno . "</b><br/>";
    if($flag=='-1') {
    	echo "Operazione: <b>" . "<span style=\"color:red\">Scarito" . "</b><br/>";
    }
    else{
    	echo "Operazione: <b>" . "<span style=\"color:red\">Caricato" . "</b><br/>";
    	}

    
echo "<b><br>"."--------------------------------------------------------------------------------------------"."</b><br>";
}}

}

//$query_conto = "SELECT barcode, count(flag='1') FROM cariscoscarico GROUP BY barcode";
	
	
?>

Vorrei aggiungere a quanto fatto, una lista composta da una giacenza in cui vengono contate le occorrenze di uguale barcone.

Esempio.
Carico 5 farmaci con barcode "123" e 2 farmaci con barcone "456", poi elimino 2 farmaci con barcone "123" e vorrei che mi visualizza:

barcode - quantità
123 - 3
456 - 2

In modo che so quanto mi rimane e se poi voglio vedere le operazioni posso pure vederle.

Spero di non essere stato molto complicato e comprensibile.
Non mi serve niente di che, una risoluzione anche con una soluzione spartana.
 
Caspita mi ero avvicinato con la mia
PHP:
SELECT
ma utilizzando il tanto amato tasto cerca ho trovato un threed ottimo:

http://forum.mrwebmaster.it/php/28927-contare-record-uguali-tabella.html

Ho risolto così:

PHP:
$q = "SELECT barcode, COUNT(barcode) AS totale FROM cariscoscarico WHERE flag='1' GROUP BY barcode"; 
$query25 = mysql_query($q)or die(mysql_error()); 
while($tot = mysql_fetch_array($query25)){ 
echo $tot['barcode']." ".$tot['totale']."<br />"; 
}
.

Provo e vi do conferma.
 
Purtroppo non mi quadrano le giacenze.

Come fare a far si che avvenga questo:

Esempio.
Carico 5 farmaci con barcode "123" e 2 farmaci con barcone "456", poi elimino 2 farmaci con barcone "123" e vorrei che mi visualizza:

barcode - quantità
123 - 3
456 - 2

Attualmente mi fa solo la somma.

Ho provato a sommare e sottrare i
Codice:
flag
in
PHP:
WHERE
ma niente.

HELP ME
 
Perché scusa devo modificare il DB? nella tabella ho:

barcode nome1 quantità
123 ciao 1 (carico)
123 ciao 1 (carico)
123 ciao 1 (carico)
123 ciao -1 (scarico)

Teoricamente si dovrebbe fare in modo che venga eseguita l'operazione matematica: 1+1+1-1=3-1=2 quindi mi dovrebbe stampare a video:
123 ciao 2

Non sono riuscito in nessun modo.

Come potrei fare?
 
ciao
perche una tabella del genere è estremamente ridondante.
io farei così
PHP:
<?php
if(isset($_POST['invia'])){
	$barcode=$_POST['barcode'];
	$quantita=(int)$_POST['quanti'];
	$operazione=$_POST['operazione'];
	$op=1;
	//tralascio i controlli sui post
	if($operazione="scarico"){
		$quantita=-$quantita;
		$op=-1;
	}
	//dati di connessione
	/*verifichi che il record esista se non esiste e hai messo scarico
	l'operazione sulla tabella non deve essere effettuata
	verifichi quanto hai in giacenza, se cerchi di scaricare più di quanto hai in giacenza
	l'operazione non deve essere effettuata
	se tutto OK o inserisci o aggiorni*/
	$query="INSERT INTO magazzino(bar_code,quantita, operazione, data) VALUES('$barcode',$quantita, $op, NOW()) 
			ON DUPLICATE KEY
			UPDATE quantita = quantita + $quantita, operazione=$op,data = NOW()";
	$ris=mysql_query($query);
	//.....
}
?>
<form action="#" method="post">
<table width="43%"  border="0" cellspacing="0" cellpadding="2">
  <tr>
    <td width="18%">barcode</td>
    <td width="18%" colspan="2">quantit&agrave;</td>
    <td width="64%">&nbsp;</td>
  </tr>
  <tr>
    <td>
      <input name="barcode" type="text" id="barcode"></td>
    <td colspan="2"><input name="quanti" type="text" id="quanti"></td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>carico/scarico</td>
    <td>carico
      <input name="operazione" type="radio" value="carico"></td>
    <td>scarico
      <input name="operazione" type="radio" value="scarico"></td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td colspan="2">&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td colspan="2">&nbsp;</td>
    <td><input name="invia" type="submit" id="invia" value="invia"></td>
  </tr>
</table>
</form>
e questo è un esempio di tabella
Codice:
CREATE TABLE `magazzino` (
`bar_code` VARCHAR( 25 ) NOT NULL ,
`quantita` INT( 12 ) NOT NULL DEFAULT '0',
`operazione` INT( 2 ) NOT NULL ,
`data` DATE NOT NULL ,
PRIMARY KEY ( `bar_code` )
) ENGINE = MYISAM ;
ma da domani sino a sabato sono in ferie, eventualmente ti spiego al ritorno
 
Grazie mille per il codice, ma purtroppo simile lo avevo già implementato ma servirebbe anche lo storico e quindi se io aggiorno il campo non riesco a vedere quando viene fatto il carico e/o lo scarico.
 
Sembra quasi risolto:

PHP:
$q = "SELECT barcode, quantita, COUNT(*) AS totale FROM cariscoscarico WHERE quantita LIKE '1' GROUP BY barcode";

$r = "SELECT barcode, quantita, COUNT(*) AS totale2 FROM cariscoscarico WHERE quantita LIKE '-1' GROUP BY barcode";



$query5 = mysql_query($q)or die(mysql_error());
$query6 = mysql_query($r)or die(mysql_error());


echo "<span style=\"color:red\"><big><big>Barcode" ." | "."Quantita"."'"."<br /></big></big></span><b>";

while($tot = mysql_fetch_array($query5) and $tot1 = mysql_fetch_array($query6) ){ 

$prova = $tot['totale'];
$prova2 = $tot1['totale2'];

echo "Carico ne ho:" . $prova . "; ";
echo "Scarico ne ho:" . $prova2 . "; ";

$qt = $prova - $prova2;


//echo $tot['barcode']." ".$tot['quantita']." ".($tot['totale'])." ".($prova)." ".($prova2)."<br />"; 

echo $tot['barcode']." ".$qt."<br />"; 


}

Mi funziona ma quando il DB è popolato. Quando il DB è vuoto o quel barcode non è stato mai inserito, devo prima effettuare un CARICO e uno SCARICO in modo che la giacenza è zero e allora posso procedere. Come mai?
Quindi se io ad esempio inserissi 2 barcode uguali lui non me li visualizza come quantità=2, ma se ne scaricassi 1 allora mi da la giusta giacenza.
 
Ultima modifica:
Ragazzi RISOLTO.

Effettivamente è stata una svista mia. Io con COUNT facevo il conteggio di quante ripetizioni avevo, il mio obiettivo era un'altro, ovvero quello di sommare le quantità che stavano in un'altro campo e allora ho sostituito con SUM(quantita).

Vi posto il nuovo codice già testato e correttamente funzionante.


PHP:
<?php
	//$connessione = mysql_connect("mysql5.000webhost.com","a5365432_brunoml","fpe775uaf") or die ("ATTENZIONE: Errore di connessione al server\n");	
	$connessione = mysql_connect("localhost","root","root") or die ("ATTENZIONE: Errore di connessione al server\n");	

	//$selezione_db = mysql_select_db("a5365432_brunoml", $connessione) or die ("ATTENZIONE: Errore nella selezione del database\n");
	$selezione_db = mysql_select_db("Ospedale",$connessione) or die ("ATTENZIONE: Errore nella selezione del database\n");
    

	$query = "SELECT * FROM cariscoscarico WHERE NOT (quantita=0) ORDER BY barcode DESC ";
	
	$result = mysql_query($query, $connessione);
	
	$numrows = mysql_num_rows($result);
	echo "<big> Sono stati letti <span style=\"color:red\"> $numrows </span> valori diversi </big>"; //il tag big, ingranssa il testo, il tag span modifica lo stile del testo
		
		//se il database è vuoto lo stampo a video
if ($numrows==0){
	echo "<span style=\"color:red\"><big> Database vuoto! </big></span><b>";
}
//Se invece trovo delle occorrenze...
else
{

//$q = "SELECT barcode, quantita, COUNT(*) AS totale FROM cariscoscarico GROUP BY barcode";
//$q = "SELECT barcode, quantita, COUNT(*) AS totale FROM cariscoscarico WHERE quantita LIKE '1' GROUP BY barcode";

//$r = "SELECT barcode, quantita, COUNT(*) AS totale2 FROM cariscoscarico WHERE quantita LIKE '-1' GROUP BY barcode";


$r = "SELECT barcode, quantita, sum(quantita) AS totale2 FROM cariscoscarico GROUP BY barcode"; //cerco i ripetuti e per ogni ripetuto sommo la quantità e restituisco barcode, quantita e la somma della quantita


//$query5 = mysql_query($q)or die(mysql_error());
$query6 = mysql_query($r)or die(mysql_error());

echo "<b><br><br>";
echo "<span style=\"color:red\"><big><big>Giacenza aggiornata Carico/Scarico"."<br /></big></big></span><b>";
echo "<b><br>";

echo "<span style=\"color:red\"><big>Barcode" ." | "."Quantita"."'"."<br /></big></big></span><b>";

while($tot1 = mysql_fetch_array($query6)){ 


//$prova = $tot['totale'];
//$prova2 = $tot1['totale2'];

//echo "Carico ne ho:" . $prova . "; ";
//echo "Scarico ne ho:" . $prova2 . "; ";

//$qt = $prova - $prova2;
//$qt1 = $prova-0;

//echo $tot['barcode']." ".($tot['totale'])."<br />";

//echo $tot['barcode']." ".$qt."<br />"; 

echo $tot1['barcode']."<span style=\"color:red\"> -> </span>".$tot1['totale2']."<br />"; //stampa di quanto recuperato dalla query 


}
}
echo "<b><br>"."============================================================================================"."</b><br>";

echo "<b><br>";
echo "<span style=\"color:red\"><big><big>Storico delle operazioni effettuate"."<br /></big></big></span><b>";
echo "<b><br>";


	
	
  //Avvio un ciclo for che si ripete per il numero di occorrenze trovate
  for($x=0; $x<$numrows; $x++){
    //Recupero il contenuto di ogni record rovato
    $resrow = mysql_fetch_row($result); //mysql_fetch_row() recupera il contenuto dei record trovati. Più precisamente restituisce un array contenente i valori di ogni campo riscontrati nel recordset
    
    $giorno = $resrow[0];
    $barcode = $resrow[1];
    $barcode2 = $resrow[2];
    $nome_farmaco = $resrow[3];
    $tipo_farmaco = $resrow[4];
    $descrizione_farmaco = $resrow[5];
    $data_scadenza = $resrow[12];
    $quantita = $resrow[13];
    $flag = $resrow[14];
    

if($quantita != "0"){


//mysql_query ("DELETE FROM cariscoscarico WHERE quantita = '0' LIMIT 1",$connessione)

    //Stampo il risultato

    echo "<span style=\"color:red\"> Barcode: <b>" . $barcode . "</b><br/></span> ";
    echo "Barcode2: <b>" . $barcode2 . "</b><br/>";
    echo "Nome farmaco: <b>" . $nome_farmaco . "</b><br/>";
    echo "Tipo farmaco: <b>" . $tipo_farmaco . "</b><br/>";
    echo "Descrizone farmaco: <b>" . $descrizione_farmaco . "</b><br/>";
    echo "Data scadenza: <b>" . $data_scadenza . "</b><br/>";

    //echo "<span style=\"color:red\"> Quantita: <b>" . $quantita . "</b><br/></span> ";
    echo "Data carico: <b>" . $giorno . "</b><br/>";
    if($flag=='2') {
    	echo "Operazione: <b>" . "<span style=\"color:red\">Scarito" . "</b><br/>";
    }
    else{
    	echo "Operazione: <b>" . "<span style=\"color:red\">Caricato" . "</b><br/>";
    	}

    
echo "<b><br>"."--------------------------------------------------------------------------------------------"."</b><br>";
}
}
	
?>

Spiego rapidamente cosa faccio:

Ho una tabella in cui ho inserito con due query di inserimento dei valori ovvero barcode con descrizione. Una query di inserimento mi mette quantità "1" così lo utilizzo come flag per capire che ho inserito e la seconda query sempre di inserimento che mi mette la quantità "-1" così lo utilizzo come flag per capire che ho eliminato dalla giacenza il farmaco (o altro elemento).

Questo codice non fa altro che cercare tutti i dati della tabella, nella prima parte mi cerca quelli in cui il campo "barcode" è ripetuto e mi somma la quantità. Es. Inserisco 3 volte "aa" ed elimino 1 volta "aa" avrò come giacenza 3-1=2, quindi nella formattazione da me impostata: aa -> 2.

Sotto invece elenco tutti i dati del database in modo da capire i movimenti e ordino la visualizzazione per data di inserimento (dall'ultimo inserito).

Spero sia chiaro. Ci saranno errori sintattici perché non sono un programmatore nato/accanito, ma così funziona.

Scrivete se qualcosa non vi è chiaro o volete un aiuto.
 

Discussioni simili