Eindwerk Wim Proot

Embed Size (px)

Citation preview

Eindwerk

Studiegebied Bachelor Afstudeerrichting Academiejaar Student

Handelswetenschappen en Bedrijfskunde Toegepaste Informatica 2009-2010

Wim Proot

Thema

Onderzoek naar de web services in Microsoft Dynamics NAV 2009Het onwikkelen van een planningsapplicatie op basis van web services

Stageplaats

Astena NVGentbrugge

Howest-de Hogeschool West-Vlaanderen Rijselstraat 5 8200 Brugge T 050 38 12 77 F 050 38 11 71 [email protected] www.howest.be

Stage Astena NVWim ProotOnderzoek naar de web services in Microsoft Dynamics NAV 2009 Het ontwikkelen van een planningsapplicatie die gebruik maakt van web services

Project aangeboden door Wim Proot voor het behalen van de graad Bachelor in de Toegepaste Informatica Academiejaar 2009 - 2010

Astena NV

1

Astena NV

1. Woord voorafAl sinds het begin van de driejarige opleiding Toegepaste Informatica keek ik reikhalzend uit naar de afsluitende stage. Niet omdat deze ook onmiddellijk het einde van de opleiding betekent maar vooral om eindelijk ervaring te kunnen opdoen in de echte wereld. 3 maanden lang aan de slag gaan bij een bedrijf om daar onder begeleiding aan een echt project te kunnen werken. Dagen, weken, maanden, jaren, examens, opdrachten, vlogen voorbij. En toen was de stage eindelijk aangebroken. Met een klein hartje stapte ik in mijn auto en reed ik richting Gentbrugge. Al gauw bleek dat mijn zenuwachtigheid voor niets nodig was. Ik werd met open armen onthaald door alle collegas. Ik kreeg niet enkel de noodzakelijke uitleg over Microsoft Dynamics NAV 2009 en mijn stageopdracht maar kreeg ook een snelcursus koffie zetten. Er is werkelijk een goeie sfeer op mijn stagebedrijf, de potjes manillen over de middag, het bakje friet op vrijdag, het afsluitende pintje op vrijdagavond, Allemaal toffe momenten waar ik met veel plezier naar terug kijk. In de eerste plaats wens ik de heer Patrick Galleyn, zaakvoerder van Astena, te bedanken omdat ik in zijn bedrijf mijn stage mocht lopen, net als Stijn Mattheus die me in contact bracht met Patrick. Mijn dankbaarheid gaat ook uit naar alle collegas bij Astena voor de open ontvangst, alle tips, uitleg en advies, Ook wens ik mijn stagebegeleider, mevrouw Kristien Roels, te bedanken voor het begeleiden van mijn stage, het nalezen van mijn eindwerk, het beantwoorden van alle vragen, de vlotte communicatie, Verder zou ik ook graag mijn vriendin Vicky bedanken voor haar steun, haar luisterend oor en haar bereidheid om me te helpen. Ook mijn vader wil ik bedanken, niet alleen om het voor mij mogelijk te maken deze opleiding te volgen, maar ook voor het nalezen van mijn eindwerk, het leveren van kritisch commentaar, het bespreken van alle aspecten van de stage, de steun tijdens mijn zoektocht naar een job, Als laatste wil ik ook graag mijn mama bedanken. Je dapperheid en doorzettingsvermogen zullen altijd een bron van motivatie en inspiratie zijn voor mij.

2

Astena NV

2. SamenvattingTijdens mijn stage heb ik de web services in Microsoft Dynamics NAV 2009 onderzocht en bestudeerd. Het resultaat van mijn onderzoek is terug te vinden in dit eindwerk. Er wordt besproken hoe de web services geactiveerd worden en hoe je ze kan aanspreken. Ook wordt er besproken welke gegevens via de web services opgevraagd en bijgewerkt kunnen worden, en op welke manier we de web services kunnen manipuleren en uitbreiden. Zo werd er een web service ontworpen die elk veld uit Microsoft Dynamics NAV 2009 kan uitlezen en bijwerken. Rond deze web service wordt een een C#.NET-klasse geschreven die bruikbaar is in allerhande applicaties. Voor de bestudering van de bruikbaarheid wordt er een planningsapplicatie ontwikkeld ter vervanging van de huidige applicatie PlanningPME van de firma Target Skills. Via deze planningsapplicatie kunnen taken op een visuele manier toegewezen worden aan resources. Het doel van deze applicatie is het werk van de planner vereenvoudigen en optimaliseren. Zo werd er veel aandacht besteed aan uitgebreide plannings en filtermogelijkheden. Al snel wordt duidelijk dat vooral de performantie een pijnpunt is van de web services. In dit eindwerk worden dus ook allerhande mogelijkheden besproken om de performantie te verbeteren.

Sleutelwoorden: Microsoft Dynamics NAV 2009, code unit, web services, Web Service Connector, C#.NET, C/AL, WBS, Planning Line, plannen, planningstool, Windows Forms, filteren.

3

Astena NV

3. AbstractDuring my internship Ive researched the web services of Microsoft Dynamics NAV 2009. The result of this research is available in this dissertation. Im explaining how to activate the web services en how to use them. Im also describing how to read and update fields, and how to manipulate and expand the web service. Im developing a web service which is able to read every field from Microsoft Dynamics NAV 2009 and update this field. Wrapped arount this web service Ive written a C#.NET-class which can be widely used in all kinds of application. To study the usability Ive designed a planning application to replace the application which is currently being used, PlanningPME from Target Skills. With this application it is possible to visually assign tasks to resources. The purpose of this application is to simplify and optimize the work of a planner. For that reason a lot of attention is given to extensive planning and filter options. Soon became clear that performance is the bottleneck of web service. In this dissertation a lot of possibilities to boost the performance are discussed.

Keywords: Microsoft Dynamics NAV 2009, code unit, web services, Web Service Connector, C#.NET, C/AL, WBS, Planning Line, to plan, planningstool, Windows Forms, filtering.

4

Astena NV

Inhoudsopgave1. 2. 3. 4.4.1. 4.2.

Woord vooraf ...................................................................................... 2 Samenvatting ...................................................................................... 3 Abstract .............................................................................................. 4 Inleiding ............................................................................................. 7Astena ..........................................................................................................7 ERP ..............................................................................................................8 Wat is ERP? .............................................................................................8 Wat zijn de voordelen van een ERP-pakket? .................................................8 Welke ERP-pakketten zijn er beschikbaar? ...................................................8 Microsoft Dynamics ..................................................................................9

4.2.1. 4.2.2. 4.2.3. 4.2.4.

5.5.1. 5.2.

Stageopdracht (deel 1) ..................................................................... 13Omschrijving ............................................................................................... 13 Onderzoek ................................................................................................... 14 Webservice............................................................................................ 14 Hoe publiceer je een codeunit als webservice in Microsoft Dynamics NAV 2009 16 C/AL ..................................................................................................... 20 C/AL code in een Code Unit...................................................................... 21 Benaderen van de webservice in C#.NET ................................................... 22 Uitwerken van de opdracht ...................................................................... 30 De klasse WebServiceConnector ............................................................... 33

5.2.1. 5.2.2. SP1? 5.2.3. 5.2.4. 5.2.5. 5.2.6. 5.2.7.

6.6.1. 6.2. 6.3.

Stageopdracht (deel 2) ..................................................................... 36Situering ..................................................................................................... 36 Huidige oplossing ......................................................................................... 37 Beknopte omschrijving van de applicatie .......................................................... 38 Deel 1: ................................................................................................. 38 Deel 2: ................................................................................................. 38

6.3.1. 6.3.2.

7.7.1. 7.2.

Onderzoek naar mogelijke controls voor de visualisatie ................... 39Gratis ......................................................................................................... 39 Microsoft Chart Controls .......................................................................... 39 Oplossing 1 ........................................................................................... 40 Oplossing 2 ........................................................................................... 41 Oplossing 3 ........................................................................................... 42 Oplossing 4 ........................................................................................... 43 Netronic VARCHART XGantt ..................................................................... 44 Kroll Software Gantt Control .................................................................... 44 Contacteren firmas ................................................................................ 44 Betalend ............................................................................................... 45 Betalend ..................................................................................................... 40 7.1.1. 7.2.1. 7.2.2. 7.2.3. 7.2.4.

7.3.

Evaluatie ..................................................................................................... 44

7.3.1. 7.3.2. 7.3.3. 7.4. 7.5. 7.4.1.

Verder zoeken naar mogelijke controls ............................................................ 45 Besluit ........................................................................................................ 47

8.8.1.

Analysedossier .................................................................................. 48Omschrijving van de applicatie ....................................................................... 48

5

Astena NV

8.2.

Analyse van de back-end ............................................................................... 50 Niet functionele specificaties .................................................................... 50 Functionele specificaties .......................................................................... 50 Objecten ............................................................................................... 51 Implementatie ....................................................................................... 52 Niet functionele specificaties .................................................................... 58 Functionele specificaties Requirements List .............................................. 58 Use Cases ............................................................................................. 59 Plannen ................................................................................................ 59 Filteren ................................................................................................. 60 Views en plannen ................................................................................... 63 Filters op de WBSen ............................................................................... 63 Filters op de resources ............................................................................ 64 Datum navigator en refresh knop ............................................................. 65

8.2.1. 8.2.2. 8.2.3. 8.2.4. 8.3. 8.3.1. 8.3.2. 8.3.3. 8.3.4. 8.3.5.

Analyse van de front-end (view) ..................................................................... 58

9.

Bespreking van het programma ........................................................ 629.1.1. 9.1.2. 9.1.3. 9.1.4.

10. 11.11.1. 11.2.

Performantieproblemen .................................................................... 66 Conclusie ........................................................................................... 68Stageopdracht (deel 1) ................................................................................. 68 Stageopdracht (deel 2) ................................................................................. 68

12. 13. 14.

Kritische reflectie .............................................................................. 70 Goedkeuring eindwerk ...................................................................... 71 Bijlage 1 Use Cases ........................................................................ 72

6

Astena NV

4. Inleiding4.1. AstenaDe firma Astena is gevestigd in het Trevi-gebouw te Gentbrugge, een deelgemeente van Gent. Astena is een softwarebureau dat zich voornamelijk richt op het aanbieden van bedrijfsoplossingen voor Belgische KMOs. Het bedrijf biedt betaalbare, betrouwbare en kwalitatieve oplossingen aan ter ondersteuning en optimalisering van de dagelijkse bedrijfsvoering. Astena investeerde in de ontwikkeling van een totaaloplossingen voor service en projectbedrijven. Dit resulteerde in standaardoplossingen die volledig aansluiten op de specifieke behoeften van de klant. Het grote voordeel hiervan is dat het bewezen kant-enklare oplossingen betreft die slechts een korte implementatietijd vergen. Alle oplossingen van Astena zijn gebouwd op het Microsoft-platform. Er wordt dus gewerkt met de vertrouwde Microsoft-producten zoals Microsoft Dynamics NAV, Microsoft SharePoint, Microsoft SQL Server,... Dit staat garant voor continuteit en gebruiksvriendelijkheid. De inspanningen van Astena werden erkend door Microsoft. Als Microsoft Gold Partner kreeg Astena de grootste erkenning. Astena maakt deel uit van de overkoepelende CRONOS groep. CRONOS werd in 1991 opgericht door Jef de Wit die nog steeds verantwoordelijk is voor het bedrijf. Het basisidee was om een nieuwe ICT-markt te verkennen en voor deze nichemarkt leider in de dienstverlening te worden. CRONOS probeerde vervolgens om de niche diensten die zij aanboden te verbreden en evolueerden naar een aanbieder van oplossingen. Zodra deze cyclus afgesloten was, pasten ze hetzelfde concept toe op een andere markt. Door de jaren geen verzamelde CRONOS een enorme hoeveelheid ervaring in het ontwerpen, implementeren en ontwikkelen van business en ICT-plossingen voor een breed scala van markten. Met Client/Server Development, Object Oriented Development, Component-Based Development, Multi-Vendor Integration, Legacy Migration & Integration, Product Development, Helpdesk Support, Zoals het bovenstaande bewijst is CRONOS echt van elle markten thuis. Als antwoord op de steeds veranderende technologie, de markt en de behoeften van de klant blijft CRONOS evolueren. Op deze manier zijn ze altijd klaar om klanten te helpen op elke mogelijke manier. CRONOS zegt dat het succes gegarandeerd is door het balanceren van strikt management met creatieve werknemers die in staat zijn om outside the box te denken.

7

Astena NV

4.2.4.2.1.

ERPWat is ERP?ERP is de afkorting Enterprise Resource Planning. Het doel van ERP is het verhogen van de productiviteit van organisaties, het beheersen van kosten en optimaal te voldoen aan klantwensen. Dit wordt gerealiseerd door de automatische afhandeling van logistieke, administratieve en financile bedrijfsprocessen onder te brengen in n informatie en managementssysteem. Deze oplossing staat bekend als een ERP-pakket of een ERPsysteem. Een ERP-pakket is toepasbaar voor nagenoeg elk type organisatie.

4.2.2.

Wat zijn de voordelen van een ERP-pakket?Door gebruik te maken van een ERP-pakket wordt de organisatie effectiever, efficinter, sneller en flexiber. Het pakket zorgt voor een betere beheersing van bedrijfsprocessen, de doorlooptijden van orders verkoren terwijl de klantgerichtheid stijgt, de voorraadkosten dalen en de servicekwaliteit gaat de hoogte in. Het grote voordeel van een ERP-pakket is dat er gebruik gemaakt wordt van een centrale database. Hierdoor kan voor verschillende bedrijfsprocessen dezelfde informatie gebruikt worden. Op deze manier wordt redundantie vermeden en is de consistentie van de informatie gegarandeerd. Hierdoor verbetert ook de communicatie tussen afdelingen en bedrijfsonderdelen waardoor de beheersbaarheid van het bedrijfsproces stijgt. De onderlinge samenhang van bedrijfsprocessen wordt beter waarneembaar, net als de zwakke plekken. Een ERP-systeem heeft een grote invloed op de planning van processen. De verbanden die ontstaan tussen verkoop, ontvangen orders, calculatie, voorraad, nkoop, capaciteit en productie verzekeren een minale voorraad en een maximale zekerheid omtrent de beschikbaarheid van personeel, middelen en materiaal.

4.2.3.

Welke ERP-pakketten zijn er beschikbaar?Gedurende een lange tijd leken enkel grote spelers ERP-pakketten aan te bieden. Dit is intussen veranderd. Grote spelers fuseren en nieuwe producten en leveranciers beginnen aan een opmars. Ook leveranciers van financile software ontwikkelen een ERP-versie van hun pakket. Er is dus een enorm aanbod aan beschikbare ERP-pakketten en dienstverleners. De grootste spelers op de markt van ERP-pakketten zijn echter:

SAP Oracle Applications The Sage Group Microsoft Dynamics o Microsoft Dynamics AX, NAV, GP, SO en CRM.

De firma Astena spitst zich toe op Microsoft Dynamics NAV.

8

Astena NV

4.2.4.Navision

Microsoft DynamicsHet onstaan van Microsoft Dynamics gaat terug naar het jaar 1983 wanneer Jesper Balser, Peter Bang en Torben Wind de firma Navision opgericht hebben in Vedbk, een klein plaatsje niet ver van Kopenhagen, de hoofdstad van Denemarken. De firma Navision bracht in 1984 hun eerste software product uit in Denemarken en Noorwegen. De naam van het product was PCPlus, een character based MS DOS applicatie gericht op kleine en middelgrote bedrijven. Destiijds was hun slogan Beauty of Simplicity.

PCPlus In 1987 werd er een nieuwe applicatie uitgebracht onder de naam Navigator. Dit was een character based client/server-applicatie op MS DOS en het OS/2-platform. Ook was er een versie beschikbaar voor het RS/6000 platform van IBM. De server kon op het ene platform draaien en de clients op een ander platform. Hiermee was het mogelijk om een server met RS/6000 op te zetten en de clients lokaal onder DOS en later in een DOS-shell in Windows te draaien. Remote clients konden met een terminal een sessie op de UNIX-server starten. Hiermee waren ze op dit moment ver voor op hun concurrenten. De grote veranderingen kwamen er in 1990 met de lancering van Navision 3.0 voor MS DOS. Het marktgebied werd eveneens uitgebreid met Zweden, Finland, Duitsland, Spanje, Verenigd Koninkrijk en de verenigde staten. Op ook op de Amerikaanse markt succesvol te zin werden er opnieuw heel wat vooruitstrevende verbeteringen doorgevoerd: Er werd gestart met de ontwikkeling van een Windows-versie De layout werd aantrekkelijker gemaakt Verbetering van de afdruk en rapporteringsmogelijkheden

9

Astena NV

In 1992 werd er een prototype ontworpen voor Windows 3.10. Uiteindelijk werd er beslist om de bestaande character based applicatie te blijven verkopen en ondertussen te starten met de ontwikkeling van een 16 bit versie voor Windows 95.

Navision voor Windows 3.10 De eerste versie voor Windows werd gelanceerd op de Amerikaanse markt in 1995. De applicatie werd ontwikkeld voor het Windows 95 en Windows NT-platform. Er werden eveneens extra functionaliteiten ingevoerd: Contact Management in 1997, Manufacturing in 1998 en Advanced Distribution in 1999. Sinds 2000 heet het pakket Navision Financials (versie 2.1) en behaalde Navision het Microsoft Windows 2000 Professional-certificaat en het Microsoft Windows 2000 Servercertificaat. Ook werd Navision Commerce Gateway op de markt gebracht. Dit was wereldwijd de eerste oplossing gebaseerd op Microsoft Biztalk Server. Ook werd het Navision User Portal ontwikkeld. Dit was gebaseerd op Microsoft Digital Dashboard. In 2001 nam Navision zijn Deense rivaal Damgaard Software over. Beide producten waren immers ontworpen in Denemarken en allebei de bedrijven hadden Amerikaanse klanten in Atlanta. Hierdoor zat het management van beide bedrijven vaak samen op het zelfde vliegtuig waardoor deze aan de praat raakten. Deze overname had volgende gevolgen:

Navision Financials kreeg de nieuwe naam Navision Attain en Damgaard Axapta werd Navision Axapta Commerce Gateway en Commce Portel (e-commerce) werd in beide pakketten gentegreerd Het User Portal werd gentroduceerd Nieuwe functionaliteit voor distributie/logistiek, productie en boekhouding werd toegevoegd Ze verkregen het Designed for Windows XP-logo.

10

Astena NV

Microsoft liet in 2002 zijn oog vallen op het sterk gegroeide Navision. Microsoft wou ook toetreden tot de ERP-business, maar deze markt was al enorm gevolueerd en had enkele sterke spelers. Het ontwikkelen van een nieuwe versie was nagenoeg ondoenbaar. Uiteindelijk kocht Microsoft Navision over voor 1,4 miljard dollar. Dynamics

Vandaag is Navision populairder dan ooit. Momenteel is de kaap van 35 000 klanten en 400 000 gebruikers reeds overschreden. De grote kracht van Navision was de lage prijs voor het basispakket samen met de modulaire opbouw en de mogelijkheid om zelf de funtionaliteit uit te breiden of aan te passen. Microsoft heeft zijn ERP-structuur volledig heringedeeld. Ook andere Amerikaanse ERPsystemen werden overgenomen door Microsoft: GreatPlains en Solomon. Microsoft gaf de naam Dynamics aan de volledige productlijn. Elk apart product kreeg een afkorting. Ze bestaan er de producten Dynamics NAV, het vorige Navision, Dynamics AX, het vorige Axapte, Dynamics GP, het vorige GreatPlains; Dynamics SO, het vorige Solomon en Dynamics CRM, het frontoffice CRM. Ook werd Dynamics NAV en Dynamics AX volledig gentegreerd met andere Microsoftproducten zoals Office, SharePoint,...

11

Astena NV

Microsoft Dynamics NAV 2009

De versie waar ik tijdens mijn stage mee gewerkt heb is Microsoft Dynamics NAV 2009. Dit is eveneens de laatste versie die voorgesteld werd in oktober 2008 tijdens het Convergence Event in Denemarken. Dit is eveneens de eerste release van de Three Tier Client.

12

Astena NV

5. Stageopdracht (deel 1)5.1. OmschrijvingEen van de vernieuwingen binnen Microsoft Dynamics NAV 2009 is de ondersteuning van web services. Het is mogelijk om pages en codeunits beschikbaar te stellen als web service. Het eerste deel van mijn stageopdracht is het onderzoeken van deze nieuwe feature en welke de mogelijkheden hiervan zijn. Eens ik uitgezocht heb op welke manier je pages en codeunits beschikbaar kan stellen als web service is de volgende stap verbinding leggen met deze web services vanuit de Visual Studio ontwikkelomgeving. De bedoeling is het ontwerpen van een klasse in CSharp.NET die kan communiceren met de web services van Microsoft Dynamics en die de uitwisseling van data mogelijk maakt. Tot voor kort was data voor externe applicaties enkel beschikbaar via de MS-SQL databank waar Microsoft Dynamics NAV 2009 op draait. Het grote nadeel hiervan is dat alle business logic die ingebouwd is in Microsoft Dynamics NAV 2009 niet gebruikt wordt. Bijgevolg kan de integriteit van de data niet gegarandeerd worden. Deze te ontwerpen Web Service Connector moet niet alleen in staat zijn gegevens op te halen uit Microsoft Dynamics, maar moet deze gegevens ook kunnen aanpassen en opnieuw doorsturen. Dit moet gebeuren op een eenvoudige en intutieve manier. Hiervoor moet de klasse onder meer FindFirst(), Next(), FindLast(),... methodes bevatten. Samengevat kunnen we zeggen dat deze klasse moet fungeren als een soort van mediator tussen Microsoft Dynamics en nieuwe applicaties.

13

Astena NV

5.2.

OnderzoekDe eerste stap was het installeren en configureren van de benodigde software. Naast Microsoft Dynamics NAV 2009 werd ook SQL Server 2008 genstalleerd op mijn laptop. Ook was het noodzakelijk SP1 voor Visual Studio 2008 te installeren. Hierna kon ik beginnen met mijn onderzoek naar de web services in Microsoft Dynamics 2009. Tijdens mijn onderzoek werden onder andere volgende vragen beantwoord:

Wat is een web service? Wat kan men toegankelijk maken via een web service? Hoe kan men een nieuwe web service aanmaken? Hoe kan men een web service publiceren met Microsoft Dynamics? ...

5.2.1.

WebserviceMen kan een webservice omschrijven als een interface van een applicatiecomponent die toegankelijk is via standaard webprotocollen en waarbij gecommuniceerd wordt via XML. Hierbij wordt er vaak gebruik gemaakt van het SOAP-protocol.

SOAP-Protocol

SOAP staat voor Simple Object Access Protocol en wordt gebruikt voor de communicatie tussen verschillende componenten. SOAP is een protocol dat XML-berichten stuurt, meestal over HTTP, maar ook over SMTP, HTTPS of FTP.

XML

XML staat voor Extensible Markup Language en is een standaard van het World Wide Web Consortium voor de syntaxis van formele markuptalen. Deze representatie is niet alleen leesbaar voor een machine, maar ook voor de mens. XML wordt gebruikt voor de opslag van gegevens en om gegevens over het internet te versturen. XML gebruikt elementen en attributen om gegevens te structureren. Uiteraard moet er afgesproken worden welke tags er gebruikt mogen worden, welke gegevens acceptabel zijn, en hoe ze precies moeten worden opgegeven. Deze afspraken worden uitgedrukt in XML Schema Definition Language, de zogenaamde XSD-bestanden.

Voordelen van webservices

Dankzij een webservice is het mogelijk om op afstand vanaf een client een dienst aan te vragen op een service. Een voorbeeld hiervan is het maken van een berekening. Of een touroperator die in zijn applicatie de webservice van een luchtvaartmaatschappij gebruikt en op deze manier de klant de indruk kan geven van een gentegreerde applicatie. Microsoft Dynamics NAV 2009 biedt ondersteuning voor het publiceren van codeunits en pages als een webservice.

Webservices en Microsoft Dynamics

14

Astena NV

Codeunit

Een codeunit bevat C/AL code en kan gebruikt worden in verschillende applicatieobjecten. In eenvoudige applicaties kan je de code in het object dat de functies aanroept plaatsen, bijvoorbeeld in forms. Vaak zal je bepaalde functies vaak gebruiken, hiervoor kan je een codeunit gebruiken om deze functies eenmalig te definiren. Voor het eerste deel van mijn stageopdracht zullen we gebruik moeten maken van een codeunit.

Page

Wanneer een page als een webservice beschikbaar gemaakt wordt, is er een default set methodes die gebruikt kunnen worden. Deze bevatten de meeste basishandelingen zoals Create, Read, Update en Delete. Met behulp van codeunits kan deze default set van methoden uitgebreid worden. Wanneer een codeunit als webservice beschikbaar gemaakt wordt behoud je als ontwikkelaar de meeste controle en flexibiliteit over het gedrag van de webservice. Bij een webservice gebaseerd op een codeunit is er geen default set van methoden beschikbaar, het is volledig aan de ontwikkelaar om te beslissen welke methoden beschikbaar gemaakt moeten worden.

15

Astena NV

5.2.2.

Hoe publiceer je een codeunit als webservice in Microsoft Dynamics NAV 2009 SP1?Het publiceren van een codeunit als webservice met Microsoft Dynamics NAV 2009 SP1 is opmerkelijk eenvoudig. Tijdens de korte training die ik gekregen heb werd al gauw duidelijk dat Microsoft Dynamics NAV 2009 niet uit te leggen valt in een paar uur. Microsoft Dynamics NAV 2009 is een heel uitgebreid pakket met oneindig veel mogelijkheden. In tegenstelling tot mijn eerste indruk van Microsoft Dynamics NAV 2009 is het publiceren van web services echt kinderspel. Na het volgen van een goeie tutorial 1 die ik online gevonden heb kreeg ik de web services heel gauw aan de praat. We starten Microsoft Dynamics NAV 2009 Classic with Microsoft SQL Server op en volgen deze stappen: Bestand => Database => Openen. We geven volgende gegevens in om de correcte database te selecteren:

1

http://msdn.microsoft.com/en-us/library/dd339004.aspx 16

Astena NV

Nu drukken we op F12 en selecteren we Cronus Belgi NV in het menu:

Nu krijgen we volgend scherm te zien:

We drukken op Shift + F12 om de Object Designer te openen:

17

Astena NV

We klikken links op Form en scrollen naar het form met ID 810 en de naam Web Services.

We klikken op Web Services en klikken rechts onderaan op Run. Het volgende scherm verschijnt:

In dit scherm kunnen we vrij eenvoudig kiezen welke codeunit of page we als webservice beschikbaar willen stellen. We kiezen in de eerste kolom om ofwel een codeunit, ofwel een page te gebruiken, in de volgende kolom voeren we zijn id in, we kiezen een naam, en klikken geplubliceerd aan. Door dit venster de sluiten worden de wijzigingen doorgevoerd. In dit geval koos ik ervoor om de codeunit met object-id 50000 te publiceren als web service met de naam WSCmfrt. Nu mogen we niet vergeten de service te starten (of te herstarten).

18

Astena NV

Start services.msc en start (of herstart) de service Microsoft Dynamics NAV Business Services.

Hierna kunnen we door middel van deze link eenvoudig navigeren naar de gepubliceerde codeunit met object-id 50000 en servicenaam WSCmfrt: http://localhost:7047/DynamicsNAV/WS/Codeunit/WSCmfrt Wanneer we met onze browser navigeren naar deze URL komen we terecht op de WSDL pagina van onze webservice:

19

Astena NV

WSDL

WSDL staat voor Web Service Description Language en is een XML-taal waarmee de interfaces van web services worden beschreven. Uit deze schermafbeelding kunnen we besluiten dat we er in geslaagd zijn onze codeunit als web service beschikbaar te stellen. Normaal zou het geen enkel probleem mogen vormen om deze nu te benaderen vanuit CSharp.NET.

5.2.3.

C/ALVoor het eerste deel van mijn stageopdracht zal er een codeunit ontworpen en gemplementeerd worden die de nodige procedures bevat om door data te lopen. Deze codeunit wordt geschreven in C/AL. Hierna zal deze codeunit zoals eerder beschreven beschikbaar gesteld worden als codeunit en aangesproken worden vanuit CSharp.NET.

Wat is C/AL

C/AL of C/SIDE Application Language is een event-based programmeertaal gebaseerd op Pascal. C/AL is een gentegreerde taal voor het Microsoft Navision platform. Een aantal objecten in deze taal zijn specifiek voor Navision, maar ook een groot deel van de standaardfuncties zijn terug te vinden. C/AL zou in n van de volgende versies van Navision afgeschaft en vervangen worden door .NET met de mogelijkheid om in codesnippets C/AL te gebruiken. Een groot verschil met andere programmeertalen is dat C/AL event-based is en niet objectgeorinteerd. Bijna alle functies in Navision zijn in C/AL geprogrammeerd en kunnen dus door programmeurs aangepast en uitgebreid worden.

Waarvoor gebruik je C/AL?

Door middel van C/AL is het mogelijk business rules te creeren om ervoor te zorgen dat de data in de tabellen een betekenis heeft en consistent is met de manier waarop de klant zaken doet. Het is mogelijk nieuwe data toe te voegen en data van een tabel naar een andere tabel te verplaatsen. Indien je data van meerdere tabellen wenst te combineren tot n rapport, of de data wenst te tonen in 1 formulier zal je dit moeten programmeren met behulp van C/AL.

20

Astena NV

5.2.4.

C/AL code in een Code UnitHieronder kun je een voorbeeld vinden van een Code Unit. Deze bevat C/AL code.

Elke grijze balk noemt men een trigger. De C/AL code onder de grijze balk is de trigger code voor deze trigger. Indien deze geen code bevat spreken we van een lege trigger. Documentation() en OnRun() zijn in bovenstaande afbeelding lege triggers. Er zijn 3 soorten triggers:

Documentation Trigger o Dit is eigenlijk geen echte trigger. Deze trigger wordt gebruikt voor het schrijven van documentatie of als changelog. Event Trigger o De naam van deze triggers begint altijd met On. De C/AL code in een Event Trigger wordt uitgevoerd wanneer het event met die naam zich voordoet. Bijvoorbeeld: de code in OnRun() wordt getriggerd telkens als dit code unit object gerunned wordt. Function Trigger o Deze triggers worden gemaakt wanneer je een functie maakt in een object. De C/AL code in deze trigger wordt uitgevoerd wanneer de functie aangeroepen wordt.

21

Astena NV

5.2.5.

Benaderen van de webservice in C#.NETNu is het de bedoeling dat we deze webservice kunnen aanspreken vanuit een CSharp.NET applicatie en we de procedures uit de codeunit kunnen aanspreken. Er zijn twee manieren om web services aan te spreken; zowel met als zonder een service reference. Ik heb allebei de manieren uitgetest.

Met een Service ReferenceDe eerste methode die ik uitgetest heb is de methode met service reference. Het grote voordeel hiervan is dat je tijdens het programmeren gebruik kan maken van Intellisense. Deze methode is eveneens de eenvoudigste methode en is tijdens de opleiding aan bod gekomen. Hierdoor zou ik in staat moeten zijn om snel verbinding met de web service te kunnen maken om te controleren als alles correct geconfigureerd is in Microsoft Dynamics.

Uitwerking en testenDe webservice die ik uitgetest heb is de SystemService webservice van Microsoft Dynamics NAV 2009. Deze web service dien je niet zelf als web service beschikbaar te stellen. Deze is gewoon bereikbaar. Met deze webservice is het onder andere mogelijk alle bedrijven op te vragen. Deze webservice is te bereiken via http://localhost:7047/DynamicsNAV/WS/SystemService. Ik ben begonnen met de aanmaak van een nieuwe Console Application in Visual Studio. Hierna heb ik de juiste reference gelegd. In de Solution Explorer klikken we rechts op Service References en klikken we op Add Service Reference:

22

Astena NV

We geven de correcte locatie van de webservice in, klikken op Go. Zoals je kunt zien verschijnt SystemService in de lijst met beschikbare services. We selecteren deze, geven hem de naam SystemServiceRef en klikken op Ok.

Nu maken we met behulp van onderstaande code connectie met de webservice, vragen de lijst van alle bedrijven op, en schrijven deze naar het scherm:string baseURL = "http://localhost:7047/DynamicsNAV/WS/SystemService"; // Maak de SystemService Client SystemService_PortClient systemService = new SystemService_PortClient(navWSBinding, new EndpointAddress(baseURL));

Console.WriteLine("Companies:"); string[] companies = systemService.Companies(); foreach (string company in companies) { Console.WriteLine(company); }

23

Astena NV

Indien we dit programma runnen krijgen we deze uitvoer:

Zoals je kunt zien is het mogelijk om met behulp van een service reference connectie te leggen met de web service en werkt deze perfect. De uitvoer is zoals verwacht.

BesluitDoor gebruik te maken van een service reference is het heel eenvoudig connectie te leggen met een web service van Microsoft Dynamics NAV 2009. Er is eveneens ondersteuning voor Intellisense.

Zonder Service ReferenceNu ben ik op zoek gegaan naar een manier om te connecteren met een web service zonder gebruik te maken van een service reference. Op deze manier zou het mogelijk zijn at runtime verschillende web services aan te spreken. Na een tijd zoeken ben ik terecht gekomen op de website 2 van David Roys. Hij heeft een kleine applicatie ontwikkeld waarin je de URL van de webservice moet ingeven waarna alle beschikbare methodes automatisch opgehaald worden. Hierna is het mogelijk om deze methodes uit te voeren, en return waarde te bekijken. In eerste instantie was het niet mogelijk om een array van returned waarden op te vangen en weer te geven. Mits een kleine aanpassing heb ik dit ook mogelijk gemaakt. Dit is de uitvoer van deze applicatie:

2

http://www.gaspodethewonderdog.blogspot.com/ 24

Astena NV

Zoals je kunt zijn is deze uitvoer identiek aan de uitvoer in het vorige voorbeeld waarin wel met een service reference gewerkt werd. Dit programma bevat een klasse WebServiceInvoker die het mogelijk maakt om at runtime een webservice op te geven en de methodes van deze webservice uit te voeren. Het grote nadeel tegenover het gebruik van een service reference is uiteraard het feit dat er geen Intellisense beschikbaar is. De klasse WebServiceInvoker uit deze applicatie ga ik gebruiken als basis.

Uitwerken en uittestenVoor de uitwerking heb ik zoals eerder vermeld gebruik gemaakt van de klasse WebServiceInvoker. Rond de klasse WebServiceInvoker heb ik een schil geschreven, namelijk CustomInvoker. Deze klasse bevat het object WebServiceInvoker en gebruikt deze voor het oproepen en uitvoeren van de methodes van een webservice.

In deze klasse is het eenvoudig om voor elke C/AL procedure een bijhorende methode te schrijven met de correcte parameters, via de webservice de C/AL procedure aan te roepen, de return waarden op te vangen, en door te geven. Tevens heb ik methodes voorzien die als parameter de naam van de methode op de webservice en optioneel een array met parameters vraagt, en hierna de methode uitvoert. Dit zowel voor methodes die een enkele waarde retourneren, als voor methodes die een array retourneren. Op deze manier kan je elke procedure uit de codeunit aanroepen, op voorwaarde dat je de naam van deze procedure kent. Om deze klasse te testen heb ik een twee eenvoudige functies geschreven in C/AL. De eerste functie zal later gebruikt worden om een tabel in te stellen, maar momenteel geeft deze functie gewoon de parameter terug. De parameter is een integerwaarde. Om ook een functie met een parameter van een ander type te testen heb ik een Capitalize functie geschreven die een string inleest, deze omzet naar hoofdletters, en deze opnieuw weergeeft.

25

Astena NV

Om deze Capitalize functie aan te maken gaan we in Navision via de Object Designer naar de Code Unit, en we maken een nieuwe Code Unit aan. Hiervoor scrollen we naar de onderste regel, geven als ID 50000 in, als naam Web Service Cmfrt en als Version List Astena:

Nu openen we deze Code Unit door er op te klikken en onderaan op Design te klikken:

Nu klikken we op Beeld in de menubalk en hierna op C/AL Globals.

We geven als naam Capitalize in en klikken hierna op Locals:

We stellen een parameter in, we noemen deze inputstring, selecteren als DataType Text en geven een maximale lengte van 250 tekens op. Hierna klikken we op Return Value.

26

Astena NV

Als naam geven we outputstring in, selecteren Text als datatype, en opnieuw een maximale lengte van 250 tekens.

Hierna sluiten we beide vensters en komen we in een soort editor terecht. Hier zijn de naam van de functie, de paramaters en de return parameters reeds ingevuld. Nu zorgen we ervoor dat de inputstring wordt omgezet naar hoofdletters en sturen deze door als return waarde:

Nu sluiten we het venster. Hierna krijgen we deze melding. Zorg ervoor dat Compiled aangevinkt is en klik op Ja.

Nu moeten we uiteraard zorgen dat deze Code Unit als web service beschikbaar is. Nu kunnen we in Visual Studio deze procedure via de web service aanspreken.

27

Astena NV

We voegen een methode toe aan de klasse CustomInvoker met de naam Capitalize. Deze ziet er als volgt uit:

public string Capitalize(string inputstring) { method = "Capitalize"; object[] parameters = new object[1]; parameters[0] = inputstring; this.args = parameters; string result = invoker.InvokeMethod(service, method, args); return result; }Deze methode vraagt een string als argument, roept de methode Capitalize van de web service aan, en returned de return waarde van de methode Capitalize. Om vervolgens deze methode te kunnen aanroepen heb je volgende code nodig:

//Maaak een custominvoker CustomInvoker customInvoker = new CustomInvoker(); //testen van enkele code unit functies Console.WriteLine(customInvoker.Fct_SetTableID(10).ToString()); Console.WriteLine(customInvoker.Capitalize("hallo"));We beginnen met het aanmaken van een nieuwe CustomInvoker. Deze zorgt voor de aanmaak van een WebServiceInvoker met als parameter de juiste URI van de Web Service in Microsoft Dynamics 2009 SP1 en de correcte naam van de Web Service. Hierna roepen we de Capitalize functie aan en schrijven de return waarde naar een consolevenster:

Zoals je kunt zien werd hallo omgezet naar HALLO. Via deze klasses is het mogelijk om op een eenvoudige manier een Navision webservice aan te roepen, waarbij het mogelijk is om parameters mee te geven, en de return value op te vangen. Hierna heb ik van deze twee klasses een .DLL-bestand gemaakt zodat deze gebruikt kunnen worden in andere .NET-projecten. De naam van deze DLL is dllnavisionwebservices.dll. Om dit te demonstreren heb ik een nieuw project gemaakt, namelijk TestAppUsesDLL.

28

Astena NV

Aan dit project heb ik een nieuwe reference naar bovengenoemde DLL toegevoegd:

Om deze klassen te kunnen gebruiken voegen we volgende import toe:

using dllnavisionwebservices;De applicatie zelf is heel eenvoudig. Er is een veld voor invoer, een veld voor uitvoer en een Invoke Method knop. Bij het indrukken van deze knop wordt volgende code uitgevoerd:

private void button1_Click(object sender, EventArgs e) { CustomInvoker invoker = new CustomInvoker(); uitvoer.Text = invoker.Capitalize(invoer.Text); }We maken een nieuwe CustomInvoker en roepen de Capitalize-methode aan van deze CustomInvoker, met als parameter de waarde van het veld invoer. Tevens vangen we de return waarde van deze methode op en tonen deze in het uitvoer veld. Het resultaat ligt voor de hand:

BesluitZoals verwacht is de uitvoer bij het werken zonder service reference identiek aan de uitvoer indien er wel gebruik gemaakt wordt van een service reference. De manier van werken is echter heel wat complexer. Voor elke procedure op de web service dien je immers een methode aan te maken die zorgt voor de initialisatie van de correcte van de correcte parameters, om hierna de correcte procedure op de webservice aan te roepen. Deze methode wordt aangeroepen met behulp van de exacte procedurenaam. Fouten in deze procedurenaam kunnen niet gedecteerd worden door de compiler. Bijgevolg moet je ook op de hoogte zijn van de exacte procedurenamen. Indien je gebruik maakt van een service reference worden de namen van de procedures automatisch opgehaald, en kan je gebruik maken van Intellisense. Bijgevolg heb ik besloten gebruik te maken van een service reference voor het afwerken van het eerste deel van mijn stageopdracht.

29

Astena NV

5.2.6.

Uitwerken van de opdrachtNu we weten op welke manier we een codeunit als webservice beschikbaar kunnen stellen en aanspreken uit CSharp.NET wordt het tijd om een oplossing voor het eerste deel van mijn stageopdracht uit te werken. Zoals eerder gezegd koos ik ervoor om gebruik te maken van een service reference. In een codeunit werden de nodige procedures uitgewerkt om door data te kunnen lopen en deze data te wijzigen. Deze procedures werden uitgetest in Microsoft Dynamics en bleken te werken. Hierna zorgde ik ervoor dat deze codeunit als webservice aangesproken kon worden. Hierna werd het tijd om deze procedures aan te roepen vanuit CSharp.NET. Deze web service werd toegevoegd als service reference in een nieuw project, en hierna waren alle procedures zichtbaar via Intellisense en kon ik deze heel eenvoudig aanroepen. Hierbij kwamen enkele problemen bovendrijven.

Problemen

Als test had ik de nodige code geschreven om de namen van alle bedrijven af te drukken in een consolevenster. Hierbij kwamen enkele problemen aan het licht. Om bij te houden welke record de huidige record was werd er gebruik gemaakt van een globale variabele binnen de codeunit. Tijdens het testen bleek dat de webservice telkens een nieuwe instantie van de codeunit gebruikte. Dit resulteerde in een oneindige lus die telkens de naam van het eerste bedrijf afdrukte in het consolevenster. Ondanks diverse pogingen zowel binnen Navision als binnen de code in CSharp.NET bleek het niet mogelijk ervoor te zorgen dat telkens dezelfde instantie van de codeunit gebruikt werd. Hierna werd de codeunit aangepast. Op dit probleem op te lossen werd er gebruik gemaakt van een parameter van het datatype RecordID. Dit is een specifiek C/AL datatype. Deze parameter was een referentie naar de laatste record die de codeunit gelezen had. Op deze manier kon de codeunit weten welke het volgend record was. Dit datatype werd niet ondersteund door de web service en bijgevolg was het niet mogelijk deze codeunit te publiceren als webservice. Deze RecordID is noodzakelijk om de huidige record te specifiren, gezien het niet mogelijk is om te werken met een globale variabele. Om dit op te lossen werd de codeunit opnieuw aangepast, hierbij werd de RecordID parameter vervangen door een tekstvariabele en in de codeunit omgezet naar een RecordID. Deze aanpassingen bleken voldoende te zijn. Een lijst van alle bedrijven werd afgedrukt in het consolevenster.

30

Astena NV

Volgende code:

WSCmfrt_PortClient client = new WSCmfrt_PortClient(); String GTxt_RecID; String GTxt_OldRecID; GTxt_RecID = client.NavigateTable(18, 2, "", 0, 3); do { GTxt_OldRecID = GTxt_RecID; Console.WriteLine(client.NavigateTable(18, 2, GTxt_RecID, 0, 2)); GTxt_RecID = client.NavigateTable(18, 2, GTxt_OldRecID, -1, 1); } while (!(GTxt_OldRecID.Equals(GTxt_RecID)));genereert deze output:

Zoals je kunt zien in bovenstaand codefragment werkt de codeunit nu wel correct en is het mogelijk om gegevens op te halen via de webservice. Door deze (noodzakelijke) wijzigingen wordt telkens dezelfde NavigateTable procedure opgeroepen. Deze bevat een CASE-statement. Met behulp van deze CASE en een parameter wordt er gezorgd voor de aanroep van de correcte procedures. Zoals je kunt zien is de aanroep van deze procedure absoluut niet eenvoudiger geworden. Er moeten nu een heleboel parameters opgegeven worden om de procedure aan te roepen. Bijgevolg is de bijhorende CSharp.NET code die deze procedure aanroept ook niet duidelijk leesbaar.

31

Astena NV

Om dit probleem op te lossen heb ik een nieuwe CSharp.NET klasse WebServiceConnector geschreven die fungeert als een wrapper rond de webservice.

Deze wrapperklasse bevat een methode voor elke procedure in de web service. Bij de aanroep van deze methodes worden enkel de parameters gevraagd die absoluut noodzakelijk zijn. Het bijhouden van onder andere het huidige recordid gebeurt in een variabele binnen deze methode waardoor de aanroep heel wat eenvoudiger en gebruiksvriendelijker wordt. Dankzij deze klasse kan je de output uit vorig voorbeeld genereren met behulp van volgende code:

WebServiceConnector connector = new WebServiceConnector(18); if (connector.FindFirst()) { do { Console.WriteLine(connector.GetFieldValue(2)); } while (connector.Next()); }Zoals je hierboven is het werken met deze methodes heel wat duidelijker en moeten enkel de logische parameters doorgegeven worden. De rest van het werk gebeurt in de klasse WebServiceConnector.

32

Astena NV

5.2.7.

De klasse WebServiceConnectorZoals eerder besproken is de klasse WebServiceConnector een wrapper rond de web service. Hieronder volgt een bespreking van deze klasse:

Klassevariabelen

De klasse WebServiceConnector heeft volgende klassevariabelen:

private WSCmfrt_PortClient cliento o Dit is de client die verbinding maakt met de web service. Het id van de tabel waarop gewerkt wordt. Het id van het veld waarop gewerkt wordt. De verwijzing naar het vorige record. De verwijzing naar het huide record.

private int tableID private int fieldIDo

private string oldRecordo o

private string currentRecord

Constructor

De constructor vraagt als argument het tableid. Dit is komt overeen met het tableid uit Microsoft Dynamics NAV 2009:

public WebServiceConnector(int tableid)Methodes

public Boolean FindFirst()Deze method kijkt als er een (eerste) record aanwezig is in de tabel. Indien er een record gevonden werd geeft deze de booleanwaarde true terug en worden de klassevariabele oldRecord en currentRecord bijgewerkt.

public Boolean Next()Deze methode kijkt als er bekeken vanop de huidige positie een volgend record aanwezig is. Indien er een record gevonden werd geeft deze de booleanwaarde true terug en worden de klassevariabele oldRecord en currentRecord bijgewerkt.

public Boolean Next(int steps)Deze methode doet hetzelfde als de methode Next(). Het is echter mogelijk het aantal stappen op te geven.

public Boolean FindLast()Deze methode kijkt als er een (eerste) record aanwezig is in de tabel. Indien er een record gevonden werd geeft deze de booleanwaarde true terug en worden de klassevariabele oldRecord en currentRecord bijgewerkt.

33

Astena NV

public string GetFieldValue(int fieldID)Deze methode geeft de waarde van het veld in het huidige record met een dit specifiek fieldID terug. Dit fieldID is dezelfde waarde als in Microsoft Dynamics NAV 2009.

public string SetFieldValue(int fieldID, string fieldValue)Deze methode geeft de waarde van het veld in het huidige record met dit specifiek fieldID in het huidige record de waarde van de parameter fieldValue. Dit fieldID is dezelfde waarde als in Microsoft Dynamics NAV 2009.

public string SetFieldValue(int fieldID, string fieldValue, bool validateField, bool modifyTrue)Deze methode doet hetzelfde als de vorige methode maar zorgt voor de validatie van de fieldValue.

public string CreateNewRecord()Deze methode zorgt voor de aanmaak van een nieuw record in de tabel en geeft de recordreference van dit record terug.

public string GetRecordIdWithPrimaryKey(string primaryKey)Deze method vraagt als parameter de waarde van de primaire sleutel. Hierna worden alle waarden in de kolom die primaire sleutel is overlopen. Indien de waarde gevonden werd geeft deze methode de recordreference van het record terug.

public string GetFieldValueWithRecordReference(string recordReference, int fieldID)Deze methode doet hetzelfde als de methode GetFieldValue(int fieldID). Als paramater wordt er echter ook de recordreference opgevraagd waarna de waarde van het veld in het correcte record teruggestuurd wordt.

public string SetFieldValueWithRecordReference(string recordReference, int fieldID, string fieldValue)Deze methode doet hetzelfde als de methode SetFieldValue(int fieldID, string fieldValue). Als parameter wordt er echter ook de recordreference opgevraagd waarna de waarde van het veld in het correcte record gewijzigd wordt in de nieuwe waarde.

public string SetFieldValueWithRecordReferenceWithValidate(string recordReference, int fieldID, string fieldValue)Deze method doet hetzelfde als de voorgaande methode maar zorgt voor validatie van de fieldValue.

public Boolean IsWerkDag(DateTime datum)Deze method vraagt als parameter een datum op en stuurt terug als deze dag al dan niet een werkdag is. Hiervoor wordt er gekeken in een tabel in Microsoft Dynamics NAV 2009 waarin alle werkdagen bijgehouden worden.

34

Astena NV

public void DeleteRecordWithoutValidation()Deze method verwijdert het huide record.

public void DeleteRecordWithValidation()Deze methode doet hetzelfde als de vorige methode maar zorgt voor validatie.

public void DeleteRecordWithRecordReferenceWithValidation(string recordReference)Deze methode vraagt een recordreference en verwijdert het record met dit recordreference.

public void DeleteRecordWithRecordReferenceWithoutValidation(string recordReference)Deze methode doet hetzelfde als de vorige methode maar zorgt voor validatie.Klassendiagram

35

Astena NV

6. Stageopdracht (deel 2)6.1. SitueringHet 2de deel van mijn stageopdracht is het ontwerpen va een applicatie in CSharp.NET om planning op een visuele manier mogelijk te maken. Plannen is een heel belangrijk onderdeel binnen veel bedrijven. Er bestaan heel wat vormen van planning, zoals service planning, project planning en resource planning. Ik zal mij voornamelijk focussen op resource planning. Kort samengevat is resource planning het toewijzen van taken aan resources. Resource planning is vaak heel complex. Het toewijzen van een taak aan een willekeurige resource die op dat moment beschikbaar is vaak geen goed idee. Resource planning gaat veel wat verder dan dat. Naast beschikbaarheid moet ook rekening gehouden worden met de competenties van de resources, die locatie van de resources,... Een voorbeeld van een mogelijke planningsopgave: Een bedrijf krijgt de dringende opdracht een kleine applicatie te ontwikkelen. Deze taak zal ongeveer twee dagen in beslag nemen en gebeurt bij de klant ter plaatse, in hun afdeling in Brussel. Het is een Franstalig bedrijf en de applicatie dient ontwikkeld te worden in CSharp.NET. Zoals je ziet worden er heel wat eisen gesteld waaraan de resource moet voldoen. De resource moet:

Zo gauw mogelijk twee dagen beschikbaar zijn CScharp.NET beheersen Vloeiend Frans spreken (Eventueel) niet ver van Brussel wonen

De planningsmogelijkheden binnen Microsoft Dynamics NAV 2009 zijn hiervoor ontoereikend. Met mijn PlanningsTool hoop ik hiervoor een oplossing te kunnen brengen. Eveneens moet mijn applicatie een bepaalde mate van intelligentie bezitten, zodat het selecteren van van geschikte resources eenvoudiger gemaakt wordt.

36

Astena NV

6.2.

Huidige oplossingMomenteel wordt er bij Astena gebruik gemaakt van een applicatie van een externe firma, namelijk PlanningPME van de firma Target Skills. Dit programma maakt het mogelijk op een grafische manier aan planning te doen, dit wil zeggen het toewijzen van taken aan resources. Omdat dit pakket afkomstig is van een extern bedrijf is het bijgevolg is onmogelijk om dit pakket aan te passen of uit te breiden. Er moeten eveneens licentiekosten betaald worden.

PlanningPMEmaakt net als Microsoft Dynamics gebruik van een Microsoft SQL database. Om deze tool te kunnen gebruiken moet er bijgevolg een synchronisatie tussen de databank van Microsoft Dynamics en de databank van PlanningPME. Hiervoor wordt er gebruik gemaakt van triggers om de tabellen van PlanningPME en de tabellen van Microsoft Dynamics NAV 2009 synchroon te houden. Op deze manier wordt de business logic die ingebouwd zit in Microsoft Dynamics 2009 niet gebruikt en is er sprake van redundante informatie. Dezelfde gegevens worden immers bijgehouden in verschillende databanken. Mijn PlanningsTool zal uiteindelijk fungeren als vervanger voor PlanningPME. Het grote voordeel is dat men niet meer afhankelijk is van een externe firma en er bijgevolg ook geen licentiekosten meer betaald hoeven te worden. Tevens kunnen we de applicatie volledig afstemmen op de wensen van de klant. En niet onbelangrijk; omdat er gebruik gemaakt wordt van de web services van Microsoft Dynamics NAV 2009 die besproken werden in het eerste deel van mijn stageopdracht wordt de business logic toegepast. Er is eveneens geen redundante informatie. Het uiteindelijk doel is om deze CSharp.NET applicatie te integreren in Microsoft Dynamics NAV 2009. Op deze manier vormt het een gentegreerd geheel met Microsoft Dynamics NAV 2009 en is het geen tweede losstaande applicatie. Het is immers mogelijk om .NET User Controls te integreren in Microsoft Dynamics NAV 2009. Dit was een ander groot nadeel van PlanningPME. De klant moest naast Microsoft Dynamics NAV 2009 een tweede applicatie installeren en aanleren om aan planning te kunnen doen.

37

Astena NV

6.3.

Beknopte omschrijving van de applicatieEigenlijk kan de applicatie opgesplitst worden in twee delen, enerzijds een tekstueel overzicht van alle taken die nog gepland moeten worden, en anderzijds een visuele weergave van alle taken die reeds ingepland zijn.

6.3.1.

Deel 1:In dit deel krijg je een tekstueel overzicht van de taken die al ingevoerd zijn maar die nog gepland moeten worden. In dit deel is het eveneens mogelijk om taken te wijzigen.

6.3.2.

Deel 2:De functionaliteit van dit deel doet sterk denken aan de kalender in Microsoft Outlook. Een taak wordt afgebeeld door een rechthoek. Met behulp van de muis is het mogelijk om deze rechthoek te manipuleren en te verslepen, en dus de begintijd en eindtijd van de afspraak aan te passen. Het moet eveneens mogelijk zijn om de taak te kunnen slepen van de ene resource naar de andere en taken die weergegeven worden in Deel 1 moeten naar Deel 2 gesleept kunnen worden. Op deze manier worden deze gepland. De weergave is echter verschillend van de weergave van Microsoft Outlook. De taken worden weergegeven in een diagram; de X-as toont het verloop in tijd en de Y-as toont een overzicht van alle resources. Het moet mogelijk zijn om de tijdsbalk at runtime aan te passen. Een andere leuke feature zouden verschillende views zijn, bijvoorbeeld Work Week View, Month View,... Het moet eveneens mogelijk zijn om de resources in te delen in groepen. Verder is het ook de bedoeling om het programma tot op een bepaalde hoogte zelf beslissingen te laten nemen. Een voorbeeld om dit duidelijk te maken: Een bedrijf heeft een taak die moet gepland uitgevoerd worden. Voor deze taak is een kennis van CSharp.NET noodzakelijk. Dit bedrijf houdt eveneens de competenties van elke resource bij. Indien deze taak aangeklikt wordt om in te plannen, worden de beschikbare resources automatisch gefilterd op competentie, en worden enkel de resources die CSharp.NET kennis hebben getoond. Dit is echter n voorbeeld, de mogelijkheden zijn nagenoeg onbeperkt, denk maar aan filtering op basis van locatie, beschikbaarheid,... Een voorbeeld van n de gewenste weergaves:

38

Astena NV

7. Onderzoek naar mogelijke controls voor de visualisatieNa een aantal pogingen bleek al snel dat het een complexe opgave zou worden om zelf een control voor de visualisatie te ontwikkelen. Na wat onderzoek bleek al gauw datt er heel wat uitstekende controls beschikbaar zijn voor de visualisatie van planning.

7.1.7.1.1.

GratisMicrosoft Chart ControlsEventueel zou het mogelijk zijn om gebruik te maken van de functionaliteit van Microsoft Chart Controls. Dit is een Control Library die Microsoft gratis ter beschikking stelt. Binnen deze Chart Control Library bestaat er een control genaamd Range Bar Chart. Deze bevat een Range Bar Chart die heel goed lijkt om hetgeen we zoeken. Deze control is echter statisch en bevat niets van functionaliteit om het plannen te vereenvoudigen. Er zal eveneens nog heel wat programmeerwerk nodig zijn om ervoor te zorgen dat deze component voldoet aan de vereisten.

39

Astena NV

7.2.

BetalendEr zijn heel veel betalende planningscomponenten op de markt. Deze variren echter enorm veel qua prijs, kwaliteit, mogelijkheden, ondersteuning,... In een poging om het kaf van het koren te scheiden en de ideale component te vinden voor onze applicatie heb ik veel tijd besteed aan het zoeken, uittesten en evalueren van de verschillende componenten.

7.2.1.Voorstelling

Oplossing 1De firma Netronic heeft een component ontwikkelt die het mogelijk maakt om Gantt Charts toe te voegen aan je applicatie. Volgens hun website is het een hele makkelijke en intutieve planningscomponent. Hun component is onder andere beschikbaar voor CSharp.NET en wordt geleverd met een heleboel voorbeelden en een uitgebreide handleiding.

Er is eveneens een uitgebreide demo-applicatie beschikbaar waarbij de CSharp.NET broncode eveneens beschikbaar is. Prijs Op de website is een uitgebreid prijsoverzicht beschikbaar. De prijs van deze component valt onmiddelijk op, net als het feit dat er voor elke eindgebruiker een runtime license aangekocht moet worden.

40

Astena NV

7.2.2.Voorstelling

Oplossing 2De firma DlhSoft biedt een Project Management Library aan voor WPF.NET 3.5 die componenten bevat voor Project Management. Het bevat onder andere een control die een overzicht kan geven van alle taken en diverse Gantt Charts die voor planning gebruikt kunnen worden. Drag and drop operaties worden ondersteund, net als databinding, printen en exporteren.

Er is online een demo beschikbaar, maar die heb ik helaas niet werkend gekregen. Bij het downloaden van de website kreeg ik telkens een foutmelding. Er is ook uitgebreide documentatie beschikbaar. Deze component viel uiteindelijk gauw af, omwille van het feit dat er geen enkele mogelijkheid was om deze uitgebreid te testen.

Prijs

Op de website is een duidelijk prijsoverzicht beschikbaar. Deze component is eveneens behoorlijk duur. Het is niet duidelijk als er nog bijkomende licentiekosten zijn.

41

Astena NV

7.2.3.Voorstelling

Oplossing 3Ook de firma PlexityHide biedt een oplossing voor Gantt Charts en sheduling voor Windows Forms en ASP.NET. Hun applicatie noemt GTP.NET en wordt omschreven als een component package in .NET voor tijdsvisualisatie en interactie. GTP.NET is 3 jaar op rij winnaar van een award van de website ComponentSource. Op de website is eveneens een uitgebreide knownledgebase beschikbaar, net als een evaluatieversie. Tijdens het testen van de evaluatieversie viel onmiddelijk op dat deze component vrij eenvoudig in gebruik was, maar helaas is hij visueel niet echt aantrekkelijk. De look and feel past niet echt in Microsoft Dynamics NAV 2009. Een voorbeeld van een Gantt Chart in GTP.NET:

Prijs Op de website is eveneens een uitgebreid prijsoverzicht beschikbaar. Ook bij deze component is het niet onmiddellijk duidelijk of er nog bijkomende licentiekosten betaald moeten worden.

42

Astena NV

7.2.4.Voorstelling

Oplossing 4Ook de Zwitserse firma Kroll-Software heeft een Gantt Chart Control ontwikkeld voor .NET Windows Forms. Hun Control noemt KS-Gantt Control en ondersteunt undo/redo, drag and drop,... Hij bevat ook een Grid Control waarin de taken weergegeven kunnen worden. Op de site is eveneens een demo en een (minder goed uitgewerkte) manual beschikbaar. De layout van deze control ziet er als volgt uit:

Na een korte test werd duidelijk dat deze component heel vlot werkt. Het enige nadeel is de nogal drukke layout. Prijs De prijs van deze component was eenvoudig te vinden op hun website. Dit is een van de goedkopere componenten. Deze component mag eveneens gebruikt worden in applicaties zonder bijkomende licentiekosten.

43

Astena NV

7.3.

EvaluatieEr werd mij gevraagd de gevonden componenten kritisch te bespreken en uitgebreid te demonsteren tijdens een presentatie. Na deze demonstratie bleek dat er voornamelijk interesse was in twee componenten; namelijk VARCHART XGantt van Netronic en de Gantt Control van de firma Kroll Software.

7.3.1.

Netronic VARCHART XGanttDeze component bleek voornamelijk interessant omdat er heel wat functionaliteit out of the box ondersteund wordt. Ook is er een uitgebreide manual beschikbaar en lijkt de support heel erg goed te zijn. Het enige nadeel is de hoge prijs en het feit dat de broncode vemoedelijk niet beschibaar is en dus ook niet aangepast of uitgebreid kan worden. De specifieke licentievoorwaarden zijn momenteel nog onduidelijk.

7.3.2.

Kroll Software Gantt ControlDeze component is voornamelijk interessant omdat hij betrekkelijk veel functionaliteit aanbiedt voor een lage prijs. Ook is de broncode beschikbaar. Deze kan dus uitgebreid en aangepast worden.

7.3.3.

Contacteren firmasDe volgende stap was het contacteren van beide firmas voor het verkrijgen van verdere informatie en een offerte op maat. Na het versturen van deze mail kregen we al gauw antwoord van de firm Netronic. Hieruit bleek echter dat het aankopen van deze control niet alleen heel duur was, maar er ook voor elke end-user een nieuwe licentie aangekocht diende te worden. Deze optie viel dus af. Van de firma Kroll Software heb ik nooit reactie gekregen. Na overleg werd besloten op zoek te gaan naar een nieuwe component. Ik kreeg de opdracht wat ruimer te zoeken op planningscomponenten en mij niet toe te spitsen op componenten voor Gantt Charting. Door mij op Gantt Charts te concentreren was ik te specifiek gaan zoeken.

44

Astena NV

7.4.7.4.1.Oplossing 5

Verder zoeken naar mogelijke controlsBetalendVoorstellingDe firma Janus Systems biedt een oplossing aan voor het plannen en weergeven van afspraken. De naam van deze componenten zijn de Janus Schedule en Janus Timeline control voor .NET. Deze oplossing heeft de look and feel van Microsoft Outlook. Deze component bevat alle functionaliteit die we nodig hebben en ziet er zeer gebruiksvriendelijk uit. Op hun website is er helaas betrekkelijk weinig informatie beschikaar. Het supportforum is ook heel kalm, wat er op kan wijzen dat er betrekkelijk weinig gebruikers zijn. Deze control ziet er als volgt uit:

Na een korte test bleek al gauw dat deze component goed en intutief werkt en heel aantrekkelijk oogt. Omdat er gebruik gemaakt wordt van de look and feel van Microsoft Outlook voelt het geheel vertrouwd aan.

PrijsZoals je kunt zien is ook deze component niet goedkoop om aan te schaffen:

Het is eveneens niet duidelijk of er voor het gebruik van deze component in commercile applicaties bijkomende licentiekosten betaald moeten worden. Ook is het niet duidelijk of de broncode al dan niet beschikbaar is.

45

Astena NV

Oplossing 6

VoorstellingDe firma Devexpress viel onmiddelijk op door hun duidelijke website, hun grote aanbod aan controls en de overvloed aan informatie en tutorials met betrekking tot het gebruik van componenten. Er is niet alleen een uitgebreide beschikbaar, maar ook een knownledge base met handige vragen die opgelost worden en een aantal videotutorials. Enkele vragen die ik hen stelde werden steeds na enkele uren beantwoord. Er is ook de mogelijkheid om zelf feature request toe te voegen aan de site. Ook het forum is drukbezocht en bevat veel handige tips en informatie. Een van de componenten die ze verkopen is het hun XtraScheduler component. Deze scheduler maakt eveneens gebruik van de Outlook look & feel en biedt ondersteuning voor meerdere views. Er is tevens een demoversie van hun component beschikbaar die 30 dagen geldig is. Dit is n van de mogelijke ondersteunde views:

Omdat er een demoversie van 30 dagen beschikbaar is besloot ik deze component te integreren in mijn voorlopig project. Dit bleek heel eenvoudig te zijn; en ik was al gauw in staat taken die opgehaald werden uit Microsoft Dynamics weer te geven.

PrijsDeze component ziet er niet alleen heel gebruiksvriendelijk uit, maar is ook betrekkelijk goedkoop. De broncode is eveneens meegeleverd en de component mag gebruikt worden in commercile applicaties.

46

Astena NV

7.5.

BesluitNa het demonsteren van de component XtraScheduler van de firma Devexpress werd er besloten dat deze (op een paar kleine opmerkingen na) voldoet aan de eisen die gesteld werden. Een groot voordeel is het feit dat de component gedurende een periode van 30 dagen uitgebreid getest kan worden. Een aantal vragen opmerkingen die tijdens deze eerste bespreking aan bod kwamen waren onder andere: Kunnen de namen van de resources horizontaal afgebeeld worden? Zijn er verschillende views beschikbaar? Kunnen we vanuit deze view nieuwe afspraken aanmaken?

Op deze vragen kon ik positief antwoorden, en dus kreeg ik de opdracht verder aan de slag te gaan met deze component en te beginnen met de ontwikkeling van de PlanningsTool. Tijdens de periode waarin ik veel componenten uitgetest heb was ik al begonnen met het analyseren en ontwerpen van de objecten die nodig waren en had ik al de nodige code geschreven om deze objecten op te vullen met behulp van gegevens die opgehaald werden uit Microsoft Dynamics NAV 2009 via de web services. Deze code heb ik uitgebreid kunnen testen. Ik had dus al een stevige basis waarboven ik de visualisatie kon programmeren. Hierna ben ik begonnen met het verzamelen van de requirements waartoe de view in staat moest zijn. Hiervoor ging ik luisteren bij werknemers van Astena die al ervaring hadden met PlanningPME. Hieruit kon ik duidelijk opmaken wat de voor en nadelen van PlanningPME waren, en welke mogelijkheden ontbraken. Deze requirements heb ik in een requirements list gegoten en voorzien van een prioritisering. Voor ingewikkelde requirements schreef ik telkens een use case, zodat het duidelijk was wat er exact moest gebeuren.

47

Astena NV

8. AnalysedossierDit deel van mijn stageverslag bevat het analysedossier van de applicatie. Het begint met een korte bespreking van het programma en een aantal afbeeldingen van mogelijke layouts. Hierna kun je de analyse voor de back-end van het systeem terugvinden. Dit zijn de objecten die nodig zijn voor het ontwerpen van de applicaties en alle klasses die zorgen voor het ophalen en doorsturen van informatie met behulp van de web services van Microsoft Dynamics NAV 2009. Als laatste volgt de analyse van de view. Hierin wordt onder andere besproken wat er allemaal mogelijk moet zijn via de view.

8.1.

Omschrijving van de applicatieBinnen de applicatie kunnen we 2 logische delen onderscheiden. Het ene deel bevat een lijst waar alle taken weergegeven worden die nog niet gepland moeten worden. Het andere deel bevat een visuele weergave van alle taken die al gepland zijn. Op deze weergave kunnen we eveneens aflezen aan welke resource deze taak toegewezen is.

Deel 1

Overzicht

Tekstuele weergave van die taken die reeds ingevoerd zijn, maar die nog niet gepland werden. De eigenschappen van de taak kunnen aangepast worden Taken kunnen door middel van drag en drop gepland worden (met andere woorden: we kunnen ze slepen op het planningsdeel om ze in te plannen)

Deel 2

Planning

Component met alle ingeplande taken o X-as: tijd o Y-as: resources Taken kunnen aan een andere resource toegewezen worden met behulp van drag en drop De begin en eindtijd van een taak kan aangepast worden door middel van klikken en slepen De tijdsschaal kan aangepast worden De beschikbare resources worden gefilterd op basis van de geselecteerde taak De eigenschappen van de taak kunnen aangepast worden Een resource kan op een eenvoudige manier geselecteerd worden om de planning van deze resource in detail te bekijken

48

Astena NV

Afbeelding

Als eerste stap wou ik een visueel ontwerp maken van een mogelijke layout van het programma. Op deze manier wist ik zeker dat ik op dezelfde golflengte zat als mijn stagementor. In het bovenste deel wordt een lijst van alle taken die nog niet ingepland zijn getoond met alle gegevens. Het is eveneens mogelijk deze gegevens aan te passen. Het onderste deel toont dan een weergave van taken die reeds ingepland zijn. In dit deel is het mogelijk om met behulp van de muis taken te manipuleren. Zoals de eerste pijl weergeeft moet het mogelijk zijn om taken van het eerste deel naar het tweede deel te slepen. Op deze manier worden taken ingepland. De tweede pijl toont wat er moet gebeuren indien je met de muis boven een taak zweeft. Hierbij verschijnt er een popup venster met enkele details over deze taak.

49

Astena NV

8.2.8.2.1.

Analyse van de back-endNiet functionele specificaties Programmeertaal: C#.NET Communiceert met de Microsoft Dynamics NAV 2009 web services o Maakt gebruik van de klasse NavisionWebServiceReference

8.2.2.Overzicht tabellen

Functionele specificatiesAlle gegevens die nodig zijn voor de goede werking van onze planningsapplicatie kunnen we ophalen uit Microsoft Dynamics NAV 2009. De volgende tabellen bevatten de nodige gegevens:

Experience Code o De verschillende ervaringsniveaus waarop gefilterd kan worden. Resource Group o De groepen waarin de resources ingedeeld worden. Customer o De verschillende klanten. Planning Attribute Code o Verschillende planningsattributen waarop gefilterd kan worden. Job o De verschillende projecten. Service Zone Cmfrt o De verschillende regios. Resources o De verschillende resources. Skill Code o De verschillende vaardigheden van de resources. Planning Line o De taken die reeds ingepland werden. WBS o De verschillende Work Breakdown Structures. Resource Skill o De tabel die zorgt voor de koppeling tussen Resource en Skill Code. Resource Experience o De tabel die zorgt voor de koppeling tussen Resource en Skill Code. Resource Service Zone o De tabel die zorgt voor de koppeling tussen Resource en Service Zone Cmfrt. Resource Planning Attribute o De tabel die zorgt voor de koppeling tussen Resource en Planning Attribute Code.50

Astena NV

Ophalen gegevens

Voor het ophalen van de gegevens zal gebruik gemaakt worden van de klasse die ik ontworpen heb tijdens het eerste deel van mijn stageopdracht. Deze klasse kan connecteren met de web service van Microsoft Dynamics NAV 2009 en kan de noodzakelijke gegevens ophalen om de objecten te vullen die nodig zijn voor de goede werking van de PlanningsTool.

Bijwerken gegevens

Via deze klasse is het eveneens mogelijk om wijzigingen die aangebracht werden terug door te sturen naar Microsoft Dynamics NAV 2009.

8.2.3.

ObjectenDit resulteerde uiteindelijk in de creatie van onderstaande objecten:

Resource o Die persoon die de taak zal uitvoeren. Dit object bevat onder andere de naam van de resource. Klant o De klant voor wie de taak uitgevoerd zal worden. Dit object bevat gegevens zoals het klantnummer, de naam van de klant, het adres van de klant,... Project o Dit object bevat het projectnummer en de naam van he project waarop de taak van toepassing is. Taak o Uiteraard is er een Taak-object. Dit object bevat onder andere een taakomschrijving, locatie, begin en einddatum. Dit object bevat eveneens een Klant-object, een Project-object en een Resource-object. Groep o Elke resource zit eveneens in een Groep. Dit object bevat de groepsnaam. WBS o WBS staat voor Work Breakdown Structure. Een project bestaan uit verschillende WBSen die allemaal voltooid moeten worden vooraleer het project voltooid is. Experience o Het ervaringsniveau van een resource. Mogelijke niveaus zijn junior, medior en senior. PlanningsAttribuut o Een resource heeft ook planningsattributen. Een voorbeeld van een mogelijk planningsattribuut is als een resource al dan niet opdrachten in het buitenland wil vervullen. Regio o De regio waarin een resource taken wenst uit te voeren. Skill o De specifieke vaardigheden van een resource.

51

Astena NV

8.2.4.Multilayered

ImplementatieVoor de implementatie van de back-end van mijn applicatie heb ik gekozen voor een multilayered aanpak. Op deze manier werden de verantwoordelijkheden en functionaliteiten gesplitst en blijft mijn applicatie zo flexibel mogelijk. Het is bijvoorbeeld mogelijk om met een minimale aanpassing in de code gebruik te maken van een XML-bestand in plaats van web services. Met andere woorden, de code impact bij wijzigingen blijft beperkt. Ik koos voor 3 lagen:

Model laag o Representatie van gegevens in de databank o Bevat geen business logic DAO laag o Data Acces Objects o Haalt objecten op uit een gegevensbron (web service) o Wijzigt objecten op de gegevensbron (web service) o Bevat geen logica o Ondersteunt read en update-operaties Service laag o Verwerkt gegevens o Pass-through naar DAO

Zoals je op onderstaande afbeelding kunt zien verloopt de communicatie in n richting. Het model weet niets van de DAO en Service laag, en de DAO weet niets van de Service laag.

52

Astena NV

Voorbeeld

Om dit duidelijk te maken heb ik ervoor gekozen om als voorbeeld het resource-object, de resource-service en de resource-DAO uitgebreid te bespreken.

De klasse ResourceDe klasse bevat niet alle velden die de de Resource tabel van Microsoft Dynamics NAV 2009 bevat. De klasse resource bevat enkel de velden die noodzakelijk zijn voor de goeie werking van de planningsapplicatie.

private private private private private

string recordReference; string resourceNummer; string naam; string soort; Groep groep;

Het veld recordReference hebben we nodig zodat de we indien er een wijziging doorgevoerd moet worden de web service kunnen laten weten welk op welk record deze wijziging van toepassing is. De andere velden spreken voor zich.

De klasse ResourceDAODe klasse ResourceDAO implementeert de interface IResourceDAO. Deze interface definieert welke methoden de ResourceDAO-klasse moet implementeren. Het voordeel hiervan is dat wanneer we bijvoorbeeld een XML-bestand wensen te gebruiken als gegevensbron we enkel een DAO-klasse hoeven te ontwerpen die de methodes uit IResourceDAO implementeert. In het geval van de IResourceDAO betreft het volgende methodes:

List findAll(); Resource getResourceByProjectNummer(string resourceNummer); void updateResource(Resource resource);De klasse ResourceDAO bezit een veld van het type WebServiceConnector. Deze klasse heb ik zelf ontworpen tijdens het eerste deel van mijn stageopdracht:

WebServiceConnector con;Deze wordt geconstrueerd met als parameter het id van de tabel Resource van Microsoft Dynamics NAV 2009:

con = new WebServiceConnector(156);

53

Astena NV

Hierna worden alle methodes uit de interface gemplementeerd. Bijvoorbeeld:

public List findAll() { //methode om een lijst van alle resources op te vragen List resources = new List(); //via de webserviceconnector alle lijnen overlopen if (con.FindFirst()) { do { //maken van een nieuwe resource en invullen van de gegevens Resource resource = new Resource(); resource.RecordReference = con.CurrentRecord; resource.ResourceNummer = con.GetFieldValue(1); resource.Naam = con.GetFieldValue(3); resource.Soort = con.GetFieldValue(2); //Groep laden en toewijzen string groepNummer = con.GetFieldValue(14); if (String.IsNullOrEmpty(groepNummer)) { resource.Groep = new Groep(); } else { resource.Groep = groepService.getGroepByGroepNummer(groepNummer); } resources.Add(resource); } while (con.Next()); } return resources; }Zoals je kunt zien wordt er een nieuwe lijst van Resources aangemaakt. Hierna wordt er voor elke lijn uit de tabel Resource een nieuw resourceobject aangemaakt. Hierna worden alle velden opgevuld en wordt de resource toegevoegd aan de lijst. Uiteindelijk wordt de lijst van resources geretourneerd. De andere methoden zijn gelijkaardig.

De klasse ResourceServiceDe klasse ResourceService bevat maar 1 veld; de verwijzging naar de ResourceDAO. Deze klasse heeft voor elke methode uit de DAO een overeenkomstige methode. Deze klasse heeft bijgevolg de methodes getResources(), getResourceByResourceNummer() en updateResource(Resource resource). Elke methode roept de overeenkomstige methode van de ResourceDAO op. Bijvoorbeeld:

public List getResources() { return resourceDAO.findAll(); } 54

Astena NV

Observer Pattern

Na het schrijven van alle modellen, services en DAOs was er echter een probleem. Nu waren we in staat om alle nodige gegevens op te vragen en de objecten aan te maken en te vullen. Maar wanneer we een wijziging aanbrachten in een veld van een object was het ook noodzakelijk dat deze wijziging via de web service doorgestuurd werd naar Microsoft Dynamics NAV 2009. Op dit op te lossen heb ik gebruik gemaakt van het Observer Pattern.

Wat is het Observer Pattern?Observer definieert een een-op-veel relatie tussen objecten, zodat wanneer de toestand van n object verandert, alle afhankelijke objecten bericht ontvangen en automatisch worden bijgewerkt. Een voorbeeld:

Een observable object wordt geobserveerd door 3 observers. Indien er iets wijzigd aan de toestand van het observable object worden de 3 observers hiervan op de hoogte gebracht. Het observable object fungeert als een soort uitgeverij van tijdschriften. Mensen kunnen zich abonneren op een tijdschrift en de uitgeverij houdt bij welke mensen geabonneerd zijn. Telkens wanneer er een nieuwe uitgave is wordt deze verzonden naar al deze mensen. Uiteraard kunnen mensen zich ook uitschrijven. Wanneer mensen het tijdschrift ontvangen kunnen ze beslissen welke acties ze ondernemen. In dit geval is de uitgeverij observable en zijn de abonnees observer.

55

Astena NV

Toepassen van het Observer PatternNu werd het tijd om het Observer Pattern om te zetten in de praktijk en het te gebruiken in mijn PlanningsApplicatie. Hiervoor ben ik begonnen met het schrijven van de interface IObservable. Deze zorgt ervoor dat klasses die deze interface implementeren volgende methodes moeten implementeren:

void registerObserver(IObserver o); void removeObserver(IObserver o); void notifyObservers(Object o);De eerste methodes zijn methodes voor het toevoegen en verwijderen van de Observers. De laatste methode is de methode die aangeroepen wordt indien de toestand gewijzigd wordt. Bijgevolg moeten de klasse Klant, Taak, Resource en Project deze interface implementeren. Ter illustratie een beschrijving van de stappen die gezet moeten worden om ervoor te zorgen dat de klasse Resource de IObservable interface implementeert:

Zorg ervoor dat de klasse Resource de IObservable interface implementeert: o public class Resource : IObservable Zorg voor een lijst voor het bijhouden van de Observers: o private List observers; Implementeer de nodige methodes:

public void registerObserver(IObserver o) { observers.Add(o); } public void removeObserver(IObserver o) { observers.Remove(o); } public void notifyObservers(Object resource) { foreach (IObserver observer in observers) { observer.update(resource); } }Nu moeten we er uiteraard voor zorgen dat de methode notifyObservers(Object resource) aangeroepen wordt telkens wanneer de toestand van het object wijzigt.

56

Astena NV

Hiervoor heb ik de properties van alle velden als volgt aangepast:

public string ResourceNaam { get { return naam; } set { naam = value; notifyObservers(this); } }Zoals u kunt zien wordt de methode notifyObservers(Object resource) telkens wanneer de toestand verandert aangeroepen. Voor de Observers heb ik ook gezorgd voor een interface IObserver. De klasses die deze interface implementeren moeten volgende methode implementeren:

void update(Object o);Hierna heb ik een klasse ObjectObserver geschreven. Deze kan als Observer fungeren voor elke Observable, dus zowel voor een Klant, een Taak, een Project, een Groep, een WBS en een Resource. Deze klasse bevat een instantie van elke service. Hij kan dus methoden aanroepen van zowel de KlantService, als de TaakService, de ProjectService, de GroepService, de ResourceService en de WBSService. Telkens wanneer de methode update(Object o) aangeroepen wordt gaat de klasse kijken welk object er meegegeven werd. Afhankelijk hiervan wordt de corresponderende updatemethode van de corresponderende service aangeroepen. Hierbij een voorbeeld om dit duidelijk te maken:

public void update(object o) { if(o.GetType() == typeof(Klant)) { klantService.updateKlant((Klant)o); } else if (o.GetType() == typeof(Project)) { projectService.updateProject((Project)o); } ... }Indien o van het type Klant is dan wordt de methode updateKlant(Klant klant) van de KlantService aangeroepen. Deze methode zorgt ervoor dat de toestandswijzigingen via de web service ook doorgevoerd worden in Microsoft Dynamics NAV 2009.

57

Astena NV

8.3.

Analyse van de front-end (view)Nu de back-end van het programma op punt staat, de objecten aangemaakt en opgevuld kunnen worden en gegevens gewijzigd kunnen worden is het tijd om te zorgen voor de visualisatie van die objecten.

8.3.1.

Niet functionele specificaties Programmeertaal: C#.NET Communiceert met de Microsoft Dynamics NAV 2009 web services o Maakt gebruik van de klasse NavisionWebServiceReference Gebruik maken van de component XtraScheduler van Devexpress

8.3.2.

Functionele specificaties Requirements ListRequirement Overzicht van de ongeplande WBS lijnen Eigenschappen van een ongeplande WBS-lijn kunnen bewerkt worden WBS kan ingepland worden via drap & drop (gebudgetteerd aantal dagen) WBS kan ingepland worden door een periode te selecteren WBS kan ingepland worden door op een dag te klikken Bij drag en drop wordt de WBS ingepland op de positie waar hij losgelaten werd Planning wordt visueel weergegeven Geplande taken kunnen aan een andere resource toegewezen worden Geplande taken kunnen aangepast worden De tijdsschaal kan aangepast worden De resources kunnen gegroepeerd worden De resources kunnen gefilterd worden op basis van de resourcegroep, bekwaamheid, regio, planningsfilter (binnen/buitenland/...) en ervaring Bij het inplannen wordt er rekening gehouden met weekends en feestdagen De namen van de resources worden horizontaal weergegeven De gegevens moeten gerefreshed kunnen worden Er verschijnt een splash-screen bij het inladen van gegevens Maken van een Custom Appointments venster voor het aanmaken en bewerken van de taak Wanneer je met je muis boven een afspraak zweeft wordt er een popup getoond met meer informatie WBS-lijnen kunnen gefilterd worden op basis van het project Het moet mogelijk zijn geplande WBSen uit te plannen Bij het starten van de applicatie wordt de huidige dag getoond Navigeren naar een andere datum

58

Astena NV

8.3.3.

Use CasesSommige van de requirements zijn behoorlijk complex. Naast het correct weergeven van alle gegevens in mijn planningstool moet ik er ook voor zorgen dat wijzingen en nieuwe gegevens op een correcte manier doorgestuurd worden naar Microsoft Dynamics NAV 2009. Om voor mezelf het overzicht te bewaren van alle stappen die moeten gebeuren heb ik enkele use cases geschreven. Deze kon ik ook gebruiken wanneer ik vragen had voor collegas. Op deze manier konden ze op een gestructureerde manier volgen waar ik mee bezig was en gemakkelijk controleren als alles op een correcte manier verliep. De use cases die ik gebruikt heb zijn terug te vinden onder bijlage 1.

8.3.4.Plannen en Microsoft Dynamics

PlannenMet Microsoft Dynamics NAV 2009 is het mogelijk om aan project management te doen. Vooraleer een project geslaagd is moeten er heel wat taken voltooid worden. Hiervoor wordt een project opgesplitst in work beakdown structures, die afgekort worden als WBS. Een WBS is een hirarchische structuur waarin concrete deelresultaten van een project worden ondergebracht. Hiervoor wordt een top-down benadering gebruikt: De verschillende hoofdfasen van het project zijn bekend doordat ze beschreven worden in bijvoorbeeld een projectplan. Elke hoofdfase wordt hierna gedetailleerd in subfasen die opnieuw ingedeeld worden in discrete deelproducten. De boomstructuur die onstaat wordt een WBS genoemd. Een voorbeeld om dit duidelijker te maken: Project: Huis Fase: Fundering Fase: Muren Activiteit: Stenen aanschaffen Activiteit: Opmeten Activiteit: Metselen Activiteit: Voegen Activiteit: Afwerken Fase: Dak De verschillende WBSen worden in Microsoft Dynamics bijgehouden in de tabel WBS. Deze tabel bevat onder andere het project waarvan de WBS deel uitmaakt, van welke groep de uitvoerende resource deel moet uitmaken, een omschrijving, het aantal uren, Wanneer er een WBS ingepland wordt om op een bepaalde datum uitgevoerd te worden door een specifieke resource wordt deze WBS omgezet in een taak. Deze taken worden bijgehouden in de Planning Line tabel. Wanneer er met behulp van de planningstool WBSen ingepland worden, worden er ook nieuwe regels aangemaakt in de Planning Line tabel. Deze regels bevatten alle noodzakelijke gegevens zoals start en einddatum, en de gegevens afkomstig uit de WBS.

59

Astena NV

Mogelijke manieren om te plannen

De planningstool biedt ondersteuning voor 3 mogelijke manieren van planning:

Gebudgetteerd aantal o Wanneer er gebruik gemaakt wordt van deze planningsmethode wordt er een nieuwe taak aangemaakt waarbij het aantal dagen dat ingepland wordt gelijk is aan het aantal gebudgetteerde uren. Hierbij wordt er rekening gehouden met weekends en feestdagen. Indien er bijvoorbeeld een WBS met 3 gebudgetteerde dagen ingepland wordt van maandag tot woensdag waarbij de dinsdag een feestdag is, dan wordt de einddatum verschoven naar donderdag. Op deze manier is het aantal gebudgetteerde uren gelijk aan het aantal dagen waarop effectief gewerkt wordt. De feestdagen en weekens worden opgehaald uit Microsoft Dynamics. Een taak kan op deze manier ingepland worden door een WBS-lijn te selecteren en deze op de gewenste positie te slepen en los te laten. Periode o Deze planningsmethode maakt het mogelijk om een bepaald aantal dagen te selecteren waarna er een nieuwe taak aangemaakt wordt voor deze periode. Hierbij wordt er opnieuw rekening gehouden met weekens en fees