webForumDet fria alternativet

RIGHT OUTER JOIN, uppdatera fält

ASP

22 svar · 373 visningar · startad av evesve

Medlem sedan sep. 2001163 inlägg
Frågan#1

Jag har två tabeller i samma Access-bas:
Telefontabell och Intressen.
I telefontabell (Huvudtabellen) har jag bl.a. kolumnerna:
ID (Räknare) (Primärnyckel)
Enamn (Text)
Fnamn (Text)
Telefon (Text)
I Intressen har jag bl.a kolumnerna:
Adressnr(Räknare)
ID (Tal) (Primärnyckel)
Fritidsintressen (Text)

Tabellerna är relaterade till varandra som 1:1 med kolumnerna ID.
I Tabellen Telefontabell finns fler rader (ID) med som inte finns med i Intressen.

Jag får fram rätt uppgifter med koden:

<%Set RecSet = Server.CreateObject("ADODB.Recordset") %>
<% Visa = "SELECT * FROM intressen RIGHT OUTER JOIN telefontabell ON telefontabell.Id = intressen.Id order by telefontabell.Enamn"
RecSet.Open Visa, Connect, adOpenStatic, adLockOptimistic 
%> 
<form method="POST" action="ASP-koder-egna?kod=a35" name="ad">
<table border="0" cellpadding="2" cellspacing="2"> 
<tr>
<td width="10"<b>Id</b></td>
<td width="10"><b>AdrNr</b></td>
<td width="100"><b>Efternamn</b></td>
<td width="100"><b>Förnamn</b></td>
<td width="100"><b>Telefon</b></td>
<td width="100<b>Intressen</b></td>
</tr>
<%Do While Not RecSet.EOF%>
<tr>
<td><% =RecSet("Id") %></td>
<td><% =RecSet("Adressnr") %></td>
<td><% =RecSet("Enamn") %></td>
<td><% =RecSet("Fnamn") %></td>
<td><% =RecSet("Telefon") %></td>
<td><input type="text" name="Fritidsintressen" value="<% =RecSet("Fritidsintressen") %>"></td>
</tr>
<% RecSet.MoveNext%> 
<%Loop 
RecSet.Close%>
<tr><TD colspan=6><input type="submit" name="knapp" class=bg5 value="Uppdatera"></TD>
</tr>
</TABLE>

Byter jag ut till:

<%Set RecSet = Server.CreateObject("ADODB.Recordset") %>
<% Visa = "SELECT * FROM telefontabellLEFT OUTER JOIN intressen ON telefontabell.Id = intressen.Id order by telefontabell.Enamn"
RecSet.Open Visa, Connect, adOpenStatic, adLockOptimistic 
%>

så får jag inte fram ID på dom utan Fritidsintressen, alltså kan jag inte skriva in och uppdatera som jag kunde med bara en tabell med koden:

<%If request.form("knapp") = "Uppdatera" Then
for i = 1 to request.form("Id").count%>
<%
sql = "update intressen set Id = '" & request.form("Id")(i) & "'" _
   & " where Id = " & request.form("Id")(i)

response.write sql
connect.execute sql,,128
next%>

Förstår ni problemet?
Hur gör jag?

Jag får felmeddelandet:

HTTP-fel 405
405 Ogiltig metod

Den metod som anges i begäran är inte tillåten för den resurs som begäran avser. Kontrollera att du använder rätt MIME-typ för den resurs som du frågar efter

[Redigerat av evesve den 04 feb 2002]

Medlem sedan feb. 20012 412 inlägg
#2
sql = "update intressen set Id = " & request.form("Id")(i) & "" _
& " where Id = " & request.form("Id")(i)

Dina id-kolumner var numeriska båda, därför inga '' runt värdet.

Men av detta skulle det inte bli det felmeddelandet, så där är säkert ett fel till.

mvh Jörgen :)

------------------
"När forumledarna är på gott humör går det också att få ett eller annat
vettigt ord ur dem." /Hypatia 2002

[Redigerat av jorgen den 04 feb 2002]

Medlem sedan dec. 200012 464 inlägg
#3

Jag förstår inte alls. Varför uppdaterar du en post till samma värde som den hade innan?

Dina frågor kommer att returnera samma resultat, enda skillnaden är att kolumnerna inte kommer i samma ordning.

------------------
essentitia preter non sans multiplicandum

Medlem sedan sep. 2001163 inlägg
#4

Till Jörgen: Det gjorde ingen skillnad.
Till LarsG:
Det ID som jag får fram tillhör tabellen "telefontabell".
I min enfald trodde jag att det måste finnas en rad med rätt ID för att kunna uppdatera den.
Egentligen är det koden:

sql = "update intressen set Fritidsintressen = '" & request.form("Fritidsintressen ")(i) & "'" _
   & " where Id = " & request.form("Id")(i)

som jag vill få in.

Medlem sedan dec. 200012 464 inlägg
#5

Om du lägger till ett hidden fält som heter ID och ändrar select-satsen något

<%Set RecSet = Server.CreateObject("ADODB.Recordset") %>
<% Visa = "SELECT adressnr,Enamn,Fnamn,Telefon,fritidsintressen,telefontabell.id " & _
" FROM intressen RIGHT OUTER JOIN telefontabell ON telefontabell.Id = intressen.Id order by telefontabell.Enamn"
RecSet.Open Visa, Connect, adOpenStatic, adLockOptimistic 
%> 
<form method="POST" action="ASP-koder-egna?kod=a35" name="ad">
<table border="0" cellpadding="2" cellspacing="2"> 
<tr>
<td width="10"<b>Id</b></td>
<td width="10"><b>AdrNr</b></td>
<td width="100"><b>Efternamn</b></td>
<td width="100"><b>Förnamn</b></td>
<td width="100"><b>Telefon</b></td>
<td width="100<b>Intressen</b></td>
</tr>
<%Do While Not RecSet.EOF%>
<tr>
<td><% =RecSet("Id") %></td>
<td><% =RecSet("Adressnr") %></td>
<td><% =RecSet("Enamn") %></td>
<td><% =RecSet("Fnamn") %></td>
<td><% =RecSet("Telefon") %></td>
<td><input type="text" name="Fritidsintressen" value="<% =RecSet("Fritidsintressen") %>"></td>
</tr>
<input type="hidden" name="id" value="<%=recset("id")%>">
<% RecSet.MoveNext%> 
<%Loop 
RecSet.Close%>
<tr><TD colspan=6><input type="submit" name="knapp" class=bg5 value="Uppdatera"></TD>
</tr>
</TABLE>

så kan du göra så här

<%If request.form("knapp") = "Uppdatera" Then
for i = 1 to request.form("Id").count%>
<%
intressen = "'" & replace(request.form("Fritidsintressen")(i),"'","''") & "'"
id = request.form("Id")(i)
sql = "update intressen set fritidsintressen = " & intressen _
& " where Id = " & id
'response.write sql
connect.execute sql,rows,128
if rows = 0 then
   sql = "insert into intressen(id,fritidsintressen) values(" & id & _
 ",'" & intressen & ")"
   connect.execute sql,,128
end if
next%>

dvs, man försöker uppdatera, men om det inte fanns någon rad som uppdaterades så gör man insert istället.

------------------
essentitia preter non sans multiplicandum

Medlem sedan sep. 2001163 inlägg
#6

Jo, det där med hidden fält ID borde jag begripit.
Men tyvärr, samma felmeddelande när jag trycker på knappen uppdatera.
===================
HTTP-fel 405
405 Ogiltig metod

Den metod som anges i begäran är inte tillåten för den resurs som begäran avser. Kontrollera att du använder rätt MIME-typ för den resurs som du frågar efter.

Kontakta serverns administratör om det här problemet kvarstår.
=====================
Kan det ha med PWS, ASP 2 att göra?
(Att jag är lite omodern?)

Medlem sedan dec. 200012 464 inlägg
#7

Jo, det där HTTP felet har ju inget att göra med databasfrågorna.
Tyvärr så är det inget som jag är insatt i, men det låter mer som ett problem med konfiguration av PWS eller så.

------------------
essentitia preter non sans multiplicandum

Medlem sedan sep. 2001163 inlägg
#8

Testade att lägga upp det på en annan server.
Där kom jag lite längre.
Fick felmeddelande:
================
Microsoft VBScript runtime error '800a01a8'

Object required: 'Provider=Microsoft.J'

/svenssons/test/a36.asp, line 23
==============
vilket är:

connect.execute sql,rows,128

=========== http://www.websamba.com/svenssons/test/a36.asp

[Redigerat av evesve den 04 feb 2002]

Medlem sedan feb. 20012 412 inlägg
#9

Hej, hur ser din databaskoppling ut?

mvh Jörgen :)

------------------
"När forumledarna är på gott humör går det också att få ett eller annat
vettigt ord ur dem." /Hypatia 2002

Medlem sedan sep. 2001163 inlägg
#10

Nu är isberget brutet, jag får reaktion med vettigt felmeddelande.
============
Microsoft OLE DB Provider for ODBC Drivers fel '80040e14'

[Microsoft][Drivrutin för ODBC Microsoft Access] Syntaxfel (operator saknas) i frågeuttrycket '''Bilar')'.

/asp/a36.asp, rad 28
==============
För att förklara närmare så är
Rad 1: Gemensamt ID i båda tabellerna
Rad 2: Inget ID i tabellen Intressen
Rad 3: Gemensamt ID

"Bilar" är det jag skrivit in i textfältet "Fritidsintressen"

Felet kommer alitså på rad tre (efter byte från update till insert?)

Jag kör med enkel databaskoppling:

Set Connect = Server.CreateObject("ADODB.Connection")
'HEMMA
	Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=d:\inetpub\wwwroot\db\telefon.mdb" 
'WEBSAMBA
Connect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/svenssons/db/Telefon.mdb")

[Redigerat av evesve den 04 feb 2002]

Medlem sedan dec. 200012 464 inlägg
#11

Mitt fel förstås, det är en ' för mycket vid insert.

sql = "insert into intressen(id,fritidsintressen) values(" & id & _
"," & intressen & ")"

------------------
essentitia preter non sans multiplicandum

Medlem sedan sep. 2001163 inlägg
#12

Det var väl en för mycket även på raden:

intressen = "'" & replace(request.form("Fritidsintressen")(i),"'","'") & "'"

Men på den raden får jag:
=========
Indexet ligger utanför intervallet

/asp/a36.asp, rad 22

Ett matrisindex ligger utanför intervallet.
===========

Medlem sedan dec. 200012 464 inlägg
#13

Nej, tanken är att man ersätter alla ' med '' annars så blir det fel i sql-satsen.

Kan du lägga ut lite utskrifter så man ser vad som händer.

<%If request.form("knapp") = "Uppdatera" Then
response.write "Antal id " & request.form("Id").count & "<br>"
response.write "Antal intressen " & request.form("fritidsintressen").count & "<br>"

for i = 1 to request.form("Id").count%>
<%
intressen = "'" & replace(request.form("Fritidsintressen")(i),"'","''") & "'"
id = request.form("Id")(i)
sql = "update intressen set fritidsintressen = " & intressen _
& " where Id = " & id
'response.write sql
connect.execute sql,rows,128
if rows = 0 then
sql = "insert into intressen(id,fritidsintressen) values(" & id & _
",'" & intressen & ")"
connect.execute sql,,128
end if
next%>

Om du lämnar något fritidsintresse tomt så blir det nog olika många värden i fälten vilket skulle orsaka det fel som du får.

För att hantera det så får du nog använda en annan strategi, t.ex att du namnger fälten olika t.ex. att du har en räknare som du lägger till efter namnet

i = 1
do until recset.eof
%>
<td><input type="text" name="Fritidsintressen_<%=i%>" value="<% =RecSet("Fritidsintressen") %>"></td>
<input type="hidden" name="id_<%=i%>" value="<%=recset("id")%>">
<%
i = i + 1
recset.movenext
loop
%>
<input type="hidden" name="antal" value="<% =i-1%>">

Sen på andra sidan

<%If request.form("knapp") = "Uppdatera" Then
for i = 1 to request.form("antal")%>
<%
intressen = "'" & replace(request.form("Fritidsintressen_" & i),"'","''") & "'"
id = request.form("Id" & i)
sql = "update intressen set fritidsintressen = " & intressen _
& " where Id = " & id
'response.write sql
connect.execute sql,rows,128
if rows = 0 then
sql = "insert into intressen(id,fritidsintressen) values(" & id & _
",'" & intressen & ")"
connect.execute sql,,128
end if
next%>

Det kan säkert finnas något smärre fel i ovanstående men principen, principen alltså.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 04 feb 2002]

Medlem sedan sep. 2001163 inlägg
Medlem sedan sep. 2001163 inlägg
#15

Nu är segern nära!
LarsG:s nästan ursprungliga förslag har jag nu fått att fungera på egen dator!

<% Option Explicit %>
<html>

<head>
<title>(Type a title for your page here)</title>
<meta name="GENERATOR" content="Arachnophilia 4.0">
<meta name="FORMATTER" content="Arachnophilia 4.0">
</head>

<body bgcolor="#ffff80" text="#ff0000" link="#0000ff" vlink="#800080" alink="#ff0000">
<!-- #include file="adovbs.inc" -->
<!-- #include file="grund.inc" -->			

<!-- #include file="strConnect_telefon.asp" -->
<%
Dim Connect, Recset, Visa, i, intressen, id, sql, rows, LaddaOm%>
<%If request.form("knapp") = "Uppdatera" Then
for i = 1 to request.form("Id").count%>
<%
intressen = "'" & replace(request.form("Fritidsintressen")(i),"'","''") & "'"
id = request.form("Id")(i)
sql = "update intressen set fritidsintressen = " & intressen _
& " where Id = " & id
connect.execute sql,rows,128
if rows = 0 then
sql = "insert into intressen(id,fritidsintressen) values(" & id & _
"," & intressen & ")"

connect.execute sql,,128
end if
next
end if
%>

<%Set RecSet = Server.CreateObject("ADODB.Recordset") %>
<% Visa = "SELECT adressnr,Enamn,Fnamn,Telefon,fritidsintressen,telefontabell.id " & _
" FROM intressen RIGHT OUTER JOIN telefontabell ON telefontabell.Id = intressen.Id order by telefontabell.Enamn"
RecSet.Open Visa, Connect, adOpenStatic, adLockOptimistic 
%> 
<form method="POST" action="a36.asp" name="ad">
<table border="0" cellpadding="2" cellspacing="2"> 
<tr>
<td width="10"><b>Id</b></td>
<td width="10"><b>AdrNr</b></td>
<td width="100"><b>Efternamn</b></td>
<td width="100"><b>Förnamn</b></td>
<td width="100"><b>Telefon</b></td>
<td width="100"><b>Intressen</b></td>
</tr>
<%Do While Not RecSet.EOF%>
<tr>
<td><% =RecSet("Id") %></td>
<td><% =RecSet("Adressnr") %></td>
<td><% =RecSet("Enamn") %></td>
<td><% =RecSet("Fnamn") %></td>
<td><% =RecSet("Telefon") %></td>
<td><input type="text" name="Fritidsintressen" value="<% =RecSet("Fritidsintressen") %>"></td>
</tr>
<input type="hidden" name="id" value="<%=recset("id")%>">
<% RecSet.MoveNext%> 
<%Loop 
RecSet.Close%>
<tr><TD colspan=6><input type="submit" name="knapp" value="Uppdatera"></TD>
</tr>
</TABLE>
</body>
</html>

Däremot får jag ett felmeddelande på webSamba-servern på raden:

connect.execute sql,rows,128

Kan det ha med mitt inloggnings-script att göra?
Tackar i alla fall för all hjälp så länge! http://www.websamba.com/svenssons/test/a36.asp

Medlem sedan sep. 2001163 inlägg
#16

Felmeddelandet:
Object required: 'Provider=Microsoft.J'

Medlem sedan dec. 200012 464 inlägg
#17

Jag ser inte att du skapar någon connection. Är det någon kod som inte är med?

------------------
essentitia preter non sans multiplicandum

Medlem sedan sep. 2001163 inlägg
#18

Jo den ligger i:

<!-- #include file="strConnect_telefon.asp" -->

och ser ut:

Set Connect = Server.CreateObject("ADODB.Connection")
'HEMMA
Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=d:\inetpub\wwwroot\db\telefon.mdb" 
'WEBSAMBA
Connect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/svenssons/db/Telefon.mdb")

[Redigerat av evesve den 05 feb 2002]

Medlem sedan mars 20015 287 inlägg
#19

Kanske så här:

Set Connect = Server.CreateObject("ADODB.Connection")
'HEMMA
'strConnString  "driver={Microsoft Access Driver (*.mdb)};dbq=d:\inetpub\wwwroot\db\telefon.mdb" 
'WEBSAMBA
strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/svenssons/db/Telefon.mdb") 

Connect.Open strConnString

Sen så får du utkommentera den koppling du inte använder, fast det enklaste vore väl att lägga databasen i en mappstruktur som ser ut som den du har på websamba, då klarar du dig med den undre koppligen bara.

------------------
/solbulle
Hemmabio | Spelautomater | The Who | The Who II

Medlem sedan sep. 2001163 inlägg
#20

Den varianten fungerade på websamba, men inte hemma. Men där funkar det ju ändå!
Det "hänger sig" efter första SUBMIT, men laddar jag om sidan så är den uppdaterad. Sen när rader har "eget" ID funkar det bra
Försökte varianten

connect.execute sql,,128
end if
next
Response.redirekt "a36.asp"
end if
%>

Då får jag svaret: "Objektet stöder inte Response.Redirekt...."
Varför fattar jag inte men jag är nog för trött nu!

268 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
133 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
133 ms — ändringar (db)