Access query per selezione con campi data

giovedì 14 gennaio 2010 - 13.36

fOLKEN Profilo | Newbie

Salve a tutti,
ho un database access 2007 con questa tabella con i campi
camera, numerico
acqua, birra, cocacola, brut ...( in tutto quindici prodotti) campi data
dovrei scrivere una query che mi dica per ogni camera quali prodotti sono in scadenza in un determinato intervallo di date, ma sono bloccato da giorni.
Ho provato cosi:

SELECT Inventario.Camere,Inventario.[Acqua Gassata], Inventario.[Acqua liscia], Inventario.Birra, Inventario.Brut, Inventario.Campari, Inventario.[Campari 2], Inventario.[Cocacola 1], Inventario.[Cocacola 2], Inventario.[Crodino 1], Inventario.[Crodino 2], Inventario.Fanta, Inventario.[Nestea al limone], Inventario.[Nestea alla pesca], Inventario.Sprite, Inventario.[Succo Arancia], Inventario.[Succo Ace], Inventario.[Succo Albicocca], Inventario.[Succo Ananas], Inventario.[Succo Pera], Inventario.[Succo Pesca]
FROM Inventario
WHERE(Inventario.[Acqua Gassata], Inventario.[Acqua liscia], Inventario.Birra, Inventario.Brut, Inventario.Campari, Inventario.[Campari 2], Inventario.[Cocacola 1], Inventario.[Cocacola 2], Inventario.[Crodino 1], Inventario.[Crodino 2], Inventario.Fanta, Inventario.[Nestea al limone], Inventario.[Nestea alla pesca], Inventario.Sprite, Inventario.[Succo Arancia], Inventario.[Succo Ace], Inventario.[Succo Albicocca], Inventario.[Succo Ananas], Inventario.[Succo Pera], Inventario.[Succo Pesca])<= #gg/mm/yyyy# AND (Inventario.[Acqua Gassata], Inventario.[Acqua liscia], Inventario.Birra, Inventario.Brut, Inventario.Campari, Inventario.[Campari 2], Inventario.[Cocacola 1], Inventario.[Cocacola 2], Inventario.[Crodino 1], Inventario.[Crodino 2], Inventario.Fanta, Inventario.[Nestea al limone], Inventario.[Nestea alla pesca], Inventario.Sprite, Inventario.[Succo Arancia], Inventario.[Succo Ace], Inventario.[Succo Albicocca], Inventario.[Succo Ananas], Inventario.[Succo Pera], Inventario.[Succo Pesca])>= #gg/mm/yyyy#
ORDER BY Inventario.Camere;

Qualcuno sa darmi un consglio?
Grazie a tutti

alx_81 Profilo | Guru

>Salve a tutti,
Ciao

>ho un database access 2007 con questa tabella con i campi
>camera, numerico
>acqua, birra, cocacola, brut ...( in tutto quindici prodotti)
>campi data
>dovrei scrivere una query che mi dica per ogni camera quali prodotti
>sono in scadenza in un determinato intervallo di date, ma sono
>bloccato da giorni.
Perchè è un tipico esempio di denormalizzazione svantaggiosa. E quindi le interrogazioni sono, come puoi vedere, complesse da gestire per una richiesta decisamente semplice. Prova a pensare se poi devi anche aggiungere prodotti, devi cambiare query, strutture, e applicazioni che si interfacciano..

>Qualcuno sa darmi un consglio?
Sì, cambia totalmente la struttura e cerca di normalizzare quella tabella, ad esempio facendone due, una delle camere ed una dei prodotti. In ogni prodotto poi aggiungi un attributo data e crei una relazione con la camera.
In quel modo scoprirai che fare una query di quel tipo è SEMPLICISSIMO.

Segui queste regole:
http://it.wikipedia.org/wiki/Normalizzazione_del_database

>Grazie a tutti
di nulla!

--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

fOLKEN Profilo | Newbie

Vediamo se ho capito il tuo consiglio
Tabella 1 campo camere
Tabella 2 Campo prodotti
Tabella tre camere, prodotti, datascadenza
E' cosi?
Grazie

alx_81 Profilo | Guru

>Vediamo se ho capito il tuo consiglio
>Tabella 1 campo camere
>Tabella 2 Campo prodotti
>Tabella tre camere, prodotti, datascadenza
>E' cosi?
le entità sono quelle, ti basteranno poi due join massimo ed è fatta.
Diciamo che la tabella camere avrà gli attributi della camera (numero, metratura, prezzo, ecc)
La tabella prodotti avrà gli attributi del prodotto, compresa la data di scadenza
L'ultima tabella avrà la relazione tra la camera ed il prodotto.

Vedrai che ti trovi bene



>Grazie
>

--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

fOLKEN Profilo | Newbie

Scusa ma forse non mi sono spigato bene,
il mio obiettivo è creare una lista che mi indichi le scadenze dei prodotti dei frigo bar di un hotel
ho 60 camere
in ogni camera ci sono gli stessi prodotti, ma hanno scadenze diverse
io devo ottenere una lista che mi dica alla camera uno nel periodo compreso tra giorno e giono scda cocacola
Scusa se ti ho rubato del tempo

alx_81 Profilo | Guru

>Scusa ma forse non mi sono spigato bene,
>il mio obiettivo è creare una lista che mi indichi le scadenze
>dei prodotti dei frigo bar di un hotel
>ho 60 camere
>in ogni camera ci sono gli stessi prodotti, ma hanno scadenze diverse
Ok, allora è come dici te.
Se la camera non ha attributi aggiuntivi puoi evitare la tabella CAMERE.
Puoi fare una tabella con camera, prodotto e la relativa scadenza (come l'ultima tabella che proponi).
Insomma, la tabella della relazione.
Poi una tabella PRODOTTI in cui metti il dominio dei prodotti, per evitare di ridondare l'informazione del prodotto segnandoti solo il codice.

>io devo ottenere una lista che mi dica alla camera uno nel periodo
>compreso tra giorno e giono scda cocacola
ok, una semplice query sul modello precedente, "prendi la camera X e ricavami i prodotti la cui scadenza supera la data Y o è compresa tra il giorno a ed il giorno b"..
con quel modello è molto semplice.
--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

fOLKEN Profilo | Newbie

Saro petulante ma sono di certo piu confuso di prima

alx_81 Profilo | Guru

>Saro petulante ma sono di certo piu confuso di prima
ti faccio un esempio, cerco di eliminarti la confusione..
Analisi:
Mi serve un database di un hotel e in questo momento mi serve avere la lista dei prodotti in scadenza per camera (o di una camera in specifico). I prodotti che fornisco ad ogni camera sono i medesimi, l'unica cosa che cambia sono le date di scadenza.

Entità:
Prodotto
Camera

Detto questo, ammettiamo che della camera mi serva sapere solo il numero. Per un campo forse posso evitare una tabella CAMERE.
Del prodotto mi serve il nome, ma, essendo una stringa anche, a volte, lunga, meglio definire un codice, magari numerico per fare in modo di non ripetere inutilmente le descrizioni, onerose sulle query che dovrò fare in seguito. Quindi mi serve una tabella PRODOTTI, ad esempio, così formata:

IDProdotto numerico intero
Nome testo variabile
Descrizione testo variabile

Ora, come faccio a capire quali sono i prodotti assegnati alle camere? Devo logicamente pensare ad una relazione tra l'entità camera e quella prodotti, in modo che io possa sapere quali sono i prodotti per camera, che, saranno pure gli stessi, ma comunque ripetuti per ogni camera perchè la loro data di scadenza cambia.
Quindi posso pensare ad una tabella PRODOTTI_IN_SCADENZA fatta così:

Camera numerico intero
IDProdotto numerico intero
DataScadenza Data

In questo modo, una volta che ho inserito tutti i prodotti in tutte le camere, posso fare una query di questo tipo per avere la lista dei prodotti in scadenza (3 giorni nell'esempio) con la rispettiva camera di riferimento:

SELECT PS.Camera , P.Nome AS Prodotto , P.DataScadenza FROM PRODOTTI_IN_SCADENZA AS PS INNER JOIN PRODOTTI AS P ON PS.IDProdotto = P.IDProdotto WHERE PS.Data >= NOW() - 3 GROUP BY PS.Camera

In questo modo avrai la lista dei prodotti che scadranno entro tre giorni per camera. Se ti serve sapere la situazione di una sola camera, togli il GROUP BY e nella where aggiungi il filtro per camera. Spero sia più chiaro.
--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

fOLKEN Profilo | Newbie

Ho fatto tutto come mi hai spiegato ma mi risponde con un errore nella query
Impossibile eseguire una query che non include l'espressione "Prodotto" specificata come parte di una funzione di aggregazione


Comunque grazie

alx_81 Profilo | Guru

>Ho fatto tutto come mi hai spiegato ma mi risponde con un errore
>nella query
>Impossibile eseguire una query che non include l'espressione
>"Prodotto" specificata come parte di una funzione di aggregazione
>
sì perchè ho messo GROUP BY, ma è ORDER BY, disattenzione. Scusami ma sono appena tornato dall'Austria e sono un po' stanco , chiedo venia, prova così:
SELECT PS.Camera , P.Nome AS Prodotto , P.DataScadenza FROM PRODOTTI_IN_SCADENZA AS PS INNER JOIN PRODOTTI AS P ON PS.IDProdotto = P.IDProdotto WHERE PS.Data >= NOW() - 3 ORDER BY PS.Camera
--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5