30. januar 2006 - 18:38Der er
158 kommentarer og 1 løsning
Rediger én record
Vil høre om der er nogen som har et godt link til en asp-demo hvor man kan redigere en enkelt record. Forstået på den måde at jeg skal bruge en form hvor jeg i et felt kan skrive recordens "Id" nr og så blive dirigeret over på en rediger-asp-side, hvor jeg kan redigere recordens felter. Jeg har allerede en asp, hvor jeg får alle records og hvor jeg kan klikke på id nr og komme over på recorden, men jeg kunne godt tænke mig at springe direkte ind på den søgte records id.
Ser du. Den her tutorial har jeg fået til at køre rimelig godt: http://www.w3schools.com/ado/demo_db_list.asp men nu havde jeg fået lyst til bare at have en form hvor jeg kunne skrive "Id" eller "Nr" og så straks få mulighed for at redigere.
Ok, så lad os starte med, hvordan du ønsker at udpege den post der skal redigeres. Hvis det skal være som du antyder i 30/01-2006 20:47:38, så er vi nødt til at have en form hvor at vi kan indtaste et navn og så en søg-knap.
Nej det kan jeg ikke. Bedre til SQL men kniber med scripts. Jeg skal over og kunne køre: nedenstående asp side. Men skal som du skriver have lavet en søgeside inden.
<script TYPE LANGUAGE="VBScript" RUNAT="SERVER"></script>
<title>Redigerer DataBasen</title> </head> <body> <h2>Gem i Databasen</h2>
<%on error resume next set conn=Server.CreateObject("ADODB.Connection") conn.provider="Microsoft.Jet.OLEDB.4.0" conn.open(server.mappath("database.mdb"))
function fixSQL(strS) fixSQL = replace(strS, "'", "''") end function
if Request.form("action")="Gem" then no=Request.Form("no")
conn.Execute sql, Recordsaffected if err <> 0 then Response.Write("Der er opstået en fejl !") else 'server.transfer("rediger_ordrer.asp") Response.Redirect("Rediger_ordrer_Alle.asp")
'Response.Write("Record number " & no & " was updated.") end if Response.Write("Submitting records has been disabled from this demo") end if if Request.Form("action")="Slet" then no=Request.Form("no") conn.Execute "DELETE FROM ordrer WHERE ordrer.[no]=" & no, Recordsaffected if err <> 0 then Response.Write("Der er opstået en fejl !") else Response.Redirect("Rediger_ordrer_Alle.asp") 'Response.Write("Record number " & no & " was deleted.") end if Response.Write("Deleting records has been disabled from this demo") end if
Godt så... Det felt du indtaster i skal altså indeholde navnet på den post du ønsker at redigere ... men mener du fornavnet, efternavnet eller måske begge to?
Jo, men i 30/01-2006 20:47:38 skriver du at du gerne vil kunne søge på et navn og at det så skulle give dig et no så du kan klikke på (hvorefter du kan redigere).
Nu har vi en formular som du kan søge på - dropper vi mellemledet med navnet eller hvad?
Jo, da. Men alt de er jo bare "fyld" som skal til for at få det til at fungere. SQL'en er den centrale ting som det hele former sig rundt om. Den skal derfor på plads først :^)
<% No = "" & Request.Form("no") If No <> "" Then Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("database.mdb")
sql = "SELECT * FROM ordrer WHERE [no]=" & No Set rs = Conn.Execute(sql)
<% No = "" & Request.Form("no") If No <> "" Then Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("database.mdb")
sql = "SELECT * FROM ordrer WHERE [no]=" & No Set rs = Conn.Execute(sql)
Noget i den stil ... men glem det bare igen, jeg kom lige i tankle om en anden mulighed:
<% No = "" & Request.Form("no") If No <> "" Then Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("database.mdb")
sql = "SELECT * FROM ordrer WHERE [no]=" & No Set rs = Conn.Execute(sql)
If Not rs.EoF Then ' (3) Opret en form som vi kan redighere data i. Else Response.Write "Der er ingen rækker i databasen som passer til no=" & No" End If
Glem count(*) igen ... Den viste løsning udnytter at recordsættet, rs, har egenskaben EoF (End-of-File) allerede fra starten af hvis det er tomt (altså hvis der ikke var nogle resultater overhovedet).
<% No = "" & Request.Form("no") If No <> "" Then Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("database.mdb")
sql = "SELECT * FROM ordrer WHERE [no]=" & No Set rs = Conn.Execute(sql)
If Not rs.EoF Then %> <form action="????" method="post"> <input type="hidden" name="no" value="<% =No %>"> Navn: <input type="text" name="navn" value="<% =rs("navn") %>"><br> Adresse: <input type="text" name="adresse" value="<% =rs("adresse") %>"><br> ... så nogle flere felter ... <input type="submit"> </form> <% Else Response.Write "Der er ingen rækker i databasen som passer til no=" & No" End If
Lige nu har vi trukket data ud svarende til værdien i No. Dem skal vi have præsenteret i en form - den form vi er ved at lave. Der kan du redigere dem og når du trykker på submit-knappen ... ja, SÅ bliver der UPDATET. Men der er vil altså ikke nået til endnu.
Hvis vi ikke har dem med nu, så får dudesvære overskrevet de værdier der er i din database med blanke. Men det er måske bare en testdatabase - som du kan lege med?
<% No = "" & Request.Form("no") If No <> "" Then Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("database.mdb")
sql = "SELECT * FROM ordrer WHERE [no]=" & No Set rs = Conn.Execute(sql)
If Not rs.EoF Then %> <form action="Demo_db_submit_Alle" method="post"> <input type="hidden" name="no" value="<% =No %>"> K_nr: <input type="text" name="K_nr" value="<% =rs("K_nr") %>" size="20"><br> Navn: <input type="text" name="navn" value="<% =rs("navn") %>" size="20"><br> Adresse:<input type="text" name="adresse" value="<% =rs("adresse") %>" size="20"><br> Postby: <input type="text" name="postby" value="<% =rs("postby") %>" size="20"><br> Attention:<input type="text" name="attention" value="<% =rs("attention") %>" size="20"><br> <input type="submit"> </form> <% Else Response.Write "Der er ingen rækker i databasen som passer til no=" & No" End If
<% No = "" & Request.Form("no") If No <> "" Then Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("/DGd_baser/test.mdb")
sql = "SELECT * FROM ordrer WHERE [no]=" & No Set rs = Conn.Execute(sql)
Du redigere på siden index.asp - når den nederse form submittes ryger det til Demo_db_submit_Test.asp hvor at UPDATE'en så burde ske uden nogenproblemer.
Hvad præcie mener du med at "det kører ikke helt"? Køre det slet ikke, eller køre det delvist? Hvordan? Bliver der UPDATE'et noget? Bliver der udskrevet noget?
<% No = "" & Request.Form("no") If No <> "" Then Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("/DGd_baser/test.mdb")
sql = "SELECT * FROM ordrer WHERE [no]=" & No Set rs = Conn.Execute(sql)
Nåe jeg stiller det alligevel. I min update asp af 30/01-2006 21:19:39 mister jeg records, hvis curseren står i et felt og jeg kommer til at trykke på "Enter" knappen. Normalt skal man trykke på en slet-knap, men enterknappen gør at jeg mister en record ?
Du skriver at du får nogle blanke felter i din tabel, og du siger at det er dem som ikke er med i din index.asp. Kan du ikke give et specifikt eksempel - husk på at jeg ikke har din database.
Et eksempel ja. Hvis jeg i basen har et felt = fødselsdag. Det er jo ikke med i index.asp filen og vises heller ikke. Når jeg så kører update(send forespørgsel)så slettes den oprindelig indtastede fødselsdag ?
31/01-2006 21:10:22> Ja hideen betyder at No ikke skal vises - pointen med dette er at man ikke skal ændre i No efter at man har fremsøgt værdierne nede i felterne. Hvis man ændre på det der står i No, så ville man jo resikere at overskrive en anden post end den man er ved at redigere. :^)
31/01-2006 21:15:19> Hvis det sker, så er det godt nok meget mystisk! Der er nemlig intet i den SQL som laver UPDATE'n som overjovedet rører ved fødselsdag-feltet:
conn.Execute sql, Recordsaffected if err <> 0 then Response.Write("Der er opstået en fejl !") else 'server.transfer("rediger_ordrer.asp") Response.Redirect("index2.asp") ,,,,,,,,,,,,,,,,,,,,,,, hvis "attention" feltet udelades af filen index2.asp men forbliver i updatefilen så slettes indholdet af atttention
og hvis at der ikke er noget attention-felt i din index2.asp fil, så bliver Request.Form("Attention") det samme som "", og derfor bliver denne del af UPDATE-sætningen til:
sql=sql & "Attention='',"
hvilket er det samme som at sige at det skal blankes.
Ok, så er det løst. Jeg skal bare sikre mig at jeg har de samme felter i index-filen som i update-filen. Af hensyn til den der enter fejl. Ved du om man kan lave en lille funktion som kan slå enterknappen fra eller om der kan indsættes en if sætning foran delete-sql-en for at sikre at enter ikke sletter en record
Spørgsmålet har ikke noget at gøre med index.asp ,,,,,,,,,,,,,,, Det er den der tutoriel som jeg tidligere henviste til http://www.w3schools.com/ado/demo_db_list.asp Når man står på den side hvor man kan klikke på save eller delete. Hvis man der klikker på enter så mister jeg en record. ,,,,,,,,,,,, Den kode som jeg anvender: <script TYPE LANGUAGE="VBScript" RUNAT="SERVER"></script>
<title>Redigerer DataBasen</title> </head> <body> <h2>Gem i Databasen</h2>
<%on error resume next set conn=Server.CreateObject("ADODB.Connection") conn.provider="Microsoft.Jet.OLEDB.4.0" conn.open(server.mappath("database.mdb"))
function fixSQL(strS) fixSQL = replace(strS, "'", "''") end function
if Request.form("action")="Gem" then no=Request.Form("no")
conn.Execute sql, Recordsaffected if err <> 0 then Response.Write("Der er opstået en fejl !") else 'server.transfer("rediger_ordrer.asp") Response.Redirect("Rediger_ordrer_Alle.asp")
'Response.Write("Record number " & no & " was updated.") end if Response.Write("Submitting records has been disabled from this demo") end if if Request.Form("action")="Slet" then no=Request.Form("no") conn.Execute "DELETE FROM ordrer WHERE ordrer.[no]=" & no, Recordsaffected if err <> 0 then Response.Write("Der er opstået en fejl !") else Response.Redirect("Rediger_ordrer_Alle.asp") 'Response.Write("Record number " & no & " was deleted.") end if Response.Write("Deleting records has been disabled from this demo") end if
Når recordfelterne vises på siden kan jeg normalt redigere de enkelte felter og klikke på gem. Det går fint. Jeg kan også vælge at klikke på slet. Så slettes recorden. Det går også fint. Men problemet opstår når jeg f eks indsætter curser i et felt og ved en tilfældighed kommer til at klikke på enter-knappen. Så smutter der en record.
Så den her : <% no=Request.Form("no") if no="" then response.end set conn=Server.CreateObject("ADODB.Connection") conn.provider="Microsoft.Jet.OLEDB.4.0" conn.open(server.mappath("/DGd_baser/test.mdb")) set rs = Server.CreateObject("ADODB.Recordset") rs.Open "Select * from ordrer where ordrer.[no]=" & no , conn %> <html> <head> <title>Demo_db_edit_test</title> </head> <body bgcolor="#0000FF" link="#FFFF00" vlink="#FFFF00" alink="#FFFF00"> <form method="post" action="Demo_db_submit_test2.asp"> <input name="no" type="hidden" value=<%=no%>> <input type="submit" name="action" value="Slet"> <b><font color="#FFFFFF">Alle felter kan redigeres</font></b> <input type="submit" name="action" value="Gem"> <a style="color: #FFFFFF; font-weight: bold" href="test.asp">Luk uden at redigere</a><Br> <table bgcolor="#b0c4de" width="458"> <% for each x in rs.Fields if x.name <> "no" AND x.name <> "Dagsdato" then%> <tr> <td width="6"><%=x.name%> </td> <td width="670"> <input name="<%=x.name%>" value="<%=x.value%>" size="48"> </td> <%end if next
og til sidst: <script TYPE LANGUAGE="VBScript" RUNAT="SERVER"></script> <html> <head> <meta http-equiv="Content-Language" content="da"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<title>Redigerer DataBasen</title> </head> <body> <h2>Gem i Databasen</h2>
<%on error resume next set conn=Server.CreateObject("ADODB.Connection") conn.provider="Microsoft.Jet.OLEDB.4.0" conn.open(server.mappath("/DGd_baser/test.mdb"))
function fixSQL(strS) fixSQL = replace(strS, "'", "''") end function
'Response.Write("Record number " & no & " was updated.") end if Response.Write("Submitting records has been disabled from this demo") end if if Request.Form("action")="Slet" then no=Request.Form("no") conn.Execute "DELETE FROM ordrer WHERE ordrer.[no]=" & no, Recordsaffected if err <> 0 then Response.Write("Der er opstået en fejl !") else Response.Redirect("rediger.asp") 'Response.Write("Record number " & no & " was deleted.") end if Response.Write("Deleting records has been disabled from this demo") end if
conn.close %> </body> </html> ,,,,,,,,,,,,,,,,,,,,,,,, og den her redirecter tilbage til den første
Jeg skulle nu kun bruge den hvor fejlen er på - 31/01-2006 22:03:46.
Fejlen skyldes at din submit-knap:
<input type="submit" name="action" value="Slet">
- jo netop også er den som sletter. Hvis du er i en form og trykker på <Enter>-knappen så betyder det normalt det samme som "Tryk på submit-knappen". Og det er jo ikke så godt hvis denne er sat til at skulle betyde Slet.
Ja jeg kan bytte rundt, men tror du ikke der er en bedre løsning ? Jeg er nødt til at smutte nu. men tak for hjælpen i dag også. Læg et svar så får du point i morgen
Jeg er ikke lige umidelbaret klar over hvordan man kan disable Enter-knappen. Prøblemet er at det egentlig er op til den specifikke browser hvordan at den vil fortolke trykket på Enter. MSIE vælger altså at fortolke det som om at der skal trykkes på den første Submit-knap i formen. Andre browser-typer gør måske noget andet...
Jeg vilæ gerne vente med points til at vi er helt færdige :^)
Ok, Jeg havde tænkt på at indsætte en bekræft betingelse inden delete-sql-en køres. Noget med: Er du sikker på at du vil slette, så klik OK. Så kunne man måske nå at redde recorden.
<% No = "" & Request.Form("no") If No <> "" Then Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("database.mdb")
sql = "SELECT * FROM ordrer WHERE [no]=" & No Set rs = Conn.Execute(sql)
Og her er den anden asp som køres når der klikkes gem: </head> <body> <h2>Gem i Databasen</h2>
<%on error resume next set conn=Server.CreateObject("ADODB.Connection") conn.provider="Microsoft.Jet.OLEDB.4.0" conn.open(server.mappath("database.mdb"))
function fixSQL(strS) fixSQL = replace(strS, "'", "''") end function
sql=sql & "Tidsstempel='" & now() & "' WHERE ordrer.[no]=" & no conn.Execute sql, Recordsaffected if err <> 0 then Response.Write("Der er opstået en fejl !") else Response.Redirect("index.asp")
'Response.Write("Record number " & no & " was updated.") end if Response.Write("Submitting records has been disabled from this demo") end if if Request.Form("action")="Slet" then no=Request.Form("no")
conn.Execute "DELETE FROM ordrer WHERE ordrer.[no]=" & no, Recordsaffected if err <> 0 then Response.Write("Der er opstået en fejl !") else Response.Write("Record number " & no & " was deleted.") end if Response.Write("Sletning er sat ud af funktion - slet dataene og skriv evt annulleret") end if
Vi skal have fat i den form hvor slet-knappen er på - og det er ikke nogen af de der to.
Synes godt om
Ny brugerNybegynder
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.