Avatar billede Fujairah Nybegynder
04. december 2009 - 23:44 Der er 12 kommentarer

Dato format i Access og på hjemmesider

Når min hjemmeside sender 01-12-2009 (december) til databasen bliver det lagret som 12-01-2009 (januar)
mm/dd/yyyy  kontra dd/mm/yyyy
Hvad gør man lige ved det?

I min endeløse søgen på den bedste måde at arbejde med datoer i databaser, har jeg fundet en del facts som måske kan være andre til gavn. Desværre har det ikke bragt mig frem til den endelige løsning.
Jeg håber derfor på et par kvalificerede råd fra bedre vidende.

FACTS (ret mig hvis jeg tager fejl):

Når datoer er lagret i en Access database:
1) MS-Access standard datoformat er altid: mm/dd/yyyy
2) Uanset hvilket datoformat du sætter Access til at vise, så er det kun visuelt, da datoer lagres som en talværdi.
Denne talværdi er altid udregnet fra datoen 30. december 1899 (før eller efter). Værdien for 7. juli 1993 er således lagret i Access som 34157, altså 34.157 dage efter nævnte dato (dato før angives som negativ værdi).
3) Format, input-mask, validation-rule og hvad der ellers er af muligheder i Access er kun gældende for hvordan du bruger og oplever datoer i Access programmet - intet ændrer på selve datoens værdi.
4) Du kan sætte din webserver til en hvilken som helst landekode/sprog du måtte ønske, men det ændrer stadig kun på hvordan du SER datoer - ikke hvordan de lagres i Access.

Når datoer skal vise:
1) Når man skal vise datoer på en hjemmeside, kan man vælge hvordan man ønsker datoen vist på flere måder.
Man kan inkludere et LCID kald i sit script, hvor man sætter/tvinger en landekode, der bestemmer i hvilket format man bl.a. ønsker datoer og decimaltal vist (uanset betragterens landekode).
2) Man kan også benytte en kode omkring den enkelte dato, som f.eks. i asp "FormatDateTime(todaysDate,2)" for at vise datoen i forskellige formater (her ,2 for ShortDate).

Når datoer skal lagres i en Access database?
Da intet af ovenstående ændrer på lagring af datoer i Access, vil de altid blive modtaget "forkert", når de afsendes fra hjemmesiden i et andet format end mm/dd/yyyy.
Hvad er så den bedste løsning hvis man på sin hjemmeside* har et inputfelt eller en pop-up-kalender på "dansk" og derefter skal uploade værdien til databasen? (*I mit tilfælde asp).
Er vi ude i noget med at dele op i dag, måned og år hver for sig?
Er det løsningen at skifte mellem text-strings og datoer?
Eller noget helt tredje?

MVH
Michael

100P. Forstår ikke helt det med points men er sikker på at mange andre end jeg vil give deres højre arm for den gyldne løsning!
Avatar billede keysersoze Guru
04. december 2009 - 23:50 #1
mm-dd-yyyy - det er sådan du access forventer en dato.
Avatar billede arne_v Ekspert
05. december 2009 - 01:31 #2
Hvis du:
- fortæller brugeren hvilket format de skal bruge
- konverterer den streng de angiver til en Date/DateTime type i din web applikation
- giver dem en fejlmeddelelse hvis formatet er forkert
- gemmer i databasen ved hjælp af parameters/prepared statement
så går det ikke helt galt.
Avatar billede Fujairah Nybegynder
07. december 2009 - 09:36 #3
Tak for svarene,
Til Keysersoze: Når jeg skiver at MS-Access standard datoformat altid er: mm/dd/yyyy skal det lige forstås rigtigt.
Hvis din weservers regionale settings f.eks. er dansk standard, forventer den rigtig nok dd/mm/yyyy. Men uanset instillinger vil Access benytte mm/dd/yyyy hvis du sender en dato som er "ambiguous" - eller som Microsoft formulerer det: "Access interprets non-specified dates in US form, i.e., mm/dd/yyyy".
Kunsten er altså at sende en dato til access som ikke kan misforstås. Benytter man en standard form/submit bliver indtastningen 03-12-2009 sendt som 3/12/2009 (ambiguos) og bliver lagret som 12/3/2009.
Om en kode, der indsætter 0 foran måske kan gøre forskellen, vil jeg derfor prøve at teste.
Fandt lige en italiener med samme ide: http://www.4guysfromrolla.com/webtech/tips/t022202-1.shtml
Avatar billede keysersoze Guru
07. december 2009 - 10:00 #4
hvis en indtastning i din kode ændres lyder det til at være et kodeproblem, indtastes det korrekt vil ingenting kunne misforstås - så jeg tror det kræver at du viser os den kode du benytter.
Avatar billede Fujairah Nybegynder
07. december 2009 - 10:05 #5
Tak for svar til arne_v: Den ultimative løsning - korrekt!
Håbede blot på en nemmere løsning(=:

Forudsat indtastede dato er korrekt (bl.a. fordi jeg benytter en pop-up kalender). Forudsat verificering af datoen er foretaget og godkent. Har du et eksempel på hvordan man derefter laver et "prepared statement" ud fra et dato form-felt?

Access Database: retsodont.mdb
Table: Nyhedsbrev
TableField: StartTime

Medlemsnyt.asp
FormField: StartTime[i]

PFT
Michael
Avatar billede Fujairah Nybegynder
07. december 2009 - 10:33 #6
Til keysersoze, tak dit svar.
Der er nok kvajebajer fra min side . . .
Jeg benytter et script fra Adobe som jo bekendt er et amerikansk firma. Lur mig om de ikke piller ved datoen inden de sender den til serveren? Det kan også forklare mine problemer med decimaltegn. Desværre er scriptet for omfattende og teknisk til at jeg selv forstår ret meget af den.

Her kan du se scriptet: http://retsodont.dk/script6.html

Siden kalder scriptet således:
<%@ Language=VBScript%>
<!-- #INCLUDE VIRTUAL="/config/include/utils.runtime6.asp" -->
<!-- #INCLUDE VIRTUAL="/config/include/ado.runtime6.asp" -->
<% Session.LCID = 1030 %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <%'GoLive Content Source
          set Nyhed = ADORecordSet("retsodont" , "select * from Nyhedsbrev where ID = " & Request("EditID") & "", "block=0", "ID", "Nyhed")
        %>
    </head>
    <body>
        <form action='config/actions/ado.actions6.asp?<%=URLArgs()%>' method="post" name="UpdateKalender">
            <table border="0" cellspacing="0" cellpadding="0">
                <tr>
                    <td><input type="text" name='StartTime[<%=Nyhed.AbsolutePosition%>]' id="SendDate" value='<%=fixHTMLquotes(Nyhed.Value("StartTime"))%>' size="24">
                    </td>
                </tr>
                <tr>
                    <td><input type="submit" name="$SubmitChanges" value="Opdater" <%SetupADOUpdate "PageMedlemsnyt.asp", "config/actions/glerror.asp", Nyhed%>></td>
                </tr>
            </table>
            <% SetupADOForm Nyhed %>
        </form>
    </body>
</html>
Avatar billede Fujairah Nybegynder
07. december 2009 - 11:12 #7
Tak for dit svar keysersoze,
Måske står den på kvajebajer fra mig?
Jeg benytter nemlig et script fra Adobe, der som bekendt er et amerikansk firma. Lur mig om de ikke piller ved datoen inden den uploades til databasen? Det kan også forklare mine problemer med decimaltal.
Desværre er scriptet for omfattende og teknisk til at jeg forstår det. Har du tid og lyst til at se på det, kan du hente det her:
http://retsodont.dk/script6.html

Min side kalder/benytter scriptet således:
<%@ Language=VBScript%>
<!-- #INCLUDE VIRTUAL="/config/include/utils.runtime6.asp" -->
<!-- #INCLUDE VIRTUAL="/config/include/ado.runtime6.asp" -->
<% Session.LCID = 1030 %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <%'GoLive Content Source
          set Nyhed = ADORecordSet("retsodont" , "select * from Nyhedsbrev where ID = " & Request("EditID") & "", "block=0", "ID", "Nyhed")
        %>
    </head>
    <body bgcolor="#ffffff" leftmargin="0" marginheight="0" marginwidth="0" topmargin="0">
        <form action='config/actions/ado.actions6.asp?<%=URLArgs()%>' method="post" name="UpdateKalender">
            <table border="0" cellspacing="0" cellpadding="0">
                <tr>
                    <td><input type="text" name='StartTime[<%=Nyhed.AbsolutePosition%>]' id="SendDate" value='<%=fixHTMLquotes(Nyhed.Value("StartTime"))%>' size="24" onclick="showCalendar()">
                    </td>
                    <td><input type="submit" name="$SubmitChanges" value="Opdater" <%SetupADOUpdate "PageMedlemsnyt.asp", "config/actions/glerror.asp", Nyhed%>></td>
                </tr>
            </table>
            <% SetupADOForm Nyhed %>
        </form>
    </body>
</html>

*****
PFT
Michael
Avatar billede keysersoze Guru
07. december 2009 - 13:46 #8
Der er ingenting i ovenstående kode der gemmer - der skal vi umiddelbart over at kigge i ado.actions6.asp.
Avatar billede Fujairah Nybegynder
07. december 2009 - 16:05 #9
Jeg har selv prøvet at kigge lidt på ado.action6 scripted.
Kan hentes her: http://retsodont.dk/script6.html

Hvis ellers jeg forstår det ret, så bliver der ændret på bl.a. dato-formater for at sikre at de sendes i "globalt" format.
Se sektionen:
// Inserts provider-specific annotations (quotes, brackets, etc.) around values
// based on their type and use.  Uses globals "datatypes" and "connection".


Er det muligt at ændre i scripted så det ikke piller ved datoen eller så det sender i andet format end "globalt"?

Venligst
Michael
Avatar billede keysersoze Guru
07. december 2009 - 18:41 #10
Det er formentlig muligt men det er ikke noget jeg vil pille ved - hvis man ikke ved hvad man arbejder med kan sådanne fejl let opstå, så medmindre du har ne grund til at beholde det nuværende ville jeg foreslå at lave koden selv og få 100% styr på hvad der sker.
Avatar billede Fujairah Nybegynder
07. december 2009 - 20:28 #11
Jeg er desværre ikke istand til at kode siden selv.
Alle mine sites er bygget med Adobe GoLive, der indsætter moduler af koder, ud fra mine valg på en grafisk brugerflade. Bagved liggende scripts som ado.action6.asp - der får det hele til at virke på Adobes lidt specielle måde.
Mine evner rækker kun til bagefter at indsætte/tilføje diverse snippets/funktioner, jeg finder på nettet. (Det virker så heller ikke altid).
Jeg tror på sigt den bedste løsning var om jeg fik tilrettet en "dansk" udgave af ado-scriptet, til fremtidig brug.

Du skal have tak for at spore mig ind på en løsning, som jeg nu kan google lidt på, inden jeg "lejer" en programmør.
Skal også lige have testet funktionen med at sætte "0" foran og se om det virker i ado-scriptet . . .
Avatar billede keysersoze Guru
05. april 2010 - 11:34 #12
lukketid?
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