Du skal konsekvent skrive datoer til Access (og andre databaser) i formatet: MM-DD-YYYY. Specielt hvis du anvender LCID = 1030 for så vil Now jo anvende formatet: DD-MM-YYYY.
Access vender altid om på måned og dag "hvis det giver en korrekt dato" Hvis det giver en ukorrekt dato vil den acceptere DD-MM-YYYY og det er det farlige ved det.
Eksempel: SQL = "update tabel set dato='#03-10-2002#'" Access ser datoen som MM-DD-YYYY og gemmer datoen som 10-Marts-2002
SQL = "update tabel set dato='#23-12-2002#'" Access ser datoen som MM-DD-YYYY og opdager at det bliver en forkert dato hvorefter den acceptere at det er DD-MM-YYYY og gemmer datoen som 23-December-2002
Hvis du ikke tror på det bliver du mere overrasket. ASP anvender nemlig samme ulogiske metode intern. (Kommandoen CDate)
Det eneste du kan gøre er at anvende MM-DD-YYYY i SQL-sætninger. Eks1: SQL = "update tabel set dato='#10-03-2002#'" ' Access gemmer korrekt 3-Okt-2002 Eks2: SQL = "update tabel set dato='#12-23-2002#'" ' Access gemmer korrekt 23-Dec-2002
Når du så henter datoerne frem fra databasen og skal vise dem skal du ikke ændre dem da LCID = 1030 nok skal sørge for at de vises korrekt.
Så du må altså ikke anvende denne: rs("Dato") = Now sammen med denne: Session.LCID = 1030 for så vil Now være i formatet DD-MM-YYYY når datoen gemmes og det bytter Access straks om på.
Jamen Coltau - hvis du har ret i det du skriver, hvorfor vil den så skrive det RIGTIGE dato-format i min første eksempel, men når jeg så efterfølgende retter i den tabel via det andet eksempel, så skriver den det FORKERTE dato-format når den opdaterer !!!
Du mener altså at der er forskel på de to eksempler som du viser. 1. Indsæt med OpenKeyset giver korrekt dato. ? 2. Update med SQL-sætning giver forkert dato. ?
sub InsertDato Set RS = Server.CreateObject("ADODB.Recordset") RS.Open "select * from upddato", objConn, 1, 3 RS.AddNew RS("Dato") = Now ' Anvender DD-MM-YYYY RS.Update end sub
sub UpdateDato Set RS = Server.CreateObject("ADODB.Recordset") RS.Open "select * from upddato where ID=1", objConn, 1, 3 RS("Dato") = Now ' Anvender DD-MM-YYYY RS.Update end sub
sub SQLUpdateDato ' Anvender MM-DD-YYYY objConn.Execute("update upddato set dato=#" & Now & "# where ID=1") end sub
sub SQLInsertDato ' Anvender MM-DD-YYYY objConn.Execute("insert into upddato (dato) values (#" & Now & "#)") end sub
Coltau - ja, det er nemlig sk... irriterende - jeg håber du kan finde frem til en løsning (jeg kan ikke)! Så siger du bare hvor mange point du vil have (er der ikke et loft på 200 *S*)
Hvis det havde været Delphi/Pascal havde jeg ikke været et sekund i tvivl om at der er forskel på de to metoder. (Alle variable i Pascal er typedefineret og skal altid typekonverteres i forhold til den sammenhæng de anvendes i.)
I SQL-sætningen oversættes datoen (Now) fra ASP-internt/binært format til tekst og der anvendes Session.LCID, hvilket giver formatet: DD-MM-YYYY. Når SQL-sætningen sendes til Access skal datoen oversættes fra tekst til det binære format i databasen. På det tidspunkt ved SQL-oversætteren ikke noget om ASP eller LCID så den oversætter datoen ud fra egne kriterier som er MM-DD-YYYY.
I det andet tilfælde (RS("dato") = Now) skal datoen (Now) ikke oversættes til tekst men sendes til Access i det interne format (som databasen ønsker) direkte, hvilket gør at der ikke ændres på dag og måned.
Hvorfor vi bliver forvirret er fordi variabler i ASP er "sent bundet" eller typeløse. Det betyder at vi ikke bemærker den forskel der egentlig er på de to sætninger.
Eks 1. objConn.Execute("update upddato set dato=#" & Now & "# where ID=1") I dette tilfælde bliver Now typekonvertert til en string. (tekst)
Eks 2. RS("dato") = Now I dette tilfælde bliver Now anvendt som det binære format det repræsentere i ASP.
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.