Avatar billede macriis Nybegynder
14. september 2004 - 12:02 Der er 20 kommentarer og
1 løsning

Datoformater: Fra tekstboks til SQL og til Access (DK)

Jeg ønsker hjælp i forlængelse af spørgsmål http://eksperten.dk/spm/536829.

Jeg benytter nedenstående kode, fra spørgsmålet ovenover, hvor brugeren indtaster dato på formatet dd-mm-yyyy (altid med korrekteantal cifre):

formDato = Request.Form("dato")
dato = Year(formDato) & "-" & Month(formDato) & "-" & Day(formDato)

Men jeg får cirka det samme problem som nævnt i http://eksperten.dk/spm/115073, at hvis der indtastes en dato i formfeltet der hvor dagen er før måneden så byttes der om på dag og måned, når jeg udskriver resultatet.

Er det forstået korrekt at man skal konvertere sine datoer til yyyy-mm-dd (eller mm-dd-yyyy) når man arbejder med det i SQL? Dvs. når man modtager i formatet fra en tekstboks, skal det konverteres til yyyy-mm-dd når det gemmes i Access og derefter kan man hive det ud som man ønsker?
Jeg synes det er det jeg gør herunder.




================================

IF Request.ServerVariables("REQUEST_METHOD") = "POST" THEN
    formDato = Request.Form("dato")
    strSQL = "SELECT dato FROM dagsrapport WHERE dato = #" & FormatDateTime(formDato,vbShortDate) & "# AND brugerId = " & Session("brugerId")
    Set rsDato = Conn.Execute(strSQL)
    IF NOT rsDato.EOF THEN
        datoExist = "<font color='red'>Du har allerede oprettet en dagsrapport for d. " & FormatDateTime(rsDato("dato"), vbLongDate) & "</font>"
    ELSE
        IF IsDate(formDato) = false THEN
            datoFejl = "<font color='red'>Du har indtastet en forkert dato. Dato skrives på formen DD-MM-YYYY.</font>"
        ELSE
            dato =  Year(formDato) & "-" & Month(formDato) & "-" & Day(formDato)
            strSQL = "INSERT INTO dagsrapport (dato, brugerId, tidsforbrug, antalOpkald, antalBeslutningstagere, antalMoeder) VALUES (#" & dato & "#,'" & Session("brugerId") & "','" & Request.Form("tidsforbrug") & "','" & Request.Form("antalopkald") & "','" & Request.Form("antalBeslutningstagere") & "','" & Request.Form("antalMoeder") & "')"
            Conn.Execute(strSQL)
            rapportgemt = true
        END IF
    END IF
END IF

================================
Avatar billede ldanielsen Nybegynder
14. september 2004 - 12:15 #1
Et trin af gangen!

formDato = Request.Form("dato")

Ret det til
formDato = Cdate(Request.Form("dato"))

og skriv så
Response.Write (formDato)

- for at se om datoen slipper rigtigt igennem hertil. Test med alle mulige datoer, fx 2004-01-01, 2004-10-13 og 2004-13-10. én af de to sidste skulle jo gerne fejle, men min erfaring er at vbscript netop kan finde på at oversætte begge til 13/10 !!!!

ok?
Avatar billede macriis Nybegynder
14. september 2004 - 12:44 #2
Jeps, ok.

Jeg har nu gjort som du foreskriver. Det skal lige bemærkes at jeg ønsker at indtaste på formen dd-mm-yyyy.

01-01-2004 = 01-01-2004
13-10-2004 = 13-10-2004
10-13-2004 = 13-10-2004

2004-01-01 = 01-01-2004
2004-10-13 = 13-10-2004
2004-13-10 = Typer stemmer ikke overens: 'CDate'

Så indtil dette trin må det siges at være tilfredsstillende.
Avatar billede ldanielsen Nybegynder
14. september 2004 - 13:18 #3
Den gør det forkert hvis du skriver formatet dd-mm-yyyy, ikke?

Brug evt dette
arrTemp = Split(Request.Form("dato"), "-")
formDato = DateSerial(CInt(AarrTemp(2), CInt(arrTemp(1), CInt(arrTemp(0)))

det skulle garantere at formen dd-mm-yyyy konverteres til et datoobjekt, og korrekt. Men så forstår Scriptet KUN dette format.

Men hvis datoerne således kommer rigtigt ind fra formen, er dit problem så løst?
Avatar billede macriis Nybegynder
14. september 2004 - 13:53 #4
Nej da gør den det korrekt. Det synes jeg ok, men det er måske ikke korrekt syntaks?

Nej det er desværre ikke løst med dette. Der må gå noget galt senere hen i scriptet: Jeg forestiller mig at det er her det går galt:

dato =  Year(formDato) & "-" & Month(formDato) & "-" & Day(formDato)
Avatar billede ldanielsen Nybegynder
14. september 2004 - 14:09 #5
Det er til insert, ikke?

Jeg vil sige det sådan, at hvis du bruger dateserial, så er datoen korrekt, og så bliver Year(formDato) & "-" & Month(formDato) & "-" & Day(formDato) også korrekt. Men kan du snyde access med 2004-13-10 og 2004-10-13? Skal du måske bruge dd-mm-yyyy eller noget endnu værre til insert?

Den helt sikre måde er noget med
Rec.AddNew
Rec("Dato") = formDato
Rec.Update

Siger det dig noget? :o)
Avatar billede eagleeye Praktikant
14. september 2004 - 17:30 #6
du skal ikke bruge FormatDateTime med SSQL sætningen:

    formDato = Request.Form("dato")
    strSQL = "SELECT dato FROM dagsrapport WHERE dato = #" & FormatDateTime(formDato,vbShortDate) & "# AND brugerId = " & Session("brugerId")

Men formatere den med year, month, day:

    formDato = Request.Form("dato")
    dato = Year(formDato) & "-" & Month(formDato) & "-" & Day(formDato)
    strSQL = "SELECT dato FROM dagsrapport WHERE dato = #" & dato & "# AND brugerId = " & Session("brugerId")
Avatar billede macriis Nybegynder
16. september 2004 - 00:48 #7
ldanielsen > Ja til insert. Og som jeg kan forstå skal SQL (insert) have datoformatet som yyyy-mm-dd, hvorfor at jeg benytter den funktion som eagleeye nævner. Men denne virker ikke. Problemet beskrevet i spørgsmålet opstår.

eagleeye > Har fjernet FormatDateTime og har nu testet scriptet.

*Lidt testeri*
Indtastninger med følgende eksempler resulterer i følgende i Access-databasen:

01-12-2004 = 01-12-2004
12-01-2004 = 01-12-2004**
01-10-2004 = 01-10-2004
10-01-2004 = 10-01-2004**

**Her får jeg fejlen at disse datoer er oprettet i forvejen i databasen. Betyder det at fejlen ligger i SELECT-SQLsætningen?

(Disse virker fint:
16-09-2004 = 16-09-2004
01-02-2004 = 01-02-2004
03-02-2004 = 03-02-2004
01-06-2004 = 01-06-2004
12-06-2004 = 12-06-2004
12-09-2004 = 12-09-2004
24-09-2004 = 24-09-2004
24-02-2004 = 24-02-2004)

Databasen er sat til kort datoformat (dd-mm-yyyy).
Avatar billede macriis Nybegynder
16. september 2004 - 00:50 #8
Linien 10-01-2004 = 10-01-2004**
skal hedde
10-01-2004 = 01-10-2004
Avatar billede macriis Nybegynder
16. september 2004 - 00:59 #9
"Betyder det at fejlen ligger i SELECT-SQLsætningen?"

Svaret må være ja. Jeg beklager. For nu kan jeg gemme datoerne 01-12-2004 samt 10-01-2004. Men hvorfor er det så at linierne:

formDato = CDate(Request.Form("dato"))
strSQL = "SELECT dato FROM dagsrapport WHERE dato = #" & formDato & "# AND brugerId = " & Session("brugerId")

ikke kan finde ud af at søge på fx 01-10-2004 når det står i databasen? Skal der også ved SELECT benyttes formen yyyy-mm-dd selv om det står på formen dd-mm-yyyy i db?
Avatar billede eagleeye Praktikant
16. september 2004 - 01:03 #10
hvordan ser din kode ud nu?
Avatar billede macriis Nybegynder
16. september 2004 - 01:06 #11
Sådan her. Jeg tror det spiller nu.

Jeg beklager at jeg ikke kunne forstå hvad du skrev som svar i det første spørgsmål at når man arbejdet i SQL så skal der arbejdes med yyyy-mm-dd og så kan man altid arbejde med fx dd-mm-yyyy når det udskrives i ASP.

Ser det rigtigt ud det her?

IF Request.ServerVariables("REQUEST_METHOD") = "POST" THEN
    formDato = CDate(Request.Form("dato"))
    formDato = Year(formDato) & "-" & Month(formDato) & "-" & Day(formDato)
    strSQL = "SELECT dato FROM dagsrapport WHERE dato = #" & formDato & "# AND brugerId = " & Session("brugerId")
    Set rsDato = Conn.Execute(strSQL)
    IF NOT rsDato.EOF THEN
        datoExist = "<font color='red'>Du har allerede oprettet en dagsrapport for d. " & FormatDateTime(rsDato("dato"), vbLongDate) & "</font>"
    ELSE
        IF IsDate(formDato) = false THEN
            datoFejl = "<font color='red'>Du har indtastet en forkert dato. Dato skrives på formen DD-MM-YYYY.</font>"
        ELSE
            dato =  Year(formDato) & "-" & Month(formDato) & "-" & Day(formDato)
            strSQL = "INSERT INTO dagsrapport (dato, brugerId, tidsforbrug, antalOpkald, antalBeslutningstagere, antalMoeder) VALUES (#" & dato & "#,'" & Session("brugerId") & "','" & Request.Form("tidsforbrug") & "','" & Request.Form("antalopkald") & "','" & Request.Form("antalBeslutningstagere") & "','" & Request.Form("antalMoeder") & "')"
            Conn.Execute(strSQL)
            rapportgemt = true
        END IF
    END IF
END IF
Avatar billede eagleeye Praktikant
16. september 2004 - 01:06 #12
Eller hvordan så din kode ud da du testede 16/09-2004 00:48:14
Avatar billede eagleeye Praktikant
16. september 2004 - 01:09 #13
Ja det ser rigtigt ud. Du har brugt yyyy-mm-dd i begge SQL sætningen, SELECT og INSERT INTO.
Avatar billede macriis Nybegynder
16. september 2004 - 01:11 #14
Da havde jeg ikke

formDato = Year(formDato) & "-" & Month(formDato) & "-" & Day(formDato)

med ved SELECT. Havde ikke set at det var ved SELECTEN du skrev.
Avatar billede macriis Nybegynder
16. september 2004 - 01:12 #15
Er det nødvendigt at benytte CDate-funktionen når jeg sikrer mig at mine brugere skriver på formen dd-mm-yyyy i tekstboksen?
Avatar billede eagleeye Praktikant
16. september 2004 - 01:13 #16
Det er med i koden du har vist 16/09-2004 01:06:43, så der skulle ikke være nogle problemer med det.

>>Er det nødvendigt at benytte CDate-funktionen når jeg sikrer mig at mine brugere skriver på formen dd-mm-yyyy i tekstboksen?
Nej, isDate er nok.
Avatar billede macriis Nybegynder
16. september 2004 - 01:16 #17
Når jeg så bruger yyyy-mm-dd i alle mine SQL sætningen fremover så skulle det passe?

Min Access gemmer så som mm-dd-yyyy fordi jeg har sat den til det som setting på dato-feltet. Derved er det lettere at bruge når det skal udskrives. Her behøver man ikke at formatere datoen, da den står på korrekt dansk form.
Jeg håber dette er måden at gøre det på.
Avatar billede eagleeye Praktikant
16. september 2004 - 01:19 #18
>>Når jeg så bruger yyyy-mm-dd i alle mine SQL sætningen fremover så skulle det passe?
Ja

Ja det er den mest rigtig måde at gøre det på.


Der er en lille biting/bug ved isDate. Hbis du skriver 01-13-2004 tror den det er 13. januar og ikke en ulovlig dato. Så man kan lave tjekket sådan her:

IF IsDate(formDato) = false or month(formDato)>12 THEN
Avatar billede macriis Nybegynder
16. september 2004 - 01:38 #19
Ahh dejligt. Det har jeg lige siddet og arbejdet med.

Men hvis jeg prøver dit forslag får jeg fejl. Jeg opretter lige et nyt spørgsmål til det. Smid lige et svar først.
Avatar billede macriis Nybegynder
16. september 2004 - 01:51 #20
eagleeye > Der henvises til http://www.eksperten.dk/spm/540196
Avatar billede eagleeye Praktikant
16. september 2004 - 22:28 #21
Ok her et svar :)
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