Prullenbak Functie in Access

Status
Niet open voor verdere reacties.

Robert971

Gebruiker
Lid geworden
6 jul 2012
Berichten
171
Graag zou ik een soort van prullenbak Functie in Access willen bouwen.
Dit komt op het volgende neer.

Er zijn gebruikers die records wissen maar dit per ongeluk doen (ook al wordt gevraagd om een bevestiging, 'Wilt u dit record verwijderen'). Op het moment dat het record door een gebruiker 'per ongeluk' is verwijderd moet deze weer opnieuw teruggehaald kunnen worden.
Bij het commando verwijderen zal het betreffend record geplaatst moeten worden in een andere tabel (prullenbak) waar deze later weer opgehaald kan worden (gerecycled), mocht deze per ongeluk zijn verwijderd.

Voordat ik hier heel veel tijd in ga steken wil ik vragen of hiervan een voorbeeldje i? of dat het op een andere eenvoudige manier te realiseren is?

bvd
Robert
 
Je hebt de prijs voor de meest originele vraag van het jaar in ieder geval al binnen :). Nu ik er over nadenk, doen we die er van het vorig jaar ook maar bij, want ook die win je met de ogen dicht :D.
Access is als database een keihard systeem, net zoals overigens alle database systemen, en geen van alle kent een 'prullenbak' functie. Die is er gewoon niet. Hooguit kun je een handeling ongedaan maken, maar daarvoor moet je om te beginnen al gelijk aan de slag nadat de foute handeling is uitgevoerd, en je herstelt altijd naar de laatste situatie. En dat is niet helemaal wat jij wilt.
Is er meer? Ja, er is meer: Access kent ook een soort Transaction Log, zoals je ook ziet bij grote databases zoals SQL Server. Die houden alle transacties bij in een aparte file, en daar kun je dus weer gegevens uit terugzetten. Maar in Access (waar de functie overigens Rollback heet) is dat linear. Dat betekent, dat je alle stappen die ná de fout zijn uitgevoerd óók terugdraait. En dat is bij een database doorgaans echt niet de bedoeling. Hier kun je een beetje lezen wat Rollback precies is in Access.

We kunnen er dus gevoeglijk van uit gaan dat je aan deze techniek niet zoveel hebt. Hoe kun je het dan toch een beetje fatsoenlijk oplossen? Om te beginnen: de standaard Delete knop moet weg, want daar krijg je dus je problemen door. Die zul je moeten vervangen door een eigen knop, die 2 dingen doet:
1. Het complete record dat je wilt verwijderen opslaan in een Historie tabel
2. Het record verwijderen

De tweede handeling is simpel (de code die een record verwijdert is redelijk standaard), de eerste is ook niet zo ingewikkeld. Sterker nog: in een parallel lopend draadje (draadje... hij heeft al in de 60 berichten) van ISR speelt dezelfde problematiek. Weliswaar met een iets andere insteek (niet een compleet record archiveren, maar elk veld apart) maar het idee kun je zonder meer zo overnemen. Jouw oplossing is ook een stuk simpeler, want je hoeft alleen maar een record toe te voegen aan de Historietabel voordat je het record verwijdert.
Vraag is overigens wel of je een verwijderd record later weer zomaar kunt toevoegen. Dat hangt een beetje van je indexen af, en of je een Autonummerveld gebruikt om maar wat te noemen. En natuurlijk of je niet ook gekoppelde records verwijdert uit andere tabellen.
 
Je hebt de prijs voor de meest originele vraag van het jaar in ieder geval al binnen
Begint goed het nieuwe jaar! Gelijk in de prijzen gevallen dus:d

@Octafish: dank voor de uitgebreide inspiratie. Hier ga ik zeker uitkomen.:thumb:
Ben momenteel nog aan het kijken wat het meest praktisch is; het 'Record verplaatsen' naar een Historie tabel via een Toevoegquery(SQL) of m.b.v. VBA.
Met een Toevoegquery kunnen de tabelgegevens eenvoudig vooraf worden weggeschreven naar een Historie tabel/prullenbak (hier vervolgens een formulier op zetten met 'tijdelijke variabele' om ze terug te halen, na verwijderen van een Record in de originele tabel). Met VBA kan de actie wat doelgerichter.

Beide opties zijn i.i.g. mogelijk.

Morgen weer verder.
 
In beide gevallen gebruik je een toevoegquery, maar een VBA oplossing geeft veel meer vrijheid. In het andere draadje gebruik ik een recordset omdat de logging op veldbasis gaat. Dan is een query niet zo zinvol. Jij zet complete records weg, en dan is een query dus handiger.
Succes!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan