Newsgroup: it.comp.appl.access
Titolo: Selezione Multipla

Ciao a tutti,questo è il mio problema:
Ho una casella di riepilogo con la proprietà multiselect impostata su
estesa e vi propongo il codice che ho scritto per cancellare i record
selezionati.
 Dim ctl As Control, rst As ADODB.Recordset, var As Variant
Set rst = New ADODB.Recordset
Set rst.ActiveConnection = CurrentProject.Connection
  rst.CursorType = adOpenKeyset
  rst.LockType = adLockOptimistic
  rst.Open "tab.sulla quale una query riporta i dati nella cas.riep.",
Options:=adCmdTableDirect
Set ctl = Me.nome casela di riepilogo
   For Each var In ctl.ItemsSelected
       If rst("Articolo") = ctl.ItemData(var) Then
         rst.Delete
         rst.Update
         Me.nome casela di riepilogo.Requery
       End If
    Next var
  rst.close
Set rst= Nothing
Se seleziono un record che non sia il primo in alto della lista non me
lo cancella,se ne seleziono più di uno non me li cancella ,solamente se
comincio dal primo in alto ed uno alla volta li cancella.Dov'è l'errore
di base
La riga del metodo "Open" non è rimandata a capo come si vede nel
post ma in maniera corretta.
Grazie a tutti
Ciao
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

di base
Il problema e' che quando fai un ciclo each var se poi ci ficchi un requery
gli itemselected non stanno piu' al posto che occupavano quando hai iniziato
il ciclo e il numero corrispondente al totale e' cambiato.
Prova cosi, e' piu sicuro:
strsql = "DELETE FROM tuatab WHERE articolo IN ("
For each ..ecc.
    strsql & strsql & ctl.ItemData(var)  & ","
Next
strsql = left (strsql,len(strsql) -1) & ")"
docmd.runsql strsql
L'ho butatta la', controlla la sintassi.
SAluti.
Luciano

 di base
Oltre a quanto molto correttamente ti dice Luciano sull'errato uso del
requery, in questa tua funzione non vedo in quale punto applichi il metodo
find a rst per cercare l'item da te selezionato nella casella di riepilogo.
Sib

 Sib
Avevo in mente di farlo,ma la mia grande ignoranza in materia mi ha
fatto abortire
una cosa simile!!


 strsql = left (strsql,len(strsql) -1) & ")"
Questa funzione dovrebbe restituire la lunghezza del record?
Altrimenti mi uccido
E la & finale per concatenare che cosa?
 > docmd.runsql strsql
Questa è l'unica isruzione che sono sicuro di aver capito
Ciao e scusami per gli sfondoni che hai dovuto leggere.


 Questa è l'unica isruzione che sono sicuro di aver capito
E' quella fondamentale!:-)
Saluti.
Luciano

Adesso mi elaborerò per qualche giorno la tua risposta <:-) e poi mi
rifarò
vivo.
Ti ringrazio
Ciao


 DELETE FROM tuatab WHERE articolo IN (2,4,56,234,6789)
Questa è la rout. completa
Private Sub cmdcanc_Click()
Dim ctl As Control, var As Variant, str As String
Set ctl = Me.PREVENTIVO
str = "DELETE FROM TabellaAppoggio WHERE Articolo IN ("
For Each var In ctl.ItemsSelected
str = str & ctl.ItemData(var) & ","
Next
str = Left(str, Len(str) - 1) & ")"
DoCmd.RunSQL str
End Sub
Sono riuscito a capire(o almeno credo) quelle due righe di codice ma
non riesco a trovare l'errore di sintassi all'interno della stringa SQL,
campa cavallo che l'erba cresce........
VB mi dice "errore di sintassi (operatore mancante) nell'espressione
della query
'Articolo IN (descrizionedell'articolo)
Ciao e Grazie per la tua pazienza.


 'Articolo IN (descrizionedell'articolo)
E tu fai un debug.print di strsql e guarda dove e' sbagliata!
Saluti.
Luciano

Ciao,
str = "DELETE FROM TabellaAppoggio WHERE Articolo IN ("
For Each var In ctl.ItemsSelected
str = str & ctl.ItemData(var) & ","
Next
str = Left(str, Len(str) - 1) & ")"
Questa è la stringa che il debug mi mostra:
DELETE FROM TabellaAppoggio WHERE Articolo IN (CASE ATX M/T CK-150-11A
250W COBRA)
Credo di essere vicino al suicidio, non sono riuscito a trovare l'errore
di sintassi <:-((
Ciao e grazie.


 Ciao e grazie.
Scusate l'intrusione, ma se c'è di mezzo un suicidio...
Penso che i presupposti tuoi e di Luciano siano un pochino diversi, ad
esempio lui effettua la selezione della query di eliminazione con i codici
articolo mentre tu stai cercando di farlo in base alle descrizioni degli
articoli.
Se la tabelella TabellaAppoggio ha una struttura simile a questa:
IDArticolo        Contatore e chiave primaria
Articolo            Testo
dove il campo Articolo contiene la descrizione dell'articolo.
Se la casella di riepilogo si chiama Elenco, è composta da una sola colonna
ed ha come origine riga il seguente codice SQL:
SELECT DISTINCTROW TabellaAppoggio.Articolo FROM TabellaAppoggio;
A fronte dell'evento "Su clic" del pulsante di comando, pigiando il quale
effettui la cancellazione dei record degli articoli selezionati, genera il
seguente codice VBA:
Dim strSQL As String
Dim varItem As Variant
strSQL = "DELETE Articolo FROM TabellaAppoggio " & _
"WHERE Articolo IN ("
If Me!Elenco.ItemsSelected.Count = 0 Then Exit Sub
For Each varItem In Me!Elenco.ItemsSelected
    strSQL = strSQL & "'" & _
    Me!Elenco.Column(0, varItem) & _
    "', "
Next varItem
strSQL = Left$(strSQL, Len(strSQL) - 2) & ");"
DoCmd.RunSQL strSQL
Dim Cont As Integer
For Cont = 0 To Me!Elenco.ListCount - 1
    Me!Elenco.Selected(Cont) = False
Next Cont
Me!Elenco.Requery
Per scrupolo, onde evitare ulteriori tue crisi depressive :-) , ho testato
il codice di cui sopra con A97 ed a me funziona.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

Bè, questa poi <:-)
Ora si che comincia il bello, prima di tutto ringrazio tutti, i miei
post
non sono mai riferiti ad una sola persona, e se lo fatto credere mi
dispiace.
Roberto posso prendermi ^_^ un mese di tempo per smontare il tuo codice?
Praticamente Luciano si riferiva ad un campo articolo con un ID numerico
mentre io mi riferisco ad un campo testo, quello che è sicuro è che la
colpa
è mia e non certo di Luciano.Prima di fare il prossimo post cercherò
di scrivere meno c....te.
Ciao ed un grazie infinito a tutti.   
