Jeg har i min access base en tabel der hedder page
i den er der id, menu, sub
id er idet på siden menu er menuen på siden i sub kan der stå et id på en side.
Hvis jeg f.eks. har id: 1 menu: forside sub: 0 id: 2 menu: profil sub: 1 id: 3 menu: medarbejdere sub: 2 id: 4 menu: kim sub: 3 så vil min menu se sådan ud:
forside - profil - medarbejdere - kim
Det jeg så skal have lavet et et script som slette derned af i rækken, så hvis jeg vælger at slette side med id: 2 så skal den også slette side med id 3 og 4
Den bliver svær at kringle Det du vil er altså at slette et givent id. Dernæst slette hvis der findes en post hvor sub er lig det id Dernæst forsætte derudaf
Måske kan dette give dig en god ide til hvordan det evt kan gøres.
Forestiller mig du først requester din ID right? id = Trim(Request.QueryString("id"))
Så laver vi 2 tællere. dim counter, counterslut
Den ene skal være ligmed det ID der kommer ind counter = id
Den anden skal være ligmed det antal der er i databasen. Derfor denne sql sætning der tæller records op SQLstringK = "SELECT COUNT (id) AS Total From page"
counter = Total
Lav en løkke som køre slet igennem (denne virker selvfølgelig ikke .. går ud fra du ved hvordan den laves korrekt:))
while(counter <= counterslut) <--- kør koden til counter er større end counterslut
SQLstringK="DELETE FROM page WHERE id="&counter <--- vores tæller Connection.Execute(SQLstringK) counter = counter + 1 <--- vores tæller bliver sat en op
Mon ikke busschou hitter op med en løsning:) jeg beklager men er ikke så frisk i hovedet lige nu:o) og misforstod da også dit spørgsmål:) men nu følger jeg da i hvertfald med:)
topid = request.querystring("id") sql = "Delete From din_tabel Where id="&topid conn.execute(sql) sql = "Select Count(*) From din_tabel" antal = conn.execute(sql) subid = ""; for t=1 to antal sql = "Select * From din_tabel Where sub="&topid set rs=conn.execute(sql) if not rs.eof then subid = rs("id") sql = "Delete From din_tabel Where id="&topid conn.execute(sql) topid = subid next
topid = request.querystring("id") sql = "Delete From page Where id="&topid conn.execute(sql) sql = "Select Count(*) From page" antal = conn.execute(sql) subid = ""; for t=1 to antal sql = "Select * From page Where sub="&topid set rs=conn.execute(sql) if not rs.eof then subid = rs("id") sql = "Delete From page Where id="&topid conn.execute(sql) topid = subid next
topid = request.querystring("id") sql = "Delete From page Where id="&topid conn.execute(sql) sql = "Select Count(*) From page" antal = conn.execute(sql) subid = "" for t=1 to antal sql = "Select * From page Where sub="&topid set rs=conn.execute(sql) if not rs.eof then subid = rs("id") sql = "Delete From page Where id="&topid conn.execute(sql) topid = subid next
går lidt hurtigt...sorry topid = request.querystring("id") sql = "Delete From page Where id="&topid conn.execute(sql) sql = "Select Count(*) From page" antal = conn.execute(sql) subid = "" for t=1 to antal sql = "Select * From page Where sub="&topid set rs=conn.execute(sql) if not rs.eof then subid = rs("id") sql = "Delete From page Where id="&topid conn.execute(sql) topid = subid end if next
topid = request.querystring("id") sql = "Delete From page Where id="&topid connection.execute(sql) sql = "Select Count(*) From page" antal = connection.execute(sql) subid = "" for t=1 to antal sql = "Select * From page Where sub="&topid set rs=connection.execute(sql) if not rs.eof then subid = rs("id") sql = "Delete From page Where id="&topid connection.execute(sql) topid = subid end if next
Fejl: Fejltype: Der opstod en Microsoft VBScript-kørselsfejl (0x800A01C2) Antallet af argumenter er forkert eller egenskabstildelingen er ugyldig /cmplicity/menu/del.asp, line 12
hmm så giver den åbenbart ikke antal direkte..prøv topid = request.querystring("id") sql = "Delete From page Where id="&topid connection.execute(sql) sql = "Select Count(*) From page" set rs = connection.execute(sql) antal = rs(0) subid = "" for t=1 to antal sql = "Select * From page Where sub="&topid set rs=connection.execute(sql) if not rs.eof then subid = rs("id") sql = "Delete From page Where id="&topid connection.execute(sql) topid = subid end if next
topid = request.querystring("id") sql = "Delete From page Where id="&topid connection.execute(sql) sql = "Select Count(*) From page" set rs = connection.execute(sql) antal = rs(0) subid = "" for t=1 to antal sql = "Select * From page Where sub="&topid set rs=connection.execute(sql) if not rs.eof then subid = rs("id") sql = "Delete From page Where sub="&topid connection.execute(sql) topid = subid end if next
kan følgende forekomme? id: 1 menu: forside sub: 0 id: 2 menu: profil sub: 1 id: 3 menu: medarbejdere sub: 2 id: 4 menu: kim sub: 3 id: 5 menu: forside sub: 2 id: 6 menu: profil sub: 5 --- altså at flere menuer har samme sub men forskellig id ?
problemet med kommentaren 02:04:26 er at den kun gemmer den første id den finder og søger så efter sub på den Men hvis to eller fleres ens sub kan have forskellig id så skal der jo oprettes et array som den skal søge igennem
' Hent data fra databasen strSQL = "SELECT ID, sub, menu FROM page ORDER BY [order]" Set rsEntries = connection.Execute(strSQL)
If Not (rsEntries.EOF or rsEntries.BOF) Then
Do ' Gem data som kommasepareret liste arrID = arrID & "," & rsEntries("ID") arrRE = arrRE & "," & rsEntries("sub") arrSU = arrSU & "," & rsEntries("menu") rsEntries.MoveNext Loop while not rsEntries.eof
' Lav arrays med data arrID = Split(arrID,",") arrRE = Split(arrRE,",") arrSU = Split(arrSU,",")
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If (Cint(arrRE(m)) = Cint(intID) And Cint(intID) > 0) Or (Cint(arrRE(m)) = 0 And Cint(intID) = 0) Then ' Tilføj til liste og kald funktionen for at undersøge for svar If Cint(intID) > 0 Then For i = 2 To AntalIndryk Threads = Threads & " " Next Threads = Threads & "<img src=""/cmplicity/_gfx/sitemaps.gif"">" End If Threads = Threads & "<span style=""color:#ffffff;font-weight:bold;""><img src=""/cmplicity/_gfx/ikon/showplain.gif"" align=""absbottom"" width=""10"" height=""11"" border=""0"" alt=""""> " & arrSU(m) & "</span><br>" & Threads(arrID(m), AntalIndryk) End If Next AntalIndryk = AntalIndryk - 1 End Function
Response.Write Threads(0, 0)
Else Response.Write("Der er ikke tilføjet nogle sider!") End if
Hvad med følgende rekusive: --------- id = request.querystring("id") sql = "Delete From page Where id="&id connection.execute(sql) sql = "Select id From page Where sub="&id set rs = connection.execute(sql) if not rs.eof then call slet(rs) end if
sub slet(liste){ for t=LBound(liste) to UBound(liste) sql = "Select id From page Where sub="&liste(t) set rs = connection.execute(sql) if not rs.eof then call slet(rs) end if sql = "Delete From page Where sub="&liste(t) connection.execute(sql) next }
skide syntaks hehe id = request.querystring("id") sql = "Delete From page Where id="&id connection.execute(sql) sql = "Select id From page Where sub="&id set rs = connection.execute(sql) if not rs.eof then call slet(rs) end if
Sub slet(liste) for t=LBound(liste) to UBound(liste) sql = "Select id From page Where sub="&liste(t) set rs = connection.execute(sql) if not rs.eof then call slet(rs) end if sql = "Delete From page Where sub="&liste(t) connection.execute(sql) next End Sub
hvis ikke vi kan få den til at virke så giver jeg altså op for søvnen inden kl 3 :o(.. for det hjælper nok ikke lige just på korrektheden af syntaks mm ;o)
er det fordi rs ikke opfattes som et array...godnat mand ;o) id = request.querystring("id") sql = "Delete From page Where id="&id connection.execute(sql) sql = "Select id From page Where sub="&id set rs = connection.execute(sql) if not rs.eof then call slet(rs) end if
Sub slet(liste) do while not liste.eof sql = "Select id From page Where sub="&liste("id") set rs = connection.execute(sql) if not rs.eof then call slet(rs) end if sql = "Delete From page Where sub="&liste("id") connection.execute(sql) liste.movenext loop End Sub
id = request.querystring("id") sql = "Delete From page Where id="&id connection.execute(sql) sql = "Select id From page Where sub="&id set rs = connection.execute(sql) if not rs.eof then call slet(rs) end if
Sub slet(liste) do while not liste.eof sql = "Select id From page Where sub="&liste("id") set rs = connection.execute(sql) if not rs.eof then call slet(rs) end if 'sql = "Delete From page Where sub="&liste("id") 'connection.execute(sql) response.write(liste("id")) liste.movenext loop End Sub
denne fejl: Enten er BOF eller EOF sand, eller den aktuelle post er blevet slettet. Den anmodede handling kræver en aktuel post. /cmplicity/menu/del.asp
hmm så prøv id = request.querystring("id") sql = "Delete From page Where id="&id connection.execute(sql) sql = "Select id From page Where sub="&id set rs = connection.execute(sql) if not rs.eof then call slet(rs) end if
Sub slet(liste) do while (not liste.eof) and (not liste.bof) sql = "Select id From page Where sub="&liste("id") set rs = connection.execute(sql) if not rs.eof then call slet(rs) end if 'sql = "Delete From page Where id="&liste("id") 'connection.execute(sql) response.write(liste("id")) liste.movenext loop End Sub
er du i øvrigt med på ideen?..eller skal jeg sætte et par kommentare ind hist og pist? Du kan i hvert fald lave ----- if not rs.eof then call slet(rs) end if ----- om til blot ----- call slet(rs) ----- eftersom eof og bof nu tjekkes i Subben
Wierd!... det kan være den "glemmer" indgangen måske id = request.querystring("id") sql = "Delete From page Where id="&id connection.execute(sql) sql = "Select id From page Where sub="&id set rs = connection.execute(sql) call slet(rs)
Sub slet(liste) do while (not liste.eof) and (not liste.bof) sql = "Select id From page Where sub="&liste("id") set rs = connection.execute(sql) id = liste("id") if not rs.eof then call slet(rs) end if 'sql = "Delete From page Where id="&liste("id") 'connection.execute(sql) response.write(id) liste.movenext loop End Sub
prøv lige det her for at vi kan se hvor langt den går id = request.querystring("id") sql = "Delete From page Where id="&id connection.execute(sql) sql = "Select id From page Where sub="&id set rs = connection.execute(sql) response.write("så langt så godt: rs(id)="&rs("id")) call slet(rs)
Sub slet(liste) do while (not liste.eof) and (not liste.bof) response.write("inde i sub liste(id)="&liste("id") sql = "Select id From page Where sub="&liste("id") set rs = connection.execute(sql) id = liste("id") if not rs.eof then call slet(rs) end if 'sql = "Delete From page Where id="&liste("id") 'connection.execute(sql) response.write(id) liste.movenext loop End Sub
Tegnet ')' var ventet /cmplicity/menu/del.asp, line 16, column 50 response.write("inde i sub liste(id)="&liste("id") -------------------------------------------------^
prøv lige vise mig hele din kode for der er da noget som ikke hænger sammen så det betyder jo der er fejl i de to her sql = "Select id From page Where sub="&id set rs = connection.execute(sql) ???
id = request.querystring("id") sql = "Delete From page Where id="&id connection.execute(sql) sql = "Select id From page Where sub="&id set rs = connection.execute(sql) response.write("så langt så godt: rs(id)="&rs("id")) call slet(rs)
Sub slet(liste) do while (not liste.eof) and (not liste.bof) response.write("inde i sub liste(id)="&liste("id")) sql = "Select id From page Where sub="&liste("id") set rs = connection.execute(sql) id = liste("id") if not rs.eof then call slet(rs) end if 'sql = "Delete From page Where id="&liste("id") 'connection.execute(sql) response.write(id) liste.movenext loop End Sub
id = request.querystring("id") sql = "Delete From page Where ID="&id connection.execute(sql) sql = "Select ID From page Where sub="&id set rs = connection.execute(sql) response.write("så langt så godt: rs(id)="&rs("ID")) call slet(rs)
Sub slet(liste) do while (not liste.eof) and (not liste.bof) response.write("inde i sub liste(id)="&liste("ID") sql = "Select ID From page Where sub="&liste("ID") set rs = connection.execute(sql) id = liste("ID") if not rs.eof then call slet(rs) end if 'sql = "Delete From page Where id="&liste("ID") 'connection.execute(sql) response.write(id) liste.movenext loop End Sub
to sek... DOH.. havde kaldt siden 9, men id var 51... id 9 er der ikke...
Nu siger den:
ADODB.Field (0x800A0BCD) Enten er BOF eller EOF sand, eller den aktuelle post er blevet slettet. Den anmodede handling kræver en aktuel post. /cmplicity/menu/del.asp, line 19
kan det være fordi den så sletter "interaktivt" i recordset? Jeg har som sagt aldrig lavet rekursion sådan før Men hvis den gør det interaktivt så er det måske derfor
'ID HENTES IND OG POSTEN SLETTES id = request.querystring("id") sql = "Delete From page Where ID="&id connection.execute(sql) 'FIND ALLE POSTERS ID HVOR SUB=ID sql = "Select ID From page Where sub="&id set rs = connection.execute(sql) 'KAL FUNKTION TIL AT SLETTE MED call slet(rs)
'SLETTE FUNKTION Sub slet(liste) 'KØRES HVIS RECORDSÆTTET IKKE ER TOMT FOR HVERT ELEMENT do while (not liste.eof) and (not liste.bof) 'FIND ALLE POSTERS ID HVOR SUB=ID sql = "Select ID From page Where sub="&liste("ID") set rs = connection.execute(sql) 'KØR FUNKTIONEN SLET PÅ DE FUNDNE ID call slet(rs) 'ENDEN ER NÅET OG POSTEN SLETTES sql = "Delete From page Where id="&liste("ID") connection.execute(sql) liste.movenext loop End Sub
'ID HENTES IND OG POSTEN SLETTES id = request.querystring("id") sql = "Delete From page Where ID="&id connection.execute(sql) 'FIND ALLE POSTERS ID HVOR SUB=ID sql = "Select ID From page Where sub="&id set rs = connection.execute(sql) 'KAL FUNKTION TIL AT SLETTE MED call slet(rs)
'SLETTE FUNKTION Sub slet(liste) 'KØRES HVIS RECORDSÆTTET IKKE ER TOMT FOR HVERT ELEMENT do while (not liste.eof) and (not liste.bof) 'FIND ALLE POSTERS ID HVOR SUB=ID sql = "Select ID From page Where sub="&liste("ID") set rs = connection.execute(sql) 'KØR FUNKTIONEN SLET PÅ DE FUNDNE ID call slet(rs) 'ENDEN ER NÅET OG POSTEN SLETTES sql = "Delete From page Where id="&liste("ID") connection.execute(sql) liste.movenext loop End Sub
har prøvet lave det til et array alligevel for det må næsten være det som går galt prøv det her: id = request.querystring("id") sql = "Delete From page Where ID="&id connection.execute(sql) sql = "Select ID From page Where sub="&id set rs = connection.execute(sql) do while not rs.eof stregn = stregn&","&rs("ID") rs.movenext loop liste = Split(stregn,",") call slet(liste)
Sub slet(liste) for t=LBound(liste)+1 to UBound(liste) sql = "Select ID From page Where sub="&liste(t) set rs = connection.execute(sql) do while not rs.eof stregn = stregn&","&rs("ID") rs.movenext loop nyliste = Split(stregn,",") call slet(nyliste) sql = "Delete From page Where ID="&liste(t) connection.execute(sql) next End Sub
har du tjekket din database? At der er det oprindelige eksempel i den og der ikke er noget som er slettet undervejs osv...så vi tjekker på korrekt materiale? For jeg synes ærligt talt at det er dårlige fejlmedelelser. Plus at den heller ikke skrev det ud vi bad den om. Det burde den ellers have gjort. Det er jo umuligt at vide om den kører uendelig løkke eller hvad den gør når man ikke kan lave en response.write og få noget at debugge efter.
Der mangler også en "stopklods" ---- id = request.querystring("id") sql = "Delete From page Where ID="&id connection.execute(sql) sql = "Select ID From page Where sub="&id set rs = connection.execute(sql) do while not rs.eof stregn = stregn&","&rs("ID") rs.movenext loop liste = Split(stregn,",") call slet(liste)
Sub slet(liste) for t=LBound(liste)+1 to UBound(liste) sql = "Select ID From page Where sub="&liste(t) set rs = connection.execute(sql) if not rs.eof then do while not rs.eof nystregn = nystregn&","&rs("ID") rs.movenext loop nyliste = Split(nystregn,",") call slet(nyliste) end if sql = "Delete From page Where ID="&liste(t) connection.execute(sql) next End Sub
med følgende eksempek hos mig siger access 2003 at den ikke kan gennemføre referentiel integritet pga tabellen bryger reglerne derfor. id: 1 menu: test sub: 0 id: 2 menu: test1 sub: 1 id: 3 menu: test2 sub: 2 id: 4 menu: test3 sub: 3 id: 5 menu: test4 sub: 2 id: 6 menu: test5 sub: 0 id: 7 menu: test6 sub: 6 ---- Det er tidligere diskuteret at tabellen kunne se sådan ud Men synes babyworm lige skal prøve det alligevel
det var også ret sent jeg sad og legede med det igår. der kan være lidt gnidninger i selve access programmet, når man sidder med en database med en sådan relation, men når først det er sat op, så funker det fint.
Jeg har en eksempeldatabase med een tabel [tree] med kolonnerne: id(auto) data(tekst) fkid(heltal)
hvor jeg har lavet en relation mellem id og fkid. det eneste minus: i eksempelrecordene ovenfor kan du ikke i grafisk access slette posten med id 2 før jeg først har manuelt slette alle 2's "børn". Det virker fint via sql. Det har vist noget med at gøre at access låser tabellen, når man vil slette, og så kan den jo ikke selv få lov til at slette "born".
Hvis der er nogen der vil se den, så sig til, så mailer jeg den.
Jeg slettede ikke noget Jeg oprettede en tabel og indtastede det som i min kommentar 08:22:08 jeg markerede gennemtving referentiel integritet og kaskadevis sletning af relaterede poster Da jeg klikkede ok sagde den at den ikke kunne gennemføre referentiek integritet pga tabellen brød reglerne derfor. Noget med at der skulle være en for hvert id. Så i mit eksempel er der jo ikke en sub = 7 selvom der er en id=7 måske derfor? Havde samme typer som dig
aha... det gjorde min også, men jeg lavede det omvendt: oprette relationen derefter indsatte jeg data. Det fejler pga sub=0 da der ingen id=0 er at referere til. Løsningen er at lade være at skrive 0 i de øverste subber, men bare skrive ingenting. det er så et krav at det felt ikke er obligatorisk.
jeg har en tabel der ser således ud:
id data fkid 5 top 8 under_1 5 9 under_2 8 10 under_1 5 11 top
og eksekverer jeg så en "DELETE FROM tabel WHERE id=5" sletter den 5,8,9 og 10
jeg kan ikke huske om vi har prøvet sådan her ..men prøv evt ------ Dim del_liste
' Sub som finder de Id´er der skal slettes Sub find_slettes(id) del_liste = id & "," & del_liste set rs = conn.execute("select * from tabel where subid = "&id) do while not rs.eof find_slettes(rs("id")) rs.movenext loop End Sub
' Sub der sletter alle ider Sub slet_ider() del_liste = left(del_liste,len(del_liste)-1) idArr = Split(del_liste,",") for i=0 to ubound(idArr) conn.execute("delete from tabel where id = "&idArr(i)) next End Sub
' her kalder vi den så den sletter alt under id nr 2 find_slettes 2 slet_ider
Poster du et scvar så du kan få point og tak for hjælpen
Synes godt om
Ny brugerNybegynder
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.