Gestione pizzeria o ristorante con MS Access – terza parte

Bentornati. Piano piano l’applicativo MS Access per la gestione di un ristorante/pizzeria sta prendendo vita. Ho creato tutte le tabelle necessarie e le ho messe opportunamente in relazione ottenendo il seguente schema (logico):

Schema delle relazioni elaborato con MS Access

Ad un primo colpo d’occhio potrebbe sembrare alquanto complesso. In realtà, se andiamo ad analizzarlo in modo più localizzato, ci accorgiamo che si tratta di una complessità solo apparente.

Dettaglio relazioni - Sezione tavoli

Analizziamo queste prime relazioni. La tabella ordini è certamente quella che possiamo considerare centrale per l’applicazione in quanto rappresenta l’elemento attraverso il quale i camerieri raccolgono le scelte dei clienti, ne definiscono la collocazione, inviano le richieste in cucina e consentono la stesura del conto. All’interno di tale tabella c’è la chiave esterna id_tavolo che è messa in relazione uno-a-molti con la chiave primaria idTavolo della tabella tavoli. In pratica nell’ordine si inserisce un riferimento al tavolo dove siederanno i clienti di quell’ordine; ogni tavolo va poi collocato in una certa sala e ciò avviene attraverso la relazione uno-a-molti grazie alla chiave esterna idSala della tabella tavoli con la chiave primaria idSala della tabella sale. Da notare che nella tabella ordini è presente il campo nr_persone e ci si potrebbe chiedere perché indicarlo quando nella tabella tavoli è presente il campo nrPosti: la risposta è abbastanza intuitiva perché sappiamo benissimo che al ristorante ci si può accomodare a tavoli con un numero di posti maggiore di quello necessario oppure, al contrario, tale numero può essere integrato, con l’aggiunta di coperti e sedie mancanti.Dettaglio relazione tabella ordini con tabella dipendentiSempre all’interno della tabella ordini troviamo la chiave esterna id_ricevente in relazione uno-a-molti con la chiave primaria id_dipendente della tabella dipendenti; questa relazione consente di inserire nella tabella ordini un riferimento al cameriere (o altro dipendente) che ha ricevuto quell’ordine. Ad ogni dipendente è assegnata una mansione come si evince dalla relazione con la tabella mansioni.

Dettaglio relazione tra tabella ordini e tabella prenotazioniIn questa immagine possiamo notare che la tabella ordini è in relazione con la tabella prenotazioni, una relazione nella quale tuttavia non è stato impostato il vincolo di integrità referenziale. Ciò è dovuto al fatto che non necessariamente è presente una prenotazione per ogni ordine: ci sono clienti che si presentano senza prenotazione. Inoltre nella tabella prenotazioni vi è un flag (valore boolean, vero o falso, del campo asporto) per indicare se la prenotazione riguarda appunto prodotti da asporto. Da rilevare la presenza del riferimento al dipendente che ha inserito la prenotazione, a data e ora di prenotazione ed eventuale annullamento della stessa (campo disdetto_il). Le prenotazioni possono riguardare sia la consumazione sul posto, sia prodotti da ritirare personalmente.

Dettaglio delle tabelle riguardanti le voci presenti negli ordini e ingredienti delle stesseLa tabella voci_ordini, in relazione uno-a-molti con la tabella ordini, contiene l’elenco di ciò che è stato ordinato dai clienti in un certo ordine. Non si tratta soltanto di pietanze, ma possono essere anche presenti voci quali coperti, bevande, caffetteria, ecc. Da dove vengono selezionate queste voci? Dalla tabella voci_categorie_menu, che associa alle categorie in cui si articola ogni menu (antipasti, primi, secondi, contorni, ecc.) le voci che si trovano normalmente negli stessi, e quindi le varie tipologie di pizze, di primi, di secondi, di dessert e così via, con le diverse denominazioni che vengono assegnate a queste voci nei ristoranti e nelle pizzerie. Le voci si compongono di uno o più ingredienti, che vengono tracciati grazie alla relazione ingredienti_voci che crea un elenco degli ingredienti presenti in ogni voce: ad es. per la voce pizza margherita troveremo gli ingredienti pomodoro e mozzarella.

dettaglio su tabella variazioni vociInfine le voci presenti negli ordini possono essere oggetto di variazioni, sia in aggiunta che in sottrazione di ingredienti. La tabella variazioni_voci ha proprio questo scopo e, come vedremo nel prossimo post, nella maschera di inserimento delle voci degli ordini sarà possibile aprire una finestra a popup, che visualizzerà gli ingredienti di ogni voce e darà la possibilità di depennarli oppure aggiungerne di nuovi.

Pertanto restate sintonizzati perché nel prossimo articolo renderò disponibile per il download una prima versione pressoché completa del database di gestione ristorante-pizzeria!

 

Schema concettuale pizzeria / ristorante

Gestione pizzeria o ristorante con MS Access – seconda parte

Riprendiamo la progettazione e realizzazione di un applicativo per la gestione di una pizzeria o di un ristorante dopo aver analizzato, nel post precedente, i requisiti richiesti da questo programma.

Un primo schema concettuale semplificato (non ho inserito né attributi né cardinalità) è il seguente:

 

Schema concettuale pizzeria / ristorante

La denominazione delle relazioni (o per meglio dire associazioni) è stata ottenuto mettendo insieme i nomi delle entità ad esse collegate. Così la relazione “VOCI MENU” associa l’entità “MENU” con l’entità “VOCI”. In genere, per maggiore leggibilità dello schema, si preferisce inserire un verbo; nell’esempio precedente avremmo potuto denominare la relazione “COMPRENDERE” oppure “PREVEDERE”, perché così la relazione si sarebbe potuta leggere più facilmente in un senso o nell’altro: “un menu comprende più voci, una voce può essere compresa in più menu” oppure “un menu prevede più voci, una voce può essere prevista da più menu”. Tuttavia tale soluzione, quando (come in questo caso) si deve poi tradurre la relazione in tabella (si tratta di una relazione molti a molti), rischia di diventare poco “elegante”: che nome daremo alla tabella? “COMPRENSIONI”? “PREVISIONI”?

Restiamo sull’argomento “VOCI” del menu. Perché questo termine così generico? Dobbiamo pensare a come è strutturato un menu. Ci sono varie categorie di portate (antipasti – di carne o di pesce, primi e secondi – di carne o di pesce, dessert, ecc.) che nello schema sono state rappresentate con l’entità “CATEGORIE”. E poi c’è il nome della portata. Ad esempio, nella categoria “Primi” ci può essere la portata “Risotto agli asparagi”, ma in una pizzeria potrebbe comparire “Pizza Capricciosa” oppure “Pizza Margherita”. E quando il cliente ordina da bere? Anche le bevande sono voci che appaiono nel menu e quindi è preferibile utilizzare genericamente il termine “VOCI” per l’entità che dovrà contenere queste informazioni. Naturalmente ogni voce dovrà comprendere anche un attributo per il prezzo indicato nel menu. Non potrà mancare anche la voce “COPERTO” che è sempre prevista quando si va al ristorante o in pizzeria. Inoltre, poiché il prezzo potrebbe subire delle variazioni nel tempo, bisognerà prevedere una soluzione che consenta di attribuire alle voci degli ordini il prezzo di listino praticato in quel momento.

Una precisazione relativa all’entità “MENU”. Spesso i ristoranti mettono a disposizione dei clienti menu diversi. Ad esempio ci può essere un menu fisso oppure dei menu speciali per determinate ricorrenze (festività natalizie, pasquali, matrimoni, ecc.). Naturalmente ognuno di questi menu comprenderà delle portate specifiche e all’atto della comanda sarà possibile scegliere le voci di un particolare menu.

Esiste poi un’altra relazione tra l’entità “VOCI” e l’entità “INGREDIENTI”. Si tratta di una relazione “molti a molti”, in quanto ogni voce può prevedere uno o più ingredienti ed ogni ingrediente può far parte di più voci. Pertanto la relazione “INGREDIENTI VOCI” sarà trasformata in una entità (e quindi in una tabella) che assocerà i vari piatti ai relativi ingredienti.

Passando al personale possiamo notare che vi è una relazione che serve a mettere in collegamento ogni record dello stesso con la mansione ricoperta. Si tratta di una relazione “uno a molti”, poiché ad ogni dipendente che fa parte del personale sarà assegnata una sola mansione. Tuttavia, nella vita reale, ci può essere qualche dipendente che svolge, occasionalmente o in modo permanente, più mansioni. Scegliamo la soluzione che prevede l’assegnazione di un unico ruolo principale, il che non impedisce di compilare ordini anche da parte di personale che non ha la specifica mansione di cameriere.

L’entità “TAVOLI” è messa in relazione con l’entità “SALE”, dato che le specifiche di progetto prevedono che sia data la possibilità di distribuire su più sale i tavoli dell’attività. Si può ipotizzare che la presenza di un’unica sala si traduca nell’inserimento di una sola voce nella tabella “SALE” oppure che si possa suddividere l’unica sala in zone, ad esempio “ZONA PIZZERIA”, “ZONA RISTORANTE”, “ZONA BAR”, ecc.

Dobbiamo anche tener conto e gestire le prenotazioni, che saranno ricevute da qualcuno che fa parte dello staff, se non dallo stesso titolare. Nella prenotazione saranno presenti le informazioni riguardanti il nominativo di chi prenota, il giorno e l’orario indicativo di prenotazione, il numero di persone ed eventuali annotazioni relative a specifiche preferenze di menu, alla presenza di persone con particolari intolleranze, alla richiesta di piatti vegani o vegetariani, ecc.

Arriviamo così all’entità “ORDINI” o comande che dir si voglia: essa viene associata ai dati provenienti da diverse entità. Dall’entità “TAVOLI”, con l’indicazione del tavolo assegnato ai clienti; dall’entità “VOCI”, che grazie alla relazione “VOCI ORDINI” consente di creare l’elenco di piatti e bevande scelte, ognuna delle quali tiene traccia del cameriere (o altro soggetto) che ha inserito la voce stessa, nonche delle eventuali variazioni in aggiunta o sottrazione, apportate alle singole voci; tali modifiche saranno possibili tramite il collegamento con l’entità “INGREDIENTI”. Così, ad esempio, il cameriere “Rossi” nell’ordine con codice “1234” al tavolo “7” potrà inserire una “Pizza Margherita” con aggiunta di “Burrata” e sottrazione di “Pomodoro”. Sarà inoltre possibile indicare nella comanda l’eventuale prenotazione precedentemente effettuata e presente nell’entità “PRENOTAZIONI”.

Con questa breve descrizione dello schema concettuale del nostro database può dirsi conclusa la fase preliminare di progettazione, che naturalmente, in seguito, potrà subire delle variazioni. Dallo schema concettuale (che ribadisco ho semplificato, omettendo l’indicazione degli attributi e delle cardinalità in entità e relazioni) si passa poi alla relativa traduzione in schema logico. Ho scelto di realizzare quest’ultimo direttamente in MS Access e conto di pubblicarlo già con il terzo post. Perciò “rimanete sintonizzati”. Osservazioni e suggerimenti su questo progetto sono sempre graditi!

Pizza appena sfornata

Gestione pizzeria o ristorante con MS Access

Diverso tempo fa mi ero riproposto di creare un’applicazione Access che consentisse di gestire una pizzeria o un ristorante, o entrambi ovviamente, e direi che è giunto il momento di dare attuazione a questo progetto.

Vediamo innanzitutto di analizzare il problema ed individuare quali caratteristiche dovrà avere questo programma. Da qui in avanti non parlerò più di pizzeria/ristorante ma mi limiterò ad utilizzare genericamente il termine “attività”. Ebbene, la nostra attività prevede un locale suddiviso in una o più sale (che a volte hanno delle denominazioni particolari), all’interno delle quali si trovano diversi tavoli, numerati progressivamente, ognuno dei quali dispone di uno o più posti a sedere. La configurazione di questi tavoli può variare nel tempo, nel senso che un tavolo può essere allungato o accorciato per far fronte a situazioni particolari quali ad esempio un gruppo numeroso di clienti che vuole festaggiare congiuntamente un evento. Ma potrebbe anche trattarsi di una riorganizzazione generale del locale, che determini una rivalutazione del numero dei tavoli e relativi posti a sedere. Pertanto il nostro programma ne dovrà tener conto.

L’attività impiega diverso personale, suddiviso per mansione: camerieri, cuochi, pizzaioli, personale di segreteria, ecc. Per l’attività in sala si dovrà tener conto di quale cameriere ha preso l’ordine dei clienti di un certo tavolo. Quest’ordine poi povrà essere integrato da eventuali variazioni, dovute a richieste pervenute successivamente nel corso del servizio e tali variazioni potranno essere apportate anche da camerieri diversi rispetto a quello dell’ordine iniziale.

Per quanto riguarda il lato cucina, si potrà prevedere anche l’indicazione del cuoco (o cuochi) e/o pizzaiolo (o pizzaioli) che ha seguito l’ordine. Una soluzione alternativa potrebbe essere quella di tener traccia semplicemente del personale in servizio al momento degli ordini, tenendo conto dell’orario di inizio e fine servizio di ognuno.

L’attività disporrà di un menu suddiviso nelle tipologie carne, pesce, pizze e bar, dove saranno indicati i vari piatti ognuno dei quali avrà un nome ed un elenco di ingredienti principali. Al momento dell’ordine il cliente potrà anche scegliere di fare delle aggiunte o sottrazioni agli ingredienti di un certo piatto o di una certa pizza. Nell’ordine dovrà essere indicato sia il giorno che l’ora di creazione e di trasmissione alle cucine; sarà proprio quest’ultima a determinare l’ordine di esecuzione delle varie portate. Sarà possibile visualizzare per tipologia l’elenco dei piatti da preparare con i relativi ingredienti, per ottimizzare l’organizzazione in cucina del lavoro da svolgere dall’equipe in servizio.

Per completare il programma sarà utile anche poter gestire le prenotazioni, magari con un diagramma di gantt che visualizzi la disponibilità dei tavoli nel tempo.

Mi piacerebbe anche creare un applicazione per smartphone, collegata al database principale, con cui il personale di sala andrebbe a ricevere gli ordini dei clienti.

Bene. Restate collegati perché nel prossimo post pubblicherò lo schema concettuale del database, spiegadone le soluzioni adottate. A presto!

 

Scarabeo con MS Access

Riprendo, dopo una lunga interruzione, le pubblicazioni sul mio blog e lo faccio proponendo una versione preliminare di un noto gioco da tavolo: lo Scarabeo. Ho deciso di realizzarlo utilizzando MS Access per dimostrare come questo software, destinato prevalentemente alla realizzazione di applicazioni gestionali in ambiente RDBMS, possa avere anche un utilizzo di tipo ludico. Non nascondo che in realtà io sono da sempre appassionato di giochi di parole. Ma vediamo subito l’interfaccia che ho dato al programma, anche per rendere più comprensibile il suo utilizzo e, per chi non lo conoscesse (immagino pochissimi), le regole per giocare.

La versione che sto realizzando presenta alcune differenze rispetto a quella presente nel gioco da tavolo, anche se l’intento è quello di restare fedele per quanto possibile alla versione originale. Ma partiamo subito con le regole fondamentali, in base a quanto previsto dal regolamento ufficiale (quello presente nella scatola del gioco). Lo scarabeo (che è la versione italiana dello Scrabble) prevede un minimo di due ed un massimo di quattro giocatori. Il programma da me realizzato prevede invece il gioco di soli due concorrenti, uno dei quali è obbligatoriamente il computer, mentre l’altro può essere sia un umano che un pc; in tal caso si parla di modalità “demo”, nel senso che il computer giocherà contro se stesso. Il programma, al momento, gioca solo in madalità demo; una volta completata la fase preliminare di test, provvederò a fornire la versione giocabile completamente. Naturalmente sono aperto a suggerimenti sulle possibili modalità di interazione, per inserire le parole trovate dal concorrente umano.

In che consiste il gioco dello Scarabeo? Bisogna “formare sulla scacchiera, con le apposite tessere, parole complete e sensate disposte orizzontalmente o verticalmente (mai diagonalmente) e leggibili dall’alto verso il basso o da sinistra verso destra; parole che fra loro s’intersecano, esattamente come avviene nei comuni schemi di parole crociate”. Ogni lettera riporta un valore e i giocatori cercano di totalizzare il punteggio maggiore, ottenuto sommando il valore delle lettere che compongono le parole trovate, eventualmente maggiorato dalle “caselle speciali” presenti nello schema.

Nel gioco da tavolo è presente un sacchetto contenente 130 tessere. Nella maschera di Access, in alto a sinistra, è riportato l’elenco completo delle lettere presenti nel gioco, comprendente il loro valore e la quantità. Ad esempio, sono presenti 12 vocali “E” con un valore di un punto ciascuna. Si sorteggia il concorrente che deve iniziare il gioco, si rimescolano le tessere nel sacchetto, ed ogni giocatore sorteggia 8 tessere a caso; naturalmente il programma effettua tutte queste operazioni in modo automatico, con la differenza che nel gioco da tavolo le tessere sono disposte su dei leggii e tenute nascoste dai concorrenti, mentre la mia versione Access le lascia visibili, per agevolare il giocatore umano (naturalmente il programma non “bara”, nel senso che il computer “vede” solo le proprie lettere).

Con le lettere estratte bisogna cercare di formare la parola  che opportunamente posizionata nello schema, dia il punteggio più alto. Attenzione: non necessariamente la parola più lunga dà il punteggio più alto, anche se lo Scarabeo prevede un punteggio maggiorato di 10, 30 o 50 punti nel caso in cui, per formare la parola, si siano utilizzate rispettivamente 6, 7 oppure 8 lettere. La prima parola che si posa sullo schema deve necessariamente “passare” per la casella centrale (che nel gioco da tavolo raffigura uno scarabeo), sia orizzontalmente che verticalmente. Si procede quindi alternativamente fra i giocatori, che dopo avere sistemato la parola individuata nello schema e calcolato il punteggio ottenuto, andranno a “pescare” dal sacchetto tante lettere quante quelle utilizzate per formare la parola nello schema.

Ogni parola individuata dovrà utilizzare almeno una lettera fra quelle presenti nelle parole già inserite nello schema. Si potranno inoltre utilizzare parole già presenti, mettendo un prefisso o un suffisso con le lettere del proprio leggio. Ad esempio, se nello schema fosse presente la parola “FERMATA” si potranno anteporre, se possedute, le lettere “A” ed “F” e formare la parola “AFFERMATA”. Il punteggio da conteggiare sarà quello dell’intera parola, non soltanto delle lettere aggiunte.

Sullo schema sono presenti delle caselle “speciali”, rappresentate con le sigle “2L”, “3L”, “2P” e “3P”. La lettera che sarà posizionata sopra queste caselle consentirà di moltiplicare per 2 o per 3 il valore della lettera o dell’intera parola, anche ripetutamente. Ad esempio, sovrapponendo 2 lettere su due caselle “3P” il punteggio dell’intera parola sarà moltiplicato per 9.

Esistono 2 caratteri speciali, rappresentati nel programma con degli asterischi, che sono dei “jolly”. A loro si può assegnare qualsiasi lettera, ricevendone il relativo valore. Il regolamento prevede che ogni giocatore, quando è il suo turno, possa prendere il “jolly” presente nello schema, sostituendolo con la lettera relativa, se in suo possesso. Nel programma, al momento, non ho implementato questa funzionalità ed il “jolly”, una volta posizionato nello schema, si trasforma nella lettera desiderata e non può più essere “ripreso”.

Il tempo a disposizione per ogni turno è di due minuti. L’eventuale tempo risparmiato viene automaticamente ceduto all’altro concorrente di turno. In questa versione del programma non ho ancora attivato la gestione del timer, perché ho notato che rallentava un po’ l’efficienza del gioco, ma già dalle prossime versioni sarà resa disponibile. D’altra parte, in modalità demo, non influisce più di tanto sull’andamento di gioco.

Il gioco si conclude quando uno qualsiasi dei giocatori rimane senza lettere nel proprio leggio. In questo caso tale concorrente aumenterà il proprio punteggio con i punti delle lettere rimaste nel leggio dell’altro giocatore, che a sua volta dovrà togliere tali punti dal proprio punteggio personale. Comunque vincerà la partita il giocatore con il punteggio più alto, anche se non avrà fatto scattare la fine del gioco. Ogni “Jolly” rimasto sul leggio vale 30 punti.

Ci sono diverse regole che si applicano alle parole ammesse dal gioco ed è bene munirsi di un dizionario della lingua italiana come consulente. Rimando ad un successivo articolo l’elenco di queste regole.  Il programma gestirà autonomamente la validazione delle parole del concorrente umano sulla base del proprio archivio, che attualmente conta oltre 658.000 vocaboli.

Ultime puntualizzazioni prima di fornirvi il link per il download del programma. Il gioco dello Scarabeo italiano prevede che le parole inserite, oltre ad incrociarsi con quelle già inserite, possano anche andarsi ad affiancare ad altre già esistenti, per a formare altre parole, che dovranno però essere parole “sensate” e di cui si sommeranno i relativi punti. Tuttavia il programma attualmente non inserisce parole in adiacenza. Pertanto il giocatore umano dovrà a sua volta seguire questa variazione da me introdotta al gioco ufficiale.

Attendo impressioni ed indicazioni su questo gioco e intanto vi lascio al link al PROGRAMMA SCARABEO.

N.B. Non cercate di aprire l’archivio dall’interno del file zip. Estraete il file in formato .ACCDB e poi aprite lo stesso (ovviamente dovete disporre di una versione di MS Access installata sul vostro computer).

Preventivi – Aggiornamento

Mi è stato richiesto un aggiornamento sull’applicazione Access PREVENTIVI per consentire la duplicazione di un preventivo in modo veloce, senza la necessità di dover reinserire ogni volta tutti i dati. Mi sembra in effetti un aggiornamento interessante e utile anche se non è realizzabile con gli strumenti “visuali” di Access, in quanto siamo in presenza di una maschera principale (quella dei preventivi) che contiene un sottomaschera (gli articoli del preventivo) e quindi bisogna mettere mano al codice Visual Basic for Application. Continua a leggere

Giochiamo coi Numeri Reloaded

Nel precedente articolo ci eravamo lasciati con una versione non molto giocabile del programma relativo al quadrato dei numeri da disporre in sequenza. Questa volta dovremo scrivere un po’ più codice e mettere a punto qua e là il programma per consentire una maggiore interazione con il giocatore e la personalizzazione del gioco.
Vediamo innanzitutto il form come si presenterà e come andrà modificato.

Finestra progettazione nuova versione del programma Continua a leggere

Giochiamo coi numeri e Visual Basic 2010

gioco15Si è concluso recentemente il corso di programmazione base PC presso il CFPP di Rovigo e con i partecipanti abbiamo sviluppato un programmino per giocare con il quadrato dei 15 numeri da mettere in sequenza che sicuramente avrete visto o anche utilizzato prima che la diffusione di computer e console assumesse dimensioni planetarie. Per chi non capisse di cosa sto parlando eccone un’immagine. Continua a leggere

Corso di Programmazione – Lezione 4 – Algoritmi

Quando dobbiamo risolvere un problema è necessario tener conto di una serie di elementi fondamentali: chi lo risolve, che tipo di risultato vogliamo ottenere e quali risorse ci servono.
Se ad esempio il nostro problema è quello di prepararci un buon frullato di frutta chi ci può risolvere il problema è un frullatore. Il risultato che vogliamo ottenere è un bel bicchiere di frutta frullata e zuccherata, mentre le risorse necessarie saranno date dalla nostra frutta preferita ed eventualmente da zucchero ed acqua, a seconda di come ci piace il frullato (più o meno dolce, più o meno denso).

frullato_collage Continua a leggere

Esportare contatti Nokia su Gmail

 

In questi giorni sono passato ad uno smartphone Android ed è nata l’esigenza di esportare i contatti presenti nel mio vecchio cellulare Nokia sul nuovo acquisto. Se li avete salvati nella sim non ci sono grossi problemi, ma se avete utilizzato il software Nokia Suite per salvarli sul computer li potete esportare facilmente dal menu File – Esporta contatti.

nokia_suite_contatti Continua a leggere