Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [MYSQL] creazione gestione magazzino

    Ciao
    Vorrei creare una piccola gestione magazzino.
    Ho buttato giù una bozza di quelle che dovrebbero essere le tabelle necessarie allo scopo.
    Vorrei solo un parere se le tabelle sono sufficienti e se ho dimenticato qualcosa di necessario o utile.
    Queste sono le tabelle a cui ho pensato di creare:

    sql_mag_articoli (elenco articoli)
    id_articolo
    Descriz_art
    scorta_minima

    sql_mag_fornitori (elenco fornitori)
    id_fornitore
    rag_sociale
    indirizzo
    telefono

    sql_mag_acquisti (diario acquisti)
    id_acquisti
    data_acquisto
    id_fornitore
    articolo
    prezzo_acquisto
    prezzo_vendita (sarà un campo nascosto, forse)
    qta_acquisto

    sql_mag_vendita (diario vendite)
    id_vendita
    data_vendita
    cliente
    id_articolo
    qta_vendita

    Non ho messo il seguente campo perchè contiene valori che calcolo al volo quando serve.
    La scorta attuale del magazzino verrebbe effettuata calcolando le entrate e le uscite degli articoli
    Se la scorta attuale scende al di sotto della scorta minima indicata in ciascun articolo viene segnalato in inserimento vendita o in visualizzazione articoli.

    Grazie per l'attenzione

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Tutti i fornitori ti possono fornire tutti gli articoli ??
    Cosi sembrerebbe di Sì

    in alternativa devi fare una altra tabella per la relazione "molti a molti" fra tabella fornitori e tabella articoli
    dove definisci per ogni fornitore gli articoli che vende
    oppure ( ma è la stessa cosa ) per ogni articolo i fornitori che lo vendono

    Ma forse alle 04.31 di notte sono offuscato, pensaci bene quello che ti ho proposto
    sopra potrebbe portare piu complicazioni che benefici
    dopo tutto se tu nella tabella "sql_mag_acquisti" dici che compri dal fornitore xxx l'articolo yyy
    significa che quel fornitore lo vende .......

    __________________________________________________ ___

    altra cosa, noto che non hai la tabella clienti ???
    bensi solamente un campo non relazionato a nulla nella tabella "
    sql_mag_vendita"

    sembrerebbe un magazzino per la vendita al dettaglio a dei clienti
    di passaggio, Giusto??


    Buona notte

  3. #3
    Ciao nman,
    Grazie per la risposta.
    Per il primo punto avevo pensato anch'io ad una tabella simile (fornitori - articoli). Ma, per come l'avevo pensata io, in una procedura per il rifornimento non saprei come andare a pescare questa relazione.
    Se invece ritieni che questa tabella possa semplificarmi la vita, mi potresti indicare i campi necessari?

    Per il secondo punto una anagrafica del cliente non mi interessa perchè, come hai ben immaginato, tratterei solo clienti occasionali. Anzi, a questo punto, toglierei anche il nome del cliente perchè in effetti quando io vado a far spesa il commerciante si limita a fare lo scontrino fiscale che in alcuni casi oltre che essere un documento fiscale provvede a fare lo scarico del magazzino.

    Per il resto pare che anche tu sei d'accordo sulla struttura generale del magazzino.

    OT: 'mmazza ho scoperto che c'è chi naviga in ore più tarde di me

  4. #4
    Ciao
    allora dopo la creazione delle tabelle e l'inserimento di alcuni record per eseguire le prime prove vengo a trovarmi subito con dei primi problemi per la visualizzazione dei dati.

    Spiego subito le prime interrogazioni che sto facendo al nuovo DB.
    prima richiesta:
    Estrarre tutti gli articoli compresi quelli che non sono mai stati caricati
    seconda richiesta:
    Estrarre tutti gli articoli sia quelli caricati in magazzino che quelli scaricati
    Le query che sto usando sono queste:
    Per la prima richiesta:
    Codice PHP:
    $Query "SELECT sql_mag_articoli.id_articolo, 
        CONCAT_WS(' ', sql_mag_fornitori.rag_sociale, sql_mag_articoli.descr_articolo) AS prodotto, 
        SUM(sql_mag_acquisti.qta_acquisto) AS qta
        FROM sql_mag_fornitori 
        INNER JOIN sql_mag_articoli 
        ON sql_mag_fornitori.id_fornitore = sql_mag_articoli.id_fornitore 
        INNER JOIN sql_mag_acquisti 
        ON sql_mag_acquisti.id_articolo = sql_mag_articoli.id_articolo
        GROUP BY (prodotto) 
        ORDER BY sql_mag_articoli.id_articolo"

    Per la seconda richiesta:
    Codice PHP:
    $Query "SELECT CONCAT_WS(' ', sql_mag_fornitori.rag_sociale, sql_mag_articoli.descr_articolo) AS prodotto, 
        SUM(sql_mag_acquisti.qta_acquisto) AS qta_acquistata, 
        SUM(sql_mag_vendita.qta_vendita) AS qta_venduta, 
        (SUM(sql_mag_acquisti.qta_acquisto) - SUM(sql_mag_vendita.qta_vendita)) AS giacenza
        From 
        ((sql_mag_articoli INNER JOIN sql_mag_fornitori USING (id_fornitore)) 
        INNER JOIN sql_mag_acquisti USING (id_articolo)) 
        INNER JOIN sql_mag_vendita USING (id_articolo) 
        GROUP BY (prodotto)"

    Però nessuna delle due query restituisce quel che mi aspetto. Come si vede ho provato sia con le parentesi che circondano le JOIN sia senza.
    Infatti quel che vorrei ottenere sarebbe l'elenco completo di tutti gli articoli sia quelli caricati che quelli non caricati, sia quelli scaricati che quelli non scaricati.
    Invece ottengo solo l'elenco degli articoli che hanno avuto dei movimenti.
    Per spiegare meglio consiglierei di controllare le prove che sto facendo in questa pagina:
    http://mikevba.altervista.org/nuovo/...situazione.php
    Sicuramente non so organizzarmi per lavorare con più tabelle.
    Qualcuno potrebbe darmi una mano?
    Grazie

  5. #5
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Io non uso MySql,

    pero direi che il tuo problema deriva da "INNER JOIN" sostituiscilo con "LEFT JOIN" oppure con "RIGHT JOIN"

    INNER JOIN prende tutti i record comuni fra le 2 tabelle
    LEFT JOIN prendr tutti i record della tabella di sinistra+ i corrispondenti di destra
    RIGHT JOIN prendr tutti i record della tabella di destra + i corrispondenti di sinistra


    tu non hai 4 tabelle quindi si complica ancora d piu

    .

  6. #6
    Perfetto nman.
    Ho sostituito le INNER JOIN con le LEFT JOIN ottenendo così un recordset completo di tutti gli articoli con o senza i movimenti.
    Però non so se, nonostante il risultato è quello atteso, la sequenza con cui queste si susseguono è esatta ed in seguito potrebbe darmi problemi.
    Le due query modificate sono quelle che mostro qui di seguito:
    la prima:
    Codice PHP:
    $Query "SELECT sql_mag_articoli.id_articolo, 
        CONCAT_WS(' ', sql_mag_fornitori.rag_sociale, sql_mag_articoli.descr_articolo) AS prodotto, 
        SUM(sql_mag_acquisti.qta_acquisto) AS qta
        FROM 
        sql_mag_fornitori LEFT JOIN sql_mag_articoli ON sql_mag_fornitori.id_fornitore = sql_mag_articoli.id_fornitore 
        LEFT JOIN sql_mag_acquisti ON sql_mag_acquisti.id_articolo = sql_mag_articoli.id_articolo
        GROUP BY (prodotto) 
        ORDER BY sql_mag_articoli.id_articolo"

    La seconda :
    Codice PHP:
    $Query "SELECT sql_mag_articoli.id_articolo, 
        CONCAT_WS(' ', sql_mag_fornitori.rag_sociale, sql_mag_articoli.descr_articolo) AS prodotto, 
        SUM(sql_mag_acquisti.qta_acquisto) AS qta_acquistata, 
        SUM(sql_mag_vendita.qta_vendita) AS qta_venduta, 
        (SUM(sql_mag_acquisti.qta_acquisto) - SUM(sql_mag_vendita.qta_vendita)) AS giacenza
        From 
        sql_mag_articoli LEFT JOIN sql_mag_fornitori USING (id_fornitore)
        LEFT JOIN sql_mag_acquisti USING (id_articolo)
        LEFT JOIN sql_mag_vendita USING (id_articolo) 
        GROUP BY (prodotto)
        ORDER BY sql_mag_articoli.id_articolo"

    Il risultato ovviamente è sempre questo
    http://mikevba.altervista.org/nuovo/...situazione.php

  7. #7
    ... purtroppo sono ancora qui.
    Prima ero troppo concentrato sulla questione della JOIN, ma osservando e confrontando i dati mi sono accorto che per almeno uno di questi il risultato non è congruente
    intanto ho modificato la seconda Query per il riepilogo.
    Ho sostituito la istruzione
    Codice PHP:
    SUM(sql_mag_acquisti.qta_acquisto) - SUM(sql_mag_vendita.qta_vendita) AS giacenza 
    con questa
    Codice PHP:
    if ( (SUM(sql_mag_vendita.qta_venditaIS  NULL), (SUM(sql_mag_acquisti.qta_acquisto)),  (SUM(sql_mag_acquisti.qta_acquisto) - SUM(sql_mag_vendita.qta_vendita)) )  AS giacenza 
    Questo perchè mi rimanevano dei campi giacenza vuoti.
    Però ora ho un nuovo problema (che, anche se c'era, non avevo notato prima).
    Intanto questa è la nuova Query:
    Codice PHP:
    $Query "SELECT sql_mag_articoli.id_articolo, 
        CONCAT_WS(' ', sql_mag_fornitori.rag_sociale, sql_mag_articoli.descr_articolo) AS prodotto, 
        SUM(sql_mag_acquisti.qta_acquisto) AS qta_acquistata, 
        SUM(sql_mag_vendita.qta_vendita) AS qta_venduta, 
        if ( (SUM(sql_mag_vendita.qta_vendita) IS NULL), (SUM(sql_mag_acquisti.qta_acquisto)), (SUM(sql_mag_acquisti.qta_acquisto) - SUM(sql_mag_vendita.qta_vendita)) ) AS giacenza
        From 
        sql_mag_articoli LEFT JOIN sql_mag_fornitori USING (id_fornitore)
        LEFT JOIN sql_mag_acquisti USING (id_articolo)
        LEFT JOIN sql_mag_vendita USING (id_articolo) 
        GROUP BY (prodotto)
        ORDER BY sql_mag_articoli.id_articolo"

    Non capisco perchè l'articolo con ID 5 relativo al prodotto Sadam Zucchero semolato mi da come quantita_acquistata giusto il doppio di quella che è realmente.
    Ho notato che lo stesso articolo 5 è stato venduto due volte. Ma questo penso che non debba influenzare il risultato.

    Per non riempire il post di codici e tabelle troppo prolisse vi manderei alla mia pagina di prova:
    http://mikevba.altervista.org/nuovo/...o/giacenze.php
    In questa pagina i primi riquadri presentano il semplice contenuto delle tabelle
    Poi c'è una Query che io stesso reputo sbagliata
    Poi c'è la Query ultima elaborata
    e finisco con una semplice query che mi da la giusta giacenza ma che è poco rappresentativa.

    Intanto, in attesa di un aiuto o un suggerimento continuerò a lavorare sulla pagina linkata

    Grazie ancora per il vostro interesse.

  8. #8
    Mi sembra di aver risolto creando una Query molto complessa.
    Ho notato che il raddoppio dell'articolo con la qta_acquistata raddoppiata è dovuto al fatto che lo stesso articolo è stato venduto 2 volte.
    Ho provato a creare una Query che calcoli la sola somma delle vendite con una query di questo genere:
    Codice PHP:
    $Query_vendita "SELECT sql_mag_articoli.id_articolo, 
        CONCAT_WS(' ', sql_mag_fornitori.rag_sociale, sql_mag_articoli.descr_articolo) AS prodotto, 
        SUM(sql_mag_vendita.qta_vendita) AS qta_venduta
        FROM 
        sql_mag_fornitori LEFT JOIN sql_mag_articoli ON sql_mag_fornitori.id_fornitore = sql_mag_articoli.id_fornitore 
        LEFT JOIN sql_mag_vendita ON sql_mag_vendita.id_articolo = sql_mag_articoli.id_articolo
        GROUP BY (prodotto)"

    Per evitare eventuali problemi con acquisti ripetuti dello stesso articolo ho fatto altrettanto per il riepilogo degli acquisti:
    Codice PHP:
    $Query_acquisti "SELECT sql_mag_articoli.id_articolo, 
        CONCAT_WS(' ', sql_mag_fornitori.rag_sociale, sql_mag_articoli.descr_articolo) AS prodotto, 
        SUM(sql_mag_acquisti.qta_acquisto) AS qta_acquisto
        FROM 
        sql_mag_fornitori LEFT JOIN sql_mag_articoli ON sql_mag_fornitori.id_fornitore = sql_mag_articoli.id_fornitore 
        LEFT JOIN sql_mag_acquisti ON sql_mag_acquisti.id_articolo = sql_mag_articoli.id_articolo
        GROUP BY (prodotto)"

    Ho usato queste due query come subquery nella Query di riepilogo mettendole nella clausola FROM creando delle tabelle virtuali in questo modo:
    Codice PHP:
    $Query "SELECT sql_mag_articoli.id_articolo, 
        CONCAT_WS(' ', sql_mag_fornitori.rag_sociale, sql_mag_articoli.descr_articolo) AS prodotto, 
        SUM(TAB_ACQUISTI.qta_acquisto) AS qta_acquistata, 
        SUM(TAB_VENDITA.qta_venduta) AS qta_venduta, 
        if ( (SUM(TAB_VENDITA.qta_venduta) IS NULL), (SUM(TAB_ACQUISTI.qta_acquisto)), (SUM(TAB_ACQUISTI.qta_acquisto) - SUM(TAB_VENDITA.qta_venduta)) ) AS giacenza
        From 
        sql_mag_articoli LEFT JOIN
         
        ("
    .$Query_acquisti.") AS TAB_ACQUISTI 
        ON sql_mag_articoli.id_articolo = TAB_ACQUISTI.id_articolo 
        LEFT JOIN 
        
        ("
    .$Query_vendita.") AS TAB_VENDITA 
        ON sql_mag_articoli.id_articolo = TAB_VENDITA.id_articolo 
        LEFT JOIN sql_mag_fornitori ON sql_mag_fornitori.id_fornitore = sql_mag_articoli.id_fornitore
        GROUP BY (prodotto)
        ORDER BY sql_mag_articoli.id_articolo"

    Leggendo la Query completa così progettata ottengo questo:
    Codice PHP:
    SELECT sql_mag_articoli.id_articolo
        
    CONCAT_WS(' 'sql_mag_fornitori.rag_socialesql_mag_articoli.descr_articolo) AS prodotto
        
    SUM(TAB_ACQUISTI.qta_acquisto) AS qta_acquistata
        
    SUM(TAB_VENDITA.qta_venduta) AS qta_venduta
        if ( (
    SUM(TAB_VENDITA.qta_vendutaIS NULL), (SUM(TAB_ACQUISTI.qta_acquisto)), (SUM(TAB_ACQUISTI.qta_acquisto) - SUM(TAB_VENDITA.qta_venduta)) ) AS giacenza
        From 
        sql_mag_articoli LEFT JOIN
         
        
    (SELECT sql_mag_articoli.id_articolo
        
    CONCAT_WS(' 'sql_mag_fornitori.rag_socialesql_mag_articoli.descr_articolo) AS prodotto
        
    SUM(sql_mag_acquisti.qta_acquisto) AS qta_acquisto
        FROM 
        sql_mag_fornitori LEFT JOIN sql_mag_articoli ON sql_mag_fornitori
    .id_fornitore sql_mag_articoli.id_fornitore 
        LEFT JOIN sql_mag_acquisti ON sql_mag_acquisti
    .id_articolo sql_mag_articoli.id_articolo
        GROUP BY 
    (prodotto)) AS TAB_ACQUISTI 
        ON sql_mag_articoli
    .id_articolo TAB_ACQUISTI.id_articolo 
        LEFT JOIN 
        
        
    (SELECT sql_mag_articoli.id_articolo
        
    CONCAT_WS(' 'sql_mag_fornitori.rag_socialesql_mag_articoli.descr_articolo) AS prodotto
        
    SUM(sql_mag_vendita.qta_vendita) AS qta_venduta
        FROM 
        sql_mag_fornitori LEFT JOIN sql_mag_articoli ON sql_mag_fornitori
    .id_fornitore sql_mag_articoli.id_fornitore 
        LEFT JOIN sql_mag_vendita ON sql_mag_vendita
    .id_articolo sql_mag_articoli.id_articolo
        GROUP BY 
    (prodotto)) AS TAB_VENDITA 
        ON sql_mag_articoli
    .id_articolo TAB_VENDITA.id_articolo 
        LEFT JOIN sql_mag_fornitori ON sql_mag_fornitori
    .id_fornitore sql_mag_articoli.id_fornitore
        GROUP BY 
    (prodotto)
        
    ORDER BY sql_mag_articoli.id_articolo 
    Ora mi sembra che la tabella di riepilogo sia corretto ed è visibile in fondo alla pagina di esempio che è sempre quella già indicata:
    http://mikevba.altervista.org/nuovo/...o/giacenze.php
    A fondo pagina è visibile sia la creazione della vera Query tramite codice, sia la Query generata dal codice, sia la tabella generata dal resultset generato dalla Query.

    Mi sembra un buon lavoro. Per ora ne sono soddisfatto e per questo ho indicato la soluzione perchè possa tornare utile a qualcuno.


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 © 2025 vBulletin Solutions, Inc. All rights reserved.