Newsgroup: it.comp.appl.access
Titolo: Query & SQL

Avrei un problemino con access e SQL, io ho un database che contiene
diverse tabelle :
ListinoCategoria (IDCategoria)
ListinoPrezzi (IDNome, IDTipo, IDPrezzo, IDCategoria)
Rapportini (IDDataImmissione, IDCategoria, IDNome, IDValore, IDCantiere)
sul campo IDNome della tabella Rapportini ho impostato come tipo di dati la
possibilità di
elencare certi valori in base alla scelta che si è fatta precedentemente su
un altro campo della stessa tabella (IDCategoria) ed ho provato a farlo con
questo
codice:
SELECT ListinoPrezzi.IDNome
FROM ListinoPrezzi, ListinoCategoria, Rapportini
WHERE ListinoCategoria.IDCategoria = Rapportini.IDCategoria
Nella tabella Rapportini ho impostato nel campo IDCategoria il metodo di
ricerca con origine il contenuto della tabella ListinoCategoria.
A questo punto vorrei avere la possibilità di scegliere il valore
Rapportini.IDNome in base alla scelta fatta su Rapportini.IDCategoria, si
dovrebbero visualizzare i valori IDNome che appartengono alla categoria
IDCategoria, nel modo in cui sono associati nella tabella ListinoPrezzi...
.... spero di essere stato abbastanza chiaro.... ma non è
semplice.....
Grazie a chi mi risponderà :-)
--
By Fino
fi...@libero.it

 ha scritto nel messaggio
news:F2WV5.12046$hk4.4...@news.infostrada.it...

Se non ho capito male hai una maschera (MaskRapportini) che ha come origine
record la tabella Rapportini; questa maschera contiene cinque controlli
associati: tre sono caselle di testo (IDDataImmissione, IDValore,
IDCantiere).
Poi hai una casella combinata chiamata IDCategoria dalla quale vuoi
selezionare uno dei valori contenuti nel campo IDCategoria della tabella
ListinoCategoria.
Hai infine n'altra casella combinata chiamata IDNome dalla quale vuoi
selezionare uno dei valori contenuti nel campo IDNome della tabella
ListinoPrezzi, ma vuoi che nell'elenco della combo compaiano solo gli IDNome
che appartengono alla categoria selezionata con la precedente casella
combinata.
Se così è, come origine riga della casella combinata IDCategoria metti il
seguente codice SQL:
SELECT ListinoCategoria.IDCategoria
FROM ListinoCategoria;
e iserisci un valore nella Lunghezza colonne di questa combo.
Poi come origine riga della casella combinata IDNome metti il seguente
codice SQL:
SELECT ListinoPrezzi.IDNome
FROM ListinoPrezzi
WHERE
(((ListinoPrezzi.IDCategoria)=[Forms]![MaskRapportini]![IDCategoria]));
e iserisci un valore nella Lunghezza colonne anche di questa combo.
Infine a fronte dell'evento dopo aggiornamento della casella combinata
IDCategoria genera il seguente codice VBA:
Me!IDNome.Requery
Ad onor del vero ci sarebbe qualcosa da ridire su come hai strutturato le
tue tabelle, che non rispettano certo i canoni di un database relazionale.
Visto che il tuo quesito era però quello di gestire due caselle combinate in
cascade, il resto, data l'ora, lo vedremo un'altra volta.
Facci sapere.

 Facci sapere.
Grazie Roberto, con il tuo aiuto sono riuscito a gestire le due caselle
combinate :-))))))))
Cosa intendi col dire che non ho rispettato i canoni per un database
relazionale? Dovrei organizzare in maniera diversa le tabelle?
--
By Fino
fi...@libero.it

 By Fino
Innanzitutto ti consiglio di iniziare i nomi dei campi con ID solamente se
contengono una chiave interna (chiave primaria) o una chiave esterna. Access
funziona lo stesso, ma se rispetti questa convenzione usata praticamente da
tutti, riuscirai a capire e a farti capire meglio, riuscirai a leggere
meglio l'help e in generale tutta la biliografia che riguarda Access. Quindi
Valore e non IDValore, Prezzo e non IDPrezzo ecc.
Uno dei principi fondamentali di un database relazionale è quello di non
avere duplicazioni di dati in più tabelle, a meno che non si tratti appunto
di chiavi. Il rispetto di questa regola ti darà molti vantaggi quali una
minore dimensione del DB, o il fatto che se devi cambiare la descrizione è
sufficiente cambiarla nell'unica tabella in cui risiede per ottenere che
tutti gli oggetti del database si adeguino al cambiamento automaticamente.
Avendo una adeguata architettura delle tue tabelle (struttura e relazioni)
nel tuo caso, se vuoi cambiare la descrizione di una categoria, è
sufficiente farlo nella tabella ListinoCategoria, senza preoccuparti di
doverlo fare anche nei record delle tabelle ListinoPrezzi e Rapportini.
La stessa cosa vale per i campi IDNome.
Insomma se avessi dovuto creare io il tuo database, la struttura delle
tabelle l'avrei fatta così:
ListinoCategoria
-----------------------
IDCategoria                Contatore e chiave primaria
Categoria                    Testo
ListinoPrezzi
------------------
IDNome                        Contatore e chiave primaria
Nome                            Testo
Tipo                                decidi tu
Prezzo                           Numerico
IDCategoria                  Numerico (chiave esterna)
Rapportino
----------------
IDRapportino                Contatore e chiave primaria
DataImmissione            Data/ora
IDCategoria                   Numerico (chiave esterna)
IDNome                          Numerico (chiave esterna)
Valore                            Valuta
IDCantiere                     Numerico (chiave esterna)
Cantieri
-----------
IDCantiere                    Contatore e chiave primaria
Cantiere                        Testo
ecc. ecc.
Poi mi sarei preoccupato, nella struttura della tabella ListinoPrezzi,
tramite l'Autocomposizione Ricerca...., di collegare il campo IDCategoria al
campo Categoria (descrizione) contenuto nella tabella ListinoCategoria; così
facendo ogni volta che uso detto campo della tabella ListinoPrezzi in una
query, in una maschera o in un report vedrò automaticamente la descrizione e
non il codice della categoria, fermo restando che in tabella ho memorizzato
solo il codice.
Stessa cosa farei per i campi IDCategoria, IDNome e IDCantiere della tabella
Rapportini.
--
Roberto
---------------------------------------------
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/
---------------------------------------------

..... ho un nuovo problema... sto tentando di aprire da una maschera di
riepilogo (dove sono elencati diversi cantieri) una seconda maschera dove
visualizzo solo i record dei cantieri filtrati, fin qui tutto ok, quando
però cerco di aggiungere un nuovo record il campo relativo al cantiere è
naturalmente vuoto; come devo fare per mettere su una casella di immissione
testo, come valore predefinito, il valore di un campo selezionato su
un'altra maschera?
Le maschere sono strutturate + o - così:
Maschera1: IDCantiere + PulsanteAperturaMaschera2
Maschera2: IDCantiere + Altri campi
IDCantiere sulla Maschera2 deve essere uguale al cantiere selezionato sulla
maschera1
Io ho tentato di mettere su valore predefinito di Maschera2.IDCantiere   :
=[Maschere]![Maschera1]![IDCantiere]
ma non funziona, quando aggiungo un nuovo record mette come valore su
IDCantiere  :
#Nome?
...boh
--
By Fino
fi...@libero.it

:-) Grazie :-)
Adesso provo a finire il Database con la mia struttura, poi lo rifaccio
seguendo i tuoi consigli
--
By Fino
fi...@libero.it
P.S: se magari mi dai anche un aiutino sul msg che ho postato un minuto fa
te ne sarei molto grato, sei una persona che spiega molto bene :-)

 te ne sarei molto grato, sei una persona che spiega molto bene :-)
Spiegazione chiara = idee chiare
Questo vale anche x le domande che vengono poste al NG.
--
Silvio


 ha scritto nel messaggio
news:by9W5.16325$hk4.6...@news.infostrada.it...

Altra regola che devi velocemente imparare: quando hai un nuovo quesito non
postarlo all'interno del thread di un altro tuo quesito precedente; manda un
NUOVO messaggio (non una risposta), con un nuovo subject, altrimenti diventa
quasi impossibile seguire un argomento.
Questa volta non sono sicuro di aver capito il tuo problema. A prima vista
sembrerebbe che Maschera2 non dovrebbe essere aperta con un pulsante di
comando da Maschera1, ma dovrebbe essere contenuta in un controllo
sottomaschera di Maschera1.
Dovresti dirci cosa contengono, come sono strutturate e come sono in
relazione fra di loro le due tabelle che sono origine record delle due
maschere.
--
Roberto
---------------------------------------------
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/
---------------------------------------------

 maschere.
Semplicemente: ho una maschera che contiene una lista di nomi, dopo averne
selezionato uno apro una seconda maschera (cliccando su un pulsante della
maschera con la lista). La seconda maschera dovrebbe contenere su un campo o
su una etichetta di testo il valore che contiene  il valore selezionato
nella prima maschera.
Come faccio???
Grazie :)
--
By Fino
fi...@libero.it

 ha scritto nel messaggio
news:x7NW5.28542$hk4.1...@news.infostrada.it...

Le notizie supplettive servono sulle tabelle (vedi mio messaggio precedente)
e non
sulle maschere.
Insomma dicci quale risultato vuoi ottenere e come sono organizzati i dati e
le tabelle.
La soluzione vedremo di trovarla insieme.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/
---------------------------------------------