Avatar billede lasserasch Juniormester
12. august 2005 - 20:45 Der er 22 kommentarer og
1 løsning

Hvordan opdaterer man en database med mange data i samme form?

Jeg har brug for hjælp.


Jeg forsøger at lave et administrationsmodul til en online vagtplan.

Jeg kan sagtens hente data ud fra min MS SQL database, men jeg ved ikke hvordan jeg kan opdatere alle data igen på en gang.

Jeg ønsker at man kan redigere i de data man har lyst til, og så trykker på en submitknap for at gemme hele molevitten på en gang.

Men hvordan pokker gør man det?

Jeg henter data ud fra min database ved brug af en løkke. Jeg spørger altså efter alle data som er registreret omkring uge 40 og udskriver dem til forskellige kolloner i en tabel.

Men hvordan får man alle data fra alle kollonerne opdateret i databasen på en gang?


Håber en kan hjælpe !

Resultatet af min kode kan ses her :
Se http://bowlnfun.flexynet.dk/admin/vagtplan/rediger-test.asp


--------------------
<!--#include file = "includes/sql_connect.asp" -->






  <% Set rs = Server.CreateObject("ADODB.Recordset")
  uge = "40"
  rs.Open "SELECT * FROM bafkvagtplan WHERE week = '"&uge&"' ",strsqlconnect

   



        if rs.eof then %>
    <table width="80%" height="100%" border="1" class="XPBlueText">
    <tr><td>

    <% response.write "Ingen data fundet" %>
        </td></tr></table>
        <% rs.close
          response.end %>
     
       


        <% else %>

    <form action="savevagtplan.asp" method="POST" name="SAVE">
    <input type="hidden" name="week" value="<%=uge%>" >
    <center><input type="submit" name="gem" value="OPDATER VAGTPLANEN"></center>
    <br>
       
        <table width="80%" height="100%" border="1" class="XPBlueText">
        <tr><td>Medarbejdernavn</td><td>Mandag</td><td>Tirsdag</td></tr>
   
    <% do %>
    <% idnumber = rs("id") %>
    <% navn    = rs("name") %>
    <% fra    = rs("starttime") %>
    <% til    = rs("endtime") %>
    <% tupe    = rs("type") %>

    <tr>
   
        <td valign="top" width="10%"><%=navn%> <br>
                                      Fra Kl.<br>
                                      Til Kl.<br>
                                      Type 
        </td>

    <td valign="top" width="10%">

        <% if rs("weekday") <> "Mandag" then %>
        <input type="text" name="fra" value="">
        <input type="text" name="til" value="">
        <input type="hidden" name="navn" value="&nbsp;" >


        <select name="type" class="XPBlueTextblack">
        <option selected></option>
        <option>Service</option>
        <option>Ansvarlig</option>
        </select>
       
        <% else %>

        <input type="hidden" name="<%=idnumber%>" value="<%=idnumber%>">
        <input type="text" name="fra" value="<%=fra%>">
        <input type="text" name="til" value="<%=til%>">
        <input type="hidden" name="navn" value="<%=navn%>" >

       
            <% if rs("type") = "Lukkeansvarlig" then %>

            <select name="type" class="XPBlueTextblack">
            <option selected></option>
            <option>Service</option>
            <option selected>Ansvarlig</option>
            </select>

            <% else %>
       
            <select name="type" class="XPBlueTextblack">
            <option selected></option>
            <option selected>Service</option>
            <option>Ansvarlig</option>
            </select>

            <% end if %>



        <% end if %>

    </td>



      <td valign="top" width="10%">

        <% if rs("weekday") <> "Tirsdag" then %>
        <input type="text" name="fra" value="">
        <input type="text" name="til" value="">
        <input type="hidden" name="navn" value="&nbsp;" >


        <select name="type" class="XPBlueTextblack">
        <option selected></option>
        <option>Service</option>
        <option>Ansvarlig</option>
        </select>
       
        <% else %>

        <input type="hidden" name="<%=idnumber%>" value="<%=idnumber%>">
        <input type="text" name="fra" value="<%=fra%>">
        <input type="text" name="til" value="<%=til%>">
        <input type="hidden" name="navn" value="<%=navn%>" >

       
            <% if rs("type") = "Lukkeansvarlig" then %>

            <select name="type" class="XPBlueTextblack">
            <option selected></option>
            <option>Service</option>
            <option selected>Ansvarlig</option>
            </select>

            <% else %>
       
            <select name="type" class="XPBlueTextblack">
            <option selected></option>
            <option selected>Service</option>
            <option>Ansvarlig</option>
            </select>

            <% end if %>


        <% end if %>
       

    </td>
        </tr>








<%  rs.MoveNext
    loop While Not rs.EOF %>
<%  rs.close %>
<% end if %>


</table>
</form>


-------------------------
Avatar billede softspot Forsker
12. august 2005 - 20:53 #1
Du kunne f.eks. transportere dine data som XML og så gemme dem i en dataisland. Der kan du så ændre data på klienten som du har lyst. Når du data skal gemmes, sender du XML'en tilbage til serveren og opdaterer data efter behov.
Avatar billede softspot Forsker
12. august 2005 - 20:54 #2
Jeg er dog ikke klar over hvor godt dataislands er understøttet i andre browsere end IE...
Avatar billede lasserasch Juniormester
12. august 2005 - 20:56 #3
Det er lige meget! IE er alt hvad sitet skal understøtte...

Jeg er bare ikke så hård til XML. Faktisk helt på bar bund, men det må jeg jo så sætte mig lidt ind i!
Avatar billede softspot Forsker
12. august 2005 - 21:00 #4
Ja, med mindre du vil benytte andre metoder, for du kan jo også "bare" sende data til klienten i en streng, som du så vedligeholder på klienten vha. javascript. Sålænge strengen har et veldefineret format, burde det være muligt at vedligeholde det med strengbehandling. XML er jo bare et veldefineret format som er standardiseret ;)
Avatar billede softspot Forsker
12. august 2005 - 21:04 #5
Jeg kunne f.eks. forestille mig et format á la:

[medarbejderid];[medarbejdernavn];[dato];[starttidspunkt];[sluttidspunkt];[type]
[medarbejderid];[medarbejdernavn];[dato];[starttidspunkt];[sluttidspunkt];[type]
[medarbejderid];[medarbejdernavn];[dato];[starttidspunkt];[sluttidspunkt];[type]
[medarbejderid];[medarbejdernavn];[dato];[starttidspunkt];[sluttidspunkt];[type]

og så kunne du først splitte strengen op omkring linieskift, for at isolere de enkelte personers vagter. Derefter kan du splitte hver vagt op omkring semikolon, for at få adgang til de enkelte felter. Der findes jo på string-objektet i javascript en split, som kan det trick rimelig godt :)
Avatar billede softspot Forsker
12. august 2005 - 21:05 #6
Når du så er færdig med at redigere, kan du samle tingene sammen med array-objektets join-funktion og sende data tilbage til serveren igen (hvor de samme funktionaliteter ligger til at pakke data ud og gemme dem i databasen).
Avatar billede softspot Forsker
12. august 2005 - 21:07 #7
VBScript har jo også Split og Join funktionerne så det kan du sagtens få til at fungere. Du skal blot finde dig en separator som ikke bliver brugt i selve data (eller får du problemer med dit format! :))
Avatar billede busschou Praktikant
12. august 2005 - 23:16 #8
citat
---
Men hvordan får man alle data fra alle kollonerne opdateret i databasen på en gang?
---
Hvad mener du mon med på een gang? Ligesom du har et loop når du udskriver din form ville det så gøre noget at have et loop til at opdatere?
Altså hvis du har fx 10 medarbejdere, gør det så noget at du laver 10 updates, een for hver?
Når du nu har een form så er det jo sådan at input felter med samme navn vil blive slået sammen med et plus imellem (mener jeg, måske er det et komma)
Med andre ord kan du jo så køre en løkke på disse ala
---
idArr = split(request.form("idnumber"),"+")
fraArr = split(request.form("fra"),"+")
//osv med de andre felter
for i = 0 to obound(idArr)
  conn.execute("update tabel set fra = "&fraArr(i)&" where id = "&idArr(i)
next
---
Sådan ville jeg nok gøre, men måske jeg har misforstået noget, er lidt i tvivl efter at have læst softspots kommentarer :o)
Avatar billede lasserasch Juniormester
12. august 2005 - 23:22 #9
Det er lige nøjagtig det som jeg ledte efter. Vidste ikke man kunne gøre på det den måde....


Pis, nu er jeg begyndt at lave en submitbutton i hver kollone.... Så skal jeg til at lave en del om igen! Men du har forstået det helt korrekt! Det var lige netop det jeg ledte efter!

Giv lige et svar i stedet for kommentar, så får du points!
Avatar billede busschou Praktikant
12. august 2005 - 23:23 #10
ok, så håber jeg du får det til at virke som forventet, ellers må du råbe højt igen :o)
Avatar billede lasserasch Juniormester
04. september 2005 - 23:13 #11
Hejsa Busschou. Håber du får mails når der sker noget nyt i et indlæg, så du får nys om at jeg nu har skrevet videre på dette...

Det driller mig lidt, så jeg håber du kan hjælpe. Du sagde jo at jeg bare skulle råbe højt. Så det gør jeg hermed...


Jeg får følgende fejl i mit script :
------------
Microsoft VBScript runtime error '800a000d'

Type mismatch: 'obound'

/admin/vagtplan/savevagtplan.asp, line 35
------------


Mit script ser således ud :


---------------

<!--#include file = "includes/sql_connect.asp" -->

<%

    centervagtplan = session("centernavn")
    centervagtplan = centervagtplan + "vagtplan"
    uge = request.form("uge")

       
        if uge = "Vælg her" then %>
        <table width="100%" height="100%" bgcolor="#000000">
        <tr><td><center><font color="#FFFFFF">DU HAR IKKE VALGT UGE !!!</font></center></td></tr>
        </table>
       
        <form action="../../index.asp?site=admin&subsite=vagtplan" method="POST">
        <input type="submit" name="return" value="TILBAGE"></form>
       
        <% else


id = split(request.form("idnumber"),"+")
starttime = split(request.form("idnumber"),"+")
endtime = split(request.form("idnumber"),"+")
tupe = split(request.form("idnumber"),"+")
name = split(request.form("idnumber"),"+")
uge = split(request.form("fra"),"+")
free = split(request.form("idnumber"),"+")
todo = split(request.form("idnumber"),"+")
seq_no = split(request.form("seq_no"),"+")

Set rs = Server.CreateObject("ADODB.Recordset")

    for i = 0 to obound(seq_no)
 

        if todo = "update" then ' Dette bliver udført hvis der skal updateres en vagt

       
        rs.Open "UPDATE "&centervagtplan&" SET tupe = '"&tupe(i)&"', starttime = '"&starttime(i)&"'," &_
        " endtime = '"&endtime(i)&"' WHERE id = '"&id(i)&"' AND week = '"&uge(i)&"' AND " &_
        " weekday = '"&ugedag(i)&"' ",strsqlConnect

       
        elseif todo = "gem" then ' Dette bliver udført hvis der skal gemmes en ny vagt.
           
            if starttime <> "" AND endtime <> "" AND tupe <> "" then
            rs.Open "INSERT INTO "&centervagtplan&" " &_
            "(id, starttime, endtime, tupe, weekday, name, week, free)" &_
            " VALUES ('"&id&"', '"&starttime&"', '"&endtime&"', '"&tupe&"', " &_
            " '"&ugedag(i)&"', '"&name(i)&"', '"&uge(i)&"', '"&free(i)&"') ",strsqlConnect
            end if
       
        end if
    next

    response.redirect "../../index.asp?site=admin&subsite=vagtplan&uge="&uge&""

    end if %>

-------------


Som du kan se, så henter jeg en variabel der hedder : todo fra min form. Denne variabel bestemmer om der skal opdateres eksisterende data eller om der skal skrives nye til databasen. Men det skulle vel ikke være noget problem!

Håber du kan se hvor jeg har lavet en fejl.



Med venlig hilsen
Lasse.
Avatar billede lasserasch Juniormester
04. september 2005 - 23:16 #12
Ups.... Første fejl hermed fundet.

Det skal naturligvis være :
todo = split(request.form("todo"),"+")

Men det ændrer ikke noget ved fejlen!

Linie 33 er i øvrigt : for i = 0 to obound(seq_no)

seq_no er en talværdi som er unik i databasen.
Avatar billede softspot Forsker
04. september 2005 - 23:18 #13
funktionen hedder UBound og ikke OBound...
Avatar billede busschou Praktikant
04. september 2005 - 23:19 #14
jup ubound ;o)
Avatar billede softspot Forsker
04. september 2005 - 23:22 #15
...men hvis seq_no er en talværdi skal du ikke splitte den og tage ubound på den, så kan du bare bruge den som den er...

for i = 0 to seq_no

eller har jeg ikke hørt ordentlig efter i timen..?
Avatar billede lasserasch Juniormester
04. september 2005 - 23:31 #16
Hmmm.... Ja det hjalp. Jeg forstår det ikke helt. Er det ikke ganske alm. ASP kode, selvom det står mellem :

for i = 0 to seq_no 

og

next ???

Nu får jeg en anden dum fejl. Jeg ville da mene at koden står korrekt skrevet.

Fejlen er : Type mismatch
på linie 36 som er : if todo = "update" then

Er det mig der er helt forkert på den???
Avatar billede lasserasch Juniormester
04. september 2005 - 23:38 #17
Ahhh... Der skal jo stå : if todo(i) = "update" then


Dumme mig...
Avatar billede softspot Forsker
04. september 2005 - 23:39 #18
Det er ikke korrekt, hvis todo er et tal. Men ellers er formatet fint nok...
Avatar billede softspot Forsker
04. september 2005 - 23:39 #19
ok, der var lige en finesse der :)
Avatar billede lasserasch Juniormester
05. september 2005 - 01:07 #20
Ja, jeg er sgu ked at at skulle skrive igen.... Men jeg er lidt lost!


Har nogen en ide om hvorfor pokker jeg nu får fejlen : Subscript out of range: 'i'


Her er koden :



id         = split(request.form("idnumber"),",")
starttime     = split(request.form("fra"),",")
endtime     = split(request.form("til"),",")
tupe         = split(request.form("tupe"),",")
name         = split(request.form("navn"),",")
uge         = split(request.form("week"),",")
free        = split(request.form("free"),",")
todo        = split(request.form("todo"),",")
seq_no         = split(request.form("seq_no"),",")
ugedag         = split(request.form("weekday"),",")
   

    for i = 0 to Ubound(seq_no)
 


        if todo(i) = "update" then

       
        Set rs = Server.CreateObject("ADODB.Recordset")
          rs.Open "UPDATE "&centervagtplan&" SET tupe = '"&tupe(i)&"', starttime = '"&starttime(i)&"', endtime = '"&endtime(i)&"' WHERE id = '"&id(i)&"' AND week = '"&uge(i)&"' AND weekday = '"&ugedag(i)&"' ",strsqlConnect
        rs.close
       
        elseif todo(i) = "gem" then ' Dette bliver udført hvis der skal gemmes en ny vagt.
           
           
            Set rs = Server.CreateObject("ADODB.Recordset")
            rs.Open "INSERT INTO "&centervagtplan&" (id, starttime, endtime, tupe, weekday, name, week, free) VALUES ('"&id&"', '"&starttime&"', '"&endtime&"', '"&tupe&"', '"&ugedag(i)&"', '"&name(i)&"', '"&uge(i)&"', '"&free(i)&"') ",strsqlConnect
            rs.close       
        end if
    next





Har i umiddelbart en ide om hvad jeg gør galt?
Avatar billede lasserasch Juniormester
05. september 2005 - 01:12 #21
I får lige hele koden en gang til, for en god ordens skyld...

--------------

<!--#include file = "includes/sql_connect.asp" -->

<%

    centervagtplan = session("centernavn")
    centervagtplan = centervagtplan + "vagtplan"
    uge = request.form("uge")

       
        if uge = "Vælg her" then %>
        <table width="100%" height="100%" bgcolor="#000000">
        <tr><td><center><font color="#FFFFFF">DU HAR IKKE VALGT UGE !!!</font></center></td></tr>
        </table>
       
        <form action="../../index.asp?site=admin&subsite=vagtplan" method="POST">
        <input type="submit" name="return" value="TILBAGE"></form>
       
        <% else


id         = split(request.form("idnumber"),",")
starttime     = split(request.form("fra"),",")
endtime     = split(request.form("til"),",")
tupe         = split(request.form("tupe"),",")
name         = split(request.form("navn"),",")
uge         = split(request.form("week"),",")
free        = split(request.form("free"),",")
todo        = split(request.form("todo"),",")
seq_no         = split(request.form("seq_no"),",")
ugedag         = split(request.form("weekday"),",")
   

    for i = 0 to Ubound(seq_no)
 


        if todo(i) = "update" then

       
        Set rs = Server.CreateObject("ADODB.Recordset")
          rs.Open "UPDATE "&centervagtplan&" SET tupe = '"&tupe(i)&"', starttime = '"&starttime(i)&"', endtime = '"&endtime(i)&"' WHERE id = '"&id(i)&"' AND week = '"&uge(i)&"' AND weekday = '"&ugedag(i)&"' ",strsqlConnect
        rs.close
       
        elseif todo(i) = "gem" then ' Dette bliver udført hvis der skal gemmes en ny vagt.
           
           
            Set rs = Server.CreateObject("ADODB.Recordset")
            rs.Open "INSERT INTO "&centervagtplan&" (id, starttime, endtime, tupe, weekday, name, week, free) VALUES ('"&id(i)&"', '"&starttime(i)&"', '"&endtime(i)&"', '"&tupe&"', '"&ugedag(i)&"', '"&name(i)&"', '"&uge(i)&"', '"&free(i)&"') ",strsqlConnect
            rs.close       
        end if
    next

    ' response.redirect "../../index.asp?site=admin&subsite=vagtplan&uge=24"

    end if %>



--------------
Avatar billede softspot Forsker
05. september 2005 - 10:26 #22
Umiddelbart er der en alarmklokke der ringer for mine ører når jeg ser flg.:

  for i = 0 to Ubound(seq_no)
 
    if todo(i) = "update" then

du tager ubound på et array og bruger aktuelt indeks i det array til at indeksere et andet array - med mindre du er HELT sikker på at de to arrays er nøjagtig lige lange altid, så har du lagt grundlaget for kørselsfejlen: Subscript out of range.

Hvis du derimod mener at disse arrays (og det gælder også for alle de andre arrays du indekserer med størrelsen af seq_no-array'et) skal være lige lange, så er der noget galt med dit datagrundlag. Prøv at kig på data og se om de modsvarer dine forventninger...
Avatar billede lasserasch Juniormester
06. september 2005 - 02:48 #23
Så nu har jeg sørme fået scriptet til at virke korrekt.

Der var 2 fejl.

1. Fejl :
tupe        = split(request.form("tupe"),",")

Den variabel jeg førte med over hed ikke tupe men type.

2. Fejl :
Der var et space i slutningen af todo. Det har jeg ikke fjernet, men tilgengæld har jeg sat en trim på alle variabler jeg bruger. Så fjerner jeg jo evt. spaces... Det er fint nok....

Til andre som måske læser dette indlæg og har brug for samme funktion så ser den fungerende kode såleds ud :


----------------


<!--#include file = "includes/sql_connect.asp" -->

<%

    centervagtplan = session("centernavn")
    centervagtplan = centervagtplan + "vagtplan"
    week = request.form("uge")

       
        if week = "Vælg her" then %>
        <table width="100%" height="100%" bgcolor="#000000">
        <tr><td><center><font color="#FFFFFF">DU HAR IKKE VALGT UGE !!!</font></center></td></tr>
        </table>
       
        <form action="../../index.asp?site=admin&subsite=vagtplan" method="POST">
        <input type="submit" name="return" value="TILBAGE"></form>
       
        <% else


id         = split(request.form("id"),",")
starttime     = split(request.form("fra"),",")
endtime     = split(request.form("til"),",")
tupe         = split(request.form("type"),",")
name         = split(request.form("navn"),",")
uge         = split(request.form("week"),",")
free        = split(request.form("free"),",")
todo        = split(request.form("todo"),",")
seq_no         = split(request.form("seq_no"),",")
ugedag         = split(request.form("weekday"),",")
   

    for i = 0 to Ubound(seq_no)
  if trim(todo(i)) = "update" then

       
        Set rs = Server.CreateObject("ADODB.Recordset")
          rs.Open "UPDATE "&centervagtplan&" SET tupe = '"&trim(tupe(i))&"', starttime = '"&trim(starttime(i))&"', endtime = '"&trim(endtime(i))&"' WHERE id = '"&trim(id(i))&"' AND week = '"&trim(uge(i))&"' AND weekday = '"&trim(ugedag(i))&"' ",strsqlConnect
       
       
        elseif trim(todo(i)) = "gem" and trim(starttime(i)) <> "" then ' Dette bliver udført hvis der skal gemmes en ny vagt.
         
           
            Set rs = Server.CreateObject("ADODB.Recordset")
            rs.Open "INSERT INTO "&centervagtplan&" (id, starttime, endtime, tupe, weekday, name, week, free) VALUES ('"&trim(id(i))&"', '"&trim(starttime(i))&"', '"&trim(endtime(i))&"', '"&trim(tupe(i))&"', '"&trim(ugedag(i))&"', '"&trim(name(i))&"', '"&trim(uge(i))&"', '"&trim(free(i))&"') ",strsqlConnect
     
        end if

    next
    response.redirect "../../index.asp?site=admin&subsite=vagtplan"
    end if %>

/Lasse Rasch



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