06. oktober 2002 - 13:35Der er
30 kommentarer og 1 løsning
IsDate() og '31-09-02'
Jeg har en dato i en textbox som jeg gerne vil validere for gyldighed vha. IsDate(). Datoen '31-09-02' opdages bare ikke af IsDate(), mens '31-09-2002' faktisk opdages som en ugyldig dato.
Da jeg godt vil give en passende besked til brugeren, hvis denne indtaster '31-09-02' gik jeg igang med at lave en funktion til opdagelse af sådanne datoer og her ville jeg uddrage Day(), Month() og Year(). Når jeg gør det, optræder der det fænomen, at Access åbenbart tolker på datoen, således at '31-09-02' tolkes til
Day: 2 Month: 9 Year: 1931
Tilsvarende tolkes '29-02-02' til
Day: 2 Month: 2 Year: 2029
Er det et kendt fænomen? Kan man omgå denne tolkning, så også datoer som '31-09-02' kan fanges?
I et stadigt mere komplekst trussel landskab, hvor sofistikerede cyberangreb, ransomware og datalækager udgør en konstant risiko, er IT-sikkerhed for længst rykket direkte ind i bestyrelseslokalet.
neesgaard > der har været adskillige spørgsmål ang. dato. Jeg mener at kunne huske, at Access opfatter datoen som et amerikansk (engelsk) datoformat. Du kan sikkert benytte excession's forslag, men jeg vil nok tage tyren ved hornene, og ændre datofelterne, så de bliver i overensstemmelse med dansk format.
Min Access er en engelsk 2000. Både CDate() og DateValue() viser '02-09-31', når der indtastes '31-09-02' i tekstboxen, så det er jo nok det som Day(), Month() og Year() gør.
Jeg kan huske et spørgsmål engang om indsættelse af en dato i en SQL og det er rigtigt, at konklusionen her var, at man skulle konstruere en dato på 'amerikansk'.
mugs: hvad tænker du på, når du siger dansk format? Selve indtastningen foregår som dd-mm-åå og det er også det, der står International i kontrolpanelet.
Faktisk er der 3 datoformater: En amerikansk, en europæisk og en ISO-standard. Den sidste blev indført for at undgå usikkerheden f.eks. på amerikanske og engelske(europæiske) fakturaer, men er aldrig slået igennem. Den sidste bruges også her i landet, dog kun af et mindretal. Rækkefølgen er: Europæisk dmå Amerikansk mdå ISO åmd.
Microsoft har fortaget et valg for det korte datoformat. Årene 00-29 tolkes som 2000-2029 og 30-99 som 1930-1999. Derfor de to årstal 2029 og 1931 i spørgsmålet.
ISO-formatet accepteres også som en dato i kontorpakken og derfor er det vist ikke umuligt at teste om en kort dato er lovlig. Men med 3 felter, dag, måned og år kan det gøres.
dato'er gemmes som kommatal i både Access VBA og i tabellen. problemmet er at VBA, forms, rapporter osv. benytter de datoformatter der er angivet i kontrolpanellet både ved input og output. Access SQL benytter usFormat: åååå-mm-dd uanset dine indstillinger i kontrolpanel.
Det er de formater JetSQL bruger - Du kan se hvilken din JetSQL bruger ved at lave en foresp og indtaste en dato i foresp-gitteret eks. #20-10-99# i SQLvisning har Access konvertert din dato til SQLformattet (eller hvad vi skal kalde det). min konverters til #10-20-1999#
I Visual Basic Help kan man se at US-datoformatet er mm-dd-yyyy. Til det oprindelige spørgsmål: Funktionen IsDate() undersøger ikke om datoen er lovlig, kun om det rent teknisk er en dato. Hvis du bruger funktionen DateValue kan du faktisk godt nøjes med et felt. Hvis du f.eks. EfterOpdatering skriver [DATO] = DateValue([DATO] ændres datoen til det lokale datoformat og du er sikker på at du regner på den rigtige dato. Der kommer en fejlmeddelse om forkerte datotyper hvis datoen f.eks. er 40-40-40. Hvis du vil teste om datoen er lovlig må du selv gør det. Dim Dag as Variant Dim Md as Variant Dim År as Variant Dag = Mid([DATO],1,2) Md = Mid(DATO],4,2) År = Mid([DATO],7,2)
hvorefter du med en funktion undersøger om dato, md og år (skudår) er lovlige datoer.
fynbohans -> Hvis brugeren har sat sin maskine op til dd-mm-åå, så virker uddragning af dag, måned og år jo fint. Men hvis nu brugeren skifter til åå-mm-dd, så følger DateValue, så vidt jeg kan se, med og så bliver det vel forkert at uddrage absolutte positioner med Mid?
Er selv nået til samme erkendelse ved at prøve forskellige datoer. For en dato som 31-09-02 vælger Access åbenbart det format, som gør datoen lovlig. Formatet tolkes altså som ISO-formatet, hvor årstallet står først. At indstille formatet i formularen Kort datoformat, er vistnok det samme som at bruge funktion DateValue(). Vender tilbage til det egentlige problem senere på dagen. Men et enkelt spørgsmål: Hvad er det for en dato? Hvis det altid er dags dato kan problemet løses ved at låse feltet og lade brugeren klikke på feltet og VedKlik skrive [DATO] = Date(),
Jeg har valgt at tjekke på, at året ikke er ekstremt fremtidigt eller fortidigt - ikke elegant, men det kan gå.
Synes godt om
Ny brugerNybegynder
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.