webForumDet fria alternativet

Deleta ut varukorg, flera med checkbox.

ASP

16 svar · 546 visningar · startad av Brimba

Medlem sedan dec. 19995 874 inlägg
Frågan#1

Hej!

Jag skall göra om min varukorg.

Man skall med hjälp av checkboxes kunna deleta flera produkter samtidigt.
jag ahr gjort så här

	If Request.Form("id") <> "" Then
	SQLStmt = "DELETE FROM tabInternetKorg Where ProdId = " & Request.Form("id") & " AND (tabInternetKorg.AnvId = " & Session.sessionId & ")"
	Connection.Execute(SQLStmt)

Detta gör den först i varukorg.asp
sen gör den följande

<INPUT type="checkbox" name="id" value="<%= RS("ProdId") %>">

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.

Mvh
Patrik
aka Brimba

Medlem sedan dec. 1999707 inlägg
#2

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

Som sagt så har jag inte testat det....

------------------
/ Torbjörn Hansson

[Redigerat av toha den 17 dec 1999]

Medlem sedan dec. 19995 874 inlägg
#3

Hej!

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

Tack!

Mvh
Patrik
aka Brimba

Medlem sedan dec. 1999707 inlägg
#4

Jo, det fungerar men, bara så att du vet så gör du lika många databasanrop som du vill ta bort artiklar vilket "belastar" servern lite extra mycket.

------------------
/ Torbjörn Hansson

Medlem sedan dec. 19995 874 inlägg
#5

Hej!

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.

Tack!

Mvh
Patrik
aka Brimba

Medlem sedan dec. 1999707 inlägg
#6

Hej Brimba!

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.

==========================================================================

dim InTXT

If Request.Form("id") <> "" Then

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

==========================================================================

Kanske nåt litet fel nånstans... ;-)

------------------
/ Torbjörn Hansson

Medlem sedan dec. 19995 874 inlägg
#7

Hej!

Tack för koden, skall testa den så fort jag får möjlighet att komma till datorn på jobbet.

Tack!

Mvh
Patrik
aka Brimba

Medlem sedan dec. 19995 874 inlägg
#8

Hej!

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

Mvh
Patrik
aka Brimba

Medlem sedan dec. 1999707 inlägg
#9

Sorry, mitt fel. Jag glömde en relevant detalj.

===========================================

If Request.Form("delete") <> "" Then

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

=========================================

Det bör fungera....

------------------
/ Torbjörn Hansson

Medlem sedan dec. 19995 874 inlägg
#10

Han klagar bara.

Den säger

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC Microsoft Access 97 Driver] Data type mismatch in criteria expression.

/varukorg/varukorg.asp, line 14

Vad kan vara fel?

mvh
Patrik
aka Brimba

Medlem sedan dec. 1999707 inlägg
#11

Det blir lättare att hjälpa dig om du skriver in hela din kod. Jag vet inte vad som står på rad 14...

Vad har du för datatyper för de olika kolumnerna? Du kanske skall lägga till/ta bort apostrofer i uttrycket.

------------------
/ Torbjörn Hansson

Medlem sedan dec. 19995 874 inlägg
#12

Ok, då postar jag den koden.

Detta är varukorg.asp

<%

Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "driver={Microsoft Access Driver (*.mdb)};dbq=d:\dmab\internet.mdb"

If Request.Form("delete") <> "" Then 
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

'	If Request.Form("delete") <> "" Then
'	Request.Form("delete").Count
'	For I=1 to Request.Form("delete").Count
'	Rad=Request.Form("delete")(I)
'	SQL = "delete * FROM tabInternetKorg Where ProdId=" & Rad & " AND (tabInternetKorg.AnvId = " & Session.sessionId & ")"
'	Connection.Execute(SQL)
'	Next
'	End If

SQLStmt = "SELECT Sum(tabInternetKorg.Antal) AS [Antal], tabArt.ArtID, tabInternetKorg.ProdId, tabArt.Artikel, tabArt.ArtExkl, tabInternetKorg.AnvId FROM tabInternetKorg, tabArt WHERE tabInternetKorg.ProdId = tabArt.ArtID AND (tabInternetKorg.AnvId = " & Session.sessionId & ") GROUP BY tabInternetKorg.AnvId, tabArt.Artikel, tabArt.TypId, tabInternetKorg.ProdId, tabArt.ArtExkl, tabArt.ArtID ORDER BY tabArt.Artikel"
SET RS = Connection.Execute(SQLStmt)

Function GetPriceinkl()

TotalPris = RS("ArtExkl") * 1.25
GetPriceinkl = FormatNumber(TotalPris,0)
End Function

Function GetPrice()

TotalPris = RS("ArtExkl")
GetPrice = FormatNumber(TotalPris,0)
End Function

Function GetPAPriceinkl()

TotalPAPris = PA("KundPris")
GetPAPriceinkl = FormatNumber(TotalPAPris,0)
End Function

Function GetPAPrice()

TotalPAPris = PA("KundPris") * 0.8
GetPAPrice = FormatNumber(TotalPAPris,0)
End Function

%>

<%titlebar = "Varukorg"%>
<!--#include virtual="/top.inc" -->
<form method="POST" name="myform" action="varukorg.asp">
<%
Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "driver={Microsoft Access Driver (*.mdb)};dbq=d:\dmab\internet.mdb"
Paket = "SELECT tabPaket.PaketID, tabPaket.PaketNamn, tabPaket.KundPris, tabInternetKorg.ProdId, tabInternetKorg.AnvId, Sum(tabInternetKorg.Antal) AS [Antal] FROM tabPaket, tabInternetKorg WHERE tabInternetKorg.ProdId = tabPaket.PaketID AND (tabInternetKorg.AnvId = " & Session.sessionId & ") GROUP BY tabInternetKorg.AnvId, tabPaket.PaketID, tabPaket.PaketNamn, tabPaket.KundPris, tabInternetKorg.ProdId Order by tabPaket.PaketID"
SET PA = Connection.Execute(Paket)
%>
    <% If RS.EOF AND PA.EOF Then %>
<font face="Verdana" size="2" color="#000000"><B>Det finns inga produkter i din varukorg ännu!</B></font>
    <% ELSE %>
    <table border="0" width="100%" cellspacing="1" cellpadding="2">
<tr>
        <td width="232" bgcolor="#F40000"><strong><small><font face="Arial" color="FFFFFF">Produkt</font></small></strong></td>
        <td width="40" bgcolor="#F40000" align="center"><strong><small><font face="Arial" color="FFFFFF">Antal</font></small></strong></td>
	  <td width="75" bgcolor="#F40000"><strong><small><font face="Arial" color="FFFFFF">á-pris exkl.</font></small></strong></td>
        <td width="75" bgcolor="#F40000"><strong><small><font face="Arial" color="FFFFFF">á-pris inkl.</font></small></strong></td>
        <td width="75" bgcolor="#F40000" align="center"><strong><small><font face="Arial" color="FFFFFF">Radera</font></small></strong></td>
      </tr>      
<%

Dim SubTotal
DO UNTIL RS.EOF
%>
<%
strArtikel= Rs("Artikel")
if Len(strArtikel) > 30 then
strArtikel = Left(strArtikel,30) & "..."
end if
%>

      <tr>
        <td width="232" bgcolor="#F2F2F2"><small><font face="Arial"><%= strArtikel %></font></small></td>
        <td width="40" bgcolor="#F2F2F2" align="center"><small><font face="Arial"><%= RS("Antal") %></font></small></td>
		<td width="75" bgcolor="#F2F2F2" align="right"><small><font face="Arial"><%= GetPrice() %> :-</font></small></td>
        <td width="75" bgcolor="#F2F2F2" align="right"><small><font face="Arial"><%= GetPriceinkl() %> :-</font></small></td>
		<td width="75" align="center" bgcolor="#F2F2F2"><INPUT type="checkbox" name="delete" value="<%= RS("ProdId") %>"></td>
      </tr>
<%
SubTotal = SubTotal + (RS("Antal") * RS("ArtExkl"))
RS.MoveNext
Loop
%>

<%
DO UNTIL PA.EOF
%>
      <tr>
        <td width="232" bgcolor="#F2F2F2"><small><font face="Arial"><%= PA("PaketNamn") %></font></small></td>
        <td width="40" bgcolor="#F2F2F2" align="center"><small><font face="Arial"><%= PA("Antal") %></font></small></td>
		<td width="75" bgcolor="#F2F2F2" align="right"><small><font face="Arial"><%= GetPAPrice() %> :-</font></small></td>
        <td width="75" bgcolor="#F2F2F2" align="right"><small><font face="Arial"><%= GetPAPriceinkl() %> :-</font></small></td>
		<td width="75" align="center" bgcolor="#F2F2F2"><INPUT type="checkbox" name="delete" value="<%= PA("ProdId") %>"></td>      
      </tr>
<%
SubTotal = SubTotal + (PA("Antal") * PA("KundPris")* 0.80)
PA.MoveNext
Loop
%>
<% SubTotalinkl = SubTotal * 1.25 %>
    </table>
    <table border="0" width="100%" cellspacing="1" cellpadding="2">
      <tr>
        <td width="232"><strong><small><font face="Arial">Frakt:</font></small></strong></td>
        <td width="40"> </td>
        <td width="75" bgcolor="#F40000" align="right"><font face="Arial" color="FFFFFF"><small>80 :-</small></font></td>
        <td width="75" bgcolor="#F40000" align="right"><B><font face="Arial" color="FFFFFF"><small>100 :-</small></font></B></td>
        <td width="75" align="center"><input id="submit" name="B1" src="../images/radera.gif" type="image" onfocus="blur()"></td>
      </tr>
      <tr>
        <td width="232"><strong><small><font face="Arial">Totalt:</font></small></strong></td>
        <td width="40"> </td>
        <td width="75" bgcolor="#F40000" align="right"><font face="Arial" color="FFFFFF"><small><%= FormatNumber(SubTotal+80,0) %> :-</small></font></td>
        <td width="75" bgcolor="#F40000" align="right"><B><font face="Arial" color="FFFFFF"><small><%= FormatNumber(SubTotalinkl+100,0) %> :-</small></font></B></td>
        <td width="75"> </td>
      </tr>
      <tr>
        <td width="232"><strong><small><font face="Arial"><A HREF="javascript:void(0)" onClick="alert('WASA Kredit / Lån\n\nI prisexemplet ingår avi avgift á 25kr.\nExemplet är upplagt på 36 månader men kan betalas av snabbare om så önskas.\n\nEn uppläggningsavgift på 300kr läggs automatiskt på utav WASA Kredit på den första fakturan.\n\nKredit kostnad: <% =FormatNumber((((((SubTotalinkl*3.178)/100)+25)*36)+300)-SubTotalinkl,0) %>:-\n\n OBS: Lån kan endast fås om totalsumman överstiger 6000 kr')"><font color="000000">Månads kostnad:</A></font></small></strong></td>
        <td width="40"> </td>
        <td width="150" colspan="2" bgcolor="#F40000" align="right"><strong><font face="Arial" color="FFFFFF"><small><%= FormatNumber(((SubTotalinkl*3.178)/100)+25,0) %> :-</small></font></strong></td>
        <td width="75"> </td>
      </tr>
    </table>
    <p><% End If %>
    
</form>
<%
' Stäng databasen och RS.

RS.Close
PA.Close
Connection.Close
%>

<!--#include virtual="/bot.inc" -->

Det är ganska mycket, men du ville ha allt :) iofs hade det nog räckt om jag postar SQL staserna. Men Hoppas du blir glad :)

Mvh
Patrik
aka Brimba

[Redigerat av Brimba den 20 dec 1999]

Medlem sedan dec. 1999707 inlägg
#13

Men vilken rad är rad nummer 14?

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.

------------------
/ Torbjörn Hansson

Medlem sedan dec. 19995 874 inlägg
#14

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');

Men det kunde ju du!

Mvh
Patrik
aka Brimba

Medlem sedan dec. 19996 721 inlägg
#15

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.

Medlem sedan dec. 1999707 inlägg
#16

Precis som emission säger så skall du ta bort apostroferna om kolumen "ProdID" är av tal-typ.

------------------
/ Torbjörn Hansson

Medlem sedan dec. 19995 874 inlägg
#17

Hej!

När jag tog bort fnuttarna, såg min rad ut så här:

DELETE * FROM tabInternetKorg WHERE AnvId = 860526382 AND ProdId IN(735,952);

Och då fungerade det perfekt!

Tack så mycket för hjälpen!

Mvh
Patrik
aka Brimba

262 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)