Problemi a inserire un campo numerico in colonna listview

di il
6 risposte

Problemi a inserire un campo numerico in colonna listview

Sto popolando una listView con dati provenienti da recordset access.
Il campi id che devo caricare deve essere caricato come numeri per poter essere sortaato in maniera corretta.
Utilizzo questo codice, ma il campo in viene comunque trattato come stringa e in ordinamento non vengono sortati correttamente.
dove sto sbagliando ?

  With rs1
       Do While Not .EOF
       Nrec = Nrec + 1
          Set itm = Me.ListView1.ListItems.Add(, , CInt(.Fields("id").Value)) <-- qui dovrei rendere numerico il campo "id"
       
           Stato = .Fields("stato").Value
           Select Case Stato
               Case 3
                   colore = vbMagenta
                   icona = "I3"
               Case 4
                   colore = vbGreen
                   icona = "I1"
               Case 5
                   colore = vbRed
                   icona = "I2"
               Case Else
                   colore = vbBlack
                   icona = "I4"
           End Select
       
           itm.SubItems(1) = .Fields("utente").Value
           itm.SubItems(2) = .Fields("intervento").Value
           '=============== stratagemma per ordinare per DATA =============
           itm.SubItems(3) = Format(.Fields("dataInizio").Value, "yyymmdd")
           '===============================================================
           itm.SubItems(4) = .Fields("dataInizio").Value
           itm.SubItems(5) = .Fields("stato").Value
           itm.SubItems(6) = .Fields("DescStato").Value
           itm.ListSubItems(6).ForeColor = colore
    '       itm.ListSubItems(6).ReportIcon = icona
            rs1.MoveNext
       Loop
       Me.lblNPratiche = Nrec
       Set rs1 = Nothing
   End With

Grazie

Moreno

6 Risposte

  • Re: Problemi a inserire un campo numerico in colonna listview

    La ListView riceve un valore testuale. Prova a gestire questo problema così:

    Set itm = Me.ListView1.ListItems.Add(Text:=Format(.Fields("id").Value, "0000"))

    Quindi nel campo ID ti ritroverai "0001"; "0002";......"0010";..."0100"; ecc...

    In questo caso dovrebbe funzionare l'ordinamento.

    P.S. Ho notato che utilizzi la variabile NRec che funge da contatore per mostrare il numero di elementi estratti. Secondo me puoi evitare di utilizzarla e di incrementare di volta in volta quel contatore e scrivere direttamente:

    Me.lblNPratiche = ListView1.ListItems.Count

    P.P.S. Hai risolto la questione delle icone? Io alla fine ho riprodotto il file Access e messo in relazione le 2 tabelle per poi ricavare la Query che alla fine ti riporta i vari dati in Excel. La visualizzazione delle icone mi funziona correttamente. Secondo me dovresti dare riscontro a quello che ti viene suggerito. Sia per gli utenti che possono lamentare gli stessi problemi e sia per chi impegna il proprio tempo a fornirli.

  • Re: Problemi a inserire un campo numerico in colonna listview

    Ciao Alexps81

    Grazie per il prezioso consiglio.
    Ora il sort sul campo id funziona a meraviglia.
    Mi scuso per non averti dato nessun responso alle tue mail, ma sono in questi giorni un pò, forse un pò tanto, influenzato; eraano 10 anni e oltre che non beccavo un'influenza e quest'anno mi ha beccato.
    Relativamente al problema dell'icona continua a dare 

    E' la prima volta che mi da problemi a caricvare un'immagine dal pc.
    Il messaggio è comunque questo:  "errore di runtime '7'  -- Memoria esaurita"

    
      With ImageList1
           .ImageWidth = 16
           .ImageHeight = 16
           .ListImages.Clear
    
           'INDICARE IL PERCORSO DELLE ICONE, ASSOCIANDO AD OGNI ICONA UNA KEY _
           PER ESEMPIO LA KEY "I1" RAPPRESENTA LA "MAIL SPEDITA" _
           LA KEY "I2" RAPPRESENTA LA "SPUNTA VERDE" _
           ECC...CONTINUARE PER QUANTE ICONE SI DESIDERA ASSOCIARE PER OGNI CASO
           .ListImages.Add , "I1", LoadPicture(ActiveWorkbook.Path & "\file_ico\email.ico")  < --------  qui da errore
           .ListImages.Add , "I2", LoadPicture(ActiveWorkbook.Path & "\file_ico\completed_50.ico")
           .ListImages.Add , "I3", LoadPicture(ActiveWorkbook.Path & "\file_ico\spuntaverde.ico")
           .ListImages.Add , "I4", LoadPicture(ActiveWorkbook.Path & "\file_ico\annulla_25x25.ico")
       End With

    il percorso delle icone è corretto.
    Devo baipassare di caricare le iconw.
    Io ho una macchina a 64bit. Leggo che nelle macchine a 64Bit non è più possibile caricare icone.

    Volevo fare un'altra modificica alla listview e ci sto ragionando da ore.
    Per una maggior leggibilità a video, volevo visualizzare un colore di background alternato nelle varie righe, ma vedo che nelle proprietà del singolo compo della riga "ListSubItems(6)." è attivo solo il .foreColor e non il .backColor   e quindi non so come risolvere il problema della colorazione di sfondo delle righe con colori alternati. Sto cercaando in internet da ore, ma non trovo risposte.

    Comunque il controllo ListView funziona davvero bene e di questo ti devo essere estremamente grato.

    Scusami se mi dilungo, ma volevo chiederti un consiglio ssu un artificio che vedo hai fatto ad arte per gestire il ssort sul campo data.

      With Me.ListView1
           .AllowColumnReorder = True
           .FullRowSelect = True
           .Gridlines = True
           .ListItems.Clear
           .ColumnHeaders.Clear
           .View = lvwReport
         '  Set .SmallIcons = ImageList1
           .LabelEdit = lvwManual
           .ColumnHeaders.Add Text:="ID", Width:=30
           .ColumnHeaders.Add Text:="Utente", Width:=150
           .ColumnHeaders.Add Text:="Intervento", Width:=250
           .ColumnHeaders.Add Text:="DataSort", Width:=0 '<--ordinare per data
           .ColumnHeaders.Add Text:="Data Inizio", Width:=50
           .ColumnHeaders.Add Text:="Stato", Width:=0
           .ColumnHeaders.Add Text:="S t a t o", Width:=150
       End With
    
    
    
    
    
    
    
    itm.SubItems(1) = .Fields("utente").Value
               itm.SubItems(2) = .Fields("intervento").Value
               '=============== stratagemma per ordinare per DATA =============
               itm.SubItems(3) = Format(.Fields("dataInizio").Value, "yyymmdd")
               '===============================================================
               itm.SubItems(4) = .Fields("dataInizio").Value
               itm.SubItems(5) = .Fields("stato").Value
               itm.SubItems(6) = .Fields("DescStato").Value
               itm.ListSubItems(6).ForeColor = colore
               itm.ListSubItems(6).Bold = True
               itm.ListSubItems(6).TooltipText = "Stato Pratica"

    usi un campo "Civetta" in cui la fataa è nel formaato "yyymmdd" 
    Intanto perchè "yyymmdd" e non "yyyymmdd" ?

    Seconda cosa. a video il campo "civetta" non lo visualizzo. E' possibile se seleziono il campo "data inizio" forzarlo che ordini sul campo "DataSort" ?la decisione di non editare il campo "DataSort" è dovuta al fatto di non creare disagio all'operatore, dato che conoco i miei polli.
    Se si potesse ordinare sul campo DataSort sarebbe tutto a posto.


    Grazie
    Moreno

  • Re: Problemi a inserire un campo numerico in colonna listview

    14/01/2026 - morenog ha scritto:

    Il messaggio è comunque questo:  "errore di runtime '7'  -- Memoria esaurita"

    Ma tu sei sicuro che le immagini che hai siano effettivamente .ico? Prova a cercare icone dal formato piccolo, ad esempio 16x16

    Le mie icone funzionano tutte bene.

    14/01/2026 - morenog ha scritto:

    Intanto perchè "yyymmdd" e non "yyyymmdd" ?

    hai ragione, manca una "y"

    14/01/2026 - morenog ha scritto:

    Seconda cosa. a video il campo "civetta" non lo visualizzo.

    Si certo, deve rimanere nascosta. Quella colonna serve solo per ordinare la ListView per Data. Siccome i valori sono in formato testo, l'unico modo possibile per ordinare una colonna che mostra date, è quella di leggere queste date in AnnoMeseGiorno.

    Ipotizziamo di avere la date: 01/12/2024, 02/01/2023 e 15/03/2020 dovremmo avere un ordinamento pari a: 15/03/2020, 02/01/2023 e 01/12/2024 ma non sarà così perché il confronto avviene partendo da sinistra: cioè 01 viene prima di 02 e 15.

    Ecco perché leggendole al contrario 20241201, 20230102 e 20200315 abbiamo che viene prima 20200315 poi 20230102 ed infine 20241201

    14/01/2026 - morenog ha scritto:

    E' possibile se seleziono il campo "data inizio" forzarlo che ordini sul campo "DataSort" ?

    Qui non ho ben chiaro cosa chiedi:

    Se vuoi che alla fine la ListView venga mostrata ordinata per "Data Inizio" allora ti basta aggiungere prima di End Sub questo spezzone di codice:

    With Me.ListView1
        .sortKey = 3
        .SortOrder = lvwAscending
        .Sorted = True
    End With

    Se invece vuoi rendere ordinabile le colonne quando ci clicchi sopra allora deve aggiungere questo codice:

    Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
      Dim sortKey As Long
      If ColumnHeader.Index = 4 Then
          sortKey = 3
      Else
          sortKey = ColumnHeader.Index - 1
      End If
      If SortColumn = sortKey Then
          sortDescending = Not sortDescending
      Else
          SortColumn = sortKey
          sortDescending = False
      End If
      With Me.ListView1
          .sortKey = SortColumn
          .SortOrder = IIf(sortDescending, lvwDescending, lvwAscending)
          .Sorted = True
      End With
    End Sub

    e infine queste 3 variabili subito sotto Option Explicit:

    Private SortColumn As Integer
    Private SortOrder As Boolean
    Private sortDescending As Boolean
    
  • Re: Problemi a inserire un campo numerico in colonna listview

    Ciao Alexps81

    Grazie per le tue riflessioni sempre illuminanti.
    Ho dato seguito alle tue ultime osservazioni e ti aggiorno sullo statao dell'arte.
    1) con le modifiche della dimensione dell'icona .ico, riesco a visualizzare l'elenco con le icone anche se  a volte l'elenco viene visualizzato con le icone e a volte no.

    2) il sort sulle date non va. Sembra che l'ordinamento lo faccia sul giorno e non su yyyymmdd.

    Ho messo per test visibile il campo Data Sort per veirifiche. In produzione lo metto a lunghezza 0.

    Grazie

    Moreno

  • Re: Problemi a inserire un campo numerico in colonna listview

    15/01/2026 - morenog ha scritto:

    con le modifiche della dimensione dell'icona .ico, riesco a visualizzare l'elenco con le icone

    Ottimo, complimenti !!!

    15/01/2026 - morenog ha scritto:

    anche se  a volte l'elenco viene visualizzato con le icone e a volte no

    Molto strano. Io ho replicato le 2 tabelle in Access e messo in relazione i Campi Stato-ID e fatto un test su 500 record e non ho avuto alcun problema.

    15/01/2026 - morenog ha scritto:

    il sort sulle date non va.

    Ok penso che il problema sia in questa macro:

    Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
       Dim c As Long
       
       If ColumnHeader.Index = 4 Then
           c = 3
       Else
           c = ColumnHeader.Index
       End If
       
       If SortColumn = c - 1 Then
           SortOrder = Not SortOrder
       Else
           SortColumn = c - 1
           SortOrder = False
       End If
       With ListView1
           .sortKey = SortColumn
           .SortOrder = IIf(SortOrder, lvwDescending, lvwAscending)
           .Sorted = True
       End With
    End Sub

    Modifica le prime 2 righe così:

     If ColumnHeader.Index = 5 Then
           c = 4
  • Re: Problemi a inserire un campo numerico in colonna listview

    Ciao Alexps81

    Scusa il ritardo, ma ho un fastidioso pseudo raffreddore che mi tormenta. Pian piano ne sto uscendo, ma mi complica un po.
    Grazie per la puntuale e precisa assistenza.
    Rispondo alla tua ultima email

    15/01/2026 - morenog ha scritto:

    anche se  a volte l'elenco viene visualizzato con le icone e a volte no

    Molto strano. Io ho replicato le 2 tabelle in Access e messo in relazione i Campi Stato-ID e fatto un test su 500 record e non ho avuto alcun problema.

    al riguardo di questo punto, inavvertitamente facevo eseguire un funzione due volte.
    Sistemato e funziona benissimo. Grazieeeeeee

    Problema del errato sort sulle date

    Modifica le prime 2 righe così:

     If ColumnHeader.Index = 5 Then
           c = 4

    Operando la correzzione che hai posto il problema è scomparso.
    Il sort su TUTTE le colonne funziona allaa meraviglia.  Grazieeeeeeee

Devi accedere o registrarti per scrivere nel forum
6 risposte