webForumDet fria alternativet

ASP i SQL

17 svar · 632 visningar · startad av Taengil

TaengilMedlem sedan maj 20058 inlägg
#1

Hej!
Jag försöker skapa en lista som visar projekt. Jag har gjort sex checkboxar som man kryssar i för att göra ett urval som visas i listan. Jag förstår bara inte riktigt hur jag ska göra. Här är koden:

Snälla hjälp mig!

mvh

Taengil

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

sql = "SELECT ProjectTable.ProjectID AS PT_PID, MainCatTable.Number AS MCT_MCNR, ProjectTable.Archived AS PT_A, InvestorTable.Number AS IT_INR, ProjTypeTable.Number AS PTT_PTNR, ProjectTable.Number AS PT_NR, ProjectTable.ProjectName AS PT_PN FROM ((ProjectTable INNER JOIN InvestorTable ON ProjectTable.fkInvestorID = InvestorTable.InvestorID) INNER JOIN MainCatTable ON ProjectTable.fkMainCatID = MainCatTable.MainCatID) INNER JOIN ProjTypeTable ON ProjectTable.fkProjTypeID = ProjTypeTable.ProjTypeID;"

response.write("oh")

if not request.form("Act_proj") = checked then
sql = sql & "ProjectTable.Archived < 5 AND ProjectTable.Archived > 0"
end if

if not request.form("Fin_proj") = checked then
sql = sql + "ProjectTable.Archived = 5"
end if

if not request.form("Int_adm") = checked then
sql = sql + "MainCatTable.Number = 0 AND (ProjTypeTable.Number = 3 OR ProjTypeTable.Number = 5 OR ProjTypeTable.Number = 6 OR ProjTypeTable.Number = 8)"
end if

if not request.form("Int_tech") = checked then
sql = sql + "MainCatTable.Number = 0 AND ProjTypeTable.Number = 4"
end if

if not request.form("Ext_tech") = checked then
sql = sql + "MainCatTable.Number = 1 AND ProjTypeTable.Number = 0"
end if

if not request.form("My_proj") = checked then
sql = sql + "UserAccessTable.fkUserTypeID > 0 AND UserAccessTable.fkUserTypeID < 4"
end if

recSet.open sql, conn, adLockPessimistic, adCmdText
%>
</tr>
<%

Do while not recSet.EOF
if recSet("PT_PID") <> "" then
%>
<tr>
<td width="20%" align="center">
<a href="res.asp?id=<%=recSet("PT_PID")%>">
<%
LOPNR = recSet("PT_NR") + 1000
LOPNRB = RIGHT(LOPNR, 3)
PNR = recSet("MCT_MCNR")&recSet("IT_INR")&recSet("PTT_PTNR")&LOPNRB
Response.Write(PNR)
%>
</a>
</td>
<td width="80%">
<a href="res.asp?id=<%=recSet("PT_PID")%>">
<%=recSet("PT_PN")%>
</a>
</td>
</tr>

<%
recSet.MoveNext
end if

loop

recSet.close
conn.close
Set conn = Nothing
%>
</table>

Engine^Medlem sedan dec. 20002 861 inlägg
#2

Jag antar att du får ett sql-error. Du har ett semikolon i slutet av första strängen - bort med det.
Varje gång du häktar på något extra på din befintliga sql-sträng behöver du även stoppa in ett mellanslag först.

Börja med det och återkom senare. Använd kod-taggarna [kod] ... [/kod], så att din kod syns.

Får du ett felmeddelande, så posta den relevanta informationen också. Vi slipper gissa oss till problemet då.

@ndersMedlem sedan juni 200026 914 inlägg
#3

Dessutom använder du både & och + för att konkatenera på olika ställen. Använd endast &.

TaengilMedlem sedan maj 20058 inlägg
#4

Hej igen alla goa!
Nu har jag skruvat vänt på det igen, vill inte funka!!
Tanken är ju som sagt att göra ett urval ur tabeller med hjälp av checkboxar. Det här går åt skogen om jag inte får hjälp...

mvh

/Lars

Här är felmeddelandet:

Microsoft OLE DB Provider for SQL Server error '80040e14'
Line 1: Incorrect syntax near ')'.

...../portaltest3.asp, line 88

Här är hela koden:

<!--#include file="Adovbs.inc" -->
<!--#include file="dbconnection.inc"-->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
	<title>Portal</title>
</head>

<body bgcolor="#00BFFF" text="teal" link="teal" vlink="#EE458E" alink="#EE458E">

<H1 color="black"> &nbsp;&nbsp;&nbsp; Projekt </H1>
<H4> &nbsp; Bocka i önskade urvalsalernativ så listas projekten nedan.<br>
     &nbsp; Klicka på projektnummer eller projekt så visas information med editeringsmöjligheter.</H4>

<br><br><br><br>
<%
Dim recSet, sql, LOPNR, LOPNRB
%>

  <table width=400 height=200>
     <form method="post" action="portaltest3.asp">
	 <tr>
	   <td><input type="checkbox" name="Act_proj" value="1"
	   <%if instr(Act_proj,"1") then Response.Write("checked") else Response.write("")%>>
	   Act. projects</td>
       <td><input type="checkbox" name="Fin_proj" value="2"
	   <%if instr(Fin_proj,"2") then Response.Write("checked") else Response.write("")%>>
	   Fin. projects</td>
     </tr>
	 <tr>  
	   <td><input type="checkbox" name="Int_adm" value="3"
	   <%if instr(Int_adm,"3") then Response.Write("checked") else Response.write("")%>>
	   Int. admin.</td>
       <td><input type="checkbox" name="Int_tech" value="4"
	   <%if instr(Int_tech,"4") then Response.Write("checked") else Response.write("")%>>
	   Int. techn.</td>
     </tr>
	 <tr>
	   <td><input type="checkbox" name="Ext_tech" value="5"
	   <%if instr(Ext_tech,"5") then Response.Write("checked") else Response.write("")%>>
	   Ext. techn.</td>
	   <td><input type="checkbox" name="My_proj" value="6"
	   <%if instr(My_proj,"6") then Response.Write("checked") else Response.write("")%>>
	   My projects</td>
     </tr>
	 <tr><td></td><td></td><td><input type="submit" value="Gör urval"></td></tr>
	 </form>
   </table>
<br><br><br><br>
<table border="1" width="35%" valign="top">
<tr>
<%
Set recSet = Server.CreateObject("ADODB.Recordset")
sql = "SELECT ProjectTable.ProjectID AS PT_PID, MainCatTable.Number AS MCT_MCNR, ProjectTable.Archived AS PT_A, InvestorTable.Number AS IT_INR, ProjTypeTable.Number AS PTT_PTNR, ProjectTable.Number AS PT_NR, ProjectTable.ProjectName AS PT_PN "

  sql = sql + "FROM (((ProjectTable INNER JOIN InvestorTable ON ProjectTable.fkInvestorID = InvestorTable.InvestorID) INNER JOIN MainCatTable ON ProjectTable.fkMainCatID = MainCatTable.MainCatID) INNER JOIN ProjTypeTable ON ProjectTable.fkProjTypeID = ProjTypeTable.ProjTypeID) INNER JOIN UserAccessTable ON ProjectTable.ProjectID = UserAccessTable.fkProjectID) WHERE "
  
  if not request.form("Act_proj") = checked then
  sql = sql & ", ProjectTable.Archived < 5 AND ProjectTable.Archived > 0"
  end if
  
  if not request.form("Fin_proj") = checked then
  sql = sql & ", ProjectTable.Archived = 5"
  end if
  
  if not request.form("Int_adm") = checked then
  sql = sql & ", MainCatTable.Number = 0 AND (ProjTypeTable.Number = 3 OR ProjTypeTable.Number = 5 OR ProjTypeTable.Number = 6 OR ProjTypeTable.Number = 8)"
  end if
  
  if not request.form("Int_tech") = checked then
  sql = sql & ", MainCatTable.Number = 0 AND ProjTypeTable.Number = 4"
  end if
  
  if not request.form("Ext_tech") = checked then
  sql = sql & ", MainCatTable.Number = 1 AND ProjTypeTable.Number = 0"
  end if
         
  if not request.form("My_proj") = checked then
  sql = sql & ", UserAccessTable.fkUserTypeID > 0 AND UserAccessTable.fkUserTypeID < 4"
  end if

  sql = sql + ";"
  
  recSet.open sql, conn, adLockPessimistic, adCmdText
%>
</tr>
<%
Do while not recSet.EOF
if recSet("PT_PID") <> "" then
%>
<tr>
 <td width="20%" align="center">
  <a href="restest.asp?id=<%=recSet("PT_PID")%>">
     <%
       LOPNR = recSet("PT_NR") + 1000
       LOPNRB = RIGHT(LOPNR, 3)
       PNR = recSet("MCT_MCNR")&recSet("IT_INR")&recSet("PTT_PTNR")&LOPNRB
       Response.Write(PNR)
     %>
  </a>
 </td>
 <td width="80%">
   <a href="restest.asp?id=<%=recSet("PT_PID")%>">
   <%=recSet("PT_PN")%>
   </a>
 </td>
</tr>

<%
recSet.MoveNext
end if

loop

recSet.close
conn.close
Set conn = Nothing
%>
</table>

</body>
</html>
J.N.Medlem sedan apr. 20031 660 inlägg
#5

HEJ!

Du har + kvar på något ställe.

Om man väljer två chk kan man få

...MainCatTable.Number = 0 AND ProjTypeTable.Number = 4, MainCatTable.Number = 1 AND ProjTypeTable.Number = 0...

vilket inte verkar korrekt.
Parenteser, AND/OR borde finnas med bland alla de urvalsvariabler du kan välja mellan?

För att felsöka enklare, skriv ut och skicka med sql-strängen.

Bonus:
När du ska markera chkboxar behöver du inte sätta det till "", dvs else-satsen nedan behövs inte.

<%if instr(My_proj,"6") then Response.Write("checked") else Response.write("")%>

Radbryt gärna också dina låååånga rader, vilket gör det lättare att läsa.

JAreMANNENMedlem sedan aug. 20001 698 inlägg
#6

Du använder ju fortfarande + på en del ställen!
Ett tips är att skriva ut SQL-strängen när du felsöker, mkt lättare att hitta felen då.

GuffaMedlem sedan juni 2004533 inlägg
#7

Ändra FROM ((( till FROM ((((.

Du behöver dock inte parenteser för join i SQL Server.

Engine^Medlem sedan dec. 20002 861 inlägg
#8

Guffa skrev:

Ändra FROM ((( till FROM ((((.

Du behöver dock inte parenteser för join i SQL Server.

Njaa... Ta bort den sista parantesen som avslutar det sista INNER JOIN-villkoret, så ser det bra ut.

Ta även bort raden

sql = sql + ";"

Den behövs inte.

TaengilMedlem sedan maj 20058 inlägg
#9

Tjena!
Har gjort ändringarna och nu får jag felmeddelandet:

Microsoft OLE DB Provider for SQL Server error '80040e14'
Line 1: Incorrect syntax near ','.

...../portaltest3.asp, line 82

- när jag har någon checkbox ikryssad och trycker på urval

När jag inte har någon checkbox ikryssad och trycker på urval får jag felmeddelandet:

Microsoft OLE DB Provider for SQL Server error '80040e14'
Line 1: Incorrect syntax near 'WHERE'.

...../portaltest3.asp, line 82

Har felet att göra med min "konkatenering" eller vad det kallas tro?

J.N.Medlem sedan apr. 20031 660 inlägg
#10

HEJ!

Citerar mig själv:

J.N. skrev:

För att felsöka enklare, skriv ut och skicka med sql-strängen.

Då kan du även se om du satt ihop strängar fel, eller inte får med de snuttar du tror du fått med.

Dock tror jag detta är ett rent sql-syntax-fel.

TaengilMedlem sedan maj 20058 inlägg
#11

Jag tror också det är sql-syntaxfel, hur gör jag rätt då? det är svårt det här, har kollat runt på olika "kurssidor" o forum, men jag hittar ingen lösning, dvs nån syntax som funkar...

mvh

/Lars

Engine^Medlem sedan dec. 20002 861 inlägg
#12

Skriv ut sql-satsen som genererar felet...

Response.Write sql
TaengilMedlem sedan maj 20058 inlägg
#13

ok, ja nu ser ja bättre!, tack för tipset. När jag skrev:

reponse.write("Debug: ")¨
.
.
.
.
.
.
response.end

så blev det inte alls samma resultat av utskriften, fast det borde kanske det!?, nåja, nu kan jag arbeta lite längre, återkommer säkert. Tack för all hjälp! :)

TaengilMedlem sedan maj 20058 inlägg
#14

Hej igen all goa!
Nu har jag fixat syntaxfelet. *publiken vrålar i extas* ;P
Nu undrar jag om man kan kolla tecken utanför en sträng. Alltså, jag behöver veta vilket tecken det är till vänster om strängen, finns det någon funktion eller nån smidig kodsnutt för det?

Tacksam för hjälp

mvh

/Taengil

J.N.Medlem sedan apr. 20031 660 inlägg
#15

HEJ!

Hur kan du ha tecken till vänster om strängen?
Skriver du ut en sträng börjar det från vänster, skriver du ut en delsträng med Mid eller Right, kan du använda Left till början av Mid/Right-sekvensen.

Lite mer kött på de berömda benen önskas! Gärna med kod! :e

TaengilMedlem sedan maj 20058 inlägg
#16

Ok tanken är att med checkboxarna kunna ställa ett kombinerat krav på listan som skall skrivas ut. Som det är nu går det att
bocka en checkbox i taget o sen få listan utskriven men vill man kombinera så går det inte för det blir ju fel med AND mellan
checkboxvariablerna isf. Hur ska jag få dit AND mellan checkboxvariablerna ifall flera är ibockade. Dessutom måste ju koden "veta" vilken checkboxvariabel som kommer först så att
inte AND hamnar precis efter WHERE. Ok, här e koden:

vid "if sqlAct_proj...." har jag bortkommenterat en idé jag hade som inte funkade, men kanske nåt liknande skulle funka?

<!--#include file="Adovbs.inc" -->
<!--#include file="dbconnection.inc"-->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
	<title>Portal</title>
</head>

<body bgcolor="#00BFFF" text="black" link="black" vlink="black" alink="black">

<H1 color="black" align="center">Projekt </H1>
<H4 align="center"> Bocka i önskade urvalsalernativ så listas projekten nedan.<br>
     Klicka på projektnummer eller projekt så visas information.</H4>

<br><br><br><br>
<%
Dim recSet, sql, LOPNR, LOPNRB
Dim sqlAct_proj, sqlFin_proj, sqlInt_adm, sqlInt_tech, sqlExt_tech, sqlMy_proj
%>

  <table width=400 height=200 align="center">
     <form method="post" action="portaltest2.asp">
	 <tr>
	   <td><input type="checkbox" name="Act_proj" value="1">
	   Act. projects</td>
       <td><input type="checkbox" name="Fin_proj" value="2">
	   Fin. projects</td>
     </tr>
	 <tr>  
	   <td><input type="checkbox" name="Int_adm" value="3">
	   Int. admin.</td>
       <td><input type="checkbox" name="Int_tech" value="4">
	   Int. techn.</td>
     </tr>
	 <tr>
	   <td><input type="checkbox" name="Ext_tech" value="5">
	   Ext. techn.</td>
	   <td><input type="checkbox" name="My_proj" value="6">
	   My projects</td>
     </tr>
	 <tr><td></td><td></td><td><input type="submit" value="Gör urval"></td></tr>
	 </form>
   </table>
<br><br><br><br>
<table border="1" width="35%" valign="top" align="center">
<tr>
<%

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

  sql = "SELECT ProjectTable.ProjectID AS PT_PID, MainCatTable.Number AS MCT_MCNR, ProjectTable.Archived AS
 PT_A, InvestorTable.Number AS IT_INR, ProjTypeTable.Number AS PTT_PTNR, ProjectTable.Number AS PT_NR, ProjectTable.ProjectName AS PT_PN FROM (((ProjectTable INNER
 JOIN InvestorTable ON ProjectTable.fkInvestorID = InvestorTable.InvestorID) INNER JOIN MainCatTable ON ProjectTable.fkMainCatID = MainCatTable.MainCatID) INNER JOIN
 ProjTypeTable ON ProjectTable.fkProjTypeID = ProjTypeTable.ProjTypeID) WHERE "

  ' urval görs genom att varje checkbox motsvarar en sqlsnutt, om inte ibockad så är checkboxvariabeln "inget"
  
  if not request.form("Act_proj") = checked then
  sqlAct_proj = "ProjectTable.Archived < 5 AND ProjectTable.Archived > 0"
  'if LEFT(sqlAct_proj,1) = " " then
  'sqlAct_proj = sqlAct_proj & "AND "
  'end if
  else
  sqlAct_proj = ""
  end if
  
  if not request.form("Fin_proj") = checked then
  sqlFin_proj = "ProjectTable.Archived = 5"
  else
  sqlFin_proj = ""
  end if
  
  if not request.form("Int_adm") = checked then
  sqlInt_adm = "MainCatTable.Number = 0 AND ProjTypeTable.Number = 3 OR ProjTypeTable.Number = 5 OR ProjTypeTable.Number = 6 OR ProjTypeTable.Number = 8"
  else
  sqlInt_adm = ""
  end if
  
  if not request.form("Int_tech") = checked then
  sqlInt_tech = "MainCatTable.Number = 0 AND ProjTypeTable.Number = 4"
  else
  sqlInt_tech = ""
  end if
  
  if not request.form("Ext_tech") = checked then
  sqlExt_tech = "MainCatTable.Number = 1 AND ProjTypeTable.Number = 0"
  else
  sqlExt_tech = ""
  end if
 
  if not request.form("My_proj") = checked then
  sqlMy_proj = "UserAccessTable.fkUserTypeID > 0 AND UserAccessTable.fkUserTypeID < 4"
  else
  sqlMy_proj = ""
  end if
  
  
  'sql = sql + alla sqlsnuttar även om de är "inget" och avslutas med ";"
  sql = sql & sqlAct_proj & sqlFin_proj & sqlInt_adm & sqlInt_tech & sqlExt_tech & sqlMy_proj & ";"
  
  
  ' if sql = "SELECT...WHERE ;" visar hela listan om inget urval gjorts
  if sql = "SELECT ProjectTable.ProjectID AS PT_PID, MainCatTable.Number AS MCT_MCNR, ProjectTable.Archived AS
 PT_A, InvestorTable.Number AS IT_INR, ProjTypeTable.Number AS PTT_PTNR, ProjectTable.Number AS PT_NR, ProjectTable.ProjectName AS PT_PN FROM (((ProjectTable INNER
 JOIN InvestorTable ON ProjectTable.fkInvestorID = InvestorTable.InvestorID) INNER JOIN MainCatTable ON ProjectTable.fkMainCatID = MainCatTable.MainCatID) INNER JOIN
 ProjTypeTable ON ProjectTable.fkProjTypeID = ProjTypeTable.ProjTypeID) WHERE ;" then

  sql = "SELECT ProjectTable.ProjectID AS PT_PID, MainCatTable.Number AS MCT_MCNR, ProjectTable.Archived AS
 PT_A, InvestorTable.Number AS IT_INR, ProjTypeTable.Number AS PTT_PTNR, ProjectTable.Number AS PT_NR, ProjectTable.ProjectName AS PT_PN FROM (((ProjectTable INNER
 JOIN InvestorTable ON ProjectTable.fkInvestorID = InvestorTable.InvestorID) INNER JOIN MainCatTable ON ProjectTable.fkMainCatID = MainCatTable.MainCatID) INNER JOIN
 ProjTypeTable ON ProjectTable.fkProjTypeID = ProjTypeTable.ProjTypeID)"
  end if
  
  
  recSet.open sql, conn, adLockPessimistic, adCmdText
  
  'response.write(sql)
  
%>
</tr>
<%

'skriver ut listan
Do while not recSet.EOF
if recSet("PT_PID") <> "" then
%>
<tr>
 <td width="20%" align="center">
  <a href="res.asp?id=<%=recSet("PT_PID")%>">
     <%
       LOPNR = recSet("PT_NR") + 1000
       LOPNRB = RIGHT(LOPNR, 3)
       PNR = recSet("MCT_MCNR")&recSet("IT_INR")&recSet("PTT_PTNR")&LOPNRB
       Response.Write(PNR)
     %>
  </a>
 </td>
 <td width="80%">
   <a href="res.asp?id=<%=recSet("PT_PID")%>">
   <%=recSet("PT_PN")%>
   </a>
 </td>
</tr>

<%
recSet.MoveNext
end if

loop

recSet.close
conn.close
Set conn = Nothing
%>
</table>

</body>
</html>
TaengilMedlem sedan maj 20058 inlägg
#17

ledsen för de långa raderna, försökte fixa lite iaf :)

J.N.Medlem sedan apr. 20031 660 inlägg
#18

HEJ!

Att få med AND på rätt ställe löser du genom att kontrollera om AND finns med innan.
Det enklaste sättet är en flagga (variabel) som säger att "du är direkt efter WHERE, därför ska det inte börja med AND för detta sql-block".

Sätt variabeln till false/-1/vad du vill överst i sidan.
I varje if-block kollar du om den är sann, isåfall ska du inte ha med AND.
Därefter sätts den till motsatsen, för att få med en AND-sats om du valt flera chkboxar.

Tipsar också om att hålla koll på din sql och de svar du får, eftersom du har komplexa urval med OR.
OR gäller för sig, dvs den går utanför alla andra urval, om du inte omsluter med parenteser.

else-satsen i blocket behövs inte heller.

Genererad på 384 ms · cache AV · v20260730165559-full.f96bc7eb