Toon posts:

[ASp] laatste record opvragen

Pagina: 1
Acties:
  • 129 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Allereerst, ik ben een newbee wat betreft asp. Ik heb mbv Dreamweaver, google en vele forums een CMS in elkaar kunnen zetten. Ik stuit alleen op een laatste porbleempje.

Ik heb een pagina (portfolio.asp) waar ik links een menutje heb dat dmv SQL en een repeat region waardes (projectnamen) uit de database haalt. Wanneer ik op een van deze projecten klik komt in een iframe ernaast (project.asp) alle info uit de database die ik nodig heb. Dit werkt allemaal top. Alleen wanneer ik in het hoofdmenu portfolio.asp aanroep krijg ik in het iframe de volgende foutmelding:

"BOF of EOF is Waar, of de huidige record is verwijderd. Voor de gewenste bewerking moet er een huidige record zijn."

Hieronder staat de code hoe ik in de iframe de pagina project aanroep.
code:
1
<iframe src="project.asp" name="detailpage" id="detailpage" width="400" height="350" marginwidth="0" marginheight="0" align="left" scrolling="auto" frameborder="0"></iframe>


wanneer in de tabel in de database een ID=1 staat, wordt deze pagina laten zien. Nu heb ik deze waarde verwijderd en nu krijg ik dus die foutmelding.

Hoe krijg ik het voorelkaar dat in de iframe bv de laatste record wordt laten zien.

wanneer ik bv onderstaande code invoer wordt wel direct een detailpagina laten zien.
code:
1
<iframe src="project.asp?ProjectID=5"....


Wat ik dus zoek is een stukje code dat de laatste record oproept en dat dus op de plek staat ipv de 5. Of is hier een andere methode voor.

ps. ik gebruik een access database

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

SQL:
1
Select Top 1 * FROM tabelnaam ORDER BY DatumIngevoerd DESC

oid?

[ Voor 13% gewijzigd door gorgi_19 op 17-03-2005 15:09 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • [harm]
  • Registratie: September 2001
  • Laatst online: 26-02-2025
Omdat je nog geen id doorgeeft aan je iframe, maar er wel een query wordt uitgevoerd, is je recordset leeg. Omdat hij leeg is, en je waarschijnlijk niet check of je recordset records bevat, krijg je deze melding.

De display van data binnen een check zetten:

if not rs.eof then
... je waardes aanroepen etc...
end if

Just when I thought I was out, THEY PULL ME BACK IN!


  • André
  • Registratie: Maart 2002
  • Laatst online: 06-05 11:13

André

Analytics dude

Als de query op een bepaalde ID geen records teruggeeft kun je toch gewoon de laatste record pakken met moveLast?

Verwijderd

Topicstarter
Select Top 1 werkt niet.

Ik ben er inmiddels wel achter dat je in Dreamweaver een default value kan aangeven. Deze stond dus op 1. Nu is alleen nog de vraag hoe zet ik deze op "laatst ingevoerde record"

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 07-05 15:06

sopsop

[v] [;,,;] [v]

Waar heb jij die select top 1 aangepast? In die pagina in die in je Iframe staat?

Zo ja, dan moet je dat stukje in de query waar "where id=" & id in staat weghalen.

Verwijderd

Topicstarter
Heb idd in de pagina die in t iframe staat dat aangepast. Hieronder zie zoals het er nu staat

code:
1
Rs.Source = "SELECT *  FROM Projecten WHERE ProjectID = "+ ReplaceRS__MMColParam, "'", "''") + ""


Hier vangt ie de ID af die meegegeven wordt wanneer er op een link wordt geklikt in het menu. dan krijg je bv. project.asp?ProjectID=5

Als ik onderstaande ervan maak dan krijg ik alleen de 1e record te zien. Ook wanneer ik op een link klik, want dan weet ie nl niet welk ID ie moet laten zien aangezien dat niet meer gedefineerd is.
code:
1
Rs.Source = "SELECT Top 1 *  FROM Projecten"


Wanneer ik dit ervan maakt werkt het geheel niet meer
code:
1
Rs.Source = "SELECT Top1 *  FROM Projecten  WHERE ProjectID = "+ ReplaceRS__MMColParam, "'", "''") + ""


En dit werkt dus ook niet.
code:
1
Rs.Source = "SELECT Top 1 *  FROM Projecten "+ ReplaceRS__MMColParam, "'", "''") + ""


Hoe krijg ik t ooit voor elkaar om zowel de pagina's te laten zien waarbij de ID wordt meegegeven dmv de link uit t menu en dat ie standaard de 1e record laat zien?

[ Voor 11% gewijzigd door Verwijderd op 17-03-2005 18:43 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 had nog een ORDER BY ... DESC toegevoegd

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
ja ok, heb ik ook staan nu, maar dat lost t probleem nog niet op... |:(

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op donderdag 17 maart 2005 @ 18:47:
ja ok, heb ik ook staan nu, maar dat lost t probleem nog niet op... |:(
En wat werkt er niet aan
SQL:
1
SELECT Top 1 *  FROM Projecten ORDER BY ProjectID DESC

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
dat werk wel, maar dan laat ie alleen dat ene record zien. Ik kan dan niet meer in m'n menutje klikken voor een ander ID

Verwijderd

Ik begrijp je probleem niet echt.. Je zegt dat als je ID=5 weglaat, dat je dan die fout krijgt. Dat is ook logisch, want dan gaat hij zoeken naar een id met de waarde "". En die bestaat niet, dus is je recordset leeg. Wanneer dat gebeurt, kun je het volgende maken:

Als je nu eerst de query

code:
1
SELECT ID FROM tabelnaam

uitvoert, daar de laatste record van neemt
code:
1
rst.MoveLast

en daar dan weer de ID waarde van ophaalt, en daar uiteindelijk mee aan het werk gaat, dan is je probleem toch opgelost :?

Voor de gevallen waarin de waarde wel bekend is (dus als ID=5 ofzo), dan kun je je gewone code toch gebruiken? (Zet er dan nog wel even rst.MoveFirst bij ;))

Of praat ik nu wartaal :P ?

rst is hierbij de naam van je recordset :)

Verwijderd

Topicstarter
Wartaal! :P

Opzich begrijp ik wel wat je bedoelt maar heb gods geen idee waar ik wat moet plaatsen.

Hieronder even het begin van de pagina uiteengezet.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="Connections/lynxVB.asp" -->
<%
Dim rst__MMColParam
rst__MMColParam = "1"
If (Request.QueryString("ProjectID")    <> "") Then 
  rst__MMColParam = Request.QueryString("ProjectID")   
End If
%>
<%
Dim rst
Dim rst_numRows

Set rst = Server.CreateObject("ADODB.Recordset")
rst.ActiveConnection = MM_lynxVB_STRING
rst.Source = "SELECT * FROM Projecten WHERE ProjectID = " + Replace(rst__MMColParam, "'", "''") + ""
rst.CursorType = 0
rst.CursorLocation = 2
rst.LockType = 1
rst.Open()

rst_numRows = 0
%>


Bij regel 5 wordt "1" als default value weergegeven. Dus wanneer de pagina geen ID meekrijgt van de link zal deze de waarde 1 meegeven omdat die dus als default staat.

Deze code is door Dreamweaver aangemaakt. Ik begrijp wel ongeveer wat er staat, maar zou t nooit zelf verzonnen kunnen hebben... 8)7

Wat ik dus eigenlijk wil is dat de default waarde de laatst ingevoerde record is, aangezien records kunnen worden verwijderd en toegevoegd...

Verwijderd

Ik zal het uit mijn hoofd proberen, maar ik kan je niet garanderen dat alles klopt ;) Die Dreamweaver code is :r

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%
Dim con, pad, rst, SQL
Dim ID

pad = Request.ServerVariables("APPL_PHYSICAL_PATH") & "dbnaam.mdb" 

Set con = Server.CreateObject("ADODB.Connection")
con.Open "Data Source=" & pad & "; Provider=Microsoft.Jet.OLEDB.4.0;"

ID = Request.Querystring("projectid")

If ID = "" then 
   Set rst = Server.CreateObject("ADODB.Recordset")
   SQL = "SELECT ID FROM tabelnaam"

   rst.Open SQL, con, 2,2
   rst.MoveLast
   ID = rst("ID")

   rst.Close
End If


Hiermee bepaal je of ID leeg is, en als dat zo is dan wordt de ID van het laatste record uit de recordset (dat is meteen ook de laatste uit je tabel) opgehaald en in de variabele ID geplaatst.

Hierna kun je gewoon weer verder met je normale code, die wordt uigevoerd als projectid wél bekend is (de If-Then constructie pas je dan dus aan naar een If-Then-Else).

Ik hoop dat het zo duidelijk is :)

[ Voor 26% gewijzigd door Verwijderd op 17-03-2005 20:57 . Reden: heel veel typo's / syntax errors ;) ]


Verwijderd

Topicstarter
Je bent mijn held!!!!!! _/-\o_

Ik moest hier en daar het een en ander aanpassen, maar het werkt. Mijn dank is zeeeeeer groot!!!

_/-\o_ _/-\o_ _/-\o_ _/-\o_ _/-\o_ _/-\o_ _/-\o_ _/-\o_

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op donderdag 17 maart 2005 @ 20:50:
Ik zal het uit mijn hoofd proberen, maar ik kan je niet garanderen dat alles klopt ;) Die Dreamweaver code is :r
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%
Dim con, pad, rst, SQL
Dim ID

pad = Request.ServerVariables("APPL_PHYSICAL_PATH") & "dbnaam.mdb" 

Set con = Server.CreateObject("ADODB.Connection")
con.Open "Data Source=" & pad & "; Provider=Microsoft.Jet.OLEDB.4.0;"

ID = Request.Querystring("projectid")

If ID = "" then 
   Set rst = Server.CreateObject("ADODB.Recordset")
   SQL = "SELECT ID FROM tabelnaam"

   rst.Open SQL, con, 2,2
   rst.MoveLast
   ID = rst("ID")

   rst.Close
End If
Hiermee bepaal je of ID leeg is, en als dat zo is dan wordt de ID van het laatste record uit de recordset (dat is meteen ook de laatste uit je tabel) opgehaald en in de variabele ID geplaatst.

Hierna kun je gewoon weer verder met je normale code, die wordt uigevoerd als projectid wél bekend is (de If-Then constructie pas je dan dus aan naar een If-Then-Else).

Ik hoop dat het zo duidelijk is :)
Waarom alle projecten ophalen en in een recordset naar de laatste gaan? :X Dan lijkt me voor dat stuk mijn SQL statement iets beter performant. Of wil je bij je een miljoen items eerst alle miljoen items gaan ophalen en in ASP naar het einde van die recordset gaan?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

gorgi_19 schreef op vrijdag 18 maart 2005 @ 09:09:
[...]

Waarom alle projecten ophalen en in een recordset naar de laatste gaan? :X Dan lijkt me voor dat stuk mijn SQL statement iets beter performant. Of wil je bij je een miljoen items eerst alle miljoen items gaan ophalen en in ASP naar het einde van die recordset gaan?
Ja, echt efficiënt is het niet, dat ben ik met je eens :). Maar je kunt ook gewoon een SQL query met MAX(ID) of iets dergelijks maken, en dan heb je alsnog je laatste ID.

  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
select top zou moeten werken lijkt me.
heb je al eens in access zelf deze query laten draaien? Krijg je daar resultaten terug?
Limit werkt bij mysql, top bij access, mssql

code:
1
2
3
4
5
6
SELECT top 1 FROM tabel ORDER BY id DESC 
of
SELECT * FROM tabel ORDER BY id DESC LIMIT 1
of
SET ROWCOUNT 1
SELECT * FROM tabel ORDER BY id DESC

Verwijderd

Topicstarter
Met Select Top1.. werkt het niet omdat ik dan geen andere ID kan laten zien dmv een link in een menu.

Het werkt nu en ik ben blij!
Pagina: 1