Newsgroup: it.comp.appl.access
Titolo: datepart fa quel che vuole?

>>>>  
http://www.bb2002.it
 :)  <<<<<
........... [ al lavoro ] ...........

 
 
La 'settimana' di DatePart e la 'settimana' Iso8601 sono cose diverse

 
Ciapa ki
 
http://www.cpearson.com/excel/DateTimeVBA.htm
 

Se vuoi, io mi ero fatto questa funzione, in quanto il calcolo della Settimana è affetto da Bug.
 
Public Function Date2Week(Optional ByVal 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 ret              As Byte
 
    ret = Format(dtmDate, "ww", vbMonday, vbFirstFourDays)
    If ret > 52 Then
      If Format(dtmDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then ret = 1
    End If
    Date2Week = ret
End Function
 
@Alex

 il calcolo della Settimana è affetto da Bug
 
ok, questo basta e avanza... anche se, dico io che uso la 2010, ora della 
2019 lo potrebbero aver corretto no? sono solo 9 anni di sviluppo (nei 
quali hanno aggiunto tanti colori, tante icone belle a vedersi, tanti 
effetti speciali come la selezione che si sposta fluidamente con moto 
continuo dalla cella di partenza a quella su cui ho cliccato...)


 
 
non lo metto in dubbio: la settimana ISO č uno standard con precise 
indicazioni su come calcolarla, la settimana di datepart ha due parametri 
per ottenere quello che uno preferisce
 
ma se in datepart imposto i parametri validi per la settimana ISO mi 
aspetto di ottenere lo stesso risultato
 
poi vai a scoprire che č una funzione bacata... e pazienza


 
 
e poi vado a scoprire che anche Microsoft SQL Server Management Studio fa 
quello che gli pare sebbene abbia impostato correttamente i parametri di 
sistema
 
select DocDueDate, datepart(wk,DocDueDate) from OPOR
 
2019-12-09   	50
2019-10-31   	44
2019-12-30   	53 <<<
2019-12-02   	49


 
 
E quali sarebbero "..i parametri validi per la settimana ISO.." ?

 
 
At ISO 8601 - Wikipedia
https://it.wikipedia.org/wiki/ISO_8601
 
 
La settimana 01 dell'anno č definita come (sono tutte equivalenti):
 
    la settimana che contiene il primo giovedě dell'anno,
    la settimana che contiene il 4 gennaio,
    la prima settimana che contiene quattro, o piů, giorni del nuovo anno,
    la settimana che inizia con il lunedě fra il 29 dicembre e il 4 
gennaio,
    se il 1ş gennaio č un lunedě, martedě, mercoledě o giovedě allora č 
nella settimana 01. Se capita di venerdě, sabato o domenica allora č 
nell'ultima settimana (la 52 o 53) dell'anno precedente.
 
Il numero della settimana puň essere calcolato contando i giovedě: la 
settimana 12 contiene il dodicesimo giovedě dell'anno. 


 
 
Si la conosco bene la definizione di 'numero della settimana' secondo lo 
standard Iso8601, tutti gli agricoltori/vivaisti lavorano seguendo un 
calendario fatto in quel modo
Ma non mi hai risposto sulla tua affermazione
 
"...se in datepart imposto i parametri validi per la settimana ISO.."
 
e quali sarebbero i parametri per la settimana Iso in DatePart?
Non ci sono
Quello che voglio dire e' che se nella descrizione della funzione 
DatePart la Microsoft non accenna all'Iso8601, allora ti restituisce 
diciamo la 'settimana' Microsoft
Non e' la funzione che sbaglia ma sbagli tu a pensare che ti restituisca 
la 'settimana' iso8601

 [...]
Considerando LUN l'inizio settimana il 2019 di settimane
intere ne contiene 51, dal 7/1 al 29/12, più 6 giorni
iniziali e 2 finali.
Di lunedì pertanto ce ne stanno 51 + 1 al 30/12.
 
Ora si può definire quale delle due parti componenti
gli 8 giorni costituisca, per convenzione,
la 52-esima settimana.
La prima di 6 giorni o la seconda di due giorni?
Diciamo la prima, scegliere la seconda di 2 giorni fa ridere.
Beh allora LUN 30/12/19 appartiene solo a 51 settimane.
Perché appartenga a 52 settimane occorre considerare
la 52-esima settimana quella dal 30/12 a 31/12:
il che non fa ridere, fa piangere.
 
Quanto sopra per dire che chiedersi a quale settimana
appartiene un giorno può a volte generare
ambiguità in rapporto alla logica dei fatti.
Se poi si voglia, senza ambiguità, definire le date
e gli ordinali di un giorno...
=====================================
Private Sub Command18_Click()
Dim StartDate As Date, EndDate As Date
Dim i As Date, Anno As Integer, k As Byte
 
Anno = 2019
StartDate = "1/1/" & Anno
EndDate = "31/12/" & Anno
 
' DOM=1, LUN=2, etc
For i = StartDate To EndDate
    If Weekday(i) = 2 Then
        k = k + 1
        MsgBox k & "  -  " & i
    End If
Next
 
End Sub
===================================
 
Bruno

 
 
ohibò...
 
nel mio post di apertura ho scritto:
 
Week: DatePart("ww";[DateCasuali]![Field1];2;2)
 
il primo 2 dice che la settimana inizia al lunedì
il secondo 2 specifica "Use the first week in the year that has at least 4 
days"
 
che sono i parametri ISO:
la settimana che inizia con il lunedì fra il 29 dicembre e il 4 
gennaio,
 
a te la parola


 
 
infatti il lunedì della prima settimana ISO dell'anno 2020 è ancora nel 
2019
 
apprezzo molto i vostri suggerimenti per ottenere il risultato corretto con 
artifici vari e codice vba, la "polemica" era nata in ambiente SAP SQL dove 
in MSSMS il comando datepart sbaglia la settimana
 
motivo (del supporto SAP): l'esercizio 2019 è stato configurato già 
all'inizio con la settimana sbagliata per cui per il 2019 ne abbiamo 53
 
ribatto che della configurazione di SAP a SQL non dovrebbe fregare meno di 
niente e che il calcolo della settimana dovrebbe essere di default quello 
ISO
 
etc etc
 
per adesso nelle stampe con consegna 30 e 31 dicembre esce settimana 53 e 
me la devo tenere (a meno di strusare sul report e infilarci un bel if year 
=2019 and week=53 then week=1 end if)


 ... 
 
9 anni? Ma no, è sul mio sito da ca. 20 anni 
(
http://www.donkarl.com/it?FAQ2.25
). ;-) Il bug è così vecchio che nel 
frattempo persino hanno tolto tutta la KB con l'articolo corrispondente:
 
https://web.archive.org/web/20060510232309/http:/support.microsoft.com/?kbid=200299
 
 
-- 
Ciao
Karl
*********
http://www.AccessDevCon.com
 
Access FAQ: 
http://www.donkarl.com/it
 

 
 
Ah, non conoscevo l'esistenza di quel vbFirstFourDays
Eh gia' in questo caso la 'settimana' Microsoft dovrebbe coincidere con 
la definizione dell'Iso8601
Eallora la funzione e' fallata
 


Da cui la Funzione che suggerivo all'inizio.
 
@Alex

 
https://web.archive.org/web/20060510232309/http:/support.microsoft.com/?kbid=200299
 
 
L'ho discusso con la gente adeguata e finalmente richiesto un fix o 
perlomeno la restituzione/attualizzazione dell'articolo sul bug.
 
Vedremo... forse già nei prossimi 9 anni qualcosa succederà a causa di 
questo reclamo in icaa. ;-)


 
 
".. gente adeguata.."
Visto che ci sei, mettici una buona parola per lo zoom su form e report, 
per le web form, e last but not least per il compilatore in codice 
nativo, cosi' i delphiniani la smettono di rompere

, e last but not least per il compilatore in codice nativo
 
Un progetto solo per il 1 Aprile.
 
 > cosi' i delphiniani la smettono di rompere
 
Non smetteranno mai, ma non importano.


 
 
+1000000000


 
 
Dai desideri di una persona, si potrebbe dedurne l'eta'
Quelli che vogliono zoomare, sono sopra gli 80   8-)
(oppure sono stati accecati dai raggi B alle porte di Tanhauser)
 

 perlomeno la restituzione/attualizzazione dell'articolo sul bug.
 
Almeno la documentazione è già stata attualizzata:
https://docs.microsoft.com/en-us/office/troubleshoot/access/functions-return-wrong-week-number
 


 
 
è sufficiente essere sopra i 40 ;) ma quando pensi che lo zoom lo hanno 
fatto per tutti gli altri programmi (excel, word, powerpoint, etc) allora 
basta essere un essere senziente e domandarsi perché pnmmb non lo fanno 
anche per access... e non mi dire che c'è quella zreqn di programma di 
Magnifier incorporato in windows... chi ne parla bene è perché non lo ha 
mai usato seriamente: è passabile per fare uno zoom su qualcosa di piccolo 
da LEGGERE, ma non ha niente a che fare con chi deve posizionare oggetti o 
ridimensionarli in un form o un report


 
https://docs.microsoft.com/en-us/office/troubleshoot/access/functions-return-wrong-week-number
 
 
A me sembra una gran complicazione, ovvero non ho capito niente.
 
Anno 2018: 1/1 = LUN,   31/12 = LUN,  LUN appare 53 volte,
in ogni anno non bisestile il giorno 1/1 è lo stesso del
giorno 31/12.
Quindi la regola dei 4 giorni si applica sia sui primi 4 di
gennaio che sugli ultimi 4 di dicembre?
 
Allora se il giorno 53 si trova nei primi quattro dell'anno,
l'ultimo sarà negli ultimi 3 di fine anno e perciò questo
si considerà il primo dell'anno futuro.
Se si trova negli ultimi 4 dell'anno in corso allora si troverà
anche nei primi 3 di gennaio e perciò quest'ultimo sarà attribuito
all'anno passato.
Non credo ci vogliano pagine di codice per definire ciò.
 
Dico bene o sbaglio?
 
Bruno

 
 
definita la settimana in modo che il lunedě sia il *primo* giorno, essa 
appartiene all'anno dove ci sono piů giorni: per questo motivo si guarda 
dov'č il giovedě
 
se č 28-29-30-31 appartiene all'anno prima
se č 1-2-3-4 appartiene all'anno dopo


 se è 1-2-3-4 appartiene all'anno dopo
 
Il ragionamento è corretto, io sto pensando, ancora non vi ho messo
mano, di utilizzarlo partendo dall'inizio anno.
 
Definita la settimana LUN-DOM, se il primo LUN è nei primo 4 giorni
di gennaio, supponiamo il 3/1, il MIO ANNO di rifferimento sarà
dal 3/1 al 3/1+364 (o 365 se bisestile).
 
Analogamente, se il primo LUN appartiene all'anno precedente,
supponiamo al 28/12, il MIO ANNO di riferimento sarà
dal 28/12 al 28/12+364 (o 365 se bisestile).
 
Fatto ciò, alla faccia di DatePart, eseguo una scansione
sul MIO ANNO e trovo tutto quello che voglio.
 
Bruno

 sul MIO ANNO e trovo tutto quello che voglio.
 
Errara corrige:
 
MIO ANNO sarà unicamnte composto di 52 settimane pari a
52 * 7 = 364 giorni, quindi in ogni caso dall'inizio anno
come sopra determinato fino a inizio + 363.
Salvo ulteriori ripensamenti in fase di realizzazione.
 
Bruno

 Il ragionamento è corretto, io sto pensando
 
anche io ho dovuto pensare e ho partorito questo :)
 
textBox162.Value = ""
 
' replacement with variables
Dim DT_Year As String = ld.QueryData("select datepart(year,'" + 
ld.Date(Document("DocDueDate"),"yyyyMMdd") + "')")
Dim DT_Week As String = ld.QueryData("select datepart(wk,'" + 
ld.Date(Document("DocDueDate"),"yyyyMMdd") + "')")
 
If DT_Year = "2019" And DT_Week = "53" Then DT_Week = "01"
 
textBox162.Value = GetData("LD.Txt.T0003615") + " " + DT_Week
 
con la segreta speranza che alla prossima occasione nel 2024 mammasoft 
abbia fatto le dovute correzioni al codice per avere la settimana giusta


Ammammata formulated on Monday :
 
Ti va di provare questo?
È appaena uscito dal forno... ancora caldo... sperimentazione minima.
 
=======================================================
Private Sub Command0_Click()
Dim DateIni As Date, WKD(1 To 7) As String
Dim WeekNum As Byte, i, h
 
WKD(1) = "LUN": WKD(2) = "MAR": WKD(3) = "MER"
WKD(4) = "GIO": WKD(5) = "VEN": WKD(6) = "SAB": WKD(7) = "DOM"
For i = 1 To 4
    If Weekday(CDate(i & "/1/" & Year(Data)), vbMonday) = Weekday(Data, 
vbMonday) Then
        DateIni = CDate(i & "/1/" & Year(Data))
        MsgBox DateIni
        Exit For
    End If
Next
If Not DateIni Then
    For i = 0 To 2
        If Weekday(CDate(31 - i & "/12/" & Year(Data) - 1), vbMonday) = 
Weekday(Data, vbMonday) Then
            DateIni = CDate(31 - i & "/12/" & Year(Data) - 1)
            Exit For
        End If
    Next
End If
h = 1
For i = 0 To 363
    If i Mod 7 = 0 Then h = h + 1
    If DateAdd("d", i, DateIni) = [Data] Then
        MsgBox "52 integer Weeks" & vbCrLf & _
        DateIni & "   " & WKD(Weekday([Data], vbMonday)) & vbTab & _
        DateAdd("d", 363, DateIni) & vbTab & WKD(Weekday(DateAdd("d", 
363, DateIni), vbMonday)) & _
        vbCrLf & vbLf & _
        "Day" & vbTab & i & vbCrLf & _
        "Week" & vbTab & h & vbCrLf & _
        "WeekDay  " & WKD(Weekday([Data], vbMonday))
    End If
Next
End Sub
==================================================
 
Access 2019, Form con un campo [Data], di nome e di fatto.
 
Bruno

 
 
al momento non mi bisogna in nessuna applicazione access (1), diciamo che 
il thread è partito su questo gruppo in quanto avevo sottomano anche questo 
programma (access) per fare delle prove
in realtà mi serve in ambiente SAP Business One & SQL
 
 
 
(1) or ora mi sovviene che in access ho una stampa che divide gli ordini 
per settimana, vado a cercare la function che lo sviluppatore si è 
inventato una ventina di anni fa...
 
Public Function We(X As Variant) As Long
We = Val(Format(X, "ww", vbMonday, vbFirstFourDays))
End Function
 
temo sia fallata... farò qualche esperimento in ambiente di test...
