MAGAZINE SOFTWARE DEVELOPMENT NETWORK

Maat: px
Weergave met pagina beginnen:

Download "MAGAZINE SOFTWARE DEVELOPMENT NETWORK"

Transcriptie

1 MAGAZINE SOFTWARE DEVELOPMENT NETWORK 6 & 7 OKTOBER A.S. SDN CONFERENCE Conferentiecentrum Leeuwenhorst Noordwijkerhout SCHRIJF NU IN! IN DIT NUMMER O.A.: C#3.0: Van Delegate naar Lambda < First Look at Advantage Database Server 9 < Silverlight2: MSN Video ListBox < Delphi for.net: Writing User-Defined Functions for Blackfish Databases < Data Centric Services met ADO.NET Data Services < Nummer 98 Augustus 2008 SDN Magazine verschijnt elk kwartaal en is een uitgave van Software Development Network 98

2 Advertentie Sybase ianywhere / Elmo ICT Systems

3 Colofon Uitgave: Software Development Network Zeventiende jaargang No. 98 augustus 2008 Bestuur van SDN: Remi Caron, voorzitter Rob Suurland, penningmeester Joop Pecht, secretaris Mark Vroom, vice-voorzitter Redactie: Rob Willemsen Aan dit magazine werd meegewerkt door: Maurice de Beijer, Mark Blomsma, Remi Caron, Leon Carpay, Marcel van Kalken, Stefan Kamphuis, Marcel Meijer, Johan Parent, Joop Pecht, Maarten van Stam, Bob Swart, Louis vd Tol, Robertjan Tuit, Marianne van Wanrooij, Rob Willemsen en natuurlijk alle auteurs! Listings: Zie de website voor eventuele source files uit deze uitgave. Vormgeving en opmaak: Reclamebureau Bij Dageraad, Winterswijk Alle rechten voorbehouden. Niets uit deze uitgave mag worden overgenomen op welke wijze dan ook zonder voorafgaande schriftelijke toestemming van SDN. Tenzij anders vermeld zijn artikelen op persoonlijke titel geschreven en verwoorden zij dus niet noodzakelijkerwijs de mening van het bestuur en/of de redactie. Alle in dit magazine genoemde handelsmerken zijn het eigendom van hun respectievelijke eigenaren. Adverteerders Sybase ianywhere/ Elmo ICT Systems 2 Sira Holding b.v. 16 Aladdin 19 Logica 20 Giraffe 27 4DotNet b.v. 32 Bergler Nederland b.v. 42 Avanade 48 ianywhere Solutions/ a Sybase company 63 Furore 64 Adverteren? Informatie over adverteren en de advertentietarieven kunt u vinden op onder de rubriek Magazine. En was het schrikken? Of toch de gehoopte, aangename verrassing, dat nieuwe uiterlijk van het SDN-magazine? We hebben de indruk dat de nieuwe layout in het algemeen zeker als een vooruitgang wordt ervaren, en dat doet ons deugd natuurlijk. We hebben geprobeerd om in dit magazine een aantal verbeterpunten door te voeren, zoals de manier waarop de tips worden weergegeven - die te veel uitstraalden alsof ze bij het nevenstaande artikel behoorden - en de manier waarop code-listings worden weergegeven. Het laatste woord zal er nog niet over zijn gesproken, maar we hopen zo op een agile manier tot 98% tevredenheid te komen, want 100% zal vast een utopie blijken. Een van de inhoudelijke vernieuwingen die ingezet is binnen het SDN, te weten van Developer naar Development, krijgt in dit magazine zijn gestalte. De nieuwe networks, of tracks, of secties of hoe je ze ook wilt noemen, zijn vertegenwoordigd. Robertjan Tuit doet voor het User experience network de aftrap met Silverlight2 MSN Video ListBox waarin hij laat zien dat desktop en browser steeds dichter bij elkaar komen, inclusief realtime data-binding. Hij ontkomt er vanuit de UX-achtergrond natuurlijk niet aan om ook stil te staan bij templating en styling, maar presenteert zijn informatie nog in behoorlijke mate in de richting van de developer. Misschien om de overgang voor de reguliere SDN-er niet te plots te maken. Databases is de naam van het 2e nieuwe network dat vanaf nu in het SDN-magazine vertegenwoordigd is. Het artikel van Cary Jensen & Loy Anderson, First Look at Advantage Database Server 9, gaat hier natuurlijk heel specifiek over, dat mag duidelijk zijn. Maar ook de bijdrage van Holger Flick, Delphi for.net: Writing User-Defined Functions for Blackfish Databases heeft, zoals de titel duidelijk maakt, een link met databases. Zo wordt eens te meer geïllustreerd dat de tijden achter ons liggen dat een developer het zich kon veroorloven zich enkel te focussen op zijn eigen kunstje, al is het verkleinwoord een understatement voor wat men binnen 1 omgeving kan/kon presteren. En deze constatering geldt al evenzeer voor designers en architecten, wat onderstreept wordt door het eerder genoemde artikel van Robertjan Tuit (voor designer en developer), maar ook door de bijdrage van het 3e nieuwe network, Architecture, in deze editie van het SDN-magazine, nl. Data Centric Services met ADO.NET Data Services van de hand van Roy Cornelissen, ook al zo n cross-over tussen 2 aandachtsgebieden. Daarnaast houden we gelukkig nog heel veel interessants over van de networks die we al (wat) lang(er) koesteren binnen het SDN. Maar ook daar zie je steeds meer mixen ontstaan. Lezen over Delegates en Lambda Expressies (zie het artikel van Mark Blomsma) is net zo goed interessant voor C#-ers als voor VB-ers als voor Delphi-ers en zou eigenlijk verplichte leesstof moeten zijn voor alle professionele en serieuze developers. Ook al kun je wellicht het gepresenteerde niet direct toepassen in je eigen werkomgeving - kun je dat overigens zo noemen, je werkomgeving, want dat suggereert toch een beetje dat er maar 1 omgeving is? - het kennis nemen van concepten in andere omgevingen is altijd nuttig, tenminste als je zelf bij wil blijven bij wat er om je heen gebeurt. En dat zelfde geldt voor de manier waarop je je software documenteert (zie het artikel van Stephan Smetsers) en zo kan/moet ik eigenlijk de overige artikelen in dit rijtje opnemen, omdat zij alle hun eigen bijdrage kunnen hebben om je kennis en inzichten in design & development van software uit te breiden. Kijk dus over de schutting! Op het moment dat dit magazine je brievenbus binnenglijdt, klopt het volgende SDN-event ook al aan bij je voordeur: de SDN Conference van dat event dat we vorig jaar nog SDC 2007 noemden. Maar als je door dit blad heen bladert, zal je moeilijk kunnen ontgaan dat het toch echt gaat gebeuren, en wel op 6 & 7 oktober. Dus zorg dat je erbij bent! Kunnen we het meteen ook even van persoon tot persoon hebben over wat je nog meer of anders zou willen zien in dit vernieuwde SDN-magazine. En misschien heb je wel een briljant idee voor de 100e uitgave van het blad dat volgend jaar op de rol staat Veel & verfrissend leesplezier! Rob Willemsen, voorwoord magazine voor software development 3

4 Inhoud 03 Voorwoord Rob Willemsen 04 Inhoudsopgave 05 C# 3.0 Van Delegate naar Lambda Mark Blomsma 09 Een Eigen Gridje Is zo Eenvoudig nog Niet Marcel van Kalken 17 Softwaredocumentatie met Sandcastle Stephan Smetsers 21 DotNetNuke Maintenance Power Tips Lee Sykes 24 IEnumerable, de basis voor LINQ Mendelt Siebenga 28 First Look at Advantage Database Server 9 Cary Jensen & Loy Anderson 34 SDN Conference: overzicht sprekers en sessies 36 Interesting Things: Core Sander Hoogendoorn 37 Silverlight2 MSN Video ListBox Sander Hoogendoorn SDN CONFERENCE 2 DAYS SOFTWARE DEVELOPER CONFERENCE 6 & 7 OKTOBER 2008 CONFERENCE.SDN.NL 41 Agenda VSTO 3.0 en Word Content Controls Maarten van Stam 49 ASP.NET onder de Motorkap: Het Provider Model Nader Bekeken Michiel van Otegem 50 NAV+VSTO+WPF+LINQ = OBA Marianne van Wanrooij 55 Data Centric Services met ADO.NET Data Services Roy Cornelissen 60 Delphi for.net: Writing User-Defined Functions for Blackfish Databases Holger Flick

5 .NET VISUAL C# Mark Blomsma C#3.0: Van Delegate naar Lambda C# is een taal waar delegates een belangrijke rol spelen. Events zijn een bijzondere implementatie van delegates. In C# 2.0 zijn anonymous delegates ofwel anonymous methods geïntroduceerd en met de komst van C# 3.0 is er weer iets nieuws: Lambda expressies. Lambda expressies zijn een nieuwe notatie voor delegates. Al met al is het dus belangrijk om goed te begrijpen wat delegates zijn en doen om te begrijpen hoe Lambda expressies werken. In dit artikel zullen we kijken naar de evolutie van mogelijkheden en syntax als het gaat om delegates in C#. Een wereld zonder delegates Je kunt een hoop bereiken zonder delegates. Listing 1 laat zien hoe uit een lijst met 9 nummers alleen de even nummers worden geselecteerd. Het resultaat wordt vervolgens middels databinding in een listbox getoond (de volledige code is te downloaden op de SDN site). List<int> _numbers = new List<int> 1, 2, 3, 4, 5, 6, 7, 8, 9 ; private void btnnodelegates_click (object sender, EventArgs e) List<int> result = GetEvenNumbers( _numbers ); this.lstresult.datasource = result; private List<int> GetEvenNumbers( List<int> numbers ) List<int> result = new List<int>(); foreach ( int i in numbers ) if ( i % 2 == 0 ) // if i matches the filter // then add it to the result result.add( i ); return result; Een delegate declaratie is de beschrijving van de signatuur van een methode soortgelijke toepassing ook werkt met een List van klanten, of een Data Table met klanten. Het is niet onwaarschijnlijk dat je in staat wilt zijn om te kunnen filteren op verschillende criteria. Bijvoorbeeld: geef me alle oneven nummers, of alle nummer deelbaar door 3. Of als het gaat om klantobjecten: je wilt b.v. niet (alleen) filteren op klantnaam, maar ook op plaats of klantnummer. Met de aanpak van listing 1 betekent dit meerdere methodes die allemaal erg veel op elkaar lijken. We willen dus eigenlijk een generieke selecteerfunctie maken en aan de selecteerfunctie een parameter meegeven. Maar wat moet die parameter dan zijn? Wat is een delegate? Wikipedia definieert een delegate als volgt (excuus voor het Engels, maar er is geen Nederlandse definitie): A delegate is a form of type-safe function pointer used by the.net Framework. Delegates specify a method to call and optionally an object to call the method on. They are used, among other things, to implement callbacks and event listeners. Mijn persoonlijke definitie is: Een delegate declaratie is de beschrijving van de signatuur van een methode. Listing 1: Filteren zonder delegates De code werkt en hoewel er in dit voorbeeld wordt gewerkt met een generic List met integers, kun je je denk ik wel inbeelden dat een De signatuur van een methode bestaat uit de return value en de typen van de parameters, inclusief de volgorde van de parameters. Voor mij helpt het om te denken dat een delegate een interfacebeschrijving is van een enkele methode. Een interface beschrijft welke methodes, magazine voor software development 5

6 .NET VISUAL C# events en properties een class moet implementeren. Je kunt een interface gebruiken als type voor een parameter of een return type. Op een zelfde manier definieert een delegate wat het return type van een methode moet zijn en wat de parameters, typen en volgorde van parameters van een methode moeten zijn. // delegate print matches any method // that returns void and takes one // paramter of type string delegate void Print(string s); class WhatIsADelegate // matches delegate Print public void PrintToPaper( string text ) // matches delegate Print private void PrintToConsole( string t ) /// filter criteria and needs to be included in /// the result. /// </summary> delegate bool Filter( int x ); private List<int> Select ( List<int> numbers, Filter filter ) List<int> result = new List<int>(); foreach ( int i in numbers ) // invoke the delegate to see if // the number needs to be part of the result if ( filter( i ) == true ) // if i matches the filter // then add it to the result result.add( i ); return result; // matches delegate Print internal void DumpToLog( string s ) // no match public void DumpToLog( string s, int loglevel ) // no match internal string FormatToUpper( string s ) return s.toupper(); Listing 2: Voorbeeld delegates Listing 3: Select met delegate In Listing 3 zien we dat de Select methode nu een resultaat levert zonder zelf te weten wat de filtercriteria zijn. In C# 3.0 is het werken met delegates vereenvoudigd zodat je zeer eenvoudig de delegate kunt aanroepen. In listing 3 zie je dat we de filter variabele gebruiken alsof het een methode is. Voorheen was het noodzakelijk om filter.invoke(i) te doen. In C# 3.0 is het werken met delegates vereenvoudigd zodat je zeer eenvoudig de delegate kunt aanroepen We kunnen nu methodes gaan schrijven die we als filter meegeven aan de Select-methode. In listing 2 zien we declaratie van de delegate Print. Deze delegate matcht met elke methode die void als return type heeft en een enkele string als parameter accepteert. De methodes PrintToPaper, PrintToConsole en DumpToLog matchen allemaal met de Print delegate, ongeacht de toegankelijkheid (public, internal, private) van de methode. De overload op Dump ToLog met twee parameters is geen match en FormatToUpper heeft het verkeerde return type en is dus ook geen match. Ok, we kunnen dus een delegate declareren en we weten welke methodes een match zijn met een delegate, maar wat kun je er dan mee? Terug naar het oorspronkelijke probleem: selecteren en filteren. Filteren met delegates We willen de GetEvenNumbers methode vervangen door een meer generieke methode Select. Zoals eerder gezegd, een delegate kan gebruikt worden als een parameter type, dus aan de Select-methode geven we de list met nummers mee en als tweede parameter een delegate gedeclareerd als Filter. /// <summary> /// The filter delegate takes an integer as a parameter /// and returns a boolean value. /// The return value is TRUE if the integer matches the /// <summary> /// Return true if the number is even. /// </summary> private bool IsEvenNumber( int number ) return ( number % 2 == 0 ); /// <summary> /// Return true if the number is odd. /// </summary> private bool IsOddNumber( int number ) return ( number % 2!= 0 ); private void btndelegateisevennumber_click ( object sender, EventArgs e ) // IsEvenNumber is a method matching the // Filter delegate List<int> result = Select( _numbers, IsEvenNumber ); this.lstresult.datasource = result; 6 MAGAZINE

7 .NET VISUAL C# private void btndelegateisoddnumber_click ( object sender, EventArgs e ) // IsOddNumber is a method matching the // Filter delegate List<int> result = Select( _numbers, IsOddNumber ); this.lstresult.datasource = result; private void btnlambda1_click ( object sender, EventArgs e ) // create delegate using Lambda expression Filter evennumbers = number => ( number % 2 == 0 ); List<int> result = Select( _numbers, evennumbers ); this.lstresult.datasource = result; Listing 4: Filteren met delegates In listing 4 zien we dat de IsEvenNumber en IsOddNumber beide een boolean waarde teruggeven en een integer als parameter accepteren, met andere woorden, ze zijn een match met de Filter delegate en kunnen als parameter meegegeven worden aan de Select-methode. Ook hier zien we vereenvoudiging in de syntax: je kunt gewoon de naam van de methode als parameter meegeven, een beetje alsof het een reference naar de methode is. Voorheen had je het volgende in moeten intikken: private void btnlambda2_click ( object sender, EventArgs e ) // use Lambda expression inline List<int> result = Select( _numbers, x => ( x % 2 == 0 ) ); this.lstresult.datasource = result; Listing 6: Lambda expressies vervangen anonieme methodes List<int> result = Select( _numbers, new Filter(IsEvenNumber) ); Dit is nog steeds wat er gebeurt. De compiler creëert nog steeds een delegate object, je hoeft alleen minder te tikken. Listing 6 laat zien dat we een Lambda expressie kunnen toekennen aan een delegate variabele en als dat kan, dan kunnen we natuurlijk ook een Lambda expressie inline in een methode aanroep plaatsen. Dus wat gebeurt er precies? Anonymous methods: De methode zonder naam - 1 In C# 2.0 is een feature toegevoegd die anonymous methods genoemd wordt. Voor C# 2.0 was de enige manier om een delegate te declareren om een named method ofwel een methode met naam te gebruiken, zoals we hebben gezien in listing 4. Een anonieme methode is een block met code die inline gedefinieerd wordt en als delegate parameter wordt meegegeven. private void btnanonymousdelegateevennumbers_click ( object sender, EventArgs e ) // create an anonymous method to test for even numbers List<int> result = Select( _numbers, delegate( int number ) return ( number % 2 == 0 ); ); this.lstresult.datasource = result; Listing 5: Anonieme methode als delegate In listing 5 zien we dat we wederom de Select-methode uit listing 3 aanroepen, maar dit maal met als tweede parameter delegate( int number ) return ( number % 2 == 0 );. Het delegate keyword geeft aan dat we een delegate willen creëren; de delegate method heeft een paramater van het type integer en de body van de methode is een enkele regel code met als resultaat een boolean waarde. Hoewel dit erg effectief is, is het niet erg leesbaar. Aan het begin van dit artikel zei ik al dat Lambda expressies ook delegates zijn. Lambda expressies hebben tot doel dit soort code leesbaarder te maken. Lambda: De methode zonder naam - 2 Om de code in listing 5 beter leesbaar te maken is in C# 3.0 het concept van Lambda expressies geïntroduceerd. Alle Lambda expressies maken gebruik van de nieuwe Lambda operator =>. Je kunt deze lezen als goes to of gaat naar. De linkerzijde van de Lambda operator bevat de input parameters en de rechterzijde een expressie of een code block. Een Lambda expressie kan toegekend worden aan een delegate type. number => ( number % 2 == 0 ) We geven met deze Lambda aan dat er een input variabele is genaamd number. We doen een modulo 2 op deze parameter en vergelijken het resultaat met nul. Merk op dat er geen return statement is. Een Lambda bevat meestal maar 1 regel code, maar kan er meer hebben. Omdat onze Lambda uit maar 1 regel code bestaat hoeven we geen accolades te gebruiken om de scope van het block aan te geven. Tevens hoeven we geen return keyword te gebruiken. De volgende Lambda laat zien dat we het nummer eerst willen ophogen alvorens te delen door 2. We moeten nu het return keyword toepassen. number => number++; return number % 2 == 0; ; Hoewel we nergens parameter types aangeven controleert de compiler wel degelijk op types. Als we de Lambda veranderen in: number => ( number % 2 ) Dan is de return value ineens van het type integer in plaats van boolean. De compiler geeft nu een error om aan te geven dat de Filter delegate een boolean verwacht. LINQ en Lambdas Lambda expressies zijn een korte en bondige manier om een anonieme method ofwel delegate te definiëren. Ze worden veel gebruikt in de andere nieuwe feature van C# 3.0: LINQ. Nu je snapt wat ze zijn en doen zul je beter begrijpen wat er gebeurt als je een LINQ query uitvoert. Op basis van de code die we nu hebben, hebben we al bijna een mini versie van onze eigen LINQ implementatie gemaakt. public static List<int> Select ( this List<int> numbers, Filter filter ) List<int> result = new List<int>(); foreach ( int i in numbers ) // invoke the delegate to see if // the number needs to be part of the result if ( filter( i ) == true ) magazine voor software development 7

8 .NET VISUAL C# // if i matches the filter // then add it to the result result.add( i ); return result; Listing 7: Select als een extension method Een andere feature van C# 3.0 is extension methods. Met een extension method kun je een method toevoegen aan een bestaande class. Een extension method is altijd static en heeft alleen toegang tot de public methoden en properties van een object. Je maakt een static method tot een extension method door aan de eerste parameter in de parameterlijst het this keyword toe te voegen. In listing 7 zien we dat de Select-methode nu een extension is geworden van een willekeurig object van het type List<int>. 6 & 7 oktober a.s.: SDN Conference 35 sprekers 100 sessies. Schrijf nu in! Als we dit combineren met de Lambda die we in listing 6 hebben gebouwd krijgen we listing 8. private void btnextensionmethodfind_click ( object sender, EventArgs e ) // use extension method with Lambda List<int> result = _numbers.select( x => ( x % 2 == 0 ) ); this.lstresult.datasource = result; Listing 8: Select als een extension method Dit ziet er al bijna hetzelfde uit als wat LINQ doet. Natuurlijk is LINQ veel krachtiger omdat het veel generieker is opgezet en niet alleen op List<int> werkt (de meeste LINQ extensies werken op IEnumerable<T>), maar het idee is wel hetzelfde. Tot slot We hebben gezien hoe delegates zijn gegroeid van benoemde methodes naar anonieme methodes naar Lambda expressies. Aan het einde van de dag zijn Lambdas niks meer dan een bondige manier van het definiëren van een delegate.links The Blomsma Code: Anonymous Methods: Lambda Expressions: Information Worker TIP: De snelste manier om SharePoint te laten crashen SharePoint is een heel stabiel en betrouwbaar systeem, ontworpen om (honderden) duizenden users te bedienen, dat onder normale omstandigheden nooit crasht. Toch, als u zich verveelt of wilt laten ontslaan, zet dan een Page Viewer WebPart in de Home page van de Portal, en configureer de URL van de WebPart met een pointer naar zich zelf. Het resultaat is een prachtig Droste effect, de CPU van de servers loopt onmiddellijk naar 100% en het geheugen wordt langzamerhand gevuld totdat de servers onherroepelijk crashen: Mark Blomsma Mark Blomsma is een software developer, solutions architect, auteur and spreker gespecializeerd in Microsoft.NET technologieen als C#, WF, WCF, WPF, Silverlight en ASP.NET. Hij heeft meer dan 14 jaar ervaring in de IT en werkt is werkzaam voor zijn eigen bedrijf, Develop-One (www.develop-one.com). Hij heeft 5 Microsoft MVP awards ontvangen voor zijn bijdrage aan de software ontwikkel community. NB 1: Probeer het niet in een productie server NB 2: De enige manier om de schade te repareren is de WebPart direct vanaf de DataBase te verwijderen (Content DataBase, WebParts Table) (Met dank aan Gustavo Velez) 8 MAGAZINE

9 DELPHI Marcel van Kalken Een Eigen Gridje Is zo Eenvoudig nog Niet... Een klant van mij vroeg me wat schermen van hun programma op te poetsen door de grid-schermen te voorzien van de mogelijkheid om op kolommen te sorteren. Geen rare gedachte, aangezien dat in de wereld die Windows heet nou eenmaal heel gebruikelijk is. Denk aan Outlook, Excel, etc. Maar omdat de schermen met gridjes opgebouwd waren uit ListViews was deze ombouw nogal een tijdrovende klus. Dus werd besloten om de ListViews, waar veel programmeerwerk in zat, te vervangen door een commerciële grid-component. De DevExpress-grid Een paar jaar geleden was ik al eens in de weer geweest met de gridcomponent van DevExpress, en na het downloaden en bekijken van de demo werd besloten dat deze het zou worden. Ik wist nog van de oude versie (3) dat de grid omgeven werd door een werkelijk enorme hoeveelheid properties om de werking en het uiterlijk aan te passen, dus werd meteen besloten om er een eigen (sub)class van te maken, zodat niet elke ontwikkelaar in het team zich hoefde te bemoeien met de eigenschappen en de uiterlijkheden van de grid. Na installatie nestelde de (enorme) hoeveelheid componenten waaruit de grid bestaat zich prima in de IDE van Rad Studio Even een nieuwe Win32-app gemaakt, en een grid op het scherm gekwakt, en het volgende staat voor je neus: cxgrid1level1: TcxGridLevel; cxgrid1: TcxGrid; private Private declarations public Public declarations Om te bepalen wat we uiteindelijk met de grid willen bereiken zullen we eerst deze versie maar eens tot leven brengen en kijken wat-ie kan. Er staat vast wel ergens een NorthWind.mdb op de schijf, dus maar even een TAdoConnection, TAdoQuery, en een TDatasource op het form gezet, ConnectionString gemaakt, en de query gevuld met select * from customers. En alles met elkaar verbonden, en op connected en active gezet Da s gek. Normaal zie je met een TDbGrid dan meteen je data in beeld. Het is ook even zoeken naar het Datasource-property van het cxgrid. Het blijkt een property te zijn van cxgriddbtableview1.datacontroller. Achteraf ook logisch, aangezien de grid ook unbound moet kunnen functioneren. Maar nog steeds geen kolommen in beeld. Hoewel de scroll-bar van de grid me laat zien dat er wel beweging in is gekomen: Grappig. Het ziet ernaar uit dat de grid uit een samenstelling van componenten bestaat. Even met F12 aan de andere kant kijken bevestigt dit: type TForm1 = class(tform) cxgrid1dbtableview1: TcxGridDBTableView; magazine voor software development 9

10 DELPHI Blijkbaar moet altijd de inhoud van de grid met de hand worden bepaald. Dat is overigens niet zo moeilijk; een dubbelklik op de grid of een klik op Customize opent een editor waarin met een knop Retrieve fields alle velden uit de dataset kunnen worden opgepikt. Tijd om het oude TDbGrid van het scherm te halen om het cxgrid de ruimte te geven. En even runnen om te zien wat die allemaal standaard in huis heeft, en wat we daarvan willen gaan gebruiken. paneeltje dat zichtbaar wordt onder de grid, op het moment dat een filter actief is. Erg leuk, maar zonde van de schermruimte. Wel jammer dat, zonder dit paneeltje, niet echt duidelijk is dat er een filter op een bepaalde kolom actief is. Al met al ziet na een paar klikken het scherm er al indrukwekkend uit: Groeperen Het meest opvallende aan de grid is een paneeltje boven de grid waarin staat Drag a column here to group by that column. Proberen dus. Het veld (kolom) Country leent zich hier wel voor, want daar kun je wel een paar gebruikers blij mee maken, denk ik. Blijkbaar weten ze bij DevExpress ook wel dat hun grid een scala aan mogelijkheden heeft Als je, zoals je in Outlook gewend bent, op een kolomkop klikt, zie je meteen dat er op de betreffende kolom gesorteerd wordt. Da s mooi. Net zoals het omgekeerd sorteren, en middels de shift-toets het sorteren op meerdere kolommen. De opgelegde sortering is ook keurig zichtbaar met pijltjes in de kolomkoppen. Alleen jammer dat bij sorteren op meerdere kolommen niet duidelijk is welke kolom nou als eerste (of tweede) is gebruikt. Nu met een echte database Toch eens even kijken. We bouwen allemaal programma s voor klanten die iets meer moeten kunnen dan het weergeven van een testbestandje of een cd-verzameling. Laten we dus hetzelfde traject maar eens doen met een volwassen database, met een kleine 2 miljoen records in één van de tabellen. Zo gezegd, zo gedaan, even wat IBX componenten op het scherm, en de Interbase-database eronder gezet. En dan eens kijken of het nog steeds lekker loopt: Als je de muis over de kolomkoppen beweegt, zie je een kleine button verschijnen (anders dan die van het sorteren). Erop klikken geeft een lijst met waardes die zich in de onderliggende kolom bevinden, en waarop je dus kunt filteren. Ook erg handig: Aaaarrrrgggghhhh!. En het ging zo lekker. Tijd om de help er maar eens bij te pakken. En die help is omvangrijk. Blijkbaar weten ze bij DevExpress ook wel dat hun grid een scala aan mogelijkheden heeft, want het help-bestand heeft een omvang die evenredig is met het aantal mogelijkheden van de grid. Net zoals het aantal samples dat wordt meegeleverd. En daarmee houdt het niet op, hun website heeft een support-centre waar het uitstekend zoeken is naar eerdere vragen of problemen die andere gebruikers daar eerder hebben neergelegd. Gelukkig maar, want het blijkt dat het niet allemaal even simpel is wat de makers hebben bedacht. De custom optie geeft een dialoog waarin een samengesteld filter kan worden gebouwd. Ook erg leuk, maar misschien wat too much voor de gemiddelde gebruiker. Even een korte uitleg over de opbouw van de grid. Zoals uit het eerste probeersel bleek, bestaat de grid uit (tenminste) 3 componenten: een Grid, een Level, en een View. De grid is niet meer dan een omhulsel met wat (weinig) algemene zaken. Het Level is bedoeld om binnen een Grid een ander Grid te kunnen weergeven. Een soort parent-child relatie. En de View is er om de weergave binnen dat Level te bepalen. Er kan worden gekoppeld aan data (bound of unbound), en ingesteld worden hoe de records weergegeven worden, maar behalve het platte grid -model zijn er nog andere (Cards) weergave - mogelijkheden. Even testen: en ja, dit werkt alleen gebeurt er niks Later maar eens kijken of dit eraf gehaald kan worden. Net zoals een Na enig zoeken in de help en voorbeelden blijkt dat de grid standaard probeert om alle records naar binnen te slobberen, om zodoende de mogelijkheid tot sorteren, groeperen en filteren te bieden. Sorteren 10 MAGAZINE

11 DELPHI heeft namelijk geen zin als je maar een fractie van de onderliggende data in huis hebt. Net als filteren. Het klinkt erg aanlokkelijk om het cxgrid al deze zaken automatisch te laten verzorgen, maar als programmeur wil je toch proberen te voorkomen dat bij wijze van spreken de complete harde schijf van een server over het netwerk wordt getrokken. onder de naam SdnGridUnit.pas. Hierna maken we (File-New- Package Delphi for Win32) een package dat we meteen opslaan met de naam SdnPack. Met de rechtermuis op SdnPack.bpl (in de project manager) kiezen we add en voegen zo de unit toe met de class van hierboven. Daarna via rechtsklik kiezen voor build, gevolgd door install en we zien: Het geheim zit in de property GridMode van de DatamodeController, die zelf weer een property is van de DataController. Als je deze property wijzigt, ziet de code van je form er als volgt uit: object cxgrid1dbtableview1: TcxGridDBTableView NavigatorButtons.ConfirmDelete = False DataController.DataModeController.GridMode = True DataController.DataSource = DataSource1 Dus zo moeilijk is dat niet aan te passen. Tijd om het spul weer eens te runnen. En inderdaad staat het scherm er in tienden van seconden, zoals we van een grid (en Delphi) gewend zijn. En het klikken op een kolomkop kan nog steeds alleen gebeurt er niks. Idem voor het filteren. En het groeperen op een kolom-kop heeft tot resultaat dat de hele tabel weer opgehaald wordt, en dus eindigt met een out-ofmemory boodschap. Dat laatste willen we zeker niet laten gebeuren, en het sorteren en filteren moet gewoon lekker op de database server gebeuren. Misschien biedt subclassen een oplossing. Subclassing We beginnen met een gewone subclass van de grid: TSdnGrid = class(tcxgrid) private Private declarations protected Protected declarations public Public declarations constructor Create(AOwner: TComponent); override; destructor Destroy; override; published Published stuff procedure Register; implementation Register Helaas, zo gemakkelijk komen we hier niet mee weg. Als we ons SDNgrid op een form zetten, staan alle properties nog keurig zoals bij het standaard cxgrid. En na wat aanmodderen bij de Create van de class TSdnGrid blijkt dat het hier niet mogelijk is om te gaan sleutelen in de eigenschappen van het Level of de View die bij de grid hoort. En wel om de heel eenvoudige reden dat deze beide steunpilaren bij de Create van de grid nog niet bestaan. De conclusie is dan ook dat we meteen het Level en de View ook tot een eigen subclass maken. Na wat aanmodderen kom ik erachter dat deze subclasses niet meteen als standaard Level en View door het SDN-grid worden geaccepteerd. Je moet je eigen Level en View aan de grid kenbaar maken door ze als default Level en View te benoemen. De hele class ziet er dan zo uit: TSdnLevel = class(tcxgridlevel) TSdnRootLevel = class(tcxgridrootlevel) TSdnView = class(tcxgriddbtableview) TSdnTableViewInfo = class(tcxgridtableviewinfo) TSdnRowsViewInfo = class(tcxgridrowsviewinfo) TSdnGrid = class(tcxgrid) Al met al is het een hele lap. En het enige dat ik hiermee heb bereikt is dat ik een volledige grid heb (met View en Level) die klaar is om van onze eigen standaard kenmerken en gedrag te worden voorzien. Het wordt dan tijd om te zoeken naar de plek om de grid (of eigenlijk, de view) te dwingen standaard in GridMode=true te gaan. We maken daarom een override van de create van ons eigen TSdnView: constructor TSdnView.create(AOwner: TComponent); begin inherited create(aowner); if not assigned(datacontroller) then exit; if not assigned(datacontroller.datamodecontroller) then exit; Datacontroller.DataModeController.GridMode := true; procedure Register; begin RegisterComponents('SdnStuff',[TSdnGrid]); Let wel op dat het op deze manier een property is die altijd(!) wordt gezet, ook als je hem in design time zelf op false op zet. Maar in dit geval is het wel wat ik wil, dus kan ik ermee leven. De grid draait nu in ieder geval prima op een grote dataset. Het begin is er. constructor TSdnGrid.create(AOwner: TComponent); begin inherited create(aowner); destructor TSdnGrid.Destroy; begin inherited destroy; end. Volgens Bartjens zou alles prima kloppen, dus slaan we de unit op Kolommen maken Nu maar verder gaan met het wensenlijstje waaraan mijn grid moet voldoen. Om te beginnen met het maken van de kolommen op het moment dat er runtime geen kolommen te bekennen zijn. En natuurlijk het opslaan (en weer ophalen) van de kolommen op het moment dat iemand de kolommen wijzigt. Op zoek dus naar zoiets als een OnDatasourceActiveChanged event. Het blijkt niet eenvoudig. Het komt erop neer dat we nog meer van de TcxBlaBla classes moeten subclassen om zodoende een Active- Changed event tot onze beschikking te hebben. Die vinden we terug in de DataProvider, en die is weer een onderdeel van de DbDataController. Dus we gooien nog twee subclasses in de strijd: magazine voor software development 11

12 DELPHI TSdnDataController = class(tcxgriddbdatacontroller) protected function GetDataProviderClass: TcxCustomDataProviderClass; override; public Public declarations constructor Create(Aowner: TComponent); override; TSdnDBDataProvider = class(tcxdbdataprovider) protected procedure ActiveChanged(AActive: Boolean); override; constructor TSdnDataController.create(Owner:TComponent); begin inherited create(owner); function TSdnDataController.GetDataProviderClass: TcxCustomDataProviderClass; begin Result := TSdnDBDataProvider; procedure TSdnDBDataProvider. ActiveChanged(AActive: Boolean); begin inherited ActiveChanged(AActive); De initialisation wordt uitgebreid met: RegisterClass(TSdnDataController); Nou, we hebben nog vrijwel geen functionaliteit toegevoegd, maar wel 8 classes de wereld in geholpen. Mocht iemand opmerken dat het geheel wel redelijk ingewikkeld in elkaar zit, dan ben ik het daar grondig mee eens! Maar goed, we waren gebleven bij het maken van kolommen, en het opslaan en ophalen van instellingen. Nu we een eigen subclass hebben met die TSdnDbDataProvider kunnen we die een OnActiveChanged event geven waaraan we, vanuit onze eigen View-class, een procedure kunnen plakken. Dit doen we vanuit de View, aangezien op dit niveau alles bekend is qua kolommen, en omdat de View zelf wat procedures in zich heeft om de kolommen op te slaan dan wel op te halen. De TSdnDbDataProvider wordt uitgebreid met: TSdnDBDataProvider = class(tcxdbdataprovider) private Private declarations FOnActiveChanged: TNotifyEvent; protected protected declarations procedure ActiveChanged(AActive: Boolean); override; public Public declarations property OnActiveChanged: TNotifyEvent read FOnActiveChanged write FOnActiveChanged; De ActiveChanged override die we hebben gemaakt wordt nu: procedure TSdnDBDataProvider. ActiveChanged(AActive: Boolean); begin inherited ActiveChanged(AActive); if assigned(onactivechanged) then OnActiveChanged(self); Tenslotte maken we in onze TSdnView class een eigen procedure ActiveChanged, en in de Create van de TSdnView plakken we het zaakje aan elkaar: constructor TSdnView.create(AOwner: TComponent); begin inherited create(aowner); if not assigned(datacontroller) then exit; if not assigned(datacontroller.datamodecontroller) then exit; Datacontroller.DataModeController.GridMode := true; if assigned(datacontroller.provider) then TSdnDbDataProvider(DataController.Provider). OnActiveChanged := ActiveChanged; procedure TSdnView.ActiveChanged(sender: TObject); var sstoragename: string; begin // staat van data wijzigt: kolommen ophalen/opslaan sstoragename := IncludeTrailingPathDelimiter( 'Sdn\Grids\'+self.name); if DataController.Provider.DataSet.Active then begin if ColumnCount < 1 then DataController.CreateAllItems(false); Self.RestoreFromRegistry(sStorageName, True, True, [gsousefilter,gsousesummary],''); end else begin if ColumnCount > 0 then self.storetoregistry(sstoragename,true, [gsousefilter,gsousesummary],''); Zo. Het eerste stukje toegevoegde waarde zit erop. Het enige manco dat hier nog in zit is dat het vermoedelijk zo is dat, bij het sluiten van het form, de dataset of datasource eerder wordt afgekoppeld dan dat de dataset gesloten wordt. Dus om het netjes te doen moet ook nog zoiets in de Destroy van de TSdnView worden afgevangen. Dit beschouw ik maar even als behorend tot de afsluitende taakjes. Als we het TSdnGrid weer op een Form zetten met de eerder genoemde grote Interbase tabel, en het zaakje runnen, dan werkte het allemaal prima. Bij het openen en sluiten van de dataset (ibquery) worden keurig de instellingen opgehaald en weggeschreven. Als programmeur wil je toch proberen te voorkomen dat de complete harde schijf van een server over het netwerk wordt getrokken 12 MAGAZINE

13 DELPHI Sorteren van kolommen Dus kunnen we door met het volgende punt: het sorteren als op een kolomkop wordt geklikt. Het ligt voor de hand dat dit in de SQL gebeurt. De enige voorwaarde is dan dat er altijd een TQuery (of afgeleide) wordt gebruikt bij het opvragen van data. In mijn geval is dat ook zo, dus vooruit maar met de geit. Even wat spitten in de vele voorbeeldjes leert dat er een OnSortingChanged event bestaat binnen de Datacontroller van de View. Aangezien het meeste werk tot nu toe wel binnen de View wordt gedaan, maken we daarom maar een procedure SdnSortingChanged, die we in de Create aan het OnSortingChanged event van de Datacontroller plakken. Verder moet er nog een optie worden aangezet : OptionsCustomize.ColumnSorting := True. Dit geeft de volgende toevoeging aan de code: procedure TSdnView.SdnSortingChanged(Sender: TObject); procedure ApplySortToQuery(AQuery: TIbQuery; ASortArray: array of string); var I: Integer; ASortString, ASqlString: string; begin ASortString := ''; for I := 0 to High(ASortArray) do ASortString := ASortString + ASortArray[I]; ASQLString := Uppercase(AQuery.Sql.text); Delete(ASortString, Length(ASortString)-1, 2); if pos('order BY', ASQLString )>0 then ASQLString := copy(asqlstring,1,pos('order BY', ASQLString )-1); try AQuery.DisableControls; AQuery.Close; if ASortString <> '' then ASortString := 'order by ' + ASortString; AQuery.Sql.Text := ASQLString + ASortString; finally AQuery.Open; AQuery.EnableControls; ASortArray); finally EndUpdate; Screen.Cursor := crdefault; Je ziet dat het eerste deel van de code uit de SortedItems list de SQL genereert die in de query kan worden gebruikt, en dat deze in Apply- SortToQuery aan de SQL van de query wordt vastgeplakt. Let op dat er gemakshalve even niet wordt gelet op een sortering die in designtime aan de query wordt opgelegd, maar het is niet al te moeilijk om deze uitbreiding te verzinnen. Bij het testen (runnen) van deze uitbreiding blijkt dat er nog een cadeautje bij zit: op het moment dat de instellingen (in de SdnActiveChanged) worden opgehaald, wordt blijkbaar meteen de sortering gecheckt, en indien er kolommen worden opgeslagen waarop wordt gesorteerd, wordt deze sortering keurig netjes weer toegepast op het moment dat de grid weer actief wordt. Lekker makkelijk. Filteren Tot slot staat dan het filteren op mijn wensenlijstje. Een heel stuk terug hadden we al gezien dat bij een klik op de filter-button, de grid een lijstje produceert met de (unieke) waardes die in de onderliggende kolom kunnen voorkomen. Alleen in de GridMode die wij gebruiken werkt dit dus niet automatisch. Dat willen we ook niet, aangezien dit zou betekenen dat wederom de hele tabel in het geheugen moet worden gelezen. Zoals het nu is, gebeurt er helemaal niets, en wordt bij het klikken op de filter-button een bijna leeg lijstje getoond: Het plan is om de tweede, derde, en vierde optie helemaal niet te tonen (ik wil mijn gebruikers niet gaan uitleggen wat blanks zijn). Verder moeten we dus m.b.v. SQL de unieke waardes gaan zoeken. Terug naar de help en de voorbeelden, en het blijkt gelukkig niet al te lastig. Binnen de View moet je de OptionsCustomize.ColumnFiltering := True aanzetten. Dat kan dus prima in de Create erbij worden gezet. En er bestaat in de View.Data- Controller.Filter property een OnGetValueList event, dat afgevuurd wordt op het moment dat op de filter-button wordt geklikt. Dit event kan er dan als volgt uitzien: var I: Integer; AOrder, AFieldName: string; ASortArray: array of string; begin try Screen.Cursor := crhourglass; BeginUpdate; SetLength(ASortArray, SortedItemCount); for I := 0 to SortedItemCount - 1 do begin AFieldName := TcxGridDBColumn( SortedItems[I]).DataBinding.FieldName; if SortedItems[I].SortOrder = soascending then AOrder := ' ASC, ' else AOrder := ' DESC, '; ASortArray[SortedItems[I].SortIndex] := AFieldName + AOrder; if Length(ASortArray) = 0 then SetLength(ASortArray, 1); ApplySortToQuery( TIbQuery(DataController.DataSet), procedure TSdnView.SdnFilterGetValueList( Sender: TcxFilterCriteria; AItemIndex: Integer; AValueList: TcxDataFilterValueList); function GetTableNameFromSql(AQuery: TIbQuery): string; var I: Integer; ASqlString: string; begin result := ''; ASqlString := uppercase(aquery.sql.text); if pos('from',asqlstring)>0 then begin Result :=trim(copy(asqlstring, pos('from',asqlstring)+4, length(asqlstring))); i := 1; while ((copy(result,i,1)<>' ') ) do inc(i); Result := trim(copy(result,1,i-1)); var AColumn: TcxGridDBColumn; magazine voor software development 13

14 DELPHI AValue: Variant; ASqlText: String; begin AColumn := Columns[AItemIndex]; try Screen.Cursor := crhourglass; if not assigned(fqrytemp) then begin FQryTemp := TIbQuery.create(nil); FQryTemp.Database := TIbQuery( self.datacontroller.datasource.dataset). Database; FQryTemp.Transaction := TIbQuery( self.datacontroller.datasource.dataset). Transaction; FQryTemp.SQL.Clear; ASqlText := 'Select DISTINCT ' + AColumn.DataBinding.FieldName + ' From ' + GetTableNameFromSql(TIbQuery( DataController.DataSet)); FQryTemp.SQL.Add( ASqlText ); FQryTemp.Open; FQryTemp.First; while not FQryTemp.Eof do begin AValue := FQryTemp.Fields[0].Value; if VarIsNull(AValue) then Exit; AValueList.Add(fviValue, FQryTemp.Fields[0].Value, AValue, False); FQryTemp.Next; FQryTemp.Close; finally Screen.Cursor := crdefault; Kort gezegd haalt dit stukje code alle waardes uit de tabel van het veld op wiens kolom wordt geklikt. Deze waardes worden dan in de Value- List gezet die wordt getoond op het moment dat op de filterbutton wordt geklikt. Even testen: en ja, dit werkt. Alleen gebeurt er niks met de onderliggende data op het moment dat we een waarde selecteren. Wat er wel gebeurt, is dat er het eerder genoemde paneel te voorschijn komt waarin de filter-expressie wordt getoond. En dat wilden we niet. Dit pakken we aan door in de Create van onze View het property Filterbox.visible op fvnever te zetten. Maar daarmee werkt het filter nog steeds niet. Na even zoeken blijkt dat de code binnen cxgrid gebruik probeert te maken van de normale filter -mogelijkheid die binnen een TDataset beschikbaar is. En dat willen we nou juist niet, aangezien dan alle records uit de onderliggende tabel weer naar binnen gehaald moeten worden. Dit gaan we voorkomen door (wederom in de Create van onze View) de property Datacontroller.Filter.AutoDatasetFilter op False te zetten. Daarnaast gebruiken we het Datacontroller.Filter.Onchanged event om het filter toe te passen op de onderliggende dataset: procedure TSdnView.SdnFilterChanged(Sender: TObject); var s: string; begin DataController.Filter.OnChanged := nil; TSdnDbDataProvider(DataController.Provider). OnActiveChanged := Nil; TIbQuery(Datacontroller.DataSource.DataSet).close; s := uppercase(tibquery( Datacontroller.DataSource.DataSet).Sql.Text); if pos('where',s) > 0 then s := Copy(s,1, pos('where',s)-1); if Datacontroller.Filter.FilterText<>'' then s := s + ' where '+Datacontroller.Filter.FilterText; TIBQuery(Datacontroller.DataSource.DataSet).Sql.Text :=s; TIbQuery(Datacontroller.DataSource.DataSet).Open; DataController.Filter.OnChanged := SdnFilterChanged; TSdnDbDataProvider(DataController.Provider). OnActiveChanged := SdnActiveChanged; Binnen de functie wordt het OnActiveChanged even afgekoppeld (en aan het eind weer aangekoppeld) om te voorkomen dat er onnodig instellingen worden opgeslagen. De Create van onze eigen View ziet er uiteindelijk zo uit: constructor TSdnView.create(AOwner: TComponent); begin inherited create(aowner); if not assigned(datacontroller) then exit; if not assigned(datacontroller.datamodecontroller) then exit; Datacontroller.DataModeController.GridMode := true; // Voor het opslaan en ophalen van de instellingen if assigned(datacontroller.provider) then TSdnDbDataProvider(DataController.Provider). OnActiveChanged := SdnActiveChanged; //voor middels SQL sorteren bij klikken op kolomkoppen DataController.OnSortingChanged := SdnSortingChanged; OptionsCustomize.ColumnSorting := True; // Voor het ophalen van de filter-waardes OptionsCustomize.ColumnFiltering := True; DataController.Filter.OnGetValueList := SdnFilterGetValueList; // filter-paneel niet zichtbaar Filterbox.visible := fvnever ; // geen dataset-filtering Datacontroller.Filter.AutoDatasetFilter := false; Datacontroller.Filter.OnChanged := SdnFilterChanged; Als we dit testen blijkt dat we met het opslaan en ophalen van de instellingen nog een cadeautje krijgen: ook de filter-instellingen worden door de StoreToRegistry procedure keurig meegenomen, en andersom ook weer keurig toegepast. Lekker handig, en lekker consequent. Het enige nadeel dat ik hier zie is dat de filter-buttons alleen zichtbaar zijn op het moment dat de muis over de kolomkoppen heen gaat. En op het moment dat een filter (een extra stukje SQL) wordt opgeslagen, is het wel zo prettig voor de gebruiker dat het feit dat er een filter op een kolom actief is duidelijk zichtbaar is. Dus een laatste keer nog maar de helpfile in en de support afgestruind. Tijdens dit zoeken krijgen we meteen mee hoe we de filter-items die we niet willen hebben (de zgn. Blanks en Non-Blanks) eraf 14 MAGAZINE

15 DELPHI moeten halen: for I := AValueList.Count-1 downto 0 do begin if AValueList.items[i].Kind in [fvicustom, fviblanks, fvinonblanks] then AValueList.Delete(i); Dit stukje wordt dus meteen maar even meegenomen aan het begin van onze SdnFilterGetValueList. Opgeruimd staat netjes. Het andere bleek echter iets lastiger dan het zetten van een property. Het kwam erop neer dat we nog eens drie classes die in het cxgrid gebruikt worden, in een eigen klasse moesten vertalen, zodat we de GetAlwaysVisible van de ColumnHeaderFilterButtonViewInfo konden manipuleren. TSdnColumnHeaderFilterButtonViewInfo = class(tcxgridcolumnheaderfilterbuttonviewinfo) protected function GetAlwaysVisible: Boolean; override; TSdnColumnHeaderViewInfo = class( TcxGridColumnHeaderViewInfo) protected procedure GetAreaViewInfoClasses(AProc: TcxGridClassEnumeratorProc); override; Conclusie Het is zo een lang verhaal geworden. Maar het levert uiteindelijk een grid op die onder alle omstandigheden overeind blijft. Daaruit blijkt dat, wat je er ook aan wilt veranderen, alles uiteindelijk mogelijk is. Al die Win32-apps, waar de gebruikers uiteindelijk nog jaren mee te maken gaan krijgen, kunnen hiermee een zo groot mogelijk gebruiksgemak bieden. En snelheid. Gemakshalve heb ik het onderdeel groeperen maar even buiten beschouwing gelaten. Net zoals het vertalen van teksten die je met gebruik van deze grid tegenkomt. Gelukkig bleek onderweg dat dit erg makkelijk te doen was. En neem maar van mij aan dat, als je toevallig een data-dictionary gebruikt, er een wereld van mogelijk heden voor je open gaat Marcel van Kalken Marcel van Kalken is een Delphiontwikkelaar van het eerste uur. Sinds het uitkomen van Delphi 1 in 1995 houdt hij zich voor een bont gezelschap van opdrachtgevers bezig met het ontwikkelen en onderhouden van Delphi/Win32 applicaties. Voor 1995 was hij al een kleine 10 jaar met pc s actief, met als belangrijkste gereedschappen Clipper, VB, en Visual Objects. Behalve Delphiadept is hij ook getrouwd, vader van 2 dochters, en liefhebber van sport (hockey en windsurfen) en fotografie. TSdnHeaderViewInfo = class(tcxgridheaderviewinfo) function GetItemClass: TcxGridColumnHeaderViewInfoClass; override; function TSdnColumnHeaderFilterButtonViewInfo. GetAlwaysVisible: Boolean; begin Result := inherited GetAlwaysVisible or (GridView.DataController.Filter.FindItemByItemLink( Column) <> nil); procedure TSdnColumnHeaderViewInfo. GetAreaViewInfoClasses( AProc: TcxGridClassEnumeratorProc); begin if CanHorzSize then AProc( TcxGridColumnHeaderHorzSizingEdgeViewInfo); if CanFilter then AProc( TSdnColumnHeaderFilterButtonViewInfo); if CanSort then AProc( TcxGridColumnHeaderSortingMarkViewInfo); if HasGlyph then AProc( TcxGridColumnHeaderGlyphViewInfo); function TSdnHeaderViewInfo.GetItemClass: TcxGridColumnHeaderViewInfoClass; begin Result := TSdnColumnHeaderViewInfo; Visual Basic TIP: Lambda functies kunnen delegates vervangen Op punten waar vroeger een delegate gebruikt moest worden kan in Visual Basic 9 vaak ook een lambda expressie gebruikt worden. Bijvoorbeeld: lblx.invoke(function() SetProgressLabel2(percentage)) Zo veel makkelijker dan het gebruik van een delegate en we hebben meteen controle op het gebruik door de compiler Visual Objects TIP: SetFilter() en query optimization De DBFCDX RDD beschikt over een query optimizer voor Set- Filter. Belangrijk is te weten dat dit alleen werkt als de filterexpressie (ook) als string wordt doorgegeven. Als de expressie veldnamen bevat, zal de optimizer gebruik maken van indexen welke dezelfde veldnaam bevatten. De maximale lengte van de filter-expressie string is voor VO 254 tekens. Voor Vulcan is dit verruimd. magazine voor software development 15

16 Advertentie Sira Holding b.v.

17 .NET VISUAL BASIC Stephan Smetsers Softwaredocumentatie met Sandcastle Waarom verschijnt er altijd een ongemakkelijke glimlach op het gezicht van een ontwikkelaar als er gevraagd wordt of zijn software gedocumenteerd is? Hoewel deze vraag niet wordt beantwoord in dit artikel, zal er worden uitgelegd hoe het op eenvoudige wijze mogelijk is om (technische) documentatie van software automatisch te laten genereren. Fig. 1: IntelliSense C# IntelliSense De ontwikkelomgeving Visual Studio van Microsoft biedt een ontwikkelaar veel hulpmiddelen die gebruikt kunnen worden om gemakkelijk software te kunnen schrijven. Een van deze hulpmiddelen is de zogenaamde IntelliSense. Reeds tijdens het intypen van de code analyseert de compiler van Visual Studio de software en geeft op basis daarvan hints en tips aan de ontwikkelaar. Deze hints en tips beperken zich in eerste instantie tot het geven van technische informatie XML-comments als input voor generatie van technische documentatie over de werking van bepaalde statements en hoe programmafuncties aangeroepen dienen te worden. Het geven van begrijpbare functionele uitleg ontbreekt hier natuurlijk. Gelukkig is het wel mogelijk om handmatig deze uitleg toe te voegen aan de IntelliSense van Visual Studio door middel van het definieren van XML-comments. Deze worden vaak als triple-slash-comments genoemd. De naamgeving triple-slash-comments is ontstaan vanwege het feit, dat een dubbele slash gebruikt wordt om commentaar in een C, C++ of C# listing op te nemen. Specifiek commentaar voor IntelliSense wordt gedefinieerd door een drievoudige slash. Bij het gebruik van Visual Basic als programmeertaal worden geen slashes gebruikt maar het apostrofteken. Daar waar in C# een drievoudige slash wordt gebruikt, wordt in Visual Basic een drievoudige apostrof gebruikt. In de volgende listings is een voorbeeld weergegeven voor zowel C# als Visual Basic, dat laat zien hoe de IntelliSense van Visual Studio het commentaar van de functie GetFilename weergeeft. Fig. 2: IntelliSense Visual Basic Veel ontwikkelde software wordt als een library gedistribueerd (classlibrary). Andere softwareontwikkelaars kunnen naar deze libraries referenties leggen om daaruit onderdelen te gebruiken. Natuurlijk is het wenselijk dat de IntelliSense, die is uitgebreid met de triple-slashcomments, ook voor deze ontwikkelaars beschikbaar komt. Omdat triple-slash-comments geen onderdeel zijn van de gecompileerde programmacode, zou je verwachten dat ook de listing meegeleverd moet worden. Gelukkig is dit niet het geval en biedt Visual Studio de mogelijkheid om uitsluitend alle triple-slash-comments in een speciaal bestand op te slaan. De gedistribueerde software bestaat dus uit twee onderdelen: de gecompileerde programmacode (DLLbestand) en de triple-slash-comments ten behoeve van de IntelliSense (XML-bestand). In de volgende afbeelding is zichtbaar waar in het properties-scherm geconfigureerd wordt dat Visual Studio een dergelijk XML-bestand dient te genereren (deze optie staat standaard uit). magazine voor software development 17

18 .NET VISUAL BASIC Sandcastle is niet het eerste product dat op basis van XML-comments in staat is om documentatie te genereren van de programmacode. De meeste ontwikkelaars hebben vast wel eens gehoord van NDoc. Dit opensource project was een van de eerste die volledig geautomatiseerd een helpbestand kon genereren in diverse bestandsformaten. Helaas is dit project stopgezet door de auteur van NDoc omdat hij niet of nauwelijks hulp kreeg vanuit de community om het product verder te ontwikkelen en geschikt te maken voor de nieuwere versies van.net. Het antwoord van Microsoft kon daarom niet uitblijven en zo kwam het project van de grond, dat nu de codenaam Sandcastle draagt. Fig. 3: Propertiesscherm Sandcastle Naast het IntelliSense mechanisme dat volledig is geintegreerd in de Visual Studio ontwikkelomgeving, zijn er nog andere hulpmiddelen die gebruik maken van de triple-slash-comments. Een van deze hulpmiddelen is een door Microsoft ontwikkeld product dat voorlopig nog de codenaam Sandcastle draagt. Sandcastle is een product dat op basis van de door Visual Studio geleverde XML-bestanden technische documentatie kan genereren van de ontwikkelde programmacode. Deze gegenereerde documentatie bevat naast alle teksten die via triple-slash-comments door een ontwikkelaar zijn ingevoerd, ook alle teksten die door ontwikkelaars van Microsoft zijn ingevoerd. Dit laatste geldt natuurlijk alleen voor gemeenschappelijke functies die zowel in de eigen ontwikkelde software als ook in het.net Framework aanwezig zijn. Daarnaast bevat de gegenereerde documentatie ook verwijzingen naar de MSDN-website van Microsoft waar de volledige documentatie van het.net Framework te vinden is. In de volgende afbeelding is zichtbaar hoe de gegenereerde software documentatie door Sandcastle er uitziet. De look-and-feel van de documentatie vertoont veel gelijkenis met die van de MSDN-website van Microsoft. Op zich is dit niet raar aangezien insiders bij Microsoft bevestigd hebben dat ook Microsoft gebruik maakt van Sandcastle. Werking van Sandcastle De werking van Sandcastle bestaat uit een aantal aaneen geschakelde verwerkingsstappen. Als eerste wordt via Visual Studio de programmacode gecompileerd. Dit resulteert in twee soorten bestanden namelijk de gecompileerde programmacode (DLL-bestand) en de XML-comments (XML-bestand). Vervolgens zal het DLL-bestand door Sandcastle worden geanalyseerd. Dit is te vergelijken met de analyse die de compiler van Visual Studio uitvoert ten behoeve van de Intelli- Sense. De uitvoer van deze analyse levert een aantal XML-bestanden op. Deze bestanden worden via een aantal XSLT-transformaties samengevoegd met de door Visual Studio gegenereerde XML-comments-bestanden en omgevormd tot leesbare HTML-bestanden. Deze HTML-bestanden worden uiteindelijk via een HTML-helpbuilder gecompileerd tot een HLP- en/of CHM-bestand. In de volgende afbeelding zijn de verwerkingsstappen van Sandcastle weergegeven. Fig. 5: Sandcastle documentatieproces Sandcastle beschikt niet over een (gebruiksvriendelijke) user interface. De reden hiervoor is voor buitenstaanders nog een beetje speculeren, maar dit heeft hoogstwaarschijnlijk te maken met het feit Microsoft het gebruik van Sandcastle ziet als onderdeel van een geautomatiseerd build-proces (wat vaak tijdens een nachtelijke run plaatsvindt). Gelukkig zijn er door een aantal leden van de Microsoft community diverse tools gemaakt die voorzien zijn van een user interface en die Sandcastle onder water configureren en aansturen. Deze maken het gebruik van Sandcastle, dat vooralsnog beschikt over een commandline interface, eenvoudiger. Deze tools worden door Microsoft ook aanbevolen om te gebruiken. Fig. 4: Gegenereerde documentatie door Sandcastle Conclusie Steeds meer bedrijven erkennen dat het beschikken over goede documentatie een essentieel onderdeel is van het proces dat softwareontwikkeling heet. Omdat er steeds hogere eisen gesteld worden aan de kwaliteit van dergelijke documenten, neemt ook de tijd die nodig is om documentatie schrijven toe. Het gebruik van adequate tooling om dit proces te versnellen is dan ook een onmisbaar onderdeel. Met behulp van Microsoft s Sandcastle kan op eenvoudige en snelle wijze een overzichtelijke technische documentatie worden gegenereerd van de ontwikkelde software. Het is vanzelfsprekend dat het uitsluitend beschikken over technische documentatie niet 18 MAGAZINE

19 .NET VISUAL BASIC voldoende is en er moet onderkend worden dat de aanwezigheid van functionele documentatie minstens zo belangrijk is. Microsoft s Sandcastle mag gezien worden als een goede aanvulling op de hulpmiddelen die bijdragen aan het schrijven van documentatie van software. Meer informatie over Sandcastle, de syntaxis van XML-comments en de beschikbare user interfaces voor Sandcastle kan gevonden worden op de volgende websites: Stephan Smetsers Stephan heeft een eigen bedrijf gehad dat technische software ontwikkelde voor de architectenbranche ten behoeve van geautomatiseerde NEN-normbereke ningen voor de optimalisatie en ondersteuning van het bouwvoorbereidingsproces. Sinds februari 2005 is Stephan parttime in dienst bij Atos Origin als senior.net ontwikkelaar. Naast deze werkzaamheden ontwikkelt hij zelfstandig software, met name generieke frameworks en componenten, die veelal bij eigen projecten worden ingezet. Advertentie Aladdin.NET TIP: Verbergt IntelliSense je code? Verbergt de IntelliSense popup een deel van de code die je wilt kunnen zien?. Druk dan op de Control-toets! Door op de Control-toets te drukken wordt het IntelliSense-venster transparant en is de code die erachter staat te lezen..net TIP: Project Mole Met Visual Studio Debug Visualizers kan het leven van een ontwikkelaar een stuk makkelijker worden. Maar om ze zelf te maken kost weer tijd en dat is iets waar we toch al te weinig van hebben. Gelukkig is Karl Shifflett met een paar vrienden druk bezig geweest en hebben zij Mole ontwikkeld, de Debug Visualizer voor bijna alles. Zie macros/moleforvisualstudioedit.aspx voor meer info.

20 Advertentie Logica

Sparse columns in SQL server 2008

Sparse columns in SQL server 2008 Sparse columns in SQL server 2008 Object persistentie eenvoudig gemaakt Bert Dingemans, e-mail : info@dla-os.nl www : http:// 1 Content SPARSE COLUMNS IN SQL SERVER 2008... 1 OBJECT PERSISTENTIE EENVOUDIG

Nadere informatie

Een unit test is geen integratie test. Niet het hele systeem, maar onderdelen van een systeem worden getest.

Een unit test is geen integratie test. Niet het hele systeem, maar onderdelen van een systeem worden getest. WAT IS EEN UNIT TEST? Een unit test is een test om de functionaliteit van stukken code te controleren. Een goede unit test waarborgt een consistente werking van een klein onderdeel (een unit ) van de broncode.

Nadere informatie

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double. Algemeen C# Variabele Een variabele is een willekeurige waarde die word opgeslagen. Een variabele heeft altijd een datetype ( De soort waarde die een variabele bevat). Datatypes Een datatype is de sort

Nadere informatie

Fun met webparts in ASP.Net

Fun met webparts in ASP.Net Fun met webparts in ASP.Net Deel 2:User controls en Webparts door Bert Dingemans, e-mail : info@dla-os.nl www : http:// 1 Inhoudsopgave FUN MET WEBPARTS IN ASP.NET... 1 DEEL 2:USER CONTROLS EN WEBPARTS...

Nadere informatie

Kleine cursus PHP5. Auteur: Raymond Moesker

Kleine cursus PHP5. Auteur: Raymond Moesker Kleine cursus PHP5 Auteur: Raymond Moesker Kleine cursus PHP PHP is platform en CPU onafhankelijk, open source, snel, heeft een grote userbase, het is object georiënteerd, het wordt omarmd door grote bedrijven

Nadere informatie

De plug-in is heel eenvoudig te installeren met een setup-programma. Waarna je een aantal menu opties in het tools menu er bij krijgt.

De plug-in is heel eenvoudig te installeren met een setup-programma. Waarna je een aantal menu opties in het tools menu er bij krijgt. Plsqldoc Genereer je documentatie Beeklaan 444 2562 BK Den Haag www.darwin-it.nl info@darwin-it.nl KvK 27283780 ING 65.35.40.663 Technical Architect Net als (vrijwel) elke ontwikkelaar vind ik het documenteren

Nadere informatie

VB Magazine Online 2004 01/08 1 / 6

VB Magazine Online 2004 01/08 1 / 6 Een van de krachtigste elementen binnen Visual Basic 2003 vind ik wel de mogelijkheid om objecten te overerven; ook wel inheritance genoemd. U kunt niet alleen uw eigen classes en business objecten overerven,

Nadere informatie

NHibernate als ORM oplossing

NHibernate als ORM oplossing NHibernate als ORM oplossing Weg met de SQL Queries Wat is ORM? ORM staat in dit geval voor Object Relational Mapping, niet te verwarren met Object Role Modeling. ORM vertaalt een objectmodel naar een

Nadere informatie

Een eerste applicatie

Een eerste applicatie Een eerste applicatie 2.1 Inleiding Programmeren in Visual Basic.NET doe je niet alleen door regels met code te schrijven. Je begint met het ontwerpen van een venster in de design mode met allerlei controls,

Nadere informatie

DrICTVoip.dll v 2.1 Informatie en handleiding

DrICTVoip.dll v 2.1 Informatie en handleiding DrICTVoip.dll v 2.1 Informatie en handleiding Nieuw in deze versie : Koppeling voor web gebaseerde toepassingen (DrICTVoIPwebClient.exe) (zie hoofdstuk 8) 1. Inleiding Met de DrICTVoIP.DLL maakt u uw software

Nadere informatie

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel: Eenvoudig voorbeeld. Er wordt verondersteld dat er met VS 2008 EXPRESS gewerkt wordt. Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel: (Sommige schermafdrukken zijn afkomstig

Nadere informatie

Databank - Basis 1. Inhoud. Computervaardigheden en Programmatie. Hoofdstuk 4 Databank - Basis. Terminologie. Navigeren door een Venster

Databank - Basis 1. Inhoud. Computervaardigheden en Programmatie. Hoofdstuk 4 Databank - Basis. Terminologie. Navigeren door een Venster 4. 4. Inhoud rste BAC Toegepaste Biologische Wetenschappen Hoofdstuk 4 Databank Terminologie, Navigeren, Importeren Tabellen Records/Velden manipuleren Queries (Vragen) [Ook in SQL] sorteren filter volgens

Nadere informatie

Dynamiek met VO-Script

Dynamiek met VO-Script Dynamiek met VO-Script Door Bert Dingemans DLA Ontwerp & Software bert@dla-architect.nl Inleiding Op de SDGN nieuwsgroep voor Visual Objects ontstond laatst een draad van berichten over de nieuwe libraries

Nadere informatie

Versturen van email vanuit een Delphi VCL toepassing

Versturen van email vanuit een Delphi VCL toepassing Versturen van email vanuit een Delphi VCL toepassing Voor Delphi bestaan uiteraard verschillende libraries om emails te versturen, maar in dit voorbeeld wordt een C# Dotnet library gebruikt en aangesproken

Nadere informatie

MA!N Rapportages en Analyses

MA!N Rapportages en Analyses MA!N Rapportages en Analyses Auteur Versie CE-iT 1.2 Inhoud 1 Inleiding... 3 2 Microsoft Excel Pivot analyses... 4 2.1 Verbinding met database... 4 2.2 Data analyseren... 5 2.3 Analyses verversen... 6

Nadere informatie

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet.

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet. Hoofdstuk 2 Een ASP.NET applicatie met ADO.NET opzetten In dit hoofdstuk ga je een eenvoudige website opzetten, waarbij je een aantal gegevens uit een database ophaalt. Je moet je kennis van ADO.NET dus

Nadere informatie

ASRemote WebService. Via deze webservice kunt u:

ASRemote WebService. Via deze webservice kunt u: ASRemote WebService De ASRemote WebService is een SOAP Webservice die softwarematige communicatie met Exact Globe mogelijk maakt vanaf een willekeurige locatie op het internet. Via deze webservice kunt

Nadere informatie

Dieper in Visual Basic.Net

Dieper in Visual Basic.Net Visual Basic.NET Dieper in Visual Basic.Net 7.1 Inleiding Dit hoofdstuk is bedoeld om je wat handiger te maken in het programmeren in Visual Basic. Je leert geen nieuwe programmeervaardigheden, maar je

Nadere informatie

Maak een pivot uit een Generic.List

Maak een pivot uit een Generic.List Maak een pivot uit een Generic.List Introductie in extensions, reflection en code generation Nivo: 400 Introductie In bepaalde gevallen komt het voor dat je een Generic.List van een specifieke class hebt,

Nadere informatie

Excel Controller. Handleiding Excel Controller Wizard

Excel Controller. Handleiding Excel Controller Wizard Excel Controller Handleiding Excel Controller Wizard 1 Inhoud Inleiding... 3 Eigen SQL... 3 Stap 1 Eigen SQL... 3 Stap 2 Testen SQL... 8 Stap 3 Wizard... 11 Stap 4 Parameters... 13 Voorbeeld Eigen Parameter...

Nadere informatie

E-MAILS VERZENDEN MET AFDRUK SAMENVOEGEN

E-MAILS VERZENDEN MET AFDRUK SAMENVOEGEN E-MAILS VERZENDEN MET AFDRUK SAMENVOEGEN Met E-mail samenvoegen voor Word en Outlook kunt u o.a. een brochure of nieuwsbrief maken en deze per e-mail verzenden naar uw Outlook-lijst met contactpersonen

Nadere informatie

ContentQueryWebpart en custom XSLT. Alles wat je moet weten over het CQW

ContentQueryWebpart en custom XSLT. Alles wat je moet weten over het CQW ContentQueryWebpart en custom XSLT Alles wat je moet weten over het CQW 1 Contents Voorkennis... 3 Het CQW volgens Microsoft... 3 Algemene werking van het CQW... 3 Het werken met slots... 4 DataMappings...

Nadere informatie

Chris de Kok 223548 TDI 3. Vak: Software Architectuur Datum: 21-01-2008 Docent: Fons van Kesteren

Chris de Kok 223548 TDI 3. Vak: Software Architectuur Datum: 21-01-2008 Docent: Fons van Kesteren Chris de Kok 223548 TDI 3 Vak: Software Architectuur Datum: 21-01-2008 Docent: Fons van Kesteren Inhoud Inleiding... 3 Black box / White box... 3 XP... 3 SimpleTest... 3 Eclipse plugin... 4 GroupTest...

Nadere informatie

public Bier ( string N, double P, Brouwerij B) { Naam = N; AlcoholPerc = P; Brouwer = B;

public Bier ( string N, double P, Brouwerij B) { Naam = N; AlcoholPerc = P; Brouwer = B; Beschouw bijvoorbeeld de twee onderstaande klassen, waarvan de attributen en eigenschappen geannoteerd zijn met bijkomende XML-annotaties: using System ; using System. Xml ; using System. Xml. S e r i

Nadere informatie

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren HOOFDSTUK 3 3.1 Stapsgewijs programmeren De programmeertalen die tot nu toe genoemd zijn, zijn imperatieve of procedurele programmeertalen. is het stapsgewijs in code omschrijven wat een programma moet

Nadere informatie

Zelftest Programmeren in Java

Zelftest Programmeren in Java Zelftest Programmeren in Java Document: n0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST PROGRAMMEREN IN JAVA Deze test

Nadere informatie

www.dubbelklik.nu Handleiding Access 2010

www.dubbelklik.nu Handleiding Access 2010 www.dubbelklik.nu Handleiding Access 2010 Deze handleiding is onderdeel van Dubbelklik, een lesmethode Technologie, ICT/ Loopbaanoriëntatie en Intersectoraal Alle rechten voorbehouden. Niets uit deze uitgave

Nadere informatie

Vakgroep CW KAHO Sint-Lieven

Vakgroep CW KAHO Sint-Lieven Vakgroep CW KAHO Sint-Lieven Objecten Programmeren voor de Sport: Een inleiding tot JAVA objecten Wetenschapsweek 20 November 2012 Tony Wauters en Tim Vermeulen tony.wauters@kahosl.be en tim.vermeulen@kahosl.be

Nadere informatie

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren Universiteit van Amsterdam FNWI Voorbeeld van tussentoets Inleiding programmeren Opgave 1: Wat is de uitvoer van dit programma? public class Opgave { static int i = 0 ; static int j = 1 ; int i = 1 ; int

Nadere informatie

Auteur boek: Vera Lukassen Titel boek: Word Gevorderd 2010. 2011, Serasta Uitgegeven in eigen beheer info@serasta.nl Eerste druk: augustus 2012

Auteur boek: Vera Lukassen Titel boek: Word Gevorderd 2010. 2011, Serasta Uitgegeven in eigen beheer info@serasta.nl Eerste druk: augustus 2012 Auteur boek: Vera Lukassen Titel boek: Word Gevorderd 2010 2011, Serasta Uitgegeven in eigen beheer info@serasta.nl Eerste druk: augustus 2012 ISBN: 978-90-817910-7-6 Dit boek is gedrukt op een papiersoort

Nadere informatie

Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren

Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren Om eens wat ervaring op te doen met de Windows Azure Marketplace heb ik een publieke en gratis databron gekozen

Nadere informatie

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk. HOOFDSTUK 3 3.1 Stapsgewijs programmeren In de vorige hoofdstukken zijn programmeertalen beschreven die imperatief zijn. is het stapsgewijs in code omschrijven wat een programma moet doen, net als een

Nadere informatie

ArcGIS Mobile ADF. Smart Client Applicaties voor ArcGIS Server Eva Dienske, Wim Ligtendag

ArcGIS Mobile ADF. Smart Client Applicaties voor ArcGIS Server Eva Dienske, Wim Ligtendag ArcGIS Mobile ADF Smart Client Applicaties voor ArcGIS Server Eva Dienske, Wim Ligtendag Agenda Wat is de Mobile ADF? Architectuur Demo Wat is de mobile ADF? Ontwikkeltoolkit voor mobiele (Smart Client)

Nadere informatie

Eigen Widgets in CRM. Introductie. Limitering. Widgets beschikbaar stellen. Tips & Tricks Eigen Widgets in CRM

Eigen Widgets in CRM. Introductie. Limitering. Widgets beschikbaar stellen. Tips & Tricks Eigen Widgets in CRM Tips & Tricks Eigen Widgets in CRM Eigen Widgets in CRM Introductie De WebUI van CRM 7.0 maakt het mogelijk om je eigen widgets te maken en deze in je eigen view te gebruiken. Dat kan door gebruik te maken

Nadere informatie

Een website maken met databasetoegang.

Een website maken met databasetoegang. Hoofdstuk 5 Een website maken met databasetoegang. In dit hoofdstuk gaan we het weblog dat je in hoofdstuk 4 hebt gemaakt verder uitbreiden. Een belangrijk onderdeel wordt toegevoegd aan de applicatie,

Nadere informatie

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd. BASISINSTRUCTIES SQL SQL : Structured Query Language is een taal gericht op het ondervragen van een relationele database en die aan veel klassieke databasemanagementsystemen kan worden gekoppeld. SQL is

Nadere informatie

Variabelen en statements in ActionScript

Variabelen en statements in ActionScript Ontwikkelen van Apps voor ios en Android Variabelen en statements in ActionScript 6.1 Inleiding Als we het in de informatica over variabelen hebben, bedoelen we een stukje in het geheugen van de computer

Nadere informatie

Installatie SQL: Server 2008R2

Installatie SQL: Server 2008R2 Installatie SQL: Server 2008R2 Download de SQL Server 2008.exe van onze site: www.2work.nl Ga naar het tabblad: Downloads en meld aan met: klant2work en als wachtwoord: xs4customer Let op! Indien u een

Nadere informatie

DELPHI VOOR ELEKTRONICI. Deel 2: Een rekenmachine programmeren CURSUS

DELPHI VOOR ELEKTRONICI. Deel 2: Een rekenmachine programmeren CURSUS DELPHI VOOR ELEKTRONICI CURSUS Deel 2: Een rekenmachine programmeren Herman Bulle met dank aan Anton Vogelaar In het vorige artikel hebben we de programmeeromgeving van Delphi geïntroduceerd en zijn er

Nadere informatie

Derde Delphi Programma verkenning

Derde Delphi Programma verkenning Derde Delphi Programma verkenning In deze opdracht gaan we een aantal typische componenten en gegevenstypen van Windows en Delphi verkennen. We bouwen een eenvoudige rekenmachine en ondertussen leer je

Nadere informatie

6.8 Lijsten: oefeningen

6.8 Lijsten: oefeningen 6.8 Lijsten: oefeningen Opgaven 44.: Records zoeken Open het document "Autokosten". Klik in de lijst. Kies de opdracht 'Data - Formulier' [Data - Form]. Klik de knop 'Criteria' [Criteria]. Vul als zoekcriterium

Nadere informatie

Aan de slag met AdminView

Aan de slag met AdminView Aan de slag met AdminView uitgebreide handleiding S for Software B.V. Gildeweg 6 3771 NB Barneveld tel 0342 820 996 fax 0342 820 997 e-mail info@sforsoftware.nl web www.sforsoftware.nl Inhoudsopgave 1.

Nadere informatie

Samenvoegen met Word en Excel 2010

Samenvoegen met Word en Excel 2010 Samenvoegen met Word en Excel 2010 Inhoudsopgave Samenvoegen Word-Excel / Mailingen... 2 Tip Samenvoegvelden automatisch markeren... 4 Tip Installeer PDF-creator... 7 Tip Sla het Word-document en Excel-document

Nadere informatie

Inhoud. VBA Excel 2010

Inhoud. VBA Excel 2010 Inhoud VBA Excel 2010 Inhoudsopgave 0. INSTELLINGEN EXCEL 2010... 9 1. WAT IS VISUAL BASIC FOR APPLICATIONS... 16 1.1. Achtergrond... 16 1.2. VBA is meer dan een macrotaal... 16 Case 1: Macro "Walk of

Nadere informatie

TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise

TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise Inhoudsopgave 1. Voorbereiding... 4 2. Web Service Connector tool configuratie... 5 3. TaskCentre taak voor het aanmaken van

Nadere informatie

Selenium IDE Webdriver. Introductie

Selenium IDE Webdriver. Introductie Selenium IDE Webdriver Het Wielsem 10, 5231 BW s- Hertogenbosch, telefoon 073-6409311 e- mail info@testwork.nl internet http://www.testwork.nl 1 Inhoudsopgave 1 Inhoudsopgave... 2 2 Selenium IDE... 3 3

Nadere informatie

Handleiding Outlook Agenda

Handleiding Outlook Agenda 1 Inleiding In dit document vindt u een uitgebreide uitleg van de Outlook Agenda functie. Aan de orde komen het gebruik van de agenda zoals het maken van afspraken en het geven van toegang aan anderen

Nadere informatie

DBMS. DataBase Management System. Op dit moment gebruiken bijna alle DBMS'en het relationele model. Deze worden RDBMS'en genoemd.

DBMS. DataBase Management System. Op dit moment gebruiken bijna alle DBMS'en het relationele model. Deze worden RDBMS'en genoemd. SQL Inleiding relationele databases DBMS DataBase Management System!hiërarchische databases.!netwerk databases.!relationele databases.!semantische databases.!object oriënted databases. Relationele databases

Nadere informatie

Het beheren van mijn Tungsten Network Portal account NL 1 Manage my Tungsten Network Portal account EN 14

Het beheren van mijn Tungsten Network Portal account NL 1 Manage my Tungsten Network Portal account EN 14 QUICK GUIDE C Het beheren van mijn Tungsten Network Portal account NL 1 Manage my Tungsten Network Portal account EN 14 Version 0.9 (June 2014) Per May 2014 OB10 has changed its name to Tungsten Network

Nadere informatie

Technische nota AbiFire5 Rapporten maken via ODBC

Technische nota AbiFire5 Rapporten maken via ODBC Technische nota AbiFire5 Rapporten maken via ODBC Laatste revisie: 29 juli 2009 Inhoudsopgave Inleiding... 2 1 Installatie ODBC driver... 2 2 Systeeminstellingen in AbiFire5... 3 2.1 Aanmaken extern profiel...

Nadere informatie

Inhoud van de website invoeren met de ContentPublisher

Inhoud van de website invoeren met de ContentPublisher Inhoud van de website invoeren met de ContentPublisher De inhoud van Muismedia websites wordt ingevoerd en gewijzigd met behulp van een zogenaamd Content Management Systeem (CMS): de ContentPublisher.

Nadere informatie

Handleiding: Whitelabel Customersite

Handleiding: Whitelabel Customersite ARGEWEB B.V. Handleiding: Whitelabel Customersite Controlportal.nl Argeweb Support 8-1-2009 Handleiding voor het gebruik maken van de Whitelabel Customersite op controlportal.nl, door Resellers van Argeweb.

Nadere informatie

VAN HET PROGRAMMEREN. Inleiding

VAN HET PROGRAMMEREN. Inleiding OVERZICHT VAN HET PROGRAMMEREN Inleiding Als je leert programmeren lijkt het nogal overweldigend om die eerste stappen te doorworstelen. Er zijn dan ook heel wat programmeertalen (Java, Ruby, Python, Perl,

Nadere informatie

Een eenvoudige webserver maken in Lazarus

Een eenvoudige webserver maken in Lazarus Een eenvoudige webserver maken in Lazarus Michaël Van Canneyt 2 december 2011 Samenvatting Free Pascal - en dus ook Lazarus - kan meerdere TCP/IP componenten compileren: Synapse, Indy en lnet. Free Pascal

Nadere informatie

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database. SQL manipulatietaal We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database. Basiscommando's: INSERT : toevoegen van gegevens DELETE : verwijderen van gegevens UPDATE : wijzigen van gegevens

Nadere informatie

Werken op afstand via internet

Werken op afstand via internet HOOFDSTUK 12 Werken op afstand via internet In dit hoofdstuk wordt uitgelegd wat er nodig is om op afstand met de ROS artikel database te kunnen werken. Alle benodigde programma s kunnen worden gedownload

Nadere informatie

Handleiding JCreator. Inhoud. Een Workspace en een eerste project maken

Handleiding JCreator. Inhoud. Een Workspace en een eerste project maken Handleiding JCreator Inhoud Een Workspace en een eerste project maken Een tweede project maken De editor van JCreator Aanpassen van de basis-directory Documentatie over klassen en methoden van de JDK Bestand

Nadere informatie

Cursus Onderwijs en ICT. Programmeren met Visual Basic

Cursus Onderwijs en ICT. Programmeren met Visual Basic Cursus Onderwijs en ICT Jaargang 2, deel 23 (versie 1.0 NL 2-7-2011) Programmeren met Visual Basic door Serge de Beer Inleiding In sommige gevallen biedt het aanbod op de softwaremarkt niet wat je zoekt.

Nadere informatie

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces.

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces. Hoofdstuk 1: Inleiding Objectoriëntatie: 1. Objecten & klassen: samenwerking van componenten om bepaald doel te bereiken; herbruikbaarheid. 2. Encapsulation: afschermen gedragingen en kenmerken van de

Nadere informatie

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden.

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden. Herhaling Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden. De basisbouwsteen is het object; een geïntegreerde eenheid van data en operaties werkend op deze

Nadere informatie

Oracle client 1.2 voor ixperion 1.3 en hoger

Oracle client 1.2 voor ixperion 1.3 en hoger Installatiehandleiding Oracle client 1.2 voor ixperion 1.3 en hoger voor Windows 2008 R2 64bit Copyright 2010 Versie 1.0.1 Seneca 2010 1 Auteur: ing. Silvio Bosch Versiebeheer: Versie Status Datum Omschrijving

Nadere informatie

Microsoft Excel. It s all about Excel - VBA

Microsoft Excel. It s all about Excel - VBA X Microsoft Excel Stap in de wereld van Visual Basic for Applications (VBA) binnen het Microsoft Office programma Excel. Leer hoe deze programmeertaal precies in elkaar zit en hoe u deze in de dagelijkse

Nadere informatie

Inhoudsopgave Disclaimer... 3 Voorwoord... 4 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP... 8 Joomla installeren op

Inhoudsopgave Disclaimer... 3 Voorwoord... 4 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP... 8 Joomla installeren op 1 Inhoudsopgave Disclaimer... 3 Voorwoord... 4 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP.... 8 Joomla installeren op XAMPP... 15 Handige links... 16 2 Disclaimer Bij de samenstelling

Nadere informatie

Programmeren in Java les 3

Programmeren in Java les 3 4 september 2015 Deze les korte herhaling vorige week loops methodes Variabelen Soorten variabelen in Java: integer: een geheel getal, bijv. 1,2,3,4 float: een gebroken getal, bijv. 3.1415 double: een

Nadere informatie

Klassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers

Klassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers 1 Inhoud Klassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers 2 Geluidsbronnen simulator, deel 2 Inleiding De weergave versnellen

Nadere informatie

Handleiding Reinder.NET.Tasks.SQL versie 2

Handleiding Reinder.NET.Tasks.SQL versie 2 Handleiding Reinder.NET.Tasks.SQL versie 2 Reinder Stolte Tramstraat 33 8771RR Nijland Inhoudsopgave 1 Algemeen... 2 2 Installeren en configureren... 3 3 Taken instellen... 4 3.1 Taskname (Taaknaam) verplicht

Nadere informatie

Bitrix Site Manager gebruikershandleiding BureauZuid

Bitrix Site Manager gebruikershandleiding BureauZuid Bitrix Site Manager gebruikershandleiding BureauZuid Introductie Deze gebruikershandleiding geeft gedetailleerde basisinformatie over hoe te werken met Bitrix Site Manager. Deze handleiding is bedoeld

Nadere informatie

Automatische Installatie op IIS server

Automatische Installatie op IIS server Automatische Installatie op IIS server In de map Web staat het installatiebestand : Je kan de install starten door het aanklikken van het msi bestand vanuit Verkenner. Na installatie is steeds een manuele

Nadere informatie

Koppeling met een database

Koppeling met een database PHP en MySQL Koppeling met een database 11.1 Inleiding In PHP is het eenvoudig om een koppeling te maken met een database. Een database kan diverse gegevens bewaren die met PHP aangeroepen en/of bewerkt

Nadere informatie

Factuur Lay-out / Factuur Template

Factuur Lay-out / Factuur Template Factuur Lay-out / Factuur Template In i-reserve is het mogelijk facturen te verzenden. De facturen worden als pdf bijlage per e-mail naar de klant verzonden. In deze tutorial wordt beschreven hoe u een

Nadere informatie

UBC op Microsoft Windows 64-bits

UBC op Microsoft Windows 64-bits UBC op Microsoft Windows 64-bits Inleiding Op de 64-bits varianten van Windows werkt de UBC (en vele andere pakketten) op een andere manier dan op de oudere 32-bits varianten van deze Windows versies.

Nadere informatie

Katholieke Hogeschool Kempen ASP

Katholieke Hogeschool Kempen ASP Katholieke Hogeschool Kempen Campus Geel Departement Handelswetenschappen en Bedrijfskunde 3de jaar Toegepaste Informatica ASP www.projectchatroom.be Yorkim Parmentier 3TI4 Andy Geluykens 3TI4 Academiejaar

Nadere informatie

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur 1. deze opgave telt voor 30% van het totaal. Schrijf een compleet programma, dat door de gebruiker vanaf

Nadere informatie

1. Inleiding... 2 1.1. Inleiding SQL... 3 1.1.1. Inleiding... 3 1.1.2. Database, databaseserver en databasetaal... 4 1.1.3. Het relationele model...

1. Inleiding... 2 1.1. Inleiding SQL... 3 1.1.1. Inleiding... 3 1.1.2. Database, databaseserver en databasetaal... 4 1.1.3. Het relationele model... 1. Inleiding... 2 1.1. Inleiding SQL... 3 1.1.1. Inleiding... 3 1.1.2. Database, databaseserver en databasetaal... 4 1.1.3. Het relationele model... 4 1.1.4. Wat is SQL?... 6 1.1.5. Verschillende categorieên

Nadere informatie

U ziet de progressie van de download aan de groene blokjes in het balkje helemaal onder aan de pagina.

U ziet de progressie van de download aan de groene blokjes in het balkje helemaal onder aan de pagina. Gegevens exporteren en bewerken vanuit GRIEL Stap 1. Selecteer de juiste gegevens en download deze 1. Stel het datumfilter in op de gewenste periode. Druk op ververs. 2. Maak met behulp van het filter

Nadere informatie

Programmeerstructuren met App Inventor

Programmeerstructuren met App Inventor Programmeerstructuren met App Inventor Kevin Krul, Universiteit Utrecht Roncalli, Bergen op Zoom Inhoud: Les 1: Introductie tot App Inventor, when statement en variabelen. Les 2: Introductie if-statement

Nadere informatie

Rhino s verhandelingen TC-K04

Rhino s verhandelingen TC-K04 Rhino s verhandelingen TC-K04 Foto s beoordelen (Gebruik van aangepaste kolommen). Tijdens de vakantie hebben velen foto s gemaakt. In dit digitale tijdperk schiet je er zelfs vaak heel veel. Al die foto

Nadere informatie

Formulieren maken met Dreamweaver CS 4/CS 5

Formulieren maken met Dreamweaver CS 4/CS 5 Formulieren maken met Dreamweaver CS 4/CS 5 In deze handleiding leer je om een formulier en elementen die je binnen een formulier kunt gebruiken, te ontwerpen met Dreamweaver. Het uitgangspunt is dat dit

Nadere informatie

Object Oriented Programming

Object Oriented Programming Object Oriented Programming voor webapplicaties Door Edwin Vlieg Waarom OOP? Basis uitleg over OOP Design Patterns ActiveRecord Model View Controller Extra informatie Vragen OOP Object Oriented Programming

Nadere informatie

Multi user Setup. Firebird database op een windows (server)

Multi user Setup. Firebird database op een windows (server) Multi user Setup Firebird database op een windows (server) Inhoudsopgave osfinancials multi user setup...3 Installeeren van de firebird database...3 Testing van de connectie met FlameRobin...5 Instellen

Nadere informatie

1 van 8 22-2-2012 20:43

1 van 8 22-2-2012 20:43 1 van 8 22-2-2012 20:43 Garmin Basecamp is een gratis software programma van Garmin. Het vergelijkbaar met mapsource, echter met de nieuwe toestellen (oregon, dakota en gpsmap 62) heeft het een aantal

Nadere informatie

Aan het eind van deze lesbrief wordt uitgelegd wat het nut van OOP is en vind je een aantal oefenopdrachten.

Aan het eind van deze lesbrief wordt uitgelegd wat het nut van OOP is en vind je een aantal oefenopdrachten. Doel van deze lesbrief Deze lesbrief is bedoeld om je op de hoogte te brengen van de basisbegrippen die gangbaar zijn bij object georiënteerd programmeren (OOP). In deze lesbrief kom je korte codefragmenten

Nadere informatie

User accounts maken in een Wandy Hotspot, d.m.v. een batch.

User accounts maken in een Wandy Hotspot, d.m.v. een batch. User accounts maken in een Wandy Hotspot, d.m.v. een batch. Bij het in gebruik nemen van een Wandy Hotspot is het aanmaken van gebruikers een tijdrovende klus. Om snel veel accounts aan te maken hebben

Nadere informatie

De ontwikkelaar heeft het recht om af te zien van verdere ontwikkeling en/of ondersteuning van dit pakket.

De ontwikkelaar heeft het recht om af te zien van verdere ontwikkeling en/of ondersteuning van dit pakket. 1. Licentieovereenkomst BELANGRIJK! LEES DEZE OVEREENKOMST ALVORENS DE SOFTWARE TE INSTALLEREN! Het aanvaarden van deze overeenkomst geeft u het recht tot gebruik van deze software, de software blijft

Nadere informatie

@ @ Machtigingen in Outlook en Outlook webmail. Windows XP SP 3. Bestemd voor: Medewerkers Versie: 0.2 Datum: 02-03-2009 Eigenaar: SSC ICT

@ @ Machtigingen in Outlook en Outlook webmail. Windows XP SP 3. Bestemd voor: Medewerkers Versie: 0.2 Datum: 02-03-2009 Eigenaar: SSC ICT Windows XP SP 3 Machtigingen in Outlook en Outlook webmail Bestemd voor: Medewerkers Versie: 0.2 Datum: 02-03-2009 Eigenaar: SSC ICT Machtigingen in Outlook en Outlook webmail Machtigingen gebruiken op

Nadere informatie

Subrapporten. 5.1 Inleiding

Subrapporten. 5.1 Inleiding 5 Subrapporten 5.1 Inleiding Een subrapport is een rapport in een rapport. Een subrapport maak je dan ook net zoals je een gewoon rapport maakt. Een subrapport heeft bijna alle eigenschappen die een normaal

Nadere informatie

ICARUS Illumina E653BK on Windows 8 (upgraded) how to install USB drivers

ICARUS Illumina E653BK on Windows 8 (upgraded) how to install USB drivers ICARUS Illumina E653BK on Windows 8 (upgraded) how to install USB drivers English Instructions Windows 8 out-of-the-box supports the ICARUS Illumina (E653) e-reader. However, when users upgrade their Windows

Nadere informatie

Kennismaken Greenfoot

Kennismaken Greenfoot HOOFDSTUK 1 Kennismaken met Greenfoot onderwerpen: de interface van Greenfoot, omgaan met objecten, methodes aanroepen, een scenario uitvoeren concepten: object, klasse, methode-aanroep, parameter, retourwaarde

Nadere informatie

- Plan Zo kun je een. website bouwen!

- Plan Zo kun je een. website bouwen! - Plan Zo kun je een website bouwen! BoekjeHoeKanJeEenWebsiteBouwen.i1 1 8-7-2008 17:23:14 BoekjeHoeKanJeEenWebsiteBouwen.i2 2 8-7-2008 17:23:15 In dit boekje staat de uitgebreide versie van hoe je een

Nadere informatie

Manual e-mail. Aan de slag. in beroep en bedrijf. Manual e-mail

Manual e-mail. Aan de slag. in beroep en bedrijf. Manual e-mail Aan de slag in beroep en bedrijf Branche Uitgevers 1 Alle rechten voorbehouden. Niets uit deze uitgave mag worden verveelvoudigd, opgeslagen in een geautomatiseerd gegevensbestand dan wel openbaar gemaakt

Nadere informatie

Zo kan je linken maken tussen je verschillende groepen van gegevens.

Zo kan je linken maken tussen je verschillende groepen van gegevens. 1 1. Entity Reference Entity Reference zal ook een onderdeel zijn van Drupal 8. Het is een module van het type veld. Het is een heel krachtige module die toelaat om referenties te maken tussen verschillende

Nadere informatie

8.8 Records selecteren

8.8 Records selecteren 8.8 Records selecteren Voor het maken van een uittreksel van één of meerdere records die aan een bepaald criterium voldoen, maakt u gebruik van het 'Filter'. 8.8.1 Automatisch filter Klik in het gebied

Nadere informatie

Reliance 4 First Steps. First steps. Versie 1.0 03-10-2008-1- B3 industrie b.v.

Reliance 4 First Steps. First steps. Versie 1.0 03-10-2008-1- B3 industrie b.v. First steps Versie 1.0 03-10-2008-1- 1. Introductie Het doel van deze handleiding is om een nieuwe gebruiker kennis te laten maken met de basisfuncties van Reliance 4 Design de ontwikkelomgeving van Reliance

Nadere informatie

Trainingsomschrijving ACCESS 97 / 2000 / 2003NL

Trainingsomschrijving ACCESS 97 / 2000 / 2003NL Module 1 Inleiding Module 2 Ontwerpen van tabellen Module 3 Relationele databases en queries Module 4 Formulieren en rapporten Module 5 Geav. formulieren en rapporten Module 6 Macro s en menu s Module

Nadere informatie

Inleiding Visual Basic en VBA. Karel Nijs 2009/01

Inleiding Visual Basic en VBA. Karel Nijs 2009/01 Inleiding Visual Basic en VBA Karel Nijs 2009/01 Leswijze Eerst wat theorie Begeleid met (korte) oefeningen Ms Excel 2003 Online hulp: http://www.ozgrid.com/vba/ http://msdn.microsoft.com/en-us/library/sh9ywfdk(vs.80).aspx

Nadere informatie