Avatar billede Kim Neesgaard Seniormester
06. oktober 2002 - 13:35 Der 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?
Avatar billede excession Nybegynder
06. oktober 2002 - 13:40 #1
Avatar billede excession Nybegynder
06. oktober 2002 - 13:41 #2
jeg ville bruge CDate()
Avatar billede mugs Novice
06. oktober 2002 - 13:56 #3
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.

Prøv at søge i tidligere spørgsmål.
Avatar billede excession Nybegynder
06. oktober 2002 - 14:51 #4
det kommer an på hvilken version af Access det er

jeg har en dansk version og den opfatter fint dansk datoformat
Avatar billede mugs Novice
06. oktober 2002 - 14:54 #5
excession > Ok, men hvilken version har neesgaard? Det er jo det som er afgørende, hverken din eller min version :o)
Avatar billede excession Nybegynder
06. oktober 2002 - 15:00 #6
det er rigtigt, men jeg tror ikke at det er hans version den er gal med :)

jeg tror simpelthen at de datoer som indtastes ikke bliver opfattet som datoer

det finder vi nok snart ud af :)
Avatar billede mugs Novice
06. oktober 2002 - 15:06 #7
excession > jeg er enig i, at data ikke sikkert ikke opfattes som datoer. Som jeg kemmenterede tidligere: Taf tyren ved hornene.

Jeg vil gætte på, at datofeltet er et tekstfelt, og så kan dit forslag om Cdate() sandsynligvis benyttes.

Jeg er dog tilhænger af, at en forkert felttype rettes til det korrekte. Og så må man gøre det arbejde der følger med denne beslutning.
Avatar billede Kim Neesgaard Seniormester
06. oktober 2002 - 15:12 #8
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'.
Avatar billede excession Nybegynder
06. oktober 2002 - 15:15 #9
så havde mugs ret :)
Avatar billede excession Nybegynder
06. oktober 2002 - 15:18 #10
Ok så dit datofelt er amerikansk datofelt?

jeg ved ikke helt hvordan det fungerer i access, men man kan godt lave VBScript funktioner ikke?
Avatar billede Kim Neesgaard Seniormester
06. oktober 2002 - 15:42 #11
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.
Avatar billede mugs Novice
06. oktober 2002 - 15:45 #12
neesgaard > Hvad er felttypen i tabellen?
Avatar billede fynbohans Nybegynder
06. oktober 2002 - 15:49 #13
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.
Avatar billede mugs Novice
06. oktober 2002 - 15:52 #14
fynbohans > Vil du se på dette:

http://www.eksperten.dk/spm/251406
Avatar billede mugs Novice
06. oktober 2002 - 15:54 #15
Jeg synes iøvrigt, at forvirringen breder sig:

http://www.eksperten.dk/spm/266424
Avatar billede Kim Neesgaard Seniormester
06. oktober 2002 - 15:57 #16
Felttypen i tabellen er Date/Time.
Avatar billede mugs Novice
06. oktober 2002 - 16:00 #17
Prøv at åbne en ny database, og eksperimenter lidt med inputmasker m.v. i datofelter.
Avatar billede nih Novice
06. oktober 2002 - 17:04 #18
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.

blot en kommentar
Niels
Avatar billede Kim Neesgaard Seniormester
06. oktober 2002 - 17:20 #19
fynbohans -> lyder som en god ide! Når du så har dag, måned og år, hvordan vil du så danne datoen?

mugs -> dette spørgsmåls sidste kommentar synes jeg berettigede til et selvstændigt spørgsmål.

nih -> er us format ikke år-dag-måned?
Avatar billede Kim Neesgaard Seniormester
06. oktober 2002 - 17:21 #20
nih -> undskyld - er us format ikke som fynbohans skriver: måned-dag-år?
Avatar billede excession Nybegynder
06. oktober 2002 - 17:32 #21
du laver datoen som du gjorde før med:dato = Year() & "-" & Month() & "-" & Day()

når jeg skal indsætte datoer, på formattet yyyy-mm-dd, i databaser, så gør jeg det sådan her:

dato = Datepart("yyyy",brugerensDato) &"-"& DatePart("m", brugerensDato) &"-"& DatePart("d", brugerensDato)
Avatar billede nih Novice
06. oktober 2002 - 17:57 #22
mm-dd-yyyy  eller yyyy-mm-dd

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#

Niels
Avatar billede nih Novice
06. oktober 2002 - 18:32 #23
neesgaard -> har du 'leget' med egenskaberne format og inputmaske for textboxen. De virker ligesom i tabeldesign.

Niels
Avatar billede Kim Neesgaard Seniormester
06. oktober 2002 - 18:51 #24
nih -> Nej - jeg har ikke haft tid til det og får det heller ikke i aften, men jeg prøver i morgen!
Avatar billede fynbohans Nybegynder
06. oktober 2002 - 18:53 #25
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.
Avatar billede Kim Neesgaard Seniormester
08. oktober 2002 - 20:43 #26
nih -> Inputmaske ser rigtig god ud - den vil jeg bruge til mine øvrige datofelter, men så vidt jeg kan se, kan den ikke tjekke for en ulovlig dato.

fynbohans -> Tak, dette vil jeg prøve til de datofelt, der skal gemmes i tabellen og senere bruges aktivt i programmet.
Avatar billede Kim Neesgaard Seniormester
09. oktober 2002 - 20:57 #27
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?
Avatar billede fynbohans Nybegynder
10. oktober 2002 - 13:01 #28
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(),
Avatar billede fynbohans Nybegynder
10. oktober 2002 - 13:04 #29
FORTSAT
som vælger systemets dato, som så skal være indstillet korrekt.
Avatar billede Kim Neesgaard Seniormester
10. oktober 2002 - 17:59 #30
Desværre er det ikke altid dags dato, men kan også være en dato tilbage i tiden.
Avatar billede Kim Neesgaard Seniormester
15. januar 2003 - 23:13 #31
Jeg har valgt at tjekke på, at året ikke er ekstremt fremtidigt eller fortidigt - ikke elegant, men det kan gå.
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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