+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24

Discussione: Popolare singola riga di una flexgrid

  1. #1
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276

    Popolare singola riga di una flexgrid

    Ciao a tutti,

    con questo codice vorrei popolare una singola riga di una flexgrid con i record estrapolati da una query.
    il problema è che mi popola tutte le colonne della riga con il primo record estratto.

    codice:
    Dim z As Integer, gg As Integer
      
      With MSFlexGrid1
      
    .Redraw = False
    
       Select Case Month(Text1.Text) ' prima data del mese
              Case 2
                 If IsLeapYear(CInt(Mid(Text1.Text, 7, 4))) = True Then
                     gg = 29
                 Else
                     gg = 28
                 End If
               Case 4, 6, 9, 11
                     gg = 30
               Case Else
                     gg = 31
       End Select
              
        
         For z = 3 To .Cols - 1 ' le colonne dove inserire i turni
           
           
           Text2.Text = DateAdd("d", z - 3, Text1.Text)    'seconda data del mese che si incrementa ad ogni ciclo
          
     
             
             sSQL = "SELECT * FROM Turni WHERE Data BETWEEN #" & Format(Text1.Text, "mm/dd/yyyy") & "# AND #" &      Format(Text2.Text, "mm/dd/yyyy") & "#"
             sSQL = sSQL & " AND Budge=" & Val(.TextMatrix(2, 2))
            
             Set rs = cn.Execute(sSQL)
          
     While Not rs.EOF
             
                .TextMatrix(2, z) = rs!Turno & ""  
                      
             rs.MoveNext
          
          
     Wend
         Next z
               
     .Redraw = True
     End With
    rs.Close: Set rs = Nothing
    Ero convinto che al cambio della 2° data, quando la query non trova nessun turno non inseriva niente nella relativa colonna,invece popola tutta la riga con il primo dato estratto.
    Credo di sbagliare qualcosa in

    codice:
     .TextMatrix(2, z) = rs!Turno & ""
    ma non riesco proprio a risolvere.
    Mi serve un piccolo aiuto.
    Grazie

  2. #2
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Post
    2,852
    Non ho capito qual è lo scopo del codice che proponi. Comunque è chiaro che la riga
    codice:
    .TextMatrix(2, z) = rs!Turno & ""
    , essendo all'interno del ciclo For...Next della variabile z, viene ripetuta per tutti i valori di z e quindi per tutte le colonne della riga 2.
    Dubito poi che quella query sia corretta dal momento che ad ogni ciclo di z sembra voler estrarre una quantità di dati crescente, visto che l'intervallo tra le due date si allarga ogni volta. Ma, ripeto, non avendo capito cosa cerchi di fare non saprei dire di più.
    Prova a spiegare meglio il contesto e cosa vai cercando con quella query. Cerca anche di rendere più leggibile il codice indentandolo correttamente.
    Il regolamento del forum: la prima cosa da leggere.

  3. #3
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,319
    Blogs
    5
    Anche io non ho capito nulla
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  4. #4
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276
    Cerco di spiegare il problema.

    ho un recordset con i turni di servizio di 12 dipendenti, ho pensato di inserire i dati di ciascun dipendente nelle rows e le date del mese nelle cols

    popolando una flexgrid in questo modo

    da riga 2 a riga 12 colonna 0 inserisco i COGNOMI
    da riga 2 a riga 12 colonna 1 inserisco i NOMI
    da riga 2 a riga 12 colonna 2 inserisco il BUDGE

    riga 2 da colonna 3 a colonna tutte date del mese preso in considerazione.

    Estraendo i dati con una query riferita ad un nominativo, credevo possibile popolare le celle
    della flex con i turni , se presenti, del nominativo preso in considerazione.

    per estrarre i dati e inserirli nelle flex ho pensato questo codice

    codice:
    Dim z As Integer, gg As Integer
      
      With MSFlexGrid1
      
    .Redraw = False
    
    ' dal mese della data calcolo i giorni che lo compongono
    ' questo mi serve per stabilire il numero di colonne in base al numero di giorni del mese
     
       Select Case Month(Text1.Text)  
             Case 2
                 If IsLeapYear(CInt(Mid(Text1.Text, 7, 4))) = True Then
                     gg = 29
                 Else
                     gg = 28
                 End If
               Case 4, 6, 9, 11
                     gg = 30
               Case Else
                     gg = 31
       End Select
               
        
         For z = 3 To .Cols - 1 
           
           'seconda data del mese che si incrementa ad ogni ciclo
          ' permettendo di avere una query per ogni giorno del mese
          
           Text2.Text = DateAdd("d", z - 3, Text1.Text)    
          
     
             
             sSQL = "SELECT * FROM Turni WHERE Data BETWEEN #" & Format(Text1.Text, "mm/dd/yyyy") & "# AND #" &      Format(Text2.Text, "mm/dd/yyyy") & "#"
             sSQL = sSQL & " AND Budge=" & Val(.TextMatrix(2, 2))
            
             Set rs = cn.Execute(sSQL)
          
     While Not rs.EOF
          
    ' come risultato pensavo che avrebbe inserito nelle celle della query il turno del nominativo
    ' se presente, altrimenti non inseriva nulla......
       
                .TextMatrix(2, z) = rs!Turno & ""  
                      
             rs.MoveNext
          
          
     Wend
         Next z
               
     .Redraw = True
     End With
    rs.Close: Set rs = Nothing
    Invece mi ripete per tutte le celle il 1° turno estrapolato della query.
    Spero di essere riuscito a spiegarmi e sopratutto che possiate suggerimi una soluzione.
    Grazie

  5. #5
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,319
    Blogs
    5
    A parte il fatto che non so cosa sia un BUDGE non ho ancora capito molto.
    Facci qualche esempio di dati che stanno nel db e cosa voreesti mostrare nella griglia
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  6. #6
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Post
    2,852
    ... e posta solo il codice attinente al problema. Per esempio, la determinazione dei giorni del mese (variabile gg) non la usi più.
    Il regolamento del forum: la prima cosa da leggere.

  7. #7
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276
    Ho scritto budge invece di BADGE, anche nel database

    è, ovviamente, un campo univoco del nominativo.

    i dati del recordet sono

    Data
    Cognome
    Nome
    Badge
    Turno (M - P - N - SN - R ......
    Descrizione (Mattino - Pomeriggio - Notte.............

    il dato che vorrei inserire nelle celle è il turno che credo di estrapolare con la query impostata su Badge (riferito al nominativo) e per tutte le date del mese.

  8. #8
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Post
    2,852
    L'errore di fondo sta nel fatto che la query devi eseguirla una sola volta e non all'interno di un ciclo. Quindi il ciclo con z non serve a niente.
    Una volta ottenuto il recordset scorrine i record e, per ogni record, incrementa l'indice di riga e determina la colonna sulla base della data.
    Il regolamento del forum: la prima cosa da leggere.

  9. #9
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276
    Credo di aver capito il tuo suggerimento.
    Provo a sbatterci ancora e di riuscire a mettere in pratica il tutto.
    Appena risolvo ( spero) posto il tutto.
    Grazie

  10. #10
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276
    Dubito poi che quella query sia corretta dal momento che ad ogni ciclo di z sembra voler estrarre una quantità di dati crescente, visto che l'intervallo tra le due date si allarga ogni volta.
    Brontolo, dopo aver riletto con attenzione il tuo primo post, ho capito dove sbagliavo.
    In effetti come subito hai notato, le query con le date erano lontane da quello che avevo pensato di fare.
    Già al primo ciclo la query restituiva due record, al secondo ciclo 3 e così via.
    Ovviamente nella cella inseriva sempre il primo record del recordset.

    Così a mente fredda e grazie al tuo suggerimento HO RISOLTO.

    Le due date dovevano contenere sempre la stessa data, incrementate di 1 giorno ad ogni ciclo.
    In questo modo la query restituisce 1 record da inserire nella cella della flex.

    codice:
    Dim z As Integer
    
    With MSFlexGrid1
        
                  
              For z = 1 To .Cols - 3
              
              ' al primo ciclo sia text1 che text2 contengono la data 01/08/2019         
    
             sSQL = "SELECT Turno FROM Turni WHERE Data BETWEEN #" & Format(Text1.Text, "mm/dd/yyyy") & "# AND #" & Format(Text2.Text, "mm/dd/yyyy") & "#"
             sSQL = sSQL & " AND Badge=" & Val(.TextMatrix(2, 2))
             Set rs = cn.Execute(sSQL)
            
             ' i dati estratti dalla query vengono inseriti nella cella 
             ' ad ogni ciclo si sposta di una colonna
            
            If rs!Turno <> vbNullString Then
                 .TextMatrix(2, z + 2) = rs!Turno
            Else
                 .TextMatrix(2, z + 2) = vbNullString
            End If
                
             
              'ad ogni successivo ciclo vengono incrementate di 1 giorno sino a fine mese
    
              Text1.Text = DateAdd("d", z, txtDataInizio.Text)
              Text2.Text = DateAdd("d", z, txtDataInizio.Text)
              
        
     Next z
              
    End With
    
    rs.Close: Set rs = Nothing
    L'idea era giusta quando la mettevo in pratica mi fregava....
    Grazie per il tuo prezioso aiuto.

    Agosto_2019.jpg

+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi