Toon posts:

[ASP] Efficient reeks records updaten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een admin pagina haal ik een reeks records op en geef aan via een checkbox of de records al dan niet een eigenschap bezitten. Ik kan via de checkboxen de waarden wijzigen, maar hoe schrijf ik het best deze wijzigingen weg?

- Vraag ik - na het submitten - voor elk record de waarde terug op uit de database, vergelijk deze met de ingevoerde waarde, en dan voor elk record wegschrijven?
- Of plaats ik bij alle records de waarde eerst op false, dan de waarden die true hebben uit de querystring halen en daarna deze wegschrijven?
- Of bestaat er nog iets efficienter?
(Maximaal aantal records is ongeveer 500, Database: MS Access)

Klein vb ter verduidelijking:
Afbeeldingslocatie: http://users.pandora.be/frederic.vercaemst/got.gif

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:02

gorgi_19

Kruimeltjes zijn weer op :9

- Vraag ik - na het submitten - voor elk record de waarde terug op uit de database, vergelijk deze met de ingevoerde waarde, en dan voor elk record wegschrijven?
- Of plaats ik bij alle records de waarde eerst op false, dan de waarden die true hebben uit de querystring halen en daarna deze wegschrijven?
- Of bestaat er nog iets efficienter?
[HK]
LOL, ik kies voor optie 3; altijd leuk die MC-vragen.. ;)
[/hk]

[serieus]
Optie 3 (iets anders) zou mijn voorkeur hebben. Je zegt dat je met Access werkt; bij 500 records zou je dan 500 updates moeten uitvoeren. Waarom laat je bij wijziging (aan- of afvinken) al gelijk een postback doen naar de server om de status te updaten? Dus iedere wijziging is al een update, en niet op het laatste moment met een submit alles nalopen.

Komt misschien een beetje warrig over; als dit zo is, zal ik een nieuwe poging wagen... :)
[/serieus]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Dit stukje script gaat uit van een array (varRefs) waar de records instaan

Zo moet je het formulier opzetten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<form name="refs">

    <%
    intCount = 0
    Do While intCount < (UBound(varRefs,2) + 1)
    %>

    <input type="checkbox" name="delete" value="<%=varRefs(0,intCount)%>">

    <%
    intCount = intCount + 1
    Loop
    %>

</form>

Dit gebruik je om de lijst in de db te prakken, oftewel je submit het script hierboven naar deze code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
strDeleteList = Request("delete")
  
If strDeleteList <> "" Then
  
    Set objConnection = Server.CreateObject("adodb.Connection")
    objConnection.Open "PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATASOURCE=" & strDbName

    strSQL = "DELETE FROM Referenties WHERE Id IN (" & strDeleteList & ")"

    objConnection.Execute(strSQL)
    objConnection.Close
    Set objConnection = Nothing
        
End If

Als je het niet helemaal begrijpt moet je het maar ff zeggen, dan zal ik het nog wel toelichten :)

Verwijderd

Topicstarter
mmmuttley, ik versta je uitleg perfect, ik had ook zoiets in gedachten, alleen gaat het hier om een UPDATE statement en geen DELETE. (en dit maakt wel degelijk een verschil uit)

gorgi_19, jij zou dus via één of ander javascriptje direct checken of een checkbox wordt aangevinkt of niet, en direct daarna de wijziging doorvoeren in de dbase? Lijkt me een goede 3e optie, ik zal dit eens gaan uitproberen ;)

Verwijderd

Op zondag 14 juli 2002 19:56 schreef pussher het volgende:
mmmuttley, ik versta je uitleg perfect, ik had ook zoiets in gedachten, alleen gaat het hier om een UPDATE statement en geen DELETE. (en dit maakt wel degelijk een verschil uit)
Ok, maar je kunt volgens mij DELETE gewoon vervangen door UPDATE.. ;)

(weet het niet zeker, heb m zelf alleen voor delete gebruikt maar dat moet wel mogelijk zijn denk ik)

/edit: of misschien toch niet :)

Verwijderd

Topicstarter
indien ik de delete vervang door een update, dan moet ik alle records checken of ze al dan niet verandert zijn, bij delete hoef ik dan enkel de geselecteerde records te verwijderen ...

Verwijderd

Op zondag 14 juli 2002 20:06 schreef pussher het volgende:
indien ik de delete vervang door een update, dan moet ik alle records checken of ze al dan niet verandert zijn, bij delete hoef ik dan enkel de geselecteerde records te verwijderen ...
Je hebt gelijk idd.. misschien heb je hier wat aan, je hoeft dan iig niet elke keer een query uit te voeren.

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Als je nu gewoon een Session var maakt met daarin alle waardes die je uit de DB selecteert, een array dus.

Na submit request je alle waarden uit het form, vergelijkt ze (in een lus uiteraard) met de waarden in het array. Eff een signalering in die lus bouwen die ervoor zorgt dat alleen gewijzigde records ge-UPDATE worden, en klaar. Minimaal aantal UPDATE statements.

Verwijderd

Topicstarter
Ik zat ook te denken aan één array met de originele waarden, en dan een andere array opbouwen met de nieuwe waarden, vergelijken, etc ...

Ik heb ondertussen een goeie oplossing gevonden, zie es op http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=141

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:02

gorgi_19

Kruimeltjes zijn weer op :9

Op zondag 14 juli 2002 20:06 schreef pussher het volgende:
indien ik de delete vervang door een update, dan moet ik alle records checken of ze al dan niet verandert zijn, bij delete hoef ik dan enkel de geselecteerde records te verwijderen ...
Ik ging uit van het volgende principe:

Database:
ID int
Naam Varchar
Active Bit (Yes/no)

Een pagina in de vorm van:
code:
1
2
3
4
<form name=ikke1>
<input type=hidden name=ID value=1>
<input type=checkbox name=chkNaam value="1" Onchange='een submitfunctie'>
</form>

Dan in de aspcode
code:
1
2
3
4
5
6
7
8
9
10
11
..
Dim blnActief
If request.Form("chkNaam") = 1 then
    blnActief = "1"
else
    blnactief = "0"
End if

Dim strSQL
strSQL = "Update tabelnaam SET actief=" & blnactief & " WHERE ID=" & Request.Form("
Request.Form("ID")

Geeft wel een idee (idee is dus om in ieder geval meerdere forms te maken onder elkaar; gescheiden met ieder een naam. Deze kan je dan aanroepen met een javascript-functie in de vorm van 'formname.submit'

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Ik zou het als volgt doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<form name="bla" action="bla.asp" method="post">
<%
sql = "select id, waarde from lijst"
Set rs = dbcon.execute(sql)

Session("aantal_records") = 0
Dim Session("lijst")(0)
Dim Session("ids")(0)

do while not rs.EOF
  Session("aantal_records") = Session("aantal_records") + 1
  ReDim Session("lijst")(Session("aantal_records"))
  Session("lijst")(Session("aantal_records"))=rs("waarde")
  ReDim Session("ids")(Session("aantal_records"))
  Session("ids")(Session("aantal_records"))=rs("id")
  if rs("waarde")="1" then
    %><input type="checkbox" value="1" name=<%= id %> checked><%
  else
    %><input type="checkbox" value="1" name=<%= id %>><%
  end if
  rs.movenext
loop

%>
</form>

Zo, nu hebben een formpje gevuld met checkboxes, en een array met alle waarden en een met alle ids.

De afhandelende ASP zou als volgt zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%
tel = 1
while tel<=Session("aantal_records")
  waarde = Request(Session("ids")(tel))
  if not(isNull(waarde) or waarde="") then
    if waarde<>Session("lijst")(tel) then
    'Voer het update/insert statement uit
    end if
  else
    if Session("lijst")(tel)=1 then
    'De waarde in de DB was 1(checked) en is nu 0, waarde verwijderen. DELETE statement?
    end if
  end if

  tel = tel + 1
loop
%>

Nu ik weer doorlees klopt het volgens mij niet helemaal. Volgens mij is de afhandelende ASP niet helemaal ok, de else bij if not (isNull...), maar goed. Het idee is wel duidelijk hoop ik?
Pagina: 1