zaterdag 19 december 2015

Excel: Tijdlijn, nieuw voor draaitabellen en draaigrafieken vanaf versie 2013

In Excel 2013 is voor draaitabellen en draaigrafieken een nieuwigheid toegevoegd. De tijdlijn. Buitengewoon handig en zeer visueel.

Ik heb een voorbeeld gemaakt met de tabellen Klanten, Orders en Order details uit de database Noordenwind. In Excel 2013 kun je deze tabellen nu ook aan elkaar koppelen via Relaties, ook een leuke nieuwe functie in deze versie.

Van deze drie tabellen heb ik een draaitabel en een draaigrafiek gemaakt van de omzet per jaar per bedrijf.


Aan deze draaitabel en draaigrafiek ga ik nu een tijdlijn toevoegen.
  • Klik in de draaitabel of op de draaigrafiek.
  • Klik op Analyseren => Tijdlijn.
Er verschijnt dan een dialoogvenster:


De functie stelt automatisch vast in welke kolommen datums staan en biedt deze als keuzemogelijkheid aan.
  • Vink Orderdatum aan.
Een tijdlijn wordt dan toegevoegd, door mij hier wat groter gemaakt:


Op deze tijdlijn kunnen we dan een maand of een aaneengesloten periode kiezen (met de SHIFT toets). Draaitabel en draaigrafiek passen zich dan uiteraard automatisch aan:


Via de knop linksboven kunnen we naast MAANDEN ook nog kiezen voor JAREN, KWARTALEN en DAGEN.


En uiteraard zijn er ook meerdere Tijdlijnen mogelijk:



Bijbehorende bestand ExcelDraaitabel.xlsx is te downloaden via:

vrijdag 18 december 2015

Excel: mail versturen via outlook met VBA zonder onderbreking

Ik liep van de week tegen een probleem aan met het versturen van e-mail vanuit Excel met VBA via Outlook. Outlook wil dan voor het verzenden van elk mailtje expliciet toestemming hebben. Bijzonder lastig als je een hele serie e-mail wil versturen.

Op internet vind je dan wel oplossingen die je niet veel verder helpen. Normaal gesproken gebruik je een dergelijk script met het Send commando voor de werkelijke versturing:

With OutMail
   .To = email
   .CC = emailcc
   .BCC = emailbcc
   .Subject = "Subject"
   .HTMLBody = "Tekst"
   .Send
End With

Heel veel voorbeelden van scripts zijn te vinden bij Ron de Bruin: http://www.rondebruin.nl/win/s1/outlook/mail.htm

Het is het Send commando evenwel dat toestemming vereist van Outlook. Een alternatief is dan het Display commando in combinatie met Sendkeys:

With OutMail
   .To = email
   .CC = emailcc
   .BCC = emailbcc
   .Subject = "Subject"
   .HTMLBody = "Tekst"
   .Display
        Application.Wait (Now + TimeValue("0:00:02"))
        Application.SendKeys "%z"
End With

De gebruikte letter hier verwijst naar Verzenden. Voor de Engelse versie moeten we hier een s gebruiken.

Ook dit werkt helaas niet vlekkeloos. Voor een vlekkeloze oplossing zullen we Outlook moeten aanpassen.

Via het vertrouwenscentrum kunnen we in Outlook naar Toegang op programmeerniveau:


Normaal zijn de opties hier uitgegrijsd. Dit kun je op twee manieren wijzigen: via de registry of door Outlook te openen als administrator. Dit laatste kan door met de rechter muisknop te klikken op het starticoon en te kiezen voor Als administrator uitvoeren. Als je vervolgens Outlook opnieuw opent, ben je in staat in Toegang op programmeerniveau de onderste optie aan te vinken. Het is wel van belang om dan goede antivirus software te hebben.

Uitgebreide instructies voor het aanpassen van de registry vinden we via http://www.slipstick.com/developer/change-programmatic-access-options/

Uiteraard kan dit ook gebruikt worden om vanuit andere software als SalesForce bulkmail via Outlook te versturen.

donderdag 3 december 2015

Access: lint aanpassen met XML en VBA

Aanpak

Maak een nieuwe database met de naam Ribbon.
Maak in die database een tabel tblRibbon met de volgende velden:


Stop het volgende XML script in het veld RibbonXML.

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
    <ribbon startFromScratch="true">
      <tabs>  
        <tab idMso="TabHomeAccess" visible="true" /> 
        <tab id="Acties" visible="true" label="Mijn Tab"/>
      </tabs>
    </ribbon>
</customUI>

Met startFromScratch="true" geven we aan dat we met het lint met een schone lei willen beginnen. TabHomeAccess verwijst naar de tab Start. Die laten we zien. Verder komen we met een nieuwe, eigen tab die als id Acties heeft en als label Mijn Tab.

Type de naam HesselKoert in het veld RibbonName.
Sluit de tabel tblRibbon.

Maak een formulier met de naam frmstart.
Plaats achter de gebeurtenis Bij openen de volgende VBA code:

Private Sub Form_Open(Cancel As Integer)
    Call LoadRibbon
End Sub

Maak vervolgens een VBA functie in een module met de volgende code:

Function LoadRibbon()
    Dim strRibbonXML As String, strRibbonName As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSQL As String

    strSQL = " SELECT * FROM tblRibbon "
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL)

    strRibbonXML = rs.Fields("RibbonXML").Value
    strRibbonName = rs.Fields("RibbonName").Value

    Application.LoadCustomUI strRibbonName, strRibbonXML

    rs.Close
    Set rs = Nothing
    db.Close
    Set db = Nothing
End Function

Kies Bestand => Huidige database.
Kies bij Formulier weergeven: frmStart.
Typ bij Naam lint: HesselKoert.



Klik op OK.
Sluit de database Ribbon.
Open de database weer.

We zien dan:


Tweede voorbeeld: reduceren van de BACKSTAGE.

Met een tweede XML script reduceren we de hele BACKSTAGE, lees BESTAND. Van de reguliere tabs laten we alleen EXTERNE GEGEVENS zien.

<customUI xmlns='http://schemas.microsoft.com/office/2009/07/customui'>
      <ribbon startFromScratch='false'>
<tabs>      
<tab idMso='TabHomeAccess' visible='false'/>
      <tab idMso='TabCreate' visible='false'/>
      <tab idMso='TabExternalData' visible='true'/>
      <tab idMso='TabDatabaseTools' visible='false'/>
</tabs>
     </ribbon>
     <backstage>
      <button idMso='FileSave' visible='false'/>
      <button idMso='SaveObjectAs' visible='false'/>
      <button idMso='SaveAs' visible='false'/>
      <button idMso='FileSaveAsCurrentFileFormat' visible='false'/>
      <button idMso='FileOpen' visible='false'/>
      <button idMso='FileCloseDatabase' visible='false'/>
      <tab idMso ='TabInfo' visible='false'/>
      <tab idMso ='TabRecent' visible='false'/>
      <tab idMso ='TabNew' visible='false'/>
      <tab idMso ='TabPrint' visible='false'/>
      <tab idMso ='TabShare' visible='false'/>
      <tab idMso ='TabHelp' visible='false'/>
      <button idMso='ApplicationOptionsDialog' visible='false'/>
      <button idMso='FileExit' visible='false'/>
      </backstage>
</customUI>

Vervang het XML script in de tabel tblRibbon door het bovenstaande.

We krijgen dan:


BESTAND is dan gereduceerd tot twee opties:



Deze twee opties zijn niet uit te zetten.

Derde voorbeeld: reduceren backstage en eigen tab.

Het volgende XML script reduceert de BACKSTAGE, zet alle tabs uit en komt met een nieuwe eigen tab.

<customUI xmlns='http://schemas.microsoft.com/office/2009/07/customui'>
   <ribbon startFromScratch='true'>
    <tabs>      
      <tab id='dbCustomTab' label='Naar Excel' visible='true'>
        <group id='dbCustomGroup' label='Export'>
         <control idMso='ExportExcel' label='Export naar Excel' size ='large' enabled='true'/>
         <control idMso='PublishToPdfOrEdoc' size='large'  label='Export naar PDF' enabled='true'/>
         <button idMso='PrintPreviewClose' size='large'  label='Rapport sluiten' enabled='true'/>
       </group>
     </tab>
    </tabs>
   </ribbon>
   <backstage>
      <button idMso='FileSave' visible='false'/>
      <button idMso='SaveObjectAs' visible='false'/>
      <button idMso='SaveAs' visible='false'/>
      <button idMso='FileSaveAsCurrentFileFormat' visible='false'/>
      <button idMso='FileOpen' visible='false'/>
      <button idMso='FileCloseDatabase' visible='false'/>
      <tab idMso ='TabInfo' visible='false'/>
      <tab idMso ='TabRecent' visible='false'/>
      <tab idMso ='TabNew' visible='false'/>
      <tab idMso ='TabPrint' visible='false'/>
      <tab idMso ='TabShare' visible='false'/>
      <tab idMso ='TabHelp' visible='false'/>
      <button idMso='ApplicationOptionsDialog' visible='false'/>
      <button idMso='FileExit' visible='false'/>
   </backstage>
</customUI>

Vervang het XML script in de tabel tblRibbon door het bovenstaande.

We krijgen dan:


De laatste knop is contextueel en werkt alleen als er een rapport getoond wordt. De BACKSTAGE ziet er net zo uit als bij het vorige script.

Namen van de diverse tabs.

TabPrintPreviewAccess
TabHomeAccess
TabCreate
TabExternalData
TabDatabaseTools
TabSourceControl
TabAddIns
TabFormToolsFormatting
TabControlLayout
TabFormToolsDesign
TabFormToolsLayout
TabReportToolsFormatting
TabReportToolsLayout
TabReportToolsPageSetupLayout
TabReportToolsDesign
TabReportToolsAlignment
TabReportToolsPageSetupDesign
TabRelationshipToolsDesign
TabQueryToolsDesign
TabMacroToolsDesign
TabPivotTableDesign
TabPivotChartDesign
TabTableToolsDatasheet
TabTableToolsDesignAccess
TabAdpFunctionAndViewToolsDesign
TabAdpStoredProcedureToolsDesign
TabAdpSqlStatementDesign
TabAdpDiagramDesign

Links

http://www.accessribbon.de/

maandag 30 november 2015

Report Builder: Filtering Records With An Empty (NULL) Field

A short while ago, I got the request to filter on a field which contained, beside regular values, also NULL values. They wanted to be able to filter on NULL values as well as regular values. Choosing multiple values should be an option as well.

The direct functionality of Report Builder did not offer me a solution. SQL was needed.

My example is based on the Northwind database of SQL Server.

I created two datasets. dsRegion provides the data for the parameter parRegion. The SQL looks like this:

SELECT region FROM customers
UNION
SELECT ' Empty' 
ORDER BY region

Before ' Empty' I have put a space to get it at the top when sorted.

The parameter looks like this:


Allow multiple values is checked. Available Values is just the region in the Value field.

The SQL for the second dataset, dsCustomer, looks like this:

SELECT *
FROM
  Customers
WHERE ISNULL(region,' Empty')  IN (@parRegion)

Mind the space before Empty.

Now, the solution is there. It is possible to filter the records with no Region code as well as one or more regions.









donderdag 26 november 2015

Excel: performance of hoe optimaliseer ik grote spreadsheets III

Onderzoek bij een groot bedrijf: Excel binnen netwerk

Na een onderzoek bij een groot bedrijf in Zwolle naar performance problemen bij het gebruik van Excel, is me eens te meer duidelijk geworden dat we onderscheid moeten maken tussen de performance van losse spreadsheets en de performance van Excel in een netwerkomgeving met veel gebruikers.

In dit geval is er sprake van een Citrix omgeving. Probleem hier is dat diverse servers regelmatig onderuitgehaald worden het gebruik van Excel. De oorzaken waren niet duidelijk.

Bevindingen

Na onderzoek blijkt Excel door een beperkt aantal mensen met enige regelmaat gebruikt te worden voor het analyseren van zeer grote hoeveelheden data (tot wel een miljoen regels). Gevolg: zeer grote bestanden met flinke aantallen berekeningen. Zowel laad- als opslagtijd lopen dan flink op. Ook het herberekenen van formules leidt tot een forse piekbelasting. Binnen de Citrix omgeving ondervinden andere gebruikers hier flink last van.

Aanbevelingen

Excel is in de eerste plaats een instrument voor ad hoc toepassingen: kleinere rekenmodellen met grafieken en overzichten maar met beperkte hoeveelheden data. Hoewel het pakket zich er wel voor lijkt te lenen, is het binnen een netwerk-omgeving niet geschikt voor data-analyse met grote hoeveelheden opgeslagen data.

Concrete mogelijkheden

  • Het gebruik van de standaard add-in Power Pivot zou het gebruik van externe (lees o.a. CSV) aanmerkelijk versnellen en de gebruikte Excel bestanden ook veel kleiner kunnen houden.
  • Er kunnen in Excel ook koppelingen gelegd worden via Analysis Services (SSAS); ook dat houdt de bestandsgrootte beperkt.
  • Bij gebruik van grote hoeveelheden data met veel bewerkingen is het raadzamer over te schakelen op Access
  • Automatisch herberekenen uitzetten, al kan dit tot misverstanden leiden. Normaal gesproken is dit bij kleinere modellen ook niet nodig.
  • Foutcontrole op achtergrond uitzetten leidt bij grotere bestanden tot een geringere belasting.












Access: koppelen aan tabellen uit de SQL Server

Access kan zijn gegevens ook aan een externe database ontlenen. Hier gaan we bekijken hoe we Access kunnen koppelen aan de SQL Server.

Allereerst hebben we een ODBC koppeling naar de juiste database in SQL Server gemaakt.

Vervolgens kiezen we in Access de tab EXTERNE GEGEVENS.
Dan kiezen we ODBC-database.

We krijgen:



We klikken de onderste optie aan.
We klikken op OK.

We krijgen:



We kiezen Computergegevensbron.
We kiezen daar de juiste Data Source Name.
Hier kiezen we in ons geval Noordenwind.

We krijgen dan:



We kiezen daar de bovenste acht tabellen.
We klikken dan op OK.

Het volgende dialoogvenster verschijnt dan:



Het is van belang dat we hier een uniek record-id kiezen. Doen we dit niet, dan zijn de tabellen niet bij te werken in Access!

Kies voor elke tabel een unieke sleutel en klik op OK.

Als we dit proces volttoid hebben, verschijnen alle gekoppelde tabellen in Access.



Desgewenst kunnen we de namen van de tabellen nog aanpassen door bijvoorbeeld dbo_ weg te halen. Dit heeft verder geen invloed op de koppeling.

We kunnen de koppeling desgewenst bijwerken door op de tab EXTERNE GEGEVENS te klikken op Koppelingsbeheer.



We klikken daar de juiste bestanden.
We klikken op OK.

De koppelingen zijn dan vernieuwd.



We sluiten ten slotte het vorige scherm.

vrijdag 30 oktober 2015

Excel: Which Graph To Show?

The question is how can somebody just pick the graph he/she wants to see without seeing the other graphs? Nice to have for your Excel dashboard.

Something like this:


How did I do this?

I created one sheet called graphs with three different graphs. Then I created three names One, Two and Three referring to a range containing the graphs One, Two and Three respectively. Like this:

one = graphs!$G$1:$O$16
two = graphs!$G$17:$O$33
three = graphs!$G$33:$O$48

On a second sheet called whichgraphtoshow in cell A2 I then created a picking list containing one, two and three.

Yet another name refers to this cell:

graphLookup =INDIRECT(whichgraphtoshow!$A$2)

On the same sheet I then inserted a picture. The picture refers to the name graphLookup

And it is all working!

You can download ExcelWhichGraphToShow.xlsx via:

https://drive.google.com/folderview?id=0B7HgkOwFZtdZVmhRQUZFM28yc1U&usp=sharing

donderdag 22 oktober 2015

Excel: performance of hoe optimaliseer ik grote spreadsheets II

Excel en performance

Ik krijg de laatste tijd herhaaldelijk verzoeken om een blik te werpen op Excel spreadsheets die te traag en onhandelbaar zijn geworden. Men vraagt mijn dan als VBA expert, maar is VBA altijd de (enige) oorzaak?

Laten we eens de factoren op een rijtje zetten die invloed hebben op de snelheid.

Grootte van het bestand.

Dit is misschien wel de belangrijkste factor. Zodra een bestand erg groot wordt, kan het opslaan en openen erg lang gaan duren. Het XML formaat heeft bestanden weliswaar flink verkleind, maar tegelijkertijd is het grotere aantal rijen en kolommen ook een uitnodiging geweest nog veel meer gegevens op ter nemen.

Herkomst van de data.

Data kunnen verschillende herkomst hebben, bijvoorbeeld:

  • In Excel zelf; voorbeeld 121.317 regels uit SalesOrderDetail van AdventureWorks: grootte 9.625 kb.
  • Koppeling met een ander Excel bestand.
  • Via Microsoft Query en ODBC; voorbeeld 121.317 regels uit SalesOrderDetail van AdventureWorks: grootte 9.414 kb.
  • Via Power Query en SQL Server; voorbeeld 121.317 regels uit SalesOrderDetail van AdventureWorks: grootte 9.536 kb.
Wat betreft grootte ontloopt het elkaar dus niet zo veel. Wel zijn data die via externe verbindingen binnenkomen zo te filteren dat Excel ook alleen die data bevat die uitgefilterd zijn. SalesOrderDetail gefilterd op ProductId 777 is nog maar 35 kb groot. Via een Excel eigen filter filteren maakt voor de bestandsgrootte vrijwel niets uit.

Excel formules.

Er is een aantoonbaar verschil in performance tussen verschillende functies die wel het zelfde resultaat hebben. Zo is de functie INDEX sneller dan VERT.ZOEKEN. Kunnen we het een en ander testen? Jawel! De voorbeelden zijn op snelheid van uitvoering te vergelijken met behulp van VBA routines. 

Excel draaitabellen

Draaitabellen kunnen een Excel bestand veel groter en trager maken. Een simpel voorbeeld met een draaitabel op basis van de tabellen Product en
SalesOrderDetail uit Adventureworks. Direct in Excel: grootte bijna 17 MB. Via PowerPivot: iets meer dan 7 MB.

VBA routines.

Veel VBA maakt een bestand niet veel groter en trager. Wel maakt het uit wat er met VBA gedaan wordt. Zo maakt het wat betreft snelheid enorm uit of we een kolom met getallen via een VBA loop procedure optellen of dat we daarvoor de reguliere Excel functie SOM gebruiken. Zo kan het binnen VBA veel schelen via WorksheetFunction een beroep te doen op reguliere Excel functies. Ook kunnen we de werklast slim verdelen: het rekenwerk in Excel zelf en de variatie van bijvoorbeeld parameters met VBA.

Bestandsformaat.

Excel kent de formaten XLSX, XLSM en XLSB. Ze zijn vergelijkbaar in die zin dat ze allemaal ZIP bestanden zijn. We kunnen de inhoud zichtbaar maken als we de extensie vervangen door ZIP en ze vervolgens openen. XLSB is niet XML-gebaseerd based maar in een binair formaat. En dat is vooral voordelig als je met grote bestanden werkt. 

XLSX en XLSM bestanden laden vier keer langzamer dan XLSB en het opslaan ervan durt twee keer zo lang. Het uiteindelijk bestand is anderhalf keer zo groot.  Getest met een Excel bestand met tienduizend rijen en duizend kolommen met simpele formules.

Bij een Excel bestand dat zijn gegevens via PowerPivot ophaalt, kon ik geen verschil zien tussen opslag in XLSB of XLSX.

Het enige echte nadeel van het XLSB formaat is compatibiliteit: als er gewerkt met software die XML nodig heeft in plaats van binair.

Alle formaten ondersteunen dezelfde functionaliteit.

Tips.

  • Volgens mij is het belangrijkste punt bij Excel dat je de inhoud beperkt moet houden. Doe je dat niet, dan kan zeker in combinatie met bepaalde berekeningen, kunnen de bestanden heel erg traag worden.
  • Als je gebruik maakt van externe gegevens uit een database, laat dan - in het geval grote hoeveelheden data - de berekeningen zoveel mogelijk in de database doen en niet in Excel zelf. Als we Excel zelf de berekeningen uit laten voeren zal bij elke verandering vaak heel veel formules opnieuw doorgerekend moeten worden.
  • Draaitabellen kunnen wel tot honderd keer of meer sneller rekenen dan functies als SOMMEN.ALS.
  • Gebruik PowerPivot voor draaitabellen. Uiteraard zorgt dit instrument ervoor dat de data in de database blijven. De draaitabel maakt het Excel bestand niet veel groter. 
  • Een normale draaitabel maakt het bestand wel veel groter maar dit is aan te passen door bij de Optie voor draaitabel de optie Brongegevens bij bestand opslaan uit te zetten.
  • Opslag als binair bestand, XLSB, verkleint grote bestanden aanzienlijk en maakt laad- en opslagtijd korter. 
Voor verder Excel tips klik hier.

dinsdag 6 oktober 2015

DATA: VAN DATA NAAR RAPPORT: EEN CHECKLIST

1 Inleiding

Als we een rapport moeten maken, ligt de focus vaak vooral op de uitkomst van de analyse en de presentatie daarvan. Allerlei andere zaken die noodzakelijk zijn voor een rapport, komen vaak gedurende het maakproces aan de orde. We gaan deze zaken hier onder de loep nemen.

2 De toegankelijkheid van de data

Het is een basisvoorwaarde voor een rapport dat de data beschikbaar en analyseerbaar zijn.

Waar komen de data vandaan?
Data kunnen uit diverse bronnen komen. Ze kunnen opgeslagen liggen in databases, in losse bestanden zoals Excel en bestanden in CSV formaat, van webpagina’s komen of zelfs los verzameld moeten worden.

Hebben we directe toegang tot de data? 
Data kunnen opgeslagen liggen in databases van derden waarbij het de vraag is of we rechtstreeks bij deze data kunnen of dat het indirect moet gebeuren via koppelingen (zoals ODBC) of exportbestanden (zoals CSV, EXCEL).

Hebben we een overzicht van de structuur van de data?
Als data niet direct toegankelijk zijn, bijvoorbeeld doordat ze opgeslagen liggen in databases van derden, is het de vraag of we in beeld hebben hoe deze data gemodelleerd zijn. Veel leveranciers van databases willen bijvoorbeeld geen relatieschema verstrekken. Een relatieschema geeft een beeld van de inhoud van tabellen en de relaties tussen de tabellen.

Hieronder een simpel voorbeeld van een relatieschema.


Hebben de data het juiste formaat?
Als we bijvoorbeeld berekeningen of grafieken willen maken, moeten de data dat wel mogelijk maken.

3 Karakter van rapporten: ad hoc vs. statisch

Bij rapporten is het erg belangrijk welke eisen er aan de inhoud wordt gesteld.

Is de relatie tussen data en weergave betrekkelijk statisch? 
Denk bijvoorbeeld aan facturen. Een factuur kan weliswaar naar data verschillen maar de weergave van deze data is behoorlijk eenvormig.

Is de relatie tussen data en weergave betrekkelijk dynamisch? 
Denk bijvoorbeeld aan draaitabellen en draaigrafieken waarbij steeds andere data tegen elkaar uitgezet moeten kunnen worden.

Is de weergave sterk geparametriseerd?
Het kan van belang zijn veel verschillende filters in te kunnen stellen. Veel keuzemogelijkheden maken het mogelijk data vanuit verschillende perspectieven te bekijken. Ook kan het van belang zijn delen van het rapport facultatief zichtbaar of onzichtbaar te kunnen maken.

4 Weergave van rapporten

Bij rapporten kan de focus vooral liggen de inhoud maar ook de vormgeving kan belangrijk zijn?

Willen we de data cijfermatig weergeven en/of grafisch?
Is de vormgeving van een rapport van belang?

5 Verspreiding van rapporten

Bij rapporten is het van belang dat anderen deze kunnen inzien. De vraag is natuurlijk hoe dat inzien geregeld moet worden.

Moet een rapport bijvoorbeeld op gezette tijden verspreid worden?
We willen natuurlijk voorkomen dat we handmatig rapporten moeten verspreiden.

Welk medium hebben we nodig voor elk rapport?
We kunnen dan denken aan papier, PDF en web formaat.

Moet een rapport algemeen beschikbaar zijn?
Als een rapport steeds ter inzage moet zijn, moeten we hier voor zorgen door ze bijvoorbeeld via het web beschikbaar te maken.

Moet een rapport extern verspreid worden?
Dat stelt andere eisen aan de vormgeving.

6 Toegankelijkheid van rapporten

Het is niet vanzelfsprekend dat elk rapport voor iedereen toegankelijk is.

Moet elk rapport voor iedereen toegankelijk zijn?
We kunnen dan denken aan een indeling door middel van een inlogprocedure en leesrechten.

7 Onderhoudbaarheid van rapporten

Als rapporten klaar zijn is de mate van onderhoudbaarheid van belang. Statische rapporten zullen minder onderhoud vergen dan ad hoc rapporten.

Hoe is het onderhoud van elk geregeld? Extern of intern?
Hebben rapporten een complexe vormgeving?

8 Documentatie van het rapport

Rapporten dienen gedocumenteerd te zijn.

In welke informatiebehoefte voorziet het rapport?
Uit welke bronnen komen de data?
Welke data zijn er gebruikt?
Hoe zijn de data eventueel bewerkt?
Denk hier aan allerlei berekeningen.

Is er een beschrijving van de opbouw van het rapport?

9 Welke tools?

Er is in de markt diverse software beschikbaar om rapporten te maken. We noemen een aantal belangrijke: Crystal Reports, Cognos, Business Objects, Reporting Services/Report Builder, Qlikview, MS Excel en MS Access.

Het is lastig een nuchtere en objectieve beoordeling te geven van deze instrumenten. In feite is het veel belangrijker voor de gewenste rapporten de punten 2 tot en met 8 in kaart te brengen. Daarna kunnen we veel beter vaststellen welke instrumenten zich het beste lenen voor de gestelde eisen.

woensdag 23 september 2015

Friesland: oude grafzerken in de kerk van Wolsum weer tevoorschijn

Kerk van Wolsum

De huidige kerk van Wolsum is gebouwd in 1867. De kerk is de vervanger van een middeleeuws exemplaar. Van deze middeleeuwse kerk is een tekening uit het jaar 1703 bewaard gebleven.


Uit deze oude kerk is een aantal eeuwenoude grafzerken overgebleven. In 1962 zijn er door Harmen de Vries foto's genomen van deze oude zerken. De teksten van deze zerken zijn om onbekende reden nooit eerder gepubliceerd. Nu ligt de vloer opnieuw open; het interieur van de kerk wordt momenteel gerestaureerd.

Op 23 september 2015 zijn een aantal leden van de grêfskriftekommisje in de kerk geweest om de huidige stand van de zerken te inventariseren. Dit heeft het volgende opgeleverd.

De familie Remstra

1. Een grote steen van de familie Remstra, genoemd naar het gehucht Remswert.

Foto Melle Koopmans

Op deze steen de volgende teksten:

Mary Sybrens huisvrouw van Lieuwe Uijlkes leit hier begraven

Dese vier graven naest malkander die zullen niet mogen geopent worden voor het iaer 1812

Anno 1712 den 20 iannawary is in den heere gerust den eersame ionghling Lieuwe Uijlkes Remstra out int eenentwintigste iaer en leit alhier begraven

Anno 1680 den 25 december is in den heere gerust de eersame Bauke Lieuwes out ontrent 20 iaer en leit alhier begraven

Onduidelijk is welke vier graven er precies bedoeld zijn. De eerstgenoemde Lieuwe Uijlkes was in 1640 eigenaar van stem 10 te Oudega. De jongeling Lieuwe Uilkes is de zoon van het echtpaar van grafzerk 2 en 3 en hun enige kind. Mary Sybrens hertrouwt in 1655 met Gerben Wygers. Onduidelijk is van wie Bauke Lieuwes een zoon is; in 1660 was Lieuwe Uijlkes al overleden.

2. Grafzerk Uilke Lieuwes Remstra, zoon van Lieuwe Uijlkes en Mary Sybrens

Foto: Maikel Galama

Anno 1713 den 23 december is seer christelijk in den heere ontslapen den eersamen Uijlke Lieuwes Remstra out int 76 iaer en leit alhier begraven

3. Grafzerk Trijntje Siemens Hiddema, vrouw van Uilke Lieuwes

Foto: Maikel Galama

Anno 1731 den 4 septemb is seer christelijck in den heere ontslapen de eerbare Trintie Symens Hiddema huisvrouw van de eersame Uijlke Lieuwes Remstra out 75 iaer en leit alhier begraven

Dese 7 graven zullen nooit mogen geopent worden als no 1 no 2 no 3 no 4 no 5 no 6 en 7

Deze zeven graven hebben we nu niet meer aangetroffen. Van bovengenoemd echtpaar is ook een zilveren wierookvat, geschenk aan de katholieke kerk, bekend met de tekst:

Uiltje Lieuwes Reemstra en Trintie Simons Hiddema syn wyf 1725

Duidelijk is nu dat de echtgenoot toen al overleden was. Uijlke Lieuwes was volgens de stemkohieren van 1698 (mede-)eigenaar van vijf boerderijen.

Stem 14 in Nijland voor 1/5
Stem 16 in Nijland voor 1/4
Stem 10 in Oudega voor 2/3
Stem 18 in Oudega
Stem 5 in Wolsum

Hij is gebruiker of meier van stem 18 te Wolsum.

Het echtpaar overleed zonder kinderen. Er schijnt een hele juridische strijd te zijn gevoerd over de erfenis.

De familie Bangma

4. Grafzerk van Eelke Okkes, zijn kinderen gebruiken de naam Bangma van zijn vrouw

Foto Melle Koopmans

Aoo 1763 den 12de april [is in] den heere gerust de eersame Eelke Okkes in leven [ontfanger] en [kerckvoogd] van den dorpe Wolsum en ... van de ... en van ... oud in het twee en seeventigste jaar en leit hier begraaven

De tekst is deels weggekapt. Een klein deel van het weggekapte is nog wel te ontcijferen.

5. Grafzerk Grietje Johannes Bangma, vrouw van Eelke Okkes

Foto Melle Koopmans

Anno 1752 den 29 augustus is in de heere gerust de eerbaare Grietie Johannus Bangma in leven eghte huisvrouw van de [ontfanger] Eelke Ockes tot Wolsum oud 65 jaar en leid alhier begraven

6. Grafzerk van hun zoon Lolke Eelkes

Foto Melle Koopmans

Anno 1727 den 2 november is seer schierlijk in den heere gerust Lolke Eelkes de soen van de [ontfanger] Eelcke Ockes en Grietie Iohannes Bangma out 8 iaar en 9 dagen en leit alhier begraven

Drie andere kinderen van dit echtpaar steken in de barre winter van 1740 met paard en slee de toenmalige Zuiderzee over. We weten dit omdat er zilveren lepels bewaard zijn gebleven met de volgende teksten:

Johannes Eelties 25 febr. 1740 's morgens van Wolsum met peerd en slee over de zee naar Enckhuijsen gereden 's avonds weer thuis

Gerbrig Eelties 25 febr. 1740 's morgens van Wolsum met peerd en slee over de zee naar Enckhuijsen gereden 's avonds weer thuis

1740 den 27 feb. 
Ocke Eelties  
s'morgens van Wolsum wij reeden 
na Enkhuzen met peerd en sleeden 
Over de zee met groot gedruis 
en kwamen ook s avonds thuis

De predikanten in de toren

In de toren liggen drie grafzerken van predikanten die ooit in Wolsum gestaan hebben. Deze grafzerken waren al bekend. We willen ze hier tocht meennemen.

7. Grafzerk Cornelius Johannes

Foto Melle Koopmans

Hier leit begraven de eerwaerdige godtsalige ende welgeleerde Cornelius Iohannes dienaer des goddelicken woorts van de gemeente tot Wolsem out 82 iaeren in den heere gerust den 12 september anno 1640

8. Grafzerk Suffridus Rodenhuis

Foto Melle Koopmans

Ao 1714 den 20en martij is seer christelijk in den heere ontslapen den eerwaerden en godtsaligen dnus Suffridus Rodenhuis in leven bedienaer des goddelijken woords in de dorpen Wolsum en Westhem nadat hij tot Gaastmer twee en alhier vijftien iaeren sijn i...nts getrouw hadde waargenomen oldt int 42 iaer ende leit alhier begraven

9. Grafzerk van Hugenoot Izaak Cahais

Foto Melle Koopmans

Ao 1785 den 13 augustus stierv de weleerw: [heer] Isaac Cahai in den ouderdom van ruim 64 jaaren nadat zijn eerw: den tijd van ruim 40 jaaren deze gemeente in leere en wandel getrouw hadde voorgeligt, zijn sterflijk deel ligt hier begraven, wagtende eene zalige opstandinge

Verdwenen grafzerken?

Volgens de foto's uit het archief van Tresoar (1962?) hadden we nog drie grafzerken verwacht.

10. Grafzerk Gerben Wygers




Anno 1660 den 22 februaris is in de heere gerust den eersamen G[er]ben Wygers olt ontrent 44 iaer ende leit hier begraven

Deze Gerben Wygers was de tweede echtgenoot van Mary Sybrens op de eerste grafzerk.

11. Grafzerk Gerck Ha... dochter




Anno [16].. Den 29 juli is [in den heere] gerust Gerck Ha… dochter huisfrouwe Cornelij Johan[nes]  predecant tot Wolsum ende is hir begraven oldt 86 iare

Zij was dus getrouwd met predikant Cornelis Johannes van grafzerk nummer 7. We hebben haar volledige naam nog niet kunnen achterhalen. Wel dat dit echtpaar in 1592 te Sneek een dochter liet dopen met de naam Aleyt.

12. Tweede grafzerk Mary Sybbrens




Foto Melle Koopmans


Het brokstuk dat we in de kerk gevonden hebben, blijkt te passen bij deze zerk. De volledige tekst wordt dan:

Anno 1680 den 7 aprilis is in de heere gerust de eerbaere Mary Sybbrens dochter die wedue van Lieuwe Ulckes out ontrent 65 iaer ende leit alhier begraeven

Opmerkelijk is dat Mary Sybbrens op twee grafzerken als begravene voorkomt: grafzerk 1 en 12.

Mogelijk komen de laatste zerken, waar we nu alleen de foto's van hebben, alsnog tevoorschijn.

vrijdag 18 september 2015

Access: Smart Object Names Combined With Smart VBA Functions

Introduction

When I create object in Access I try to be as consistent as possible. For instance, when I create a table containing customers, I create names like this:

Object
Name
Table
tblCustomers
Form
frmCustomers
Query
qryCustomers
Command button
cmdCustomers

It is not just that I like the Hungarion Notation (invented by Simonyi Károly from Hungary), it also enables me to use smart functions while programming VBA.

Smart Functions

For instance when I create a command button which should lead me to the form frmCustomers, I call the command button cmdCustomers. After that I attach a function to the On Click event:


Because it refers to the active control, it will automatically transfer the name of the command (cmdCustomers) tot the function cmdCommandClick.

The VBA of the function cmdCommandClick looks like this:

Public Function cmdCommandClick(strFrmName As String)
     DoCmd.OpenForm "frm" & Mid(strFrmName, 4)
End Function

So, now I can easily copy such a command button, change the name and it will automatically go to the right form.

I created another function, FormOpenSource, to automatically attach the right Record Source to the form. This function is attached to the On Load event:


The VBA of the function FormOpenSource looks like this:

Public Function FormOpenSource(objFrm As Form)
    Dim tblName As String
    tblName = "qry" & Mid(objFrm.Name, 4)
    
    'use the query if there is one, otherwise the table
    If DCount("[Name]", "MSysObjects", "[Name] = '" & tblName & "'") = 1 Then
        objFrm.RecordSource = "qry" & Mid(objFrm.Name, 4)
    Else
        objFrm.RecordSource = "tbl" & Mid(objFrm.Name, 4)
    End If
End Function

In this case the function would look for a query qryCustomers and if it does not exist, it will look for tblCustomers.

Just a couple of examples to make programming Access VBA easier and faster.

dinsdag 8 september 2015

Access: Overcoming The Max Length (64) of DoCmd.TransferText

The Problem

The other day I ran into a problem with DoCmd.TransferText: it will not accept text files having longer names that 64 characters. Possibly, because 64 characters is the maximum length of an object name in Access.

You will get an error message:



So I tried to find a work around.

My Work Around

First, I created a table in Access to store information about the text files, in this particular case, CSV files.

The I created a VBA script which actually store the information in the table

strMapCSV = CurrentProject.Path & "\"

Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(strMapCSV)

For Each f1 In f.files
 If Right(f1.Name, 3) = "csv" And Left(f1.Name, 4) <> "file" Then
   strSQL = "insert into tblCSVfiles (CSVname, CSVsize,CSVdate,CSValias) "
   strSQL = strSQL & " VALUES ('" & Replace(f1.Name, "'", "`") & "'," & f1.Size & ", #" & f1.DateLastModified & "#,'" & "file" & intCounter & ".csv')"
   db.Execute (strSQL)
   intCounter = intCounter + 1
 End If
Next

So, in the table tblCSVfiles all CSV files got an alias like file1.csv etc.

Every time the script is rerun, which is actually done autamatically in this case, the script removes the existing aliasses:

'remove aliasses
Set f = fs.GetFolder(strMapCSV)
 For Each f1 In f.files
   If Left(f1.Name, 4) = "file" Then
     Set f = fs.getfile(strMapCSV & f1.Name)
     f.Delete
  End If
Next

The script also empties the table tblCSVfiles:

db.Execute ("delete from tblcsvfiles")

After that I let the script copy the existing CSV files to their aliasses file1.csv etc.

 'copy CSV's
 intCounter = 1
 Set f = fs.GetFolder(strMapCSV)
  For Each f2 In f.files
    If Right(f2.Name, 3) = "csv" Then
      Set f = fs.getfile(strMapCSV & f2.Name)
      f.copy strMapCSV & "bestand" & intCounter & ".csv"
      intCounter = intCounter + 1
    End If
 Next

After that, I can pick any file from the table tblCSVfiles and use the alias to refer to the shorter named CSV version.

Problem solved.

An Even Better Work Around

As I posted my solution, I received an even better idea from Jack Stockton: the FileSystemObject has both a ShortPath and ShortName.

The much shorter code looks like this:

strMapCSV = CurrentProject.Path & "\"

Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(strMapCSV)
    
For Each f1 In f.files
 If f1.Name = "NOVIBAT_14454_20150615_030440-1234567890_1234567890_1234567890_1234567890_1234567890_1234567890_1234567890.csv"  Then
   strFile = f1.ShortName
 End If
Next

DoCmd.TransferText transfertype:=acImportDelim, _
SpecificationName:="glans", _
tablename:="tblGlans", _
FileName:=strMapCSV & strFile, _
hasfieldnames:=False




maandag 31 augustus 2015

Friesland: Skeeler Elfstedentocht 2015

Het elfstedenregister

Iedereen die een elfstedentocht zoals op de skeelers heeft volbracht, kan zich aanmelden bij mijn elfstedenregister.

De skeeler-elfstedentocht groep

Iedereen die meegedaan heeft aan of geïnteresseerd is in de tocht kan zich aansluiten bij de groep.

De voorbereiding

Vorig jaar heb ik de elfstedentocht gewandeld en met de kano afgelegd. Dit jaar stond voor mij in het teken van de stepelfstedentocht. Die wilde ik halen en dat is gelukt.

Maar dan was er ook nog de skeeler elfstedentocht op 29 augustus ... Dat zou mijn vijfde verschillende elfstedentocht kunnen worden.

Ik heb sinds 1997 duizenden kilometers geskeelerd. Misschien wel zo'n 25.000 totaal. Qua techniek geen probleem. De afgelopen jaren heb ik onder andere door de training voor de andere elfstedentochten weinig kilometers op de skeelers gemaakt. Zou dit zowel lukken?

    Bartlehiem skeelertocht 10 jaar geleden

Eind mei, direct na het halen van de stepelfstedentocht heb ik nieuwe skeelers gekocht met wielen van 110 millimeter. Ik had moeite aan die hoogte te wennen en viel nog regelmatig terug op mijn oude vijfwielers. Alles bij elkaar tot aan de fietsvakantie nog maar ruim 300 kilometer getraind.

Toen we begin augustus terugkwamen van onze fietsvakantie (ruim 1000 kilometer over Oostduitse kasseien) heb ik de 110 millimeter vervangen door 90 en kreeg ik de slag weer echt goed te pakken. In augustus nog zo'n 370 kilometer getraind. Langste afstand 52 en behoorlijk stuk na afloop. Al met al gaf dat weinig vertrouwen.

Aan de andere kant de datum viel vroeger dan andere jaren en dat is weer gunstig. Half september ontstaan er door het warme IJsselmeerwater vaak buien. Bij mijn weten heeft geen enkele van de door IJsclub de Polder georganiseerde tochten het droog gehouden. Met als dieptepunt de tocht van 2013. Verder is het eind augustus ook al redelijk licht rond de start.

De weersvoorspellingen in de week voor de tocht waren bijzonder goed: weinig wind, geen regen en niet al te warm. Kortom, je weet maar nooit. En toen mijn vriendin aanbood me met de auto te begeleiden, heb ik de knoop doorgehakt. We wagen een poging. En lukt het niet, dan probeer ik het nog eens in 2017. Ook een mooie manier om een beeld te krijgen van het parcours en de omstandigheden.

Tijd voor een checklist

Veel extra sokken
WD 40 spuitbus
Imbus sleutel
Bananen
Energierepen
Energiedrank
Extra skeelers
Compeed pleisters tegen de blaren

Start Bantega - Stavoren: : wegdek uitstekend, laatste stuk iets minder.

Vier uur uit bed, eten en op pad. Half zes zijn we in Bantega. Ik vraag her en der eens rond. Veel mensen rijden op 100 millimeter wielen. Toch zie ik ook een enkeling met drie wielen van 125 millimeter. Zelfs de skeeler met vijf wielen blijkt nog in gebruik.

                                                Bij de start; toch nog aardig donker

Ik kijk eens rond en mis Gerard Kleinjans, die ik me van vroegere tochten herinner. Afgehaakt? De enige bekende die ik zie is Frans Wiersema. We hebben beide deelgenomen aan de stepelfstedentocht. Jetze Buma, die ik ken van de wandelelfstedentocht, had ik ook verwacht, maar die heeft op het laatste moment afgezegd. In Bolsward wordt me duidelijk waarom. 

Verder heb ik de deelnemerslijst eens doorgenomen. Veel kilometervreters. Zo tel ik meer dan twintig deelnemers aan het rondje IJsselmeer. Het rondje was wel 350 kilometer! Ook veel mensen die terug te vinden zijn in schaats- en skeeleruitslagen. De meesten komen dus welbeslagen ten ijs.

Rond zessen begint het aardig licht te worden. Rijden bij daglicht! We starten in twee groepen met elk twee fietsers als voorrijders. Het eerste stuk gaat zeer voorspoedig. Goed asfalt, weinig klinkers. Alleen stukje bij Tjerkgaast. Het laatste stuk naar de eerste stop, de Middelweg, kent wat slechter asfalt. Ook trekt de zuidenwind op dat moment aan. Ik voel het gelijk, maar het gaat nog prima. 

De tweede groep bij de stop voor Stavoren

Bij de stop staat mijn vriendin. Ik vul de energierepen en -drank weer aan. De organisatie staat er ook met hapjes en drankjes. Perfect geregeld allemaal

Stavoren - Bolsward: wegdek uitstekend op een paar stukjes na.

In Stavoren is het even oppassen. De Koeweg is smal. Pas in Molkwerum volgt het eerste lange stuk klinkers. Niet prettig. Ik kan niet goed met klinkers overweg. Nooit een ster in geweest. Tot aan Workum gaat het vervolgens voortvarend. We gaan om Hindeloopen heen over een prachtige asfaltweg.

In Workum zelf wordt letterlijk en figuurlijk stilgestaan bij het overlijden van de schoonzoon van deelnemer Sijmon Lemstra. Ik had zijn verhaal al onder het rijden te horen gekregen. Erg triest.

In Workum zelf is ook nog even een vervelend stukje klinkers maar dat mag geen naam hebben. Na Workum volgen we de Freerk Faberweg binnendoor naar Parrega, een mooi betonpad. Af en toe worden we via het gras ingehaald door de motorrijders van de organisatie. Hier gaat het even fout. Een motorrijder gaat onderuit en kwakt op het beton. Gelukkig is hij goed ingepakt.

Vanaf Parrega naar Bolsward loopt ook soepel. Dan stop twee met hapjes en drankjes en vriendin weer paraat. Ik voel me nog steeds goed. Ik ga toch een eind komen. Wel even droge sokken aan.

Vlak voor de stop bij Bolsward; naast mij Frans Wiersema

Bij de stop in Bolsward staat ook Jetze Buma. Hij heeft al negen keer aan de skeeler elfstedentocht meegedaan: zeven keer vanuit Bantega en  twee keer de editie van Pieter Kamstra uit Wommels die de tocht in de jaren negentig organiseerde. Jetze blijkt onlangs geopereerd. Er is een defibrilator geplaatst om hartritmestoornissen tegen te gaan. Hopelijk kan hij over twee jaar weer meedoen.

Bolsward - Franeker

Vanaf Bolsward gaat het weer voorspoedig. Ik begin te twijfelen aan alle verhalen over slecht asfalt en veel klinkers. Dan komt Arum en daar liggen wel veel klinkers. Het stuk is zo lang dat ik enigszins achterop raak. Geen conditionele kwestie. Ik kan gewoon slecht uit de voeten op klinkers. Voorbij Arum is het asfalt weer goed. Een man in het rondje IJsselmeer shirt heeft op me gewacht en ik ben snel weer bij. 

Wel valt me hier voor het eerst op dat de voorfietsers - alle lof trouwens - niet goed anticiperen op deze stukken. Men gaat in hetzelfde tempo door. Mij lijkt het beter op goede ondergrond de vaart er in te houden en op slechte ondergrond het tempo te minderen. Maar dat gebeurt niet. Bij Harlingen krijgen we weer een stukje klinkers en dan een flink viaduct. Je ziet dan het peleton aardig uiteenvallen. 

We volgens het fietspad langs de weg. Voor het eerst is de kwaliteit van het asfalt langdurig slechter. Kennelijk mogen we niet over de weg waar het wegdek een stuk beter is. Erg druk is het er ook niet.

Stop bij Franeker: zitten lukt nog prima; buurman heeft last van zijn voeten

Wel bereiken we zonder kleerscheuren de volgende stop. Mijn vriendin heeft de stoel voor me klaar staan. Het begint nu warmer te worden. Ik trek mijn jasje uit. Voel me nog steeds goed maar de kilometers beginnen toch te tellen door dat slechtere asfalt. Ik krijg daardoor ook hete voeten. Schone sokken helpen.

Franeker - Bartlehiem

Na de stop in Franeker gaan we mooi om de stad heen. Geen klinkers, mooi asfalt. Keurig geregeld. daarna het fietspad op naar Dronrijp. Het asfalt is hier weer slechter, maar het tempo blijft gelijk. Dan een valpartij. Mensen blijven achter. Op een gegeven moment passeert ons iemand met een rondje IJsselmeer shirt aan. Hij gaat de fietsers vragen wat vaart te minderen. Dat lijkt even te helpen al waren ze naar zijn zeggen niet blijk met zijn verzoek.

Dan weer een valpartij. Nu voor mij. Een wat oudere man die al flink in het verband zit. Ik weet te ontwijken door het gras in te duiken. Achter mij doet iemand hetzelfde. Er wordt geroepen dat er mensen zijn gevallen. Vanuit het busje wordt de valpartij ook wel gesignaleerd, maar de voorfietsers gaan onverminderd door. 

Ik wil wat drinken maar mijn fles blijkt tijdens de duik in het gras weg gerold te zijn. Het wordt warmer en ik schat hoe ver het nog is naar Bartlehiem. Maar af en toe iemand vragen om een slok. Vervelend. Ik moet nu juist flink blijven drinken.

Na Beetgumermolen volgt slecht asfalt. Kilometers lang. Ik zie dat mensen het zwaarder beginnen te krijgen. Zelf merk ik nu ook dat mijn conditie niet voldoende is. En ik krijg ook nog hete voeten. Na Stiens volgt nog eens een slecht stuk asfalt. Er vallen steeds meer gaten in het peleton. De voorfietsers blijven stug het zelfde tempo aanhouden. 

Ik krijg nog wat drinken van iemand en dan komen we bij het pad naar het bruggetje van Bartlehiem. Dat pad is erg smal en er valt niet of nauwelijks te skeeleren. Schuifelend sluiten we aan in de file voor de brug. Er zit al iemand met zijn voeten in de Dokkumer Ee.

Ik trek mijn skeelers uit. Gaat veel makkelijker met die moderne schoenen. Op kousevoeten passeer ik het peleton. Na het bruggetje wil ik de skeelers weer aan trekken. Dat lukt nauwelijks vanwege de hevige kramp in mijn kuit. Een slecht teken. Ik ben verre van fit meer.

Bij de stop staan mijn vriendin en Ritske, een oude vriend. De stoel staat weer klaar. Daar ben ik aan toe. Ik drink gelijk een hele fles leeg en begin aan de tweede. Ritske heeft er een hard hoofd in of het gaat lukken als ik me nu zo voel. Ik zeg dat ik ieder geval Dokkum wil halen en dan waarschijnlijk stop.

Bartlehiem - Bartlehiem

Het peleton vertrekt weer en ik sluit me aan. Ik heb nu evenwel zo'n last van mijn rug dat ik niet meer dieper kan zitten. Na twee kilometer trek ik de conclusie. Ik stop. Als ik dan toch mijn wel verwachte Waterloo moet vinden dan het liefst in Bartlehiem.

Bartlehiem: met Ritske de Jong

De bezemwagen stopt ook en vraagt of ik meewil. Ik heb mijn vriendin al gebeld en die gaat me oppikken. Ze rijden verder. Bij haar in de auto krijg ik geweldige kramp in mijn rechter bovenbeen. Het is mooi geweest. Toch maar 130 kilometer gedaan.

Conclusie

Ik heb nu aan vier verschillende elfstedentochten meegedaan. Voor mijn gevoel is dit de zwaarste, maar hij is te doen. Ook voor mij, al moet ik dan wel een stuk meer gericht getraind hebben.

De organisatie is heel goed. Grote bewondering hoe goed ze overal hun best op hebben gedaan en hoe goed alles verzorgd is. Wel heb ik al opmerkingen gemaakt over de voorfietsers. Het lijkt mijn beter het tempo aan te passen aan de kwaliteit van het wegdek. Ook het slechte stuk asfalt naar Stiens is mogelijk te vermijden.

En ten slotte het bruggetje van Bartlehiem. Ik ben er vlakbij geboren. Vaak genoeg gezien. Nu was het file lopen alleen maar erg hinderlijk. Via Stiens en Hallum naar Bartlehiem is veel beter asfalt. Ook dan is er alle gelegenheid het bruggetje te bekijken.

Hoe dan ook, in 2017 ben ik er ijs en weder dienende weer bij en rijd ik hem uit!

Bezoek ook het elfstedenregister: http://www.walmar.nl/elfsteden.asp?skeeleren=ja