dinsdag 11 juni 2013

Help! Mijn Access database doet het niet meer!

Komen de onderstaande typen meldingen bekend voor?

Access kan de database file niet meer lezen of vinden...
Access kan database objecten niet meer vinden...
Access kan tabellen of velden niet vinden die je niet bekend in de oren klinken (en dus wel intern moeten zijn)...

...dan is de kans groot dat de Access database corrupt is.

Hierop is snelle actie geboden omdat een corrupte Access database verlies van gegevens en van programmatuur kan betekenen.

In dit artikel in het kort een paar tips om problemen te voorkomen en, als het echt nodig is, proberen te verhelpen.

Wat betekent een "corrupte" Access database eigenlijk?

Een Access database wordt in een (1) bestand opgeslagen (b.v. .mdb, .accdb). Hierin is zowel data, data definities als code opgeslagen. Access leest en schrijft continu in dit bestand. En naarmate de activiteiten toenemen (meer gebruikers, grotere en complexere bewerkingen), wordt ook de kans dat Access (schrijf) fouten maakt groter, waardoor data, definities en code beschadigd raken.
Factoren als hardware fouten (b.v. disk, netwerk) vergroten deze kans.

Hoe kun je voorkomen dat een Access database corrupt raakt?

Tip: MAAK REGELMATIG BACKUPS!!

(in het groot geschreven omdat dit een van de meest belangrijke, maar ook een van de meest nagelaten activiteiten is)

Het regelmatig maken van backups voorkomt geen corruptie, maar vermindert de moeite die gedaan moet worden om data, stuctuur en programmatuur te herstellen.

Tip: gebruik Access waarvoor het gemaakt is: eenvoudige, kleine databases die door een beperkt aantal gebruikers, niet intensief, worden gebruikt. Access is namelijk een file based Database management System waarbij een (1) centraal bestand door alle Access clients wordt aangesproken (lezen/schrijven). Dit in tegenstelling tot een (echt) client-server based Database Management System waarbij een proces op de server verantwoordelijk is voor alle dataverkeer tussen database (server side) en client. Wanneer een client een selectie van gegevens (een query op een tabel) opvraagt wordt de hele tabel eerst door de client ingelezen waarna selectie op de client wordt uitgevoerd. In een client-server based systeem wordt de selectie al op de server uitgevoerd, waarbij de hoeveelheid gegevens die naar de client worden gestuurd aanzienlijk kleiner is.

Wil je meer? Gebruik dan een solider Database Management Systeem als SQL-server. Ook hiervan zijn versies die eenvoudig op de pc gebruikt kunnen worden. Zie: SQL Server 2012 Express Edition (gratis).

Tip: splits je Access database in een gegevens deel en een programmatuur deel
Zo blijft eventuele schade beperkt.

Tip: voor toegang door meerdere gebruikers: splits je Access database in een (master) gegevens deel en (voor iedere gebruiker) een (werk) programmatuur deel
Gebruikers bewerken gegevens in hun lokale database, waarna definitieve wijzigingen in de centrale database worden opgeslagen. Zodoende wordt de werklast van de database(s) verdeeld en daarmee verminderd. Ook hier: eventuele schade blijft beperkt.

Tip: vermijd Memo velden en in het algemeen velden waarin veel data wordt opgeslagen
Access databases raken regelmatig corrupt bij het (over)vullen van velden. Vermijd dit soort velden of zorg ervoor dat deze velden niet overvuld (te grote string in een memo veld proberen op te slaan) worden.

Tip: Sluit formulieren af voordat je wijzigingen aan code uitvoert
Met het tegelijk wijzigen van code en gebruik van formulieren heeft Access moeite. Databases kunnen hierdoor corrupt raken. Na het testen dus de formulieren afsluiten, daarna pas programma code aanpassen.

Tip: Vermijd langlopende en complexe bewerkingen
Langlopende en complexe queries vergroten de kans op fouten. Splits deze daarom in kleinere delen, en maak gebruik van tijdelijke tabellen. Vooral in omgevingen waarbij databases op centrale (remote) servers staan nemen langlopende en complexe bewerkingen veel tijd in beslag, hetgeen de kans op fouten groter maakt. Ook hier: gebruik een lokale (snelle) database voor complexere en langduriger bewerkingen en update de centrale database daarna.

Tip: "Compact & repair" je Access database regelmatig
Regelmatig controleren en opschonen van je Access database verkleint de database en stelt je in staat om eerder fouten te ontdekken. Access biedt hiervoor in het Database tool menu een "Compact & repair" functie. Deze is ook in de programmatuur aan te roepen zodat automatisering hiervan goed mogelijk is.

En als het toch misgaat? Hoe kun je (proberen) een corrupte Access database te herstellen?

Het is niet altijd mogelijk om een corrupte Access database te herstellen. Stappen die je hiervoor kunt ondernemen zijn:

1. Verwijderen van het lock bestand (b.v. .ldb, .accldb)
2. Kopieer de Access database naar een backup (mocht de eerste herstel actie mislukken)
3. Open de Access database en probeer deze middels de "Compact & repair" functie te herstellen
4. Test de herstelde database grondig, door alle objecten te openen en te testen, en te controleren op foutmeldingen en onverwacht gedrag.

Mocht dit niet lukken:
1. Open de corrupte database
2. Exporteer alle objecten naar schijf of een nieuwe database
3. Mocht je een (werkende) backup hebben, importeer de geexporteerde objecten in deze backup
4. En ook hier geldt na herstel: testen.

dinsdag 7 mei 2013

Handige bronnen

Office algemeen

Officiële Microsoft Office website (http://office.microsoft.com)

Office development

Office client development: Office 2000, XP, 2003, 2007, 2010 en 2013.
Links naar naslag, trainingsmateriaal, Software Development Kits, tools en technische artikelen voor en over Office 2000, XP, 2003, 2007, 2010 en 2013 applicaties (clients).

Office 2010: Developer Map Poster
De Microsoft Office 2010 Developer Map helpt als overzicht bij de ontwikkeling van verschillende soorten Office gerelateerde toepassingen, services, data-access client / server-technologieën, on-premise servers, platform producten en technologieën en tools.

Introductie op Apps voor Office 2013 (Overview of apps for Office)
Opbouw en architectuur van Apps, requirements en gebruiksscenaro's van Apps voor Office 2013.

Apps bouwen voor Office 2013
Hoe bouw je Office 2013 apps met technieken als HTML5, JavaScript, CSS3, en XML. Uitleg over de App development lifecycle. Tips hoe te starten met het leren van App ontwerp, ontwikkeling en deployment.

Zelf aan de slag

Voorbeelden, labs, how-to's en ander materiaal waaneer je direct aan de slag kunt.

How to: Create your first content app
How to: Create your first task pane app
How to: Create your first mail app
How to: Release notes for apps for Office

Office demo en trial versies

Try Office 365 Home Premium

Download Microsoft Office Professional Plus 2013

Microsoft TechNet Evaluation Center
Links naar naslag, trainingsmateriaal, Software Development Kits, tools en technische artikelen voor en over Office 2000, XP, 2003, 2007, 2010 en 2013 applicaties (clients).

Op de hoogte blijven


RSS feed voor berichten over nieuwe downloads

maandag 6 mei 2013

Foutafhandeling (exception handling) in Visual Basic for Applications (VBA)


Afhandelen van fouten is een essentieel onderdeel van programma code. Fouten die niet worden afgehandeld zijn voor de eindgebruiker natuurlijk vervelend (het programma stopt met werken), maar bepalen en opruimen van eventuele schade wordt daarbij ook niet gedaan. Een gemiste kans dus.

VBA biedt hiervoor de een aantal voorzieningen die in deze blogpost worden beschreven.

Allereerst: afvangen van foutsituaties

Fouten in programmacode kunnen worden opgevangen door een error handler in de code te voegen. Hiervoor worden de volgende commando's gebruikt:

On Error Goto <ErrorHandlerLabel>: bij een foutsituatie, ga naar de code met label <ErrorHandlerLabel>
Resume (Next | <ErrorHandlerLabel>):
- Bij een foutsituatie, vervolg verwerking met de volgende code regel.
- Bij een foutsituatie, vervolg verwerking vanaf de code met label <ErrorHandlerLabel>.
On Error Goto 0: schakel afhandeling van de huidige foutsituatie uit.
Het error-object (Err)

Het error object bevat eigenschappen die een foutsituatie beschrijven en methods waarmee de foutsituatie. Dit object wordt automatisch gevuld wanneer zich een foutsituatie voordoet.

Voorbeeld:

Function VoorbeeldFunctie() As Integer

    Dim a As Integer
    
    On Error GoTo LabelErrorHandler

    ' ...code...
    
    a = 1 / 0 ' Hier gaat wat fout, je mag niet delen door 0 (als voorbeeld).

    VoorbeeldFunctie= 0

    On Error GoTo 0

LabelCleanup:

    ' ...code...

    Exit Function

LabelErrorHandler:

    MsgBox ("Error (" & Err.Number & ") in ReportRun_Prepare(): " & Err.Description)

    Resume LabelCleanup

End Function


Het error (Err) object wordt, binnen een error handling routine, na Exit Sub, na Exit Function, Exit Property, of Resume Next automatisch gereset (0). Dit kan ook expliciet gebeuren door Err.Clear te gebruiken, wat ook werkt buiten error handling routines.

Foutcodes

VBA gebruikt standaard nummers voor fouten. Daarnaast kunnen eigen foutcodes worden gebruikt. Gebruik hiervoor de foutcodes van 513 t/m 65535.

Zelfgedefinieerde fouten kunnen worden geactiveerd (raised) door het raise commando, bijvoorbeeld: Err.Raise(513).

Tips

Naast goede foutafhandeling is het van belang om altijd (aan het begin van iedere module) Option Explicit in te voegen. Hiermee wordt afgedwongen dat variabelen, voor gebruik, ook expliciet worden gedeclareerd. Veel fouten zijn namelijk te wijten aan het niet declareren van variabelen, waarbij VBA deze automatisch aanmaakt wanneer er voor het eerst een waarde aan toe wordt gekend. Dit zorgt echter voor onduidelijkheden en een grotere kans of fouten waarvan de oorzaak lastiger is te vinden.