[Access] Rooster maken

Pagina: 1
Acties:
  • 1.061 views sinds 30-01-2008
  • Reageer

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Ik ben er over aan het denken om een rooster systeem te maken in Access.

Het volgende moet daar in komen:

- Er moet 1 basis rooster komen, wat beschrijft wanneer iedereen standaard werkt in een normale werkweek en op welke afdeling.
- Verder moet er de mogelijkheid zijn om korte termijn veranderingen door te voeren, zoals verlof, ziekte, op een andere dag werken etc.

Het basisrooster in een tabel zetten is niet moeilijk
tabel rooster
-id
-naam
-dag (maandag, dinsdag etc)
-starttijd
-eindtijd
-afdeling

Maar hoe kan ik nu het beste die roosterwijzigingen bijhouden, en dan op zo'n manier dat ik heel makkelijk die twee tabellen kan samenvoegen met een mooie query om tot een weekrooster te komen die uitgaat van het standaardrooster, en daarin alle roosterwijzigingen meeneemt??

Verwijderd

een 2e tabel (wijzigingen) toevoegen.
Een query maken die ,indien er wijzigingen zijn ,deze laat zien ipv de gangbare tabel.

Simpelste is om een schaduwtabel te gebruiken (identiek aan huidige tabel) en daar alle wijzigingen in te stoppen. En de niet-wijzigingen op null te zetten.

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Stel nu dat ik een tweede identieke tabel maak.
Met wat voor soort query kan ik er dan voor zorgen dat hij een waarde pakt uit de standaardtabel, tenzij er voor diezelfde dag een wijziging is in tabel2, dan moet die waarde gekozen worden?

Verwijderd

Beter 1 roostertabel en 1 mutatietabel te maken. Mutaties moeten dan altijd het ID van het gewone roosterrecord in hun sleutel hebben. Dan maak je een query die rooster-tabel left joint aan het roosterID in de mutatietabel. Dan komt het leukste: als veld voeg je alleen het roosterID (uit de roostertabel!) aan de query toe, de rest van de velden moet je berekenen. Dat doe je met behulp van het Iif statement. Je moet checken of RoosterID in je mutatietabel Null is. Zo ja, dan moet je het veld uit de roostertabel tonen. Anders moet je het veld uit de mutatietabel tonen.

Succes!

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Ik krijg Iif niet werkend in Access (XP, maar moet ook in 97 werken). Ik heb ook de hele Access Search doorgespit maaar Iif is nergens te vinden.
Volgens wat posts op de search hier moet het wel kunnen maar ik krijg zelfs een simpele query als dit niet voor elkaar:
code:
1
SELECT IIf(amount>0;0;amount) AS debet, IIf(amount>0;amount;0) AS CREDIT FROM table;

Iemand een idee hoe je dat doet in Access. Ik maak nu trouwens handmatig een query in Access zelf, dus niet in vba.

Verwijderd

1. in je voorbeeld heb je bij debet en credit hetzelde staan, dus logisch dat het niet werkt zoals je verwacht
2. als ik in de access 97 help iif zoek vind 'ie 32 onderwerpen
3. als ik in de MSDN zoek krijg ik direct 100 resultaten (waarvan de 1e al goed is)

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Ik zie al wat ik verkeerd deed. Ik gebruikte ; tussen de verschillende statements ipv een komma. |:(

Overigens die query die ik als voorbeeld gaf, werkt wel perfect. Die geeft mooi in de 1ste kolom een bedrag als het een negatief getal is, en in de tweede een 0. En als het een positief getal is precies omgekeerd. Dus het is niet zo'n hele gekke query...

Verwijderd

Sorry, je hebt gelijk. Ik zat te :Z

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 10:36
Ik ben voor een schoolopdracht bezig met een bijna identieke opdracht, waarbij verlof- en ziektegegevens van medewerkers kunnen worden bijgehouden. Hiervoor maak ik gebruik van de volgende tabellen:

- Medewerker
- Afdeling
- Contract
- Absentie-generiek (Voor alle medewerkers: Feestdagen, Collectief ADV)
- Absentie-specifiek (Persoonlijke absentie: Verlof, ziekte)

Ik denk dat als je deze tabellen aanhoudt, je een heel eind kunt komen met je systeempje.

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Ik ben al een stuk verder.

Ik heb nu twee tabellen:
RoosterBasis
-id
-naam
-dag
-rostart
-roeind

RoosterMutatie
-id
-basisid
-rmstart
-rmeind
-datum

Met de query:
code:
1
2
SELECT naam, iif(roostermutaties.id = null, roStart, rmStart) As Starttime, iif(roostermutaties.roid = null, roEind, rmEind) As Endtime
FROM RoosterBasis LEFT JOIN RoosterMutaties ON RoosterBasis.id = roosterMutaties.id

krijg ik een goed rooster met de wijziging daarin opgenomen.

Maar...nu wil ik een rooster per week uitdraaien:
daarom heb ik het volgende toegevoegd aan de query:
code:
1
WHERE DatePart("ww", [Datum], 2, 2) = 12 and DatePart("yyyy", [Datum], 2, 2) = 2002;

Als ik dat doe krijg ik keurig een rooster terug, maar alleen van de roosterwijzigingen.

Waarschijnlijk omdat bij geen roosterwijzigingen de datum niet niet bestaat, maar ik dacht dat je bij een left join altijd de records van de linkse tabel terugkreeg, ongeacht of een record bestaat in de rechtse tabel.

(even voor de duidelijkheid: in het basisrooster staat een rooster per dag (dus bijv. maandag) en in het mutatierooster echt met een specifieke datum dat de mutatie van toepassing is)

Wat doe ik fout??

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Je where wordt uitgevoerd nadat de outer join is geweest.
Van deze verzameling wil je alleen de record met een datum, dus ja je krijgt alleen de wijzigingen.
Om dit te voorkomen moet je om je conditie een iif conditie zetten:
code:
1
iif([datum]=null,12,DatePart("ww", [Datum], 2, 2))=12

Die 2 keer 12 vervang je dus door een parameter.
Snappie?

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Bedenk wel dat in jouw oplossing bij ziekte van iemand elke uur dat in het rooster stond in de schaduwtabel moet worden opgenomen als ziekte. Anders klopt je relatie niet meer.
Eigenlijk is het een n:m relatie die je had moeten verzelfstandigen. Een vakantie wil je als 1 interval opgeven niet voor elke dag een vrije dag

  • Boss
  • Registratie: September 1999
  • Laatst online: 08-09 17:20

Boss

+1 Overgewaardeerd

Even offtopic, maar weet iemand hoe je zo een rooster in Access mooi kan weergeven? Iets met een soort time-table of a-la Outlook kalender?

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Thanx Goodielover! Jouw oplossing werkt perfect! :)
Even over je opmerking over de opzet van de database, op welke manier kan ik dit anders implementeren.
Het lijkt me inderdaad beter dat je een vakantie in 1x in kan voeren, maar ik heb geen idee hoe ik dat doe.
Ik ga maar eens proberen of ik daar wat meer over kan vinden, maar als je me nog iets verder op weg kan helpen: graag !

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

ipv basisid opnemen in wijziging, maak je een aparte tabel
basis_id,wijziging_id
Bij het invoeren van een wijziging leg je de relatie naar basis vast in deze tabel. Dus elke wijziging heeft consequenties voor 1 of meerdere basis roosterafspraken.
Ik zit me trouwens wel net te bedenken dat een outerjoin dan wel lastig wordt en een vakantie die over meerdere weken gaat helemaal. Maar dat laatste is volgens mij nu ook al een probleem voor je.

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Nu kan ik toch voor elke dag dat iemand normaal zou moeten werken tijdens een verlof periode, een mutatie aanmaken.
oke, is op zich wel veel werk als je dat handmatig moet doen, maar softwarematig kan ik daar wel iets op vinden.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Ga maar eens naar een maand met de mutaties van de vorige of komende maand ook in de DB. Dan zal je zien dat je rooster gaten gaat laten zien op de tijden dat er in een andere periode wijzigingen zijn ingevoerd.
Dit komt omdat de outer join wel records vindt om mee te joinen en je where clause ze er doodleuk uit filtert.
Probeer maar eens

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Klopt daar kwam ik ook net achter.

Maar nu heb ik een geweldige query !!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT usNTname, 
IIF(roostermutaties.roid = null, roStartTime, 
   IIF(DatePart("ww", [rmDatum], 2, 2) = Welkeweek 
    AND DatePart("yyyy", [rmDatum], 2, 2) = Welkjaar, rmStarttime, roStarttime)) AS Starttime, 
IIF(roostermutaties.roid = null, roEndTime, 
   IIF(DatePart("ww", [rmDatum], 2, 2) = Welkeweek 
    AND DatePart("yyyy", [rmDatum], 2, 2) = Welkjaar, rmEndtime, roEndtime)) AS Endtime

FROM RoosterBasis LEFT JOIN RoosterMutaties ON RoosterBasis.roid = roosterMutaties.roid

WHERE IIF(rmdatumoud=null, Welkeweek, 
IIF(DatePart("ww", [rmDatum], 2, 2) = Welkeweek, DatePart("ww", [rmDatum], 2, 2) = Welkeweek, Welkeweek)) 

AND IIF(rmdatumoud=null, Welkjaar, 
IIF(DatePart("yyyy", [rmDatum], 2, 2) = Welkjaar, DatePart("yyyy", [rmDatum], 2, 2) = Welkjaar, Welkjaar));

Alle namen die met ro beginnen komen uit het basisrooster en rm komt uit de schaduw tabel.

Deze query werkt perfect! :P
Hij is alleen wel erg ingewikkeld geworden, en ik vraag me dus af of het allemaal niet simpeler kan, als ik mijn tabel ontwerp verander.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Als je hiermee echt iets anders wil kom je snel op een tabel met het rooster. Dus een tabel met als inhoud de dagen en tijden in je rooster. Hier zit dan dus geen afspraak in, maar in feite alleen de dagen en tijden.
Deze tabel kan je dan gebruiken om te joinen met de default afspraken en de specifieke afspraken. Je zult zien at het dan allemaal veel makkelijker gaat
Pagina: 1