Avatar billede svjensen Nybegynder
16. maj 2003 - 10:22 Der er 15 kommentarer og
1 løsning

Ændre rækkefølge af DB poster.

Jeg har en tabel i en MySQL DB som indeholder en række kategorier. Kategorierne hentes fra DB ved hjælp af en 'SELECT * FROM kategori ORDER BY sortering ASC'.
'Sortering' indeholder fortløbende numre fra 1 og op.
Det virker altsammen uden problemer.

Det jeg gerne vil have mulighed for, er at brugerne kan ændre sorteringsrækkefølgen, altså flytte rundt på de fortløbende numre. Brugeren har ikke adgang til DB, så det skal lave som en web front.

Jeg har en idé om, at man kunne hente kategorierne ind i et textarea med én kategori på hver linie, og brugeren så kunne flytte rundt på kategorierne vha. af 'Flyt ned/Flyt op' knapper eller noget i den retning.
Når man så trykker 'Opdater rækkefølge' så skrives linienummeret til sorteringskolonnen i tabellen.

Men jeg ved ikke hvordan jeg skal gribe det an rent programmeringsmæssigt. Er der nogen der kan hjælpe eller som har en anden god idé?
Avatar billede arne_v Ekspert
16. maj 2003 - 10:28 #1
Jeg kan se 2 løsninger:

1)  Brugeren vælger sorterings felt, det sendes med ind i requesten og
    serveren sender en ORDER BY det felt til databasen.

2)  I.s.f. at returnere HTML returneres der XML og så kan brugeren
    sortere efter forskellige felter via JavaScript og XSLT.
Avatar billede svjensen Nybegynder
16. maj 2003 - 10:36 #2
Jeg tror vi skyder lidt forbi hinanden.

I det konkrete tilfælde har jeg lavet programmeringen til en database som indeholder data på en række inspektører. Inspektørerne er specialister på hver deres område fx. økonomi, arbejdsmiljø m.fl.
Jeg er ikke selv blandet ind i arbejdet med at vedligeholde data i databasen, det er overladt til det jeg kalder brugeren.

Nåt brugeren opretter en ny inspektør, vælger han inspktørens speciale fra en dropdown box. I drop dorwn boxen er specialerne sorteret efter 'sortering' som tidligere nævnt.
Men rækkefølgen i 'sortering' er "drømt op" af mig, og brugeren kan have et ønske om at ændre på rækkefølgen de præsenteres i drop down boxen.

Min idé var derfor noget i retning af det jeg skrev i mit spørgmål; at brugeren permanent kan ændre den rækkefølge specialerne præsenteres i dropdown menuen.

Kan du følge mig?
Avatar billede arne_v Ekspert
16. maj 2003 - 10:40 #3
Du leder efter noget customization hvor siden "husker" hvordan brugeren
vil have dem sorteret ?
Avatar billede arne_v Ekspert
16. maj 2003 - 10:41 #4
Vil du have gemt sådanne præferancer på server (i databasen) eller
på client (cookie) ?
Avatar billede oasen Nybegynder
16. maj 2003 - 10:47 #5
Jeg ville måske oprette en ny tabel kaldet "sortering" indeholdende inspektørens id, specialets id og sorteringsnummeret.

Altså:

InspID__________SpecID___________Sortnr

Så kan du trække listen ud til inspektøren med en join af de to tabeller:

PersonensID = 236

Select k.KategoriID From Kategorier k Left Join sortering s On k.KategoriID = s.SpecID Where s.InspID = " & PersonensID & " Order By s.Sortnr
Avatar billede oasen Nybegynder
16. maj 2003 - 10:58 #6
Når en inspektør oprettes, kan du så indsætte et antal poster i "sortering" svarende til antallet af relevante kategorier i "Kategori":

PersonensID = 236

Set rs = Conn.Execute("SELECT KategoriID FROM kategori")

Response.Write "<form method='post'>"

While Not rs.EOF
  Response.Write "<input type='text' name='kat" & rs("KategoriID") & "'>" & rs("KategoriID") & "<br>"

  If Request.ServerVariables("Request_Method") = "POST" Then
      Conn.Execute("Insert Into sortering (InspID, SpecID, Sortnr) Values(" & PersonensID & ", " & rs("KategoriID") & ", " & Request.Form("kat" & rs("KategoriID")) & ")")
  End If

  rs.MoveNext
Wend

Response.Write "</form>"
Avatar billede oasen Nybegynder
16. maj 2003 - 11:00 #7
Det må være et svar...
Avatar billede svjensen Nybegynder
16. maj 2003 - 11:36 #8
Så vidt jeg kan se vil det ikke ændre rækkefølgen af kategorierne næste gang brugeren skal oprette en inspektør.

Det jeg er interesseret i, er til enhver tid at kunne få præsenteret kategorierne/specialerne efter sorteringskolonnen. Brugeren skal kunne ændre denne rækkefølge og den enkelte entries skal derefter sorteres i den nye rækkefølge.
Avatar billede svjensen Nybegynder
16. maj 2003 - 11:45 #9
Forestil jer drop down boxen, når man opretter et spørgsmål her på eksperten. Det jeg er ude efter er en web front, hvor man kan ændre rækkefølgen på de enkelte entries i drop down boxen.
Avatar billede oasen Nybegynder
16. maj 2003 - 14:29 #10
Selve rækkefølgen i select-boksen kan du ændre dynamisk hos klienten med javascript.
Men du er jo nødt til at have et sted at lagre rækkefølgen, hvis den skal være den samme, når brugeren ankommer til siden næste gang. Enten i en DB, en tekstfil påserveren eller i en cookie.

Men hvis du gør det direkte i sorteringskolonnen i tabellen, vil rækkefølgen være den samme for alle, og så vidt jeg forstår, er det ikke hensigten. Eller hvad...?
Avatar billede oasen Nybegynder
16. maj 2003 - 14:40 #11
Hvis det bare drejer sig om at opdatere kolonnen "sortering", kan du tilføje et lille tekstfelt ud for hver kategori som brugeren så kan skrive det nye sorteringsnummer i:

Set rs = Conn.Execute("SELECT Kategorinavn, KategoriID FROM kategori")

Response.Write "<form method='post'>"

While Not rs.EOF
  Response.Write "<input type='text' name='kat" & rs("KategoriID") & "'> " & rs("Kategorinavn") & "<br>"

  If Request.ServerVariables("Request_Method") = "POST" Then
      Conn.Execute("Update kategori Set sortering = " & Request.Form("kat" & rs("KategoriID")) & " Where KategoriID = " & rs("KategoriID"))
  End If

  rs.MoveNext
Wend

Response.Write "<input type='submit' value='Opdatér rækkefølge'>"
Response.Write "</form>"
Avatar billede oasen Nybegynder
16. maj 2003 - 14:50 #12
Bare vær opmærksom på, at denne procedure kan tage lidt tid at udføre, hvis du har mange kategorier og anvender Access.
Hvis du oplever det som et problem på et tidspunkt, så prøv at fjerne index på dine kolonne (hvis der er nogle).
Avatar billede svjensen Nybegynder
16. maj 2003 - 17:15 #13
Nu nærmer vi os.

oasen -> Du har ret. Det er hensigten at rækkefølgen skal være den samme for alle.
Jeg kan godt følge dit forslag med et tekstfelt, men hvis der er mange kategorier, tror jeg at det vil blive uoverskueligt for brugeren, og risikoen for fejl vil afgjort stige.

Det er derfor, at jeg havde idéen om 'flyt op/flyt ned' knapper eller noget i den retning. Derved skulle fejlmuligheden gerne være elimineret.
Avatar billede oasen Nybegynder
18. maj 2003 - 17:13 #14
Avatar billede svjensen Nybegynder
19. maj 2003 - 10:13 #15
Det ser lovende ud. Jeg får dog først tid til at kigge på det efter min eksamen på onsdag.
Avatar billede svjensen Nybegynder
28. maj 2003 - 14:30 #16
Oasen's henvisning hjalp mig. Jeg justerede lidt i koden, så listen hentes fra DB, og den tilpassede liste sendes til en .asp fil, der skriver til DB. Siden hvor der kan ændres i rækkefølgen ser således ud:

fil: 'linkkatsort.asp'

<!--#include file="connection.asp"-->

<html>
<head><title>Ændre sortering af linkkategorier</title>

<script language="JavaScript"> <!--

var sel;
var selo;

function checkSel ( frm ) {
  sel  = frm.model.selectedIndex;
  selo = frm.model.options;
  if ( 0 > sel ) {
    alert( "der skal vælges en kategori først" );
    return false;
  };
  return true;
}; //end checkSel ( Form object ) -> boolean

function checkDest ( dest ) {
  if ( 0>dest || dest >= selo.length ) {
    alert( "Kategorien kan ikke flyttes derhen" );
    return false;
  };
  return true;
}; //end checkDest ( integer ) -> boolean

function ombyt ( fra, til ) {
  var tmpTxt      = selo[fra].text;
  selo[fra].text  = selo[til].text;
  selo[til].text  = tmpTxt;
  var tmpVal      = selo[fra].value;
  selo[fra].value = selo[til].value;
  selo[til].value = tmpVal;
  return til;
}; //end ombyt ( integer, integer )

function flytOp( frm ) {
  if ( checkSel( frm ) && checkDest( sel-1 ) )
      frm.model.selectedIndex = ombyt( sel, sel-1 );
}; //end flytOp( form object )

function flytNed( frm ) {
  if ( checkSel( frm ) && checkDest( sel+1 ) )
      frm.model.selectedIndex = ombyt( sel, sel+1 );
}; //end flytNed( form object )

function gemSortering ( frm ) {
  var skj = "";
  selo = frm.model.options;
  for (var i=0; selo.length>i; i++ )
      skj += "," +selo[i].text;
  frm.skjultFelt.value = skj.substring(1);
  return true;
}; //end gemSortering ( form object )

// -->  </script>
<link rel="stylesheet" type="text/css" href="css/svj.css">
 
</head>
<body>

<p align=center>Kategorierne er vist i den rækkefølge de bliver præsenteret i dropdownmenuen.<br>
Du kan ændre rækkefølgen ved at markere kategorien og trykke 'flyt op'/'flyt ned'.<br>
Når du er tilfreds gemmer du rækkefølgen ved at trykke 'Gem'.</p>

<%
strSQL = "SELECT * from linkkat ORDER BY sortering"
set rs = conn.execute(strSQL)
%>

<p><form name="sfrm" action="gemsort.asp" onsubmit="return gemSortering(this);" method=post>
<table border=0 align=center>
  <tr>
    <td>
        <select name="model" size=15>
<!--  indsæt options med asp eller med håndkraft.  -->
<%
   
    Do while not rs.eof
        Response.Write "<option>" & rs("linkkategori") & "</option>"
        rs.movenext
   
    loop
%>
        </select></p>
    </td>
    <td>&nbsp;&nbsp;&nbsp;</td>
    <td>
        <p><input type='button' value='flyt op' onclick='flytOp(this.form)'><br><br>
          <input type='button' value='flyt ned' onclick='flytNed(this.form)'></p>

        <p><input type='submit' value='Gem'>
          <input type='hidden' name='skjultFelt' value=''></p>
    </td>
  </tr>
</table>
</form>

</body>
</html>

<!--#include file="close.asp"-->
-----------------------------------------------

Filen der sendes til:

fil: 'gemsort.asp'

<%@ language="vbscript" %>
<!--#include file="security/check_login.asp"-->

<HTML>
<HEAD>

<TITLE>
Links
</TITLE>
<link rel="stylesheet" type="text/css" href="css/svj.css">
</HEAD>
<BODY>

<%
arraystr = (request.form("skjultfelt"))
arrayid = Split(arraystr, ",")

    For i = LBound(arrayid) To UBound(arrayid)
        strSQL = "UPDATE linkkat SET "
        strSQL = strSQL & "sortering = " & i & " "
        strSQL = strSQL & "WHERE linkkategori = '" & arrayid(i) & "'"
        set rs = conn.execute (strSQL)
       
        strSQL = ""   
    Next
%>

</body>

</html>

<!--#include file="close.asp"-->
--------------------------------------------------

Jeg takker for hjælpen

Søren
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