Trigger gebruiken in access

Status
Niet open voor verdere reacties.

gd435

Nieuwe gebruiker
Lid geworden
6 dec 2011
Berichten
4
Dag iedereen,

Triggers bestaan niet echt in access maar heten hier "data macro's". Ik weet echter niet hoe hier aan te beginnen.

Mijn probleem :

Ik heb een tabel met als velden volgnr - naam - compagny - sorteerNumber
Het veld sorteerNumber bevat een reeks cijfers van 1 tot 999 en dient om te sorteren in mijn rapporten.

Wat ik nu wil doen is, als het sorteerNumber wijzigt van pakweg 10 naar 20, dan moet in feiten de ganse reeks opnieuw genummerd worden.
Dan komt nr 11 op nr 10, nr 12 op nr 11 enz en pakt nummer 10 plaats nr 20 in.
Het moet ook in de andere richting werken als ik sorteerNumber 120 wijzig naar de eerste plaats dan schuift alles op.

Iemand enig idee hoe hier aan te beginnen?

Alvast bedankt
 
Met een simpele query:

update jouwtabel set sorteernumber=sorteernumber+10;
 
Die query gaat je niet helpen, want die verandert niets aan de sorteervolgorde omdat alle records met 10 worden verhoogd. Ik snap ook niet helemaal wat je aan het doen bent, maar voor jou zal het ongetwijfeld logisch zijn. Normaal gesproken bepaal je de sortering op basis van een logische component. Bijvoorbeeld een datum/tijd veld, een autonummerveld, achternaam etc. Een willekeurige waarde in een apart veld om te sorteren, slaat in essentie eigenlijk nergens op, althans: ik zie daar de logica niet van. Want op basis waarvan bepaal je dat een bepaald record moet worden verschoven?

Maar goed, laten we het eens over de onderliggende techniek hebben. Daarbij ga je dus bij één record de waarde veranderen van 10 naar 20, met als resultaat: een gat in de nummering (van 9 naar 11) en twee records met een identieke waarde. En dan heb je dus gelijk een probleem, want zodra je de waarde verandert en opslaat in je bedoelde record, heb je een situatie gecreëerd die eigenlijk al niet meer op te lossen is met een query. Want hoe moet Access nu bepalen welke van de twee records met de waarde 20 nu moet worden veranderd naar 19? Je zult dus een update moeten uitvoeren op de records vanaf het punt waar je wilt beginnen (11) tot en met het record dat de nieuwe waarde had (20), en die 10 records met je dan niet met 10 verhogen, zoals ah denkt, maar met de waarde 1 verlagen. En dan kan je het te bewerken record dus een nieuwe waarde (20) geven.

Gaat dat werken? Ik verwacht eigenlijk van niet, want het veld dat je voor je nummering gebruikt, zou eigenlijk de eigenschap Geïndexeerd op "Ja, (geen duplicaten)" moeten hebben om te voorkomen dat je per ongeluk een dubbele waarde invoert in het veld (hierboven al aangegeven wat dat kan veroorzaken). En op geen enkel moment in het proces kan je dus de waarde 20 laten dubbelen, ook niet tijdelijk. Dus dat wordt nog een leuk klusje :). Maar het kán dus wel... Zelf zou ik het via VBA doen, met een Recordset waarbij je een recordset maakt van de huidige situatie die je wilt aanpassen, en dan de records dus update.
 
AccessGuru heeft helemaal gelijk, ik had de vraag niet goed gelezen.
Maar als je kolom sorteerNumber niet uniek is kun je e.e.a. bereiken via een hulpkolom.
Voeg een kolom "sorteerNieuw" met hetzelfde type als sorteerNumber toe aan je tabel.
Stel dat 10 naar 20 gaat:
Dan blijft 1 t/m 9 hetzelfde
11 t/m 20 gaat naar 10 t/m 19
> 20 blijft hetzelfde

Code:
UPDATE Tabel
SET sorteerNieuw = sorteerNumber

UPDATE Tabel
SET sorteerNieuw = 20
WHERE sorteerNumber = 10

UPDATE Tabel
SET sorteerNieuw = sorteerNumber -1
WHERE sorteerNumber > 10 AND sorteerNumber <= 20

UPDATE Tabel
SET sorteerNumber = sorteerNieuw

E.e.a. uit te voeren via een formpje waarin je het oude en nieuwe nummer opgeeft die je vervolgens gebruikt in je query's.
 
Laatst bewerkt door een moderator:
Wát een ingewikkelde constructie…. Dat kan dus echt veel simpeler. Zoals ik beschreven heb bijvoorbeeld. Sowieso is een hulpkolom niet nodig.
 
@AccessGuru
Ik houd mij altijd aanbevolen voor simpele constructies, hoe simpeler hoe beter.
Ben heel nieuwsgierig naar de manier waarop jij het zou doen.
Op welke manier zou de "recordset van de huidige situatie" aangepast moeten worden?
 
Ik wacht eerst op reactie van TS; het gaat er tenslotte om dat diens vraag wordt beantwoord :).
 
Ik vind de methode van AHulpje eenvoudig en snel. Als je via een VBA recordset gaat werken maak je ook een copie van de recordset en werk je veel trager (RBAR).
 
Ach welnee. Hoe kom je erbij? Af en toe schrik ik een beetje van de kwaliteit van je antwoorden….
 
@AccessGuru: ik leg je het graag uit, wij willen immers allemaal bijleren. Een recordset werkt op dezelfde manier als een temp table in een database. Alleen heb je in Access geen Temp database zoals in database server systemen, en moet deze "onzichtbare" tabel in de Access database aangemaakt worden. Dat is trouwens ook één van de redenen dat de Access file zo kan opblazen en je die regelmatig moet compacteren (jaren geleden ooit eens de Microsoft Access certificering gehaald, daarna de SQL server cursussen/certficering wat natuurlijk de kwaliteit van de antwoorden nog altijd beïnvloedt). Dat werkt op zich al trager in Access dan in een database systeem. Verder werk je dan met deze dataset als een cursor : je loopt door de rijen en gaat rij per rij bekijken/bewerken : Row By Agonizing Row = RBAR dus, terwijl een relationele database een batch systeem is en ook de Access engine zo geconcipieerd is. Als je maar een paar honderd records hebt valt dat wel mee, maar zelfs al bij een paar duizend records begint dit merkbaar traag te worden.
 
@noella: beperk je tot bruikbare antwoorden voor TS; jij kunt mij echt niets meer leren. Daarnaast zit TS er niet op te wachten dat je anderen gaat opvoeden. Hoef je ook niet te proberen dus. En áls ik wat wil leren, stel ik wel een eigen vraag.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan