Newsgroup: it.comp.appl.access
Titolo: RECORDSET SNAPSHOT DA QUERY

Salve a tutti ...ed ecco la mia richiesta.
Ho 2 tabelle ...tab1 e tab2 collegate uno a molti.
Visualizzo un record di tab1 su una maschera (basata su una query costruita 
dinamicamente in vb  ).
La maschera contiene una sottomaschera dove visualizzo automaticamente  i 
record di tab2 relativi al record corrente di tab1.
Tutto funziona eseguendo una ricerca tramite una maschera con controlli non 
associati su tab1 e tab2 (in questa fase costruisco la la stringa SQL per 
query).
Purtroppo se ricerco campi della sola tab1 ,la maschera di visualizzazione 
mi permette la modifica successiva del contenuto dei campi,mentre se includo 
anche campi di tab2 ...la maschera di visualizzazione si apre con i campi 
bloccati.
Ho scoperto che alcuni tipi di query restituiscono un recordset di tipo 
snapshot ...ovvero posso navigare tra i record ma non aggiungere nuovi 
record o fare modifiche.(qui sta il difetto)
Ho provato a modificare il tipo di recordset sulla maschera ma senza 
successo.
Potete darmi qualche soluzione alternativa tenendo conto che la query che 
uso e' vitale per tutto il mio programma ?(ricerche,report,,maschere)
 
                                         Grazie

 ha scritto nel messaggio 
news:TQpHg.81044$zy5.1...@twister1.libero.it...

Stai parlando di maschera principale(tab1) e sottomaschera(tab2) legata 
tramite le proprietà "Collega campi secondari/master"?
Ciao.
-- 
Sergio MAZZA 

La situazione reale e' questa :
tab2          tab1
ca < ---     ca          tab3        tab4
cb             cb < ---  cb --- >  cb          tab5
cd                                           cc --- >  cc           tab7
cc                 .         tab6      tab8           cd < ----cd
cf                cd <---  cd ---  cd                            cf
                                ag
                                                                          tab9
cg                                                          cg < --- cg
Ovviamente tra tab1 e tab2 e' applicata l'integrita' referenziale, 
aggiornamento e eliminazione a catena,mentre per le altre tabelle la sola 
integrita referenziale,ad eccezione della tab8 che viene usata solo quando 
tab6 ha il campo ag =NOAGG,mentre se tab6 ha il campo ag=AGG viene usata la 
Tab7.
La maschera M1 (con origine la query dinamica da vb) visualizza i record 
estratti da tab1 e nella sua sottomaschera i record di tab2.
La query viene costruita in base alle richieste fatte su una maschera con 
caselle di testo non associate.
Se la ricerca avviene solo sui campi della tab1 (principale) la maschera M1 
si apre con la possibilita' di fare modifiche o aggiunte.
Se la ricerca avviene richiedendo per esempio cb su tab1 e cc su tab4 
,allora la maschera M1 si apre solo in visualizzazione e navigazione tra i 
record.
Per il momento ,in caso di ricerca del secondo tipo,ho fatto in maniera che 
si apra una maschera M2=M1 con i campi in sola lettura e l'avviso che per 
modificare i record bisogna fare una ricerca solo sui campi della tab1.
Devo dire che Access ha risposto giustamente ,infatti se volessi modificare 
in seguito  il campo cd su tab1,avrei i record su tab2 con il vecchio campo 
cd;quindi ho dovuto subordinare il cambiamento dei campi vitali alla 
cancellazione automatica dei record di tab2.
Nelle mie ricerche di una soluzione non ho trovato nulla,eppure dovrebbe 
essere abbastanza comune se nel programma le relazioni tra le tabelle 
diventano appena piu' complicate.

 ha scritto nel messaggio 
news:92zHg.81201$zy5.1...@twister1.libero.it...

Secondo me dovresti (per esempio) aprire una maschera, con origine solo una 
tabella, ma filtrata in base alle selezioni scelte dalle caselle di testo.
Sempre se ho capito bene...
Ciao.
-- 
Sergio MAZZA 

Grazie per aver risposto.
Il mio problema e' proprio quello di poter impostare ricerche su tab1 e 
eventualmente su tab2  e usare  i record estratti da tab1 per 
visualizzazione,report etc.
Ovviamente essendo novizio di access avevo cominciato con maschere basate 
sulle tabelle,ma poi su consiglio e scoperta su questo NG ho imparato che 
potevo creare query da VB mantendo sempre il recordset per tutte le esigenze 
del programma.
Sto pensando di togliere l'integrita' referenziale tra tab1 e tab2 sempre 
che sia possibile mantenere l'aggiornamento e l'eliminazione a catena dei 
record su tab2 ,anche perche' nel programma non permetto la mancanza di 
record su tab2 se esiste il record su tab1(principale).
Forse in questo modo non avrei un recordset snapshot.
 
                    Grazie

Niente da fare,anche togliendo l'integrita referenziale tra tab1 e tab2 da 
sempre un recordset snapshot. 

Ecco le relazioni in chiaro.....
ENTI (tab2)                INTERVENTI(tab1)
 ca      < --------------------  ca                    tab3            tab4
 LINEA                               LINEA < ---  LINEA --- > LINEA 
tab5
 REPARTO                            "" 
STAZIONE --- >      STAZIONE                        tab7
 STAZIONE                          "" 
IMPIANTO < ---------IMPIANTO
 IMPIANTO                          "" 
REPARTO                         tab9
 TIPOENTE                           "" 
TIPOENTE<-----------TIPOENTE
 NOME_ENTE                      "" 
""                                 tab10
                                               "" 
NOME_ENTE<-------NOME_ENTE
                                               ""
                                               ""
                                               ""                       tab6 
tab8
                                         REPARTO <---  REPARTO ---  REPARTO
                                                 ag 
ENTIREP
 

 ha scritto nel messaggio 
news:xj%Hg.82760$zy5.1...@twister1.libero.it...

Sono un po' disorientato dall'esempio che hai proposto; in teoria potresti 
fare una form principale associata a [tab1] e una struttura a schede con 
sottomaschere che visualizzi le altre tabelle, visto che il campo che le 
lega ha contenuti uguali. E quest'ultima mia affermazione m'incasina; questo 
vorrebbe dire che [tab1] = cb è uguale e in relazione diretta con [tab4] = 
cb, scavalcando [tab3] = cb.
Ma immagino che non sia così...
Ciao.
-- 
Sergio MAZZA 

TABELLA RELAZIONI in chiaro
 specifiche                  interventi
 id < --------------------id                              linee 
stazioni
 LINEA                      LINEA < ------------ LINEA --- > LINEA 
tipo enti
 REPARTO                    - 
STAZIONE --- >  STAZIONE              impianti
 STAZIONE                  - 
IMPIANTO < ----IMPIANTO
 IMPIANTO                  - 
REPARTO             tipogia enti
 TIPOENTE                   - 
TIPOENTE<----.TIPOENTE
 NOME_ENTE              -                                                    
                                  -                        enti
                                      - 
NOME_ENTE<---NOME_ENTE
                                      -
                                      -
                                      -                    reparti 
enti_prov
                             REPARTO <---  REPARTO ---  REPARTO
                                     ag 
ENTIREP
 La maschera M1 si basa su una query (RICERCAFONOQ)dinamica da vb.
Tale query estrae,in base alla richieste fatte su una maschera 
(RICERCAFONO)con controlli non associati riguardanti interventi e 
specifiche),i dati dalla tabella interventi (tutto ok)ed eventualmente dalla 
tabella  specifiche.(in questo caso restituisce uno snapshot totale per 
interventi e specifiche)
Le tabelle linee,stazioni e reparti sono complete,mentre le tabelle tipo 
enti,impianti,tipologia enti,enti sono complete solo per alcuni reparti.
Quindi in base al reparto scelto si avra' il campo ag = NOAGG per reparti 
che devono usare ancora enti_prov e di conseguenza i campi 
IMPIANTO=ND,TIPOENTE = valori di enti_prov ,NOME_ENTE = valore da inserire; 
mentre se il reparto scelto ha il campo ag =AGG  verrano usate le tabelle 
complete tipo enti,tipologia enti,enti.
Questo vale per la maschera RICERCAFONO e anche per la maschera M1 in caso 
di modifiche o nuovi record.
La query e' sempre attiva, ossia all'inizio e in seguito su richiesta ,viene 
eseguita con tutti i campi vuoti sulla maschera RICERCAFONOQ ottenendo 
sempre tutti i record della tabella interventi e relativi record della 
tabella specifiche,quindi funzionano tutti i report e maschere impostate
Se viene fatta una ricerca sempre con la maschera RICERCAFONOQ, la stessa 
query si modifica fornendo i risultati desiderati per tutti i report e 
maschere.
Purtroppo nel caso di ricerca su valori relativi solo alla tabella 
interventi la maschera M1 permette la modifica e nuovi record,mentre se la 
ricerca comprende anche valori relativi alla tabella specifiche,allora 
fornisce un recordset di tipo snapshot.
In questo caso avviso l'utente che per modifiche o nuovi record deve 
effettuare una ricerca solo sulla tabella interventi.
Il programma gia' protetto con gruppi e utenti funziona perfettamente ed e' 
prossimo alla divisione in FE e BE,ma se possibile vorrei capire se ho 
sbagliato nell'impostarlo o se ci sono soluzioni al problema.
Scusami per la lunghezza del messaggio ma volevo essere il piu' chiaro 
possibile.
 
                             Ciao e ancora grazie

TABELLA RELAZIONI in chiaro
specifiche                        interventi
     id<-----------------------id                         linee 
stazioni
    LINEA                        LINEA <-----------LINEA---------->LINEA
REPARTO                            - 
STAZIONE                     impianti
STAZIONE                           - 
IMPIANTO----------->IMPIANTO
IMPIANTO                           - 
REPARTO         tipologia enti
TIPOENTE                           - 
TIPOENTE<----TIPOENTE
NOME_ENTE                      -                                             
                                                     - 
enti
                                              - 
NOME_ENTE<--NOME_ENTE
                                              - 
reparti                   enti_prov
                                       REPARTO<-------------REPARTO--------REPARTO
 
       ag                      TIPOENTE


                                     ag ENTIREP
Purtroppo un "disegno" del genere non rende; sarebbe meglio indicare:
[nomeTabella]
- nomeCampo;
- etc. etc.
[nomeTabella2]
- nomeCampo;
- nomeCampo2;
- etc. etc.
Relazioni:
[nomeTabella].nomeCampo 1 -> M [nomeTabella2].nomeCampo2
etc. etc.
Ma lasciamolo da parte, per ora.

Perché non separi le operazioni di ricerca e modifica dati?
Se la ricerca parte dalla tabella [interventi] per (per es.) visualizzare 
tutte le [specifiche] e noti che una o più di queste non ha dati inseriti o 
è da modificare; apri un'altra maschera con origine solo quella tabella 
(filtrata per [idIntervento]) e fai fare le modifiche/aggiunte del caso...
Ciao.
-- 
Sergio MAZZA 

Forse ora e' piu' chiaro...
 TABELLE :
[INTERVENTI]
 ID
 LINEA
 REPARTO
[SPECIFICHE]
 ID
 LINEA
 REPARTO
 STAZIONE
 IMPIANTO
 TIPONTE
 NOME_ENTE
[REPARTI]
 REPARTO
 ag
[ENTI_PROV]
 REPARTO
 ENTIREP
[LINEE]
 LINEA
[STAZIONI]
 LINEA
 STAZIONE
[IMPIANTI]
 STAZIONE
 IMPIANTO
 [ENTI]
 IMPIANTO
 REPARTO
 TIPOENTE
 NOME_ENTE
[TIPOENTI]
 TIPOENTE
[NOMI_ENTE]
 NOME_ENTE
-----------
 RELAZIONI:
[INTERVENTI].ID 1 -> M [SPECIFICHE].ID
[INTERVENTI].REPARTO 1 -> M [REPARTI].REPARTO ->[ENTI_PROV].REPARTO
[INTERVENTI].LINEA M -> 1 [LINEE].LINEA 1 -> M [STAZIONI].LINEA
[STAZIONI].STAZIONE 1 -> M [IMPIANTI].STAZIONE
[IMPIANTI].IMPIANTO 1 -> M [ENTI].IMPIANTO
[ENTI].TIPOENTE M -> 1 [TIPOLOGIAENTI].TIPOENTENTE
[ENTI].NOME_ENTE M -> 1 [NOMI_ENTE].NOME_ENTE
La maschera M1 si basa su una query (RICERCAFONOQ)dinamica da vb.
Tale query estrae,in base alla richieste fatte su una maschera
(RICERCAFONO)con controlli non associati riguardanti [INTERVENTI] e
[SPECIFICHE],i dati dalla tabella [INTERVENTI] (tutto ok) ed eventualmente 
dalla
tabella [SPECIFICHE].(in questo caso restituisce uno snapshot totale per
interventi e specifiche)
Le tabelle linee,stazioni e reparti sono complete,mentre le tabelle tipo
enti,impianti,tipologia enti,enti sono complete solo per alcuni reparti.
Quindi in base al reparto scelto si avra' il campo ag = NOAGG per reparti
che devono usare ancora enti_prov e di conseguenza i campi
IMPIANTO=ND,TIPOENTE = valori di enti_prov ,NOME_ENTE = valore da inserire;
mentre se il reparto scelto ha il campo ag =AGG  verrano usate le tabelle
complete tipo enti,tipologia enti,enti.
Questo vale per la maschera RICERCAFONO e anche per la maschera M1 in caso
di modifiche o nuovi record.
La query e' sempre attiva, ossia all'inizio e in seguito su richiesta ,viene
eseguita con tutti i campi vuoti sulla maschera RICERCAFONOQ ottenendo
sempre tutti i record della tabella interventi e relativi record della
tabella specifiche,quindi funzionano tutti i report e maschere impostate.


                             Ciao e ancora grazie
Quello che continuo a ripeterti, ma non perché sia la cosa migliore, è se 
hai preso in considerazione la separazione delle operazioni di 
ricerca/modifica dati.
Poi non capisco perché utilizzi form disconnesse o cambi il recordsource 
quando devi solo filtrare i dati; lavori in rete? Se sì, la rete (e l'HW) è 
così lento? Hai una mole di dati così vasta da giustificare quella tecnica?
Ti faccio un esempio di come avrei strutturato io le form:
- Form [INTERVENTI] asssociata alla tabella [INTERVENTI].
(struttura a schede con)
- SubForm [SPECIFICHE] associata alla tabella [SPECIFICHE] e collegata 
tramite proprietà "Collega campi secondari/master" per [INTERVENTI].ID 1 -> 
M [SPECIFICHE].ID
- SubForm [REPARTI] associata alla tabella [REPARTI] e collegata (idem come 
sopra) per [INTERVENTI].REPARTO 1 -> M [REPARTI].REPARTO
Le altre form o sono Form/SubForm o singole Form.
Questo per inserimento/modifica dati.
La form che effettuerà la ricerca, in qualsiasi delle tabelle, dovrà aprire 
(filtrandola tramite il parametro CondizioneWhere del metodo OpenForm) la 
relativa form (descritta sopra) in (es.) modalità "solo modifica".
Ho semplificato ma io partirei da questo...
Ciao.
-- 
Sergio MAZZA 

Chiedo umilmente perdono e vi ringrazio della vostra infinita pazienza.
Ho trovato il motivo (la ragione vorrei conoscerla..) per cui la ricerca 
contemporanea sui campi di [INTERVENTI] E [SPECIFICHE] forniva una query 
snapshot
Il programma lavora sulla tabella principale [ INTERVENTI ] 1---M 
[SPECIFICHE] e presenta sulla maschera M1, con recordsource la query 
RICERCAFONOQ ,i dati estratti di [INTERVENTI] e nella sottomaschera M1_2 i 
record relativi di [SPECIFICHE].
Tutte le altre tabelle servono ad alimentare i campi di [INTERVENTI],infatti 
sono in relazione M--->1 con essa e in relazione 1--->M dove serve tra loro.
I gruppi di utenti sono :
1) DM : inserimento,modifica di record,ricerca e usano la Maschera M1 
alimentata dalla query RICERCAFONOQ
2) RE : ricerca e la sola modifica di una parte di campi di [INTERVENTI] 
riguardanti la sola chiusura del record interventi desiderato,quindi usano 
la maschera M2 uguale a M1 ma con i campi vietati posti in sola lettura.
La maschera M2 e' alimentata sempre dalla query RICERCAFONOQ
3) LE : ricerca,lettura,stampa di record di [INTERVENTI] usando la maschera 
M3 uguale a M1 con i tutti i campi in sola lettura.
Con la maschera RICERCAFONO ,con controlli non associati ,tutti possono 
effettuare ricerche sui campi di [INTERVENTI] e/o [SPECIFICHE] creando dalla 
ricerca la query RICERCAFONOQ in vb utile per le maschere e i report.
Il motivo della query snapshot era la prima parte della query :
SELECT INTERVENTI * FROM INTERVENTI INNER JOIN SPECIFICHE ON 
INTERVENTI.CONTAFONO = SPECIFICHE.IDFONO WHERE ....usata nelle prime 
versioni senza dare il famoso snapshot.
 e'diventata (MEA CULPA)
SELECT DISTINCT INTERVENTI * FROM INTERVENTI INNER JOIN SPECIFICHE ON 
INTERVENTI.CONTAFONO = SPECIFICHE.IDFONO WHERE ...
Ora tutto va bene....ma credo che vi disturbero' ancora.

Soluzione finale
select distinctrow campi from interventi inner join specifiche on 
interventi.contafono = specifiche.idfono where.....
                                       Grazie e ciao