1 Een interactie dictionary in ASP.Net Bert Dingemans 12 Een interactie dictionary in ASP.NET Inleiding Binnen veel informatiesystemen zijn data dict...
Bert Dingemans DLA Ontwerp & Software http://www.dla-os.nl [email protected]
DLA Ontwerp & Software 1
Een interactie dictionary in ASP.Net
Een interactie dictionary in ASP.NET Inleiding Binnen veel informatiesystemen zijn data dictionaries niet meer weg te denken. Er zijn redenen genoeg om data dictionaries te gebruiken binnen toepassingen. Denk hierbij bijvoorbeeld aan: •
Eenvoudiger beheer omdat meta gegevens zijn opgeslagen in een repository of relationele database.
•
Releases zijn eenvoudiger omdat er geen web- of windows clients meer hoeven te worden aangepast en uitgerold.
•
Er kan maximaal gebruik gemaakt worden van functionaliteit in de repository of de relationele database, denk hierbij aan constraints, indexeren en referentiele integriteit.
•
Er zijn vele hulpmiddelen om gegevens uit een database of repository te benaderen zoals rapportage tools e.d.
•
Het is mogelijk voor gebruikers zonder kennis van HTML en databases om de gegevens in de data dictionary te beheren als er een beheertool aanwezig is voor de data dictionary
•
Gegevens uit de data dictionary kunnen gebruikt worden voor het genereren van documentatie en eventueel testscripts.
Een data dictionary is het begin om met data driven toepassingen te gaan werken. De vervolgstap is snel gemaakt om ook andere zaken in gegevensbestanden op te slaan. In dit artikel wordt hier een voorbeeld van gegeven, namelijk het opslaan van gebruikersinterface in een data dictionary.
DLA Ontwerp & Software 2
Een interactie dictionary in ASP.Net
Interactie Binnen een webapplicatie zijn een aantal interacties te realiseren. Deze interacties hebben meestal een scenario dat doorlopen wordt. Bijvoorbeeld: •
Zoek de gegevens op van een entiteit binnen de webapplicatie (zoek-activiteit).
•
Bewerk de gegevens van deze entiteit (bewerk activiteit).
•
Sla de gewijzigde gegevens op in de database van de webapplicatie.
In onderstaande afbeeldingen ziet u een voorbeeld van het scenario en een aantal schermvoorbeelden.
Afbeelding 1: scenario interactie
DLA Ontwerp & Software 3
Een interactie dictionary in ASP.Net
Afbeelding 2: Zoek-activiteit
Afbeelding 3: bewerk-activiteit
DLA Ontwerp & Software 4
Een interactie dictionary in ASP.Net
Van een sourcecode formulier is geen voorbeeld beschikbaar, omdat dit niet resulteert in een gebruikersinterface, slechts in een interactie met de database. Dit is slechts één voorbeeld van een interactie binnen een webapplicatie. Er zijn er vele te onderkennen. Bijvoorbeeld maak een selectie in een formulier en toon vervolgens de gegevens in een rapportformulier. Een tweede voorbeeld is toon de gegevens uit een content entiteit en toon dit als HTML pagina aan de gebruikers. In de voorbeeld toepassing horend bij dit artikel kunt u een groot aantal voorbeelden van scenario’s vinden. Datamodel interactie dictionary Bij het toepassen van een interactie dictionary is het datamodel verreweg het belangrijkst. Begrijpelijk, want we gaan grote delen van de applicatielogica naar de database overbrengen. Een goed datamodel zal ervoor zorgen dat de dictionary voldoende mogelijkheden biedt voor het onderscheiden van de verschillende entiteiten. In de voorbeeld applicatie zijn de entiteiten webcontrol en webform de kernentiteiten. In de afbeelding ziet u een schets van het datamodel.
Afbeelding 4: vereenvoudigd datamodel
In het datamodel is te zien dat een webapplicatie uit meerdere webformulieren bestaat. Een webformulier is van een bepaald webformtype. Op basis van het webformtype zal de webapplicatie de gegevens uit het formulier op een bepaalde manier tonen.
In onderstaande tabel staan een aantal webformtypes inclusief een korte beschrijving van het gedrag. DLA Ontwerp & Software 5
Een interactie dictionary in ASP.Net
Webformtype
Omschrijving
List
Een lijst met gegevens die getoond worden in tabelvorm afkomstig waarbij de elementen van een record uit de database in een rij staan.
Sourcecode
Aanroep van een sql statement dat naar de database gestuurd wordt om de inhoud van één of meerdere tabellen te muteren.
Hyperlinks
Een menuformulier met hyperlinks naar formulieren in de webapplicatie en naar hyperlinks op het web.
Input
Invulformulier waarin controls zijn opgenomen voor het invoeren en muteren van gegevens uit de database.
Dialog
Vergelijkbaar met een invulformulier, echter alleen voor het invullen van keuzeopties om te bepalen welke gegevens uit de database gehaald dienen te worden.
Detail
Een formulier dat de inhoud van één rij uit de database toont in alleen lezen weergave.
Freeform
Vrije definitie van verschillende webcontrols waarbij geen standaard knoppen worden getoond en waarbij de plaats van de controls zelf bepaald kan worden.
ReportDetail
Detailrapport vergelijkbaar met het formulier detail, echter nu in een rapportage cq. printopmaak.
ReportList
Vergelijkbaar met de list opmaak, maar nu in rapportage cq. printopmaak.
ReportLabel
Label is een rapportage opmaak wat gebruikt kan worden voor etiketten.
Een webform kan bestaan uit nul of meerdere webcontrols. Ook de webcontrols zijn van een bepaald webcontroltype. In onderstaande de tabel vindt u een deel van de beschikbare webcontrols in een interactie dictionary Webcontroltype
Omschrijving
Text
Eenregelig invulveld, de hoogte en de breedte kunnen worden ingesteld.
TextArea
Meerregelig invulveld.
Select
Keuzelijst met een lijst van waarden waarin er één gekozen kan worden.
Hyperlink
Hyperlink naar een ander webformulier of naar een andere website.
Label
Een control dat gegevens toont (alleen lezen) op een formulier.
Hidden
Een verborgen control bevat wel een waarde maar is niet zichtbaar op het scherm. Wordt meestal gebruikt om id’s vanuit de database op te slaan.
CheckBox
Ja/Nee keuzelijst.
Button
Knop wat het formulier valideert en vervolgens naar een ander formulier gaat (meestal een sourcecode formulier).
Password
Zelfde als een text maar de ingetikte letters worden op het scherm getoond als *
Naast deze entiteiten worden nog een aantal entiteiten onderscheiden in de dictionary zoals weblevel voor het niveau waarop een webcontrol wordt getoond en een webform. Vervolgens een weblogin dat gekoppeld is aan een weblevel. Hiermee kan men op eenvoudige wijze bepalen welke DLA Ontwerp & Software 6
Een interactie dictionary in ASP.Net
webcontrols door de ingelogde gebruikers zichtbaar worden. Een aantal entiteiten zoals webmenu en webconditie zijn wel opgenomen in de dictionary maar niet opgenomen in de afbeelding. Dit omdat de afbeelding ter illustratie van het datamodel is opgenomen, niet om een compleet beeld te geven. Zie voor een compleet beeld de voorbeeld toepassing in combinatie met WebConNext (waarover later meer). ASP.NET Form Factory Om de gegevens vanuit de interactie dictionary te kunnen vertalen naar de webapplicatie, wordt gebruik gemaakt van een formfactory. Deze factory maakt in het voorbeeld gebruik van de standaard HTML controls en javascript voor client side validatie en het gebruik van verrijkte controls zoals een kalender control en een HTML editor control (tinyMCE). Het belangrijkste onderdeel van de webapplicatie is één html pagina die ervoor zorgt dat op basis van een querystring parameter de juiste pagina gerenderd wordt. In het codevoorbeeld hieronder ziet u de opzet van deze pagina te zien.
<%@ Page Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="false" validateRequest="false" CodeFile="frmFormManager.aspx.vb" Inherits="frmFormManager" title="DLA Ontwerp & Software" %> <% Dim objFF As New DLAFormfactory.FormFactory() objFF.SetSessionElements() Response.Write(objFF.MakeForm(Request.QueryString("formid"))) %>
De pagina maakt gebruik van een master page zodat u de logica van de pagina geheel kunt scheiden van de opmaak en eventueel zelf nieuwe pagina’s kunt toevoegen gebaseerd op de master page die de opmaak bevat. Verder ziet u hoe de pagina op basis van een MakeForm function de gegevens vanuit de formfactory wegschrijft naar de pagina. Hierdoor wordt het mogelijk om de formfactory te vervangen door een andere factory zonder dat hiervoor de asp pagina’s aangepast dienen te worden. In de MakeForm functie vindt de afhandeling plaats op basis van de webformtypes zoals beschreven in de vorige paragraaf. Dit gebeurt eenvoudigweg door een select case statement dat de webformtypes verwerkt.
DLA Ontwerp & Software 7
Een interactie dictionary in ASP.Net
Function MakeForm(ByVal strFormId As String) As String Dim strStatement As String Dim objSupplier As dlasupplier Dim objPC As DlaParameterContainer Dim objDB As DLADatabase Try objDB = Me.GetConnection() strStatement = ConfigurationManager.AppSettings("sql_makeform") strStatement = strStatement.Replace("#formid#", strFormId) objDB.OpenConnection(False) objSupplier = objDB.ExecuteSupply(strStatement) objSupplier.Read() objPC = objSupplier.GetCurrentRow() objDB.CloseConnection(True) Me.strNavigateTo = objPC.GetItemValue("navigatetoformid") Me.strType = objPC.GetItemValue("formtype").ToUpper() Select Case strType Case "LIST FORM", "DETAIL FORM" Me.MakeHtmlHeader() Me.MakeHeader(objPC.GetItemValue("formtitle")) Me.MakeFormDisplay(strFormId, strType, objPC.GetItemValue("formsql")) Me.MakeHtmlFooter() Case "SOURCECODE" If Me.ValidateFormInput(strFormId) = True Then MakeFormSourcecode(strFormId, objPC.GetItemValue("formsql")) End If … End Select Return Me.objSB.ToString() Catch ex As Exception Me.ErrorList += "Bericht" & ex.Message & " " Return Me.ErrorList End Try End Function De makeform function begint met het ophalen van de gegevens vanuit de database op basis van het formid. Hierbij zorgen we ervoor dat het bijbehorende sql statement uit de web.config file komt. Wilt u zaken aanpassen, dan is dit eenvoudig door deze web.config file aan te passen. Vervolgens gebruiken we het type van de webform voor verdere afhandeling. De methoden MakeHtmlHeader, MakeHeader en MakeFooter zorgen voor een standaard afhandeling voor het aanmaken van de kop en voet van de pagina, de body van de pagina wordt op basis van het formtype aangemaakt. In het voorbeeld hieronder, is de code te zien hoe een formulier wordt opgemaakt dat de gegevens uit één of meerdere tabellen in de database weergeeft. Hierbij wordt een onderscheid gemaakt tussen een detailformulier dat de gegevens toont in de vorm van een kaart en een lijstformulier dat meerdere records in een tabel toont. In dit voorbeeld is alleen het detailformulier opgenomen.
DLA Ontwerp & Software 8
Een interactie dictionary in ASP.Net
Private Sub MakeFormDisplay(ByVal strFormid As String, ByVal strType As String, ByVal strSql As String) Dim Dim Dim Dim Dim Dim
objDB As DLADatabase objSupplier As DLASupplier blnFirst As Boolean objPC As DlaParameterContainer strValue As String intTeller As Integer
strSql = Me.ProcessSQL(strSql) objDB = Me.GetConnection() objDB.OpenConnection(False) objSupplier = objDB.ExecuteSupply(strSql) If strType = "DETAIL FORM" Then objPC = objSupplier.GetCurrentRow() objSB.Append("
") objSB.Append("
Omschr
Waarde
") intTeller = 1 While intTeller <= (objPC.GetItemCount) objSB.Append("
" & _ objPC.GetItemName(intTeller) & "
") strValue = objPC.GetItemValue(objPC.GetItemName(intTeller)) If strValue.ToUpper() = "NULL" Then strValue = " " End If objSB.Append("
" & _ strValue & "
" & vbCrLf) IntTeller = intTeller + 1 End While objSB.Append("
") Loop End If objDB.CloseConnection(True) End Sub In het voorbeeld ziet u dat er gebruik gemaakt wordt van een stringBuilder object. Deze zorgt ervoor dat op een snelle en eenvoudige manier een string opgebouwd wordt waarin de HTML code wordt opgenomen. Door deze stringbuilder aan te maken als instance variabele in elke methode of functie van de formfactory aangeroepen worden. Dit maakt het eenvoudig om de code te scheiden in verschillende subroutines terwijl men toch een complete HTML string aanmaakt. Verder wordt er gebruik gemaakt van een supplier object, deze supplier kapselt het uitlezen van de gegevens vanuit de database in, waardoor het mogelijk is om ook andere relationele databases en zelfs bestandsformaten te gebruiken. Door dit te combineren met een Parameter Collection, is het eenvoudig om op generieke wijze een formulier op te maken. Een bijkomend voordeel van de parameter collecties is dat de functie aanroepen van de verschillende functies altijd hetzelfde zijn, terwijl de parameter collectie van inhoud kan wijzigen. Hierdoor wordt het mogelijk om de verschillende SQL statements die beheerd worden in de web.config file of de dictionary te wijzigen zonder dat de source code in de formfactory hoeft te wijzigen.
DLA Ontwerp & Software 9
Een interactie dictionary in ASP.Net
In het laatste voorbeeld van de formfactory ziet u hoe een webform van het type sourcecode ervoor zorgt dat de inhoud van één of meerdere rijen in een tabel bijgewerkt worden. Hiervoor is een apart formulier gemaakt omdat het wenselijk kan zijn extra validaties uit te voeren op de ingevulde gegevens in een invulformulier. In het invulformulier kan men valideren op verplicht en op datumen numerieke waarde. Echter er zijn veelal meerdere validaties die op basis van de database inhoud kunnen gelden. Denk bijvoorbeeld aan een factuur waarbij de factuurdatum altijd voor de betaaldatum moet liggen. Bij het bijwerken van de factuur in een sourcecode formulier kunt u hierop controleren. Hiertoe is in de dictionary een extra entiteit aanwezig te weten de webcondition. Dit is een conditie die een melding teruggeeft op basis van een SQL statement dat naar de database wordt gestuurd. Private Sub MakeFormSourcecode(ByVal strForm As String, ByVal strSql As String) Dim Dim Dim Dim
objDB As DLADatabase blnOk As Boolean strSub As String strMessage As String
HTML Control builder Binnen de formfactory worden een aantal builders aangeroepen specifiek voor de interactie dictionary. Bijvoorbeeld een e-mailbuilder en een reportbuilder die zorgen voor de afhandeling van specifieke formulieren. Daarnaast is een builder ontwikkeld voor het aanmaken van webcontrols van het type HTML. Door een builder te gebruiken om de code te scheiden, is het in een later stadium mogelijk om builders te maken voor een andere type controls. Bijvoorbeeld door gebruik te maken van de ASP controls of door controls die AJAX enabled zijn. Omdat de webcontroltypes ook in de database zitten is dit eenvoudig aan te passen, beperking voor nu is wel dat men tot op heden alle controls in één builder moet plaatsen. Mogelijk dat een toekomstige versie van de formfactory hierin wel voorziet. In het onderstaande codevoorbeeld wordt een deel van de HTML controlbuilder getoond, waarbij een drietal controls zijn uitgewerkt, de rest van de controls wordt in dit artikel niet behandeld.
DLA Ontwerp & Software 10
Een interactie dictionary in ASP.Net
Private Function CreateSingleControl(ByVal strControlType As String) As String Dim strValue As String Dim objSB As New System.Text.StringBuilder() objSB.Append("" & vbCrLf & "
") Select Case strControlType.ToUpper() Case "SINGLELINEEDIT", "DATESLE", "NUMBERSLE", "CALENDARSLE" objSB.Append(Me.MakeLabel()) objSB.Append("
") If strControlType.ToUpper() = "CALENDARSLE" Then objSB.Append("") End If objSB.Append("
") … End Select Return objSB.ToString() End Function De code in het voorbeeld is redelijk recht toe recht aan, er wordt wederom gebruik gemaakt de stringbuilder class voor het beheer van de HTML string. Vervolgens wordt in de select case opties ervoor gezorgd dat er een HTML control opgebouwd wordt. Ook hierbij wordt net als in de formfactory gebruik gemaakt van parameter collections voor het zo generiek mogelijk gebruik van parameters zonder dat men aanpassingen hoeft te maken in de interface van de class bij wijzigingen in de controlbuilder. Overige factory classes De factory roept een aantal andere classes aan. Hierbij wordt gebruik gemaakt van delegates. Hiervoor is gekozen zodat op eenvoudige wijze een class, welke een specifieke functie vervult, vervangen kan worden door een andere class die dezelfde functie vervult maar gebaseerd is op een andere technologie. Zo kan een reportbuilder class die nu gebaseerd is op HTML tabellen vervangen worden door bijvoorbeeld crystal reports files. In onderstaande afbeelding ziet u hoe de classes gerelateerd zijn.
DLA Ontwerp & Software 11
Een interactie dictionary in ASP.Net
Afbeelding 5: objectmodel formfactory In de afbeelding ziet u hoe de formfactory de delegates aanroept. Hierbij wordt gebruik gemaakt van de ParameterCollection class om alle relevante parameters door te geven naar de builder classes. Voor de connectie met de database wordt de parameter collection gebruikt en zorgt de supplier class voor het retourneren van de database inhoud naar de formfactory. De supplier gebruikt weer parameter collections voor het op generieke wijze beschikbaar stellen van de inhoud van de database. Hierdoor wordt het mogelijk om in de toekomst ook andere gegevensbestanden te benaderen dan relationele databases, zonder dat er iets hoeft te wijzigen in de formfactory. Dit toont het grote voordeel van een gelaagde opzet in dictionary toepassingen.
DLA Ontwerp & Software 12
Een interactie dictionary in ASP.Net
Tools voor interactie dictionaries Doordat bij een interactie dictionary de metadata is opgeslagen in gegevensbestanden, wordt het mogelijk om het beheer van de gegevens via gebruikersvriendelijke toepassingen te beheren. Echter omdat gegevensbestanden gestructureerd van opzet zijn, is het mogelijk om een stap verder te gaan. Deze stap is het inzetten van een CASE tool. Op de website www.dla-os.nl is een CASE tool te vinden waarmee het eenvoudig is om een object model op te stellen. Vervolgens kan dit model geautomatiseerd worden geïmporteerd in de interactie dictionary. Voordeel is dat hierdoor een webapplicatie snel en goedkoop ontwikkeld kan worden. Daarnaast wordt het eenvoudiger om op basis van prototyping te gaan werken. Met deze werkwijze kunt u al direct bij de eerste ontwerpactiviteiten eindgebruikers betrekken bij de te ontwikkelen applicatie. Wilt u geen gebruik maken van een CASE tool voor het beheer van de interactie dictionary, dan is dat mogelijk. Het beheer van de dictionary kan vanuit de webinterface van de webapplicatie zelf, maar ook vanuit een beheertool DLA-ConNext. Voordeel van deze beheertool is dat er allerlei hulpmiddelen beschikbaar zijn die taken automatiseren. Daarnaast is de gebruikersinterface zo opgezet dat het zoeken en muteren van gegevens snel en efficiënt uitgevoerd wordt. In de afbeelding hieronder ziet u een schets van de toepassingen betrokken bij een interactie dictionary.
In de afbeelding is te zien hoe een beheer tool en CASE tool zorgen voor het beheren en muteren van de dictionary. Vervolgens wordt de dictionary gebruikt voor zowel een ASP.NET client en een Vulcan.Net client. Hiermee is een complete set van toepassingen beschikbaar voor het werken met interactie dictionaries.
DLA Ontwerp & Software 13
Een interactie dictionary in ASP.Net
Meer informatie Op de website www.dla-os.nl is meer informatie te vinden over zowel interactie dictionaries als het gebruik van CASE-tools. Onder de optie producten is een freeware versie te vinden van de volgende onderdelen: • • •
Naast deze software zijn een aantal artikelen aanwezig over modelleren en genereren van toepassingen en het gebruik van frameworks. Conclusie Het gebruik van een interactie dictionary maakt het mogelijk om zowel web als windows applicaties te ontwikkelen die de gegevens omtrent de gebruikers interactie uit gegevens-bestanden gebruikt. Voordeel hiervan is dat het beheer en ontwikkelen van een webapplicatie eenvoudiger wordt. Daarnaast ontstaat de mogelijkheid om webapplicaties te genereren. Met het gebruik van interactie dictionaries zijn in het verleden goede ervaringen opgedaan. Het is toegepast in webapplicaties voor cursus administraties, adresgegevens en project/uren administraties. In de toekomst kan het gebruik van interactie dictionaries uitgebreid worden. Bijvoorbeeld door het implementeren van workflow in de dictionary of door het implementeren van management informatie systemen.
Over de auteur Bert is technisch directeur van de Realisatiegroep, een consultancy bureau gericht op ICT en (jeugd)zorg. Zijn werkzaamheden liggen veelal op het raakvlak van software ontwikkeling en werkproces modellering. Bert heeft al vanaf het “Clipper” tijdperk een passie voor object oriëntatie, dictionaries en het genereren van software. Informatie over deze onderwerpen in de vorm van artikelen, tools en een weblog vindt u op: www.dla-os.nl