Antwoordmodel Eindtoets Model-driven development (T37111) Opgave 1 De volgende figuur geeft het strokendiagram (onderdeel a) en de gevraagde populatie (onderdeel b).
Opgave 2 a Zie volgende figuur. De klasse Aanmelding is een uitbreiding van het transactiedeel. De overige toegevoegde klassen zijn transactieonafhankelijk en maken deel uit van de aanbodkant. aanbod
aanbod
Studiecentrum code naam
code titel
Cyclus
Docent acroniem naam
i
DocentCyclus docent cyclus
i i
Student
Cursus
i u
studiecentrum volgnr cursus startdatum aantalBijeenkomsten
vraag
nr naam
i u
transactie i i
Inschrijving cursus student startdatum
i i
Bijeenkomst cyclus volgnr datum onderwerp
i i
Aanmeldingsstatus naam
i
transactie
Aanmelding bijeenkomst student status
-1-
i i
i
OUN
Antwoordmodel eindtoets MDD (T37111)
b Bedrijfsregel: de cursus die bij een aanmelding hoort via het pad Aanmelding-Bijeenkomst-CyclusCursus hoort tot de verzameling cursussen waarvoor de student bij een aanmelding is ingeschreven (pad Aanmelding-Student-Inschrijving-Cursus). Opgave 3 a In de beschrijving is het hiërarchiepatroon te herkennen. Informatiediagram: Kleur naam
i
Tulp naam kleur ouder op
i
*
0..1
oudertulp
Er geldt de geen-cykelconstraint: een tulp kan geen ouder of voorouder zijn van zichzelf. b Omdat een tulp nu meer genetische ouders kan hebben, is in de nieuwe beschrijving het netwerkpatroon te herkennen. In het informatiediagram van de volgende figuur wordt dat gevormd door de klassen Tulp en Afstammingsregel. Tulp naam kleur ouder op tulpKind
i
naam tulpOuder
Afstammingsregel tulpKind tulpOuder
Kleur i
TulpKleur tulp kleur
i i
i i
In het diagram is ook nog het (triviale) combinatiepatroon te herkennen (de klassen Tulp, Kleur en TulpKleur). Ook hier geldt: een tulp kan niet ouder of voorouder zijn van zichzelf (geen gerichte cykels).
-2-
OUN
Antwoordmodel eindtoets MDD (T37111)
Opgave 4 a Zie volgende figuur. Rekeningsoort Klant nr i achternaam
Een tweede oplossing volgt na onderdeel b. b Constraints: 1 als Rekening.soort.code = ‘G’, dan hoort de rekening tot de subklasse Girorekening 2 als Rekening.soort.code = ‘S’, dan hoort de rekening tot de subklasse Spaarrekening 3 als Rekening.soort.code = ‘K’, dan hoort de rekening tot de subklasse Kredietrekening 4 een spaarrekening heeft alleen een plusrente 5 een kredietrekening heeft alleen een minrente 6 een girorekening heeft zowel een plusrente als een minrente 7 een klant bij een spaarrekening is dezelfde klant als de klant bij de girorekening bij de spaarrekening 8 een klant bij een kredietrekening is dezelfde klant als de klant bij de girorekening bij de kredietrekening. De constraints 7 en 8 kunnen worden vermeden door klanten alleen aan een girorekening te koppelen. Dit geeft de volgende oplossing voor onderdeel a:
Opgave 5 a Met een uniciteitsrestrictie op de combinatie client, datum van de klasse Bezoek kunnen we dit realiseren. b In de CIL-code moet een afterInsert event gedefinieerd worden. De naam van de event handler is vrij te kiezen; we noemen deze SetInit: Version = 4 Dataset afterInsert = SetInit End
De OP-code luidt: procedure SetInit; begin FieldByName('status').AsString := 'I'; FieldByName('totaal').AsFloat := 0.0; FieldByName('datum').AsDateTime := date; end;
c De gevraagde OCL-code luidt: Context Bezoek Inv: Aanvraag.client = client
d Het gaat om een rejector. Realisatie door een beforePost event, bij voorkeur op dataset Bezoek. Noemen we de event handler CheckBezoek, dan luidt de CIL-code: Version = 4 Dataset beforePost = CheckBezoek End
De OP-code luidt: procedure CheckBezoek; var qry: TcQuery; begin qry := CreateQry('select * from Aanvraag A '); qry.SQL.Add('where A.nr = :a and A.client = :c'); qry.ParamByName('a').AsInteger := FieldByName('aanvraag').AsInteger; qry.ParamByName('c').AsInteger := FieldByName('client').AsInteger; qry.Execute; if qry.EOF then EUsr('De Aanvraag heeft niet de juiste client'); qry.Free; end;
-5-
OUN
Antwoordmodel eindtoets MDD (T37111)
e Procedure SetBedrag: procedure SetBedrag; var qry: TcQuery; begin qry := createQry('select uurbedrag from Tariefgroep T '); qry.SQL.Add('join Contactpersoon C on T.nr= C.tariefgroep '); qry.SQL.Add('where C.nr = :c'); qry.ParamByName('c').AsInteger := FieldByName('contactpersoon').AsInteger; qry.Execute; FieldByName('bedrag').AsFloat := FieldByName('aantalUur').AsInteger * qry['uurbedrag'].AsFloat; qry.Free; end;
f Totaal uitrekenen bij afterPost. Immers, pas na een post bevat de database de gegevens van het nieuwe bezoek. g Procedure SetTotaal: procedure SetTotaal; var qry: TcQuery; begin qry := createQry('update Aanvraag set totaal = '); qry.SQL.Add('(select sum(bedrag) from Bezoek B where aanvraag = :a) where nr = :a'); qry.ParamByName('a').AsInteger := FieldByName('aanvraag').AsInteger; qry.Execute; qry.Free; end;
h Door middel van displayrules in de Modeler kunnen we de weergave van client, contactpersoon en aanvraag wijzigen. Bedrag read-only maken doen we via de CIL-code van het formulier.