16. maj 2003 - 10:22Der 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é?
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.
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.
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.
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...?
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
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).
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.
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 )
<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
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.