Wouter Rijnbende
|
|
« on: September 28, 2012, 01:29:35 pm » |
|
Als het goed is zou ADS_ADT geen deleted records kennen.
Stel dat we een tabel hebben met 100 records, en we verwijderen hier 10 records uit (#2 t/m #11), dan zien we het aantal Records in de tabel (VFP: RECCOUNT()) dalen van 100 naar 90. Met een AdsShowDeleted(1) (VFP: SET DELETED OFF) zien we geen verwijderde records. Alles lijkt erop dat de records nu ook daadwerkelijk uit de tabel zijn verwijderd. Toch is dit niet het geval.
Het 100e record levert nl. nog steeds een AdsGetRecordNum van 100 op (VFP: RECNO() = 100), en daarmee is RECNO() dus groter dan RECCOUNT(). Ook zal een nieuwe AdsAppend (VFP: APPEND BLANK) niet een nieuw record toevoegen, maar, een eerder verwijderd recordnummer hergebruiken. Ofwel, het nieuwe recordnummer kan #2 opleveren (omdat deze intern recalled wordt).
Dit levert problemen op bij toepassingen die écht iets met het Recordnummer doen, zoals "Doorboeken Batchboekingen", die maximaal doorboekt t/m de RECCOUNT() t.t.v. de aanroep van "Doorboeken Batchboekingen", doch, welke al snel foutloopt, omdat die RECCOUNT() steeds kleiner wordt (bij een gelijk blijvende RECNO().
I.g.v. ADS_ADT zullen wij records dan ook slechts "markeren" als deleted, en bij het uitvoeren van een PACK (reorganiseren) deze records daadwerkelijk verwijderen.
Nb: Voor een juiste werking is het dan ook niet toegestaan om records (ook niet vanuit de Advantage Data Architect) te verwijderen, zonder hierbij een PACK uit te voeren.
|