Vet inte om det beror på att det är sent, men en sak står still i skalen nu :-) om du är säker på att du inte tar bort nått i databasen kan du ju istället ta Detta kanske kan vara till hjälp. ;o) Hmm.. Var nog för trött igår för frågan blev inte riktigt som jag ville :-) Du gav så vag information i ditt inlägg. Kunde inte prestera en bättre fråga. Om du sorterar inlägg med t.ex dat och vill filtrera det till en kategori kan du skriva om fråga: Jag är tydligen inte så bra på att förklara :-) Denna frågan bör fungera Men samma problem finns väl här. Jag antar att du använder ADO. Jag har dock en fungerande lösning i DAO som kanske går att överföra till ADO. Den använder sig av SEEK-funktionen och förutsätter att du bara öppnar EN tabell (Main). Har aldrig använt seek tidigare så jag kanske fattat nåt fel i koden, men när jag skriver enligt nedan får jag detta felmeddelande: "Aktuell provider stöder inte det nödvändiga gränssnittet för indexfunktionen" Du har rätt... Tänkte inte på det. Sak ju inte vara ID i den satsen utan fältet du sorterar på. ;o)Få ut id från posten före och efter i ett RS?
Kodar i ASP mot en Access-databas. Jag vill köra en select-sats med ett specifikt ID på en post angiven, men vill förutom enbart den posten få ut även den post som kommer efter samt den post som kommer före i ordningen recordsetet.
Hur löser jag detta?Sv: Få ut id från posten före och efter i ett RS?
id -1, id, id +1
where id=" &id-1& " or id ="& id &" or id="& id+1 &"Sv: Få ut id från posten före och efter i ett RS?
<code>
strSQL = "SELECT Main.*, (SELECT Max(Sub.ID)" & vbCrLf & _
" FROM TabellNamn AS Sub WHERE Sub.ID<Main.Id) AS Previous, " & vbCrLf & _
" (SELECT Min(Sub.ID)" & vbCrLf & _
" FROM TabellNamn AS Sub WHERE Sub.ID>Main.Id) AS Next" & vbCrLf & _
"FROM TabellNamn AS Main" & vbCrLf & _
"WHERE Main.ID = " & ID
</code>Sv: Få ut id från posten före och efter i ett RS?
Vi säger så här:
Jag har en massa poster i en tabell som tillhör flera olika kategorier. Med en select-sats tar jag ut alla poster som tillhör en av kategorierna.
I denna mängd vet jag i förväg att en post har id = 55.
Nu vill jag hoppa fram till denna post och sedan även kunna få fram ID numret på den posten före i RS samt posten efter i RS (och dessa poster är då helt okända och kan ha vilka ID som helst).
Det finns väl någon SEEK man köra på ett RS, eller?
Hur använder jag den i så fall?
Kan nån visa en kodsnutt för att hoppa fram till ID=55, sedan stega bakåt och ta den postens ID om det finns någon, samt stega framåt och ta den postens ID om det finns någon.
Jättetack på förhand.Sv: Få ut id från posten före och efter i ett RS?
<code>
strSQL = "SELECT Main.*, (SELECT TOP 1 Sub.ID" & vbCrLf & _
" FROM TabellNamn AS Sub" & vbCrLf & _
" WHERE Sub.ID<Main.Id AND Sub.Kategori=Main.Kategori" & vbCrLf & _
" ORDER BY DESC Sub.Datum) AS Previous, " & vbCrLf & _
" (SELECT TOP 1 Sub.ID" & vbCrLf & _
" FROM TabellNamn AS Sub" & vbCrLf & _
" WHERE Sub.ID>Main.Id AND Sub.Kategori=Main.Kategori" & vbCrLf & _
" ORDER BY Sub.Datum) AS Next" & vbCrLf & _
"FROM TabellNamn AS Main" & vbCrLf & _
"WHERE Main.ID = " & ID
</code>Sv: Få ut id från posten före och efter i ett RS?
Men den sql-fråga du gav nu senast antar väl att föregående post alltid har ett lägre ID än den nuvarande och nästa post alltid har en ID högre än nuvarande?
Men om så inte alltid är fallet.
Ett exempel:
Om vi låtsas att denna sql-fråga:
"select id from tabell where kategori=9 order by rubrik asc"
genererar ett RS som innehåller följande ID på posterna:
3, 12, 68, 72, 55, 23, 15, 6
Nu låtsas vi att jag i förväg ENBART känner till att posten med ID=55 finns i denna kategori och jag vill ta reda på vilken post som ligger före resp. efter denna. OBS, jag har då i detta läge ingen aning om att det är posterna 72 resp. 23 jag söker. Är du med? :-)
Kan man då inte inom ett RS hoppa fram till posten med ID=55 och sen köra en RS.movenext resp. RS.moveprevious för att få fram posterna före och efter?
I så fall, hur hoppar jag fram till post med ID=55 utan att behöva loopa igenom hela RS till jag hittar den med ID=55?
Jag vet att nåt som väl heter RS.seek kanske kan användas då, men hur skriver man?Sv: Få ut id från posten före och efter i ett RS?
<code>
strSQL = "SELECT Main.*, (SELECT TOP 1 Sub.ID" & vbCrLf & _
" FROM TabellNamn AS Sub" & vbCrLf & _
" WHERE Sub.ID<Main.Id AND Sub.Kategori=Main.Kategori" & vbCrLf & _
" ORDER BY Sub.Rubrik DESC) AS Previous, " & vbCrLf & _
" (SELECT TOP 1 Sub.ID" & vbCrLf & _
" FROM TabellNamn AS Sub" & vbCrLf & _
" WHERE Sub.ID>Main.Id AND Sub.Kategori=Main.Kategori" & vbCrLf & _
" ORDER BY Sub.Rubrik ASC) AS Next" & vbCrLf & _
"FROM TabellNamn AS Main" & vbCrLf & _
"WHERE Main.ID = " & 55
</code>Sv: Få ut id från posten före och efter i ett RS?
Din sats gör en jämförelse att id på Previous ska vara mindre än id på Main. I mitt exempel ovan visade jag att id även kan vara större på den föregående posten.
Likaså gör du jämförelse att id på Next ska vara större än id på Main, men så är heller inte alltid fallet...
Eller är detta en omöjlig uppgift kanske att lösa :-)Sv: Få ut id från posten före och efter i ett RS?
<code>Dim wsp As DAO.Workspace
Dim jdb As DAO.Database
Dim rst As DAO.Recordset
'Skapa Jet workspace
Set wsp = CreateWorkspace("JetWorkspace", "admin", "", dbUseJet)
'Öppna databas
Set jdb = wsp.OpenDatabase(strConn, False, False)
'Öppna tabellen och sätt index
Set rst = jdb.OpenRecordset("MAIN", dbOpenTable)
rst.Index = Indexnamn
'Sök posten
rst.Seek "=", "55"
'Om träff - flytta till föregående post
If Not Table.NoMatch Then
rst.MovePrevious
Else
MsgBox "Ingen träff"
End If
</code>Sv: Få ut id från posten före och efter i ett RS?
<%
sokid=55
SQLstring = "Select id from bilder where kategori=9 order by tidpunkt desc"
Set RS = Server.CreateObject("ADODB.Recordset")
RS.Open SQLstring, Conn,3,1
RS.index = id
RS.seek "=", sokid
if not table.nomatch then
RS.moveprevious
if not RS.bof then
prev_id=RS("id")
end if
end if
RS.Close
Set RS = Nothing
%>Sv: Få ut id från posten före och efter i ett RS?
<code>
strSQL = "SELECT Main.*, (SELECT TOP 1 Sub.ID" & vbCrLf & _
" FROM TabellNamn AS Sub" & vbCrLf & _
" WHERE Sub.Rubrik<Main.Rubrik AND Sub.Kategori=Main.Kategori" & vbCrLf & _
" ORDER BY Sub.Rubrik DESC) AS Previous, " & vbCrLf & _
" (SELECT TOP 1 Sub.ID" & vbCrLf & _
" FROM TabellNamn AS Sub" & vbCrLf & _
" WHERE Sub.Rubrik>Main.Rubrik AND Sub.Kategori=Main.Kategori" & vbCrLf & _
" ORDER BY Sub.Rubrik ASC) AS Next" & vbCrLf & _
"FROM TabellNamn AS Main" & vbCrLf & _
"WHERE Main.ID = " & 55
</code>
Vilket borde fungera. ;-)