09. november 2002 - 11:29Der er
29 kommentarer og 1 løsning
Hjælp til et script der trækker nogle oplysninger ud fra DB.....
Nogen der kan hjælpe med at lave et udtræk ?
Jeg har en accessdatabase med nogle medlemsoplysninger, disse er FORNAVN, EFTERNAVN, BIRTHDATEDD, BIRTHDATEMM og BIRTHDATEYY. Som altså beskriver navn samt dag, måned og år personen er født.
Jeg kunne godt tænke mig et udtræk som skrev: DEN NÆSTE DER HAR FØDSELSDAG ER TRINE OHLSSON, DEN 7 MAJ 2003
Altså med brug af oplysningerne fra databasen. Hvis der er to eller tre der har samme dag, kan vel skrives DE NÆSTE DER HAR FØDSELSDAG ER EMMA ARNHOLT, DEN 21 JUNI 2003 OLE OLSEN, DEN 21 JUNI 2003
Sådan her kommer koden til at se ud.. Giver lidt kode for eks hvis har føstes dag den 10-12 og det idag er den 15-11 så kan man ikke bare søge efter hvor både BIRTHDATEDD > 15 og BIRTHDATEMM > 11 for så finder den ikke den rigtige fødselsdag... Så der kommer en del SQL sætniger til at finde de(n) næste som har fødselsdag.:
Du skal rette tabel nanet til at passe med dit tabel navn, jeg har brugt: spm281201 Ligeledes skal du rette database connection til at passe med din database.
<HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <% Session.LCID = 1030 'Sæt dansk dato format. Set Conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.RecordSet") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("db5.mdb")
dag = Day(Date) maanede = Month(Date)
'Prøv føste om en/flere har fødselsdag i denne månede SQL = "SELECT TOP 1 * FROM spm281201 WHERE birthdatedd >= " & dag & " AND birthdatemm = " & maanede & " ORDER BY birthdatemm ASC, birthdatedd ASC" set rs = Conn.Execute(SQL) 'Tjek om der var nogle som har fødselsdag i denne månede if rs.EOF then 'Det var der ikke. 'Tjek om der er nogle som har fødselsdag i næste månede og dag >= 1 og ikke dags dato SQL = "SELECT TOP 1 * FROM spm281201 WHERE birthdatedd >= 1 AND birthdatemm > " & maanede & " ORDER BY birthdatemm ASC, birthdatedd ASC" set rs = Conn.Execute(SQL) end if if rs.EOF then 'Tjek om nogle har fødselsdag til næste år. SQL = "SELECT TOP 1 * FROM spm281201 WHERE birthdatedd >= 1 AND birthdatemm >= 1 ORDER BY birthdatemm ASC, birthdatedd ASC" set rs = Conn.Execute(SQL) end if rs.Close rs.Open SQL, Conn, 1
Response.Write "<table align=""center"">" if rs.EOF then Response.Write "<tr><td>Inden fødslesdage fundet!!</td></tr>" elseif rs.RecordCount = 1 then Response.Write "<tr><td>Den næste der har fødelsdag er:</td></tr>" else Response.Write "<tr><td>De næste der har fødelsdag er:</td></tr>" end if Response.Write "</table><table align=""center"">" do while not rs.EOF Response.Write "<tr>" Response.Write "<td>" & rs("fornavn") & " " & rs("efternavn") & ",</td>" Response.Write "<td>Den " & rs("birthdatedd") & " " & MonthName(rs("birthdatemm")) & "</td>" Response.Write "</tr>" rs.MoveNext loop Response.Write "</table>" rs.Close Set rs = Nothing Conn.Close Set Conn = Nothing %> </BODY> </HTML>
Det ville være en del nemmere hvis du samlede fødselsdatoen i et enkelt felt i formatet dd-mm. Udtræk: strSQL = "select * from medlemmer WHERE date >= Now order by BIRTHDATE"
Script: intBDate = 1 While Not RS.EOF If strBDate = "" Then strBDate = RS("BIRTHDATE") Else If strBDate = RS("BIRTHDATE") Then intBDays = intBDays + 1 End If RS.MoveNext Wend RS.MoveFirst
If intBDays = 1 Then Response.Write "Den næste der har fødselsdag er<br>" Else Response.Write "De næste der har fødselsdag er<br>" End If
For i = 1 to intBDays Response.Write RS("FORNAVN") & " " & RS("EFTERNAVN") & ", DEN " & RS("BIRTHDATE") & "<br>" RS.MoveNext Next
Det funker ikke !!! Jeg har prøvet og prøvet, men enten står den bare og tænker i 100 år eller også er der fejl, et par gange har fejlen været i linien med: set rs = Conn.Execute(SQL) !!!!
Herunder er min ASP fil, nogen der kan optimere/finde fejlen ??? Tak...
<% language=VBscript%>
<HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <% Session.LCID = 1030 'Sæt dansk dato format. Set Conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.RecordSet") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("adressekartotek.mdb")
dag = Day(Date) maanede = Month(Date)
'Prøv føste om en/flere har fødselsdag i denne månede SQL = "SELECT TOP 1 * FROM personer WHERE birthdatedd >= " & dag & " AND birthdatemm = " & maanede & " ORDER BY birthdatemm ASC, birthdatedd ASC" set rs = Conn.Execute(SQL) 'Tjek om der var nogle som har fødselsdag i denne månede if rs.EOF then 'Det var der ikke. 'Tjek om der er nogle som har fødselsdag i næste månede og dag >= 1 og ikke dags dato SQL = "SELECT TOP 1 * FROM personer WHERE birthdatedd >= 1 AND birthdatemm > " & maanede & " ORDER BY birthdatemm ASC, birthdatedd ASC" set rs = Conn.Execute(SQL) end if if rs.EOF then 'Tjek om nogle har fødselsdag til næste år. SQL = "SELECT TOP 1 * FROM personer WHERE birthdatedd >= 1 AND birthdatemm >= 1 ORDER BY birthdatemm ASC, birthdatedd ASC" set rs = Conn.Execute(SQL) end if rs.Close rs.Open SQL, Conn, 1
Response.Write "<table align=""center"">" if rs.EOF then Response.Write "<tr><td>Inden fødslesdage fundet!!</td></tr>" elseif rs.RecordCount = 1 then Response.Write "<tr><td>Den næste der har fødelsdag er:</td></tr>" else Response.Write "<tr><td>De næste der har fødelsdag er:</td></tr>" end if Response.Write "</table><table align=""center"">" do while not rs.EOF Response.Write "<tr>" Response.Write "<td>" & rs("fornavn") & " " & rs("efternavn") & ",</td>" Response.Write "<td>Den " & rs("birthdatedd") & " " & MonthName(rs("birthdatemm")) & "</td>" Response.Write "</tr>" rs.MoveNext loop Response.Write "</table>" rs.Close Set rs = Nothing Conn.Close Set Conn = Nothing %> </BODY> </HTML>
Det der sker: Siden er virkelig 100 år om at komme frem og derefter skriver den: Ingen fødselsdag fundet !! (Dette på trods af, at databasen er fyldt med personer !!!) Efter/Under meddelsen kommer fejlmeddelsen: Active Server Pages error 'ASP 0113' Script timed out
/testside3.asp
The maximum amount of time for a script to execute was exceeded. You can change this limit by specifying a new value for the property Server.ScriptTimeout or by changing the value in the IIS administration tools.
Jeg har prøvet flere gange og jeg kan ikke få siden til at loade langsomt eller komme med fejl. Jeg kan ikke se noget som skulle give script timeout, da der kun er et loop på siden og der er MoveNext med. Jeg kan lige prøve at fylde en masse i databasen.
Jeg har prøvet at sætte nogle rs.Close ind i if sætningerne hvis det skulle give et problem:
<HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <% Session.LCID = 1030 'Sæt dansk dato format. Set Conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.RecordSet") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("adressekartotek.mdb")
dag = Day(Date) maanede = Month(Date)
'Prøv føste om en/flere har fødselsdag i denne månede SQL = "SELECT TOP 1 * FROM personer WHERE birthdatedd >= " & dag & " AND birthdatemm = " & maanede & " ORDER BY birthdatemm ASC, birthdatedd ASC" set rs = Conn.Execute(SQL) 'Tjek om der var nogle som har fødselsdag i denne månede if rs.EOF then 'Det var der ikke. 'Tjek om der er nogle som har fødselsdag i næste månede og dag >= 1 og ikke dags dato rs.Close SQL = "SELECT TOP 1 * FROM personer WHERE birthdatedd >= 1 AND birthdatemm > " & maanede & " ORDER BY birthdatemm ASC, birthdatedd ASC" set rs = Conn.Execute(SQL) end if if rs.EOF then 'Tjek om nogle har fødselsdag til næste år. rs.Close SQL = "SELECT TOP 1 * FROM personer WHERE birthdatedd >= 1 AND birthdatemm >= 1 ORDER BY birthdatemm ASC, birthdatedd ASC" set rs = Conn.Execute(SQL) end if rs.Close rs.Open SQL, Conn, 1
Response.Write "<table align=""center"">" if rs.EOF then Response.Write "<tr><td>Inden fødslesdage fundet!!</td></tr>" elseif rs.RecordCount = 1 then Response.Write "<tr><td>Den næste der har fødelsdag er:</td></tr>" else Response.Write "<tr><td>De næste der har fødelsdag er:</td></tr>" end if Response.Write "</table><table align=""center"">" do while not rs.EOF Response.Write "<tr>" Response.Write "<td>" & rs("fornavn") & " " & rs("efternavn") & ",</td>" Response.Write "<td>Den " & rs("birthdatedd") & " " & MonthName(rs("birthdatemm")) & "</td>" Response.Write "</tr>" rs.MoveNext loop Response.Write "</table>" rs.Close Set rs = Nothing Conn.Close Set Conn = Nothing %> </BODY> </HTML>
Det funker desværre ikke endnu, kan det måske skyldes min database opbyning ??
Feltnavn: birthdatedd Datatype: Tekst - Indhold angives med tal på to cifre Feltnavn: birthdatemm Datatype: Tekst - Indhold angives med tal på to cifre Feltnavn: birthdateyy Datatype: Tekst - Indhold angives med tal på fire cifre
Kan det være en årsag til det ikke virker ???
PS: Jeg kan godt se nu, at i mit eksempel angiver jeg månederne som bogstaver (NOV,MAJ...) og det er jo ikke det jeg har i databasen, men pyt med det, det vigtigste er at det virker, så må vi se senere, om man kan lave tallene om til månedsbetegnelser ??
Ja det kan forklare lidt men så ville jeg forvendte en type fejl og ikke at den står i lang tid og loader siden..
Prøv med denne tilrettede kode:
<% language=VBscript%>
<HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <% Session.LCID = 1030 'Sæt dansk dato format. Set Conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.RecordSet") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("db5.mdb")
dag = Day(Date) maanede = Month(Date)
'Prøv føste om en/flere har fødselsdag i denne månede SQL = "SELECT TOP 1 * FROM personer WHERE Int(birthdatedd) >= " & dag & " AND Int(birthdatemm) = " & maanede & " ORDER BY Int(birthdatemm) ASC, Int(birthdatedd) ASC" set rs = Conn.Execute(SQL) 'Tjek om der var nogle som har fødselsdag i denne månede if rs.EOF then 'Det var der ikke. 'Tjek om der er nogle som har fødselsdag i næste månede og dag >= 1 og ikke dags dato rs.Close SQL = "SELECT TOP 1 * FROM personer WHERE Int(birthdatedd) >= 1 AND Int(birthdatemm) > " & maanede & " ORDER BY Int(birthdatemm) ASC, Int(birthdatedd) ASC" set rs = Conn.Execute(SQL) end if if rs.EOF then 'Tjek om nogle har fødselsdag til næste år. rs.Close SQL = "SELECT TOP 1 * FROM personer WHERE Int(birthdatedd) >= 1 AND Int(birthdatemm) >= 1 ORDER BY Int(birthdatemm) ASC, Int(birthdatedd) ASC" set rs = Conn.Execute(SQL) end if rs.Close rs.Open SQL, Conn, 1
Response.Write "<table align=""center"">" if rs.EOF then Response.Write "<tr><td>Inden fødslesdage fundet!!</td></tr>" elseif rs.RecordCount = 1 then Response.Write "<tr><td>Den næste der har fødelsdag er:</td></tr>" else Response.Write "<tr><td>De næste der har fødelsdag er:</td></tr>" end if Response.Write "</table><table align=""center"">" do while not rs.EOF Response.Write "<tr>" Response.Write "<td>" & rs("fornavn") & " " & rs("efternavn") & ",</td>" Response.Write "<td>Den " & rs("birthdatedd") & " " & MonthName(rs("birthdatemm")) & "</td>" Response.Write "</tr>" rs.MoveNext loop Response.Write "</table>" rs.Close Set rs = Nothing Conn.Close Set Conn = Nothing %> </BODY> </HTML>
Det er noget værre noget....Det funker stadig væk overhovedet ikke !!!!!
Jeg tror det er noget med databasen.... Har prøvet at lave en connectionstreng i stedet for, der siger (connection.asp): ( Jeg ved connection stringen virker !!! )
Jeg har så indsat <!--#include file="connection.asp"--> i starten af scriptet.
Dette erstatter da; Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("db5.mdb")
ikke ??
Det virker stadig ikke, på trods af, at min connection string helt sikkert virker......
PS: Er du sikker på at det ikke spiller nogen rolle, at feltnavn er af datatypen: Tekst ??
SQL = "SELECT TOP 10 * FROM personer WHERE Int(birthdatedd) = 11" Set rs = Conn.Execute(SQL) do while not rs.EOF Response.write rs("fornavn") & "<br>" rs.Movenext loop Conn.Close %>
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression. /test5.asp, line 21
SQL = "SELECT TOP 1 * FROM personer WHERE Int(birthdatedd) >= " & dag & " AND Int(birthdatemm) = " & maanede & " ORDER BY Int(birthdatemm) ASC, Int(birthdatedd) ASC"
Det skulle stadig virke med Int.. Prøv evt at rette Int til CInt i SQL sætningen:
SQL = "SELECT TOP 1 * FROM personer WHERE CInt(birthdatedd) >= " & dag & " AND CInt(birthdatemm) = " & maanede & " ORDER BY CInt(birthdatemm) ASC, CInt(birthdatedd) ASC"
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.