Avatar billede hwks Nybegynder
30. august 2005 - 09:36 Der 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)

Set rs = Conn.Execute(strSQL)

Do
%>

<form action="opdater.asp" method="post">
DK: <br>
<input type="text" value="<% response.write rs("Dansk")%>"
name="Dansk" size="60">
</p>
<p>
UK:<br>
<input type="text" value="<% response.write rs("Engelsk")%>"
name="Engelsk" size="60">
</p>
<p>
<p>Klasse:<br>
<input type="text" value="<% response.write rs("Klasse")%>"
name="Klasse" size="60">
</p>
<p>Orden:<br>
<input type="text" value="<% response.write rs("Orden")%>"
name="Orden" size="60">
</p>
<p> <input type="submit" value="Opdater">
</form>

<%
rs.MoveNext
Loop While Not rs.EOF

' 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......

Er der nogen, der har et forslag?

hwks :))
Avatar billede softspot Forsker
30. august 2005 - 14:30 #1
Kan du evt. forklare lidt mere om hvad det er du vil opnå, samt datastrukturen for de relevante tabeller i databasen...?
Avatar billede hwks Nybegynder
30. august 2005 - 17:48 #2
Det kan du tro...

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.
Avatar billede softspot Forsker
30. august 2005 - 18:06 #3
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... :)
Avatar billede hwks Nybegynder
30. august 2005 - 18:51 #4
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?
Avatar billede softspot Forsker
30. august 2005 - 18:55 #5
Ja da! :)

Jeg vender tilbage senere på aftenen, hvis det ikke haster alt for meget, så kan jeg hjælpe der...
Avatar billede hwks Nybegynder
30. august 2005 - 19:13 #6
du er et jern...
Avatar billede softspot Forsker
31. august 2005 - 00:08 #7
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 :)

Here goes:

<%@ language="VBscript" %>
<%
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/") & "\..\data\db1.mdb;Persist Security Info=False"
set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strConn

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>

    <p>UK:<br>
    <input type="text" value="<%=rs("Engelsk")%>" name="Engelsk_<%=rs("id_engelsk")%>" size="60"></p>

    <p>Klasse:<br>
    <input type="text" value="<%=rs("Klasse")%>" name="Klasse_<%=rs("id_engelsk")%>" size="60"></p>

    <p>Orden:<br>
    <input type="text" value="<%=rs("Orden")%>" name="Orden_<%=rs("id_engelsk")%>" size="60"></p>
<%
    rs.MoveNext
Loop
%>
    <p><input type="submit" value="Opdater" name="Opdater"></p>
</form>

<%
' Luk databaseforbindelse
Conn.Close
Set Conn = Nothing
%>
</body>
</html>
Avatar billede hwks Nybegynder
31. august 2005 - 09:37 #8
Hey champ

Jeg kigger på det... og melder tilbage..
Avatar billede hwks Nybegynder
31. august 2005 - 12:19 #9
ø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:

Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("/db/xxxxx.mdb")
Conn.Open DSN

har også prøvet den her - men med samme resultat

strConn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("/db/zoolex.mdb")
Conn.Open strConn


har du et bud på hvad jeg gør galt - jeg er rookie - det indrømmer jeg gerne.....
Avatar billede softspot Forsker
31. august 2005 - 12:23 #10
404!? Det er da en fejl om at siden ikke findes...

Er det den rigtige adresse du spørger på? Kører din server?
Avatar billede softspot Forsker
31. august 2005 - 12:24 #11
Virker det i øvrigt hvis du bruger "min" connectionstring (altså bort set fra databasesti og -navn naturligvis :))?
Avatar billede hwks Nybegynder
31. august 2005 - 12:53 #12
niks - jeg har prøvet forskellige "udgaver" - men med samme resultat
Avatar billede hwks Nybegynder
31. august 2005 - 12:54 #13
og ja - det hele virker - jeg har adgang til andre filer - og har kørt en "Hello world"....
Avatar billede hwks Nybegynder
31. august 2005 - 12:56 #14
så!!! nu sker der noget: se her:

Microsoft VBScript runtime error '800a01a8'

Object required: 'Conn'

/opdater.asp, line 7

Og linje 7 er: Conn.Open strConn
Avatar billede softspot Forsker
31. august 2005 - 12:57 #15
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...
Avatar billede softspot Forsker
31. august 2005 - 12:58 #16
Ja, ok. Det er nødvendigt at du konsekvensretter diverse variabelnavne :)
Avatar billede hwks Nybegynder
31. august 2005 - 13:06 #17
Jo naturligvis....

<%@ language="VBscript" %>

<%
strConn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("/db/xxxxxxx.mdb")
Conn.Open strConn

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>

    <p>UK:<br>
    <input type="text" value="<%=rs("Engelsk")%>" name="Engelsk_<%=rs("id_engelsk")%>" size="60"></p>

    <p>Klasse:<br>
    <input type="text" value="<%=rs("Klasse")%>" name="Klasse_<%=rs("id_engelsk")%>" size="60"></p>

    <p>Orden:<br>
    <input type="text" value="<%=rs("Orden")%>" name="Orden_<%=rs("id_engelsk")%>" size="60"></p>
<%
    rs.MoveNext
Loop

%>
    <p><input type="submit" value="Opdater" name="Opdater"></p>
</form>

<%
' Luk databaseforbindelse
Conn.Close
Set Conn = Nothing
%>

</body>
</html>
Avatar billede softspot Forsker
31. august 2005 - 13:52 #18
strConn = Server.CreateObject("ADODB.Connection")

strConn er det du kalder DSN, så den skal ikke bruges til connectionobjektet (det hedder jo Conn). Så du skal nok lige starte med at skrive

set Conn = Server.CreateObject("ADODB.Connection")

i stedet. Altså connectionopsætning i sin helhed:

set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("/db/xxxxxxx.mdb")
Conn.Open DSN
Avatar billede hwks Nybegynder
31. august 2005 - 14:05 #19
hmmm - så får jeg:

Microsoft OLE DB Provider for ODBC Drivers error '80040e10'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.

/opdater.asp, line 76

og linje 76 er:

Set rs = Conn.Execute(strSQL)

jeg undersøger lige hvad det er for en type fejl...
Avatar billede softspot Forsker
31. august 2005 - 14:22 #20
Det er givetvis nogle af felterne som hedder noget andet end det jeg har kaldt dem i min query (og testdatabase)...
Avatar billede hwks Nybegynder
31. august 2005 - 14:44 #21
Ifølge Microsoft skyldes fejlen :

"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) "

til følgende:

'SQL- sætning henter data
strSQL = "SELECT tbl_danish.id_dansk, tbl_danish.Dansk, tbl_english.id_english, tbl_english.Engelsk, tbl_english.Klasse, tbl_english.Orden "
strSQL = strSQL & "tbl_danish INNER JOIN tbl_english ON tbl_danish.id_dansk = tbl_english.fr_dansk "
strSQL = strSQL & "ORDER BY LCase(tbl_danish.Dansk) "

men får denne fejlmeddelelse:

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.....
Avatar billede softspot Forsker
31. august 2005 - 14:49 #22
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:

'SQL- sætning henter data
strSQL = "SELECT tbl_danish.id_dansk, tbl_danish.Dansk, tbl_english.id_english, tbl_english.Engelsk, tbl_english.Klasse, tbl_english.Orden "
strSQL = strSQL & "FROM tbl_danish INNER JOIN tbl_english ON tbl_danish.id_dansk = tbl_english.fr_dansk "
strSQL = strSQL & "ORDER BY LCase(tbl_danish.Dansk) "
Avatar billede hwks Nybegynder
31. august 2005 - 15:28 #23
Nu er der hul igennem..... :))))

Allerførst - tbl_english har naturligvis et id-felt - det hedder id_english...

Dernæst - jeg har indføjet FROM i SQL-sætningen og ændret følgende:

    <p>DK:<br>
    <input type="text" value="<%=rs("Dansk")%>" name="Dansk_<%=rs("id_dansk")%>" onchange="syncWords(this)" size="60"></p>

    <p>UK:<br>
    <input type="text" value="<%=rs("Engelsk")%>" name="Engelsk_<%=rs("id_engelsk")%>" size="60"></p>

    <p>Klasse:<br>
    <input type="text" value="<%=rs("Klasse")%>" name="Klasse_<%=rs("id_engelsk")%>" size="60"></p>

    <p>Orden:<br>
    <input type="text" value="<%=rs("Orden")%>" name="Orden_<%=rs("id_engelsk")%>" size="60"></p>


til følgende - dvs. ændret id_engelsk til id_english

    <p>DK:<br>
    <input type="text" value="<%=rs("Dansk")%>" name="Dansk_<%=rs("id_dansk")%>" onchange="syncWords(this)" size="60"></p>

    <p>UK:<br>
    <input type="text" value="<%=rs("Engelsk")%>" name="Engelsk_<%=rs("id_english")%>" size="60"></p>

    <p>Klasse:<br>
    <input type="text" value="<%=rs("Klasse")%>" name="Klasse_<%=rs("id_english")%>" size="60"></p>

    <p>Orden:<br>
    <input type="text" value="<%=rs("Orden")%>" name="Orden_<%=rs("id_english")%>" size="60"></p>
<%


Og SÅ finder den samtlige "poster" i databasen dvs. "sæt" med Dansk, Engelsk, Klasse, Orden etc. etc. men kun en Opdater-knap til allersidst.....

Det skal være muligt at opdatere én enkelt post - dvs. der skal vel være en Opdater-knap ud for hver post?? Eller hur??
Avatar billede softspot Forsker
31. august 2005 - 15:34 #24
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...
Avatar billede softspot Forsker
31. august 2005 - 15:35 #25
Og et svar, hvis du synes det var det værd :)
Avatar billede hwks Nybegynder
31. august 2005 - 15:46 #26
Der er ikke et øje tørt..... tak for din tid og din ekspertise... det er rasendes godt!! Hav en god dag :))
Avatar billede softspot Forsker
31. august 2005 - 15:46 #27
Tak for point :)
Avatar billede softspot Forsker
31. august 2005 - 15:52 #28
Tak i lige måde :)
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