Avatar billede guldklumpen Nybegynder
08. januar 2006 - 21:32 Der er 26 kommentarer og
1 løsning

update i loop

Jeg har brug for hjælp til et ASP script der skal løbe en tabel igennem og opdatere de valg der er foretaget.

Der er f.eks 10 rækker i tabellen og de skal så ud i en form via et loop og derefter opdateres med de valg der er foretaget.

Hvordan gør man lige det?
Avatar billede tjp Mester
08. januar 2006 - 23:30 #1
Hvilken tabel og hvor er den henne? Og til hvilken form?
Prøv at konkretisér det lidt. ;-)
Avatar billede softspot Forsker
09. januar 2006 - 09:05 #2
En metode ville være at kombinere rækkernes id'er med de enkelte feltnavne, så kan du nemlig finde tilbage til de rigtige data når du skal opdatere i databasen igen.

Eksempel:
Formularen genereres med de rækker der nu er trukket ud af databasen, dvs. formularen er dynamisk i størrelse alt efter hvormange rækker du trækker ud.

<form>
<%
do while not rs.eof
%>
  Navn: <input type="text" name="txtNavn_<%=rs("id")%>" value="<%=rs("navn")%>"><br>
  Adresse: <input type="text" name="txtAdresse_<%=rs("id")%>" value="<%=rs("adresse")%>"><br>
<%
  rs.movenext
loop
%>
  <input type="submit" value="Gem ændringer">
</form>

På serveren kan du så gennemløbe de felter som er sendt og trække id ud af feltnavnet og benytte dette til opdatering.

<%
if request.servervariables("REQUEST_METHOD") = "POST" then
  for each fld in request.form
    fldParts = split(fld, "_")
    if ubound(fldParts) = 1 and fldParts(0) = "txtNavn" then
      navnValue = replace(request.form("txtNavn_" & fldParts(1)),"'","''")
      adresseValue = replace(request.form("txtAdresse_" & fldParts(1)),"'","''")
      sql = "UPDATE tabel " & _
            "SET navn = '" & navnValue & "'" & _
            ",  adresse = '" & adresseValue & "'" & _
            " WHERE id = " & fldParts(1)
      objConn.Execute(sql)
    end if
  next
end if
%>

Dette er et eksempel og aldeles utestet, så derfor garanterer jeg ikke for at det fungerer perfekt, men princippet skulle være brugbart, hvis du kan omsætte det til din egen databasestruktur...
Avatar billede guldklumpen Nybegynder
09. januar 2006 - 09:28 #3
det er lige sådan noget jeg skal bruge - får desværre ikke tid til at se på det før senere i dag.
Glæder mig til at afprøve.
Avatar billede guldklumpen Nybegynder
09. januar 2006 - 17:15 #4
Nu har jeg afprøvet det, men det virker ikke.

Det ser ud som om den gennemløber fint nok, men der bliver ikke opdateret.

Håber du vil hjælpe mig!!!

Her er min form:

<form action="opdater.asp?" method="post">
<input type=text name="txthold<%=rs("id")%>" value="<%=rs("hold")%>" size=20>
<input type=text name="txtkampe<%=rs("id")%>" value="<%=rs("kampe")%>" size=1>
<input class="text" type="submit" value="Opdater" name="submit">


Her er min opdater.asp:

DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("database.mdb")
    Conn.Open DSN

if request.servervariables("REQUEST_METHOD") = "POST" then
  for each fld in request.form
    fldParts = split(fld, "_")
    if ubound(fldParts) = 1 and fldParts(0) = "txthold" then
      holdValue = replace(request.form("txthold_" & fldParts(1)),"'","''")
      kampeValue = replace(request.form("txtkampe_" & fldParts(1)),"'","''")
      sql = "UPDATE stilling " & _
            "SET hold = '" & holdValue & "'" & _
            ",  kampe = '" & kampeValue & "'" & _
            " WHERE id = " & fldParts(1)
      Conn.Execute(sql)
    end if
  next
end if
Avatar billede guldklumpen Nybegynder
09. januar 2006 - 17:23 #5
jeg skal vel også lave et eller andet loop med request.form???
Avatar billede softspot Forsker
09. januar 2006 - 17:36 #6
Du skal huske at overholde formatet på felterne, dvs. feltnavnet skal adskilles af underscore (ellers virker split-funktionen ikke efter hensigten).

Du itererer igennem alle form-felter med for each, så svaret til dit sidste spørgsmål er: det gør du allerede :)
Avatar billede softspot Forsker
09. januar 2006 - 17:38 #7
Det jeg gerne ville have sagt var at feltnavn OG ID skal adskilles af underscore (altså txthold_<%=rs("id")%> og ikke som du gør nu txthold<%=rs("id")%>).
Avatar billede guldklumpen Nybegynder
09. januar 2006 - 18:24 #8
yes - det virker.

Tusind tak for hjælpen.

Post lige et svar
Avatar billede softspot Forsker
09. januar 2006 - 20:58 #9
Kommer der - velbekomme :)
Avatar billede guldklumpen Nybegynder
09. januar 2006 - 21:17 #10
Jeg har et tillægsspm. og vil gerne smide flere p. oveni.

Har lidt problemer med ovennævnte hvis det er en checkbox (true/false) der skal opdateres.
Avatar billede softspot Forsker
09. januar 2006 - 22:32 #11
Ja, det er fordi checkbokse opfører sig lidt specielt. Det er nemlig sådan at den kun vil figurere i request.form-collection, hvis den er checked. Det betyder at du nok skal lave en konstruktion á la

valgChecked = (request.form("chkValg_" & fldParts(1)) & "" <> "")

og så kan du benytte den boolske værdi i din opdatering (hvis altså det er et boolsk felt i databasen du vil opdatere med denne checkbox)...
Avatar billede guldklumpen Nybegynder
09. januar 2006 - 22:46 #12
sådan ser min form ud - det er den enenste post der skal opdateres

<input type="checkbox" name="chkudvalg_<%=rs("id")%>" value="true" <%if  RSudvalg=true then%> checked=checked<%end if%>>

er sgu ikke helt skarp til et her.
Avatar billede softspot Forsker
10. januar 2006 - 08:14 #13
Så burde du på serversiden kunne udføre denne linie for at finde ud af om checkboksen er afkrydset:

udvalgChecked = (request.form("chkudvalg_" & fldParts(1)) & "" <> "")

Det der sker i den linie er at der checkes på om form-elementet chkudvalg<ID> sammensat med en tom streng giver andet end en tom streng (det vil den kun gøre hvis den er afkrydset og chkudvalg<ID>'s value-attribut har en værdi - som din jo har).
Den værdi som ligger i udvalgChecked kan du så som sagt bruge i din update sqlsætning, f.eks. således:

      sql = "UPDATE stilling " & _
            "SET hold = '" & holdValue & "'" & _
            ",  kampe = '" & kampeValue & "'" & _
            ",  udvalg = " & udvalgChecked & _
            " WHERE id = " & fldParts(1)
Avatar billede guldklumpen Nybegynder
10. januar 2006 - 11:38 #14
har prøvet det du skrev - det er godt nok en anden tabel det drejer sig om.

får følgende fejl:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E10)
[Microsoft][ODBC Microsoft Access-driver] Der er for få parametre. Der var ventet 1.


min update ser således ud:

      navnValue = replace(request.form("txtnavn_" & fldParts(1)),"'","''")
      udvalgChecked = (request.form("chkudvalg_" & fldParts(1)) & "" <> "")
      sql = "UPDATE kontakt " & _
            "SET navn = '" & navnValue & "'" & _
        ",  administration = " & udvalgChecked & _
            " WHERE id = " & fldParts(1)


min form er følgende:

<input type=text name="txtnavn_<%=rs("id")%>" value="<%=rs("navn")%>">
<input type="checkbox" name="chkudvalg_<%=rs("id")%>" value="true" <%if  RSudvalg=true then%> checked=checked<%end if%>>


Du skal bare sige til hvis du bliver trær af mig.
Avatar billede softspot Forsker
10. januar 2006 - 11:51 #15
Hmmm... det lyder som om at du har stavet navnet på et af dine felter forkert (og så opfatter databasen det som en parameter der skal udfyldes med en værdi, som den ikke får). Check lige om dine feltnavne er stavet korrekt i den UPDATE-sætning...
Avatar billede softspot Forsker
10. januar 2006 - 11:52 #16
...hvis feltnavnene er stavet korrekt så prøv evt. at ændre administration til [administration] i stedet.
Avatar billede guldklumpen Nybegynder
10. januar 2006 - 12:21 #17
Har prøvet snart alt og det vil bare ikke virke - giver op.
Avatar billede softspot Forsker
10. januar 2006 - 12:34 #18
Alt er vel en anelse overdrevet...? :)

Har du mulighed for at dumpe database-tabellen i en stump grafik og linke til det et eller andet sted?

I øvrigt skal dit formfelt for checkboksen nok se således ud i stedet for den du viste tidligere:

<input type=text name="txtnavn_<%=rs("id")%>" value="<%=rs("navn")%>">
<input type="checkbox" name="chkudvalg_<%=rs("id")%>" value="true" <%if  RSudvalg=true then%> checked<%end if%>>


Hvor kommer RSudvalg i øvrigt fra? Skal det evt. være rs("udvalg") i stedet?
Avatar billede guldklumpen Nybegynder
10. januar 2006 - 12:55 #19
skærmkopi tabel - www.dalumif.dk/tabel.gif

RSudvalg kommer fra følgende

        <% if udvalg="administration" then
        RSudvalg = rs("administration")%>
        <% elseif udvalg="elite" then
        RSudvalg = rs("elite")%>
        <% elseif udvalg="webudvalg" then
        RSudvalg = rs("webudvalg")%>
        <% end if %>


Det virker fint nok bare det ikke er en checkbox der skal opdateres.
Avatar billede softspot Forsker
10. januar 2006 - 13:11 #20
...og hvor var det nu lige udvalg kom fra?
Avatar billede softspot Forsker
10. januar 2006 - 13:14 #21
I øvrigt vil jeg da anbefale denne forgreningsstruktur i stedet:

        select udvalg
          case "administration"
            RSudvalg = rs("administration")
          case "elite"
            RSudvalg = rs("elite")
          case "webudvalg"
            RSudvalg = rs("webudvalg")
          case else
            err.raise 10001, "udvalg ikke specificeret eller har en ukendt værdi."
        end select

case else-delen er lige medtaget for at fange evt. ulovlige værdier. Det kan godt være du vil håndtere det på en anden måde, men den bør håndteres i situationer som denne (det kunne jo være at der var en fejl i koden - selvom det er totalt usandsynligt ;-))...
Avatar billede guldklumpen Nybegynder
10. januar 2006 - 13:16 #22
<% if request.querystring("ld")="3" then
        strSQL = "select * from kontakt order by administration"
        Dim udvalg
        udvalg="administration"
        elseif request.querystring("ld")="4" then
        strSQL = "select * from kontakt order by elite"
        udvalg="elite"
        elseif request.querystring("ld")="5" then
        strSQL = "select * from kontakt order by webudvalg"
        udvalg="webudvalg"
        end if %>
Avatar billede softspot Forsker
10. januar 2006 - 13:32 #23
Hvis nu du umiddelbart efter denne linie

      sql = "UPDATE kontakt " & _
            "SET navn = '" & navnValue & "'" & _
        ",  administration = " & udvalgChecked & _
            " WHERE id = " & fldParts(1)


skriver

response.write sql
response.end

hvad skrives der så i din browser?
Avatar billede guldklumpen Nybegynder
10. januar 2006 - 13:46 #24
UPDATE kontakt SET navn = 'Jan Hansen', administration = Sand WHERE id = 10
Avatar billede softspot Forsker
10. januar 2006 - 13:50 #25
Hmmm... den der værdi Sand ser lidt suspekt ud, men på den anden side, så burde det vel fungere i en dansk udgave af Access...

Prøv evt.:

      if udvalgChecked then
        strudvalgChecked = "True"
      else
        strudvalgChecked = "False"
      end if
      sql = "UPDATE kontakt " & _
            "SET navn = '" & navnValue & "'" & _
        ",  administration = " & strudvalgChecked & _
            " WHERE id = " & fldParts(1)
Avatar billede guldklumpen Nybegynder
10. januar 2006 - 13:57 #26
Den der - tak for din store tålmodighed.

Jeg er superglad.

smider lige 40 p oveni.

Takker 10000000 gange
Avatar billede softspot Forsker
10. januar 2006 - 14:00 #27
Det var rart (selvom alt var prøvet, var der alligevel en løsning ;D).

Mange 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