4 aiuti per un'applicazione intranet

  • Creatore Discussione Creatore Discussione iuta74
  • Data di inizio Data di inizio

iuta74

Nuovo Utente
29 Apr 2014
24
0
0
Ciao ragazzi,

chiedo supporto per 4 problematiche che vi elenco per priorità.

1. PAGINAZIONE
Ho una pagina che nella parte in alto contiene i filtri per effettuare una ricerca (gruppo, fornitore, articolo) e nella parte bassa visualizza il risultato della ricerca. Alla pressione del tasto "Cerca", la MEDESIMA PAGINA si aggiorna e visualizza i risultati.
Ho creato 3 variabili: $where_gruppo, $where_fornitore e $where_articolo, una per ciascun filtro di ricerca, che si popolano con il metodo $_POST[]. Quanto l'utente lascia vuoti i campi di ricerca, assegno per ogni variabile rispettivamente "WHERE gruppo IS NOT NULL", " AND fornitore IS NOT NULL" e " AND articolo IS NOT NULL".
Infine, una variabile $where, composta dall'accodamento di tutte le variabili di cui sopra, è inserita nella mia SELECT.

Poniamo ad esempio, che l'utente compili solo il filtro relativo al gruppo. Ebbene, il risultato sarebbe di qualche centinaio di righe, pertanto ho utilizzato la paginazione. Purtroppo, nel momento in cui l'utente voglia passare ad una pagina diversa dalla prima, tutti i filtri di cui la $where è composta (se compilati), si perdono. Pertanto, nell'esempio di cui sopra, il filtro della mia SELECT effettuato sul gruppo, scompare e vale IS NOT NULL.

Come posso ovviare affinché tutte le pagine della paginazione "mantengano memoria" dei filtri della ricerca, visto che ad ogni refresh della pagina il metodo $_POST popola tutte le mie 3 $where?


2. IMPORTAZIONE .CSV
Nella mia applicazione, gli utenti che si leggano, hanno la possibilità di selezionare gli articoli (uno per volta) da una lunghissima lista di qualche migliaio di righe. Tuttavia vorrei offrire la possibilità a chi lo volesse d'importare da un file csv, un ordine.

Dunque, ecco come immagino questa parte.
1- Click sul link che mi chiede di selezionare il file .csv da importare (ho già creato un link dove scaricare il template molto banale, composto da due colonne "CODICE" e "QUANTITA"). Quindi, il mio utente, precedentemente si è scaricato il template csv, ha popolato le due colonne, l'ha salvato sul suo pc ed infine, utilizzando il famoso link, ha selezionato il .csv da lui salvato.

2- Anziché salvare brutalmente i dati contenuti nel .csv, ho bisogno di effettuare alcuni controlli. Prima devo verificare che questi codici NON siano già presenti nella tabella "ORDINI"... o meglio... devo verificare che NON siano stati ordinati nelle ultime due settimane dall'agente che sta effettuando l'importazione (nella tab. ORDINI è presente un campo che identifica l'ID dell'agente e la data di inserimento). Secondo, devo verificare che la quantità inserita per ciascun articolo, NON sia maggiore di 5pz.

3- Effettuate le verifiche del caso, devo riportare in una pagina (NON modificabile), l'anteprima dell'ordine da importare. Quindi faccio vedere per ogni riga il codice con relativa quantità. ATTENZIONE1: qualora ci fossero codici già ordinati nelle precedenti due settimane, lo devo segnalare all'utente (del tipo che nell'anteprima, la riga dedicata al codice incriminato riporterà una voce "codice non ordinabile fino a... data_inserimento+14gg). ATTENZIONE2: qualora ci fossero codici con quantità superiore a 5pz, riporterò 5pz. Qualora ci fossero caratteri diversi da un numero nella colonna qtà, riporterò zero pz.

4- Solo a questo punto (cioè dopo i controlli effettuati a sistema) l'utente potrà premere il pulsante "IMPORTA" e trovarsi magicamente l'ordine salvato.

3. AUTOCOMPLETAMENTO
Ho due campi (descrizione1 e descrizione2) in cui agevolo l'utente con l'autocompletamento. Il primo funziona tranquillamente, il secondo no.
Questo lo script per il primo autocompletamento (descrizione1)
Codice:
  <script>
	$(document).ready(function() {
	$("input#autocomplete_descrizione1").autocomplete({
		source: [<?php
		$stringa2="";
		$result2=mysql_query("SELECT DISTINCT(descrizione1) AS descrizione1 FROM articoli", $db);
		while($row=mysql_fetch_array($result2)){
			$stringa2.="\"".$row['descrizione1']."\", ";	
		}
		$stringa2=substr($stringa2,0,-2);
		echo $stringa2
		?>],
		minLength:2
	});
	});
  </script>
e questo il suo campo in cui avviene l'autocompletamento
HTML:
<input id="autocomplete_descrizione1" name="descrizione1" maxlength="24" style="width:180px" onkeyup="touppercase(this.id,this.value);"/>

Questo lo script per il secondo autocompletamento (descrizione2)
Codice:
  <script>
	$(document).ready(function() {
	$("input#autocomplete_descrizione2").autocomplete({
		source: [<?php
		$stringa3="";
		$result3=mysql_query("SELECT DISTINCT(descrizione2) AS descrizione2 FROM articoli", $db);
		while($row=mysql_fetch_array($result3)){
			$stringa3.="\"".$row['descrizione2']."\", ";	
		}
		$stringa3=substr($stringa3,0,-2);
		echo $stringa3
		?>],
		minLength:2
	});
	});
  </script>
e questo il suo campo in cui avviene l'autocompletamento (QUELLO IN CUI NON FUNZIONA)
HTML:
<input id="autocomplete_descrizione2" name="descrizione2" maxlength="24" style="width:180px" onkeyup="touppercase(this.id,this.value);"/>

Come vedete sembrano identici. Ho provato la query su mysql e funziona...

4. PROBLEMA CON DATA
Ho questo codice
PHP:
$cache_articoli_ordinati=array();
foreach ($conn->query($sql1) as $row) {
$cache_articoli_ordinati[$row["codicearticolo"]]=$row["codicearticolo"];
$cache_articoli_ordinati[$row["datainserimento"]]=$row["datainserimento"];
}
...
...
$giorni = 14;
$data_2sett_post = calcolo_data($cache_articoli_ordinati[$row["datainserimento"]], $giorni);
$stato_articolo = "<div align='center' title='Non ordinabile fino a ".$data_2sett_post."'>Non ord.</div>";
I puntini nel codice (...) stanno ad indicare che è presente altro php che non ho elencato. La query sql1 funziona perfettamente su mysql. Purtroppo, mentre $cache_articoli_ordinati[$row["codicearticolo"]]=$row["codicearticolo"]; funziona perfettamente (nel senso che il codice articolo viene estratto), il codice $cache_articoli_ordinati[$row["datainserimento"]]=$row["datainserimento"]; non estrae la data di inserimento e quindi la funzione calcolo_data effettua il conteggio per la variabile $data_2sett_post, partendo dal 1 gennaio 1970 (appunto perché non ha alcuna data di inserimento da cui partire)

Direi che ho finito i problemi... GRAZIE A TUTTI coloro che vorranno aiutarmi.
 
Problema numero 1 risolto.
Ho aggiunto una variabile alla funzione che si trova nel file di paginazione. Nel momento in cui l'utente utilizza le pagine per scorrere i risultati della ricerca precedentemente utilizzata, la variabile diventa "ON" e viene "assorbita" dalla pagina che chiama la paginazione (e crea la query per la ricerca). Quando è "ON" il refresh della pagina chiamante, non aggiorna le variabili $where, pertanto grazie all'utilizzo delle sessioni, mantengo memorizzati parametri di ricerca. In tal modo, lo scorrere delle pagine non azzera questi ultimi.
Mi sono buttato sul punto 4, in cui tutt'ora non riesco a capire il motivo per cui la il valore di datainserimento NON viene estratto e salvato nell'array $cache_articoli_ordinati.
 
Ciao Marino, non credo sia un problema di formattazione data e sai perché? Perché ho provato anche ad estrarre un altro campo (per esempio la quantità) e a salvarla nell'array, tuttavia, niente. Non mi estrae nemmeno quella. E' come se da quella query "uscisse" soltanto il codice articolo. Tutto il resto niente... non ho parole
 
Eccola.
$sql1="SELECT * FROM ordini WHERE idpdv = ".$_SESSION['cod']." AND datainserimento >= '".$data_2sett_ant."' GROUP BY codicearticolo";

Su mysql funziona, altrimenti non estrarrebbe nemmeno il codice. La data è già nel yyyy-mm-dd
 
strano che non ti dia errore, Group by deve contenere tutte le colonne della select
che non siano elementi aggregati (sum, max, min .... ) e la data non lo è ...
aggiungi nella Group by la data
ciao
Marino

ps ti conviene scrivere così

PHP:
$sql1="SELECT distinct * FROM ordini WHERE idpdv = ".$_SESSION['cod']." AND datainserimento >= '".$data_2sett_ant."'";
 
Ultima modifica:
Macchè, niente da fare. Ho provato anche senza GROUP BY. Il problema non è nella query evidentemente, ma nell'assegnazione della data nell'array. E' come se non inserisse la data di inserimento... o meglio... al di fuori del codice articolo, non riesco ad inserire altro. Ho provato con la quantità, giusto per fare un test
PHP:
$cache_articoli_ordinati[$row["codicearticolo"]]=$row["codicearticolo"]; 
$cache_articoli_ordinati[$row["quantita"]]=$row["quantita"];
Niente nemmeno così. Nel momento in cui provo ad assegnare ad una variabile qualsiasi, il valore contenuto nell'array ($row["quantità"]), il valore è vuoto. Con il codice articolo, invece, no problem...
 
potresti mettere una var_dump($row["quantita"]) , anche sulla data per vedere cosa restituisce la query
e definire il problema , se sql o variabile php
ciao
Marino
 
In merito al punto 2, sto lentamente arrivando ad una soluzione, ma...

...ho caricato i valori contenuti nel file csv (composto da due colonne, denominate codice_articolo e quantita), all'interno di array (che chiamerò A). In seguito ho estratto da un mio DB una serie di codici articolo (vi tralascio la condizione utilizzata per l'estrazione) che ho inserito in un secondo array (che chiamerò B). Ora vorrei estrarre solo i codici articolo di A che NON si trovano in B. Posso utilizzare la funzione "array_diff()" anche se i due array non hanno lo stesso numero di "colonne" e se sì, come? Nel senso che l'A ha sia i codici articolo che le rispettive quantità, mentre l'array B contiene solo i codici articolo. Vorrei assegnare tale differenza ad un terzo array (C) che contenga sia i codici articolo di A che le rispettive quantità di A. Poi scorrerlo per estrarre, infine, dal mio DB tutte le informazioni descrittive dei codici articolo di A. grazie
 
Ho provato... niente. Ti posto la select e il codice dove vorrei inserire la data inserimento

PHP:
		$sql1="SELECT DISTINCT codicearticolo, datainserimento FROM ordini WHERE idpdv = ".$_SESSION['cod']." AND datainserimento >= '".$data_2sett_ant."'";
		
		$cache_articoli_ordinati=array();
		foreach ($conn->query($sql1) as $row) {
		$cache_articoli_ordinati[$row["codicearticolo"]]=$row["codicearticolo"];
		$cache_articoli_ordinati[$row["datainserimento"]]=$row["datainserimento"];
		}

e poi

PHP:
		$cache_articoli=array();
		foreach ($conn->query($sql3) as $row) {
				
		if(isset($cache_articoli_servizio[$row["codicearticolo"]])){
		$stato_articolo = "<div align='center' title='Assegna Qtà dal menù'><a href='elimina_articolo.php?codicearticolo=".$row["codicearticolo"]."'><FONT color='#FF0000'>Elimina</FONT></a></div>";
		}else if(isset($cache_articoli_ordinati[$row["codicearticolo"]])){
		$giorni = 14;
		$data_inserimento = $row["datainserimento"];
		$data_2sett_post = calcolo_data($data_inserimento, $giorni);
		$stato_articolo = "<div align='center' title='Non ordinabile fino a ".$data_2sett_post."'>Non ord.</div>";
		}else{
		$stato_articolo="<div align='center'><a href='aggiungi.php?codicearticolo=".$row["codicearticolo"]."'>Aggiungi</a></div>";
		}
		echo"<tr><td><div align='center'>".$row['codicearticolo']."</div></td><td>".$row['descrizione1']."</td><td>".$row['descrizione2']."<td>".$stato_articolo."</td></tr>";
		}
		?>

Vedi dove ho scritto title='Non ordinabile fino a ".$data_2sett_post."'? Ecco, il risultato è: non ordinabile fino a 1970-01-15
Non estraendo nulla dal DB (ripeto che la query direttamente sul phpadmin, funziona), la funzione mi aggiunge 14 giorni al primo gennaio 1970
 
Ho provato... niente. Ti posto la select e il codice dove vorrei inserire la data inserimento

PHP:
		$sql1="SELECT DISTINCT codicearticolo, datainserimento FROM ordini WHERE idpdv = ".$_SESSION['cod']." AND datainserimento >= '".$data_2sett_ant."'";
		
		$cache_articoli_ordinati=array();
		foreach ($conn->query($sql1) as $row) {
		$cache_articoli_ordinati[$row["codicearticolo"]]=$row["codicearticolo"];
		$cache_articoli_ordinati[$row["datainserimento"]]=$row["datainserimento"];
		}

e poi

PHP:
		$cache_articoli=array();
		foreach ($conn->query($sql3) as $row) {
				
		if(isset($cache_articoli_servizio[$row["codicearticolo"]])){
		$stato_articolo = "<div align='center' title='Assegna Qtà dal menù'><a href='elimina_articolo.php?codicearticolo=".$row["codicearticolo"]."'><FONT color='#FF0000'>Elimina</FONT></a></div>";
		}else if(isset($cache_articoli_ordinati[$row["codicearticolo"]])){
		$giorni = 14;
		$data_inserimento = $row["datainserimento"];
		$data_2sett_post = calcolo_data($data_inserimento, $giorni);
		$stato_articolo = "<div align='center' title='Non ordinabile fino a ".$data_2sett_post."'>Non ord.</div>";
		}else{
		$stato_articolo="<div align='center'><a href='aggiungi.php?codicearticolo=".$row["codicearticolo"]."'>Aggiungi</a></div>";
		}
		echo"<tr><td><div align='center'>".$row['codicearticolo']."</div></td><td>".$row['descrizione1']."</td><td>".$row['descrizione2']."<td>".$stato_articolo."</td></tr>";
		}
		?>

Vedi dove ho scritto title='Non ordinabile fino a ".$data_2sett_post."'? Ecco, il risultato è: non ordinabile fino a 1970-01-15
Non estraendo nulla dal DB (ripeto che la query direttamente sul phpadmin, funziona), la funzione mi aggiunge 14 giorni al primo gennaio 1970

scusa ma nella prima parte del codice leggo
PHP:
foreach ($conn->query($sql1) as $row)
nella seconda, invece,
PHP:
foreach ($conn->query($sql3) as $row)
le sql sono diverse ...
 
Ciao Marino,

in realtà le query sono 3. La prima popola l'array contenente i codici ordinati nelle ultime due settimane, la seconda quelli ordinata nella giornata odierna (che si trovano temporaneamente parcheggiati nella tabella di servizio) e la terza query che popola l'array con tutti i codici articolo disponibili. Scorrendo quest'ultimo devo individuare quali sono i codici che l'utente può ordinare o meno (non può ordinare né gli articoli già ordinati da non meno di 14 giorni, né quelli che ha già preselezionato nella giornata odierna). Nel caso in cui i codici fossero contenuti nel primo array, voglio comunicare all'utente fino a quale data non potrà riapprovigionarsi per quel determinato codice. E' per questo che ho bisogno della data d'inserimento di quell'articolo, così posso aggiungere 14 gg e nel "title" indicare la data risultante. Come anticipato, la data d'inserimento NON mi viene estratta.
 
Appro... nel frattempo ho risolto i primi 3 punti. In merito la paginazione, non riuscivo ad estrarre i dati in quanto nel campo riservato alla descrizione 2, in alcune righe era presente il carattere degli apicetti (") che mandava in tilt la query. Ripulita la colonna, ha funzionato immediatamente.
 

Discussioni simili