Toon posts:

Volgorde records in een tabel aangeven

Pagina: 1
Acties:
  • 222 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
In een programma moet ik producten opslaan en de volgorde van hoe die producten worden opgeslagen is heel belangrijk.

Dus je hebt bijv de volgende records in een tabel:

product1
product2
product3
product4

Nu wil ik een product tussen product2 en product 3 invoegen. Normaal gesproken wordt dat gewoon de volgende record in de tabel. Maar in mij geval moet die er dus tussen in komen te staan.

Nu dacht ik om een extra veld toe te voegen aan de tabel en daar een nummer op te slaan, wat aangeeft op welke positie dat product in een denkbeeldige lijst staat.

Dus als je dan een product ergens wil tussenvoegen, moet ik opzoeken welk nummer het record er onder heeft en vervolgens alle records met hetzelfde nummer en hoger, 1 verhogen.

Is dat een goede oplossing?

Zo niet, hoe kan ik het dan maken?

(Ik ga gebruik maken van Interbase 6 & Delphi)

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
Ja, zo kan je het wel doen. Maar waarom is de volgorde waarin de records opgeslagen worden zo belangrijk?

https://fgheysels.github.io/


Verwijderd

Topicstarter
De volgorde is belangrijk omdat de artikelen precies zo moeten worden uitgeprint als hoe ze in een schap staan en dus niet door elkaar heen.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 16:30

Janoz

Moderator Devschuur®

!litemod

Kun je niet een soort 'positie in het schap' tabel maken? Dan hoef je alleen die tabel te updaten. (Ik raad je trouwens aan om EERST alle hogere records op te schuiven en vervolgens te inserten en om er voor te zorgen dat er maar 1 iemand tegelijk produkten tussen kan voegen)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Wat is het voordeel van zo'n positie in schap tabel?

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 08:12

Crazy D

I think we should take a look.

Op woensdag 28 november 2001 19:53 schreef tokkie het volgende:
De volgorde is belangrijk omdat de artikelen precies zo moeten worden uitgeprint als hoe ze in een schap staan en dus niet door elkaar heen.
Hmm weleens van SQL queries gehoord? En dan om wat specifieker te zijn, de ORDER BY clausule? Zo nee, dan zou ik eerst een tutorialtje er tegen aan knallen om wat basiskennis op te doen.

Exact expert nodig?


Verwijderd

Topicstarter
Op donderdag 29 november 2001 00:21 schreef Crazy_D het volgende:
Hmm weleens van SQL queries gehoord? En dan om wat specifieker te zijn, de ORDER BY clausule?
Ja tuurlijk weet ik wat ORDER BY is. Maar mijn vraag was hoe ik het zo kon maken dat ik de volgorde van de records kon bepalen. Er zal dus eerst iets bedacht moeten worden en vervolgens kan ik dan met ORDER BY goed sorteren.

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Je wil een volgorde aanbrengen in een relationele database. Relationele databases hebben geen weet van volgordes, alleen van relaties (de naam zegt 't al ;)).
Zoals al eerder gezegd kan je 't beste een extra veld toevoegen, waar je bijvoorbeeld het schapnummer in zet.
En zoals ook al gezegd, kan je ORDER BY in je query gebruiken, om je records netjes te sorteren bij een SELECT. Vervolgens kan je dus gewoon van boven naar beneden door je resultaat wandelen.

Siditamentis astuentis pactum.


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 08:12

Crazy D

I think we should take a look.

Op donderdag 29 november 2001 07:53 schreef tokkie het volgende:
Ja tuurlijk weet ik wat ORDER BY is. Maar mijn vraag was hoe ik het zo kon maken dat ik de volgorde van de records kon bepalen. Er zal dus eerst iets bedacht moeten worden en vervolgens kan ik dan met ORDER BY goed sorteren.
Sorry, maar blijkbaar dus niet zo heel erg goed, anders zou je weten dat de fysieke volgorde geen ene moer uitmaakt, en dat je m.b.v. ORDER BY de records altijd gesorteerd krijgt.
Als je bedoelt dat je met sommige db management progjes (Enterprise manager, Access, whatever) de records al gesorteerd getoont worden, dat komt omdat sommige van zulke progjes de 'hoofd index' gebruiken tijdens het tonen, waardoor het lijkt alsof ze fysiek dus ook in die volgorde staan (en met toeval kan dat ook wel echt zo zijn....) maar nogmaals, als je SQL kent, intresseert het je niks hoe ze fysiek op de harddisk staan...

Exact expert nodig?


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op woensdag 28 november 2001 19:04 schreef tokkie het volgende:
Normaal gesproken wordt dat gewoon de volgende record in de tabel. Maar in mij geval moet die er dus tussen in komen te staan.
Neuh, het wordt gewoon het volgende record hoor :+
Nu dacht ik om een extra veld toe te voegen aan de tabel en daar een nummer op te slaan, wat aangeeft op welke positie dat product in een denkbeeldige lijst staat.
Dat is een oplossing.
Dus als je dan een product ergens wil tussenvoegen, moet ik opzoeken welk nummer het record er onder heeft en vervolgens alle records met hetzelfde nummer en hoger, 1 verhogen.

Is dat een goede oplossing?
het is een werkbare oplossing. Zolang je zorgt dat die kolom UNIEK is.

Alle records verhogen met hetzelfde of hoger nummer kan dus gedaan worden met slechts EEN query.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Op donderdag 29 november 2001 09:42 schreef CrazyD_at_work het volgende:

Sorry, maar blijkbaar dus niet zo heel erg goed, anders zou je weten dat de fysieke volgorde geen ene moer uitmaakt, en dat je m.b.v. ORDER BY de records altijd gesorteerd krijgt.
Ik denk dat jij niet helemaal snapt wat ik bedoel (of ik heb het niet goed uitgelegd.

Ik weet uiteraard dat je de fysieke volgorde van de records in een tabel niet kan aanpassen/instellen. Maar wat ik dus al zei, ik wil op een of andere manier een lijst met artikelen opslaan in een bepaalde volgorde. Dus bijvoorbeeld met een extra veld dat een getal is en wat dus aangeeft op welke positie dat record (=artikel) in de fictieve lijst staat.

Vervolgens kan ik dus met een Query met ORDER BY op dat veld de artikelen opvragen in de juiste volgorde. Dat is dus wat ik bedoel.

Verwijderd

Topicstarter
Een andere vraag is hoe ik er voor kan zorgen dat er maar 1 iemand de volgorde mag aanpassen.

De andere gebruikers moeten dan alleen de data kunnen bekijken, maar dus niet wijzigen/deleten.

Kan je bijv de tabel locken voor alle gebruikers op die ene gebruiker na die de volgorde moet aanpassen of is er een andere oplossing voor?

Verwijderd

Topicstarter
Iemand een idee??

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
Op donderdag 29 november 2001 20:39 schreef tokkie het volgende:
Een andere vraag is hoe ik er voor kan zorgen dat er maar 1 iemand de volgorde mag aanpassen.

De andere gebruikers moeten dan alleen de data kunnen bekijken, maar dus niet wijzigen/deleten.

Kan je bijv de tabel locken voor alle gebruikers op die ene gebruiker na die de volgorde moet aanpassen of is er een andere oplossing voor?
Je zal een soort security systeem moeten implementeren. Je kunt een tabel 'users', een tabel 'tabellen' en een tabel 'rechten' bijhouden en dan bijhouden welke users op welke tabellen bepaalde rechten hebben (of niet hebben).

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ja maar dan kan de gebruiker die wel rechten heeft toch nog steeds op 2 verschillende clients inloggen en de volgorde gaan aanpassen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
Op donderdag 29 november 2001 22:22 schreef tokkie het volgende:
Ja maar dan kan de gebruiker die wel rechten heeft toch nog steeds op 2 verschillende clients inloggen en de volgorde gaan aanpassen?
Neen toch. Als je nu zegt dat gebruiker X de volgorde mag veranderen en gebruiker Y niet, dan mag Y nog zoveel inloggen als hij wil, hij zal het niet kunnen veranderen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik bedoel het volgende:

Stel gebruiker piet logt in. (hij mag de volgorde gaan veranderen)

Op een andere pc logt ook iemand in met de gebruikersnaam piet. (Dus 2 mensen loggen met dezelfde account in)

Dan kunnen ze toch allebei de volgorde gaan aanpassen??

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
Op donderdag 29 november 2001 22:48 schreef tokkie het volgende:
Ik bedoel het volgende:

Stel gebruiker piet logt in. (hij mag de volgorde gaan veranderen)

Op een andere pc logt ook iemand in met de gebruikersnaam piet. (Dus 2 mensen loggen met dezelfde account in)

Dan kunnen ze toch allebei de volgorde gaan aanpassen??
Ja zeg. Zorg er dan voor dat de gebruikersnaam uniek is en dat er een wachtwoord vereist is.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Tja....ik durf het bijna niet meer te zeggen maar >:)

Er zijn 2 mensen die elkaars account dus gebruiken. (Kan voorkomen natuurlijk). Dan krijg je dus problemen!?



(Ik wil eerst weten of alles wel mogelijk is, voordat ik er mee ga beginnen)

Verwijderd

Ik zou het op deze manier proberen te doen:
product 1 --> sorteercode 1000.
product 2 --> sorteercode 2000.
product 3 --> sorteercode 3000.
product 4 --> sorteercode 4000.
product 5 --> sorteercode 5000.
product6 moet tussen 3 en 4 dus: de (sorteercode van product3 + sorteercode van 4) / 2 in dit geval 3500.
Moet tussen 3 en 6 weer een product is dat dan 6500 / 2. etc. Nadeel is natuurlijk wel dat je een limiet hebt aan het aantal tussen te voegen artikelen. Voordeel is dat niet alle producten die daar achter komen te liggen, dat hun sorteercode opgehoogd moet worden.

  • gpex
  • Registratie: April 2000
  • Laatst online: 08-06 22:19

gpex

Pex voor intimi

Op donderdag 29 november 2001 20:39 schreef tokkie het volgende:
Een andere vraag is hoe ik er voor kan zorgen dat er maar 1 iemand de volgorde mag aanpassen.

De andere gebruikers moeten dan alleen de data kunnen bekijken, maar dus niet wijzigen/deleten.

Kan je bijv de tabel locken voor alle gebruikers op die ene gebruiker na die de volgorde moet aanpassen of is er een andere oplossing voor?
In Oracle is dit zeker te realiseren. Hoe locking in Interbase 6 werkt en getriggerd wordt weet ik niet.

Show me the money.The Pexman always checks twice...
-=System=-


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
Op donderdag 29 november 2001 22:54 schreef tokkie het volgende:
Tja....ik durf het bijna niet meer te zeggen maar >:)

Er zijn 2 mensen die elkaars account dus gebruiken. (Kan voorkomen natuurlijk). Dan krijg je dus problemen!?



(Ik wil eerst weten of alles wel mogelijk is, voordat ik er mee ga beginnen)
Ja, daar kun je dan niets aan doen. Als iemand met meer rechten zijn paswoord doorgeeft jach...
Als een system-admin zijn paswoord aan mij geeft, dan kan ik ook meer dan normaal. Dan kan ik ook users aanmaken, paswoorden veranderen etc...

https://fgheysels.github.io/


  • gpex
  • Registratie: April 2000
  • Laatst online: 08-06 22:19

gpex

Pex voor intimi

Op donderdag 29 november 2001 22:54 schreef tokkie het volgende:
Tja....ik durf het bijna niet meer te zeggen maar >:)

Er zijn 2 mensen die elkaars account dus gebruiken. (Kan voorkomen natuurlijk). Dan krijg je dus problemen!?



(Ik wil eerst weten of alles wel mogelijk is, voordat ik er mee ga beginnen)
Als locking goed in de database geimplementeerd is, maakt dit dus helemaal niet uit... Locking heeft niet zozeer met het afschermen van gebruikers te maken maar meer met het afschermen van gegevens.
Als je je procedure goed implementeert mag iedereen updates op die tabel plegen. Het lockingsmechanisme zorgt voor de juiste volgorde van afhandeling en zodra er een handeling plaats vindt die niet kan, kan je deze dus negeren en niet uitvoeren.
Overigens kan je bij Oracle een NOWAIT clausule meegeven zodat zodra er iemand bij de resource (lees: tabel) wil komen als er al iemand mee bezig is er een melding komt, met "resource busy and NOWAIT specified"...

Show me the money.The Pexman always checks twice...
-=System=-


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 08:12

Crazy D

I think we should take a look.

Op donderdag 29 november 2001 19:25 schreef tokkie het volgende:
Ik denk dat jij niet helemaal snapt wat ik bedoel (of ik heb het niet goed uitgelegd.
|:( bij nader inzien was je uitleg zo onduidelijk nog niet ;)
Een volgorde-id lijkt me in dat geval niets mis mee.
Een andere vraag is hoe ik er voor kan zorgen dat er maar 1 iemand de volgorde mag aanpassen.

De andere gebruikers moeten dan alleen de data kunnen bekijken, maar dus niet wijzigen/deleten.
Ik weet niet of 'jouw' database views kent? En dan een bepaalde user alleen voor die views rechten geven, en niet voor de tabellen zelf. Volgens mij (tis al laat dus ik kan het goed mis hebben :P) kan dat in MSSQL prima. Als zoiets dergelijks ook kan in de db die jij gebruikt, is dat op zich ook wel handig voor als ze later nog een keer via een ander pakket de db kunnen benaderen wat jou rechten systeem niet ondersteunt (negeert :P), dan kunnen ze nog steeds alleen die views zien.
Anders zou je het nog met een volgorde tabel kunnen oplossen, met alleen dus artikelcode en volgordeid. Dan moet je alleen nog ergens onthouden wie wel en wie niet mag wijzigen :)

Voor het probleem als Piet 2 keer inlogt, denk ik dat je je niet zo druk hoeft te maken. Ik weet niet hoe je dat sorteren zelf inbouwt natuurlijk, maar ik neem aan dat je uiteindelijk 1 keer saved, en dat dan de complete volgorde wordt weggeschreven? In dat geval zou je een lastupdate tijd of zo bij kunnen houden, die (automatisch? trigger?) wordt bijgewerkt, of bij het saven eerst queryen of de boel verandert is, en zo ja, een melding geven. Zou het natuurlijk net kunnen zijn dat er op 2 pc's precies gelijk op save wordt gedrukt, maar dat zou wel stom toevallig zijn, en zo te horen is het ook niet iets wat duizenden mensen tegelijkertijd kunnen gaan doen, dus ik denk dat dat 'risico' wel te accepteren is. (of desnoods een table lock tijdens het queryen en updaten, zodat na de select en voor de update de data niet kan veranderen).
Pfew lang verhaal... :z

Exact expert nodig?


Verwijderd

Topicstarter
Ik was van plan om het veranderen van de volgorde op de volgende manier te doen:

Lees alle records in een listbox, zodat ze gelijk op de goede volgorde staan. Vervolgens kan de gebruiker de items verplaatsen d.m.v. te slepen bijvoorbeeld.

Als die klaar is, wordt alles in de tabel in 1 keer gewijzigd.


Maar terwijl die gebruiker dus bezig is om die lijst aan te passen, mag een andere gebruiker natuurlijk geen artikel verwijderen/toevoegen.


(Ik ga gebruik maken van Interbase 6)
Pagina: 1