Newsgroup: it.comp.appl.access
Titolo: Come posso tilizzare una variabile di sessione?

Gentili frequentatori di questo NG,
ho bisogno del vostro aiuto e spero che qualche anima clemente possa
fornirmelo.
Ho la necessità di realizzare un database che mi permetta di acquisire ed
immagazzinare dei record periodicamente. La mia esigenza specifica è la
seguente... l'immissione di solito avviene per gruppi di record, tipo 5 o 6
alla volta, e di questi mi servirebbe ottenere un report che venga poi
mandato via fax.
Siccome ho qualche conoscenza di ASP, mi è venuto in mente che la logica per
realizzare questo meccanismo potesse essere quella di adottare una sorta di
variabile di sessione, che si aggiorni ad ogni apertura della maschera di
immissione dati, tipo Sessione = Sessione + 1... questo valore poi dovrebbe
venire memorizzato in un campo appartenente ad ogni record immesso in quella
sessione.
Cioè il record conterrebbe (in campi): "id progressivo" - "sessione di
immissione" - "data" - "dato 1" - "dato 2" - "dato 3" - ecc.
Una volta terminata l'immissione, con un pulsante andrei ad aprire un report
che faccia riferimento ad una query che come filtro abbia proprio il valore
di quella sessione... spero di essere stato comprensibile.
Il mio grande handycap è quello di non avere alcuna dimestichezza con il
VisualBasic e quindi con il linguaggio dei moduli di Access e non so
veramente da dove iniziare.
Quello che per ora ho potuto realmente fare è stata la preparazione delle
due tabelle DATI e Sessione (quest'ultima con un solo record che si dovrebbe
aggiornare, ma non so se questo sia possibile e valido tecnicamente) e la
preparazione della maschera di inserimento.
Per quest'ultima, vorrei sapere se fosse poi possibile poter navigare tra i
record immessi nella sessione corrente... cioè con i tasti di navigazione
record, è possibile spostarsi solo tra quelli immessi durante la sessione
corrente (ove ce ne siano) senza vedere anche gli altri? quindi, per dirla
forse più facilmente è possibile creare una maschera di immissione che abbia
come sorgente una Query, che filtri la sessione?
Spero veramente che qualcuno mi possa aiutare... grazie anticipatamente
Antonio

 ha scritto nel messaggio
news:kNaYa.42648$cl3.1...@news2.tin.it...

Secondo me non ti conviene costruire una tabella tipo:
"id progressivo" - "sessione di immissione" - "data" - "dato 1" - "dato 2" -
"dato 3" - ecc.
che fai per ogni valore crei un campo?
Se vuoi identificare le "sessioni" potresti utilizzare due tabelle:
tabella "Sessioni"
- campo idSessione tipo contatore univoco
tabella "ValoriSessione"
- campo idSessione tipo intero lungo
- campo valoreSessione
prima di inserire i valori di sessione crei il nuovo record nella tabella
Sessioni ottieni l'id e lo scrivi nella tabella ValoriSessioni con il/i
valore/i. Per "raffinare" la situescion io ci inserirei:
tabella Sessioni:
- campo idSessione tipo contatore univoco
- campo DataSessione tipo data/ora (valore predefinito date())
tabella "ValoriSessione"
- campo idSessione tipo intero lungo
- campo valoreSessione
- campo daFaxare tipo sì/no (valore predefinito No)
- campo faxatoIl tipo data/ora (da aggiornare al momento della generazione
del fax)
Ciao.
--
Sergio MAZZA

Sergio MAZZA ha scritto:



Io per non complicare troppo le cose terrei il campo "sessione" nella
stessa tabella che contiene i dati, senza creare ulteriori tabelle.
Infatti sembra che l'unico scopo dell'IDsessione sia distinguere una
sessione dall'altra, senza bisogno di salvare la data, l'ora o altri dati.
All'apertura della maschera crei il nuovo numero di sessione prendendo il
più alto valore del campo sessione ed aggiungendo uno, con la formula
    Dim IDsessione as Long
    IDsessione=Nz(Dmax("sessione","<nometabella>"))+1
e lo inserisci in tutti i nuovi record.
(Il campo "sessione" nella tabella deve essere di tipo "Numerico - Intero
lungo" altrimenti vai sicuramente incontro ad errori di overflow se superi
le 32.767 sessioni.)
Un metodo semplice per inserirlo nei nuovi record è creare una casella
(visibile o nascosta, come preferisci) associata al campo sessione e
impostarne il valore predefinito all'IDsessione appena calcolato:
    Me.<nomeTextBoxSessione>.DefaultValue=IDsessione
E già che ci sei puoi impostare il filtro per i record della maschera:
    Me.Filter="sessione=" & IDsessione
    Me.FilterOn=True
Per il report non serve impostare a mano il criterio o il parametro nella
query, basta lasciare la query senza criteri e passare l'IDsessione nel
metodo OpenReport:
    DoCmd.OpenReport "nome report", acViewPreview, , "sessione=" &
IDsessione
ATTENZIONE: Se l'inserimento dati dev'essere fatto da più utenti
contemporaneamente, con questo sistema c'è la possibilità che due utenti
prendano lo stesso numero di sessione (se aprono la maschera insieme prima
che l'altro abbia salvato almeno un record), incasinando tutto. In questo
caso ti consiglierei la soluzione proposta da Sergio.
Saluti.
Namor
* * * RISPETTA L'AMBIENTE * * *
Questo messaggio è stato inviato 
usando solo elettroni riciclati al 100%!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Vi ringrazio entrambi per la disponibilità e per le soluzioni.
Un'ultima cosa che vi fa' capire quanto io sia imbranato con Access: ho
scelto le opzioni di avvio per una maschera che funga da menù, disabilitando
tutto il disabilitabile... ora però non riesco più a modificare nulla...
come posso risolvere il problema?
Grazie ancora.
"namor" <namor@-NOSPM-inwind.it> ha scritto nel messaggio
news:bgsvt8$uck$1...@news.newsland.it...



Sì però scrivi la tua risposta alla fine del messaggio, come faccio io;
grazie.
Premi F11; oppure tieni premuto lo shift (maiuscolo) sinistro mentre si apre
l'applicazione... e poi non mi ricordo di altre opzioni.
Ciao.
--
Sergio MAZZA

 Ciao.
Grazie mille.

 ha scritto nel
messaggio
[CUT]



Se dichiari la variabile IDsessione a livello di modulo (fuori da ogni sub)
Private IDsessione as Long
e ti calcoli il valore non all'apertura della maschera ma immediatamente
prima di salvare il primo record della sessione, riduci praticamente a
zero il rischio che due utenti possano prendere lo stesso numero di
sessione e puoi usare questo sistema senza problemi.
Per esempio sull'evento "apertura" della maschera imposti IDsessione=0 e
su "Prima di aggiornare" (beforeupdate) calcoli il nuovo valore e lo
assegni al campo:
If IDsessione=0 Then
    IDsessione=Nz(Dmax("sessione","<nometabella>"))+1
    Me.<nomeTextBoxSessione>.DefaultValue=IDsessione
End If
Namor
-- 
* * * RISPETTA L'AMBIENTE * * *
Questo messaggio è stato inviato 
usando solo elettroni riciclati al 100%!
