Och det är ju genom dessa checkboxar man får fram värdet på den produkten man skall ta bort. Men problemet är ju att när man markerar flera checkboxar blir ju värdet på id tex
784, 823 och då blir ju felmeddelandet
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access 97 Driver] Syntax error (comma) in query expression 'ProdId = 784, 823 AND (tabInternetKorg.AnvId = 670086542)'.
/varukorg/varukorg2.asp, line 11
Någon som vet hur jag gör för att kunna markera flera checkboxar och sedan trycka på en submit knapp så att det jag valt raderas ut ur min databas/varukorg.
Ett sätt är att du gör en loop och deletar de en och en, men det belastar ju servern
mer. Om jag inte tar helt fel så tror jag att följande sql-uttryck går bra att använda:
DELETE * FROM tabInternetkorg WHERE AnvID = " & session.sessionid & " AND (ProdID = Prod1 OR ProdID = Prod2)
Där "Prod1" och "Prod2" är ProdID-numret från de ikryssade checkrutorna. (Kommer inte
ihåg riktigt hur man tog fram de just nu. Måste ha ASP-bibeln framför mig...)
Jag fick en lösning, som jag löste det med. Den ser ut så här:
If Request.Form("delete") <> "" Then
Request.Form("delete").Count
For I=1 to Request.Form("delete").Count
Rad=Request.Form("delete")(I)
SQLStmt = "delete * FROM tabInternetKorg Where ProdId=" & Rad & " AND (tabInternetKorg.AnvId = " & Session.sessionId & ")"
Connection.Execute(SQLStmt)
Next
End If
Jovisst gör jag det.
Som det är nu är det relativt lugnt endå. Det är en relativt liten sida jag kör just nu, skall ju naturligtvis växa när det kommer reklam om den, men det lär inte bli så stor. Plus att servern är relativt stor. 512mb ram 500Mhz PIII. Men självklart tar det server kapacitet, men jag tror nog att det klarar sig.
Vet du hur man får det att gå på ett databas anrop? Skulle vara käckt om du kunde ge mig något exempel på det, om du utgår från min kod som jag pastade.
Jag tror att följande kod skall hjälpa dig att ta bort alla artiklar med ett
databasanrop. Det är operatorn "IN" som anger vilka som skall tas bort. Först
genererar jag en sträng som blir: "'prod1','prod2','prod3," ... osv
och sätter in det i sql-frågan.
for I = 1 to request.form("checkform").count
InTXT = InTXT & "'" & request.form("checkform") & "',"
next
' Ta bort de sista kommatecknet...
InTXT = left(InTXT, len(InTXT)-1)
SQLStmt = "DELETE * FROM tabInternetKorg WHERE AnvId = " & Session.sessionId & " AND ProdId IN(" & InTXT & ");"
Connection.Execute(SQLStmt)
end if
Denna koden vägrar att fungera, skulle bli glad om du kunde titta på det.
dim InTXT
If Request.Form("delete") <> "" Then
for I = 1 to request.form("delete").count
InTXT = InTXT & "'" & request.form("delete") & "',"
next
' Ta bort de sista kommatecknet...
InTXT = left(InTXT, len(InTXT)-1)
SQL = "DELETE * FROM tabInternetKorg WHERE AnvId = " & Session.sessionId & " AND ProdId IN(" & InTXT & ");"
Connection.Execute(SQL)
end if
dim InTXT, I
for I = 1 to request.form("delete").count
InTXT = InTXT & "'" & request.form("delete")(I) & "',"
next
' Ta bort de sista kommatecknet...
InTXT = Left(InTXT, len(InTXT)-1)
SQL = "DELETE * FROM tabInternetKorg WHERE AnvId = " & Session.sessionId & " AND ProdId IN(" & InTXT & ");"
Connection.Execute(SQL)
end if
Vad har du för datatyper för de olika kolumnerna i databasen?
Ett tips (om det är sql-uttrycket det är fel på) är att skriva "response.write sql" på raden innan "connection.execute()" så ser man vad som skickas till odbc:n.
Jo det har jag provat, den skickar följande till databasen:
Om jag tar bort en artikel ser den ut så här:
DELETE * FROM tabInternetKorg WHERE AnvId = 814290698 AND ProdId IN('706');
Tar jag bort flera ser den ut så här:
DELETE * FROM tabInternetKorg WHERE AnvId = 814290698 AND ProdId IN('706','736');
Jag tycker det ser rätt ut nämnligen, därför är jag lite fundersam. Men vad IN gör vet jag inte, men det sa ju du att det var bra jag skulle ha skrivit AND ProdId = ('706','736');
Det ser rätt ut, men det verkar vara nåt klassiskt mystiskt med det hela. Men, varför inte "smeta ihop " alla DELETE-satser till en enda, innan du kör Execute. Då blir det bara ett anrop, men det kan inte hjälpas.
Fast å andra sidan verkar det som om prodid är ett heltal, och då ska du ju inte ha några fnuttar med i SQL-satsen.