Je vindt me ook op

De interface van de database toepassing ‘Studieadviseur’: agenda-functie

teaser

De interface van de database toepassing ‘Studieadviseur’: agenda-functie

Dit is aflevering 2 van de serie ‘Database toepassing voor Studieadviseur’. In deze aflevering staat de agenda-functie centraal:

  • welke queries doen het werk?;
  • hoe doen ze dat?;
  • hoe ziet het resultaat er uit in de gebruiker-interface?

In aflevering 1 stond de vraag centraal ‘waarom een database toepassing en aan welke eisen moet die voldoen?’ Aflevering 1 vind je in de blogpost Studieadviseur moet veel contacten managen.
In aflevering 3 staat de interface centraal die gebruikt wordt voor de kerntaken die je met deze toepassing wilt uitvoeren: het registreren van gesprekken De interface van de database toepassing ‘Studieadviseur’: registratie van gesprekken..

De agenda-functie verzamelt twee typen informatie:
1. hoeveel en welke afspraken staan er gepland voor de toekomst (= minimaal één dag na ‘vandaag’)?
2. hoeveel en welke acties staan nog open (= moet nog iets aan gedaan worden)?

AFB. 1. de agendafunctie (detail van het openingsmenu)

1. toekomstige afspraken

– uit de tabellen ‘contactpersonen’ en ‘gesprekken’ is een selectiequery gemaakt die gespreksgegevens verzamelt van gesprekken, waarbij de gespreksdatum na vandaag ligt;
– complicatie: in elke gespreks-record kán een vervolgafspraak gepland worden die inmiddels verleden tijd is, maar ook nog ‘na vandaag’ ligt;
– dus: de query moet de relevante gegevens (datum, tijd, onderwerp, met wie) verzamelen uit die gespreksrecords waarin óf de gespreksdatum na vandaag ligt, óf de vervolgdatum na vandaag ligt, of beide datums na vandaag liggen.

1. De selectie-query die de afspraken ‘na nu’ verzamelt is de volgende:

SELECT DISTINCT Gesprekken.DatumGesprek, Gesprekken.Onderwerp, Gesprekken.ContactpersoonId
FROM Gesprekken
WHERE (((Gesprekken.DatumGesprek)>Now()))
ORDER BY Gesprekken.DatumGesprek;

2. de selectie-query die de vervolgafspraken ‘na nu’ verzamelt is de volgende:

SELECT DISTINCT Gesprekken.DatumVervolg, Gesprekken.OnderwerpVervolg, Gesprekken.ContactpersoonId
FROM Gesprekken
WHERE (((Gesprekken.DatumVervolg)>Now()));

– Dat levert bij het tellen van de toekomstige afspraken een complicatie op. Want één record bevat één gesprek, maar daarin kunnen twee datums in de toekomst liggen: die van het gesprek zelf en van de vervolgafspraak. Dus de query die het aantal toekomstige afspraken moet tellen voldoet niet als die gespreksrecords telt.

Daarom zijn er ook twee totalen-queries gemaakt:
1. de totalen-query die de afspraken ‘na nu’ telt is de volgende:

SELECT Count(afsspraak_na_nu.DatumGesprek) AS AantalVanDatumGesprek
FROM afsspraak_na_nu;

2. de totalen-query die de vervolgafspraken ‘na nu’ telt is de volgende:

SELECT Count(afsspraak_vervolg_na_nu.DatumVervolg) AS AantalVanDatumVervolg
FROM afsspraak_vervolg_na_nu;

Als je op de knop klikt krijg je in een soort pop-up formulier een keurig overzicht van de toekomstige afspraken.
Omdat een record van een gesprek waarin een toekomstige vervolgafspraak gepland staat moet worden weergegeven, terwijl we daarbij ook de afspraakdatum zien die vóór vandaag ligt, werken we met geel als markeringskleur voor toekomstige afspraken.

AFB. 2. Twee gespreks-records met in totaal 3 toekomstige afspraken

(Je kunt aan een veld een voorwaardelijke opmaak meegeven. Hier is gekozen voor ‘achtergrondkleur = geel’, met als voorwaarde ‘waarde van veld is groter dan Now()’)
Als je in dit formulier op de knop met het potloodje klikt kom je in het formulier met de detailgegevens van dit gesprek.

2. Te ondernemen acties

In het openingsmenu zagen we ook dat er drie acties nog niet voltooid zijn, en dus aandacht verdienen (afb. 3):

AFB. 4. Onder de te ondernemen actie staat een vinkje ten teken dat deze actie nog niet is voltooid

De selectie-query verzamelt alle ‘te ondernemen acties’ waarbij het veld ‘nog niet voltooid’ is aangevinkt. Deze query is de volgende:

SELECT Contactpersonen.ContactpersoonId, Gesprekken.GesprekId, Contactpersonen.Voornaam, Contactpersonen.Achternaam, Contactpersonen.Tussenvoegsel, Contactpersonen.Studentnummer, Gesprekken.Actie, Gesprekken.Begintijd, Gesprekken.DatumGesprek, Gesprekken.Onderwerp, Gesprekken.ActieNietVoltooid
FROM Contactpersonen INNER JOIN Gesprekken ON Contactpersonen.ContactpersoonId = Gesprekken.ContactpersoonId
WHERE (((Gesprekken.ActieNietVoltooid)=-1))
ORDER BY Contactpersonen.Achternaam;

SELECT Contactpersonen.ContactpersoonId, Gesprekken.GesprekId, Contactpersonen.Voornaam,
Contactpersonen.Achternaam, Contactpersonen.Tussenvoegsel, Contactpersonen.Studentnummer,
Gesprekken.Actie, Gesprekken.Begintijd, Gesprekken.DatumGesprek, Gesprekken.Onderwerp,
Gesprekken.ActieNietVoltooid
FROM Contactpersonen INNER JOIN Gesprekken ON Contactpersonen.ContactpersoonId =
Gesprekken.ContactpersoonId
WHERE (((Gesprekken.ActieNietVoltooid)=-1))
ORDER BY Contactpersonen.Achternaam;

Deze query maakt gebruik van twee tabellen ‘contactpersonen’ en ‘gesprekken’. Eerst worden de gespreksrecords geselecteerd die de markering ‘nog niet voltooid’ aan hebben staan. Er is een koppeling gemaakt (‘INNER-JOIN’) met de tabel ‘contactpersonen’. Deze koppeling zorgt ervoor dat uit de contactpersonentabel alleen die contactpersonen met hun kenmeken geselecteerd worden van wie de Id gelijk is aan de contactpersoonId in de gesprekkentabel : INNER JOIN Gesprekken ON Contactpersonen.ContactpersoonId = Gesprekken.ContactpersoonId

In de ‘wizard’ waarmee de query gemaakt kan worden is bovenstaande query goed zichtbaar (Afb. 5):

AFB. 5. De twee tabellen met de INNER-JOIN van de twee contactpersoonId velden

Deze query zorgt ervoor dat een formulier verschijnt met de door bovenstaande query verzamelde gegevens (Afb. 6a).

AFB. 6a. De drie te ondernemen acties (geanonimiseerd)

Door op de knop met bel te klikken (zie Afb. 6b) verschijnt het formulier van Afb. 6a.

AFB. 6b. Het resultaat van de totalen-query

De totalen-query gaat gebruikt bovenstaande selectiequery en telt de bedoelde te ondernemen acties op:
SELECT Count([ActiesNietVoltooid Query].ContactpersoonId) AS AantalVanContactpersoonId1, Count([ActiesNietVoltooid Query].GesprekId) AS AantalVanGesprekId, Count([ActiesNietVoltooid Query].GesprekId) AS AantalVanGesprekId1
FROM [ActiesNietVoltooid Query];

En in Afb. 6a staat bij elke record ook een knop met bel; door daar op te klikken worden de gespreksdetails (zie Afb. 4) van de betreffende contactpersoon getoond.

Je kan naar dit artikel verwijzen op sociale netwerken:
About Author

Rob le PairDocent - onderzoeker Radboud Universiteit Nijmegen; favoriete thema's op deze site: Persuasive communication, Eindhoven-Philipsdorp, WordPress-design, gebruik van sociale media, running experiences, gardening.View all posts by Rob le Pair →

Leave a Reply