1 Het toepassen van DLA (designer) in een MS-Access, VB of ASP ontwikkeltraject By Bert Dingemans, www :2 Inhoudsopgave Het toepassen van DLA (desig...
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Het toepassen van DLA (designer) in een MS-Access, VB of ASP ontwikkeltraject
By Bert Dingemans, e-mail : [email protected] www : http://home.hetnet.nl/~bert.dingemans
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Inhoudsopgave Het toepassen van DLA (designer) in MS-Access, VB en ASP ontwikkeltraject ...................................................................... 1 Inhoudsopgave ....................................................................................................................................................................... 2 Inleiding ................................................................................................................................................................................. 3 Biebcase ................................................................................................................................................................................. 3 DLA designer ......................................................................................................................................................................... 3 DLA ....................................................................................................................................................................................... 3 Lagen.................................................................................................................................................................................. 3 Methodische stappen .......................................................................................................................................................... 4 Notatiewijzen ..................................................................................................................................................................... 5 Implementeren van het bedrijfsdomein .................................................................................................................................. 9 Transformatie naar MS-Access ............................................................................................................................................ 11 Formulier en servicelaag .................................................................................................................................................. 12 Eventslaag ........................................................................................................................................................................ 13 Domein Object laag.......................................................................................................................................................... 14 Transformatie naar Visual Basic .......................................................................................................................................... 16 Formulier en servicelaag .................................................................................................................................................. 16 Eventslaag ........................................................................................................................................................................ 17 Domein object laag........................................................................................................................................................... 18 ConnectionManager ......................................................................................................................................................... 18 Transformatie naar ASP ....................................................................................................................................................... 20 COM Object ..................................................................................................................................................................... 20 ASP Pagina’s.................................................................................................................................................................... 20 Tot slot ................................................................................................................................................................................. 23
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Inleiding In de afgelopen periode+ben ik betrokken geweest bij een project waar een Drie Lagen Architectuur is toegepast. In dit traject is de Case tool DLA designer gebruikt. Tijdens dit project rees bij mij de vraag. Hoe kan een drie lagen architectuur in verschillende ontwikkelomgevingen toegepast worden. Reden om dit in de vorm van een onderzoek uit te werken. Er is gekozen voor een drietal omgeven MS-Access, Visual Basic en ASP en een COM object. In dit onderzoek zijn de Drie Lagen Architectuur (DLA) en Merode het uitgangspunt is geweest. In dit document wil ik ingaan op de ervaringen en keuzes welke relevant zijn geweest voor dit onderzoek. Hierbij moet met klem opgemerkt worden dat de keuzen zoals genomen niet perse de juiste keuzes geweest zijn. Dit document moet dan ook meer gezien worden als het beginpunt van een discussie waarin het toepassen van de DLA als uitgangspunt dient. Naast het beschrijven van het toepassen van de Merode (DLA) methode voor ontwerp en implementatie wordt beschreven hoe relevante onderdelen zijn toegepast in ofwel de DLA designer ofwel een van de drie ontwikkelomgevingen. Als het wenselijk is worden deze voorbeelden in de tekst van het document opgenomen. Is de omvang van een voorbeeld te omvangrijk of verstoort het de opbouw van het document dan wordt het voorbeeld als bijlage opgenomen. Belangrijke reden om dit document op te stellen is om te laten zien dat het toepassen van DLA in een software ontwikkeltraject duidelijk voordelen biedt. Het toepassen van een werkwijze vanwege de werkwijze, is niet voldoende voor DLA om succesvol te zijn. De DLA moet zichzelf kunnen handhaven in een ontwikkeltraject en de professional in het ontwikkeltraject voordelen bieden. Daarnaast moet DLA geen keurslijf zijn, iedere professional heeft een eigen werkwijze om tot een eindproduct te komen. DLA kan een hulpmiddel zijn om tot een beter eindproduct te komen met een geringere inspanning.
Biebcase De Biebcase wordt gebruikt als voorbeeld. Het is een relatief eenvoudig voorbeeld wat iedereen kent. Een bibliotheek waar mensen lid van kunnen worden, die boeken kunnen lenen en reserveringen kunnen maken van boeken. In de beschrijving van de methode Merode zal duidelijk worden welk gedrag belangrijk is in een bibliotheek voorbeeld.
DLA designer DLA designer is een CASE tool van de competentie groep Modelgedreven Systeem Ontwikkeling van IMN. Deze CASE tool ondersteunt de verschillende aspecten van de DLA zoals beschreven in de volgende paragraaf. In de biebcase is deze CASE tool ingezet als hulpmiddel. In dit document zullen de voorbeelden steeds geënt zijn op de DLA designer. De DLA designer is te downloaden van de DLA Designer homepage (http://home.wish.net/~dla.designer)
DLA DLA is een Object Georiënteerde ontwerpmethode voor informatica toepassingen. De methode bestaat uit een viertal onderdelen. Lagen Zoals de naam al zegt is de DLA een architectuur die uit drie lagen bestaat. Wat is nu een laag? Een laag is een implementatie van inkapseling. In een laag bevinden zich bepaalde logica en entiteiten. Iedere laag communiceert alleen maar met de eerste laag die onder deze laag ligt. Hierdoor is het dan ook niet nodig dat een laag kennis heeft over structuren en gedrag zoals dit in onderliggende lagen voorkomt. Alleen de eerste laag is in deze relevant. De lagen in DLA zijn van onder naar boven: • Bedrijfsdomeinlaag • Gebruikerslaag • Presentatielaag Bedrijfsdomeinlaag
Gebruikerslaag
In de bedrijfsdomeinlaag worden die entiteiten opgenomen die statisch van aard zijn. Voor de case geldt bijvoorbeeld dat er gewerkt wordt met leden, titels en uitleningen. Deze worden dan ook beschreven in de bedrijfsdomeinlaag. Omdat DLA een OO methode is zullen hier met name de objecttypen beschreven worden. Objecttypen bestaan uit een beschrijving van eigenschappen of attributen en uit gedrag of methoden. Met methoden verandert men de toestand (eigenschappen) van een object. Binnen organisaties wordt op verschillende manieren naar objecten gekeken. Bij de uitleenbalie is andere informatie nodig dan bijvoorbeeld de ledenadministratie. In de gebruikerslaag worden deze verschillende views op de objecten gemodelleerd
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Presentatielaag
De verschillende views zoals deze ontstaan in de gebruikerslaag moeten gepresenteerd worden. Bijvoorbeeld in schermen en rapporten van een computertoepassing. Dit wordt afgehandeld in de presentatielaag. Voor de biebcase zijn er bijvoorbeeld meerdere invoer- en bewerkschermen voor data-entry. Maar ook rapportages behoren tot de presentatielaag.
In de paragraaf over de realisatie in de drie ontwikkelomgevingen wordt ingegaan hoe deze lagen zijn vertaald in een Powerbuilder Sybase toepassing. Methodische stappen Om tot een ontwerp van een softwareproduct te komen kunnen een aantal stappen gevolgd worden. Met behulp van deze stappen is het mogelijk om tot een compleet OO ontwerp te komen van het te realiseren (deel) systeem. Deze stappen moeten veelal gezien worden als een richtlijn. Ook hierin geldt weer dat iedere professional een eigen werkwijze heeft. Het volgen van de stappen zal voor iemand nieuw in DLA structuur bieden. Een ervaren ontwerper zal veelal een eigen werkwijze hebben waarmee hij/zij tot een ontwerp komt. In onderstaande tabel worden de stappen beschreven. Stap Identificeer object- en gebeurtenistypen
Samenstellen Object Gebeurtenis tabel
Vervaardigen van ER diagram of ED diagram
Volgorde beperkingen in Rolstructuren
Informatiebeperkingen
Identificeren van services
Omschrijving Geef een beschrijving welke objecten en gebeurtenissen voorkomen in het deelsysteem dat geanalyseerd wordt. Voor de case zijn bijvoorbeeld het objecttype Lid en Titel relevant. Daarnaast zijn gebeurtenistypen te onderkennen. Een gebeurtenis verandert de toestand van een of meer objecten. Denk bijvoorbeeld aan de gebeurtenissen Inschrijven, Reserveren en Uitlenen. Is een lijst van objecten en gebeurtenissen opgesteld dan kan aangegeven worden welk effect een gebeurtenis op één of meerdere objecten heeft. Dit wordt aangegeven met drie tekens BXE. De B geeft het begin van een object aan, een X een wijziging en een E het einde van een object. De gebeurtenis Aanvraag_wordt_vervuld zal het einde van een Aanvraag object betekenen (E) en een wijziging van een Kandidaat object (de eigenschap beschikbaar veranderd) Vervolgens wordt aangegeven wat de relaties zijn tussen de verschillende objecten. Zo hoort bijvoorbeeld een externe kandidaat altijd bij een inhuurbureau. De relatie tussen deze objecten is dan Werkt_voor. Door het uitwerken van relaties is te zien welke objecten kennis moeten hebben van andere objecten door er op één of ander manier naar te verwijzen. Met behulp van een ER diagram is het mogelijk de verschillende relaties in kaart te brengen. Uit de object gebeurtenis tabel is al gebleken dat een object een levensloop heeft die begint, wijzigt en eindigt. Binnen deze levensloop zijn beperkingen aan te brengen. Deze beperkingen zijn relevant omdat hiermee bepaald kan worden wat de volgende fase in het leven van een object is. In de case kan bijvoorbeeld een exemplaar pas uitgeleend worden als deze geclassificeerd is. Naast beperkingen in de volgorde zijn er ook beperkingen te onderkennen op het gebied van gegevens. Te denken valt hierbij aan attributen die slechts een bepaalde waarde aan kunnen nemen. Maar ook bepaalde precondities voor een methode zijn hier te modelleren. In de case is een informatiebeperking bijvoorbeeld dat een lid niet mdeer dan vijf boeken mag lenen. Services geven de mogelijkheid om gegevens te representeren aan gebruikers van het systeem. Ook kunnen services dienen om gegevens naar het systeem toe te sturen. Dit gebeurt door vanuit de service één of meerdere gebeurtenissen aan te roepen. Deze services bewerkstelligen de inkapseling van de daadwerkelijke structuur van methoden en gebeurtenissen. Bijvoorbeeld het invoerscherm voor reserveren in de case is gebaseerd op een service. In deze service wordt slechts een gedeelte van de eigenschappen van het object aanvraag getoond.
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Creeren van een datamodel in een ADT
Specificeren van methoden en gebeurtenissen
In het datamodel worden de attributen en methoden van de verschillende objecten beschreven. Hiermee wordt het ontwerp gecompleteerd. In het datamodel worden bijvoorbeeld de gegevenstypen van de attributen beschreven In de methoden wordt aangegeven wat de toestandsverandering is van een object. Een methode kan naast het wijzigen van de toestand ook het leven van een object beginnen of eindigen. Een gebeurtenis zorgt ervoor dat er een inkapseling plaatsvindt voor de services naar de methoden. Een services weet ten slotte niet wat de structuur is van de onderste laag. Een gebeurtenis zal dan ook één of meerdere methoden van één of meerdere objecten aanroepen Zo zal de gebeurtenis Uitlenen na reserveren vier methoden aanroepen één die het leven van een Titel, Lid, Reservering en Uitlening wijzigt.
In de DLA designer zijn de methodische stappen van DLA samengebracht in een scherm. Dit scherm biedt een stappenplan voor een ontwerper om te komen tot een compleet DLA objectmodel. In onderstaande figuur een voorbeeld van dit scherm.
Notatiewijzen ER diagram en ED Diagram Een ER diagram is er op gericht de objecttypen en de relaties tussen de verschillende objecttypen in beeld te brengen. Dit wordt gedaan door objecttypen als een rechthoekje weer te geven met daarin de naam van het objecttype. Een relatie wordt weergegeven als een lijn tussen twee objecten. Deze lijn heeft de naam van de relatie. In het voorbeeld van bijvoorbeeld de relatie te zien door waarbij de objecttypen lid en uitlening betrokken zijn. Aan de uiteinden van de lijn zijn symbolen opgenomen waarmee te zien is wat de multipliciteit van een relatie is. Zo is het in de genoemde relatie bijvoorbeeld zo dat een resource medewerker meerdere aanvragen in behandeling heeft, terwijl een aanvraag altijd bij slechts één resourcemedewerker in behandeling is. De volgende symbolen worden gebruikt in een ER diagram. • Open rondje. De multipliciteit is 0 of 1. Dat betekent dat slechts een entiteit in de relatie mag voorkomen • Gesloten rondje. De multipliciteit is 1. Dat betekent dat slechts een entiteit in de relatie moet voorkomen
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
• •
Open rondje en een driehoekje De multipliciteit is 0 tot meer. Dat betekent dat er meerdere entiteiten in de relatie mogen voorkomen, echter dit is optioneel. Gesloten rondje en een driehoekje De multipliciteit is 1 tot meer Dat betekent dat er een of meerdere entiteiten in de relatie moeten voorkomen.
In de figuur is een ER-diagram als voorbeeld opgenomen.
Object gebeurtenis tabel In de object gebeurtenis tabel wordt een matrix opgesteld waarbij op de verticale as alle gebeurtenissen getoond worden en op de horizontale as alle objecten. In de matrix wordt door middel van een drietal karakters aangegeven hoe een object bij een bepaalde gebeurtenis betrokken is. • B (begin) betekent dat als een object op basis van dit karakter betrokken is bij deze gebeurtenis, hierdoor een nieuw object van dit type gecreëerd wordt. • X (wijzig) houdt in dat een object door deze gebeurtenis wijzigt • E (einde) door deze gebeurtenis eindigt het leven van een object. In onderstaande afbeelding is een voorbeeld te zien van de Object Gebeurtenis tabel zoals deze is geïmplementeerd in de biebcase.
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Deze object-gebeurtenistabel kan gebruikt worden om in een later stadium rollen en methoden voor de verschillende combinaties van gebeurtenissen en objecten te genereren. In het proces scherm van DLA is een knop opgenomen generate methods and roles welke dit geautomatiseerd uitvoert. Rolstructuren Met behulp van rolstucturen is de levensloop van objecttypen te beschrijven. Zo kan een aanvraag in PLATO pas vervuld zijn als er een nieuwe aanvraag is binnengekomen. Rolstructuren kunnen het beste gezien worden als een boom waarbij de naam van het objecttype als wortel fungeert. Vanuit deze wortel wordt de boom vervolgens van links naar rechts en van boven naar beneden gelezen. In de figuur is een voorbeeld van de titel opgenomen. Hieronder volgt een toelichting
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Het leven van een titel begint met de gebeurtenis opnemen. De volgende fase is de body van het leven waarbij de toestand van de aanvragen meerdere keren gewijzigd kan worden bijvoorbeeld in uitlenen en verlengen. Het leven van een object eindigt door het schrappen van een titel. In een zijn de volgende rollen te onderkennen • Elementaire bewerking (de eindpunten van de boom die de toestand aanpassen) • Sequentie de stappen volgen elkaar sequentieel op (opnemen .. titel body .. schrappen) • Iteratie (*) het een of meerdere keren uitvoeren van een stap zoals de titel body. De titel body is in deze de iteratie • Selectie (0) een stap bestaat uit de keuze van twee of meer stappen. In dit voorbeeld de keuzen in titel body. Die bestaat uit een groot aantal keuzen. Producten Is het DLA proces uitgevoerd in één of meerdere stappen dan is er een object model beschikbaar. Dit objectmodel bestaat uit een aantal producten. Deze producten kunnen gebruikt worden in de realisatiefase van een softwareontwikkelingstraject. Ze bestaan uit de volgende onderdelen. Vanzelfsprekend bestaan deze producten naast de diagrammen als ER Diagram en rolstructuur. Deze diagrammen maken duidelijk wat de verbanden zijn tussen de verschillende te onderscheiden entiteiten. • Services beschrijven hoe de presentatielaag van de DLA gegevens van en naar de gebruikerslaag zendt. In een service is met name de parameterdefinitie van belang. Daarnaast wordt aangegeven of een service gegevens verstrekt aan de presentatielaag of gegevens bewerkt. Een gegevensverstrekkende service bestaat uit het “verstrekken” van gegevens naar de presentatielaag. In de biebcase bestaat er bijvoorbeeld een verstrekkende service geef_titels welke een lijst van alle actieve titels geeft. De service kan naast verstrekken ook gegevens vragen bijvoorbeeld als slechts een gedeelte van alle objecten getoond moet worden. In de case is er een service geef_titel welke de eigenschappen van een specifiek object titel toont. Hierbij is het noodzakelijk dat opgegeven wordt welk object getoond moet worden. Dit wordt gedaan met behulp van de object identifier. • Gebeurtenissen geven een beeld van wat optreedt in de werkelijkheid van een gebruikersgroep. Een gebeurtenis vertaalt dit “event” in een aantal methode aanroepen op één of meerdere objecten. • Methoden veranderen de toestand van een object. Deze toestandverandering heeft een drietal verschijningsvormen: Er wordt een nieuw object van het objecttype gecreëerd. De waarden van de objecteigenschappen worden veranderd. In het voorbeeld kan een lid verhuizen de eigenschappen adres en woonplaats veranderen hierdoor. De laatste verschijningsvorm is dat een object van een bepaald type verdwijnt of eindigt. In de object-gebeurtenis tabel is aangegeven welke gebeurtenis de verschillende verschijningsvormen initieert
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
•
ADT geeft een beschrijving van de statische eigenschappen van de verschillende objecttypen. Statisch zijn bijvoorbeeld de afzonderlijke objecten, hun eigenschappen en voor een groot deel de relaties tussen deze verschillende objecten. Het ADT is het product dat samen met de methoden het bedrijfsdomein beschrijft.
Deze producten zijn in detail beschreven met behulp van de DLA methode. In het voorbeeldproject zijn al de ze gegevens ingevoerd in de DLA designer. De designer beschikt over een repository welke beschikbaar is in de verschillende fasen van het ontwikkeltraject. In dit hoofdstuk is een summiere beschrijving gegeven van het ontwikkelproces van DLA. De volgende stap is de transformatie van een object model naar een structuur in één of meerdere ontwikkelomgevingen. #afbreekpunt#
Implementeren van het bedrijfsdomein De eerste stap te zetten om te komen tot een werkende toepassing is het implementeren van het bedrijfsdomein in een relationele database. In deze case kiezen we voor MS-Access als database. Rede om voor MS-Access te kiezen is dat voor het werken met een MS-Access database geen zware hardware eisen gesteld worden en dat deze database op vrijwel iedere computer beschikbaar is. Daarnaast bevat MS-Access alle relationele eigenschappen benodigd voor deze case. Alvorens in te gaan op de daadwerkelijke scripts wil ik ingaan op de transformatieregels om van een object georiënteerd Merode model te komen naar een relationeel datamodel. Bij de transformatie spelen de volgende entiteiten een rol • Object, een object is te implementeren met behulp van een tabel in een relationele database. Echter in de object orientatie heeft een object identiteit. Dat moet in het relationele model toegevoegd worden. Daarom is het mogelijk (en eigenlijk noodzakelijk) om in het object model een object identifier te kiezen. Deze kan dan dienen als primaire sleutel in het relationele model. Enkelvoudige overerving kan bereikt worden door aan het overervende object de primaire sleutel van het super object op te nemen en vervolgens een view te creëren die de beide (of meerdere) tabellen met elkaar combineert. • Eigenschap, de eigenschap kan in het relationele model worden opgenomen als kolom. Verder is het mogelijk om, zeker als met een view gewerkt wordt) afgeleide eigenschappen te definiëren. Daarnaast kan het domein van een eigenschap eenvoudig getransformeerd worden naar een relationele database. In MS-Access is het niet mogelijk om met standaardwaarden te werken. Dit zal in de case dan ook geïmplementeerd moeten worden in de methoden. • Associatie, associaties kunnen verwerkt worden door referentiele beperkingen op te leggen. Vooral de 1 op N en 0 op N associaties zijn op deze wijze te implementeren. 1 op 1 en 0 op 1 associaties kunnen bereikt worden door een combinatie van foreign key constrains en unieke indexering • Methode, methoden kunnen niet in de relationele database van MS-Access geïmplementeerd worden. Hierop wordt bij de specifieke ontwikkelomgeving omschrijving ingegaan. • Gebeurtenis, gebeurtenissen kunnen niet in de relationele database van MS-Access geïmplementeerd worden. Deze komen bij de specifieke ontwikkelomgeving omschrijving aan de orde. • Service services kunnen niet in de relationele database van MS-Access geïmplementeerd worden. Hierop wordt bij de specifieke ontwikkelomgeving omschrijving ingegaan. In onderstaande source code een afleiding van het script zoals dit door de DLA designer gegenereerd wordt. Echter bij de DLA designer wordt met behulp van een ODBC connectie deze opdracht naar MS-Access gestuurd. Deze listing is dan ook alleen bedoeld als voorbeeld CREATE TABLE EXEMPLAAR ( aanschafdatum , druk , exemplaarid , rolstatus , status , titelid , deletedmark
DateTime Char( 50) Integer NOT NULL CONSTRAINT exemplaar PRIMARY KEY Char( 10) Char( 2) NOT NULL Integer NOT NULL Integer )
CREATE TABLE LID ( aantal_reserveringen , aantal_uitleningen , actuele_reserveringen , actuele_uitleningen , adres , geboortedatum , inschrijfdatum , lidid , naam , status , telefoon
Integer Integer Integer Integer* Char( 25) NOT NULL DateTime DateTime Integer NOT NULL CONSTRAINT lid PRIMARY KEY Char( 25) NOT NULL Char( 2) NOT NULL Char( 20)
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Integer Integer NOT NULL DateTime Integer NOT NULL Char( 2) NOT NULL DateTime Integer NOT NULL CONSTRAINT uitlening PRIMARY KEY DateTime Integer )
ALTER Table EXEMPLAAR ADD constraint exemplaar_titel_fk FOREIGN KEY (titelid) ALTER Table RESERVERING ADD constraint reservering_lid_fk FOREIGN KEY (lidid)
REFERENCES TITEL (titelid)
REFERENCES LID (lidid)
ALTER Table RESERVERING ADD constraint reservering_titel_fk FOREIGN KEY (titelid) (titelid) ALTER Table UITLENING ADD constraint uitlening_lid_fk FOREIGN KEY (lidid)
REFERENCES TITEL
REFERENCES LID (lidid)
In het script is te zien hoe als eerste de tabellen gedefinieerd worden. In de tabellen worden zoveel mogelijk de eigenschappen van de kolommen opgenomen, zoals verplicht of niet verplicht en of het een primaire sleutel is. Met de alter table instructies worden de 1 op N associaties uit het object model vertaald naar foreign key constraints. De 1 op 1 associaties en 0 op 1 associaties moeten nu met de hand aangemaakt worden. Daarnaast is te zien dat bij elke tabel een kolom deletedmark toegevoegd is. Bij Merode wordt ervan uitgegaan dat als het leven van een object eindigt deze niet verdwijnt maar blijft bestaan met een einde status. Dit is bijvoorbeeld voor bestuurlijke informatie handig. Voor het gemak wordt een deletedmark gebruikt. Ook zou het mogelijk zijn te controleren op de einde statussen. Echter als deze statussen veranderen dan kan dit problemen geven. Op zich is dit een eenvoudig object model en een eenvoudige transformatie. Echter voor andere databases zoals SQL server zijn er scripts beschikbaar die veel meer transformaties en detaillering mogelijk maken. Het nu geimplementeerde bedrijfsdomeinmodel geldt als uitgangspunt voor de te bouwen voorbeeld applicaties in MS-Access VB en ASP. Het eindresultaat van de bedrijfsdomein generatie is te vinden in onderstaande afbeelding
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
#afbreekpunt#
Transformatie naar MS-Access Nu kan begonnen worden met de implementatie van de drie lagen in MS-Access. Hierbij wordt gebruik gemaakt van de formulieren en klasse modulen. De formulieren geven de gebruiker de mogelijkheid om gegevens te bewerken, bekijken en toe te voegen. De klasse modulen zorgen ervoor dat de gegevens vanuit de database naar de formulieren komen en de gewijzigde gegevens naar de database worden weggeschreven. Voordeel van deze werkwijze is dat een optimale inkapseling mogelijk is. De formulieren maken gebruik van de servicelaag en deze laag zorgt ervoor dat de gegevens uit de database gepresenteerd worden op een wijze welke voor de bewerking van de specifieke gebeurtenis van de gebruiker relevant is. Bijvoorbeeld het verwerken van de gebeurtenis Uitlenen_na_reserveren heeft betrekking op in totaal vijf objecten in de onderste laag. Te weten: • Lid • Titel • Reservering • Exemplaar • Uitlening Hierbij kan het zo zijn dat voor het ene klasse er een nieuw object aangemaakt wordt terwijl voor de andere klasse een object verdwijnt. Bij uitlenen_na _reserveren wordt een uitlening aangemaakt, een reservering verdwijnt en van de andere drie objecten veranderd de toestand van één of meer eigenschappen. In de source code voorbeelden werken we van de bovenste laag naar beneden naar de lagere lagen. Hierbij wordt uitgegaan van de volgende opzet van de klasse modulen. We nemen hierbij het de gebeurtenis uitlenen_na_reserveren. In de voorbeeldtoepassing van MS-Access is trouwens in het start formulier een spy opgenomen. Hiermee is te zien hoe de verschillende gebeurtenissen vertaald worden naar een SQL opdracht voor de database.
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Formulier en servicelaag Bij het openen van het formulier uitlenen na reserveren wordt ervoor gezorgd dat de keuzelijsten met invoervak die bij het openen gevuld zijn ook daadwerkelijk gevuld worden met de gewenste data. Dat wordt uitgevoerd in het form_open event van het formulier. Deze bevat de onderstaande source code. Er wordt een object aangemaakt van de klasse module servicelayer en deze zorgt ervoor dat de keuzelijsten gevuld worden met de juiste keuzeopties. Hierbij is te zien dat de inkapseling optimaal is, omdat er geen informatie zichtbaar wordt van de structuur van de lagen en de servicelaag zelf. Private Sub Form_Open(Cancel As Integer) Set objService = ServicesLayer objService.FillCtrlGeef_Leden lidid objService.FillCtrlGeef_Titels titelid End Sub De methode van het servicelaag object voor het vullen van een besturingselement is voor vrijwel alle besturingselementen hetzelfde. We werken in dit voorbeeld een methode uit. Soms wordt het vullen van een keuzelijst uitgesteld tot meer informatie beschikbaar is. In het formulier uitlenen na reserveren is dit bijvoorbeeld het geval voor de reservering het geval. Deze is afhankelijk van de lid gegevens die pas bekend zijn na het kiezen van een lid. Dit wordt dan ook in de afterupdate van lidid gevuld. Het formulier voor uitlenen na reserveren is te zien in onderstaande afbeelding
Sub FillCtrlGeef_Leden(objCtrl As Control) objCtrl.RowSource = Geef_Leden objCtrl.BoundColumn = 1 End Sub Private Function Geef_Leden() As String Dim strSql As String strSql = "SELECT LID.lidid, LID.naam, LID.woonplaats, LID.geboortedatum FROM LID WHERE LID.deletedmark=0 " Geef_Leden = strSql End Function
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Het vullen van een besturingselement in de servicelaag bestaat uit twee methoden. De eerste fungeert als een interface naar een formulier en zorgt ervoor dat het besturingselement een SQL string als rowsource krijgt en er wordt ingesteld wat de datakolom is. Vanzelfsprekend zijn hier ook andere eigenschappen van het besturingselement (zoals aantal kolommen) in te stellen. In de tweede methode wordt de SQL string opgebouwd. Dit kan dynamisch plaatsvinden of statisch. Bij een dynamische werkwijze kan er bijvoorbeeld gedacht worden aan het ophalen van een SQL statement uit een of meerdere tabellen in de database. Zijn alle gegevens ingevoerd en de gebruiker drukt op de OK knop dan worden de gegevens via de lagen naar de database gestuurd. De source code voor het formulier en de service laag zie je in onderstaande listing Private Sub OkPB_Click() If objService.ExecuteEvent("Uitlenen_na_reserveren", Me.Controls) = True Then DoCmd.Close End If End Sub Function ExecuteEvent(strEvent As String, objControls As Controls) As Boolean Dim blnRetValue As Boolean Select Case strEvent … …. Case “Uitlenen_na_reserveren” blnRetValue = objEvent.Uitlenen_na_reserveren(objControls) Case "Uitschrijven" blnRetValue = objEvent.Uitschrijven(objControls) Case "Verdwijnen_tijdens_lenen" blnRetValue = objEvent.Verdwijnen_tijdens_lenen(objControls) Case "Verdwijnen_uit_bibliotheek" blnRetValue = objEvent.Verdwijnen_uit_bibliotheek(objControls) Case "Verkopen" blnRetValue = objEvent.Verkopen(objControls) Case "Verlengen" blnRetValue = objEvent.Verlengen(objControls) Case "Weggooien" blnRetValue = objEvent.Weggooien(objControls) End Select ExecuteEvent = blnRetValue End Function De source code is redelijk recht toe recht aan. Het formulier roept de executeevent methode van de servicelaag aan en geeft als parameter de naam van het event en de controls collectie mee. Deze controls collectie wordt gebruikt als een container van velden en waarden die in een lagere laag gebruikt wordt om de SQL statements op te bouwen. In de executeevent methode van de servicelaag is een select case statement opgenomen dat ervoor zorgt dat dat het juiste event in de eventlaag wordt aangeroepen. Met namen omdat dit soort zaken door de DLA designer gegenereerd kan worden is het toevoegen of verwijderen van events tijdens een iteratief ontwikkelproces bijzonder eenvoudig. Eventslaag In de eventslaag zorgt de methode uitlenen_na_reserveren voor een aantal zaken. De belangrijkse zijn: • Het afhandelen van een database transactie, omdat meerdere objecten in de database bewerkt worden bestaat er een mogelijkheid dat één van de SQL bewerkingen mislukt. Als dit gebeurt moeten en bewerkingen op de andere objecten teruggedraaid worden. Anders zou een deel van de gegevens wel gewijzigd zijn en een ander deel niet. • Het verzorgen van het aanroepen van de methoden op de domein objecten die betrokken zijn bij dit event. Function Uitlenen_na_reserveren(objControls As Controls) As Boolean Dim blnRetValue As Boolean Dim objWrk As Workspace Set objWrk = DBEngine.Workspaces(0) objWrk.BeginTrans
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
blnRetValue = (objEXEMPLAAR.Uitlenen_na_reserveren(objControls) And _ objTITEL.Uitlenen_na_reserveren(objControls) And _ objLID.Uitlenen_na_reserveren(objControls) And _ objRESERVERING.Uitlenen_na_reserveren(objControls) And _ objUITLENING.Uitlenen_na_reserveren(objControls)) If blnRetValue = False Then objWrk.Rollback Else objWrk.CommitTrans End If Set objWrk = Nothing Uitlenen_na_reserveren = blnRetValue End Function In de source code is te zien hoe de transactie ingesteld wordt en gecommit als alle object methoden de waarde True retourneren en een rollback uitvoert als één of meerdere methoden false retourneren. Ook is hier goed te zien hoe de controls collectie als container gebruikt wordt voor de communicatie tussen de verschillende lagen. Domein Object laag ‘ uitlening object Function Uitlenen_na_reserveren(objControls As Controls) As Boolean Dim Dim Dim Dim
blnRetValue As Boolean strSql As String strStatus As String strCurrentStatus As String
objControls(strIdentifier) = GetSQLIdentifier(strTable, strIdentifier) DefaultInitialValues objControls strStatus = "UU" blnRetValue = DefaultValidation(objControls) If blnRetValue = False Then Uitlenen_na_reserveren = blnRetValue Exit Function End If strCurrentStatus = GetCurrentStatus(strTable, strIdentifier, objControls(strIdentifier)) If strCurrentStatus <> "Null" Then MsgBox "Uitlening bestaat al" Uitlenen_na_reserveren = False Exit Function End If strSql = "INSERT INTO UITLENING" strSql = strSql & " ( deletedmark, status , exemplaarid, lidid, uitleendatum, uitleningid, verwinleverdatum ) VALUES ( 0, " & Set2SQL(strStatus) & " " strSql = strSql & " , " & Set2SQL(objControls("exemplaarid")) strSql = strSql & " , " & Set2SQL(objControls("lidid")) strSql = strSql & " , " & Set2SQL(objControls("uitleendatum")) strSql = strSql & " , " & Set2SQL(objControls("uitleningid")) strSql = strSql & " , " & Set2SQL(objControls("verwinleverdatum")) strSql = strSql & " ) " ExecuteSQL strSql Uitlenen_na_reserveren = blnRetValue End function ‘ reservering object Function Uitlenen_na_reserveren(objControls As Controls) As Boolean
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Dim Dim Dim Dim
blnRetValue As Boolean strSql As String strStatus As String strCurrentStatus As String
strStatus = "RU" blnRetValue = DefaultValidation(objControls) If blnRetValue = False Then Uitlenen_na_reserveren = blnRetValue Exit Function End If strCurrentStatus = GetCurrentStatus(strTable, strIdentifier, objControls(strIdentifier)) If strCurrentStatus <> "RA" Then MsgBox "Reservering bestaat niet" Uitlenen_reserveren = False Exit Function End If strSql = "UPDATE RESERVERING" strSql = strSql & " SET deletedmark= 1, status= " & Set2SQL(strStatus) & " " strSql = strSql & " WHERE " & strIdentifier & "= " & Set2SQL(objControls(strIdentifier)) ExecuteSQL strSql Uitlenen_na_reserveren = blnRetValue End Function ‘ Titel of Lid object Function Uitlenen_na_reserveren(objControls As Controls) As Boolean Dim strSql As String strSql = "UPDATE LID SET actuele_uitleningen = actuele_uitleningen+1" strSql = strSql & ", aantal_uitleningen = aantal_uitleningen+1" strSql = strSql & ", actuele_reserveringen = actuele_reserveringen-1" strSql = strSql & " WHERE " & strIdentifier & " = " & objControls(strIdentifier) ExecuteSQL strSql Uitlenen_na_reserveren = True End Function De source code van de object methoden hebben allemaal een zelfde opbouw. Allereerst worden een aantal validaties uitgevoerd. De DefaultValidation voert de validaties uit die betrekking hebben op de eigenschappen van het object en dus altijd geldend zijn. In deze toepassing is de validatie op Niet null kolommen een default validatie. Voordat de SQL opdracht uitgevoerd wordt moet deze check gedaan worden om te voorkomen dat de database inconsistent wordt. Vanzelfsprekend zijn er meerdere domein validaties mogelijk voor de eigenschappen die algemeen geldend zijn. Bijvoorbeeld de keuze uit een lijst van waarden of een bepaalde picture voor de invoer. In deze voorbeeldtoepassing is dit niet van toepassing. Vervolgens worden een aantal specifieke methode validaties uitgevoerd. Bijvoorbeeld bij de methode van het reservering object, waar gekeken wordt wat de huidige status van het object is. Als de reservering niet actief is (status RA) dan heeft het sluiten van de reservering weinig zin. Na de validatie wordt een SQL statement opgebouwd Dit statement bestaat uit een INSERT of een UPDATE statement. Een delete komt niet voor omdat Merode dit ontmoedigt. Bij de opbouw van het SQL statement wordt handig gebruik gemaakt van de Controls collectie afkomstig van het formulier. Hier worden alleen die controls opgevraagd die voor de desbetreffende object methode van belang is. Zo zou het zelfs mogelijk kunnen zijn dat op het scherm meer informatie getoond wordt dan voor het verwerken van de object methoden vereist zijn. In de toepassing met ASP worden de verschillen tussen de formulieren duidelijk gemaakt. Men zou kunnen denken dat deze werkwijze extra werk is ten opzichte van de normale werkwijze in MS-Access waarbij de formulieren rechtstreeks aan een tabel of query gekoppeld worden. Toch heeft deze werkwijze een aantal voordelen die niet mogelijk zijn bij een rechtstreeks koppeling aan een tabel of query. • Vanuit een formulier kunnen over meerdere tabellen updates of deletes uitgevoerd worden. Zelfs is het mogelijk, zoals in het uitlenen_na_reserveren event, dat een insert, update en pseudo delete tegelijkertijd uitgevoerd worden.
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
• •
Een ander voordeel is dat gebruik gemaakt wordt van een CASE tool die de source code van de services, events, methoden en database definitie voor je aanmaakt. Aanpassingen en uitbreidingen worden alleen in de CASE tool aangebracht. De overstap van MS-Access naar Visual Basic wordt bijzonder eenvoudig. Een VB toepassing kan vrijwel gelijk opgezet worden als de MS-Access toepassing.
#afbreekpunt#
Transformatie naar Visual Basic De transformatie van de bibliotheekcase heeft veel overeenkomsten met de MS-Access applicatie. Zo wordt er gewerkt met formulieren die samenwerken met class modules die de gegevens van en naar de database brengen. Echter er zijn een aantal kleine verschillen. Bij MS-Access is de connectie met de database in vergaande mate geïntegreerd. Het opgeven van een tabel of query naam als recordsource van een formulier is voldoende om de gegevens uit deze tabel op het formulier weergegeven te krijgen. In Visual Basic is dit niet standaard aanwezig maar moet het zelf geprogrammeerd worden. Hiertoe wordt gebruik gemaakt van het ADODB com object dat de koppeling met een database mogelijk maakt. Daarnaast wordt geen gebruik gemaakt van de Controls collectie maar van het recordset object dat in ADODB gebruikt wordt. Onderstaande afbeelding geeft een idee van de opzet. Duidelijk is dat de werkwijze erg veel lijkt op die van MS-Access, alleen het ADO object komt tussen de database en de lagenobjecten te liggen. Formulier en servicelaag In dit artikel gaan we niet in op de opzet van menu’s en formulieren zoals in VB gebruikelijk is. De wizards van VB genereren source code die geod toegankelijk is. We gaan in dit artikel alleen in op die onderdelen die voor een drie lagen toepassing relevant zijn. Voor de voorbeeld toepassing wordt gebruik gemaakt van het event verlengen. Het geeft weer hoe gegevens gekoppeld kunnen worden, afhankelijk van besturingselementen die al ingevoerd zijn. Het formulier ziet er uit als onderstaande afbeelding.
In onderstaande source code wordt een aantal methoden van het formulier verlengen getoond die een illustratie vormen van de werkwijze van het formulier. Zoals gezegd wordt de communicatie tussen de verschillende classe modulen en formulieren niet verzorgd door de controls collectie maar door een recordset object. Het recordset object bevat krachtige mogelijkheden om ervoor te zorgen dat de gegevens uit de database op eenvoudige wijze getoond en bewerkt worden in een formulier. In het form load event worden de gegevens die niet afhankelijk zijn van reeds ingevoerde data opgevraagd uit de servicelaag. In het change event van lidid wordt ervoor gezorgd dat het uileningid besturingselement gevuld wordt met keuzeopties die betrekking hebben op het lid. Dus alleen die uitleningen die betrekking hebben op het gekozen lid. In het click event van de ok button wordt ervoor gezorgd dat het recordset object met de naam van het bijbehorende event naar de service laag gebracht wordt voor verdere bewerking. Private Sub Form_Load() Set objService = New ServicesLayer cmdOk.Enabled = False
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
With titelid Set .RowSource = objService.Geef_Titels .BoundColumn = "titelid" .ListField = "naamtitel" End With With lidid Set .RowSource = objService.Geef_Leden .BoundColumn = "lidid" .ListField = "naam" End With End Sub Private Sub lidid_Change() With uitleningid Set .RowSource = objService.Geef_Uitlening_Bij_Lid(lidid.BoundText) .BoundColumn = "uitleningid" .ListField = "naamtitel" End With End Sub Private Sub cmdOk_Click() If objService.ExecuteEvent("Verlengen", objRS) Then Unload Me Else MsgBox GetErrorMessage() End If End Sub In de servicelaag is de opzet van de gegevensverstrekkende services eenvoudiger dan in de MS-Access applicatie. Dat is mogelijk omdat er gewerkt kan worden met het recordset object als container voor de gegevens. Als voorbeeld wordt de source code van de geef_titels methode getoond. Voor de connectie met de database wordt gebruik gemaakt van een onnactiemanager. Het statement objCon.Openrecordset is een voorbeeld van deze connectiemanager. We komen later uitgebreid terug op de connectionmanager. Van de executeevent methode van de servicelaag wordt geen beschrijving gegeven omdat deze precies hetzelfde is als die in MS-Access. Function Geef_Titels() As Recordset Dim strSQL As String Dim objRS As Recordset strSQL = "SELECT TITEL.titelid, TITEL.naamtitel, TITEL.isbn FROM TITEL TITEL.deletedmark=0 " Set objRS = objCon.GetRecordSet(strSQL)
WHERE
Set Geef_Titels = objRS End Function Eventslaag In de eventslaag wordt per object de bijbehorende methode aangeroepen. Verder wordt het afhandelen van de transactie voor de database afgehandeld. Hiervoor wordt weer gebruik gemaakt van de connectiemanager. De source code van het verlengen event toont de opzet van de transactie en het aanroepen van de object methoden. Function Verlengen(objRS As Recordset) As Boolean Dim blnRetValue As Boolean
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
objCon.BeginTrans blnRetValue = (objEXEMPLAAR.Verlengen(objRS) And objTITEL.Verlengen(objRS) And objLID.Verlengen(objRS) And objUITLENING.Verlengen(objRS)) If blnRetValue = False Then objCon.RollBackTrans Else objCon.CommitTrans End If Verlengen = blnRetValue End Function Domein object laag In de class modules van de domein objecten wordt ervoor gezorgd dat de gegevens uit het recordset object gehaald worden en vertaald worden naar een SQL statement ten behoeve van een Insert of update statement. Ook hier wordt slechts één methode getoond omdat de overeenkomst met de MS-Access toepassing groot is. De opbouw is: • Uitvoeren van default validaties van de eigenschappen • Methode specifieke validaties uitvoeren • Opbouwen van het SQL statement • Uitvoeren van het SQL statement Ook voor het uitvoeren van het SQL statement wordt gebruik gemaakt van de connectiemanager Function Verlengen(objRS As Recordset) As Boolean Dim Dim Dim Dim
blnRetValue As Boolean strSQL As String strStatus As String strCurrentStatus As String
strCurrentStatus = objCon.GetCurrentStatus(strTable, strIdentifier, objRS.Fields(strIdentifier)) strStatus = strCurrentStatus blnRetValue = DefaultValidation(objRS) If blnRetValue = False Then Verlengen = blnRetValue Exit Function End If strSQL = "UPDATE UITLENING SET status = " & Set2SQL(strStatus) & " " strSQL = strSQL & " , " & " verwinleverdatum= " & Set2SQL(objRS.Fields("verwinleverdatum")) strSQL = strSQL & " , " & " aantalverlengingen= " & Set2SQL(objRS.Fields("aantalverlengingen")) strSQL = strSQL & " WHERE " & strIdentifier & "= " & Set2SQL(objRS.Fields(strIdentifier)) objCon.ExecuteSQL strSQL Verlengen = blnRetValue End Function ConnectionManager In Visual Basic wordt de connectie met databases veelal verzorgt door een ADO com object. Dit object heeft een zeer eenvoudige opzet maar biedt toch alle flexibiliteit die men als ontwikkelaar wenst. Echter voor een aantal aspecten, zoals het werken met transacties vond ik het fijner om een klasse module te maken die een als een interface over het ADO object heen ligt. Zo is het met deze klasse mogelijk om eenmalig in te loggen op de database en een globaal object van de connectiemanager te gebruiken voor alle interactie met de database. In de listing is te zien hoe het mogelijk is eenmalig in te loggen bijvoorbeeld via een inlog formulier naar de database,. In dit voorbeeld wordt niets gedaan met de gebruikersnaam en het wachtwoord. Echter de werking zal duidelijk zijn, de opzet van
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
makeconnection is zo opgezet dat het eenvoudig uitgebreid kan worden. Bijvoorbeeld de controle om te kijken of het inloggen gelukt is. Voor het werken met transacties wordt gebruik gemaakt van een instance variabel die bepaald of een transactie gezet moet worden. Dit vindt plaats in de methode begintrans. Zodra de eerste executeSQL wordt uitgevoerd wordt de transactie ook gezet. Het bleek dat er een probleem ontstond bij een commit als er geen begintrans gezet was, wat logisch is. In dit voorbeeld wordt gebruik gemaakt van het statement execute van het ADODB object. Veelal kan ook gewerkt worden met OpenRecordset als het statement een select statement bevat. Als laatste methode is te zien hoe de connectie met de database verbroken wordt en het adodb object vernietigt wordt. Door gebruik te maken van de connectiemanager is het versturen van SQL statements eenvoudig. Daarnaast is het erg eenvoudig om te wijzigen van Database, bijvoorbeeld van MS-Access naar SQL server. Ook het overstappen nar stored procedures in plaats van statements is eenvoudig. Dit is mogelijk door het werken met een meerlagen architectuur. De bovenste lagen hoeven geen kennis te hebben van de implementatie op de onderliggende lagen. Private objAdoConnection As ADODB.Connection Private blnBeginTrans As Boolean Private blnTransactionSet As Boolean Function MakeConnection(strUser As String, strPassWord As String) As Boolean Set objAdoConnection = New Connection objAdoConnection.CursorLocation = adUseClient objAdoConnection.Open "PROVIDER=Microsoft.Jet.OLEDB.3.51;Data Source=D:\Biebcase\biebcase.mdb;" MakeConnection = True End Function Sub BeginTrans() blnBeginTrans = True blnTransactionSet = False End Sub Sub CommitTrans() If blnTransactionSet = True Then objAdoConnection.CommitTrans End If blnBeginTrans = False End Sub Function ExecuteSQL(strSQL As String) As Boolean strSQL = strSQL + ";" MsgBox strSQL If blnBeginTrans = True Then objAdoConnection.BeginTrans blnTransactionSet = True blnBeginTrans = False End If objAdoConnection.Execute strSQL ExecuteSQL = True End Function Function KillConnection() ObjAdoConnection.Close Set objAdoConnection = Nothing KillConnection = True End Function
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
Transformatie naar ASP Nu er een Visual Basic toepassing bestaat voor de bibliotheek case is de overstap naar een ASP toepassing met een Biebcase COM object klein. Hiertoe wordt de Visual Basic applicatie gekopieerd en aangepast. Zo worden de formulieren uit de toepassing verwijderd en worden een aantal aanpassingen aangebracht zodat alleen de servicelaag, de eventslaag, de domeinobjecten en de connectiemanager overblijven. De interface wordt geimplementeerd in HTML pagina’s met een aantal ASP pagina’s voor de verwerking van de aanroepen naar de servicelaag. In onderstaande afbeelding is te zien hoe de lagen gebruikt worden. COM Object In het com object is ervoor gezorgd dat de servicelaag de enige laag is die een publieke interface heeft. Alle andere object zijn private. Dit maakt de inkapseling van de onderste lagen compleet. Ze zijn niet eens zichtbaar als het COM object gebruikt wordt. Echter er zijn hierdoor wel een aantal kleine aanpassingen noodzakelijk aan de servicelaag. Zo is het noodzakelijk dat de makeconnection en killconnection van de connectionmanager vanuit de servicelaag aangeroepen kunnen worden. Zie onderstaande listing van de servicelaag. Sub MakeConnection(strName As String, strPassword As String) Set objCon = New ConnectionManager objCon.MakeConnection strName, strPassword End Sub Daarnaast moet er iets veranderd worden aan de manier waarop de fouten afgehandeld worden. In de Visual Basic applicatie is het mogelijk om met een MessageBox te melden wat de foutmelding is. Met een COM object en ASP pagina’s is dat niet mogelijk. Het COM object draait namelijk op een server en de gebruiker zit achter een client. De message moet dan ook vanuit de servicelaag met behulp van een functie teruggegeven worden aan de ASP pagina. In onderstaande listing de uitwerking van deze methode van de servicelaag. Function GetError() As String GetError = GetErrorMessage() End Function Natuurlijk moet de foutafhandeling in de onderste laag ook aangepast worden met een seterror functie in plaats van de aanroep van een msgbox. Deze aanpassing is triviaal. Verder zijn er geen noemenswaardige wijzigingen nodig aan de VB source code. ASP Pagina’s De ASP pagina’s bestaan per methode uit twee pagina’s een zorgt ervoor dat er een invulformulier getoond wordt, de ander zorgt ervoor dat de gegevens ingevuld in het formulier naar het COM object worden gebracht. Was het eenvoudig om keuzelijsten te gebruiken in een VB toepassing en deze na het wijzigen van een waarde aan te passen, in een ASP pagina met de standaard HTML controls is dit lastiger. Daarom is er in de ASP toepassing voor gekozen zo minimaal mogelijk te werken met keuzelijsten zonder dat dit de werking van de Biebcase toepassing beperkt. Dit bleek goed mogelijk door in de keuzelijst combinaties van waarden te nemen. In de afbeelding is het uitleen formulier te zien. Hier is te zien hoe exemplaar en titelgegevens gecombineerd zijn in een keuzelijst. Door dit te doen is het werken met keuzelijsten die van elkaar afhankelijk zijn tot een minimum beperkt.
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
De source code van dit formulier en het gekoppelde formulier voor de bewerking is hieronder te vinden. In de source code van het formulier is te zien hoe er een connectie wordt gemaakt met het Biebcase com object. Van dit object worden twee gegevensverstrekkende services aangeroepen. Een met een lijst van leden, en een met een lijst van exemplaren, waarbij de titel van het exemplaar ook getoond wordt. Omdat gebruik gemaakt wordt van de recordset als container object is de achterliggende SQL opdracht niet zichtbaar in de Recordset op de HTML pagina. Het is hierdoor dus mogelijk om in de onderste lagen alsnog veranderingen aan te brengen, bijvoorbeeld in de wijze van opslag van de tabellen. De gegevens van de recordset worden met behulp van response.write weggeschreven naar de HTML pagina die opgebouwd wordt. Hierdoor is aan de gegenereerde HTML pagina niet te zien wat de onderliggende source code is. <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> <TITLE> <% dim objBiebcase dim objRS set objBiebcase = Server.CreateObject("Biebcase.Serviceslayer") objBiebcase.MakeConnection "", "" %> In het ASP formulier dat aangeroepen wordt als op de opslaan knop gedrukt wordt is alleen ASP code opgenomen. Deze code zorgt ervoor dat er een recordset en een eventnaam naar de methode executeevent van de servicelaag gestuurd wordt. Omdat we zo spaarzaam mogelijk zijn omgegaan met de keuzelijsten is het nodig om een aantal gegevens expliciet met een Geef_ methode op te vragen, in deze methode is dat met de methode Geef_titel_bij_exemplaar. Is de recordset compleet dan wordt een ASP hulp procedure aangeroepen die ervoor zorgt dat de juiste form controls gekoppeld worden aan de juiste field properties van de recordset. Vervolgens wordt het executeevent aangeroepen die ervoor zorgt dat de gegevens worden opgeslagen in de database. Is er een fout opgetreden dan wordt met de hulp procedure aangeroepen die de geterror methode van de servicelaag op correcte wijze toont op een HTML pagina. <%@ Language=VBScript %> <% dim dim dim dim dim
objBiebcase objRS objRSHlp lidid exemplaarid
Set objBiebcase = CreateObject("Biebcase.Serviceslayer") objBiebcase.MakeConnection "", "" set objRS = Server.CreateObject("adodb.recordset") set objRS = objBiebcase.Geef_Uitlening(0) exemplaarid = Request.Form("exemplaarid") set objRSHlp = objBiebcase.Geef_Titel_bij_exemplaar(exemplaarid) objRS.AddNew objRS.Fields("titelid") = objRSHlp.fields("titelid") set objRSHlp = nothing Call ProcessFields(objRS)
The DLA-Architect homepage
Het toepassen van DLA(designer) in een MS-Access, VB of ASP ontwikkeltraject
If objBiebcase.ExecuteEvent("Uitlenen", objRS) = True then Response.Redirect("default.asp") else Call DisplayError(objBiebCase) end if objBiebcase.KillConnection objRSHlp.Close objRS.Close Set objBiebcase = Nothing %>
Tot slot Het werken met een drie lagen architectuur op basis van Merode in drie ontwikkelomgevingen blijkt goed realiseerbaar. Iedere ontwikkelomgeving heeft beperkingen die aanpassingen nodig maken om het gewenste doel te bereiken. Echter voor alle drie de ontwikkelomgevingen blijkt dat het scheiden in lagen en de inkapseling van de implementatie van deze lagen een aantal voordelen biedt. Met name het feit dat de implementatie van een laag geen of kleine gevolgen heeft voor de andere lagen is een sterk argument ten voordele van het werken met een drie lagen architectuur. Een nadeel van een drie lagen architectuur kan zijn dat er meer source code noodzakelijk is. In plaats van één directe aanroep naar een database moet op drie lagen een stukje source code geschreven worden. Echter door gebruik te maken van een CASE tool die het genereren van source code voor zijn rekening neemt is dit nadeel te minimaliseren. Daarnaast biedt het werken met een CASE tool andere voordelen zoals een consistente documentatie bij de toepassing (de documentatie wordt natuurlijk ook gegenereerd). Bij dit artikel is geen voorbeeldapplicatie opgenomen. Mensen die geïnteresseerd zijn in de source code kunnen contact met mij opnemen via mijn e mail adres ([email protected]).