Newsgroup: it.comp.appl.access
Titolo: Accedere ai record selezionati in una form in modalità "Maschere continue"

Immaginatevi una form in modalità "Maschere continue" con un pulsante
nell'intestazione della form che stampa il record attualmente
selezionato.
Immaginatevi di selezionare con il mouse più record consecutivi.
Vorrei che in questo caso il click sul pulsante di stampa stampasse
tutti i record selezionati.
Ho trovato sull'help le proprietà SelTop e SelHeight che sembrerebbero
fare al caso mio, ma incontro i seguenti problemi:
1) il click sul pulsante comporta che i record selezionati dall'utente
vengano deselezionati, per cui un eventuale ciclo a partire dal record
corrispondente a SelTop ripetuto SelHeight+1 volte non può funzionare,
perchè appena faccio click sul pulsante, SelHeight diventa 0.
Dovrei quindi salvare in qualche modo SelHeight tra il momento in cui
l'utente ha terminato la selezione ed il momento in cui fa click sul
pulsante. Non ho idea dell'evento a cui legare questo salvataggio. 
2) Una volta risolto il problema 1), non so come usare SelTop per
accedere al record corrispondente della tabella; infatti SelTop
contiene il numero della prima riga selezionata della form, senza
nessun riferimento (per quanto ne so) al recordset sottostante.
Grazie
Vincenzo Turturro
----------------------------------
Niuna impresa, per minima che sia, 
può avere cominciamento e fine
senza queste tre cose:
e cioè senza sapere,
senza potere,
senza con amore volere
(Anonimo fiorentino, XIV sec.)
------------------------------

Grazie
Ciao !
non credo che ci sia un modo per riuscire a fare quello che
vorresti nella modalita' maschere continue.
Ti posso consigliare invece l'utilizzo del componente casella di Riepilogo
che punta alla tabella che tu utilizzi, imposta "selezione multipla" a
"semplice",
poi puoi scorrerti l'insieme elected, ed agire di conseguenza
analizzando le chiavi selezionate, e magari costruendoci un filtro
ti mostro un esempio :
    Stringa=""
    For i = 1 To Elenco.ListCount - 1
            If Me.Elenco.Selected(i) = True Then
                Stringa = Stringa & Me.Elenco.Column(0, i) & ","
            End If
    Next i
una volta ottenuta la stringa filtro potresti abbinarla al richiamo del
report
ad esempio :
DoCmd.OpenReport "pippo", acViewPreview, , "[PAPERINO] IN (" & Stringa & ")"
bye :o)


Finalmnte!!!
Un altro che, come me, legge Topolino mentre scrive i messaggi.
Roberto


ci dovresti riuscire con la proprietà CurrentRecord della maschera, in
quanto anche se selezioni più record,quello corrente
dovrebbe essere sempre il primo della selezione.
Io in alcuni casi simili ho risolto aggiungendo un campo si/no alla
tabella  e lo utilizzo appunto per questo tipo di
selezioni.
saluti
Paolo

Roberto dal portatile ha scritto nel messaggio ...

Bhe'!! credo proprio che non esisti programmatore degno di
questo nome che non abbia usato almeno
una volta i famigerati personaggi Walt Disney
per popolare i suoi dati di prova.
bye :o)

nessun riferimento (per quanto ne so) al recordset sottostante.
questo dovresti poterlo fare con recordsetclone, che dovrebbe essere
un recordset con l'immagine della tabella in quel momento.
setti una variabile recordset sul recordsetclone della maschera e ti
sposti in avanti del numero di record necessario, cioč seltop-1:
dim rst as recordset
set rst=me.recordsetclone
rst.move seltop-1

 selezioni.
In aggiunta al campo si/no puoi mettere anche due pulsanti sulla maschera
"Seleziona tutto"
"Deseleziona tutto"
Ciao,  Davide

 Vincenzo Turturro
Mi sembra che il seguente percorso funzioni (lo ho testato con una form in
Modalità "Maschere continue", 4 campi ):
ho utilizzato l'oggetto Collection
Aggiungi in testa al codice della maschera:
Private colData As New Collection
Ho chiamato il campo indicizzato (Duplicati non ammessi) , ma puoi
utilizzare anche un campo contatore , Contratto
Devi aggiungere i valori del campo con valore univoco all'oggetto
Collection, un sistema è il seguente: all'evento Su doppio clic di un campo:
Private Sub Contratto_DblClick(Cancel As Integer)
colData.Add Me.Contratto.Value
End Sub
Aggiungi un pulsante per aprire il report:
Private Sub cmdReportCollection_Click()
Dim x As Integer
x = colData.Count
If x = 0 Then
    MsgBox "Nessun record selezionato"
    Exit Sub
End If
Dim str As String, coll
    For Each coll In colData
        str = str & "[Contratto] = " & Chr(34) & coll & Chr(34) & " OR "
     Next coll
    str = "(" & left$(str, Len(str) - 3) & ") "
DoCmd.OpenReport "rptContratto", acViewPreview, , str
'Per cancellare i valori presenti nell'oggetto Collection
For Each coll In colData
    colData.Remove (1)
Next
End Sub
Puoi aggiungere all'evento che desideri del codice che cancelli i valori
presenti nell'oggetto Collection :
Private Sub cmdRemoveCollection_Click()
Dim coll
For Each coll In colData
    colData.Remove (1)
Next
End Sub
Se il metodo incontra le tue simpatie e ritieni applicabile fammi sapere
anche se è necessario
Qualche ritocco.
giuseppe

Ho risolto, grazie ai vostri suggerimenti, nel seguente modo:
-ho definito a livello di maschera due variabili nTop e nHeight
-sull'evento mouse down ho impostato nTop = me.seltop
-sull'evento mouse up ho impostato nHeight = me.selheight
-nella routine di stampa ho definito un recordset rs =
me.recordsetclone e l'ho utilizzato per scorrerlo sulla base di nTop e
nHeight
Grazie a tutti
----------------------------------
Niuna impresa, per minima che sia,
può avere cominciamento e fine
senza queste tre cose:
e cioè senza sapere,
senza potere,
senza, con amore, volere.
---------------------------
Anonimo fiorentino sec. XIV