Confronto con riga precedente/successiva e cambio colore background Se..

di il
8 risposte

Confronto con riga precedente/successiva e cambio colore background Se..

Salve,,
vi sottopongo il mio problema in pratica in una FORM dove viene eseguita una querry vorrei cambiare il colore di sfondo di una cella confrontandola con una precedente/successiva...
in pratica sono riuscito a fare il ciclo sui record visibili del dataset ma quando vado a cambiar eil colore di sfondo di un textEdit ovviamente me li cambia di tutta la colonna perche` hanno lo stesso nome, come faccio ad accedere al text edit specifico?


    tmpAlle = 0
    DoCmd.GoToRecord , , acFirst
    While Me.CurrentRecord < Me.Recordset.RecordCount
        Dalle.BackColor = vbWhite  'reset color
        If tmpAlle > 0 Then  'Controllo se sono sulla prima riga se si la salto , avrei potuto usare anche Me.Recordset.BOF   Me.Recordset.AbsolutePosition
           If Abs(DateDiff("s", tmpAlle, Dalle.Value)) > 60 Then
               Dalle(3).BackColor = vbRed
           End If
        End If
        tmpAlle = Alle.Value 'mi salvo il valore da confrontare con la riga successiva
        DoCmd.GoToRecord Record:=acNext
    Wend

8 Risposte

  • Re: Confronto con riga precedente/successiva e cambio colore background Se..

    Quello che hai fatto è fortemente errato... devi confrontare dei dati ma sposti continuamente il riferimento del visualizzato e questo è assurdo... perché di fatto aggiorni continuamente l'interfaccia grafica scatenando un sacco di eventi estremamente inutili, non ultimo l'aggiornamento grafico.

    Eventualmente avresti dovuto sfruttare un oggetto specifico che non genera nell'interfaccia continui aggiornamenti e questo è il RECORDSETCLONE.
    Ti basta spostarti con MovePrevious e Movenext e poi torni a sincronizzarsi con il Bookmark di maschera...

    Tuttavia questo metodo è da integrare con l'unico metodo di gestione grafico nelle maschere continue... ovvero la formattazione condizionale.
  • Re: Confronto con riga precedente/successiva e cambio colore background Se..

    @Alex ha scritto:


    Quello che hai fatto è fortemente errato... devi confrontare dei dati ma sposti continuamente il riferimento del visualizzato e questo è assurdo... perché di fatto aggiorni continuamente l'interfaccia grafica scatenando un sacco di eventi estremamente inutili, non ultimo l'aggiornamento grafico.

    Eventualmente avresti dovuto sfruttare un oggetto specifico che non genera nell'interfaccia continui aggiornamenti e questo è il RECORDSETCLONE.
    Ti basta spostarti con MovePrevious e Movenext e poi torni a sincronizzarsi con il Bookmark di maschera...

    Tuttavia questo metodo è da integrare con l'unico metodo di gestione grafico nelle maschere continue... ovvero la formattazione condizionale.
    scusa non sono cosi esperto ed hai ragione sugli eventi ma non conoscevo un altro metodo
    cmq sia non ho capito molto ,,, anche se facessi con recorsetclone (che adesso andro` a studiare) per ciclare la form poi come faccio a cambiare il valore di ogni singola cella,,, la formattazione condizionale non mi puo aiutare in questo caso :/
  • Re: Confronto con riga precedente/successiva e cambio colore background Se..

    Ed ecco qua il codice riscritto il il Recorset clone ma rimane il problema principale ovvero cambiare il colore della cella
    
        Dim rst As Recordset
        Set rst = Me.RecordsetClone
        rst.MoveFirst
        tmpAlle = 0
        Do While Not rst.EOF
            If tmpAlle > 0 Then
               If Abs(DateDiff("s", tmpAlle, rst!Dalle)) > 60 Then
                   '?????????????????? CAMBIARE COLORE DI SFONDO DI QUESTA CELLA
               End If
            End If
            tmpAlle = rst!Alle
            rst.MoveNext
        Loop
    
  • Re: Confronto con riga precedente/successiva e cambio colore background Se..

    Intanto se non hai un Po di dimestichezza credo sarà complicato... e quello che hai scritto evidenzia che non hai capito nulla del suggerimento...
    Poi, come ti ho già detto, non devi ciclare nulla... ma solo guardare il record precedente e quello successivo... e poi ti ho già detto che devi usare la formattazione condizionale... non l'ho sparato a caso il suggerimento...

    Devi creare una funzione public che restituisca un valore condizionante per la formattazione.

    A questa funzione passi la PK del record tramite il controllo associato... con quello sposti il Bookmark,usando findfirst, del recordsetclone avanti ed indietro e poi valorizzi la funzione in base alla tua esigenza e la formattazione in automatico fa il resto.
  • Re: Confronto con riga precedente/successiva e cambio colore background Se..

    @Alex ha scritto:


    Intanto se non hai un Po di dimestichezza credo sarà complicato... e quello che hai scritto evidenzia che non hai capito nulla del suggerimento...
    Poi, come ti ho già detto, non devi ciclare nulla... ma solo guardare il record precedente e quello successivo... e poi ti ho già detto che devi usare la formattazione condizionale... non l'ho sparato a caso il suggerimento...

    Devi creare una funzione public che restituisca un valore condizionante per la formattazione.

    A questa funzione passi la PK del record tramite il controllo associato... con quello sposti il Bookmark,usando findfirst, del recordsetclone avanti ed indietro e poi valorizzi la funzione in base alla tua esigenza e la formattazione in automatico fa il resto.

    e lo so che scoccio ma ho capito che volevi dire allora ho fatto questa funziona in modulo chiamato common
    
    Public Function AlleDalleDifference(rst As Recordset, Pk As Integer) As Integer
    
        ' Dim rst As Recordset
        Dim deltaT As Integer
        ' Set rst = Me.RecordsetClone
        rst.FindFirst "[ID_Ril] = " & Pk
        If Not rst.NoMatch Then
            tmpAlle = rst!Alle
            rst.MoveNext
            If Not rst.BOF Then
                deltaT = Abs(DateDiff("s", tmpAlle, rst!Dalle))
            End If
        End If
        
        DalleAlleMatch = deltaT
    End Function
    

    e nella condizione richiamo questo ma
    AlleDalleDifference(Me.RecordsetClone,[ID_Ril])>60

    ma non riesco a passare il dataset,, e se la function la metto nello stesso modulo della form me la ignora
  • Re: Confronto con riga precedente/successiva e cambio colore background Se..

    Ma.non devi passarlo... passa solo il valore PK come ti ho detto... ed il recordset lo ricavi così:
    
    Dim rs as Dao.recordset
    Set rs=CodeContextObject.RecordsetClone
    Dovrebbe fare quello che serve...
  • Re: Confronto con riga precedente/successiva e cambio colore background Se..

    @Alex ha scritto:


    Ma.non devi passarlo... passa solo il valore PK come ti ho detto... ed il recordset lo ricavi così:
    
    Dim rs as Dao.recordset
    Set rs=CodeContextObject.RecordsetClone
    Dovrebbe fare quello che serve...

    funziona e con qualche altra modifica e` andato tutto come hai detto tu ,.. non sapevo che la formattazione condizionale potesse usare una public function ,, grazie mille

    se dovesse servire ad altri questo e` quanto

    in un modulo di access creare una funzione public nel quale passate un paramento per ricercare il record , per accedere al dataset visualizzato utilizzare le seguenti righe di codice
    
        Dim rst As Dao.Recordset
        Set rst = CodeContextObject.RecordsetClone
    e poi con un findFIrst cercare il record

    alla funzione far restituire un valore che poi ci servira` nella formattazione condizionale come parametro..


    questo e` il codice della mia function
    Public Function AlleDalleDifference(Pk As Long) As Integer
            
        Dim deltaT As Integer
        Dim rst As Dao.Recordset
        Set rst = CodeContextObject.RecordsetClone
        deltaT = 0
        strCriteria = "ID_Ril = " & Pk
        rst.FindFirst strCriteria
        If Not rst.NoMatch Then
            tmpDalle = rst!Dalle
            rst.MovePrevious
            If (rst.BOF = False) Then
                deltaT = DateDiff("s", rst!Alle, tmpDalle)
                'deltaT = Abs(deltaT)
            End If
        End If
        
        AlleDalleDifference = deltaT
    End Function

    Grazie Ancora
  • Re: Confronto con riga precedente/successiva e cambio colore background Se..

    Ottimo grazie per l'eccellente riepilogo a favore di tutti.
Devi accedere o registrarti per scrivere nel forum
8 risposte