Het toepassen van een gelaagde architectuur Bijlagen Bert Dingemans www.via-nova-architectura.org August 2007 1
Bijlage 1: SQL-script als voorbeeld CREATE TABLE EXEMPLAAR ( aanschafdatum DateTime, druk Char( 50), exemplaarid Integer NOT NULL CONSTRAINT exemplaar PRIMARY KEY, rolstatus Char( 10), status Char( 2) NOT NULL, titelid Integer NOT NULL, deletedmark Integer ) CREATE TABLE LID ( aantal_reserveringen Integer, aantal_uitleningen Integer, actuele_reserveringen Integer, actuele_uitleningen Integer*, adres Char( 25) NOT NULL, geboortedatum DateTime, inschrijfdatum DateTime, lidid Integer NOT NULL CONSTRAINT lid PRIMARY KEY, naam Char( 25) NOT NULL, status Char( 2) NOT NULL, telefoon Char( 20), woonplaats Char( 25) NOT NULL, deletedmark Integer ) CREATE TABLE RESERVERING ( lidid Integer NOT NULL, reserveerdatum DateTime, resid Integer NOT NULL CONSTRAINT reservering PRIMARY KEY, status Char( 2) NOT NULL, titelid Integer NOT NULL, deletedmark Integer ) CREATE TABLE TITEL ( aantal_reserveringen Integer, aantal_uitleningen Integer, actuele_reserveringen Integer, actuele_uitleningen Integer, categorie Char( 10) www.via-nova-architectura.org August 2007 2
, isbn Char( 15), naamtitel Char( 99) NOT NULL, status Char( 2) NOT NULL, statusrol Char( 10), titelid Integer NOT NULL CONSTRAINT titel PRIMARY KEY, deletedmark Integer ) CREATE TABLE UITLENING ( aantalverlengingen Integer, exemplaarid Integer NOT NULL, inleverdatum DateTime, lidid Integer NOT NULL, status Char( 2) NOT NULL, uitleendatum DateTime, uitleningid Integer NOT NULL CONSTRAINT uitlening PRIMARY KEY, verwinleverdatum DateTime, deletedmark Integer ) ALTER Table EXEMPLAAR ADD constraint exemplaar_titel_fk FOREIGN KEY (titelid) REFERENCES TITEL (titelid) ALTER Table RESERVERING ADD constraint reservering_lid_fk FOREIGN KEY (lidid) REFERENCES LID (lidid) ALTER Table RESERVERING ADD constraint reservering_titel_fk FOREIGN KEY (titelid) REFERENCES TITEL (titelid) ALTER Table UITLENING ADD constraint uitlening_lid_fk FOREIGN KEY (lidid) REFERENCES LID (lidid) www.via-nova-architectura.org August 2007 3
Bijlage 2: Sourcecode MS-Access Private Sub Form_Open(Cancel As Integer) Set objservice = ServicesLayer objservice.fillctrlgeef_leden lidid objservice.fillctrlgeef_titels titelid Private Sub OkPB_Click() If objservice.executeevent("uitlenen_na_reserveren", Me.Controls) = True Then DoCmd.Close Sub FillCtrlGeef_Leden(objCtrl As Control) objctrl.rowsource = Geef_Leden objctrl.boundcolumn = 1 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 Function Geef_Titels() As Recordset Dim strsql As String Dim objrs As Recordset strsql = "SELECT TITEL.titelid, TITEL.naamtitel, TITEL.isbn FROM TITEL WHERE TITEL.deletedmark=0 " www.via-nova-architectura.org August 2007 4
Set objrs = objcon.getrecordset(strsql) Set Geef_Titels = objrs 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 Function Uitlenen_na_reserveren(objControls As Controls) As Boolean Dim blnretvalue As Boolean Dim objwrk As Workspace Set objwrk = DBEngine.Workspaces(0) objwrk.begintrans blnretvalue = (objexemplaar.uitlenen_na_reserveren(objcontrols) And _ objtitel.uitlenen_na_reserveren(objcontrols) And _ objlid.uitlenen_na_reserveren(objcontrols) And _ www.via-nova-architectura.org August 2007 5
objreservering.uitlenen_na_reserveren(objcontrols) And _ objuitlening.uitlenen_na_reserveren(objcontrols)) If blnretvalue = False Then objwrk.rollback Else objwrk.committrans Set objwrk = Nothing Uitlenen_na_reserveren = blnretvalue uitlening object Function Uitlenen_na_reserveren(objControls As Controls) As Boolean Dim blnretvalue As Boolean Dim strsql As String Dim strstatus As String Dim 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 strcurrentstatus = GetCurrentStatus(strTable, stridentifier, objcontrols(stridentifier)) If strcurrentstatus <> "Null" Then MsgBox "Uitlening bestaat al" Uitlenen_na_reserveren = False Exit Function strsql = "INSERT INTO UITLENING" www.via-nova-architectura.org August 2007 6
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 Dim blnretvalue As Boolean Dim strsql As String Dim strstatus As String Dim strcurrentstatus As String strstatus = "RU" blnretvalue = DefaultValidation(objControls) If blnretvalue = False Then Uitlenen_na_reserveren = blnretvalue Exit Function strcurrentstatus = GetCurrentStatus(strTable, stridentifier, objcontrols(stridentifier)) If strcurrentstatus <> "RA" Then MsgBox "Reservering bestaat niet" Uitlenen_reserveren = False Exit Function strsql = "UPDATE RESERVERING" strsql = strsql & " SET deletedmark= 1, status= " & Set2SQL(strStatus) & " " strsql = strsql & " WHERE " & stridentifier & "= " & Set2SQL(objControls(strIdentifier)) www.via-nova-architectura.org August 2007 7
ExecuteSQL strsql Uitlenen_na_reserveren = blnretvalue 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 Private Sub Form_Load() Set objservice = New ServicesLayer cmdok.enabled = False 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 Private Sub lidid_change() www.via-nova-architectura.org August 2007 8
With uitleningid Set.RowSource = objservice.geef_uitlening_bij_lid(lidid.boundtext).boundcolumn = "uitleningid".listfield = "naamtitel" End With Private Sub cmdok_click() If objservice.executeevent("verlengen", objrs) Then Unload Me Else MsgBox GetErrorMessage() Function Verlengen(objRS As Recordset) As Boolean Dim blnretvalue As Boolean objcon.begintrans blnretvalue = (objexemplaar.verlengen(objrs) And objtitel.verlengen(objrs) And objlid.verlengen(objrs) And objuitlening.verlengen(objrs)) If blnretvalue = False Then Else objcon.rollbacktrans objcon.committrans Verlengen = blnretvalue Function Verlengen(objRS As Recordset) As Boolean Dim blnretvalue As Boolean Dim strsql As String Dim strstatus As String Dim strcurrentstatus As String www.via-nova-architectura.org August 2007 9
strcurrentstatus = objcon.getcurrentstatus(strtable, stridentifier, objrs.fields(stridentifier)) strstatus = strcurrentstatus blnretvalue = DefaultValidation(objRS) If blnretvalue = False Then Verlengen = blnretvalue Exit Function 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 www.via-nova-architectura.org August 2007 10
Bijlage 3: Sourcecode Active Server Pages 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 Sub BeginTrans() blnbegintrans = True blntransactionset = False Sub CommitTrans() If blntransactionset = True Then objadoconnection.committrans blnbegintrans = False Function ExecuteSQL(strSQL As String) As Boolean strsql = strsql + ";" MsgBox strsql If blnbegintrans = True Then objadoconnection.begintrans blntransactionset = True blnbegintrans = False www.via-nova-architectura.org August 2007 11
objadoconnection.execute strsql ExecuteSQL = True sourcecode uitleenformulier Function KillConnection() ObjAdoConnection.Close Set objadoconnection = Nothing KillConnection = True <HTML> <link REL="stylesheet" TYPE="text/css" href="biebcase.css"> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> <TITLE></TITLE> </HEAD> <BODY> <% dim objbiebcase dim objrs set objbiebcase = Server.CreateObject("Biebcase.Serviceslayer") objbiebcase.makeconnection "", "" %> <FORM action="uitlenen.asp" id=form1 method=post name=form1> <H1 align=center>uitlenen</h1> <P> <TABLE> <tr> <td>lid</td> <td><select name="lidid" size="1" id="lidid" style="height: 22px; WIDTH: 158px"> www.via-nova-architectura.org August 2007 12
<% set objrs = objbiebcase.geef_leden While not objrs.eof Ressponse.Write("<option value=" & chr(34) & _ objrs.fields("lidid") & chr(34) & _ ">" & objrs.fields("naam") & "</option>") objrs.movenext() Wend set objrs = Nothing %> </select> </td> </tr> <tr> <td>exemplaar</td> <td><select name="exemplaarid" size="1" id="exemplaarid" style="height: 22px; WIDTH: 300px"> <% set objrs = objbiebcase.geef_actieve_exemplaren("ei") While not objrs.eof Response.Write("<option value=" & chr(34) & _ objrs.fields("exemplaarid") & _ chr(34) & ">" & objrs.fields("exemplaartitel") & _ "</option>") objrs.movenext() Wend set objrs = Nothing %> </select> </td> </tr>.. </TABLE></P> <% objbiebcase.killconnection set objbiebcase = nothing %> <P> </P></FORM> </BODY> </HTML> www.via-nova-architectura.org August 2007 13
ASP-hulp procedure <%@ Language=VBScript %> <!--#INCLUDE FILE="funclib.asp" --> <% dim objbiebcase dim objrs dim objrshlp dim lidid dim 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) 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 %> www.via-nova-architectura.org August 2007 14