Conta occorrenze ripetute

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.
 

pup3770

Utente Attivo
30 Mag 2012
122
0
16
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.
 

pup3770

Utente Attivo
30 Mag 2012
122
0
16
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
una cosa, se inserisci es 3 farmaci con bar code123 hai tre record?
se è così penso che tu debba ripensare alla tabella
 

pup3770

Utente Attivo
30 Mag 2012
122
0
16
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

pup3770

Utente Attivo
30 Mag 2012
122
0
16
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.
 

pup3770

Utente Attivo
30 Mag 2012
122
0
16
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:

pup3770

Utente Attivo
30 Mag 2012
122
0
16
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
Autore Titolo Forum Risposte Data
S conta pagine lato server Classic ASP 4
Shyson Wordpress conta più messaggi di quelli che ci sono WordPress 1
F [PHP] Pagina conta verghe per carpenteria PHP 15
L Script conta colori PHP 0
P conta click in javascipt Javascript 11
F conta membri come prestashop Javascript 2
asevenx conta numero di click riconoscendo indirizzo ip PHP 1
M conta valori uguali in una stringa PHP 1
S Conta click banner PHP 2
borgo italia conta caratteri da blog.mrwebmaster.it Javascript 0
I come si fa a fare un pulsante con conta click HTML e CSS 1
S Redirect e conta click con PHP e MySql scritto da Max Bossi PHP 5
W conta click Supporto Mr.Webmaster 0
A Script conta numero di file in una directory PHP 3
G Conta l’età per diventare un webmaster ???? Discussioni Varie 39
V Conta click Classic ASP 3
Silen escludersi da un conta clicks PHP 8
S Conta click PHP 0
I Conta pagine document dinamico Javascript 3
figo1592 Creare conta click [Era:Problema con video,immagini ed mp3] Webdesign e Grafica 1
S adsense non conta le visite della notte Google AdSense 4
Z conta click e pazzia PHP 0
G Script conta download Classic ASP 1
V conta record Database 23
B conta click Classic ASP 1
M conta click per download PHP 2
giamma aiuto ho il contatore che non conta PHP 2
A Conta visite HTML e CSS 2
S Conta Click in ASP: Problemi Classic ASP 4
peppoweb Script Conta Download PHP 5
A Conta Cllick Classic ASP 17
D Miglior modo per estrarre le occorrenze di un elemento in un set di più file xml e quindi scrivere il risultato in una tabella Excel o magari in JSON XML 0
elpirata [RISOLTO][Mysql] Contare le occorrenze in un campo tipo varchar MySQL 2
J FORM: Menu a tendina con tantissime occorrenze HTML e CSS 0
A Query per l'estrazione di occorrenze identiche PHP 1
W Come effettuare ripetute chiamate Curl con la stessa connessione autentica [PHP] PHP 0
T Sfondo con Scritte Ripetute Photoshop 4

Discussioni simili