Problema di logica

di il
6 risposte

Problema di logica

Salve a tutti, vorrei porvi il mio quesito che da giorni non mi fa dormire:
PREMESSA "P" sta per prenotati ESEMPIO
senza P prodotti venduti ma non prenotati
-Ho un file che contiene vari prodotti (ES. prodotto1P, prodotto2P, prodotto3, prodotto4P, prodotto5 etc....).
-Da questo file, tramite un espressione regolare in php, isolo i prodotti con la "P" e li inserisco all'interno di un database mysql tramite la funzione INSERT INTO.
-Tutto avviene grazie ad un batch che monitora l'ultima modifica del file (ovvero quando il file subisce una modifica lancia il file php con l'espressione regolare e la query di inserimento) E FIN QUI TUTTO FUNZIONA ALLA PERFEZIONE.

Tenere presente che talvolta un prodotto prenotato (prima di essere ordinato definitivamente) viene eliminato VOLUTAMENTE perchè non deve essere più ordinato (quindi se era stato precedentemente inserito nel database dovrà essere eliminato)

PROBLEMA: Questo file ad una certa ora NON REGOLARE (2 volte al giorno ovvero quando si effettua l'ordine definitivo) si svuota NON COMPLETAMENTE (non so perchè restano alcuni prodotti, sia con la P che senza la P, che però non hanno nessuna importanza nel mio caso).

Se usassi la funzione REPLACE invece di INSERT INTO sarebbe perfetto! Ma ahimè il file si svuoterà ad una certa ora e quindi all'interno del database verranno cancellati tutti i prodotti...quindi sono bloccato!
Come potrei risolvere?

PS.non ho postato codice per essere il più chiaro possibile...(se serve sarò lieto di postarlo) il mio non è un problema di codice ma di logica! GRAZIE

6 Risposte

  • Re: Problema di logica

    Prova a controllare cosa succede realmente quelle 2 volte al giorno ovvero quando si effettua l'ordine definitivo.

    In diversi anni mi è capitato personalmente di avere parti di programma che sembrano perfette, eppure...
  • Re: Problema di logica

    "replace" non c'entra nulla, in mysql sostituisce le stringhe.

    non ho capito affatto quanto descrivi, perchè insert into aggiunge sempre (al massimo fallisce per chiave primaria duplicata), non cancella nulla.
    bisogna che dettagli di più.

    PS quasi certamente puoi importare direttamente il file dentro mysql senza necessità di PHP, con prestazioni enormemente maggiori, ma dipende dalla complessità del file medesimo
  • Re: Problema di logica

    cgf ha scritto:


    Prova a controllare cosa succede realmente quelle 2 volte al giorno ovvero quando si effettua l'ordine definitivo.

    In diversi anni mi è capitato personalmente di avere parti di programma che sembrano perfette, eppure...
    Ho gia controllato praticamente:
    -I prodotti con la P sono quelli che vengono prenotati manualmente ovvero il cliente entra e cerca un prodotto che non abbiamo in magazzino quindi io glielo prenoto nel gestionale! Quando glielo prenoto viene inserita la stringa nel file (che quindi subisce una modifica e grazie al batch, che monitora l'ultima modifica, parte l'estrazione dei dati e l'inserimento nel db).
    -I prodotti senza la P sono quelli che vengono venduti ma non riordinati (semplicemente vengono visualizzati quando si effettua l'ordine definitivo perchè nel caso servissero vengano riordinati per tenerli in giacenza nel magazzino).
    Quando viene effettuato l'ordine definitivo i prodotti con la P e senza la P vengono rimossi da quel file e purtroppo non so dove finiscano (il gestionale è proprietario ed è gia una grande cosa se sono riuscito a fare questo) ma in qualunque caso non servirebbe sapere dove siano finiti poichè sicuramente il flag P sarà scomparso. Infatti tutto questo lavoro serve per poter identificare, dopo che siano stati ordinati definitivamente, i prodotti prenotati, che il gestionale (BENEDETTO CHI LO FECE), non distinguerà più.

    +m2+ ha scritto:


    "replace" non c'entra nulla, in mysql sostituisce le stringhe.
    non ho capito affatto quanto descrivi, perchè insert into aggiunge sempre (al massimo fallisce per chiave primaria duplicata), non cancella nulla.
    bisogna che dettagli di più.
    PS quasi certamente puoi importare direttamente il file dentro mysql senza necessità di PHP, con prestazioni enormemente maggiori, ma dipende dalla complessità del file medesimo
    Si REPLACE sostituisce le stringhe quindi se un prodotto "P" viene cancellato prima di essere ordinato definitivamente viene eliminato anche nel db (è CIO CHE VOGLIO) però quando il file si svuoterà cancellerà tutti gli altri record corretti!
    Attualmente sto usando INSERT perchè non posso usare REPLACE: se un prodotto prenotato non serve più (es. viene il cliente ordina un prodotto grande 10 millilitri e poi lo vuole da 50 millilitri o non lo vuole più) nel database non verrà eliminato!
    Il php mi serve per l'espressione regolare e per l'array adesso posto il codice (la query è cosi perchè è arrangiata ovviamente)
    
    	//Richiamo file da utilizzare
    $txt = file_get_contents('./file', true);
    	//Caratteri speciali + Espressione regolare che ricerca il testo in questione nel file
    $specialChars = preg_quote( '#$%^&*()+=-[]\';,./{}|\":<>?~', '#' );
    preg_match_all('#([0-9]{4,9}\s+[A-Z]{1}\s+([' . $specialChars . 'A-Z0-9 ]+)\s+([0-9]{3,7})n?\s+P\s+([0-9]+))#', $txt, $match); 
    	//Array con gli elementi estratti dal file
    $products = [];
        foreach (array_keys($match[2]) as $idx) {
    		$tagliaprodotto = rtrim(substr($match[2][$idx],1));
    		$tagliaquantita = ltrim($match[3][$idx],'0');
            $products[] = [
                'prodotto'  => $tagliaprodotto,
                'quantita' => $tagliaquantita,
                'terminale'   => $match[4][$idx]
            ];
        }
    	//Query di inserimento che aggiorna quantità e terminale di inserimento
    $query = $pdo->prepare('INSERT INTO tabella (prodotto, quantita, terminale, data) VALUES (:prodotto, :quantita, :terminale, NOW()) ON DUPLICATE KEY UPDATE quantita = VALUES(quantita), terminale = VALUES(terminale)');
    
    	//cicla
    foreach ($products as $product) {
    $query->execute($product);
        }
  • Re: Problema di logica

    Davvero ci vuol troppo tempo, almeno per me, per "decodificare" quanto scrivi.
    dai per scontato che si sappia cos'è e come funziona, quando e perchè saltano fuori queste P eccetera.
    però quando il file si svuoterà cancellerà tutti gli altri record corretti!
    questa frase, ad esempio, è del tutto incomprensibile.

    più banalmente metti un esempio di questo file, come si evolve, cosa vuoi fare.
    forse è meglio.
  • Re: Problema di logica

    Anche io non avevo capito la storia su html.it e continuo adesso qui...
  • Re: Problema di logica

    Ragazzi chiedo scusa... se volete potete scaricare il tutto qui
    J J 023745072    G       0KANRENOL*20CPR 100MG                    00003n   01 J J 905351387    G       9EUMILL PROTECTION GTT OCUL10FL          00001n   04 J J 021643046    G       0ANAFRANIL*20CPR DIV 75MG RP             00002n   05 J J 939132104    G       9NOVELTY FAMILY SH ANTIFORF 250          00001n   04 J    [”  5076    G       0BETABIOPTAL*COLL SOLUZ5ML ABAK          00001n   05 J J 970406613    G       9POLICALM SHOWER GEL 300ML CE            00001  P 04 J    Yr  5072    G       0KANRENOL*20CPR 100MG                    00001n   03 J    ?Ú  3076    G       0PRISMA*30CPS 50MG                       00002n   01 J    |Ê  3103    G       0BRUFEN*OS GRAT 30BUST 600MG             00001n   05 J J 027617024    G       0ESAPENT*20CPS MOLLI 1000MG              00001n   03  J    %ô  6011    G       0DIIDERGOT*OS GTT 15ML 0,2%              00001  P 05 J    iæ  1052    V       0CORSODYL*SPRAY 60ML 200MG/100M          00001n   06 J J 015896018    V       0MUSCORIL*IM 6F 4MG 2ML                  00001n   02 J J 021688027    G       0STUGERON*20CPS 75MG                     00001n   01 J J 938832096    G       9ALFA 4 DET DELICATO PH ACIDO            00001  P 03 J    lV  9020    G       0GUTTALAX*OS GTT 15ML 7,5MG/ML           00002n   05 J J 020851046    G       0SPASMEX*20CPR 80MG+80MG                 00001n   04
    Questo è un file di esempio (potete trovare i prodotti con la P cercando nel testo spazio-spazio-P-spazio).
    Vi spiego tutta la storia...sembra una cosa semplice ma non lo è (secondo il mio parere)

    CASO 1: Tu vieni in farmacia e ti serve un prodotto: ES.= BRUFEN*OS GRAT 30BUST 600MG (è presente sopra nel file d'esempio)
    Ce l'ho e te lo vendo.. nel file viene aggiunto QUESTO ---> J |Ê 3103 G 0BRUFEN*OS GRAT 30BUST 600MG 00001n 05
    Viene aggiunto perchè quando a metà giornata verrà effettuato l'ordine definitivo, colui che è addetto a fare l'ordine, deciderà se riacquistarlo (per ternerlo in giacenza nel magazzino) o non riordinarlo. Ma comunque a me non servono questi prodotti e non li terremo in considerazione.
    CASO 2: Tu vieni in farmacia e ti serve un prodotto: ES.= ALFA 4 DET DELICATO PH ACIDO (è presente sopra nel file d'esempio)
    Non ce l'ho quindi te lo prenoto all'interno del gestionale e nel file verrà aggiunto QUESTO ---> J J 938832096 G 9ALFA 4 DET DELICATO PH ACIDO 00001 P 03
    Io ho bisogno di salvare questi prodotti da un altra parte poichè quando a metà giornata verrà effettuato l'ordine definitivo essi non saranno più distinguibili, all'interno del gestionale, dai prodotti ordinati quotidianamente (ovvero i non prenotati da tenere in giacenza nel magazzino). Quindi, quando tu cliente lo verrai a ritirare, ovviamente senza ricordarti il nome, io non ti saprò dire quale prodotto era stato ordinato appositamente per te!.

    PROBLEMA 1: Quando viene effettuato l'ordine definitivo (a mezza giornata) il file si svuota ma non so il perchè alcuni prodotti SIA CON LA P che SENZA LA P restano nel file quindi non si può sfruttare un if del tipo se i prodotti con la P=0 non eseguire la query.
    PROBLEMA 2: Adesso per arrangiarmi utilizzo una query INSERT INTO quindi come ho detto prima se viene il cliente ordina un prodotto grande 10 millilitri (io nel frattempo gliel'ho prenotato) e poi lo vuole da 50 millilitri o non lo vuole più nel database mi troverò:
    -2 prodotti ovvero 1 da 50 millilitri ed uno da 8 millilitri (nel caso in cui il cliente abbia fatto questo cambio di grandezza)
    -1 prodotto (es. 50 millilitri) nel caso in cui io gliel'abbia già ordinato e lui non lo voglia più!.
    Non so più in che altro modo spiegarmi! GRAZIE A TUTTI PER L'ATTENZIONE

    Procediamo per gradi:
    1)Avrei bisogno di una query che elimini i prodotti con la P, dal database, qualora vengano eliminati volontariamente all'interno del gestionale
    2)Che non elimini tutto quando il file si svuoterà!

    EDIT
    +m2+ hai ragione ho confuso l'uso di replace!

    In alto a tutto c'è anche il sistema completo... se qualcuno mi sa aiutare mi farebbe un grande favore. Non so proprio come muovermi.
Devi accedere o registrarti per scrivere nel forum
6 risposte