/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Dato-trøbbel
Fra : Kenneth


Dato : 27-10-02 13:30

Jeg har litt trøbbel med en dato-spørring.
I utgangspunktet skulle dette være en greit sak...jeg ønsker nemlig å styre
hvilke saker som skal vises og hvilke som ikke skal vises.
Jeg har gjort det enkelt ved å opprette et felt i min (Access) database som
jeg har kalt "Utlopsdato". Dette har jeg satt til "Text" siden jeg
benytter en kalender til å velge hvilken dato som skal være utløpsdato.
Spørringen skulle da være greit nok:

Set RS = Kopling.Execute("SELECT * FROM Informasjon WHERE Utlopsdato >= '" &
Date() & "' ORDER BY Utlopsdato")

Resultatet blir derimot ikke som ønskelig. Det som skjer er at recordsettet
lister ut alle poster som har de to første verdiene i datoen større enn
dagens dato.
Dvs. den sorterer ikke etter dato (kan det se ut som). Dette betyr at poster
som har 27 (format 27.10.2002) og opp til 31 vises, men ikke datoer under
den 27.
Hvis jeg jeg setter feltet "Utlopsdato" til Date/Time får jeg feilmelding om
at feltet innheolder ugyldige tegn.

Hva er det jeg gjør feil?


Kenneth



 
 
Jens Gyldenkærne Cla~ (27-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 27-10-02 14:32

Kenneth skrev:

> Jeg har gjort det enkelt ved å opprette et felt i min (Access)
> database som jeg har kalt "Utlopsdato". Dette har jeg satt til
> "Text" siden jeg benytter en kalender til å velge hvilken dato
> som skal være utløpsdato.

Hvilken kalender bruger du? Hvorfor skulle det være praktisk at
gemme i tekst på grund af kalenderen.

> SELECT * FROM Informasjon WHERE Utlopsdato >= '" & Date() & "'

Det går - som du har set - ikke godt. Når du skal sammenligne
datoer kan du bruge to forskellige metoder. Enten konvertere til et
passende tekstformat på begge sider og sammenligne, eller også
sammenligne datoværdier på begge sider. Begge dele kan volde lidt
problemer.

Hvis du vil sammenligne tekstfelter skal du bruge et datoformat der
lister de største enheder (år, måneder) først og de mindste
(minutter, sekunder) sidst - altså fx 2002.10.04:12.02.
Skilletegnene er ikke så vigtige - 200210041202 kan lige så godt
bruges som den første værdi jeg angav. Det er til gengæld vigtigt
at værdier mindre end 10 får et foranstillet 0.
Denne metode er forholdsvis let at håndtere når du skal gemme data,
mens du måske skal pusle lidt for at få uddata fra date()-
funktionen til at passe med dit format (Jeg mener at du kan bruge
en format-funktion uden om date - men jeg kan ikke huske det. Prøv
onlinehjælpen).

Hvis du i stedet sammenligner datoer består problemet i at få
indtastet dato opfattet korrekt. Dansk standard er dd-mm-yyyy, mens
den amerikanske standard omvendt er mm-dd-yyyy - og de to kan jo
nemt forbyttes. En ret idiotsikker måde at konstruere en dato på er
via funktionen DATESERIAL. Den tager tre heltal som argumenter -
hhv. år, måned og dag - og returnerer en datoværdi.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

Kenneth (27-10-2002)
Kommentar
Fra : Kenneth


Dato : 27-10-02 15:17


"Jens Gyldenkærne Clausen" skrev:

> Hvilken kalender bruger du? Hvorfor skulle det være praktisk at
> gemme i tekst på grund af kalenderen.

Jeg bruker an vanlig JS-kalender (Popup) og grunnen er at da slipper man å
lure på hvilket format man skal skrive inn.
Kalenderen tvinger nemlig formatet inn som dd.mm.yyyy

> Når du skal sammenligne
> datoer kan du bruge to forskellige metoder. Enten konvertere til et
> passende tekstformat på begge sider og sammenligne, eller også
> sammenligne datoværdier på begge sider. Begge dele kan volde lidt
> problemer.


Jeg har forsøkt å kjøre min SQL med en dato-funksjon slik:

Function IDag()
dim dato, dd, d, m, y
dd = Date()
d = "0" & Day(dd)
m = "0" & Month(dd)
Dag = right(d, 2) & "." & right(m, 2) & "." & Year(dd)
IDag = Dag
End Function


Set rs = Con.Execute("SELECT * FROM Info WHERE Utlopsdato <= '" & IDag & "'
ORDER BY Utlopsdato")

Og da er jo begge formatert ikke sant? Men dette gir samme resultat.

Har du et konkret tips til meg. Hvordan ville du løst dette konkrete
eksemplet?

Mvh

Kenneth





Jens Gyldenkærne Cla~ (28-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 28-10-02 00:13

Kenneth skrev:

> Jeg har forsøkt å kjøre min SQL med en dato-funksjon slik:
>
> Function IDag()
> dim dato, dd, d, m, y
> dd = Date()
> d = "0" & Day(dd)
> m = "0" & Month(dd)
> Dag = right(d, 2) & "." & right(m, 2) & "." & Year(dd)
> IDag = Dag
> End Function

Så vidt jeg kan gennemskue din funktion, så vil den returnere
datoen i et (tekst)format der svarer til det du får ud fra din JS-
kalender. Men - det er ikke nok at datoerne er formateret ens når
du skal sortere på dem som tekstværdier. Prøv at se følgende
eksempel:

"23.12.2003"
"14.03.2002"
"05.10.2004"

Hvis jeg sorterer de tre værdier kommer de ud i rækkefølgen

"05.10.2004"
"14.03.2002"
"23.12.2003"

- fordi en tekstsortering sammenligner ét tegn ad gangen, startende
fra venstre mod højre. I eksemplet herover er det nok at se på det
første tegn i hver værdi - hhv. "0", "1" og "2". Det dur ikke når
værdierne skal opfattes som datoer. Du skal formatere begge
datoværdier således at årstal står før måneder som igen står før
dage (yyyy.mm.dd). På den måde kan du sortere korrekt, selv om
værdierne stadig opfattes som tekst.

> Har du et konkret tips til meg. Hvordan ville du løst dette
> konkrete eksemplet?

Jeg ville lave en funktion der tog værdien fra din JS-kalender som
parameter og returnerede en dateserial-kommando til at lægge over i
Access. Noget i retning af:

Function formatAccessDato(jsDato)
   dim datoArray
   datoArray = Split(jsDato, ".")
   formatAccessDato = "Dateserial(" & datoArray(2) " & _
                   ", " & datoArray(1) & _
                   ", " & datoArray(0) & ")"
End Function

Den funktion skal så bruges til at lægge datoer ind i feltet
Utlobsdato:

INSERT INTO Info (Utlobsdato) VALUES formatAccessDato(jsdatoværdi)


Så kan du opbygge din selectsætning således:

SELECT * FROM Info WHERE Utlopsdato <= DATE() ORDER BY Utlopsdato
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

Kenneth (28-10-2002)
Kommentar
Fra : Kenneth


Dato : 28-10-02 16:17


"Jens Gyldenkærne skrev:

> Den funktion skal så bruges til at lægge datoer ind i feltet
> Utlobsdato:
>
> INSERT INTO Info (Utlobsdato) VALUES formatAccessDato(jsdatoværdi)

Hmm...okay....
Men hvordan putter jeg så inn formatAccessDato i en AddNew?
Jeg bruker denne nå:

sqlstmt.Fields("Utlopsdato") = Request.Form("Utlopsdato")

Kenneth




Jens Gyldenkærne Cla~ (28-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 28-10-02 16:30

Kenneth skrev:

> Men hvordan putter jeg så inn formatAccessDato i en AddNew?

Dateserialfunktionen er en VBScript-funktion - så hvis du ellers
benuytter VBscript i din aspkode kan du bare bruge den som om du
var i Access.

Altså:

sqlstmt.Fields("Utlopsdato") = Dateserial(yyyy, mm, dd)

Den funktion jeg lavede før kan ændres så den i stedet for at
returnere en tekst med Dateserial(xxxx, yy, zz) returnerer værdien
af funktionen Dateserial(xxxx, yy, zz). Så kan du skrive
funktionskaldet direkte efter lighedstegnet.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408952
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste