Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 7 su 7

Numero della settimana errato con Format()

  1. #1
    Numb3r4 non è in linea Novello
    Post
    3
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao ragazzi!
    Mi trovo ad affrontare un problema veramente fastidioso:

    Utilizzando la funzione Format() nel campo di una Query mi viene restituito il numero della settimana errato, più precisamente un +1 rispetto al numero corretto.

    Per esempio il 20/1/2021 viene indicato come settimana 4 anche se in realtà è la 3.

    In teoria i parametri della funzione dovrebbero porre rimedio a questo problema ma nella realtà dei fatti non è così

    Nel campo della Query ho inserito il seguente codice:

    Settimana: Format([Data];'ii';2;3)
    
    Cosa sbaglio?

  2. #2
    Numb3r4 non è in linea Novello
    Post
    3
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ora ho provato a scrivere la funzione in un modulo e richiamarla dalla query.. funziona!
    Però mi piacerebbe sapere il perchè

  3. #3
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,802
    Like Inviati  
    0
    Like Ricevuti  
    23
    È un baco risaputo.
    Questa restituisce il valore corretto secondo le indicazioni MS.
    Public Function Date2Week(Optional dtmDate As Variant) As Byte
        ' ------------------------------------------------------
        ' Calcolo formato ISO 8601:1988 standard
        ' Verificati i casi da KB [OK]
        ' https://support.microsoft.com/it-it/kb/200299
        ' ------------------------------------------------------
        Dim Jan1             As Date
        Dim Sub1             As Boolean
        Dim Ret              As Byte
     
        If IsMissing(dtmDate) Then
            Jan1 = DateSerial(year(Date), 1, 1)
        Else
            Jan1 = DateSerial(year(dtmDate), 1, 1)
        End If
         
        Sub1 = (Format(Jan1, "ww", VBA.VbDayOfWeek.vbUseSystemDayOfWeek, VBA.VbFirstWeekOfYear.vbUseSystem) = 1)
        Ret = DatePart("ww", dtmDate, VBA.VbDayOfWeek.vbUseSystemDayOfWeek, VBA.VbFirstWeekOfYear.vbUseSystem) + Sub1
         
        Date2Week = Ret
    End Function
    
    ℹ️ Leggi di più su @Alex ...

  4. #4
    OsvaldoLaviosa non è in linea Topo di biblioteca
    Post
    3,091
    Like Inviati  
    0
    Like Ricevuti  
    1
    Non sono sicuro di darti una risposta corretta. Prova a leggere qui
    https://support.microsoft.com/it-it/...3-aba746fb29d8
    nella sezione "Criteri per i campi Data/ora". Fra i vari esempi, quando si vuole puntare sulle settimane si usa il DatePart ("ww"...)

    P.S.: scusa @Alex, vedo (dopo) che hai fornito una risposta completa...mentre digitavo...
    ℹ️ Leggi di più su OsvaldoLaviosa ...

  5. #5
    Numb3r4 non è in linea Novello
    Post
    3
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grazie ad entrambi per le risposte..
    Spulciando in giro ho visto che effettivamente è un bug abbastanza "famoso"..

    @Alex ma la funzione che mi hai postato è quella che dovrei richiamare nella Query?
    Perchè utilizzandone una custom di questo tipo funziona ugualmente:

    Public Function Settimana(ByVal sett As Variant)
    Settimana =Format(sett, "ww", vbMonday, vbFirstFullWeek) 
    End Function
    
    Il bug è solo quando si richiama la funzione Format() nelle Query quindi?

  6. #6
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,802
    Like Inviati  
    0
    Like Ricevuti  
    23
    Leggi questo:
    https://docs.microsoft.com/en-us/off...ng-week-number

    Se vuoi fai qualche prova con al tua Funzione su date tipiche di test per la verifica:
    Debug.Print Settimana(#12/30/2003#)
    Debug.Print Settimana(#12/31/2003#)
    
    Verifica se appartengono alla 52°, alla 53° settimana oppure alla 1°... (ovviamente non esiste la 53° a meno della regola del Giovedì... come citata dalla ISO)

    Peraltro mi sono accorto che anche la funzione che ho suggerito ha un baco...
    Ultima modifica di @Alex; 25-01-2021 13:08 
    ℹ️ Leggi di più su @Alex ...

  7. #7
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,802
    Like Inviati  
    0
    Like Ricevuti  
    23
    La funzione corretta è questa:
    Function Date2Week(InDate As Date) As Integer
        ' ------------------------------------------------------
        ' Calcolo formato ISO 8601:1988 standard
        ' Verificati i casi da KB [OK]
        ' https://support.microsoft.com/it-it/kb/200299
        ' https://docs.microsoft.com/it-it/office/troubleshoot/access/functions-return-wrong-week-number
        ' ------------------------------------------------------
        Dim DayNo As Integer
        Dim StartDays As Integer
        Dim StopDays As Integer
        Dim StartDay As Integer
        Dim StopDay As Integer
        Dim VNumber As Integer
        Dim ThurFlag As Boolean
        
        DayNo = InDate - DateSerial(Year(InDate), 1, 0)
        StartDay = Weekday(DateSerial(Year(InDate), 1, 1)) - 1
        StopDay = Weekday(DateSerial(Year(InDate), 12, 31)) - 1
        ' Number of days belonging to first calendar week
        StartDays = 7 - (StartDay - 1)
        ' Number of days belonging to last calendar week
        StopDays = 7 - (StopDay - 1)
        ' Test to see if the year will have 53 weeks or not
        If StartDay = 4 Or StopDay = 4 Then ThurFlag = True Else ThurFlag = False
        VNumber = (DayNo - StartDays - 4) / 7
        ' If first week has 4 or more days, it will be calendar week 1
        ' If first week has less than 4 days, it will belong to last year's
        ' last calendar week
        If StartDays >= 4 Then
            Date2Week = Fix(VNumber) + 2
        Else
            Date2Week = Fix(VNumber) + 1
        End If
        ' Handle years whose last days will belong to coming year's first
        ' calendar week
        If Date2Week > 52 And ThurFlag = False Then Date2Week = 1
        ' Handle years whose first days will belong to the last year's
        ' last calendar week
        If Date2Week = 0 Then
            Date2Week = Date2Week(DateSerial(Year(InDate) - 1, 12, 31))
        End If
    End Function
    
    ℹ️ Leggi di più su @Alex ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Ricavare data da numero e giorno della settimana
    Da pigiama nel forum Microsoft Excel
    Risposte: 3
    Ultimo Post: 05-06-2017, 10:41
  2. estrarre intevallo date dal numero della settimana
    Da sasy_80 nel forum Microsoft Access
    Risposte: 5
    Ultimo Post: 28-04-2014, 02:50
  3. numero del giorno della settimana all'interno di un mese
    Da mabix nel forum Microsoft Access
    Risposte: 2
    Ultimo Post: 20-12-2013, 11:01
  4. Risposte: 16
    Ultimo Post: 28-07-2013, 14:16
  5. Script ASP numero settimana-> giorni ???
    Da MarcusMM nel forum ASP 3, ASP .Net
    Risposte: 2
    Ultimo Post: 21-11-2005, 09:17