Avatar billede hwks Nybegynder
20. december 2007 - 15:29 Der er 14 kommentarer og
1 løsning

Søg og slet

Hej eksperter!

Softspot hjalp mig i http://www.eksperten.dk/spm/654084 med at søge efter en post, få den vist mhp. at redigere den.

Nu vil jeg gerne kunne søge efter en post, få den vist mhp. at slette den.

Den behøver kun at vise værdien fra to felter (fra to relaterede tabeller) og metoden til at slette den kunne jo ligne den som softspot foreslog – altså med en knap for hver post.

Jeg 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 'id_dansk='.

/cowi/cowilex_slet_show.asp, line 226

– hvad gør jeg galt?

Er der nogen der kan hjælpe?

Hwks

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

if Request.Form("Delete") <> "" then
    dim strSQL
    dim fld
    dim danDeleted
    danDeleted = ","
   
    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 slettet
            if instr(1,danDeleted, "," & danid & ",") = 0 then
                ' hvis ikke tidligere opdateret, så gemmes id på ordet, så det
                ' ikke bliver opdateret flere gange i dette postback
                danDeleted = danDeleted & danid & ","
                strSQL = "DELETE tbl_danish SET "
                strSQL = strSQL & " Dansk='" & Replace(Request.Form("Dansk_" & danid), "'", "''") &"' "         
                strSQL = strSQL & " WHERE id_dansk ="& danid
                Conn.Execute(strSQL)
            else
                Response.Write("Desværre - det lykkedes ikke at finde den ønskede post til sletning. Prøv igen. ("& fld &")<br>")
            end if
        end if

        ' Kontroller om det er et engelsk-ord felt
        if lcase(left(fld,7)) = "engelsk" then
            ' Slet det engelske ord og de tilhørende informationer
            ' til det engelske ord (klasse og orden)
            engid = right(fld,len(fld)-8)
            strSQL = "DELETE tbl_english SET "
            strSQL = strSQL & " Engelsk='" & Replace(Request.Form("Engelsk_" & engid), "'", "''") & "'"
            strSQL = strSQL & " WHERE id_english ="& engid
            Conn.Execute(strSQL)
        end if
    next
end if
%>
                  <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>

<%
searchText = replace(request.form("text"),"'","''")
if searchText = "" then
  searchText = replace(request.querystring("search"),"'","''")
end if

strSQL ="SELECT tbl_danish.id_dansk, tbl_danish.Dansk, tbl_english.id_english, tbl_english.Engelsk FROM tbl_danish INNER JOIN tbl_english ON tbl_danish.id_dansk = tbl_english.fr_dansk WHERE"
strSQL = strSQL & " (tbl_danish.Dansk LIKE '%" & searchText & "%')"

strSQL = "DELETE FROM tbl_danish where id_dansk="&request.form("Delete")
Conn.Execute(strSQL)

%>
                  </p>
                  <div align="center">
<form action="<%=Request.ServerVariables("SCRIPT_NAME")%>" method="post">
  <input type="hidden" name="text" value="<%=request.form("text")%>">
<%
Do While Not rs.EOF
%>

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

<%
    rs.MoveNext
Loop
%>
                             
</form>

<%
' Luk databaseforbindelse
Conn.Close
Set Conn = Nothing
%>
</p>
Avatar billede softspot Forsker
20. december 2007 - 15:44 #1
Er det meningen at denne sætning skal stå midt i det hele og udføres hver gang siden vises??:

strSQL = "DELETE FROM tbl_danish where id_dansk="&request.form("Delete")
Conn.Execute(strSQL)

Jeg gætter på at det er den der fejler (fordi du ikke poster hver gang siden vises)...
Avatar billede hwks Nybegynder
20. december 2007 - 17:10 #2
Hey softspot - dig igen? Det er jo perfekt - tak for det...


Jeg har fjernet linjen - nu vises følgende fejlmeddelelse:


Microsoft VBScript runtime error '800a01a8'

Object required: ''

/cowi/cowilex_slet_show.asp, line 230

og linje 230 er den her:

*****
Do While Not rs.EOF
*****

Hmmm??
Avatar billede softspot Forsker
20. december 2007 - 17:47 #3
Du skal bibeholde linien der udfører din SELECT-SQL, det er kun den linie med DELETE-SQL-sætningen du skal fjerne. Så burde det i det mindste ikke give den fejl...
Avatar billede softspot Forsker
20. december 2007 - 18:14 #4
Og det vil sige i stedet for disse linier:

strSQL ="SELECT tbl_danish.id_dansk, tbl_danish.Dansk, tbl_english.id_english, tbl_english.Engelsk FROM tbl_danish INNER JOIN tbl_english ON tbl_danish.id_dansk = tbl_english.fr_dansk WHERE"
strSQL = strSQL & " (tbl_danish.Dansk LIKE '%" & searchText & "%')"

strSQL = "DELETE FROM tbl_danish where id_dansk="&request.form("Delete")
Conn.Execute(strSQL)


Skal du blot have disse linier i stedet:

strSQL ="SELECT tbl_danish.id_dansk, tbl_danish.Dansk, tbl_english.id_english, tbl_english.Engelsk FROM tbl_danish INNER JOIN tbl_english ON tbl_danish.id_dansk = tbl_english.fr_dansk WHERE"
strSQL = strSQL & " (tbl_danish.Dansk LIKE '%" & searchText & "%')"

Conn.Execute(strSQL)
Avatar billede hwks Nybegynder
20. december 2007 - 19:39 #5
Hej igen - den kommer stadig med den samme fejl

Microsoft VBScript runtime error '800a01a8'

Object required: ''

/test/cowilex_slet_show.asp, line 234

og linje 234 er stadig:

*****
Do While Not rs.EOF
*****

Kan du se hvad der går galt?
Avatar billede softspot Forsker
20. december 2007 - 19:58 #6
Argh! Fordømt! Jeg havde ikke lige set at der manglede en variabel til det recordset som conn.execute returnerer. Prøv denne version i stedet:

strSQL ="SELECT tbl_danish.id_dansk, tbl_danish.Dansk, tbl_english.id_english, tbl_english.Engelsk FROM tbl_danish INNER JOIN tbl_english ON tbl_danish.id_dansk = tbl_english.fr_dansk WHERE"
strSQL = strSQL & " (tbl_danish.Dansk LIKE '%" & searchText & "%')"

set rs = Conn.Execute(strSQL)
Avatar billede hwks Nybegynder
20. december 2007 - 20:20 #7
NU sker der ting og sager.... den viser de to poster korrekt, men når jeg klikker på knappen Delete får jeg den her fejl:

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

[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'tbl_danish SET Dansk='test' WHERE id_dansk =9679'.

/test/cowilex_slet_show.asp, line 181

og linje 181 er

****
Conn.Execute(strSQL)
****

Syntaksfejl?
Avatar billede softspot Forsker
20. december 2007 - 22:09 #8
Ja, det ser ud til at dine SQL-sætninger til sletning er nappet fra noget kode til at opdatere. Formatet for en sletning i SQL er:

DELETE FROM tabel WHERE felt = værdi

Det betyder at begge dine sletsætninger skal ændres til følgende format (den danske først):

strSQL = "DELETE FROM tbl_danish "         
strSQL = strSQL & " WHERE id_dansk = " & danid

(og så den engelske):

strSQL = "DELETE FROM tbl_english "
strSQL = strSQL & "WHERE id_english = " & engid
Avatar billede hwks Nybegynder
20. december 2007 - 22:40 #9
Softspot - du er en stjerne!

Nu sletter den - men desværre alle de poster den finder frem... jeg har indtastet 3 poster - test1, test2 og test3. Den finder fint alle tre frem, men hvis jeg vælger at ville slette den første f.eks. test1 - og klikker på knappen for test1 - så napper den alle tre og sletter dem?
Avatar billede softspot Forsker
20. december 2007 - 23:21 #10
Umiddelbart synes jeg også der mangler en eller anden form for markering af hvilke tekster der skal slettes. Som jeg ser det er der ikke nogen kobling mellem den slet-knap der trykkes og den tekst der skal slettes (der mangler et id på knappen, som dem der er på tekst-felterne). Derfor tror jeg din kode skal ændres lidt. Kan du ikke prøve at smide den kode du er nået frem til indtil nu, så jeg ikke skal sidde og sammenstykke den af ovenstående posts?
Avatar billede hwks Nybegynder
20. december 2007 - 23:27 #11
Naturligvis - det hele er her:

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

if Request.Form("Delete") <> "" then
    dim strSQL
    dim fld
    dim danDeleted
    danDeleted = ","
   
    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 slettet
            if instr(1,danDeleted, "," & danid & ",") = 0 then
                ' hvis ikke tidligere opdateret, så gemmes id på ordet, så det
                ' ikke bliver opdateret flere gange i dette postback
                danDeleted = danDeleted & danid & ","
                strSQL = "DELETE FROM tbl_danish "         
                strSQL = strSQL & " WHERE id_dansk = " & danid
                Conn.Execute(strSQL)
            else
                Response.Write("Desværre - det lykkedes ikke at finde den ønskede post til sletning. Prøv igen. ("& fld &")<br>")
            end if
        end if

        ' Kontroller om det er et engelsk-ord felt
        if lcase(left(fld,7)) = "engelsk" then
            ' Slet det engelske ord og de tilhørende informationer
            ' til det engelske ord (klasse og orden)
            engid = right(fld,len(fld)-8)
            strSQL = "DELETE FROM tbl_english "
            strSQL = strSQL & "WHERE id_english = " & engid
            Conn.Execute(strSQL)
        end if
    next
end if
%>
                  <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>

<%
searchText = replace(request.form("text"),"'","''")
if searchText = "" then
  searchText = replace(request.querystring("search"),"'","''")
end if

strSQL ="SELECT tbl_danish.id_dansk, tbl_danish.Dansk, tbl_english.id_english, tbl_english.Engelsk FROM tbl_danish INNER JOIN tbl_english ON tbl_danish.id_dansk = tbl_english.fr_dansk WHERE"
strSQL = strSQL & " (tbl_danish.Dansk LIKE '%" & searchText & "%')"

set rs = Conn.Execute(strSQL)
%>
                  </p>
                  <div align="center">

<form action="<%=Request.ServerVariables("SCRIPT_NAME")%>" method="post">
  <input type="hidden" name="text" value="<%=request.form("text")%>">

<%
Do While Not rs.EOF
%>

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

<%
    rs.MoveNext
Loop
%>
                             
</form>

<%
' Luk databaseforbindelse
Conn.Close
Set Conn = Nothing
%>
Avatar billede softspot Forsker
20. december 2007 - 23:47 #12
Tak :)

Jeg er lidt usikker på hvordan din sletning skal foregå, da data ligger i to forskellige tabeller. Dog vil jeg mene at, hvis du sletter en dansk udgave, så skal den engelske også slettes. Hvis det er korrekt, så kan du gøre det nogenlunde således::

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

' Undersøg om det er et postback (dvs. tryk på en knap eller submit-handling)
if ucase(Request.ServerVariables("REQUEST_METHOD")) = "POST" then
  dim strSQL
  dim fld
  dim danid

  for each fld in Request.Form
    ' Undersøg om det er sletknappen der aflæses
    if left(fld,7) = "Delete_" then
      ' Sletknappen er fundet, nu skal vi have udtrukket id'et på det der ønskes slettet
      danid = mid(fld,8)

      ' Udfør sletning af den danske tekst
      strSQL = "DELETE FROM tbl_danish WHERE id_dansk = " & danid
      Conn.Execute(strSQL)

      ' Udfør sletning af den engelske tekst som "hører til" den danske
      strSQL = "DELETE FROM tbl_english WHERE fr_dansk = " & danid
      Conn.Execute(strSQL)
    end if
  next
end if
%>
<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>

<%
searchText = replace(request.form("text"),"'","''")
if searchText = "" then
  searchText = replace(request.querystring("search"),"'","''")
end if

strSQL ="SELECT tbl_danish.id_dansk, tbl_danish.Dansk, tbl_english.id_english, tbl_english.Engelsk FROM tbl_danish INNER JOIN tbl_english ON tbl_danish.id_dansk = tbl_english.fr_dansk WHERE"
strSQL = strSQL & " (tbl_danish.Dansk LIKE '%" & searchText & "%')"

set rs = Conn.Execute(strSQL)
%>
  </p>
  <div align="center">

<form action="<%=Request.ServerVariables("SCRIPT_NAME")%>" method="post">
  <input type="hidden" name="text" value="<%=request.form("text")%>">

<%
Do While Not rs.EOF
%>

  <p>Dansk:<br>
    <input type="text" value="<%=rs("Dansk")%>" name="Dansk_<%=rs("id_dansk")%>" onchange="syncWords(this)" size="60">
  </p>
  <p>Engelsk:<br>
    <input type="text" value="<%=rs("Engelsk")%>" name="Engelsk_<%=rs("id_english")%>" size="60">
  </p>
  <p>
    <input type="submit" value="  Delete  " name="Delete_<%=rs("id_dansk")%>">
  </p>

<%
    rs.MoveNext
Loop
%>
                             
</form>

<%
' Luk databaseforbindelse
Conn.Close
Set Conn = Nothing
%>
Avatar billede hwks Nybegynder
21. december 2007 - 00:08 #13
Sådan - det er perfekt!

Den sletter den post man ønsker nu! Du er en forjulshelt og jeg er meget glad for din tid og hjælp. Kast et svar - så får du point.

Tak igen - og god jul!
Avatar billede softspot Forsker
21. december 2007 - 00:28 #14
Velbekomme :-)

God jul til dig også!
Avatar billede softspot Forsker
21. december 2007 - 12:36 #15
Tak for point :)
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