Newsgroup: it.comp.appl.access
Titolo: Aumentare o Diminuire valore tramite VBA

Ciao a tutti. Sto creando un Database per la gestione dei vini
presenti in una cantina. Tali vini vanno ordinati nel db in base
ovviamente all'annata ma anche all'importanza che gli vuole dare il
padrone della cantina. Ad esempio: il vino X è più importante del vino
y quindi nell'elenco dei vino di quel produttore in quell'annata deve
comparire prima il vino x e poi il vino y indipendentemente
dall'ordine di inserimento. Per risolvere questo problema, avevo
pensato ad una colonna "Importanza" nella tabella dei vini con valure
numerico crescente. Il primo vino dell'anno lo metto con importanza 1
(in automatico, senza che lo faccia l'utente finale), il secondo con
importanza 2 e così via. In un secondo momento vorrei dare la
possibilità di aprire una maschera con una casella di riepilogo che
riporti i vini di un anno in particolare (visualizzato in una
combobox) e, tramite l'utilizzo di 2 pulsanti (uno freccia su e uno
freccia giù) spostare su o giù il vino selezionato. Quindi
bisognerebbe aumentare o diminuire il numero "Importanza". E'
possibile? C'è un altro metodo?
Grazie
Ciao
Stefano


La soluzione importanza è l amigliore (e forse unica)
nel secondo problema devi fare un update del campo importanza
molto semplicemente
-- 
-- 
MAssimiliano Amendola
www.accessgroup.it
Cisa - Conferenza Italiana Sviluppatori Access

 wrote:

...e come?


Se sei nella maschera e punti alla sottomaschera
Update Tuatabella set tuocampo = tuocampo +1 WHERE tuoid = me.tuasubform.fom!id
-- 
-- 
MAssimiliano Amendola
www.accessgroup.it



Sì, ma come faccio a cambiare numero anche agli altri vini dello
stesso anno? Ad esempio se ho il vino x con importanza 1, il vino y
con importanza 2 e il vino z con importanza 3 e voglio mettere il vino
z a importanza 1, come faccio a dirgli quando cambio il valore del
vino z di cambiare anche gli altri?

 ha scritto nel messaggio 
news:06d01cd3-61c8-4eef...@s1g2000prg.googlegroups.com...


supponendo che nella tua listbox il campo index sia la tua importanza 
(nell'esempio il mio index sta alla posizione 8 dell'origine dei dati della 
listbox)
For Each fieldItem In listField.ListItems
    If fieldItem.Selected And fieldItem.INDEX > 1 Then
        fieldItem.SubItems(8) = Format(fieldItem.SubItems(8) - 1, "00")
        listField.ListItems(fieldItem.INDEX - 1).SubItems(8) = 
Format(listField.ListItems(fieldItem.INDEX - 1).SubItems(8) + 1, "00")
    End If
Next fieldItem
listField.Sorted = True
listField.SetFocus
in questo modo al click del tasto Su quando sono posizionato su lambrusco 
cambio gli indici dell'elenco
es.
1 barolo
2 gutturnio
3 lambrusco
alla pressione di del tasto SU
gli indici diventano
1 barolo
2 lambrusco
3 gutturnio
poi devi confermare la modifica dei dati (con tasto OK) con i recordset 
(suppongo che la mia tabella sia RISORSE)
Set rstSetup = CurrentDb.OpenRecordset("SELECT Risorse_Setup.* FROM 
Risorse_Setup WHERE Risorse_Setup.ID_RISORSA=" & curCode & " ORDER BY 
Risorse_Setup.INDICE")
With rstSetup
    .MoveFirst
    While Not .EOF
        Set fieldItem = listField.ListItems("F" & .Fields("INDICE"))
        .Edit
        .Fields("INDICE") = fieldItem.SubItems(8)
        .UPDATE
        .MoveNext
    Wend
    .Close
End With
In questo modo sposti le tue righe in alto o in basso tenendo presente che 
il tuo ordinamento si rifà al campo INDICE
Ciao
-- 
Roberto da Parma 

 ha scritto nel messaggionews:06d01cd3-61c8-4eef...@s1g2000prg.googlegroups.com...

Ho aggiunto la prima parte di codice all'evento su clic di un pulsante
e l'ho adattato:
Private Sub Comando6_Click()
On Error GoTo Err_Comando6_Click
   For Each fieldItem In Listfield.ListItems
    If fieldItem.Selected And fieldItem.Index > 1 Then
        fieldItem.SubItems(3) = Format(fieldItem.SubItems(3) - 1,
"00") & _
        listField.ListItems(fieldItem.Index - 1).SubItems(3) = Format
(listField.ListItems(fieldItem.Index - 1).SubItems(3) + 1, "00")
    End If
Next fieldItem
listField.Sorted = True
listField.SetFocus
Exit_Comando6_Click:
    Exit Sub
Err_Comando6_Click:
    MsgBox Err.Description
    Resume Exit_Comando6_Click
End Sub
Ma mi dice "Necessario Oggetto". In effetti, cos'è "listfield"? La mia
casella di riepilogo si chiama "Elenco4". Non so come adattare il
codice.

[CUT]
Ma mi dice "Necessario Oggetto". In effetti, cos'è "listfield"? La mia
casella di riepilogo si chiama "Elenco4". Non so come adattare il
codice.
E' il nome della casella di riepilogo presente nella tua maschera, quindi 
sarà per te
Elenco4.ListItems ecc ecc



Ma se faccio così mi dice "Impossibile trovare il metodo o il membro
dei dati". E seleziona ListItems dopo elenco4. (o anche me.elnco4.).
In effetti prima intendevo proprio questo perchè di solito quando
metto il punto dopo un oggetto mi esce un elenco con le proprietà e i
metodi di quell'occetto e Listitems non c'era.

 ha scritto nel messaggio 
news:5cee5423-1f84-4a1a...@z6g2000pre.googlegroups.com...


Ma è una listbox Elenco4??


 ha scritto nel messaggionews:5cee5423-1f84-4a1a...@z6g2000pre.googlegroups.com...

E' una casella di riepilogo.

 ha scritto nel messaggio 
news:fc8f7abd-adae-4db2...@v18g2000pro.googlegroups.com...


Il codice funziona con il controllo activex ListView ma con le opportune 
modifiche potresti farlo funzionare anche con una casella di riepilogo.
Il pricipio è il medesimo.


 ha scritto nel messaggionews:fc8f7abd-adae-4db2...@v18g2000pro.googlegroups.com...

Sarebbe possibile farlo funzionare su una sottomaschera in
visualizzazione foglio dati? Se si può, potresti dirmi come?
Grazie
Ciao


Ho risolto nel seguente modo. Ho creato due procedure:
Public Sub AumentaImportanza(ctl As Control)
    Dim I As Integer
    Dim A As Integer
    Dim Indicativo As Integer
    For I = 0 To ctl.ListCount - 1
        If ctl.Selected(I) Then
        If I = 1 Then
        GoTo 10:
        End If
        A = ctl.ItemData(I - 1)
            DoCmd.SetWarnings False
            DoCmd.RunSQL "UPDATE tblVini " & _
                         "   SET Importanza = Importanza +1 " & _
                         " WHERE IDVino = " & ctl.ItemData(I - 1) & ""
            DoCmd.RunSQL "UPDATE tblVini " & _
                         "   SET Importanza = Importanza -1 " & _
                         " WHERE IDVino = " & ctl.ItemData(I) & ""
10:
            DoCmd.SetWarnings True
            ctl.Selected(I) = False
        End If
    Next I
    Me.Elenco4.Requery
End Sub
Public Sub DiminuisciImportanza(ctl As Control)
    Dim I As Integer
    Dim A As Integer
    Dim Indicativo As Integer
    For I = 0 To ctl.ListCount - 1
        If ctl.Selected(I) Then
        DoCmd.SetWarnings False
        If I = ctl.ListCount - 1 Then
        GoTo 20:
        End If
            DoCmd.RunSQL "UPDATE tblVini " & _
                         "   SET Importanza = Importanza -1 " & _
                         " WHERE IDVino = " & ctl.ItemData(I + 1) & ""
            DoCmd.RunSQL "UPDATE tblVini " & _
                         "   SET Importanza = Importanza +1 " & _
                         " WHERE IDVino = " & ctl.ItemData(I) & ""
20:
            DoCmd.SetWarnings True
            ctl.Selected(I) = False
        End If
    Next I
    Me.Elenco4.Requery
End Sub
E adesso funziona.
Grazie
Ciao

[CUT]
E adesso funziona.
Grazie
Ciao
Benissimo...hai fatto bene...il principio era lo stesso.
