Avatar billede kimsand Nybegynder
05. september 2014 - 13:09 Der er 17 kommentarer og
2 løsninger

insert en dato opfører sig pludseligt mærkeligt.

Jeg tager en dato fra en tekstboks i en form som har formatet kort datoformat, og som har inputmaske 00-00-0000;;_

Så lægger jeg den ned i en variabel der er defineret som en date
Dim dato as date

dato = Format([Forms]![FM_book_lokale]![dato], "dd-mm-yyyy", vbMonday, vbFirstFourDays)

SÅ bliver det mærkeligt.

Jeg laver så nogle check for at se om der er en booking af et rum på den dato i det tidsrum der er indtastet. Her bruger jeg  dato variablen. Der er 2 mere end illustreret

where1 = "[IDrum]= " & rum & " AND [dato] = #" & dato & "# AND [starttid] <= #" & frakl & "# AND [sluttid] >= #" & frakl & "#" ' kan man finde en post hvor starttiden ligger indenfor starttid og sluttid på rum og dato
reswhere1 = DCount("*", "F_rum_paa_dato_og_tid", where1)

hvis der ikke er andre bookinger får brugeren lov til at booke rummet. MEN når jeg inserter

    DoCmd.RunSQL ("INSERT INTO DT_tilbudskalender (IDtilbudsbeskrivelse, IDrum, IDmedarbejder, dato, gruppestempel, starttid, sluttid, aktiv) Values (" & tilbudsbeskrivelse & ", " & rum & ", " & medarb & ", #" & Format(dato, shortdate, vbMonday, vbFirstFourDays) & "#, 'enkeltvis', #" & TimeValue(frakl) & "#, #" & TimeValue(tilkl) & "#," & akt & ")")

Her bruger jeg også dato, som jeg igen for en sikkerheds skyld formatterer dd-mm-yyyy.

problemet er så at hvis det eks. er d. 8-9-2014, så bliver det lavet om til 9-8-2014

Jeg har debugget, og helt ned til inserten, står den rigtige dato i dato variablen, men når jeg laver insert, så bliver den lavet om, selvom jeg formatterer den i insert sætningen.

Feltet dato i databasen er dato og klokkeslæt type, format kort datoformat inputmaske  00-00-0000;;_

Er der nogen der kan gennemskue problemet ?

Det mærkeligste er at jeg masser andre gange inserter en dato i tabellen, og det virker fint, og selvom jeg kopierer fremgangsmåden så virker det ikke.
Avatar billede terry Ekspert
05. september 2014 - 13:53 #1
I would always suggest using dates in YYYY/MM/DD format
Avatar billede terry Ekspert
05. september 2014 - 13:54 #2
Feltet dato i databasen

The field in the database is ALWAYS stored in same way. Format and inputs mask are only visual
Avatar billede bvirk Guru
05. september 2014 - 14:23 #3
Man kan næsten at du har konkluderet dig frem til hvordan det forholder sig - og det man emperisk efterviser er hvad gælder!

Når du anvender dato 'på bogstavelig vis' i sql udtryk skal det skrives på amerikansk: mm-dd-yyyy.
Det giver også lidt mening at 'sql engine' ikke er locale afhængig. (nationale konvertioner for tal og datoers skrivemåde)

Hvis vi har en Tabel D med indholdet i datasheet
dato
09-08-2014
15-08-2014
Det er d. 9 og 15 august der efter nationale præsentations standarder



sql udtrykket select * from D where dato >= #9-8-2014#
giver ikke nogle poster da #9-8-2014# opfattes som d. 8 september

select * from D where dato >= #13-8-2014# kan ikke konverteres efter amerikansk standard, så der en post i  select * from D where dato >= #13-8-2014#

select * from D where dato >= cvdate("9-8-2014") viser 2 poster fordi "9-8-2014" IKKE ingår bogstaveligt i sql udtrykket. sql engine modtager et navn på en funktion og parameter hvormed funktionen skal kaldes og bruger funktionens returværdi, en dato, i en sql select betingelse.

At cvdate's argument også kan være et udtryk af typen date, ses at at følgende har 0 poster
select * from D where dato >= cvdate(#9-8-2014#)
Avatar billede kimsand Nybegynder
05. september 2014 - 15:10 #4
Mange tak for jeres tilbagemeldinger...

bvirk, skal jeg forstå det således at når jeg inserter, skal jeg formattere på amerikansk, selvom det er indtastet og står i variablen formatteret på dansk.

så står det på amerikansk i databasen,

OG når jeg eks, skal generere et recordset med select, skal mit kriterie være formatteret på amerikansk ?

Det der er mest mærkeligt er at jeg har hundredevis af entries i den database lavet med et andet modul, som bare virker, hvor jer inserter dato formatteret på dansk, og det står fint, jeg kan søge med kriterier som også er formatteret på dansk, uden problemer. Men lige pludseligt kan jeg ikke gøre det :)
Avatar billede terry Ekspert
05. september 2014 - 15:30 #5
bvirk, skal jeg forstå det således at når jeg inserter, skal jeg formattere på amerikansk

Nej
You can either insert in

YYYYMMDD or MMDDYYYY
Avatar billede terry Ekspert
05. september 2014 - 15:40 #6
OG når jeg eks, skal generere et recordset med select, skal mit kriterie være formatteret på amerikansk ?


You can format the date as you want. If your PC's regional settings are set to Danish then they will show the data

DDMMYYYY but you can also use the format function to show dates in other formats.

As I mentioned previously, the way a date is stored in the dB is always the same. So as long as you enter it correctly then you can display it as you wish. If you enter it incorrectly then you wont be able to display it correctly no matter how you format it.
Avatar billede bvirk Guru
05. september 2014 - 19:06 #7
kimsand, du har fået svar af terry på hvordan datoer skal være formateret.

Det gælder når datoer skrives bogstaveligt i sql udtrykket. Måske burde man tillægge sig den vane at undgå det hvor det er muligt.

hvis kontrolelementet dato er bundet til felt af typen dato/klokkesæt, burde du kunne skrive:
dato = "[Forms]![FM_book_lokale]![dato]"

og så uden #'er om dato

where1 = "[IDrum]= " & rum & " AND [dato] = " & dato & " AND [starttid] <= #" & frakl & "# AND [sluttid] >= #" & frakl & "#" ' kan man finde en post hvor starttiden ligger indenfor starttid og sluttid på rum og dato
reswhere1 = DCount("*", "F_rum_paa_dato_og_tid", where1)
Avatar billede kimsand Nybegynder
08. september 2014 - 07:57 #8
I må virkeligt undskylde jeg er sku nok lidt tungnem her... tror ikke jeg forklarer mig rigtigt, eller også så forstår jeg ikke jeres svar, formentligt det sidste.

Det er ligemeget hvordan jeg formatterer, eller om jeg formatterer overhovedet, så laver den en indtastning i et felt 8-9-2014 om til 9-8-2014 når det står i databasen, hvilket betyder at når jeg så refresher den form lige bagefter hvor bookingen skal dukke op, så kommer den ikke for det er en forkert dato.

bvirk, hvad betyder "bogstaveligt" det når du skriver "Det gælder når datoer skrives bogstaveligt i sql udtrykket. Måske burde man tillægge sig den vane at undgå det hvor det er muligt."

Dit løsningsforslag betyder det at variablen dato skal være en streng så den kan indeholde "[Forms]![FM_book_lokale]![dato]"

Tak for al jeres hjælp.
Avatar billede kimsand Nybegynder
08. september 2014 - 08:19 #9
Hej igen :)

Nå jeg prøvede at formattere det indtastede i amerikansk format inden jeg lagde det i dato as date variablen.

Det var også det i skrev, det tog mig bare virkeligt lang tid at forstå :)

Det er dog mærkeligt at jeg, i en anden frontend der ved hjælp af løkker opretter tilbud i tilbudskalenderen, ikke har problemet, og ikke formatterer amerikansk inden jeg inserter...

Tak for hjælpen til jer begge. Kan i ikke smide et svar begge to, så deler jeg pointene ?
Avatar billede terry Ekspert
08. september 2014 - 08:40 #10
try replacing this part of the insert
Format(dato, shortdate, vbMonday, vbFirstFourDays)

with

Format(dato, "YYYY/MM/DD")
Avatar billede terry Ekspert
08. september 2014 - 08:46 #11
The field in the table isn't aware that your formatting your date

DD/MM/YYYY (08/September/2014) so after the date is inserted it ends up as

MM/DD/YYYY (August/09/2014)

So you have to format your date when inserting either MM/DD/YYYY or as I do YYYY/MM/DD
Avatar billede kimsand Nybegynder
08. september 2014 - 09:29 #12
Yep, exactly that was what i did.

What i don't understand is why it has worked previously without me doing it :)
Avatar billede terry Ekspert
08. september 2014 - 09:46 #13
I cant say why its worked previously although it could be that the month part (what you think is day) of the date  has been greater than 12 so Access has assumed that this was the day part.
EG  13/09/2014 MM/DD/YYYY access accepts it 13 September becuas ether is no month 13
12/09/2014 would be accepted as 09 December
Avatar billede bvirk Guru
08. september 2014 - 13:11 #14
Det er godt du har fået det virke. Ja det kan godt være indviklet når der pludseligt er flere faktorer end man egentligt har tid til at fordybe sig i.
At noget har 'virket før' og noget stadig virker med 'dd-mm' kan betyde at det skal kigges grundigt igennem - manglende '#' tegn kan give udefinerede resultater og datoer som #13/8-2014# forbliver d. 13 august
Det nærmest et dogme, at korrekthed ved dato/tidspunkt konverteringer skal testes indgående.

Forespørsler i office access har én, iøvrigt elles unyttig feature - man kan skive en list af expressions helt uden tabelangivelse - prøv denne:
  select #1/8-2014#-1,#13/8-2014#-1,cvdate("1/8-2014")-1

Bogstaveligt, som i vha. bogstaver, er min oversættelse af litteral (fra andre sammenhænge) - skulle nok snare have været tegnstaveligt ;)

Bemærk hvordan vi i:
  select dato1 from T where dato1 < dato2

slipper for at udtrykke os i tegnbaserede præsentationsformer. Man kan sige, om de 2 expressions på hver side af '<' tegnet, at evalueringen til værdier af typen date, forgår uden vi med tegn direkte skriver datoer. Vi har nogle referencer, her feltnavne.

Om din [Forms]![FM_book_lokale]![dato] ved jeg ikke om den er gået hen og blevet af type string. Det man teste ved at formen FM_book_lokale åbnes , og herefter spørge på udtrykket:
  typename([Forms]![FM_book_lokale]![dato])
i en select forespørsel eller ?... i  vba editorens immediate vindue

Hvis den er af typen date, er det at 'gå over åen efter vand' med konvertering til tegnstavelige datoer. (#7)

Det har været interessant at skrive dette, for denne 'fejl' har jeg lavet hundrevis af gange - har bevistløst påklistret kald til denne alle mulige steder:

Function amrDate(dat As Date)
    amrDate = "#" & Format(dat, "mm-dd-yyyy") & "#"
End Function
Avatar billede kimsand Nybegynder
10. september 2014 - 08:01 #15
I er sku fantastiske... :)

Tak for hjælpen, jeg lærer så sindsygt meget af jeres tråde :)

Smid lige et par svar så jeg kan kyle nogle point efter jer

Mvh Kim Sandberg
Avatar billede terry Ekspert
10. september 2014 - 08:22 #16
:-)
Avatar billede bvirk Guru
10. september 2014 - 10:47 #17
med hatten i hånden.
Avatar billede kimsand Nybegynder
12. september 2014 - 07:49 #18
Og tak for hjælpen :)
Avatar billede terry Ekspert
12. september 2014 - 10:24 #19
tak
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