Copiare valore tra un intervallo di date in campi specifici

di il
3 risposte

Copiare valore tra un intervallo di date in campi specifici

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

  • Re: Copiare valore tra un intervallo di date in campi specifici

    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)

  • Re: Copiare valore tra un intervallo di date in campi specifici

    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

  • Re: Copiare valore tra un intervallo di date in campi specifici

    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