Avatar billede rille101 Nybegynder
07. februar 2005 - 22:30 Der er 7 kommentarer og
1 løsning

Gemme dato i db med dansk datoformat

Jeg har en insertform hvor man kan skrive et indlæg til en database. I insertformen er der yderligere et hidden field med
<%=date()%> og her er mit problem. Datoerne bliver gemt f.eks. 02-07-2005 (selvom datoen er d.2 feb. 2005) i databasen. Det er altså ikke selve udtrækket der er problemet for når indlæggene vises, bliver de vist nøjagtig som i databasen selvom jeg bruger <%Session.LCID = 1030%> øverst på siden. Har prøvet flere forskellige datoformater i access, 02-07-2005 bliver i "langt datoformat" vist som 02 juli 2005. Har prøvet at fjerne alle datoformater og LCID, men det er siderne ligeglade med og viser bare mm-dd-yyyy.

Kan man ikke på een eller anden måde fortælle mit hidden field
<%=date()%> i insertformen at den skal gemme i dansk format?
dd-mm-yyyy
Avatar billede eagleeye Praktikant
07. februar 2005 - 22:34 #1
Når man bruger danske datoer og Access kan man opleve Access bytter rundt på måned og dag. Problemet opstår fordi Access bruger US eller UK dato format via SQL, som enten er yyyy-mm-dd eller mm-dd-yyyy.

Når man så indsætter en dato i dansk dato format som er dd-mm-yyyy, vil Access bytte rundt på dag og måned i datoen.

Der er en løsning og det er at bruge dato funktionerne Year, Month og Day til at formatere din dato.

Eks:

<%
dato = "02-07-2005"
strDato = Year(dato) & "-" & Month(dato) & "-" & Day(dato)
SQL = "SELECT * FROM tabelnavn WHERE dato = #" & strDato & "#"
%>
Avatar billede rille101 Nybegynder
08. februar 2005 - 11:31 #2
Hej Eagleeye
På hvilken side skal jeg skrive smørren ind, skal det være på siden der indsætter i tabellen, eller skal det stå på siden der udtrækker dataerne. og skal jeg stadig bruge <%Session.LCID = 1030%>
Mangler der et anførelsestegn i SQL'en? får en fejl i DW når jeg indsætter WHERE udtrykket. Har prøvet lidt af hvert på de forskellige sider, men hvis jeg ikke lige får fejl, så viser den stadigvæk datoen forkert.
Avatar billede eagleeye Praktikant
08. februar 2005 - 17:30 #3
Det skal være på den side som indsætter datoen. Hvis du køre med dansk datoformat på siden så kan du sætte <%Session.LCID = 1030%> ind den sikre datoerne vises som danske. Hvis ens server står til engelsk dato format må man indsætte <%Session.LCID = 1030%> på de sider der har noget med behandling af datoer.

Når man skal genne en dato i Access og kolonnen er af typen date/time så skal man bruge # omkring i SQL sætnigen. Access forventer datoen kommer i formetet yyyy-mm-dd eller mm-dd-yyyy så man skal lave det format.
du kan prøve sådan her når du indsætter:

<%
dato = "02-07-2005"
strDato = Year(dato) & "-" & Month(dato) & "-" & Day(dato)

SQL = "insert into tabelnavn (dato) values (#" & strDato & "#)"
%>
Avatar billede rille101 Nybegynder
09. februar 2005 - 17:23 #4
Hvis jeg sætter din kode direkte ind på min side (og ændrer "tabelnavn" til "guestbook" som tabellen hedder) ændrer det ikke noget.

havde i forvejen ikke en linje der lignede din (SQL = "insert into tabelnavn (dato) values (#" & strDato & "#)")

Men har denne:
MM_editQuery = "insert into " & MM_editTable & " (" & MM_tableValues & ") values (" & MM_dbValues & ")"

Er det her jeg skal skrive noget?
Avatar billede eagleeye Praktikant
09. februar 2005 - 18:06 #5
Ok du bruger DV. Ja det er så MM_dbValues  du skal havde fat i. Men variablen MM_dbValues indeholder nok også # før og efter datoen. Så et eller andet sted skal du finde hvor MM_dbValues bliver tilskrevet datoen og så formatere den med dato funktionerne.
Avatar billede rille101 Nybegynder
10. februar 2005 - 13:26 #6
Hvis jeg i access sætter mit datofelt til at skulle indeholde "tekst" i stedet for "dato og klokkeslæt". Så får jeg de rigtige udtræk. Men er det ikke en fuskerløsning???

Dette er den insert-kode som DW har genereret. Kan dog ikke finde ud af, hvor de forskellige felter bliver indsat...

<%
' *** Insert Record: set variables

If (CStr(Request("MM_insert")) = "form1") Then

  MM_editConnection = MM_connkim_STRING
  MM_editTable = "guestbook"
  MM_editRedirectUrl = "gaestebog.asp"
  MM_fieldsStr  = "navn|value|indhold|value|dato|value"
  MM_columnsStr = "navn|',none,''|indhold|',none,''|dato|',none,NULL"

  ' create the MM_fields and MM_columns arrays
  MM_fields = Split(MM_fieldsStr, "|")
  MM_columns = Split(MM_columnsStr, "|")
 
  ' set the form values
  For MM_i = LBound(MM_fields) To UBound(MM_fields) Step 2
    MM_fields(MM_i+1) = CStr(Request.Form(MM_fields(MM_i)))
  Next

  ' append the query string to the redirect URL
  If (MM_editRedirectUrl <> "" And Request.QueryString <> "") Then
    If (InStr(1, MM_editRedirectUrl, "?", vbTextCompare) = 0 And Request.QueryString <> "") Then
      MM_editRedirectUrl = MM_editRedirectUrl & "?" & Request.QueryString
    Else
      MM_editRedirectUrl = MM_editRedirectUrl & "&" & Request.QueryString
    End If
  End If

End If
%>
<%
' *** Insert Record: construct a sql insert statement and execute it

Dim MM_tableValues
Dim MM_dbValues

If (CStr(Request("MM_insert")) <> "") Then

  ' create the sql insert statement
  MM_tableValues = ""
  MM_dbValues = ""
  For MM_i = LBound(MM_fields) To UBound(MM_fields) Step 2
    MM_formVal = MM_fields(MM_i+1)
    MM_typeArray = Split(MM_columns(MM_i+1),",")
    MM_delim = MM_typeArray(0)
    If (MM_delim = "none") Then MM_delim = ""
    MM_altVal = MM_typeArray(1)
    If (MM_altVal = "none") Then MM_altVal = ""
    MM_emptyVal = MM_typeArray(2)
    If (MM_emptyVal = "none") Then MM_emptyVal = ""
    If (MM_formVal = "") Then
      MM_formVal = MM_emptyVal
    Else
      If (MM_altVal <> "") Then
        MM_formVal = MM_altVal
      ElseIf (MM_delim = "'") Then  ' escape quotes
        MM_formVal = "'" & Replace(MM_formVal,"'","''") & "'"
      Else
        MM_formVal = MM_delim + MM_formVal + MM_delim
      End If
    End If
    If (MM_i <> LBound(MM_fields)) Then
      MM_tableValues = MM_tableValues & ","
      MM_dbValues = MM_dbValues & ","
    End If
    MM_tableValues = MM_tableValues & MM_columns(MM_i)
    MM_dbValues = MM_dbValues & MM_formVal
  Next
  MM_editQuery = "insert into " & MM_editTable & " (" & MM_tableValues & ") values (" & MM_dbValues & ")"

  If (Not MM_abortEdit) Then
    ' execute the insert
    Set MM_editCmd = Server.CreateObject("ADODB.Command")
    MM_editCmd.ActiveConnection = MM_editConnection
    MM_editCmd.CommandText = MM_editQuery
    MM_editCmd.Execute
    MM_editCmd.ActiveConnection.Close

    If (MM_editRedirectUrl <> "") Then
      Response.Redirect(MM_editRedirectUrl)
    End If
  End If

End If
%>

Kan du?  :)
Avatar billede eagleeye Praktikant
10. februar 2005 - 17:22 #7
Det kan da gå at bruge tekst og når man indsætter er der ikke noget problem i det. Det som giver problemer er når man har kolonnen i en WHERE eller ORDER BY så vil den ikke hente eller sortere efter datoen men efter alfabeted. Det kan så løses for Access ved at konvertere dato kolonne i SQL sætningen med CDate:
sql = "select * from tabl where CDate(dato)>=#2005-02-01# ORDER BY CDate(dato)"

Det kan lade sig gøre men jeg syntes det er lidt en fusker løsning og der er nogle fordele med dato/klokkeslæt typen. Kan man ikke få DW til at formatere data for en kolonne inden de indsættes?


I DW koden gemmer den indholdet af form felterne her:
  For MM_i = LBound(MM_fields) To UBound(MM_fields) Step 2
    MM_fields(MM_i+1) = CStr(Request.Form(MM_fields(MM_i)))
  Next

Det kan evt laves om så hvis det er dato kolonnen formaters den:
  For MM_i = LBound(MM_fields) To UBound(MM_fields) Step 2
    tmp = CStr(Request.Form(MM_fields(MM_i)))
    if MM_fields(MM_i)="dato" then tmp = Year(tmp) & "-" & Month(tmp) & "-" & Day(tmp)"
    MM_fields(MM_i+1) = tmp
  Next



Men for dato/klokkeslæt typer skal MM_delim være "#"
Avatar billede rille101 Nybegynder
10. februar 2005 - 18:06 #8
Når jeg bruger din kode så bliver der ikke smidt nogen data ind i nogen af felterne. Posten oprettes men felterne er tomme.
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