30. august 2005 - 09:36Der er
27 kommentarer og 1 løsning
Opdatering igen igen
Hej eksperter
Jeg vil gerne opdatere/redigere i relaterede tabeller og synes ikke rigtig, at jeg kan finde tidligere spørgsmål, som kan hjælpe mig på vej.
Er der nogen, der har et forslag?
Her har vi formularen, hvor data fra db hentes ind. Formularen, som henter data ind virker fint:
<%
****Snip snip – her er connection string****
' SQL- sætning henter data strSQL = "select tbl_danish.Dansk, tbl_english.Engelsk, tbl_english.Klasse, tbl_english.Orden FROM tbl_danish INNER JOIN tbl_english ON tbl_danish.id_dansk = tbl_english.fr_dansk order by Dansk" Conn.Execute(strSQL)
' Luk databaseforbindelse Conn.Close Set Conn = Nothing %>
Her har vi så siden, som skal gennemføre opdateringen, og det virker ikke:
<% Dim id_dansk, Dansk, Engelsk, Klasse, Orden id_dansk=(Request.Form("id_dansk")) Dansk=(Request.Form("Dansk")) Engelsk=(Request.Form("Engelsk")) Klasse=(Request.Form("Klasse")) Orden=(Request.Form("Orden"))
****Snip snip – her er connection string****
dim SQL
strSQL = "UPDATE tbl_danish SET Dansk='" & Dansk &"' WHERE id_dansk ="& id_dansk Conn.Execute(strSQL)
' Luk databaseforbindelse Conn.Close Set Conn = Nothing
%>
Der mangler jo en del i strSQL = "UPDATE tbl_danish, ligesom jeg vel skal lave en tilsvarende strSQL = "UPDATE tbl_english..... men det er jo så der jeg er blank......
Det jeg er ved at lave her er et "redigeringssystem", hvor redaktøren kan gå ind og finde en post (et dansk ord og tilhørende oversættelse) og rette i allerede indtastede data.
Det er en Access-database med to tabeller. De to tabeller hedder tbl_danish og tbl_english. De to tabeller har en en-til-mange relation via felterne id_dansk og fr_dansk. Feltet id_dansk er primærnøgle i tabellen tbl_danish og feltet fr_dansk er fremmednøglen i tabellen tbl_english og er af datatypen tal.
OK, så det du har er altså (overordnet set) et antal dansk ord hvor der til hvert af disse danske ord kan være mange engelske oversættelser.
Dette implementerer du ved at lave en masse små forms (en for hvert engelske ord/oversættelse), som poster hver for sig og dermed ikke bringer andet data end det der er rettet for det enkelte ord (da en form jo kun medbringer de data som ligger indenfor dens egne tags)... er det korrekt?
Og det du gerne vil have er at alle rettelser til et dansk ord (potentielt set flere engelske ord) bliver sendt med over til serveren på een gang og bliver opdateret der...?
eller
Er det en "bunkeopdatering" af alle rettelser overhovedet på tværs af alle danske ord der skal opdateres?
eller er det noget helt tredie du er ude efter?
Umiddelbart er det vel den løsning hvor du poster det hele, der er mest brugervenlig (da den første lægger op til datatab, fordi data i andre forms går tabt idet data sendes til serveren for en form). Men valget er jo op til dig... :)
Det jeg gerne vil er at jeg kan foretage alle rettelser i en "post" - indeholdende dansk ord og engelsk oversættelser på en gang i en formular.... kan det lade sig gøre?
Så skal du se mester (jeg kunne ikke dy mig :)). Jeg har flikket noget kode sammen (en hel asp-side så det kan testes uden videre), som jeg tror/håber møder dine behov (se nedenfor).
Jeg vil dig knytte et par kommentarer til din datastruktur sammenholdt med den måde du vedligeholder data på. Du har mulighed for at vedligeholde et dansk ord flere gange, men stadig kun et felt at gemme det i. Derfor har jeg lavet en lille javascript ting som opdaterer de andre danske ord som kommer fra samme række i tbl_danish, når cursoren forlader feltet med det danske ord. Det er for at holde konsistens i datagrundlaget. Ud over det har jeg lagt det hele i samme asp-fil, da du så vender tilbage til samme side når du klikker opdater (og kan i princippet fortsætte din redigering).
Umiddelbart vil jeg sige: prøv det og så kan du lige melde tilbage om der er nogle misforståelser i det jeg har lavet. I tilfælde af rettelser vil jeg tage udgangspunkt i det jeg poster her, med mindre der er tale om en total misforståelse :)
if Request.Form("Opdater") <> "" then dim strSQL dim fld dim danUpdated danUpdated = ","
for each fld in Request.Form ' Kontroller om det er et dansk-ord felt if lcase(left(fld,5)) = "dansk" then ' udtræk id fra navnet på feltet danid = right(fld,len(fld)-6) ' Kontroller om ordet er blevet opdateret tidligere i dette postback if instr(1,danUpdated, "," & danid & ",") = 0 then ' hvis ikke tidligere opdateret, så gemmes id på ordet, så det ' ikke bliver opdateret flere gange i dette postback danUpdated = danUpdated & danid & "," strSQL = "UPDATE tbl_danish SET " strSQL = strSQL & " Dansk='" & Replace(Request.Form(fld)(1), "'", "''") &"' " strSQL = strSQL & " WHERE id_dansk ="& danid Conn.Execute(strSQL) else Response.Write("Been there! ("& fld &")<br>") end if end if
' Kontroller om det er et engelsk-ord felt if lcase(left(fld,7)) = "engelsk" then ' Opdater det engelske ord og de tilhørende informationer ' til det engelske ord (klasse og orden) engid = right(fld,len(fld)-8) strSQL = "UPDATE tbl_english SET " strSQL = strSQL & " Engelsk='" & Replace(Request.Form("Engelsk_" & engid), "'", "''") & "'" strSQL = strSQL & ",Klasse='" & Replace(Request.Form("Klasse_" & engid), "'", "''") & "'" strSQL = strSQL & ",Orden='" & Replace(Request.Form("Orden_" & engid), "'", "''") & "'" strSQL = strSQL & " WHERE id_engelsk ="& engid Conn.Execute(strSQL) end if next end if %> <html> <head> <script type="text/javascript"> function syncWords(obj) { // Opdater alle de andre kontroller med samme navn når en // kontrols indhold ændrer sig. Dette er nødvendigt da // ordet refererer til den samme række i tabellen i databasen. var wordValue = obj.value; var wordInputs = document.getElementsByName(obj.name); if(wordInputs.length > 1) { for(var i = 0; i < wordInputs.length; i++) { wordInputs[i].value = wordValue; } } } </script> </head> <body> <%
' SQL- sætning henter data strSQL = "SELECT dan.id_dansk, dan.Dansk, eng.id_engelsk, eng.Engelsk, eng.Klasse, eng.Orden " strSQL = strSQL & "FROM tbl_danish AS dan INNER JOIN tbl_english AS eng ON dan.id_dansk = eng.fr_dansk " strSQL = strSQL & "ORDER BY LCase(dan.Dansk) "
Set rs = Conn.Execute(strSQL) %> <form action="<%=Request.ServerVariables("SCRIPT_NAME")%>" method="post"> <% Do While Not rs.EOF %> <p>DK:<br> <input type="text" value="<%=rs("Dansk")%>" name="Dansk_<%=rs("id_dansk")%>" onchange="syncWords(this)" size="60"></p>
øhhh - uanset hvad jeg gør, sker der ingenting - HTTP Error 404... jeg bruger min connection string i stedet for din - det er det eneste jeg har ændret:
Må jeg ikke lige se den kode du bruger? Jeg synes det er spøjst at det ikke fungerer længere, idet jeg kavde det til at køre her inden jeg postede det...
if Request.Form("Opdater") <> "" then dim strSQL dim fld dim danUpdated danUpdated = ","
for each fld in Request.Form ' Kontroller om det er et dansk-ord felt if lcase(left(fld,5)) = "dansk" then ' udtræk id fra navnet på feltet danid = right(fld,len(fld)-6) ' Kontroller om ordet er blevet opdateret tidligere i dette postback if instr(1,danUpdated, "," & danid & ",") = 0 then ' hvis ikke tidligere opdateret, så gemmes id på ordet, så det ' ikke bliver opdateret flere gange i dette postback danUpdated = danUpdated & danid & "," strSQL = "UPDATE tbl_danish SET " strSQL = strSQL & " Dansk='" & Replace(Request.Form(fld)(1), "'", "''") &"' " strSQL = strSQL & " WHERE id_dansk ="& danid Conn.Execute(strSQL) else Response.Write("Been there! ("& fld &")<br>") end if end if
' Kontroller om det er et engelsk-ord felt if lcase(left(fld,7)) = "engelsk" then ' Opdater det engelske ord og de tilhørende informationer ' til det engelske ord (klasse og orden) engid = right(fld,len(fld)-8) strSQL = "UPDATE tbl_english SET " strSQL = strSQL & " Engelsk='" & Replace(Request.Form("Engelsk_" & engid), "'", "''") & "'" strSQL = strSQL & ",Klasse='" & Replace(Request.Form("Klasse_" & engid), "'", "''") & "'" strSQL = strSQL & ",Orden='" & Replace(Request.Form("Orden_" & engid), "'", "''") & "'" strSQL = strSQL & " WHERE id_engelsk ="& engid Conn.Execute(strSQL) end if next end if %>
<html> <head> <script type="text/javascript"> function syncWords(obj) { // Opdater alle de andre kontroller med samme navn når en // kontrols indhold ændrer sig. Dette er nødvendigt da // ordet refererer til den samme række i tabellen i databasen. var wordValue = obj.value; var wordInputs = document.getElementsByName(obj.name); if(wordInputs.length > 1) { for(var i = 0; i < wordInputs.length; i++) { wordInputs[i].value = wordValue; } } } </script> </head> <body>
<%
' SQL- sætning henter data strSQL = "SELECT dan.id_dansk, dan.Dansk, eng.id_engelsk, eng.Engelsk, eng.Klasse, eng.Orden " strSQL = strSQL & "FROM tbl_danish AS dan INNER JOIN tbl_english AS eng ON dan.id_dansk = eng.fr_dansk " strSQL = strSQL & "ORDER BY LCase(dan.Dansk) "
Set rs = Conn.Execute(strSQL) %> <form action="<%=Request.ServerVariables("SCRIPT_NAME")%>" method="post"> <% Do While Not rs.EOF %> <p>DK:<br> <input type="text" value="<%=rs("Dansk")%>" name="Dansk_<%=rs("id_dansk")%>" onchange="syncWords(this)" size="60"></p>
"This error occurs because the column name that you used in the query syntax does not exist. Often this error is just a typographical error. Check the column names in a database against your query string. If you are using Microsoft Access, make sure that the actual column name is used and not a column's "display" name.
Jeg har kontrolleret kolonnenavne i databasen - og de er stadig:
tbl_danish: id_dansk, Dansk tbl_english: Engelsk, Klasse, Orden, fr_dansk
og der er en en-til-mange relation ml. id_dansk i tbl_danish og fr_dansk i tbl_english.....
Jeg har prøvet at ændre denne:
' SQL- sætning henter data strSQL = "SELECT dan.id_dansk, dan.Dansk, eng.id_engelsk, eng.Engelsk, eng.Klasse, eng.Orden " strSQL = strSQL & "FROM tbl_danish AS dan INNER JOIN tbl_english AS eng ON dan.id_dansk = eng.fr_dansk " strSQL = strSQL & "ORDER BY LCase(dan.Dansk) "
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'tbl_english.Orden tbl_danish INNER JOIN tbl_english ON tbl_danish.id_dansk = tbl_english.fr_dansk ORDER BY LCase(tbl_danish.Dansk)'.
/opdater.asp, line 76
og linje 76 er:
Set rs = Conn.Execute(strSQL)
Jeg kan ikke gennemskue det (hrmpppff - sikke en rookie!! hæ hæ), men håber, at du kan se, hvor fejlen gemmer sig......og tak for din tid og ekspertise.....
Jeg kan se et felt der mangler i tabellen ifht. den SQL jeg har lavet, nemlig
eng.id_engelsk
Hvis det er tilfældet af tbl_english ikke har noget id, vil jeg varmt anbefale at du laver et, for det er væsentlig lettere at identificere rækker i en tabel hvis man har et entydigt felt at gøre det med...
Hvad angår din egen SQL, så fejler i.o.m. du mangler FROM inden tabelnavnet tbl_danish. Gør sådan i stedet:
Du kan godt sætte en opdaterknap på hvert ord-sæt, som bare opdaterer alle felter samtidig (det var en samlet opdatering du efterspurgte da jeg lavede mine indledende spørgerunde ;)). Du skal bare kalde dem allesammen Opdater som den der ligger i bunden...
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.