Avatar billede lsolesen Nybegynder
14. marts 2002 - 07:07 Der er 22 kommentarer og
1 løsning

Move, movenext og moveprevious

Hvorfor virker nedenstående kodestump ikke til at flytte sig en post af gangen i recordsettet?

set RS = Server.CreateObject("ADODB.Recordset")
RS.CursorLocation = 3 ' adUseClient
RS.CursorType = 3 ' adOpenStatic
sql = "SELECT * FROM NYHEDER ORDER BY Dato DESC"
RS.Open sql, conn, 3, 3, &H0001 ' adCmdText
set rs = conn.execute(sql)
RS.move(idnyhed)
detteid = RS("id")
'response.write detteid
RS.movenext
naeste = RS("id")
'response.write naeste
RS.move(idnyhed)
RS.moveprevious
forrige = RS("id")
'response.write forrige
Avatar billede lsolesen Nybegynder
14. marts 2002 - 07:08 #1
Hov der mangler noget:

%>
<a href='sidste_nyt.asp?id=<%=forrige%>'>Forrige</a> | <a href='sidste_nyt.asp?id=<%=naeste%>'>Næste</a>
    <%   
rs.close
set rs = nothing

- du kan se outputtet på www.vih.dk/sidste_nyt.asp
Avatar billede coltau Juniormester
14. marts 2002 - 08:49 #2
Firdi move ikke flytter som du vil have det. Move flytter antal pladser frem. !
Jeg prøver at forklare:

RS.move(idnyhed) ' Flyt idnyhed antal pladser frem. !
detteid = RS("id")
'response.write detteid
RS.movenext ' Flyt til næste
naeste = RS("id")
'response.write naeste
RS.move(idnyhed) ' Flyt idnyhed antal pladser frem. !
RS.moveprevious ' Flyt en tilbage
forrige = RS("id")
Avatar billede lsolesen Nybegynder
14. marts 2002 - 08:54 #3
coltau > Nåeh derfor. Kan man ikke flytte til en bestemt post på en eller anden måde?
Avatar billede lsolesen Nybegynder
14. marts 2002 - 09:37 #4
set RS = Server.CreateObject("ADODB.Recordset")
RS.CursorLocation = 3 ' adUseClient
RS.CursorType = 3 ' adOpenStatic
sql = "SELECT * FROM NYHEDER ORDER BY Dato DESC"
RS.Open sql, conn, 3, 3, &H0001 ' adCmdText
set rs = conn.execute(sql)
rs.movefirst
do until idnyhed = rs("id")
RS.movenext
loop
RS.moveprevious
RS.moveprevious
forrige = RS("id")

Nu har jeg gjort dette i stedet, men forrige bliver lig med naeste?
Avatar billede lsolesen Nybegynder
14. marts 2002 - 09:39 #5
Undskyld ovenstående skulle være

set RS = Server.CreateObject("ADODB.Recordset")
RS.CursorLocation = 3 ' adUseClient
RS.CursorType = 3 ' adOpenStatic
sql = "SELECT * FROM NYHEDER ORDER BY Dato DESC"
RS.Open sql, conn, 3, 3, &H0001 ' adCmdText
set rs = conn.execute(sql)
rs.movefirst
do until idnyhed = rs("id")
RS.movenext
loop
detteid = RS("id")
RS.movenext
naeste = RS("id")
RS.moveprevious
RS.moveprevious
forrige = RS("id")
Avatar billede coltau Juniormester
14. marts 2002 - 21:02 #6
Man kan sagtens flytte til en bestemt post du skal bare lave en MoveFirst først.

RS.Move(12) ' Gå til post 12
RS.MoveFirst ' Gå til første igen
RS.Move(22) ' Gå til post 22

Så kan du vist resten selv. :-)
Avatar billede coltau Juniormester
14. marts 2002 - 21:03 #7
Eller sig lige til. ?
Avatar billede lsolesen Nybegynder
15. marts 2002 - 00:03 #8
Det troede jeg også, men nedenstående returnerer ikke noget i forrige og naeste?

set RS = Server.CreateObject("ADODB.Recordset")
RS.CursorLocation = 3 ' adUseClient
RS.CursorType = 3 ' adOpenStatic
sql = "SELECT * FROM NYHEDER ORDER BY Dato DESC"
RS.Open sql, conn, 3, 3, &H0001 ' adCmdText
set rs = conn.execute(sql)
rs.move(idnyhed)
RS.movenext
naeste = RS("id")
rs.movefirst
rs.move(idnyhed)
RS.moveprevious
forrige = RS("id")
Avatar billede coltau Juniormester
15. marts 2002 - 09:46 #9
Hvad indeholder idnyhed. ? Det skal jo indeholde et tal. Vel og mærke et tal der ligger indefor antallet af records i recordsettet.
idnyhed må ikke være feltet RS("ID") på en bestemt record hvis du har mulighed for at slette nyheder. !
Avatar billede lsolesen Nybegynder
15. marts 2002 - 10:08 #10
idnyhed indeholder en record fra datasættet. Se på www.vih.dk/sidste_nyt.asp - tallet i toppen er idnyhed, som er det samme, som den record der vises, hvis der er valgt en.
Avatar billede coltau Juniormester
15. marts 2002 - 11:05 #11
Hvis du skal have fat i en bestemt nyhed og derefter den forrige og næste så kan du ikke gøre det på den måde med RS.Move-kommandoerne. Der skal noget andet til.

Jeg skal lige høre om den forrige og næste er i forhold til Dato eller ID for det er jo nødvendigvis ikke det samme. ?
Avatar billede lsolesen Nybegynder
15. marts 2002 - 11:12 #12
Det skal være ift. dato!
Avatar billede coltau Juniormester
15. marts 2002 - 12:08 #13
Jeg har prøvet med flere forskellige SQL-sætninger - men det bliver for kompliceret når man som udgangspunkt har et ID (idnyhed) men rækkefølgen skal være dato.

Men du har jo næsten selv lavet en løsning der virker.

set RS = Server.CreateObject("ADODB.Recordset")
const adUseClient = 3
const adOpenKeyset = 1 ' Jeg mener det er hurtogere i dette tilfælde
sql = "SELECT * FROM NYHEDER ORDER BY Dato DESC"
RS.Open sql, conn, adOpenKeyset, adUseClient, &H0001 ' adCmdText

' Find position for idnyhed i recordsettet
pos = -1
if not RS.EOF and RS("ID") = idnyhed then
  pos = 0
else
  pos = -1
  do while not RS.EOF and RS("ID") <> idnyhed
    pos = pos + 1
    RS.MoveNext
  loop
end if

Nu kan du anvende alle Move-kommandoerne men du skal anvende "pos" i stedet for idnyhed

' Sub der behandler nyhed
sub CheckUdskriv(APos)
  ' Kontroller om næste og forrige nyhed ikke findes.
  ' Det sker når valgte nyhed (idnyhed) er den første eller sidste
  if pos <> -1 and pos < RS.RecordCount then
    RS.MoveFirst
    RS.Move(APos)
    ' Udskriv nyhed eller hvad der nu skal ske
  else
    ' Position findes ikke
  end if
end sub

CheckUdskriv(pos + 1) ' Forrige nyhed
CheckUdskriv(pos) ' Valgte nyhed
CheckUdskriv(pos - 1) ' Næste nyhed

Håber du kan bruge det.
Avatar billede lsolesen Nybegynder
15. marts 2002 - 12:57 #14
Pokkers - ellers elegant, men nedenstående virker ikke helt efter hensigten. Se på www.vih.dk/sidste_nyt.asp, hvad de tre sub-rutiner returnerer iht. sidste del af nedenstående.

    set RS = Server.CreateObject("ADODB.Recordset")
    const adUseClient = 3
    const adOpenKeyset = 1 ' Jeg mener det er hurtogere i dette tilfælde
    sql = "SELECT * FROM NYHEDER ORDER BY Dato DESC"
    RS.Open sql, conn, adOpenKeyset, adUseClient, &H0001 ' adCmdText

    ' Find position for idnyhed i recordsettet
    pos = -1
    if not RS.EOF and RS("ID") = idnyhed then
      pos = 0
    else
      pos = -1
      do while not RS.EOF and RS("ID") <> idnyhed
        pos = pos + 1
        RS.MoveNext
      loop
    end if

' Sub der behandler nyhed
sub CheckUdskriv(APos)
  ' Kontroller om næste og forrige nyhed ikke findes.
  ' Det sker når valgte nyhed (idnyhed) er den første eller sidste
      if pos <> -1 and pos < RS.RecordCount then
        RS.MoveFirst
        RS.Move(APos)
        ' Udskriv nyhed eller hvad der nu skal ske
        returnid = rs("id")
    else
    ' Position findes ikke
      end if
end sub

CheckUdskriv(pos + 1) ' Forrige nyhed
forrige = returnid
response.write "Forrige: " & forrige & "<br>"
CheckUdskriv(pos) ' Valgte nyhed
valgte = returnid
response.write "Valgte: " & valgte & "<br>"
CheckUdskriv(pos - 1) ' Næste nyhed
naeste = returnid
response.write "Næste: " & naeste & "<br>"
Avatar billede coltau Juniormester
15. marts 2002 - 14:20 #15
Du skal helt sikkert lige tilføje denne linie i toppen

Dim returnid

Det vil hjælpe. Ellers er jeg ved at teste om koden finder de rigtige.
Avatar billede lsolesen Nybegynder
15. marts 2002 - 14:38 #16
Efter at have erklæret returnid returnerer de som følger:
forrige = valgte
valgte = valgte + 1
naeste = valgte + 2
Se www.vih.dk/sidste_nyt.asp
Avatar billede coltau Juniormester
15. marts 2002 - 16:27 #17
Det er jo klart. Der skal trækkes en fra:

sub CheckUdskriv(APos)
  ' Kontroller om næste og forrige nyhed ikke findes.
  ' Det sker når valgte nyhed (idnyhed) er den første eller sidste
      if pos <> -1 and pos < RS.RecordCount then
        RS.MoveFirst ' Står allerede på første
        RS.Move(APos - 1) ' derfor -1
        ' Udskriv nyhed eller hvad der nu skal ske
        returnid = rs("id")
    else
    ' Position findes ikke
      end if
end sub

Jeg kunne ikke lige gennemskue hvad der var galt - men nu skulle den være der.
Avatar billede lsolesen Nybegynder
15. marts 2002 - 20:56 #18
Nu virker det perfekt med forrige, men der er problemer, når man tager næste post. Se igen resultatet på www.vih.dk/sidste_nyt.asp
Avatar billede coltau Juniormester
16. marts 2002 - 13:53 #19
Nu er den der. !

Jeg har været nødt til at ændre i næsten alle linier - men håber at du kan bruge det. Her er den kode som jeg har anvendt.

<%
' Sub der finder nyhed i henhold til position
sub CheckUdskriv(APos)
  ' Kontroller om næste og forrige nyhed ikke findes.
  ' Det sker når valgte nyhed (idnyhed) er den første eller sidste
  if APos <> -1 and APos < RS.RecordCount then
    RS.MoveFirst
    if (APos > 0) then ' Må ikke Move -1 hvis første
      RS.Move(APos)
    end if
    ' Udskriv nyhed eller hvad der nu skal ske
    returnid = rs("id")
  else
    returnid = -1
  ' Position findes ikke
  end if
end sub

if idnyhed <> "" then
    ' Find position for idnyhed i recordsettet
    if RS.EOF then
      pos = -1 ' Ingen nyheder
    else
      pos = 0
      do while not RS.EOF and RS("ID") <> CInt(idnyhed)
        pos = pos + 1
        RS.MoveNext
      loop
    end if

  CheckUdskriv(pos + 1) ' Forrige nyhed
  response.write "Forrige ID: " & returnid & "<br>"
  CheckUdskriv(pos) ' Valgte nyhed
  response.write "Valgte ID: " & returnid & "<br>"
  CheckUdskriv(pos - 1) ' Næste nyhed
  response.write "Næste ID: " & returnid & "<br>"
end if

' Udskriv alle nyheder
RS.MoveFirst
do while not RS.EOF
  response.write("<a href='test.asp?ID=" & RS("ID") & "'>" & RS("ID") & " " & RS(1) & " " & RS("dato") & "</a><br>")
  RS.MoveNext
loop
%>
Avatar billede lsolesen Nybegynder
17. marts 2002 - 16:47 #20
set RS = Server.CreateObject("ADODB.Recordset")
    const adUseClient = 3
    const adOpenKeyset = 1 ' Jeg mener det er hurtogere i dette tilfælde
    sql = "SELECT * FROM NYHEDER ORDER BY Dato DESC"
    RS.Open sql, conn, adOpenKeyset, adUseClient, &H0001 ' adCmdText

    dim pos, returnid, forrige, naeste, valgte

    ' Find position for idnyhed i recordsettet
    pos = -1
    if not RS.EOF and RS("ID") = idnyhed then
      pos = 0
    else
      pos = -1
      do while not RS.EOF and RS("ID") <> idnyhed
        pos = pos + 1
        RS.MoveNext
      loop
    end if

    ' Sub der finder nyhed i henhold til position
    sub CheckUdskriv(APos)
      ' Kontroller om næste og forrige nyhed ikke findes.
      ' Det sker når valgte nyhed (idnyhed) er den første eller sidste
      if APos <> -1 and APos < RS.RecordCount then
        RS.MoveFirst
        if (APos > 0) then ' Må ikke Move -1 hvis første
          RS.Move(APos)
        end if
        ' Udskriv nyhed eller hvad der nu skal ske
        returnid = rs("id")
      else
        returnid = -1
      ' Position findes ikke
      end if
    end sub

    if idnyhed <> "" then
        ' Find position for idnyhed i recordsettet
        if RS.EOF then
          pos = -1 ' Ingen nyheder
        else
          pos = 0
          do while not RS.EOF and RS("ID") <> CInt(idnyhed)
            pos = pos + 1
            RS.MoveNext
          loop
        end if

          CheckUdskriv(pos + 1) ' Forrige nyhed
          forrige = returnid
          response.write "Forrige ID: " & forrige & "<br>"
          CheckUdskriv(pos) ' Valgte nyhed
        Valgte = returnid
          response.write "Valgte ID: " & valgte & "<br>"
          CheckUdskriv(pos - 1) ' Næste nyhed
          naeste = returnid
          response.write "Næste ID: " & naeste & "<br>"

    end if ' til at finde en position i nyhedssættet

    ' Udskriv alle nyheder
    RS.MoveFirst
    do while not RS.EOF
    response.write("<a href='sidste_nyt.asp?ID=" & RS("ID") & "'>" & RS("ID") & " " & RS(1) & " " & RS("dato") & "</a><br>")
      RS.MoveNext
    loop   
%>

    <a href='sidste_nyt.asp?id=<%=forrige%>'>Forrige</a> | <a href='sidste_nyt.asp?id=<%=naeste%>'>Næste</a>
    <%   
    rs.close
    set rs = nothing
%>
Avatar billede lsolesen Nybegynder
17. marts 2002 - 16:49 #21
Den er ikke helt god endnu. Ovenstående kode giver altid det samme output i forrige, valgte og naeste! Se www.vih.dk/sidste_nyt.asp
Avatar billede coltau Juniormester
18. marts 2002 - 08:46 #22
Den er jo heller i helt magen til det sidste kode jeg lavede. Som jeg skrev har jeg næsten rettet alle linier og jeg kan se at din kode ikke er magen til.
Avatar billede lsolesen Nybegynder
18. marts 2002 - 09:04 #23
Det undskylder jeg. Afsnittet, der starter med ' Find position for idnyhed i recordsettet havde sneget sig ind - og ved du hvad: efter jeg slettede det er der ingen problemer. Jeg er en glad mand. Tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester