Maschera per fattura

di il
9 risposte

Maschera per fattura

Salve a tutti, stavo stilando un database con Access per una piccola impresa quando sono incappato in un piccolo problema.

Il database dispone delle tabelle: cliente, fornitore (non serve comunque per il mio problema), inventario (dove ci sono gli articoli) e una tabella fatture che contiene tra le varie informazioni, gli articoli da vendere e la quantità. Ora, per le associazioni da molti a molti è necessario creare una classe di associazione, che associ ogni articolo con la fattura appropriata memorizzando anche la quantità. Il problema è che l'operazione dev'essere facile per l'utente finale, e quindi mi serve creare una maschera che permetta all'utente di inserire facilmente gli articoli alla fattura al momento della sua creazione.
Come è possibile farlo?

9 Risposte

  • Re: Maschera per fattura

    La descrizione generale che hai dato manca di dettagli utili. Occorre sapere meglio tutti i campi che entrano in gioco, se vogliamo dare una risposta tecnica e specifica. Ad ogni modo, credo di intuire il senso della domanda. Nella maschera dove devi compilare la fattura ci deve essere un campo IDArticolo. Anzichè digitare un numero o un codice insignificante per un utente inesperto, si consiglia di creare una casella combinata che guarda i campi più significativi dalla tabella Articoli (o Inventario, non è chiaro). In questo modo l'utente sceglie con un semplice clic sulla freccetta del menu a tendina l'articolo da inserire.
  • Re: Maschera per fattura

    Grazie della risposta.
    Innanzitutto, è sottointeso che c'è un campo in cui si inserisce non l'ID articolo, ma il nome dell'articolo stesso. Questo però non è un problema. Il problema è che non so come fare in modo che nella stessa fattura si aggiungano più articoli sulla maschera. Insomma, bisogna che la maschera permetta di inserire questi valori:
    • Nome del cliente (facile)
    • Numero fattura (chiave primaria, facile anche questo)
    • Data attuale (facile, automatico)
    • Elenco degli articoli + quantità (questo è difficile, non so come farlo)
    Può essere superfluo, ma queste sono le tabelle con tutti i dati:
    Cliente(Nome, Indirizzo, Città, CAP, PIVA*, Telefono)
    Articoli(ID*, Nome, Fornitore, PrezzoAcquisto, PrezzoVendita)
    Fatture(ID*, Cliente, Data, ElencoArticoli)
    Quelli con * sono le chiavi primarie.

    Ora potrei sbagliarmi, perché potrebbe esserci un metodo più immediato con Access, ma io al momento posso ragionare solo in SQL:
    So per quella poca l'esperienza che ho eni database che, per fare un elenco di articoli nella fattura ho bisogno di una classe di associazione, quindi ho pensato di creare una nuova tabella che contiene i campi Fattura, Articolo e Quantità, dove Fattura e Articolo sono chiavi esterne che si riferiscono rispettivamente agli ID di Fatture e Articoli.

    Se quello che ho scritto fin ora è sensato per Access, dovrei fare in modo di gestire questa classe di associazione con la maschera. Oppure c'è un altro modo per non creare classi di associazione?
  • Re: Maschera per fattura

    C'è un po' di confusione, ma possiamo venirne a capo. Non so cosa sia una "classe di associazione" di cui tu parli, ma provo a ricreare il tuo scenario tabelle correttamente.
    Partiamo dal presupposto che ogni tabella deve sempre avere un campo (generalmente ID contatore) chiave primaria. Questo campo non appare in tabella Clienti e devi aggiungerlo (IDCliente).
    Le tre tabelle mancano di relazioni e di campi di richiamo ai campi chiave, in gergo si chiamano "chiave esterna". Ma prima di parlare di questo, occorre ragionare su come le 3 tabelle sono relazionate. Un Cliente può acquistare molti Articoli, ma anche un Articolo può essere acquistato da molti Clienti, quindi esiste una relazione molti-a-molti fra le tabelle Clienti e Articoli. In questi casi occorre una tabella di congiunzione dove creare due relazioni uno-a-molti. La tabella Fatture risolve egregiamente a questo utilizzo, però devi aggiungere due campi "chiave esterna" numerici che si chiamano IDCliente e IDArticolo...per comodità di lettura ti consiglio di chiamare i due campi ID* in maniera più esplicita IDArticolo e IDFattura. Riepilogando tu devi avere in testa a ogni tabella un campo chiave primaria contatore che si chiama come la tabella con ID davanti, cioè IDCliente, IDArticolo e IDFattura.
    Nella tabella Fatture dovresti sostituire il campo Cliente con IDCliente numerico e collegare la relazione uno-a-molti fra i campi Clienti.IDCliente e Fatture.IDCliente.
    Analogamente il campo ElencoArticoli avrebbe più senso chiamarlo IDArticolo (numerico) e crei la relazione uno-a-molti fra Articoli.IDArticolo e Fatture.IDArticolo.
    Partiamo per ora da qui, poi passiamo a costruire maschere.
  • Re: Maschera per fattura

    Ciao, grazie della risposta. Temo che ci sia stato un problema di comprensione.

    OsvaldoLaviosa ha scritto:


    C'è un po' di confusione, ma possiamo venirne a capo. Non so cosa sia una "classe di associazione"
    Classe di associazione
    Ossia quella che più avanti tu descrivi come "tabella di congiunzione" è esattamente la stessa cosa.

    OsvaldoLaviosa ha scritto:


    Partiamo dal presupposto che ogni tabella deve sempre avere un campo (generalmente ID contatore) chiave primaria. Questo campo non appare in tabella Clienti e devi aggiungerlo (IDCliente).
    Appunto,

    Holy87 ha scritto:


    Quelli con * sono le chiavi primarie.
    (in Clienti la chiave primaria è la PartitaIVA, come è evidente)

    OsvaldoLaviosa ha scritto:


    Le tre tabelle mancano di relazioni e di campi di richiamo ai campi chiave, in gergo si chiamano "chiave esterna".
    E ancora, ho scritto

    Holy87 ha scritto:


    ...dove Fattura e Articolo sono chiavi esterne che si riferiscono rispettivamente agli ID di Fatture e Articoli.

    OsvaldoLaviosa ha scritto:


    Un Cliente può acquistare molti Articoli, ma anche un Articolo può essere acquistato da molti Clienti, quindi esiste una relazione molti-a-molti fra le tabelle Clienti e Articoli. In questi casi occorre una tabella di congiunzione dove creare due relazioni uno-a-molti. La tabella Fatture risolve egregiamente a questo utilizzo,...
    Andiamoci piano. L'associazione tra clienti e fatture è da uno a molti, il cliente può avere più fatture, ma una fattura è assegnata a un solo cliente. È la fattura che può avere un'associazione da molti a molti con gli articoli.

    OsvaldoLaviosa ha scritto:


    però devi aggiungere due campi "chiave esterna" numerici che si chiamano IDCliente e IDArticolo...per comodità di lettura ti consiglio di chiamare i due campi ID* in maniera più esplicita IDArticolo e IDFattura.
    Mi ero accorto di questa mancanza, e ho tempestivamente provveduto a rinominare i campi e riaggiustare il database. Ora si presenta così:
    Articoli(IDArticolo*, Nome, Costo, Prezzo, IDFornitore)
    Clienti(IDCliente*, Nome, Indirizzo, Telefono, PIVA)
    Fornitori(IDFornitore*, Nome, Indirizzo, Telefono, PIVA)<-non che serva alla nostra causa
    Fattura(IDFattura*, Numerazione, IDCliente, Data)
    Elenchi(IDElenco*, IDFattura, IDArticolo, Quantità)
    dove quelli con l'asterisco * sono chiavi primarie, quelli in corsivo sono chiavi esterne.

    Fatto questo, ho creato una maschera con sottomaschera, che adempie esattamente a quello che mi serviva.

    Ora però ho un altro problema: la maschera mi chiede di digitare l'ID del cliente e gli ID degli articoli nella fatturazione, ma io vorrei che invece venisse inserito il nome perché più facile da ricordare.
  • Re: Maschera per fattura

    Holy87 ha scritto:


    Articoli(IDArticolo*, Nome, Costo, Prezzo, IDFornitore)
    Clienti(IDCliente*, Nome, Indirizzo, Telefono, PIVA)
    Fornitori(IDFornitore*, Nome, Indirizzo, Telefono, PIVA)<-non che serva alla nostra causa
    Fattura(IDFattura*, Numerazione, IDCliente, Data)
    Elenchi(IDElenco*, IDFattura, IDArticolo, Quantità)
    dove quelli con l'asterisco * sono chiavi primarie, quelli in corsivo sono chiavi esterne.
    OK, questo scenario va benissimo.

    Holy87 ha scritto:


    Ora però ho un altro problema: la maschera mi chiede di digitare l'ID del cliente e gli ID degli articoli nella fatturazione, ma io vorrei che invece venisse inserito il nome perché più facile da ricordare.
    Devi organizzare 2 caselle combinate ben congeniate avendo cura di "nascondere" (0 cm) il campo ID. Il forum è pieno di risposte su questo argomento. Se non vuoi impazzire a cercarlo, io ho provato a schematizzare più casi tipici su questo mio documento

    clicca su Download.
  • Re: Maschera per fattura

    Holy87 ha scritto:


    Può essere superfluo, ma queste sono le tabelle con tutti i dati:
    Cliente(Nome, Indirizzo, Città, CAP, PIVA*, Telefono)
    Articoli(ID*, Nome, Fornitore, PrezzoAcquisto, PrezzoVendita)
    Fatture(ID*, Cliente, Data, ElencoArticoli)
    Quelli con * sono le chiavi primarie.
    Non è superfluo, è vitale.

    Purtroppo le tabelle oltre ad essere incomplete, sono soprattutto insufficienti.
    - Clienti: devi usare l'IDCliente* (la PIVA non va bene come PK)
    - Fatture (TESTA): IDFattura*, IDCliente, ....
    - Fatture (RIGHE): IDFattura, IDRiga*, <dati articolo> ...

    Mancano (tanto per cominciare):
    - Listini (con data di validità)
    - Sconti (almeno 3 livello di sconto)
    - MetodiPagamento (es: bonifico, cassa, RiBa, RID, carta credito, ....)
    - ModalitaPagamento (es: 30 gg DF FM, 30/60 gg, 30/60/90 gg DF
    - AliquoteIVA
    - ....
  • Re: Maschera per fattura

    OsvaldoLaviosa ha scritto:


    Devi organizzare 2 caselle combinate ben congeniate avendo cura di "nascondere" (0 cm) il campo ID. Il forum è pieno di risposte su questo argomento. Se non vuoi impazzire a cercarlo, io ho provato a schematizzare più casi tipici su questo mio documento

    clicca su Download.
    Molte grazie, mi è stato di grande aiuto e infatti ho risolto subito il problema

    gibra ha scritto:


    Non è superfluo, è vitale.

    Purtroppo le tabelle oltre ad essere incomplete, sono soprattutto insufficienti.
    - Clienti: devi usare l'IDCliente* (la PIVA non va bene come PK)
    - Fatture (TESTA): IDFattura*, IDCliente, ....
    - Fatture (RIGHE): IDFattura, IDRiga*, <dati articolo> ...

    Mancano (tanto per cominciare):
    - Listini (con data di validità)
    - Sconti (almeno 3 livello di sconto)
    - MetodiPagamento (es: bonifico, cassa, RiBa, RID, carta credito, ....)
    - ModalitaPagamento (es: 30 gg DF FM, 30/60 gg, 30/60/90 gg DF
    - AliquoteIVA
    - ....
    Infatti più in basso ho ricostruito la struttura del database. Campi come metodi di pagamento ecc.. li ho inseriti, ma sono informazioni superflue per la domanda in quanto non erano implicati nel problema (mi funzionavano già bene).
    In verità, gli articoli hanno due listini, il listino 1 e il listino 2 (scontato), ed ho fatto in modo che nella maschera, quando si inserisce l'articolo si possa spuntare un sì-no per selezionare il listino scontato oppure no.

    Grazie a tutti, la maschera funziona alla perfezione ed ho costruito un report pulito e dettagliato con tutti i dati della fattura.
    Ho solo un problema, che nel caso si configurassero più fatture, il report le fa vedere tutte, pagina per pagina. Potrei basarmi su una query per dare il report di una sola fattura, ma ciò che ho fatto è inserire un pulsante nella maschera che apre direttamente il report della fattura, quindi mi sarebbe complicato creare un pulsante che genera una query semplice e che automaticamente apre il report su quella query. Pazienza, va già bene così
  • Re: Maschera per fattura

    Holy87 ha scritto:


    Ho solo un problema, che nel caso si configurassero più fatture, il report le fa vedere tutte, pagina per pagina. Potrei basarmi su una query per dare il report di una sola fattura, ma ciò che ho fatto è inserire un pulsante nella maschera che apre direttamente il report della fattura, quindi mi sarebbe complicato creare un pulsante che genera una query semplice e che automaticamente apre il report su quella query
    Si può fare. Imposta un pulsante [Stampa fattura corrente] al cui Clic devi associare la seguente azione macro:
    ApriReport
          Nome report: (lo sai tu)
          WHERE: [IDFattura]=[Maschere]![NomeMaschera]![IDFattura]
    ...ora non ho capito se il campo IDFattura in maschera sta nella maschera principale oppure in sottomaschera. In quest'ultimo caso la sintassi nella WHERE deve cambiare così:
    [IDFattura]=[Maschere]![NomeMaschera]![NomeSottomaschera]![IDFattura]
    Sia chiaro che tutto ciò è fattibile se anche il report include fra i suoi campi IDFattura.
  • Re: Maschera per fattura

    OsvaldoLaviosa ha scritto:


    Holy87 ha scritto:


    Ho solo un problema, che nel caso si configurassero più fatture, il report le fa vedere tutte, pagina per pagina. Potrei basarmi su una query per dare il report di una sola fattura, ma ciò che ho fatto è inserire un pulsante nella maschera che apre direttamente il report della fattura, quindi mi sarebbe complicato creare un pulsante che genera una query semplice e che automaticamente apre il report su quella query
    Si può fare. Imposta un pulsante [Stampa fattura corrente] al cui Clic devi associare la seguente azione macro:
    ApriReport
          Nome report: (lo sai tu)
          WHERE: [IDFattura]=[Maschere]![NomeMaschera]![IDFattura]
    ...ora non ho capito se il campo IDFattura in maschera sta nella maschera principale oppure in sottomaschera. In quest'ultimo caso la sintassi nella WHERE deve cambiare così:
    [IDFattura]=[Maschere]![NomeMaschera]![NomeSottomaschera]![IDFattura]
    Sia chiaro che tutto ciò è fattibile se anche il report include fra i suoi campi IDFattura.
    Ci ho messo molto a farlo funzionare (non riuscivo a capire perché non mi funzionava la clausola where), ma alla fine funziona alla perfezione!

    Alla fine ho creato tutte le maschere per l'applicazione e configurata, il lavoro è perfetto.
    Grazie per la vostra disponibilità
Devi accedere o registrarti per scrivere nel forum
9 risposte