Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: Help applicazione PHP

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    23

    Help applicazione PHP

    Buongiorno a tutti,

    avrei necessità di un vostro aiuto per risolvere il problema che ora vado a spiegarvi.

    Sto creando un'applicazione in php che permetta di inserire degli ordini (il db è Mysql), pertanto nel momento in cui un agente effettua il login e sceglie di immettere un nuovo ordine
    si trova di fronte una pagina nella cui parta alta può effettuare una ricerca e nella parte bassa vengono elencati gli articoli ordinabili (qualche migliaio).

    Ecco il caso concreto e tipico:

    PRIMA PARTE:
    L'agente "PIPPO" effettua il login. Dal menu principale, seleziona la voce "inserisci nuovo ordine". Decide di ricercare per "genere" utilizzando un menu a tendina e filtra tutti gli articoli che fanno parte del
    genere "spazzole". Preme il tasto ricerca e si ritrova di fronte la medesima pagina iniziale con i soli articoli filtrati. Di fianco a ciascuno di essi vi è una voce denominata "Aggiungi" che altro non è che un link
    che mi salva in una tabella "di servizio" gli articoli selezionati. A questo punto l'agente "PIPPO" decide di completare l'ordine, pertanto ritorna nel menu principale e magicamente trova una nuova voce
    (che al primo login non era visibile) denominata "completa o modifica l'ordine".

    NB: Regole stabilite
    1) ogni agente può modificare (o completare) entro le ore 23.59 SOLO gli ordini della giornata, pertanto non è possibile modificare ordini inseriti nelle giornate precedenti (in quanto già processati e spediti).
    2) ogni agente non può ordinare lo stesso codice se non sono trascorsi ALMENO 14 giorni dal precedente ordine di cui quel codice faceva parte.
    3) ogni notte, la tabella "di servizio" DEVE essere ripulita completamente.

    SECONDA PARTE:
    L'agente "PIPPO" a questo punto deve inserire le quantità. Selezionata la voce "completa o modifica l'ordine" dal menu principale, visualizzerà una pagina con l'elenco di tutti i codici precedentemente
    selezionati e di fianco a ciascuno di essi, un campo per l'immissione dei quantitativi. Premendo "Salva", nella tabella di servizio verranno aggiunte le qtà.
    Da questo momento in poi (e fino allo scoccare della mezzanotte), il nostro agente "PIPPO" avrà la possibilità di aggiungere, eliminare o modificare i quantitativi dei codici facenti parte dell'ordine inserito
    in giornata.

    Veniamo adesso alle mie difficoltà per priorità.

    1) Nella pagina di ricerca in cui compare l'elenco di tutti i codici, vorrei che di fianco a ciascuno di essi apparisse: "Aggiungi" se è solo se l'articolo è ordinabile (quindi non è MAI stato ordinato nei 14gg precedenti), "Non ordinabile" se e solo se l'articolo è parte di un ordine emesso nei 14gg precedenti) e "Aggiunto" se e solo se l'articolo è ordinabile, ma nella PRIMA PARTE (vedi sopra) è stato premuto il comando "Aggiungi" (quindi è attualmente presente nella tabella di servizio).

    2) Nella pagina dove l'agente inserisce (o modifica) le quantità, piuttosto che elimini un articolo (mettendo zero come quantità), alla pressione del tasto "Aggiorna", come faccio ad effettuare contemporaneamente un numero di UPDATE pari al numero di articoli per cui sto inserendo o modificando le quantità?

    3) E' possibile creare un JOB automatico che quotidianamente (ad una determinata ora notturna), salvi i codici con qtà maggiori di zero presenti nella tabella di servizio, nella tabella definitiva "ORDINI" ed in seguito cancelli TUTTE le righe della tabella di servizio?

    Spero di essere stato il più esauriente possibile. GRAZIE a tutti coloro che vorranno darmi i loro suggerimenti.

  2. #2
    Ciao

    piccola premessa: per dare una risposta esaustiva ed utile bisognerebbe avere uno scenario più completo della tua applicazione, capire quali framework hai usato per separare la logica dalla grafica, e capire come dialoga la parte client (html/javascript) con la parte server.

    In applicazioni di questo tipo è sempre buona norma tenere separate almeno la logica dalla grafica, tale approccio viene chiamato MVC (Model / View / Controller) e indica sostanzialmente delle best-practice per affrontare lo sviluppo di software di questo tipo.

    Ad esempio, parli di software web che sarà usato da agenti commerciali, posso quindi ipotizzare che uno dei requisiti di tale interfaccia web sia l'usabilità e la facilità di utilizzo da parte di dispositivi mobile, in tal caso ti consiglierei l'utilizzo di un framework come jquery mobile, che ti consente un'ottima astrazione e una buona compatibilità sia con i browser che con i dispositivi mobile.

    In uno scenario di questo tipo il php si dovrebbe limitare a generare "solo" delle risposte in JSON o XML.

    Fatta la premessa (magari superflua, in tal caso mi scuso) di seguito le risposte alle tue 3 domande

    Quote Originariamente inviata da iuta74 Visualizza il messaggio
    1) Nella pagina di ricerca in cui compare l'elenco di tutti i codici, vorrei che di fianco a ciascuno di essi apparisse: "Aggiungi" se è solo se l'articolo è ordinabile (quindi non è MAI stato ordinato nei 14gg precedenti), "Non ordinabile" se e solo se l'articolo è parte di un ordine emesso nei 14gg precedenti) e "Aggiunto" se e solo se l'articolo è ordinabile, ma nella PRIMA PARTE (vedi sopra) è stato premuto il comando "Aggiungi" (quindi è attualmente presente nella tabella di servizio).
    Allora, queste informazioni le trovi tutte nel database, ma visto che parli di migliaia di articoli non è consigliabile fare tutte queste query per ogni articolo, quello che ti consiglio è di usare delle strutture dati di appoggio che ti consentiranno di sapere in quale situazione si trova l'articolo per quel determinato agente.
    Esempio:

    Codice PHP:
    /*
    * step1
    * mi trovo tutti  gli aricoli ordinati negli ultimi 14 giorni
    */
    $sql="select codice_articolo from tabella_storico_ordini where id_agente=xx and data_ordine >= '".$data_odierna_meno_15_giorni."' group by codice_articolo";

    $cache_articoli_ordinati=array();
    foreach (
    $conn->query($sql) as $row) {
    $cache_articoli_ordinati[$row["codice_articolo"]]=$row["codice_articolo"];
    }

    /*
    * step 2
    * mi trovo tutti gli articoli nella tabella di servizio per questo agente
    */
    $sql="select codice_articolo from tabella_servizio where id_agente=xx group by codice_articolo'";

    $cache_articoli_servizio=array();
    foreach (
    $conn->query($sql) as $row) {
    $cache_articoli_servizio[$row["codice_articolo"]]=$row["codice_articolo"];
    }

    /*
    * step 3
    * quando ciclo sui vari articoli decido in quale delle 3 situazioni mi trovo
    */

    foreach($articoli as $codice_articolo){

    if(isset(
    $cache_articoli_servizio[$codice_articolo])){
    $stato_articolo="Aggiunto";
    }else if(isset(
    $cache_articoli_ordinati[$codice_articolo])){
    $stato_articolo="Non Ordinabile";
    }else{
    $stato_articolo="Aggiungi";
    }



    Quote Originariamente inviata da iuta74 Visualizza il messaggio
    2) Nella pagina dove l'agente inserisce (o modifica) le quantità, piuttosto che elimini un articolo (mettendo zero come quantità), alla pressione del tasto "Aggiorna", come faccio ad effettuare contemporaneamente un numero di UPDATE pari al numero di articoli per cui sto inserendo o modificando le quantità?
    avrai un array di articoli su cui ciclare ed eseguire le varie query, per dare una risposta più esaustiva bisogna capire come invii dal browser al server le informaizoni su questa richiesta (GET o POST? come json o come form?)

    Quote Originariamente inviata da iuta74 Visualizza il messaggio
    3) E' possibile creare un JOB automatico che quotidianamente (ad una determinata ora notturna), salvi i codici con qtà maggiori di zero presenti nella tabella di servizio, nella tabella definitiva "ORDINI" ed in seguito cancelli TUTTE le righe della tabella di servizio?

    Spero di essere stato il più esauriente possibile. GRAZIE a tutti coloro che vorranno darmi i loro suggerimenti.
    si, basta che fai uno script php che esegue la specifica query e poi lo lanci tramite crontab oppure con le oprazioni pianificate di windows, se non hai a disposizione la possibilità di pianificare dei task sulla macchina puoi fare una pagina php che richiede determinati parametri di autenticazione e si occupa di fare la richiesta (e poi tu schedulerai una richiesta di questo tipo su un sistema di terze parti)

    Ciao
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    23
    Caro Nik, innanzitutto grazie della risposta e della premessa. Terrò conto di tutti i tuoi suggerimenti, tuttavia al momento l'applicazione girerà solo su una intranet aziendale e l'accesso avverrà soltanto attraverso pc dotati delle medesime caratteristiche.

    Anch'io vorrei fare una premessa: sono un "asino" della programmazione, o meglio sono anni che non scrivo righe di codice. Mai utilizzato PHP. Vivo di qualche reflusso ed è per questo posto qui dove ho sempre ricevuto l'aiuto sperato. Non volermene se non apprendo al "primo colpo" i tuoi suggerimenti...

    Tornando a noi... la parte grafica è essenziale. A parte un logo aziendale, ho scelto un layout semplice e di facile produzione. Banalmente ci sono due tabelle nella pagina. Quella in alto contiene i campi per la ricerca, quella in basso (generata dinamicamente) è il risultato della ricerca. Alla prima visualizzazione, non essendoci alcun filtro, l'elenco dei codici è completo (ovviamente impaginato). Il risultato estetico è discreto... semplice e pulito. Gli agenti devono inserire gli ordini, se vogliono, possono visualizzare lo storico, ma null'altro.

    Tornando al primo punto (che ritengo più ostico), vediamo se ho inteso correttamente.

    1 - Creo un array a cui assegno tutti gli articoli ordinati negli ultimo 14 giorni dall'agente che in quel momento sta utilizzando
    l'applicazione.
    2 - Ne creo un secondo a cui assegno eventuali articoli preselezionati dallo stesso agente nella giornata odierna.
    3- Effettuo una select generale dall'anagrafica articoli (che però non vedo nel tuo codice) e, per ciascuna riga, controllo se quel codice è presente nel secondo array (immagino tu mi faccia partire dal secondo in quanto è il più leggero). Se fosse presente, vuol dire che è stato già pre-selezionato, quindi gli assegno il valore "Aggiunto" e salto al codice successivo. Qualora invece non lo trovassi nel secondo array, lo cerco nel primo e, se lo trovo, gli assegno il valore "Non ordinabile". Se nemmeno nel secondo array fosse presente, assegno allo stato del codice il valore "aggiungi".

    Corretto?

  4. #4
    Quote Originariamente inviata da iuta74 Visualizza il messaggio

    1 - Creo un array a cui assegno tutti gli articoli ordinati negli ultimo 14 giorni dall'agente che in quel momento sta utilizzando
    l'applicazione.
    2 - Ne creo un secondo a cui assegno eventuali articoli preselezionati dallo stesso agente nella giornata odierna.
    3- Effettuo una select generale dall'anagrafica articoli (che però non vedo nel tuo codice) e, per ciascuna riga, controllo se quel codice è presente nel secondo array (immagino tu mi faccia partire dal secondo in quanto è il più leggero). Se fosse presente, vuol dire che è stato già pre-selezionato, quindi gli assegno il valore "Aggiunto" e salto al codice successivo. Qualora invece non lo trovassi nel secondo array, lo cerco nel primo e, se lo trovo, gli assegno il valore "Non ordinabile". Se nemmeno nel secondo array fosse presente, assegno allo stato del codice il valore "aggiungi".

    Corretto?
    Corretto.

    Non ho messo la query degli articoli perchè non avendo la struttura del db potrei solo mettere una cosa generica come select * from articoli.

    in realtà vi sarebbe un'altra strada che ti consentirebbe di risolvere tutto con una unica query, ma bisogna avere chiara la struttura del db e soprattutto devono esserci degli indici altrimenti il sistema potrebbe risultare molto poco performante.

    In sostanza si tratterebbe di fare una query con 2 left join tra la tabella degli articoli, quella degli ordini e quella di appoggio ma se non hai dimestichezza con l'sql per il momento telo sconsiglio.
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    23
    Quote Originariamente inviata da nik600 Visualizza il messaggio
    In sostanza si tratterebbe di fare una query con 2 left join tra la tabella degli articoli, quella degli ordini e quella di appoggio ma se non hai dimestichezza con l'sql per il momento telo sconsiglio.
    Ciao Nik,
    interessante la soluzione che mi proponi (non mi stanco mai d'imparare). Se non ti dispiace mi piacerebbe comunque tentarla... hai tempo per l'SQL corretto?

    Senza elencarti tutti i campi per ciascuna tabella... posso semplicemente indicarti quelli che "contano" per ognuna di loro.

    ARTICOLI: codice_articolo, descrizione
    ORDINI_STORICO: data_inserimento, id_agente, codice_articolo, quantita
    ORDINI_TEMP: id_agente, codice_articolo, quantita

  6. #6
    Questa dovrebbe essere la query:

    $data_cond=date("Y-m-d",time()-86400*15);


    select a.*,b.codice_articolo as codice_articolo_storico,c.codice_articolo as codice_articolo_temp
    from ARTICOLI as a left join ORDINI_STORICO as b on (a.codice_articolo = b.codice_articolo and b.id_agente=x and b.data_inserimento >= '$data_cond')
    left join ORDINI_TEMP as c on (a.codice_articolo=b.codice_articolo)

    nel caso in cui l'articolo sia stato ordinato negli ultimi giorni il valore del campo codice_articolo_storico sarà il codice dell'articolo, altrimenti sarà NULL
    nel caso in cui l'articolo sia stato ordinato oggi il valore del campo codice_articolo_temp sarà il codice dell'articolo, altrimenti sarà NULL


    Ciao
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    23
    Perfetto Nik, adesso provo la prima soluzione e poi testo la super query con le varie join. Ti chiedo un chiarimento in merito la prima soluzione... quando scrivi...

    /*
    * step 3
    * quando ciclo sui vari articoli decido in quale delle 3 situazioni mi trovo
    */

    foreach($articoli as $codice_articolo){

    if(isset(
    $cache_articoli_servizio[$codice_articolo])){
    $stato_articolo="Aggiunto";
    }else if(isset(
    $cache_articoli_ordinati[$codice_articolo])){
    $stato_articolo="Non Ordinabile";
    }else{
    $stato_articolo="Aggiungi";
    }

    }

    $articoli è il terzo array in cui ho salvato la select di tutti i codici articolo dell'anagrafica articoli? Grazie

  8. #8
    Si
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    23
    Nik ti chiedo di mantenere un certo contegno nei miei riguardi, quindi non mandarmi a quel paese... la prima soluzione non mi ha portato risultati. Sembrerebbe che ogni $stato_articolo sia sempre uguale a "Aggiungi". Posto il codice.
    codice:
            $result=mysql_query("SELECT * FROM articoli".$where."ORDER BY descrizione1 ASC LIMIT $from, $max_results ");
            
            /*
            * step1
            * mi trovo tutti  gli articoli ordinati negli ultimi 14 giorni dall'agente
            */
            $sql1="SELECT codice_articolo FROM ordini WHERE id_agente = ".$_SESSION['cod']." AND data_inserimento >= '".$data_2sett_ant."' GROUP BY codice_articolo";
            
            // connessione al database server
            $username="user";
            $password="psw";
            $database="ORDINI";
            
            $conn=mysqli_connect(localhost,$username,$password,$database);
    
    
            $cache_articoli_ordinati=array();
            foreach ($conn->query($sql1) as $row) {
            $cache_articoli_ordinati[$row["codice_articolo"]]=$row["codice_articolo"];
            }
            
            /*
            * step 2
            * mi trovo tutti gli articoli nella tabella di servizio per questo agente
            */
            $sql2="SELECT codice_articolo FROM ordini_temp WHERE id_agente = ".$_SESSION['cod']." GROUP BY codice_articolo";
            
            $cache_articoli_servizio=array();
            foreach ($conn->query($sql2) as $row) {
            $cache_articoli_servizio[$row["codice_articolo"]]=$row["codice_articolo"];
            }
            
            /*
            * step 3
            * estraggo tutti gli articoli nella tabella articoli
            */
            $sql3="SELECT * FROM articoli".$where."ORDER BY descrizione1";
            
            $cache_articoli=array();
            foreach ($conn->query($sql3) as $row) {
            $cache_articoli[$row["codice_articolo"]]=$row["codice_articolo"];
            }
            
            /*
            * step 4
            * quando ciclo sui vari articoli dell'anagrafica decido in quale delle 3 situazioni mi trovo
            */
            
            while ($i = mysql_fetch_array($result))
            {
            foreach($cache_articoli as $codice_articolo){
            
            if(isset($cache_articoli_servizio[$codice_articolo])){
            $stato_articolo="Aggiunto";
            }else if(isset($cache_articoli_ordinati[$codice_articolo])){
            $stato_articolo="Non Ordinabile";
            }else{
            $stato_articolo="Aggiungi";
            }
            
            }  
    
    
            echo"<tr><td><div align='center'>".$i['codice_articolo']."</div></td><td>".$i['descrizione1']."</td><td>".$i['descrizione2']."<td>".$stato_articolo."</td></tr>";
            }
            $i++;
    Ho visualizzato le query e funzionano tutte su mysql.
    $result è la mia query che fa parte della paginazione. Temo di essermi incasinato nella nidificazione per la creazione di ogni singola riga degli articoli.

  10. #10
    Ciao

    effettivamente c'è un pò di confusione.

    Gli step da seguire in ordine logico sono i seguenti:

    1 - apri la connessione al database
    2 - esegui le query e ti crei la struttura dati di appoggio
    3 - cicli sugli articoli e generi la stringa html

    Attualmente ci sono un pò di cose confusionali, come ad esempio:
    - crei una connessione con le funzioni native di mysql ma poi ne fai il fetch usando l'esempio che ti avevo dato io (che però usava PDO)
    - ci sono dei foreach innestati che non servono
    - lo step 4 non serve

    Questo dovrebbe essere il codice corretto: (nota: non ho modo di testarlo, quindi seguine la logica)

    <?php


    $id_agente="1";
    $db_user="user";
    $db_pass="psw";
    $db_name="ORDINI";
    $db_host="127.0.0.1";


    $conn = new PDO("mysql:host=$db_host;dbname=$db_name",$db_user ,$db_pass);


    /*
    * step1
    * mi trovo tutti gli articoli ordinati negli ultimi 14 giorni dall'agente
    */
    $sql1="SELECT codice_articolo FROM ordini WHERE id_agente = ".$id_agente." AND data_inserimento >= '".$data_2sett_ant."' GROUP BY codice_articolo";


    $cache_articoli_ordinati=array();
    foreach ($conn->query($sql1) as $row) {
    $cache_articoli_ordinati[$row["codice_articolo"]]=$row["codice_articolo"];
    }


    /*
    * step 2
    * mi trovo tutti gli articoli nella tabella di servizio per questo agente
    */
    $sql2="SELECT codice_articolo FROM ordini_temp WHERE id_agente = ".$_SESSION['cod']." GROUP BY codice_articolo";


    $cache_articoli_servizio=array();
    foreach ($conn->query($sql2) as $row) {
    $cache_articoli_servizio[$row["codice_articolo"]]=$row["codice_articolo"];
    }


    /*
    * step 3
    * estraggo tutti gli articoli nella tabella articoli
    */
    $sql3="SELECT * FROM articoli".$where."ORDER BY descrizione1";


    $cache_articoli=array();
    foreach ($conn->query($sql3) as $row) {


    if(isset($cache_articoli_servizio[$row["codice_articolo"]])){
    $stato_articolo="Aggiunto";
    }else if(isset($cache_articoli_ordinati[$row["codice_articolo"]])){
    $stato_articolo="Non Ordinabile";
    }else{
    $stato_articolo="Aggiungi";
    }
    echo"<tr><td><div align='center'>".$row['codice_articolo']."</div></td><td>".$row['descrizione1']."</td><td>".$row['descrizione2']."<td>".$stato_articolo."</td></tr>";
    }


    ?>
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.