Toon posts:

[ASP] rang veranderen met pijltjes

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een forum heb ik een aantal tabellen gemaakt in Access/ASP
Nu is er ook een tabel "rubrieken" Onder deze rubrieken kan je de posten invullen.
Nu wil ik in het admin gedeelte de volgorde van deze rubrieken kunnen beinvloeden.
Ik wil bijvoorbeeld eerst alle posten van Rubriek A zien en daarna alle posten van rubriek B.
De tabel van Rubrieken bestaat uit "Id" "Rang" en "Rubrieknaam"
In de admin pagina "Rubrieken" staan alle rubrieken met daarin de rang vermeld.
Nu kan ik kiezen voor de makkelijke oplossing:
Een pagina maken waar je het rangnummer met de hand invult en een check uitvoert of het nummer al bestaat. Op deze manier gaat het werken.

Echter de moeilijke (voor mij dan) manier is:
Bij elke rubrieknaam een pijltje naar beneden en een pijltje naar boven zetten.
Door dit pijltje aan te klikken verschijft de rubriek naar boven of naar beneden.
Nu is dit geen probleem:
Je haalt het Id op en verhoogt het rang nummer met 1 en slaat het record weer op in de database.
code:
1
2
3
4
5
6
7
8
RangQuery = "Select * FROM rubrieken WHERE Id="&Id

Set objRsRangQuery = Conn.Execute (RangQuery)
Rang = objRsRangQuery("Rang")
Rang = Rang - 1

InsertQuery = "INSERT INTO rubrieken (rang) VALUES ('"&Rang&"')"        
Set objRs = Conn.Execute (InsertQuery)


Op deze manier heb je dus 2 records met hetzelfde rangnummer. Hier ga ik de mist in.
Wat ik wil hebben is een manier om het vorige of volgende (afhankelijk op welk pijltje er wordt gedrukt) record op te vragen.

Je kan heel de database opvragen en met:
code:
1
2
recordset.move(-1) ' ga 1 record terug in de recordset
recordset.move(1) ' ga 1 record verder in de recordset

door de database wandelen maar dit doe ik liever niet omdat je dan heel de database opvraagt.

Hoe kan je dit op een nette manier realiseren?

[ Voor 8% gewijzigd door Verwijderd op 26-06-2007 10:29 ]


  • Marcj
  • Registratie: November 2000
  • Laatst online: 16:59
Je kunt rangnummers gewoon wisselen van de twee objecten die je wilt wisselen.

Dus eerst stond er:
1 -> AAA
2 -> BBB

En daarna
1 -> BBB
2 -> AAA

edit:

Het opvragen van de vorige/volgende record kun je toch gewoon doen met de rang die je net hebt berekend? Want deze rang komt er blijkbaar dubbel in...

[ Voor 28% gewijzigd door Marcj op 26-06-2007 10:20 ]


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
Ten eerste, meestal heet dit 'order' en niet 'rang', misschien dat je daarmee wat meer kan vinden op google

wat ik doe is het volgende (wel veel queries)

- eerst zoek je de rang op van het huidige record (waar je op geklikt heb)
- dan zoek je die er boven over onder op (dmv "order by `rang`", en "limit 1")
- dan update je de records door de rangen om te wisselen (wanneer je niet op de bovenste/onderste klikt dan)

This message was sent on 100% recyclable electrons.


Verwijderd

Topicstarter
BasieP schreef op dinsdag 26 juni 2007 @ 10:30:
Ten eerste, meestal heet dit 'order' en niet 'rang', misschien dat je daarmee wat meer kan vinden op google

wat ik doe is het volgende (wel veel queries)

- eerst zoek je de rang op van het huidige record (waar je op geklikt heb)
- dan zoek je die er boven over onder op (dmv "order by `rang`", en "limit 1")
- dan update je de records door de rangen om te wisselen (wanneer je niet op de bovenste/onderste klikt dan)
Het lijkt erop of "LIMIT" een functie is welke alleen binnen MySQL werkt, Access slikt dit niet.

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
Verwijderd schreef op dinsdag 26 juni 2007 @ 11:01:
[...]


Het lijkt erop of "LIMIT" een functie is welke alleen binnen MySQL werkt, Access slikt dit niet.
kom op zeg.. een beetje onderzoek geeft je de MSSQL / Access equivalent.

(top dus)

This message was sent on 100% recyclable electrons.


Verwijderd

Topicstarter
BasieP schreef op dinsdag 26 juni 2007 @ 11:02:
[...]

kom op zeg.. een beetje onderzoek geeft je de MSSQL / Access equivalent.

(top dus)
Je hebt gelijk, ik was te snel met mijn reactie.

Verwijderd

Topicstarter
Het lukt me nog niet, ik heb geprobeerd om de oplossing van BasieP te maken.

"dan zoek je die er boven over onder op (dmv "order by `rang`", en "limit 1")"

Bij mijn weten is ORDER BY alleen aflopend of oplopend te gebruiken.
Dus als de tabel er als volgt uitziet:

code:
1
2
3
4
5
6
ID    Rang   Rubrieknaam
100   1      Sokken         
101   2      Schoenen
102   3      Broeken
103   4      Truien
104   5      Shirts


Met ORDER BY Rang kan alleen bovenstaande tabel terugkrijgen of omgekeerd (ID 104 bovenaan)
Wat ik nodig heb (en ook volgens de oplossing van BasieP) is:
Je selecteerd Id 102, nu afhankelijk van op welke pijltje je drukt is de query DESC of ASC.
Als resultaat krijg je met TOP 2:

code:
1
2
3
ID    Rang   Rubrieknaam
102   3      Broeken
103   4      Truien

of
code:
1
2
3
ID    Rang   Rubrieknaam
102   3      Broeken
101   2      Schoenen


Dit is te maken als je de waarde van ORDER BY ook variabel kan maken, dit lukt mij niet.
Bij mij weten is moet achter ORDER BY de kolomnaam staan en kan er gaan variabele achter.

  • Marcj
  • Registratie: November 2000
  • Laatst online: 16:59
Ik heb je post nu al 3x doorgelezen, maar het is mij nog steeds niet duidelijk wat het probleem is. Je kunt de rang opzoeken van een ID die je hebt. Als je nu dan die rang opzoekt met iets als:
code:
1
2
SELECT * FROM Rubriek WHERE Rang <= 3 TOP 2 ORDER BY Rang DESC
SELECT * FROM Rubriek WHERE Rang >= 3 TOP 2 ORDER BY Rang ASC

krijg je volgens mij zo ongeveer de tabellen die je daar wilt hebben. Maar volgens mij kan het nog makkelijker, namelijk met één update statement. Hierbij zoek je gewoon de twee objecten op (dus zoeken op Rang en Rang +/- 1) en draai dan deze twee nummer om. Dit kan met wat simpel rekenwerk. Stel je wilt Rang 2 en 3 van plaats wisselen, dan kun je iets doen als:
code:
1
UPDATE Rubriek SET Rang = 5 - Rang WHERE Rang = 2 OR Rang = 3

of iets dergelijks.

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
Verwijderd schreef op woensdag 27 juni 2007 @ 09:47:
Het lukt me nog niet, ik heb geprobeerd om de oplossing van BasieP te maken.

"dan zoek je die er boven over onder op (dmv "order by `rang`", en "limit 1")"

Bij mijn weten is ORDER BY alleen aflopend of oplopend te gebruiken.
Dus als de tabel er als volgt uitziet:

code:
1
2
3
4
5
6
ID    Rang   Rubrieknaam
100   1      Sokken         
101   2      Schoenen
102   3      Broeken
103   4      Truien
104   5      Shirts


Met ORDER BY Rang kan alleen bovenstaande tabel terugkrijgen of omgekeerd (ID 104 bovenaan)
Wat ik nodig heb (en ook volgens de oplossing van BasieP) is:
Je selecteerd Id 102, nu afhankelijk van op welke pijltje je drukt is de query DESC of ASC.
Als resultaat krijg je met TOP 2:

code:
1
2
3
ID    Rang   Rubrieknaam
102   3      Broeken
103   4      Truien

of
code:
1
2
3
ID    Rang   Rubrieknaam
102   3      Broeken
101   2      Schoenen


Dit is te maken als je de waarde van ORDER BY ook variabel kan maken, dit lukt mij niet.
Bij mij weten is moet achter ORDER BY de kolomnaam staan en kan er gaan variabele achter.
ik zou top 1 gebruiken.
je hebt immers je andere id al (daar heb je op geklikt)
wordt dus zoiets wanneer je broeken 1 omhoog wilt verplaatsen:

SQL:
1
SELECT TOP 1 `rang` FROM `tabel` WHERE `id` = '102';

[/]
die 102 is dus het id waar je op klikt, die had je al

SQL:
1
SELECT TOP 1 * FROM `tabel` WHERE `rang` < '3' ;

hier heb je dus het record waarmee je wilt omwisselen, de '3' is natuurlijk de net opgevraagde rang
vervolgens:
SQL:
1
2
3
4
BEGIN TRANSACTION
UPDATE `tabel` SET `rang` = '3' WHERE `id` = '101'
UPDATE `tabel` SET `rang` = '2' WHERE `id` = '102'
COMMIT TRANSACTION

hier doe je dus het echte werk.
De transactie is er voor om te zorgen dat je niet (ook al is het heel even) dezelfde rang hebt in je tabel.


even voor de compleetheid:
Je kan dit ook doen door rang = rang -1 enzo te gebruiken, echter wanneer je dan gaten hebt in je rangen (dus 1, 2, 5, 7 8 etc.) dan werkt dit niet. Vandaar dat ik dus echt omwissel, en er niet vanuit ga dat alle rangen aansluiten.

Verder raad ik je aan om een unique constraint op je rang kolom te zetten. Gewoon om zeker te zijn ;)

This message was sent on 100% recyclable electrons.

Pagina: 1