Hej!
Finns det någon som kan hitta felet i denna kod? Meningen är att redan ifyllda data ska fyllas i enligt Request.QueryString("PA_ID"), men det gör det inte. Alla fält är tomma. Det är meningen att man ska kunna se dessa val sedan vid önskemål uppdatera dessa. Jättetacksam för all hjälp!
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "PA"
SQL = "SELECT * FROM PA_Atgard"
Set RS = Conn.Execute(SQL)
SQL2 = "SELECT * FROM PA_Koppling_Atgard WHERE PA_ID = " & Trim(Request.QueryString("PA_ID")) & " "
Set RS2 = Conn.Execute(SQL2)
%>
<table>
<tr><td>Projektanmälan: <%= Request.QueryString("PA_ID") %></td></tr>
</table>
<table>
<tr><td> </td></tr>
<tr><td>Följande uppgifter finns inlagda för denna projektanmälan. Registrera dessa genom att fylla i dem i formuläret nedan. Redigera efter behov.</td></tr>
<tr><td> </td></tr>
</table>
<table>
<tr>
<td><b>Åtgärd</b> </td>
<td><b>Nybyggnad/Ombyggnad</b></td>
</tr>
<form method="POST" action="form1_atgard2.asp">
<input type="hidden" name="PA_ID" value="<% =Request.QueryString("PA_ID") %>">
<table>
<%
x=1
y=1
Do until rs2.EOF %>
<% Do until rs.EOF %>
<td valign="top">
<input type="checkbox" value="<% = rs("Atgard_ID") %>" name="check<%=x%>"
<% if rs("Atgard_ID")=rs2("Atgard_ID") then
Response.write "checked"
Rad_Ifylld=true
else
Rad_Ifylld=false
end if
%>><% = rs("Namn") %>
<%x= x--1%>
</td>
<td valign="top"><select name="koll<%=y%>">
<% if Rad_ifylld then %>
<option value="">
<option value="Ombyggnad" <%if trim(rs2("Val"))="Ombyggnad" then Response.write "selected"%>>Ombyggnad
<option value="Nybyggnad" <%if trim(rs2("Val"))="Nybyggnad" then Response.write "selected"%>>Nybyggnad
</select>
<%else %>
<option value="">
<option value="Ombyggnad">Nybyggnad
<option value="Nybyggnad">Ombyggnad
</select>
<%end if %>
<%y= y--1%>
</td>
</tr>
<%
rs.movenext
loop
rs2.movenext
loop
Session("x")= x
%>
</table>
<table>
<tr><td> </td></tr>
<tr><td><input type=submit value="submit"></td></tr>
</table>
</form>
<%
rs.close
rs2.close
conn.close
set rs = nothing
set rs2 = nothing
set conn = nothing
%>
Tack, det satte lite fart på det hela. Fast skumt nog fylls bara ett värde i...fast jag vet att flera är ifyllda från början....då är det väl ngt fel på loopen va?
Och hur menade du med det där du skrev om outer join? Hur gör man då?
så kommer man bara in i den inre loopen första gången. Då man kommer till andra posten i rs2 så är ju rs.eof sant. Om du vill ha kvar den logiken skulle du behöva lägga in en rs.movefirst innan do until rs.eof. I så fall behöver du också ändra på hur du öppnar ditt recordset. (När du skapar ett recordset med hjälp av execute så går det bara att flytta sig framåt i det recordsetet.)
SQL2 = "SELECT * FROM PA_Koppling_Atgard WHERE PA_ID = " & Trim(Request.QueryString("PA_ID")) & " "
set rs2 = server.createobject("adodb.recordset")
RS2.open sql2,Conn,3,3
och sedan vid loopen så
Do until rs2.EOF %>
<%
rs.movefirst
Do until rs.EOF %>
Jag återkommer efter lunch om outer join, vilket jag tycker är en bättre och effektivare lösning.
------------------ essentitia preter non sans multiplicandum
Hej och tack!
Jo, nu funkade det att alla värdena kom in. Fast problemet nu är att rs upprepas flera gånger, beroende på hur många värden som ska in. RS upprepas alltså först en gång då värde 1 fylls i, sen en gång till när värde 2 fylls i o.s.v. Vet du vad detta beror på?
Jo, för varje post i tabellen PA_Koppling_Atgard, som uppfyller ditt villkor, så går du igenom alla poster i pa_atgard och skriver ut fält. Du får alltså alla möjliga kombinationer mellan dessa två recordset. Det du vill, förmodar jag, är att för varje post i rs2 så vill du kolla om det finns data i rs som matchar. Om det finns data som matchar skriver du ut en en sak och om inte, en annan.
Du borde alltså flytta ut utskriften utanför den inre loopen så att du bara får en utskrift per rad i rs2.
En alternativ lösning är att göra om select-frågan så att man bara får upp de poster som är relevanta.
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "PA"
SQL = "SELECT * FROM PA_Koppling_Atgard pka right join pa_atgard pa on pka.atgard_id = pa.atgard_id WHERE pka.PA_ID = " & Request.QueryString("PA_ID")
Set RS = Conn.Execute(SQL)
%>
<table>
<tr><td>Projektanmälan: <%= Request.QueryString("PA_ID") %></td></tr>
</table>
<table>
<tr><td> </td></tr>
<tr><td>Följande uppgifter finns inlagda för denna projektanmälan. Registrera dessa genom att fylla i dem i formuläret nedan. Redigera efter behov.</td></tr>
<tr><td> </td></tr>
</table>
<table>
<tr>
<td><b>Åtgärd</b> </td>
<td><b>Nybyggnad/Ombyggnad</b></td>
</tr>
<form method="POST" action="form1_atgard2.asp">
<input type="hidden" name="PA_ID" value="<% =Request.QueryString("PA_ID") %>">
<table>
<%
x=1
y=1
Do until rs.EOF %>
<td valign="top">
<input type="checkbox" value="<% = rs("Atgard_ID") %>" name="check<%=x%>"
<% if not isNull(rs("val")) then
Response.write "checked"
end if
%>><% = rs("Namn") %>
<%x= x--1%>
</td>
<td valign="top"><select name="koll<%=y%>">
<% if not isNull(rs("val")) then %>
<option value="">
<option value="Ombyggnad" <%if trim(rs("Val"))="Ombyggnad" then Response.write "selected"%>>Ombyggnad
<option value="Nybyggnad" <%if trim(rs("Val"))="Nybyggnad" then Response.write "selected"%>>Nybyggnad
</select>
<%else %>
<option value="">
<option value="Ombyggnad">Nybyggnad
<option value="Nybyggnad">Ombyggnad
</select>
<%end if %>
<%y= y--1%>
</td>
</tr>
<%
rs.movenext
loop
Session("x")= x
%>
</table>
<table>
<tr><td> </td></tr>
<tr><td><input type=submit value="submit"></td></tr>
</table>
</form>
<%
rs.close
conn.close
set rs = nothing
set conn = nothing
%>
Skillnaden mellan ej join och en outer join är att du även får rader där det inte finns någon match mellan tabellerna.
SELECT * FROM PA_Koppling_Atgard pka right join pa_atgard pa on pka.atgard_id = pa.atgard_id WHERE pka.PA_ID = " & Request.QueryString("PA_ID")
innebär att man får alla rader från den högra (right) tabellen som uppfyller where-villkoret. För de rader som inte har någon match i den vänstra tabellen så får man null-värden i dessa kolumner (Därför så testar jag med IsNull). Annars fungerar det som en vanlig join.
------------------ essentitia preter non sans multiplicandum
Har du kolumner som är av typen PM/Memo i din tabell? I så fall måste dessa behandlas speciellt. När man gör en select så måste dessa ligga sist i selectlistan och om du har flera PM/Memo fält så måste de vara i samma ordning som de är definerade i tabellen. Det verkar också vara problem med att referera till ett sådant fält i ett recordset flera gånger. Det man får göra i så fall är att lägga över värdet i en VBScript-variabel och använda den i stället.
Det där med att flytta ut utskriften menade jag att du skulle göra såhär ungefär, om man utgår från din lösning med två loopar
do until rs2.eof
rs.movefirst
rad_ifylld = false
do until rs.eof
if cint(rs("atgard_id")) = cint(rs2("atgard_id")) then
rad_ifylld = true
exit do
end if
rs.movenext
loop
if rad_ifylld then
'skriv ut ifyllda
else
'skriv ut icke utfyllda
end if
rs2.movenext
loop
------------------ essentitia preter non sans multiplicandum
Ett tips till dig är att börja kommentera din kodning, för du har väl gjort den själv? Kommentarer är guld värda när du programmerar långa koder... 'Kommentar'
Din kod fungerade fint. Tack för din hjälp. Problemet är dock att jag vill att alla checkboxar ska listas, även de som inte har ngt värde.. Detta för att man ska kunna uppdatera och ändra och kanske kryssa i en checkbox som inte var ikryssad förut.
Hur gör jag då?
Hej igen!
Fick hjälp av en snubbe som sade att jag skulle skriva SQL-satserna på följande sätt men då stämmer inte looparna längre. Vad jag göra? Vill förbi detta problem NU!
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "PA"
SQL = "SELECT * FROM PA_Syfte WHERE Syfte_ID IN (SELECT Syfte_ID FROM PA_Koppling_Syfte WHERE PA_ID = " & Trim(Request.QueryString("PA_ID")) & ")"
Set RS = Conn.Execute(SQL)
SQL2 = "SELECT * FROM PA_Syfte WHERE Syfte_ID NOT IN (SELECT Syfte_ID FROM PA_Koppling_Syfte WHERE PA_ID = " & Trim(Request.QueryString("PA_ID")) & ")"
Set RS2 = Conn.Execute(SQL2)
%>
<table>
<tr><td>Projektanmälan: <%= Request.QueryString("PA_ID") %></td></tr>
<tr><td> </td></tr>
</table>
<% If rs2.Eof Then %>
<p>
Inga uppgifter finns ännu inlagda. Var god uppdatera om så önskas.
<% Else %>
<form method="POST" action="form2_trafikslag2.asp">
<input type="hidden" name="PA_ID" value="<% =Request.QueryString("PA_ID") %>">
<table>
<tr><td> </td></tr>
<tr><td>Följande uppgifter finns inlagda för denna projektanmälan. Redigera efter behov.</td></tr>
<tr><td> </td></tr>
</table>
<table>
<tr><td><b>Syfte/bakgrund</b></td></tr>
<%
x=1
Do until RS2.EOF
%>
<%
RS.MoveFirst
Do until RS.EOF
%>
<tr>
<td valign="top">
<input type="checkbox" value="<% = rs("Syfte_ID") %>" name="check<%=x%>"
<% if cint(RS("Syfte_ID"))=cint(RS2("Syfte_ID")) then
Response.write "checked"
Rad_Ifylld=true
else
Rad_Ifylld=false
end if
%>><% = rs("Namn") %>
<%x= x--1%>
</td>
<%
RS.MoveNext
loop
RS2.MoveNext
loop
Session("x")= x %>
<%
RS.close
RS2.close
Conn.close
set RS = nothing
set RS2 = nothing
set Conn = nothing
%>
<tr><td> </td></tr>
<tr><td>
<input type=submit value="Godkänn">
</form>
<% End If %>
Den första SQL-satsen ska på ngt vis lista de ikryssade värdena och den andra ska lista de okryssade...
[Redigerat av soffan76 den 28 maj 2001]
294 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e