Avatar billede crawn Nybegynder
09. januar 2004 - 13:56 Der er 7 kommentarer

Menupunkters sortering

Jeg er ved at stable et "hjemme-cms" på benene og skal i den forbindelse have fundet ud af, hvorledes jeg kan sortere i rækkefølgen på evt. menupunkter.

Jeg har en access-database der hedder menuer.
I den db har jeg så en tabel der hedder menu1

Min tabel ser sådan ud:

Menu1_id      Menu1_titel    Menu_orden
1              Menupunkt 1        1
2              Menupunkt 2        2
3              Menupunkt 3        3

Menu1_id er en autonummerværdi

Det er så meningen, at jeg fra min admin-side skal kunne ændre på rækkefølgen så jeg fx. kan bytte om på Menupunkt 1 og Menupunkt 2 (dvs. ændre værdien i "menu_orden")

Jeg kan uden problemer lave en side hvor menupunkterne bliver listet og ud for hvert punkt er der så to links ("ned" og "op").

Jeg har så kunnet læse mig til (andre spørgsmål her på eksperten.dk) at hvert link skal tilføjes en værdi, som ved aktivering fortæller noget i stil med:

if link="op" then menu_orden=menu_orden-1 and prev menuorden=menu_orden+1

jeg er altså nogenlunde med på hvad der skal ske, men jeg har ikke fanget ideen om, hvad jeg skal gøre for at det virker.

der opstår jo så endvidere problemet, at hvis menu_orden=1 (altså ligger øverst) så skal man jo ikke kunne trykke yderligere på "op"

Nogen der har ideer, evt. links m.m.?

Har som sagt terpet eksperten.dk igennem, men har kunne fået bekræftet min ide om hvad der skal ske men ikke mere konkret.

PFT!
Avatar billede eagleeye Praktikant
09. januar 2004 - 14:10 #1
Her et spørgsmål omkirng det samme prøv at kigge det igennem:
http://www.eksperten.dk/spm/294367

Det som skal ske er man opdater sin kolonne Menu_orden men for to menuer ikke har samme orden skal man lave lidt bytte rundt sådan man sætte Menu_orden for den valgte menu punkt for det menu punkt med Menu_orden er lig det nye Menu_orden. Det lyder lidt kringlet, men jeg håber du forstår ;)
Avatar billede crawn Nybegynder
09. januar 2004 - 14:19 #2
Tak for hurtig respons, men dit svar gør det blot mere indviklet i og med din ord-sammensætning mildest talt er ringe (læs lige selv det du skrev igennem)... Jeg har kigget på dit eksempel tidligere, men havde problemer med at overføre det eksempel du havde lavet til det jeg selv stod med, men jeg skal vel bare prøve en gang til..
Avatar billede eagleeye Praktikant
09. januar 2004 - 14:33 #3
Det skam så simpelt som noget kan være.

Der er 2 løsninger.
1. Hvis to menu punkter må havde samme Menu_orden så skal du bare smide den nye Menu_orden for den valgte menu ind
2. Hvis to menu punkter ikke må havde samme Menu_orden. Så bytter du rundt på to menu punkter. Det ene menu punkt er det valgte det andet menu punkt er det hvor Menu_orden er lig Menu_orden for den valgte menu.
Avatar billede crawn Nybegynder
09. januar 2004 - 15:01 #4
Tak for responsen :)  Jeg er med på hvad der skal ske og i mit tilfælde, må 2 menupunkter ikke have samme Menu_orden.

Jeg har efterfølgende forsøgt at overføre din kode fra eksemplet til mit tilfælde men stadig uden held.

Jeg har været koden igennem og faldt over "submenus" som jeg ikke synes er defineret noget sted?!?!! eller er det igen blot mig :)

<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("/config/datasources/db.mdb")

'flyt op/ned
dir = Request.QueryString("dir")
if dir <> "" then
  oldId = Request.QueryString("SubMenuID")
  tempID = 0
 
  SQL = "SELECT TOP 1 menu1_orden FROM submenus WHERE menu1_orden "
  if dir = "op" then
    SQL = SQL & " < " & oldID & " ORDER BY menu1_orden DESC"
    'newID = Int(oldId) - 1
  else
    SQL = SQL & " > " & oldID & " ORDER BY menu1_orden"
    'newID = Int(oldId) + 1
  end if
  Response.Write SQL
  set rs = conn.Execute(SQL)
  newID = rs("menu1_orden")
 
  SQL = "UPDATE submenus SET subMenuId = " & tempID & " WHERE subMenuId = " & oldID
  Conn.Execute(SQL)
  SQL = "UPDATE submenus SET subMenuId = " & oldID & " WHERE subMenuId = " & newID
  Conn.Execute(SQL)
  SQL = "UPDATE submenus SET subMenuId = " & newID & " WHERE subMenuId = " & tempID
end if




'Udskriv formen..
'Så er det nødvendigt at hendte min/max menu1_orden for der ikke sker fejl..:
SQL = "SELECT min(menu1_orden) as minID, max(menu1_orden) as maxID FROM submenus"
set rs = conn.Execute(SQL)
maxID = rs("maxID")
minID = rs("minID")

SQL = "SELECT menu1_orden, menu1_titel FROM submenus ORDER BY menu1_orden"
set rs = conn.Execute(SQL)

Response.Write "<table>"
Response.Write "<tr><td>Undermen title</td><td>Ryk op</td><td>Ryk ned</td></tr>"

do while not rs.EOF
  Response.Write "<tr>"
  Response.Write "<td>" & rs("menu1_titel") & "<td>"

  if Int(rs("menu1_orden")) > minID then
    Response.Write "<td><a href=""?dir=op&SubMenuId="&rs("menu1_orden")&""">ryk op</a><td>"
  else
    Response.Write "<td>...<td>"
  end if
  if Int(rs("menu1_orden")) < Int(maxID) then
    Response.Write "<td><a href=""?dir=ned&SubMenuId="&rs("menu1_orden")&""">ryk ned</a><td>"
  else
    Response.Write "<td>...<td>"
  end if
  Response.Write "</tr>"

  rs.MoveNext
loop
%>
</table>

<%
Conn.Close
%>
</BODY>
</HTML>






















<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("/config/datasources/db.mdb")

'flyt op/ned
dir = Request.QueryString("dir")
if dir <> "" then
  oldId = Request.QueryString("SubMenuID")
  tempID = 0
 
  SQL = "SELECT TOP 1 menu1_orden FROM submenus WHERE menu1_orden "
  if dir = "op" then
    SQL = SQL & " < " & oldID & " ORDER BY menu1_orden DESC"
    'newID = Int(oldId) - 1
  else
    SQL = SQL & " > " & oldID & " ORDER BY menu1_orden"
    'newID = Int(oldId) + 1
  end if
  Response.Write SQL
  set rs = conn.Execute(SQL)
  newID = rs("menu1_orden")
 
  SQL = "UPDATE submenus SET subMenuId = " & tempID & " WHERE subMenuId = " & oldID
  Conn.Execute(SQL)
  SQL = "UPDATE submenus SET subMenuId = " & oldID & " WHERE subMenuId = " & newID
  Conn.Execute(SQL)
  SQL = "UPDATE submenus SET subMenuId = " & newID & " WHERE subMenuId = " & tempID
end if




'Udskriv formen..
'Så er det nødvendigt at hendte min/max menu1_orden for der ikke sker fejl..:
SQL = "SELECT min(menu1_orden) as minID, max(menu1_orden) as maxID FROM submenus"
set rs = conn.Execute(SQL)
maxID = rs("maxID")
minID = rs("minID")

SQL = "SELECT menu1_orden, menu1_titel FROM submenus ORDER BY menu1_orden"
set rs = conn.Execute(SQL)

Response.Write "<table>"
Response.Write "<tr><td>Undermen title</td><td>Ryk op</td><td>Ryk ned</td></tr>"

do while not rs.EOF
  Response.Write "<tr>"
  Response.Write "<td>" & rs("menu1_titel") & "<td>"

  if Int(rs("menu1_orden")) > minID then
    Response.Write "<td><a href=""?dir=op&SubMenuId="&rs("menu1_orden")&""">ryk op</a><td>"
  else
    Response.Write "<td>...<td>"
  end if
  if Int(rs("menu1_orden")) < Int(maxID) then
    Response.Write "<td><a href=""?dir=ned&SubMenuId="&rs("menu1_orden")&""">ryk ned</a><td>"
  else
    Response.Write "<td>...<td>"
  end if
  Response.Write "</tr>"

  rs.MoveNext
loop
%>
</table>

<%
Conn.Close
%>
</BODY>
</HTML>
Avatar billede crawn Nybegynder
09. januar 2004 - 15:03 #5
arrrg kom til at paste koden ind 2 gange.... undskyld
Avatar billede eagleeye Praktikant
09. januar 2004 - 17:00 #6
Ok, ja den kode som jeg linkede til brugte Op eller Ned og ikke det nye menu_order. Der var lige et par små fejl i koden.
En fejl var disse update SQL'er:

SQL = "UPDATE submenus SET subMenuId = " & tempID & " WHERE subMenuId = " & oldID
hvor kolonnen subMenuId skulle være menu1_orden

Samt der manglede en linje:
Conn.Execute(SQL) efter den sidste UPDATE SQL blev lavet, så den blev ikke udført.



Så prøv dette kode:

<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("/config/datasources/db.mdb")

'flyt op/ned
dir = Request.QueryString("dir")
if dir <> "" then
  oldId = Request.QueryString("SubMenuID")
  tempID = 0
 
  SQL = "SELECT TOP 1 menu1_orden FROM submenus WHERE menu1_orden "
  if dir = "op" then
    SQL = SQL & " < " & oldID & " ORDER BY menu1_orden DESC"
    'newID = Int(oldId) - 1
  else
    SQL = SQL & " > " & oldID & " ORDER BY menu1_orden"
    'newID = Int(oldId) + 1
  end if
  Response.Write SQL
  set rs = conn.Execute(SQL)
  newID = rs("menu1_orden")
 
  SQL = "UPDATE submenus SET menu1_orden = " & tempID & " WHERE menu1_orden = " & oldID
  Conn.Execute(SQL)
  SQL = "UPDATE submenus SET menu1_orden = " & oldID & " WHERE menu1_orden = " & newID
  Conn.Execute(SQL)
  SQL = "UPDATE submenus SET menu1_orden = " & newID & " WHERE menu1_orden = " & tempID
  Conn.Execute(SQL)
end if




'Udskriv formen..
'Så er det nødvendigt at hendte min/max menu1_orden for der ikke sker fejl..:
SQL = "SELECT min(menu1_orden) as minID, max(menu1_orden) as maxID FROM submenus"
set rs = conn.Execute(SQL)
maxID = rs("maxID")
minID = rs("minID")

SQL = "SELECT menu1_orden, menu1_titel FROM submenus ORDER BY menu1_orden"
set rs = conn.Execute(SQL)

Response.Write "<table>"
Response.Write "<tr><td>Undermen title</td><td>Ryk op</td><td>Ryk ned</td></tr>"

do while not rs.EOF
  Response.Write "<tr>"
  Response.Write "<td>" & rs("menu1_titel") & "<td>"

  if Int(rs("menu1_orden")) > minID then
    Response.Write "<td><a href=""?dir=op&SubMenuId="&rs("menu1_orden")&""">ryk op</a><td>"
  else
    Response.Write "<td>...<td>"
  end if
  if Int(rs("menu1_orden")) < Int(maxID) then
    Response.Write "<td><a href=""?dir=ned&SubMenuId="&rs("menu1_orden")&""">ryk ned</a><td>"
  else
    Response.Write "<td>...<td>"
  end if
  Response.Write "</tr>"

  rs.MoveNext
loop
%>
</table>

<%
Conn.Close
%>
</BODY>
</HTML>
Avatar billede crawn Nybegynder
18. marts 2004 - 07:45 #7
stadig intet..
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