MS Access projecten - drama of succes?

Bezig deze pagina aan te passen en sommige content wordt elders ondergebracht.

Inleiding

Mijn visie is dat er een grote verantwoordelijkheid op de schouders van elke leverancier rust om over de juiste middelen te beschikken. Want alleen met de juiste middelen is het mogelijk om snel en kwalitatief hoogwaardige producten en/of diensten te leveren, inclusief een goede nazorg met alles wat daarbij hoort.

Maar wat zijn de juiste middelen voor een MS Access project? De ervaring leert dat opdrachtgevers hieromtrent vaak onvoldoende van op de hoogte zijn. En dan is het moeilijk om de ware Access specialist te herkennen met het risico dat het project op een drama uitloopt. Door kritisch te zijn en niet te lichtvaardig te denken over wat de ontwikkelaar in huis heeft, kunt u dit voorkomen.

Ik wil u graag bijstaan door u betrouwbaar advies te geven dat de kern belicht: een authentiek vakmanschap zoals men het bij Microsoft graag ziet. Want dat is natuurlijk het hart van alles. U vindt het op deze pagina.

Hartelijke groet,
Peter van Loosbroek - Office Programs

Mensen - Proces - Product

Mijn visie is dat de mensen over bijzondere eigenschappen moeten beschikken omdat het de mensen zijn die het proces dirigeren. De kwaliteit van het proces komt uiteindelijk tot uiting in de kwaliteit van het product.

Een hoge mate van expertise (kennis + inzicht + ervaring) is onontbeerlijk. Goede kennis van zaken hebben is natuurlijk vanzelfsprekend, maar inzicht en ervaring zorgen voor een diepere dimensie en een verfijning van details. Hoe werkt dat?

Wanneer we vasthouden aan oude gedachte- en gewoontepatronen (conditionering), kan ons inzicht niet verruimen. Dan blijft het alleen bij concepten en de kennis die we al hadden. Echter, het loslaten van het oude en het bekende maakt ruimte voor een brede en begripvolle kijk op het hele gebeuren. En zorgvuldigheid gaat altijd gepaard met inzicht. Zo is inzicht een diepere dimensie dan louter conceptueel denken.

Zonder het vermogen los te laten is innovatie niet mogelijk. Want waar het oude is, daar kan het nieuwe niet zijn.

Tip Hieronder een paar voorbeelden van modellen uit de praktijk (Office Programs Orders). Deze applicatie kunt u straks bekijken via Home > Orders.

access-verpcombi
access-relationeel-orders
access-frm-orders
access-ord-efficientie01
access-module-orders

Systeem - Middelen - Innovatie

Lennart Ras (Steketee Yerseke): "Wij hebben voor een onderhoudscontract gekozen zodat onze applicatie altijd up-to-date is. Op deze manier kunnen we ook gebruik blijven maken van nieuwe toegevoegde functionaliteiten en worden bestaande functionaliteiten op deze wijze steeds geperfectioneerd."

Het is van het grootste belang dat een ontwikkelaar over een feilloos systeem beschikt. Dit kunt u in de eerste plaats herkennen aan een methodische en goed gestructureerde werkwijze. Essentieel: herbruikbare code en andere herbruikbare objecten. Zo hoeft het wiel niet steeds opnieuw te worden uitgevonden. Het zijn de middelen die een systeem vormen.

De kern van mijn systeem is dat vele functionaliteiten (middelen) continu worden geperfectioneerd en uitgebreid (al vanaf 1995). En om een goede nazorg te kunnen leveren worden ook reeds uitstaande applicaties daarmee bijgewerkt. De middelen worden dus steeds gereproduceerd en opnieuw gedistribueerd. Dit behelst de innovatie van zowel nieuwe als uitstaande applicaties. U kunt dit vergelijken met bijvoorbeeld het besturingssysteem Windows dat ook gebruik maakt van heel veel componenten (middelen). Samen vormen die het systeem en het moet allemaal perfect met 'elkaar kunnen praten'. Windows wordt verbeterd doordat onderdelen ervan worden verbeterd.

Een leverancier kan nog zoveel en nog zo'n goede programmeurs als eigen personeel hebben, maar als zij allemaal op een eigen manier werken is deze werkwijze nooit toepasbaar.

  • Fig. 1 toont het Access Development System (een interne tool). Het omvat 'middelen om middelen te maken'.
  • In Fig. 2 is te zien dat bouwstenen (middelen) centraal worden gereproduceerd en opnieuw gedistribueerd naar alle applicaties. Zoals ook Windows op vele computers wordt bijgewerkt.
  • In Fig. 3 wordt uw applicatie in spe weergegeven die gebruik maakt van diverse ondersteunende onderdelen (de herbruikbare code en andere herbruikbare objecten).
  • Fig. 4 is een voorbeeld van hoe meerdere middelen in mijn systeem een samenwerkend geheel vormen (zoals voor gedefinieerde teksten, werknemers, documenten, e-mail onderdelen etc.).

Binnen het systeem zijn geavanceerde hoogwaardige functionaliteiten. Als dat voor één klant gemaakt zo moeten worden, zou het onbetaalbaar worden.

Fig. 1

access-access-development-system

Fig. 2

access-modulair

Fig. 3

access-system

Fig. 4

access-relationeel

Een systeem waarbij de middelen op deze wijze worden geïnnoveerd, is efficiënt in veel opzichten. Dit leidt tot:

  • Stabielere applicaties.
  • Meer en betere functionaliteiten.
  • Lagere kosten.

In de volgende rubriek zult u zien waarom.

De resultaten van het systeem

De middelen bestaan kortweg gezegd uit:

  • Herbruikbare programmacode (oftewel 'solide code'). Zie de Extra info sectie verderop.
  • Herbruikbare objecten (tabellen, formulieren, rapporten, interface etc.).
  • WT's (werktechnieken). Technieken die volgens een gestructureerd geheel worden toegepast om dezelfde soort taken mogelijk te maken.

De getoonde voorbeelden zijn beperkt. Het doel is immers dat u als opdrachtgever beter inzicht krijgt in wat professionele middelen zijn en dat de ontwikkelaar een goede systematiek hanteert.

Efficiënt en dynamisch

Dingen slechts één keer ontwikkelen en vervolgens ongelimiteerd hergebruiken. Dit kan alleen binnen een goed gestructureerd systeem.

access-dev-verz-001

Blauwdrukken

Fig. 1 is een schets van de Basiscomponenten. Eén van de vele componenten zijn de blauwdrukken. Afhankelijk wat er nodig is kan één blauwdruk diverse objecten omvatten zoals bijbehorende programmacode, formulieren, rapporten, tabellen etc. Een blauwdruk is een voorgeprogrammeerde WT (werktechniek) die in variabele omstandigheden kan worden toegepast. Hierdoor worden de ontwikkelingskosten gereduceerd. Dit kan alleen binnen een goed gestructureerd systeem.

Waarom de naam 'blauwdruk' en niet 'sjabloon'? De objecten van een blauwdruk worden steeds geperfectioneerd en bijgewerkt; van een sjabloon niet.

In Fig. 2 en 3 s dezelfde blauwdruk toegepast: de ene keer betreft het een offerte, de andere keer een factuur. Als u de screenshots bekijkt zult u zien dat alleen de naam van het tabblad en het bijschrift van het dialoogvenster van elkaar verschillen. De toegepaste methode (de techniek) is bij beide dialoogvensters gelijk. Achter de schermen speelt veel hergebruikte code.

Fig. 4 is ook dezelfde blauwdruk maar er is nu ook nog een tabblad Instellingen waar nog veel meer mogelijk is. Daar kan de gebruiker op een makkelijke wijze selecteren wat gewenst is. Zeer geavanceerde SQL voor de gewenste data wordt achter de schermen met code opgebouwd. Het resultaat is altijd goed. Op het eerste tabblad zijn dezelfde functionaliteieten als bij Fig. 2 en Fig. 3.

De blauwdruk heeft ook mogelijkheden om met dezelfde selectie die door de gebruiker is gemaakt, nog veel meer te doen. Bijvoorbeeld de data exporteren naar Excel en vervolgens Excel functies toe te passen, de layout van rapporten instellen, een specifiek rapport genereren zoals een Interactief rapport (screenshot), en nog veel, veel meer moois.

Deze blauwdruk is er slechts één van de vele... Zo hebben we bijvoorbeeld ook blauwdrukken van professionele rapporten die allemaal een consitente structuur hebben met geweldige bijbehorende functionaliteiten. Straks kunt u hier voorbeelden van bekijken.

Fig. 1

access-system

Fig. 2

access-dial-a1-verzendingoffertes

Fig. 3

access-dial-a1-verzendingfacturen

Fig. 4

access-dial-a1-heffingen-inst

Transparantie

Hopelijk bent u nu redelijk goed op de hoogte bent van wat de juiste middelen in deze zijn. Een ontwikkelaar moet de essentie van zijn middelen en werkwijzen laten zien en toelichten. Precies zoals u in een fabriek een kijkje moet kunnen nemen van hoe uw keuken (of wat dan ook) gemaakt wordt. Die transparantie geeft u meer zekerheid.

Praktijkvoorbeelden

Er zijn vele, vele voorbeelden te geven van hoe het niet moet. En hoewel het ook goed is om dat te zien, neem ik u liever mee naar positieve dingen. Mijn woordkeuze 'drama' is eigenlijk genoeg en zeker niet overdreven. Want 'drama' is vaak de enige juiste definitie van de MS Access projecten die ik tegenkom. Nee, ik ben niet negatief; het is de realiteit. Mensen zitten met pijnlijke problemen in hun maag.

Denk niet te lichtvaardig, wees kritisch. Verkeerde inkopen worden vaak gedaan omdat er bij opdrachtgevers te weinig kennis is en/of geen goed vooronderzoek is gedaan.

Denk niet dat als 'er 150 programmeurs voor u klaar staan' of als het een groot bedrijf is, dat het dan wel goed zit...

Je kan een renpaard een mooie naam geven, maar daar wint het de wedstrijd niet mee.

In de sectie Extra info hierna, zijn nog wat extra tips en voorbeelden voor degene die wat meer details willen weten. De eerste rubriek betreft een verantwoording over de Basiscomponenten - de voorgeprogrammeerde middelen waarmee uw applicatie wordt gebouwd.

Praktijkvoorbeelden van hoe mijn systeem werkt kunt u het beste bekijken via de volgende pagina's:

Tip U kunt altijd alle essentiële pagina's via Home bereiken. U zult steeds dezelfde systematiek overal terug herkennen: een authentiek vakmanschap zoals men het bij Microsoft graag ziet.

Extra info

Verantwoording Access Application System

Content is verplaatst. Zie hier.

Geen Active-X elementen

Afgezien van een goed doordachte opzet en structuur, is het niet gebruiken van Active-X elementen de belangrijkste factor als het gaat om de continuïteit en levensduur van uw applicatie. Waarom is dat zo en wat zijn Active-X elementen?

Windows maakt gebruik van de Application Programming Interface oftewel API, om het besturingssysteem aan te sturen. Deze API functies kunnen vanuit Access, Excel etc. worden aangestuurd, maar dat vergt extra expertise. Om dit te vergemakkelijken kunnen ontwikkelaars gebruik maken van Active-X elementen, bijvoorbeeld om een bestand of een folder aan te wijzen. Echter, dit brengt wel de volgende problemen met zich mee:

  • Active-X elementen zijn bestandjes die op een systeem moeten worden geïnstalleerd wat we sowieso liever niet doen.
  • In de VBE (Visual Basic Editor) van Access moet een verwijzing zijn ingesteld. Bij verplaatsing van bestanden, PC opnieuw inrichten etc., geeft dat een probleem.
  • Active-X elementen zijn - i.v.m. updates - versie afhankelijk.
  • Active-X elementen zijn ook bit versie afhankelijk (32 of 64 bits).

Microsoft raadt het gebruik van Active-X elementen ten strengste af vanwege de compatibiliteit met de modernste technologie. Een ontwikkelaar kan API routines schrijven waarmee de API functies rechtstreeks door Windows zelf worden uitgevoerd. Dus zonder tussenkomst van een Active-X element. Maar zoals gezegd vereist dat extra expertise waardoor ze toch vaak door ontwikkelaars worden gebruikt (maar niet door Office Programs).

Office: 32 of 64 bit?

Met de komst van Office 2010 kan worden gekozen voor een 32 of 64 bit versie. Voor 64 bit-applicaties moeten API aanroepen speciaal zijn aangepast. Voor een Office Programs Access applicatie maakt het niet uit of u 32 of 64 bit gebruikt, ondanks de geïmplementeerde API functies.

Tip Als u Office installeert kunt u onder normale omstandigheden het beste voor de 32 bit versie gaan. Wilt u de 64 bit versie, dan moet u dat tijdens de installatie expliciet aanwijzen en dat is niet zonder reden. U heeft alleen de 64 bit versie nodig als u met zeer grote Excel bestanden werkt.

Voorbeelden van solide code

'Solid code' oftwel 'solide code', 'betrouwbare code' wordt vooral zo genoemd omdat deze programmacode geschikt is voor hergebruik (reuseable code). Het resultaat van een procedure (een blokje code) is altijd hetzelfde, dus als de procedure goed geschreven is, is de code betrouwbaar.

Kort gezegd zijn er (o.a.) procedures die een waarde teruggeven (procedure Function) en procedures die een opdracht uitvoeren (procedure Sub). Procedures worden ook wel 'threads' (draadjes) genoemd omdat ze met elkaar verweven kunnen zijn.

Een systeem opbouwen dat is gebaseerd op solide en herbruikbare code is het allerbelangrijkste fundament voor het samenstellen van modules en uiteindelijk applicaties.

access-modulair

CalcAge

Deze procedure (Function) geeft altijd de juiste leeftijd terug. Functies kunnen overal worden aangeroepen: via een query, via een besturingselement, via andere procedures, via het lint, en zelfs via een SQL-instructie.

  • Goede procedures zijn uit voorzorg voorzien van een fout afhandelingsroutine.
  • De procedures MsgErr en MT in de fout afhandeling, zijn eveneens procedures ('threads') die in al mijn procedures worden hergebruikt.
  • CalcAge is een 'gebruikers gedefinieerde procedure'. Procedures als IsDate, DateSerial, Month, Day, Date, zijn VBA procedures.

Aan dit eenvoudige voorbeeld is al te zien dat het een 'samenhangend systeempje' vormt. Procedures kunnen zeer complex zijn en het systeem zeer groot. Het moet daarom goed in elkaar steken.

Function CalcAge(dteBirthdate As Date) As Long

    Dim lngAge As Long

    

    On Error GoTo Bye_Err

    ' Ga na of de doorgegeven waarde een datum is.

    If Not IsDate(dteBirthdate) Then

        dteBirthdate = Date

    End If

    

    ' Ga na of dteBirthdate in de toekomst ligt. Zo ja, gebruik dan de systeemdatum.

    If dteBirthdate > Date Then

        dteBirthdate = Date

    End If

    

    ' Bereken het verschil in jaren tussen vandaag en dteBirthdate.

    lngAge = DateDiff("yyyy", dteBirthdate, Date)

    ' Mocht dteBirthdate dit jaar nog niet hebben plaatsgevonden, trek dan 1 voor de leeftijd af.

    If DateSerial(Year(Date), Month(dteBirthdate), Day(dteBirthdate)) > Date Then

        lngAge = lngAge - 1

    End If

    CalcAge = lngAge

    

Bye_End:

    Exit Function

Bye_Err:

    MsgBox MsgErr, vbCritical, MT

    Resume Bye_End

End Function

FindRecordCount

Deze procudure (Function) geeft het aantal records terug uit een op te halen Recordset die bepaald wordt met het doorgegeven (variabele) argument strSQL. Het tellen van records kan in heel veel gevallen nodig en nuttig zijn.

Voor een groot aantal taken zet ik DAO en SQL erg vaak in omdat dat een applicatie erg dynamisch maakt. Wanneer dit niet wordt beheerst moeten er o.a. veel Query's (QueryDefs) worden gemaakt waardoor er een onbeheersbare situatie gaat ontstaan. Ik gebruik zelden QueryDefs, maar bouw recordsets e.d. in variabele omstandigheden vanuit centraal gedefinieerde en flexibele procedures op. Want hoe vaker we dingen maar één keer hoeven te doen, des te efficiënter.

Function FindRecordCount(strSQL As String) As Long

' Voor meer, zie VB - Effectief records tellen.

    Dim db     As DAO.Database

    Dim rst     As DAO.Recordset

    

    On Error GoTo Bye_Err

    

    Set db = CurrentDb

    Set rst = db.OpenRecordset(strSQL)

    If rst.EOF Or rst.BOF Then

        FindRecordCount = 0

    Else

        rst.MoveLast

        FindRecordCount = rst.RecordCount

    End If

    

Bye_End:

    Set rst = Nothing

    Set db = Nothing

    Exit Function

Bye_Err:

    MsgBox MsgErr, vbCritical, MT

    Resume Bye_End

End Function

CountFiles

Het kunnen omgaan met bestanden en mappen is één van de dingen die vaak terugkomen. Hier is er één uit mijn omvangrijke arsenaal.

CountFiles geeft het aantal bestanden in een specifieke map en (optioneel) inclusief de bestanden in de submappen.

In dit voorbeeld wordt getoond dat er geen Active-X element wordt gebruikt hetgeen erg belangrijk is.

Function CountFiles(strPath As String, Optional lngCount As Long = 0, Optional blnRecursive As Boolean) As Long

' Deze procedure telt het totaal aantal bestanden in strPath, inclusief de bestanden in subfolders.

' Bij een fout geeft de functie 0 als resulaat omdat 0 de standwaardwaarde voor een Long is.

' Daarom MOET strPath eerst worden gecontroleerd voordat de functie wordt aangeroepen.

' strPath     - Het volledige pad van de eerste map.

' blnRecursive - Indien True worden ook alle bestanden in submappen teruggegeven.

' lngCount     - De teller. Is als een 'optioneel' argument gedeclareerd omdat dit argument in de lus voor recursive

'                 aanroep moet worden meegegeven. Houdt steeds de standaardwaarde aan.

' Voor meer, zie doc FileSystem Object.

    

    Dim fso         As Object

    Dim fld         As Object

    Dim sfl         As Object

    

    On Error GoTo Bye_Err

    

    Set fso = CreateObject("Scripting.FileSystemObject")

    Set fld = fso.GetFolder(strPath)

    lngCount = lngCount + fld.Files.Count

    If blnRecursive Then

        For Each sfl In fld.Subfolders

            CountFiles sfl.Path, lngCount, True

        Next sfl

    End If

    CountFiles = lngCount

    

Bye_End:

    Set fso = Nothing

    Set fld = Nothing

    Set sfl = Nothing

    Exit Function

Bye_Err:

    MsgBox MsgErr, vbCritical, MT

    Resume Bye_End

End Function

Afdrukmoment

Op documenten hoort vaak een datum met tijd van wanneer het document is afgedrukt of gemaakt. Dit regel ik met mijn functie Afdrukmoment. Omdat in mijn applicaties documenten taal gerelateerd kunnen zijn (Nederlands en Engels), heb ik ook routines geschreven om de gehele datum-tijd reeks in het Engels terug te geven. Want de landinstellingen onder Windows kunnen maar beter met rust gelaten worden...

Voor de Nederlandse weergave worden gewoon VBA functies gebruikt.
Voorbeeldresultaat: maandag 20 augustus 2018 23:17:54

Voor de Engelse weergave zorgen mijn functies TranslateDate en FMDLongTime. Let op de hoofdletters en komma's.
Voorbeeldresultaat: Monday, August 20, 2018 23:17:54

Function Afdrukmoment() As String

' Wordt in documenten gebruikt waar Lang is ingesteld.

' Zie doc Rapporten.

    

    On Error GoTo Bye_Err

    

    Select Case Lang

        Case "NED"

            Afdrukmoment = Format(Date, "Long Date") & " " & FMDLongTime(Time)

        Case "ENG"

            Afdrukmoment = TranslateDate(Date, "Long Date") & " " & FMDLongTime(Time)

    End Select

    

Bye_End:

    Exit Function

Bye_Err:

    MsgBox MsgErr, vbCritical, MT

    Resume Bye_End

End Function