Avatar billede haase Nybegynder
22. februar 2003 - 22:35 Der er 11 kommentarer og
1 løsning

Sortering af menupunkter

Jeg har oprettet en række menupunkter som sorteres efter 1,2,3,4,5,6 osv i feltet MenuSort. Man skal kunne flytte det ene punkt ned ad eller op ad i rækken i rækken fx. flytte MenuID=5, til MenuSort=4:


MenuID    MenuSort                MenuID    MenuSort
3          1                        3          1
4          2                >>>    4          2
5          3                        6          3
6          4                        5          4
8          5                        8          5

Tabellen: tblMenu
MenuID (autonummeret)
MenuSort (tal)
MenuTitel (tekst)

Det skal fungere ved at jeg har en pil opad og en pil ned ad for hvert menupunkt (MenuID), som man kan klikke på og derefter flyttes menupunktet en tak op eller ned.

Den skal kunne tage højde for at hvis den står som MenuSort=1 eller MenuSort (den sidste i rækken) at den ikke flytter.

Jeg forestiller mig man har en fil der hedder flytop.asp og en der hedder flytned.asp
Avatar billede haase Nybegynder
22. februar 2003 - 22:37 #1
Fandt det her svar fra spm: http://www.eksperten.dk/spm/167092

>>>
Lidt hurtigt PL/SQL så kunne den se sådan her ud:

Function MovePerson(iPersonID IN Integer,bDirection IN Boolean)

iFreq Integer;

--Get current frequency
SELECT frequency INTO iFreq FROM person WHERE id = iPersonID;

--True Move person up
If bDirection Then

--Update persons
UPDATE person (frequency) VALUES(iFreq) WHERE frequency = iFreq;
UPDATE person (frequency) VALUES(iFreq+1) WHERE id = iPersonID;

--False Move person down
Else

--Update persons
UPDATE person (frequency) VALUES(iFreq) WHERE frequency = iFreq;
UPDATE person (frequency) VALUES(iFreq-1) WHERE id = iPersonID;

End If;

End;
<<<

Men synes lige at det virker lidt for hardcore
Avatar billede eagleeye Praktikant
22. februar 2003 - 22:38 #2
Avatar billede haase Nybegynder
22. februar 2003 - 22:39 #3
tak kigger lige på det
Avatar billede haase Nybegynder
22. februar 2003 - 23:43 #4
juhuuu jeg fik det til at virke.

det er eneste problem er blot at, på den side hvor alle menupunkter er listet skal pilen der går ned fra sidste punkt under et menupunkt ikke laves som link. jeg har fået det til at virke med den første da den altid har væriden 1:

<%
 

    Set Rs = Conn.Execute("SELECT * FROM tblMenu WHERE MenuParent=0 ORDER BY MenuSort;")

    Do Until Rs.EOF
       
        ' hvis den er nummer 1 i sortering
        IF rs("MenuSort") = 1 THEN
           
          Response.Write "<span class='bold2_grey'>&and;</span>&nbsp;<a href='menu_sort_ned.asp?id=" & rs("MenuID") & "&p=" & rs("MenuParent") & "&s=" & rs("MenuSort") &  "' title='flyt ned'><span class='bold2'>&or;</a>&nbsp;<a href='menu.asp?edit=" & Rs("MenuID") & "' class='bold1'>&nbsp;"& Rs("MenuTitel") & "</a></span><br>" & vbCrLf
       
        ELSE
       
            Response.Write "<span class='bold2'><a href='menu_sort_op.asp?id=" & rs("MenuID") &  "&p=" & rs("MenuParent") & "&s=" & rs("MenuSort") &  "' title='flyt op'>&and;</a>&nbsp;<a href='menu_sort_ned.asp?id=" & rs("MenuID") & "&p=" & rs("MenuParent") & "&s=" & rs("MenuSort") & "' title='flyt ned'>&or;</a>&nbsp;<a href='menu.asp?edit=" & Rs("MenuID") & "' class='bold1'>&nbsp;"& Rs("MenuTitel") & "</a></span><br>" & vbCrLf
           
        END IF
       
       

        If Rs("MenuSub") = 1 Then
            Set KatRs = Conn.Execute("SELECT * FROM tblMenu WHERE MenuParent=" & Rs("MenuID") & " ORDER BY MenuSort;")
            Set SubIDRs = Conn.Execute("SELECT * FROM tblMenu WHERE MenuParent=" & KatRs("MenuID") & " ORDER BY MenuSort;")
           
            Do Until KatRs.EOF
                'under items with underitems
                Select Case KatRs("MenuSub") = 1
                    Case True:    Response.Write "<span class='bold2'><a href='menu_sort_op.asp?id=" & rs("MenuID") & "&p=" & rs("MenuParent") & "&s=" & katrs("MenuSort") &  "' title='flyt op'>&and;</a>&nbsp;<a href='menu_sort_ned.asp?id=" & rs("MenuID") &  "&p=" & rs("MenuParent") & "&s=" & katrs("MenuSort") &  "' title='flyt ned'>&or;</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='menu.asp?edit=" & KatRS("menuID") & "'>" & KatRs("MenuTitel") & "</a></span><br>" & vbCrLf
                   
                    ' underitems with no parent
                    Case False:   
                   
                    IF KatRs("MenuSort") = 1 THEN
                   
                    Response.Write "<span class='bold2_grey'>&and;</span>&nbsp;<a href='menu_sort_ned.asp?id=" & Katrs("MenuID") & "&p=" & katrs("MenuParent") &  "&s=" & katrs("MenuSort") &  "' title='flyt ned'><span class='bold2'>&or;</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='menu.asp?edit=" & KatRs("MenuID") & "'>" & KatRs("MenuTitel") & "</a></span><br>" & vbCrLf
                   
                    ELSE
                   
                    Response.Write "<span class='bold2'><a href='menu_sort_op.asp?id=" & katrs("MenuID") & "&p=" & katrs("MenuParent") & "&s=" & katrs("MenuSort") &  "' title='flyt op'>&and;</a>&nbsp;<a href='menu_sort_ned.asp?id=" & katrs("MenuID") & "&p=" & katrs("MenuParent") &  "&s=" & katrs("MenuSort") & "' title='flyt ned'>&or;</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='menu.asp?edit=" & KatRs("MenuID") & "'>" & KatRs("MenuTitel") & "</a></span><br>" & vbCrLf
                   
                    END IF
                       
                   
                    End Select
             
                If (KatRs("MenuParent") = KatRs("MenuID")) Then
                    Set SubRs = Conn.Execute("SELECT * FROM tblMenu WHERE MenuParent=" & strKat & " ORDER BY MenuSort;")
                    ' selected under under items
                    Do Until SubRs.EOF
                        Response.Write "<span class='bold2'><a href='menu_sort_op.asp?id=" & subrs("MenuID") &  "&p=" & subrs("MenuParent") & "&s=" & subrs("MenuSort") &  "' title='flyt op'>&and;</a>&nbsp;<a href='menu_sort_ned.asp?id=" & subrs("MenuID") &  "&p=" & subrs("MenuParent") & "&s=" & subrs("MenuSort") &  "' title='flyt ned'>&or;</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href='menu.asp?edit=" & strRoot & "&kat=" & KatRs("MenuID") & "&subkat=" & SubRs("MenuID") & "&showart=1'>" & SubRs("MenuTitel") & "</a></span><br>" & vbCrLf                       
                       
                                               
                        SubRs.movenext
                    Loop
                       
                End If
   

                KatRs.movenext
               
            Loop
           
        Response.Write "<br>"
   
           
           
        End If

If rs("MenuParent") = 0 AND rs("MenuSub") = 0 THEn
            Response.Write "<br>"
            END IF

        Rs.movenext
    Loop

   
%>
Avatar billede eagleeye Praktikant
22. februar 2003 - 23:50 #5
I det andet eks jeg linkede til var det nødvendigt at lave en SQL som fandt min og maxID for at ungå de blev til links, hvis min altid er 1 så kan max hendtes:


SQL = "SELECT max(MenuSort) as maxID FROM tblMenu"
set rs = conn.Execute(SQL)
maxID = rs("maxID")


og så lave if sætningen så den tjekke om det er den føste eller sidste:

IF rs("MenuSort") = 1 OR rs("MenuSort") = maxID THEN
Avatar billede haase Nybegynder
23. februar 2003 - 00:39 #6
Kan jeg kombinere

"SELECT max(MenuSort) as maxID FROM tblMenu"
og
"SELECT * FROM tblMenu WHERE MenuParent=0 ORDER BY MenuSort;"
Avatar billede haase Nybegynder
23. februar 2003 - 00:47 #7
Når jeg laver den her:

"SELECT MenuID, MenuTitel, MenuBeskrivelse, MenuParent, tblMenu.MenuSort, MenuSub, MenuURL1, MenuTarget1, MenuURL2, MenuTarget2, MenuBreak, MAX(MenuSort) AS MenuSortMax  FROM tblMenu WHERE MenuParent=0 ORDER BY MenuSort;"

Får jeg fejlen:
Fejltype:
Microsoft JET Database Engine (0x80040E21)
You tried to execute a query that does not include the specified expression 'MenuID' as part of an aggregate function.
Avatar billede eagleeye Praktikant
23. februar 2003 - 00:48 #8
Hvis det skal virke skal der også en group by på:


"SELECT MenuID, MenuTitel, MenuBeskrivelse, MenuParent, tblMenu.MenuSort, MenuSub, MenuURL1, MenuTarget1, MenuURL2, MenuTarget2, MenuBreak, MAX(MenuSort) AS MenuSortMax  FROM tblMenu WHERE MenuParent=0 GROUP BY MenuID, MenuTitel, MenuBeskrivelse, MenuParent, tblMenu.MenuSort, MenuSub, MenuURL1, MenuTarget1, MenuURL2, MenuTarget2, MenuBreak ORDER BY MenuSort;"
Avatar billede eagleeye Praktikant
23. februar 2003 - 00:59 #9
Det går bare heller ikke da den så laver en listen MenuSortMax ens med menuSort.
Avatar billede haase Nybegynder
23. februar 2003 - 01:09 #10
jeps. man er vel nødt til at lave noget med en løkke der tæller op eller nåed
Avatar billede eagleeye Praktikant
23. februar 2003 - 01:14 #11
Ja hvis du ikke vil lave to SQL udtræk.

Hvis du bruger rs.Open i stedet for Set rs = Conn har du direkte recordcount. Så hvis max menuSort altid er lig antallet at records kan det måske bruges.

Altså lave denne:

Set Rs = Conn.Execute("SELECT * FROM tblMenu WHERE MenuParent=0 ORDER BY MenuSort;")


Om til:

Set rs = Server.CreateObject("ADODB.REcordSet")
SQL = "SELECT * FROM tblMenu WHERE MenuParent=0 ORDER BY MenuSort;"

rs.Open SQL, Conn, 1, 3
antal = rs.RecordCount
Avatar billede haase Nybegynder
23. februar 2003 - 01:49 #12
du er sq genial tak for det - 200 point til dig. det virker gør det
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