Newsgroup: it.comp.appl.access
Titolo: CurrentRecord non funz.in maschera continua. Perché?

Currentrecord in una maschera singola funziona, mentre se la
maschere è di tipo continua, ad ogni record visualizzato restituisce
sempre lo
stesso valore (se seleziono il primo record dà tutti 1, se seleziono
il 2 record dà tutti 2)
1- Ho inserito la funzione nell'origine record di una casella di testo
     e come già detto scrive per tutti i record lo stesso valore
2- ho usato sull'evento afterupdate di una casella di testo (c1)
associata ad un
   campo l'assegnazione del valore alla casella di testo
           Private Sub c1_AfterUpdate()
                      Me.Testo = CurrentRecord
           End Sub
 ma non ha scritto nessun valore
3- ho usato sull'evento afterupdate di una casella di testo (c1)
associata ad un
    campo l'assegnazione del valore alla casella di testo
           Private Sub Form_AfterUpdate()
                    Me.Testo = CurrentRecord
           End Sub
    ma non ha scritto nessun valore
Come posso risolvere il problema
Grazie
RobViv

 ha scritto nel messaggio
news:398D701C...@usa.net...

Nella tua maschera  visualizzata a Maschere continue (Maschera1) il
controllo C1 deve essere una casella di testo associata ad un campo numerico
(Campo1) della tua tabella (Tabella1); a fronte dell'evento "Prima di
aggiornare" di Maschera1 genera il seguente codice VBA:
    Me![C1] = CurrentRecord
A questo punto ti sembrerà di aver ottenuto ciò che volevi. Ma prova a
cancellare il primo record: tutti i restanti record avranno un valore errato
nel Campo1; e d'altra parte questo è uno dei motivi per cui è bene non
registrare in una tabella i controlli calcolati.
Pertanto la cosa giusta da fare, secondo me, è questa: fermo restando la
struttura di Tabella1 e di Maschera1 come sopra detto, a fronte dell'evento
"Su apertura" di Maschera1 genera il seguente codice VBA:
Dim dbMio As Database
Dim rcdMio As Recordset
Dim RcdCont As Integer
Set dbMio = CurrentDb()
Set rcdMio = dbMio.OpenRecordset("Tabella1")
RcdCont = 1
Do Until rcdMio.EOF
    rcdMio.Edit
    rcdMio![Campo1] = Pippo
    rcdMio.Update
    rcdMio.MoveNext
    RcdCont = RcdCont + 1
Loop
Naturalmente non fare alcuna routine a fronte di "Prima di aggiornare" di
Maschera1.
Se Maschera1 la adoperi anche per inserire e/o cancellare record è bene che
richiami questa routine anche con l'evento "Dopo inserimento" e dopo il
comando con cui cancelli un record (in questi casi dopo ti occorre anche
fare un Me.Requery). Oppure adopera Maschera1 solo per vedere i record e fai
una maschera per inserire e/o cancellare i record.
Che ne pensi?
Roberto

 ha scritto nel messaggio
news:398D701C...@usa.net...
[CUT]
Mi sono dimenticato di rispondere alla domanda che hai messo nell'oggetto.
CurrentRecord ti restiruisce il numero del record corrente; a prescindere da
quanti record vedi nella maschera, il record corrent è sempre e solo uno e
di quello Access ti restituisce i numero.
Roberto


Perché il record corrente come dice la parola stessa è uno e uno soltanto..
in un recordset solo uno può essere il "record" "corrente" (notare che
entrambe le parole, sostantivo e aggettivo, sono al singolare) e quindi il
valore che assume la proprietà CurrentRecord è sempre lo stesos anche se lo
appiccichi a schede diverse in una maschera continua
solo i valori nei campi del recordset associato possono essere diversi da
scheda a scheda
è consigliabile creare un campo ID (magari contatore) di cui riportare il
valore sulla maschera che sarà diverso da scheda a scheda. Se poi l'ID perde
la sua continuità progressiva-numerica a causa del fatto che elimini qualche
record allora ti conviene creare un secondo campo ID2 (as integer/long) e in
apertura di maschera riscrivere questo valore in modo che sia progressivo da
1 fino all'ultimo record, sempre se vuoi che su ogni scheda vi sia un numero
progressivo.
Non so se vi siano altri modi.
AleC
--
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ...sii attento mentre parli, con le tue parole
  tu crei il mondo intorno a te
                                    detto navajo
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

       Ringrazio sia Roberto che AleC per la delucidazione e tempestività
       nella risposta inerente il Perché dell'oggetto.
Riguardo la soluzione proposta da Roberto è funzionante (c'era solo una
svista dentro all' Until rcdMio![c1]=RcdCont ).
Giustamente, come hai suggerito è un' ottima soluzione per una maschera
utilizzata per la sola visualizzazione dati di una tabella.
Adesso viene il bello!
E' possibile utilizzare lo stesso codice (e come), quando
nell'intestazione
del piè di pagina della masch. continua ho N pulsanti, che filtrano i
record
visualizzati in base a corrispondenti N macro, con filtro di tipo where
applicato
ad un campo c4.
Supposto che c4 ha i valori 01, 01, 03, 02, 02, 03, 01, 02, 03, 01
se premo P1 vedo i record con c4 = 01
se premo P2 vedo i record con c4 = 02
se premo P3 vedo i record con c4 = 03 etc…
Il codice quindi non è piu applicabile?
Ipotizzo che non lo sia perché invece di ciclare sui record aperti del dbs
dovrebbe ciclare sui nuovi record ottenuti dal filtraggio.
Ipotizzo anche che si potrebbe modificare il codice aprendo non la tabella
completa ma solo i rispettivi record che mi servono.
Quindi per ogni pulsante un codice diverso.
(Oppure un unico codice con delle variabili di apertura record tabella e
poi ciclare sui record aperti)
Non so se tali soluzioni sono possibili ma il problema è al momento
secondario:
perché l'ideale è applicare il codice dopo il filtraggio,  perché pur
essendo eventualmente possibile creare un codice che va a ciclare i record
filtrati non sono convinto che siauna soluzione 'purista' nel senso che
non è agevole ricreare dentro al codice (di numerazione record) tutti i
filtri che ho già usato per il filtraggio stesso.
Può andare  se ho un unico filtro.
Da qualche parte ho visto un codice del tipo (più o meno)
set rsd = RecordsetClone.OpenRecordset(….) però non ricordo
a cosa serviva. Comunque ipotizzo che l'ideale è aprire
i recordset già filtrati e poi applicare l' until do loop;
che è simile, ma diverso dall'aprirli con codice tramite un filtraggio.
(n.b. è solo un'ipotesi )
Inoltre Per Roberto (x curiosità se anche a te idem)
A) - il codice VBA  Me![c1]=currentrecord  sull'evento prima di aggiornare
        o dopo aggiornamento della  masch. continua
                    non scrive nulla
       -il codice VBA  Me![c1]=currentrecord  sull'evento corrente masch.
continua
                   -scrive sul primo record, poi se clicco dentro il c1
dei record successivi vi scrive;
                    nella tabella inoltre riporta solo i valori delle
caselle in cui ho cliccato
        -il codice VBA  Me![c1]=currentrecord sull'evento prima di
aggiornare
         o dopo aggiornamento della  txtbox c1
                    non scrive nulla
         -il codice VBA  Me![c1]=currentrecord sull'evento attivato
(c1_GotFocus)
           della  txtbox c1  ad ogni click scrive
Per AleC
(supposto che eseguo delle cancellazioni)
''… conviene creare un secondo campo ID2 e…..riscrivere questo valore in
modo che sia progressivo''
cosa intendi per " riscrivere questo valore" e "in modo che sia
progressivo" ?
Grazie
RobViv

 RobViv
In sostanza la stessa cosa proposta da Roberto:
Creare un campo numerico (che lui chiama Campo1) nel quale sull'apertura
della maschera scrivere con una procedura do...loop in ogni record un numero
progressivo da 1 all'ultimo record, valore che poi puoi visualizzare in ogni
singola maschera.
"Su apertura" di Maschera1 genera il seguente codice VBA:
Dim dbMio As Database
Dim rcdMio As Recordset
Dim RcdCont As Integer
Set dbMio = CurrentDb()
Set rcdMio = dbMio.OpenRecordset("Tabella1")
RcdCont = 1
Do Until rcdMio.EOF
    rcdMio.Edit
    rcdMio![Campo1] = Pippo
    rcdMio.Update
    rcdMio.MoveNext
    RcdCont = RcdCont + 1
Loop
L'unica cosa è che al posto di 'Pippo' debba esserci la variabile RcdCont ?
Forse Roberto stava leggendo l'ultimo numero di Topolino quando ha scritto
la risposta..
:)
Aggiungerei che se durante l'utilizzo della maschera sono previste
cancellazioni di record devi ripetere la procedura altrimenti ti rimangono
dei buchi nella numerazione e nel caso siano previste aggiunte di record di
scrivere nell'evtno BeforeUpdate nel controllo associato Campo1 il valore
successivo a quello dell'ultimo record (se non il mdb non lavora in rete,
altrimenti devi scrivere il valore però direttamente nel campo del recordset
nell'evento AfterUpdate).
Credo.
AleC


[ CUT]
Ebbene si, lo confesso, stavo leggendo Topolino. :-((((
Ti prego però, non dirlo a nessuno.  :-)))))
Roberto

                     non scrive nulla
[CUT]
Perchè il su citato codice VBA scriva qualcosa occorre che c1 sia un
controllo associato ad un campo di una maschera e agisce solo sui nuovi
record inseriti e/o su quelli aggiornati (visto che l'evento è quello "Prima
di aggiornare" della maschera). Certo non è efficace sui record registrati
nella tabella precedentemente, per sistemare i quali devi utilizzare la
routine che ti ho postato precedentemente (sempre Pippo a parte).
Roberto


Non riesco a seguire i tuoi ragionamenti: forse è bene che racconti cosa
devi fare; sul come, se sarò in grado, ti dirò la mia.
Ciao
Roberto

Ciao
  A proposito, io sono stato un assiduo lettore di Topolino, da un pezzo
  purtroppo non più, scommetto che nei fumetti attuali si parla di
internet,
  virus informatici ecc. e chissà se Topolino magari ha risolto alcuni
casi
  grazie a potenti Db da lui stesso programmati in Access etc. etc.
  Chissà, forse se gli capita di leggere il ng potrà postarci qualche
  suggerimento.
 (Secondo te Roberto, AleC avrà mai letto Topolino oppure in realtà è
proprio
   lui sotto false vesti. Infatti è stato sorprendente: al primo colpo
   ha scoperto  il motivo della tua distrazione (tipiche azioni da
Mouse!!!)
  Re(n.b.):
  La maschera con i filtri di cui ti parlavo è simile alla maschera
  Elenco Telefonico Clienti del file di esempio Northwind.
          >non mi sarei mai sognato di scomodare
          >CurrentRecord per impostare il filtro di una maschera (un certo
Di Pietro
          >direbbe "che ci azzecca?")
  L’uso di currentrecord non doveva agire sui filtri, ma semplicemente
  (inserito in una casella di testo del corpo della maschera) doveva
  restituire il record corrente visualizzato, indipendentemente dal fatto
  che i record visualizzati derivino da un filtro o meno.
  Comunque, come già chiarito in precedenza, non si può usare current
record.
          >Il codice quindi non è piu applicabile?
          >Scusami, ma come si può ipotizzare che una routine che aggiorna
una tabella
          >possa servire a fare una ricerca?
  Infatti hai ragione
          >Ipotizzo che non lo sia
  In realtà serve un codice che:
          > invece di ciclare sui record aperti del dbs
          > dovrebbe ciclare sui nuovi record ottenuti dal filtraggio.
          >Non riesco a seguire i tuoi ragionamenti: forse è bene che
racconti cosa
          >devi fare; sul come, se sarò in grado, ti dirò la mia.
  Tank you per la disponibilità.
  In sintesi devo:
  Prendi come riferimento la maschera dell’esempio sopra citata:
  nella sua struttura, dentro al corpo, ci devo ficcare una casella di
  testo che mi “azzecca” il numero del record che visualizzo.
  E’ in sintesi una numerazione progressiva dei record (filtrati o meno).
  Ho provato a fare una ricerca sulle faq e sito comune e ho riscontrato
  che nelle numerazioni dei campi si fa spesso riferimento una funzione
usata
  così:
  dMax = (“[c1]”,”Tabella1”) + 1
  Solo che non ho capito come usarla (e soprattutto se effettivamente può
  risolvere il problema).
  Ho provata ad inserirla dentro la proprietà valore predefinito della
  struttura tabella, ma mi avvisa che la funzione dmax non è riconosciuta.
  Non so se questa indicazione può esserti utile.
  By By

     e come già detto scrive per tutti i record lo stesso valore
Quando una controllo *non e' associato* e' ovvio che si
proponga sempre uguale in una form a m. continue.
Devi avere il progressivo gia' nell'origine dati della form,
quindi direi una query, e associare la casella di testo al
campo.
Ovviamente ora ti chiederai: "e come faccio ad avere un
progressivo nella query?"
Boh!
aspe', stavo a scherza', dai ;-)
select ... , prog(uncampotesto) from ... where
prog("start")=0;
dove prog e' una simpatica funza:
public function prog(s as string) as integer
static stprog as integer
if s="start" then stprog=0 else stprog=stprog+1
prog=stprog
end function
ganzo, eh?
--
Lorenzo Coronati
--
<<Io studio ing gestionale e dei non laureati 
che mi sputano in faccia mi faccio beffe.>>
(Andrea "Mr Bad Guy", 10/07/2000)
--

 ad un campo c4.
[CUT]
Mi sembra che, alla fine della fiera, tu hai una tabella (per comodità
chiamiamola Tabella1) che contiene fra gli altri un campo chiamato C4.
Se non sbaglio, il tuo problema è quello di visualizzare in una maschera
(Maschera1) tutti i record di Tabella1 che abbiano un determinato valore in
C4.
Se così è, creati una maschera (Maschera1) con visualizzazione a Maschere
continue che abbia come "Origine record" Tabella1 e che abbia anche una
casella di testo associata al campo C4 e chiamala C4.
Creati una seconda maschera (Maschera2) che contenga solo una casella di
testo non associata che chiami Chiave.
Avendo cura che nella Casella degli strumenti sia abilitato il pulsante
"Autocomposizione Controllo", inserisci in Maschera2 anche un pulsante di
comando; alle domande che Access ti porrà, rispondi così:
Prima schermata) Nella casella di riepilogo intestata "Categorie:" seleziona
con il mouse "Operazioni su maschere" e nella casella di riepilogo intestata
"Azioni" seleziona "Apri maschera" e premi il pulsante "Avanti"
Seconda schermata) Nella casella di riepilogo che ti compare seleziona con
il mouse "Maschera1" e premi il pulsante "Avanti"
Terza schermata) Seleziona il bottone vicino la scritta "Apri la maschera e
trova dati specifici da visualizzate e premi il pulsante "Avanti"
Quarta schermata) Nella casella di riepilogo intestata "Maschera2:"
seleziona con il mouse "Chiave" e da quella intestata "Maschera1" seleziona
"C4" e premi il pulsante "Avanti"
Quinta schermata) Premi il pulsante "Avanti"
Sesta schermata) Premi il pulsante "Fine"
Chiudi e salva la struttura di Maschera 2.
Ora apri Maschera2, digita nella casella di testo il valore di C4 da
ricercare, premi il pulsante di comando: ti si aprirà Maschera1 che ti
visualizzerà tutti i record di Tabella1 che hanno in C4 il valore che tu hai
digitato nella casella di testo.
Roberto

Per Lorenzo Coronato
La tua funzione, funziona in parte.
(N.b. per farla partire, ho dovuto inserire nel valore
predefinito del campotesto, nella modalità struttura della
tabella, il valore zero, altrimenti mi dava errore.)
Il problema è che:
La funzione,  va sì a numerare progressivamente i record, ma
se i record sono parecchi e quindi per visualizzarli devo usare
la barra di scorrimento, indovina cosa succede!!!!!
I record che erano stati già numerati, al momento della  rivisualizzazione,
vengono di nuovo rinumerati a ripartire dal numero dell'ultimo  record
che stavo visualizzando poco prima.
Praticamente, ogni volta che li rivisualizzo con la barra di scorrimento,
il progressivo continua a riassegnare il valore anche ai quelli già
calcolati.
Adesso capisco perchè si chiama maschera continua; forse perchè
continua a fare sempre tutto quello che vuole, tra cui a rompere l'anima ai
programmatori.
Ciao RobViv

Per Roberto
Ciao
Sei stato chiarissimo nell'esporre step by step la procedura per creare
un filtro in base ai valori contenuti in un campo; soluzione semplice
ed efficace.
Il problema che postavo, non era quello della visualizzazione
dei record in base al valore di c4,
ma quello di numerare progressivamente tali record
(indipendentemente dal metodologia filtrante usato)
Comunque è interessante l'esempio di filtraggio che hai riportato
(nonostante fosse realizzabile in autocomposizione, non ci avevo fatto mai
caso).
Solo che, per comodità di interfaccia utente, devo impiegare un metodo simile
a quello dell'esempio in Northwind.
By By

calcolati.
Ovvio: la query viene rieseguita quando rivisualizzi i
record precedenti.
Basta creare una tab temporanea e basare la form su quella:
aggiungi 'into tabella' prima di 'from' nella query.
Bai



Ma non era INcoronato?
[cut]
:-)
Sib

Thank you sign. Lorenzo Coronati
Non conosco le tab temporane, ma provo a dare
uno sguardo all'help (augurandomi che vi sia qualcosa).
Gradite comunque ulteriori esplicitazioni in merito.
By By

Ma non era INcoronato?
Diamo tempo al tempo...


Gradite comunque ulteriori esplicitazioni in merito.
Temporanea nel senso che quando non ti serve piu' puoi pure
eliminarla...
Con into trasformi la query di selezione in una q. di
creazione tabella (vedi help)
Una volta creata la tabella puoi basare la form su quella.
Se i record non sono troppi, puoi pure evitare di eliminare
la tabella, tanto ogni volta che lanci la q. verra'
rimpiazzata.
Bai


Thank you
Devo ancora vedere l'help, cosa che farò
nei prossimi giorni, comunque credo di aver
capito il principio in linea di massima.
By By

A proposito di incoronato:
Indovinate un pò questa:
Nel NG c'è già un re ma non
è Lorenzo (per il momento);
chi mai è?

 ha scritto nel messaggio
news:39A45071...@usa.net...

Se pensavi a me ti sei sbagliato... io sono l'Imperatore!
Scusa, l'ho sparata troppo grossa...
Silvio

Risposta errata!!!!
Riprovare, prego.