Avatar billede kimidk1 Novice
12. juli 2020 - 20:48 Der er 9 kommentarer og
2 løsninger

Returnering af forkert dato i Access

Hej

Prøver at sætte mig ind i hvordan programmering i Access fungerer så jeg  har købt en bog :-)

sidder med et eksempel hvor jeg får en forkert dato ud fra en programstump:

Sub WhatTypeOfDay()

Dim response As String
Dim question As String
Dim strMsg1 As String, strMsg2 As String
Dim myDate As Date

question = "Enter any date in the format mm/dd/yyyy:" _
& Chr(13) & " (e.g., 07/06/2015)"
strMsg1 = "weekday"
strMsg2 = "weekend"
response = InputBox(question)

myDate = Weekday(CDate(response))

MsgBox myDate

If myDate >= 2 And myDate <= 6 Then
MsgBox strMsg1
Else
MsgBox strMsg2
End If

End Sub

Jeg har indtastet dato som US format 07/12/2020 (søndag den 12 juli 2020)
men får værdien 01-01-1900 fra linien MsgBox myDate

Har prøvet at indtaste dato som 12/07/2020 og 12-07-2020 men får så returneret datoen 31-12-1899

Kan ikke gennemskue hvor det går galt - mine windows indstillinger er sat til Nuværende format: Dansk (Danmark)

hilsen
Kimidk1
Avatar billede bsn Forsker
13. juli 2020 - 01:55 #1
Datoer i Access er et helvede...
Det vil du opdage, når du kommer der henad...

Nedenstående sub rettet til...

Sub WhatTypeOfDay()

Dim response As Date
Dim question As String
Dim strMsg1, strMsg2 As String
Dim myDay As Long

question = "Enter any date in the format mm/dd/yyyy:" & Chr(13) & " (e.g., 07/06/2015)"
strMsg1 = "weekday"
strMsg2 = "weekend"
response = InputBox(question)

myDay = Weekday(response, vbMonday)
MsgBox myDay

If myDay >= 1 And myDay <= 5 Then
MsgBox strMsg1
Else
MsgBox strMsg2
End If

End Sub
Avatar billede kimidk1 Novice
13. juli 2020 - 14:38 #2
Ændringerne giver desværre ikke et ændret resultat - får stadigvæk de datoer som nævnt ovenfor, fra linien "MsgBox MyDay" :

"Jeg har indtastet dato som US format 07/12/2020 (søndag den 12 juli 2020)
men får værdien 01-01-1900 fra linien MsgBox myDate

Har prøvet at indtaste dato som 12/07/2020 og 12-07-2020 men får så returneret datoen 31-12-1899"
Avatar billede tjp Mester
13. juli 2020 - 15:52 #3
Prøv at dele 'myDate = Weekday(CDate(response))' op i 2:

Sub WhatTypeOfDay()

    Dim response As String
    Dim question As String
    Dim strMsg1 As String, strMsg2 As String
    Dim myDate As Date
    Dim DayOfWeek As Integer
   
    question = "Enter any date in the format mm/dd/yyyy:" _
            & Chr(13) & " (e.g., 07/06/2015)"
    strMsg1 = "weekday"
    strMsg2 = "weekend"
    response = InputBox(question, , "29/06/2015")
   
    myDate = CDate(response)
    DayOfWeek = Weekday(myDate)
   
    'MsgBox myDate
   
    If DayOfWeek >= 2 And DayOfWeek <= 6 Then
        MsgBox strMsg1
    Else
        MsgBox strMsg2
    End If

End Sub
Avatar billede store-morten Ekspert
13. juli 2020 - 16:22 #4
Prøv:
Sub WhatTypeOfDay()

Dim response As String
Dim question As String
Dim strMsg1 As String, strMsg2 As String
Dim myDate As Date

question = "Enter any date in the format mm/dd/yyyy:" _
& Chr(13) & " (e.g., 07/06/2015)"
strMsg1 = "weekday"
strMsg2 = "weekend"
response = InputBox(question)

myDate = CDate(response)

MsgBox myDate

If Weekday(myDate, vbMonday) < 6 Then
MsgBox strMsg1
Else
MsgBox strMsg2
End If

End Sub
Avatar billede tjp Mester
14. juli 2020 - 02:56 #5
Nedenfor svar på, hvorfor du får hhv '01-01-1900' og '31-12-1899' fra:

(...)
myDate = Weekday(CDate(response))
MsgBox myDate
(...)

Weekday(dato) returnerer hvilken dag i ugen 'dato' er - fx '1' for søndag, '2' for mandag osv. ved default indstilling (dvs. 1. dag i ugen er søndag) . Dette resultat bliver derpå assignet til myDate, som tolker værdien som om det var en dato (fordi myDate har typen Date). Dette giver følgende resultater:

1            31-12-1899
2            01-01-1900
3            02-01-1900
4            03-01-1900
5            04-01-1900
6            05-01-1900
7            06-01-1900

Altså '31-12-1899' for søndage, fx 12-07-2020, og '01-01-1900' for mandage, fx 07-12-2020 (7. december 2020) ...
Avatar billede kimidk1 Novice
14. juli 2020 - 15:04 #6
Tak for hjælpen - så er det blevet lidt klarere :-)
Avatar billede kimidk1 Novice
14. juli 2020 - 15:09 #7
I forbindelse med if -then-else, kan man sætte Access op til at linier mellem if/then og Else flytter ind automatisk ?
Avatar billede tjp Mester
14. juli 2020 - 15:51 #8
Ikke mig bekendt - jeg bruger tab og shift+tab til at rykke linjer frem og tilbage. NB du kan rykke flere linjer ad gangen, ved at markere dem alle og trykke tab :-)
Avatar billede bsn Forsker
14. juli 2020 - 16:22 #9
#2

Det skulle gerne give det rigtige resultat...

Har du kopieret hele den sub ind jeg har lavet...?

Der er flere ændringer i den...
Avatar billede kimidk1 Novice
14. juli 2020 - 18:08 #10
Jeps, har rettet til som du har lavet sub'en og det virker :-)

men nu har jeg tænkt ;-) og hvis jeg ændrer myDate fra Date til Integer så virker det sku :-) - som den eneste ændring i forhold til den oprindelige sub tekst

for som du skriver så er datoer jo angivet internt i Access som et nummer som er lig med de værdier du angiver - og det er vel derfor det går galt ?
Avatar billede store-morten Ekspert
14. juli 2020 - 18:20 #11
Sub WhatTypeOfDay2()

Dim question As String
Dim day As String
Dim myDate As Date

question = InputBox("Enter any date " _
& Chr(13) & " (e.g., 07/14/2020 or 14-07-2020)")

myDate = CDate(question)

Select Case Weekday(myDate, vbMonday)
    Case Is = 1
        day = "mandag"
    Case Is = 2
        day = "tirsdag"
    Case Is = 3
        day = "onsdag"
    Case Is = 4
        day = "torsdag"
    Case Is = 5
        day = "fredag"
    Case Is = 6
        day = "lørdag"
    Case Is = 7
        day = "søndag"
End Select

MsgBox myDate & " er en " & day
End Sub
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester