Copiare valore tra un intervallo di date in campi specifici

di Azucarea il
3 risposte

Ho creato un database con una tabella che elenca dei nominativi con le loro generalità, un'altra tabella ("Giorni") in cui sono riportati campi dall'1 al 31 (ovvero come i gironi massimi di un mese) un campo per inserire l'anno (KGY) ed un capo per inserire il mese (KGM).


Poi ho creato una maschera che ha come origine la prima e come sottomaschera la seconda (di tipo tabulare) con altri 3 campi non associati (Tipo assenza, Inizio, Fine).


Mi piacerebbe creare un pulsante che copiasse il valore del campo “Tipo assenza” nei campi della sottomaschera “Giorni” relativi all'intervallo tra le 2 date (campi Inizio e Fine), cioè per ogni riga (record) va ad inserire mese ed anno ed il valore del campo "Tipo assenza" nei relativi campi/giorni che fanno parte di quel dato mese nell'intervallo

3 Risposte

  • Intanto i dati si copiano tra tabelle e non tra maschere.

    In secondo luogo la tua impostazione è un po' tipo Excel e non va bene per un DBMS. La struttura delle tabelle non è adeguata e sarebbe necessaria una tabella in cui inserire le assenze con una sequenza di record e non di campi. Questo permetterebbe una semplice gestione dei dati con semplici query di inserimento e di interrogazione (ferma testando l'impostazione di opportune relazioni)

  • Private Sub Btn_add_Click()
    If Year([Inizio]) = Year([Fine]) And Month([Inizio]) = Month([Fine]) Then
        Me.[KGY] = Year([Inizio])
        Me.[KGM] = Month([Inizio])
    For i = Day([Inizio]) To Day([Fine])
        Me.Controls("" & i).Value = Me.[Assenza]
    Next i
    ElseIf Year([Inizio]) = Year([Fine]) And Month([Inizio]) <> Month([Fine]) Then
        Me.[KGY] = Year([Inizio])
        Me.[KGM] = Month([Inizio])
    For i1 = Day([Inizio]) To Day(DateSerial(Year([Inizio]), Month([Inizio]) + 1, 0))
        Me.Controls("" & i1).Value = Me.[Assenza]
    Next i1
    For m = Month([Inizio]) + 1 To Month([Fine])
        DoCmd.GoToRecord , , acNewRec
        Me.[KGY] = Year([Inizio])
        Me.[KGM] = m
    For i2 = 1 To Day(DateSerial(Year([Inizio]), m + 1, 0))
        Me.Controls("" & i2).Value = Me.[Assenza]
        If DateSerial(Year([Fine]), Month([Fine]), Day([Fine])) = DateSerial(Year([Fine]), m, i2) Then
        Exit For
        End If
    Next i2
    Next m
    ElseIf Year([Inizio]) <> Year([Fine]) Then
        Me.[KGY] = Year([Inizio])
        Me.[KGM] = Month([Inizio])
    For i1 = Day([Inizio]) To Day(DateSerial(Year([Inizio]), Month([Inizio]) + 1, 0))
        Me.Controls("" & i1).Value = Me.[Assenza]
    Next i1
    For m = Month([Inizio]) + 1 To 12
        DoCmd.GoToRecord , , acNewRec
        Me.[KGY] = Year([Inizio])
        Me.[KGM] = m
    For i2 = 1 To Day(DateSerial(Year([Inizio]), m + 1, 0))
        Me.Controls("" & i2).Value = Me.[Assenza]
        If DateSerial(Year([Fine]), Month([Fine]), Day([Fine])) = DateSerial(Year([Fine]), m, i2) Then
        Exit For
        End If
    Next i2
    Next m
    For y1 = Year([Inizio]) + 1 To Year([Fine])
    For m2 = 1 To 12
        DoCmd.GoToRecord , , acNewRec
        Me.[KGY] = y1
        Me.[KGM] = m2
    For i3 = 1 To Day(DateSerial(Year([Inizio]), m2 + 1, 0))
        Me.Controls("" & i3).Value = Me.[Assenza]
        If y1 = Year([Fine]) And m2 = Month([Fine]) And i3 = Day([Fine]) Then
        Exit For
        End If
    
    Next i3
        If y1 = Year([Fine]) And m2 = Month([Fine]) Then
        Exit For
        End If
    Next m2
    Next y1
    End If
    End Sub
    

    Dopo un po' di tentativi ci sono riuscito, sono alle prime armi di VBA

  • 04/02/2024 - Azucarea ha scritto:


    Dopo un po' di tentativi ci sono riuscito, sono alle prime armi di VBA

    ???

    04/02/2024 - Azucarea ha scritto:


    If Year([Inizio]) = Year([Fine]) And Month([Inizio]) = Month([Fine]) Then Me.[KGY] = Year([Inizio]) Me.[KGM] = Month([Inizio]) For i = Day([Inizio]) To Day([Fine]) Me.Controls("" & i).Value = Me.[Assenza] Next i ElseIf Year([Inizio]) = Year([Fine]) And Month([Inizio]) <> Month([Fine]) Then Me.[KGY] = Year([Inizio]) Me.[KGM] = Month([Inizio])

    Tradotto:

    Se 01/01/24 (inizio)=01/02/24 (fine) allora Kgy=24 e kgm=1

    Per i che va da 1 a 1 (quindi invece di contare per 30 conti solo 1 ciclo) scrivi “assenza”.

    Bello, manco un mese e me ne decurtano solo 1.

    Ma admo ad altro caso:

    Inizio 20/01/24 fine 19/02/24

    For 20 to 19…???!!!

    Oppure dal 01/01/24 al 05/08/24

    For 1 to 5…???!!!! 5 giorni? No 8 mesi!

    Il restodel codice, date le poche info, non lo analizzo, anche perché il resto del codice rende inutile la prima parte: serve solo a stressare la cpu.

    Funziona? Ok, al prossimo problema.

    Io spiegherei con piccoli periodi cosa vuoi ottenere, magari bastano 2 righe di codice piuttosto che 10 cicli for.

    Aiutino: for (datafine meno datainizio) downto 1….

    Il resto se spieghi senza sigle da codicefiscale ti possiamo suggerire approcci diversi e funzionali.

Devi accedere o registrarti per scrivere nel forum
3 risposte