Database ordertijden juist weergeven

  • Onderwerp starter Onderwerp starter rct
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

rct

Gebruiker
Lid geworden
15 jun 2015
Berichten
22
Goedenavond,

Ik ben bezig met het maken van een database met orders en de afhandeltijd van de orders. Dit wil ik doen om de gemiddelde drukte op het uur van de dag in kaart te brengen. Bijvoorbeeld een order is om 12:00 begonnen en om 18:00 afgehandeld. Dan betekent dit dat de order om 12:00 actief was, maar ook om 13:00, 14:00, etc. Ik heb op het moment wel een begintijd en een eindtijd, maar ik weet niet zo goed hoe ik ze in moet voeren zodat mijn database de doorlooptijd van de order kan "zien". Mijn idee was namelijk om bijvoorbeeld een invul query te maken waar je een tijd invoert om zodoende te kunnen zien hoeveel van de orders er op een specifiek tijdstip aanwezig geweest zijn. Ik heb al een beetje ervaring met databases en dacht dat het misschien lag aan het vinden van een juist invoermasker. Mijn vraag is of iemand hier misschien een idee over heeft. Ik snap het als het misschien een beetje vaag klinkt allemaal, dus vraag gerust om toelichting.
Bedankt alvast,

Rct
 
Laatst bewerkt:
Je idee is me nog niet helemaal duidelijk.

Dus misschien zeg ik nu dingen die je zelf ook al had bedacht.

De doorlooptijd van een order is : eindtijd -begintijd.

Alle op dit moment actieve orders zijn : eindtijd is null

Alle orders die op een bepaald moment actief zijn : bepaald moment > begin tijd en bepaald moment < eind tijd. (of iets met een between functie)

Is dit de info die je zoekt?
 
Het gaat om orders over het jaar 2014 die al afgerond zijn. Ik zal een voorbeeld geven om uit te leggen wat ik bedoel. Stel er zijn een aantal orders:

Order 1 12:00-19:00
Order 2 11:00-14:10

Order 1 was bijvoorbeeld om 12:00 in behandeling maar ook om 13:00, 14:00, etc. Order 2 was om 11:00 in behandeling maar ook om 11:00, 12:00, 13:00, 14:00. Het gaat er mij om dat ik op de een of andere manier de orders kan filteren op tijdstip van aanwezigheid. Dus dat de database ook als het ware ziet order 1 er ook was om 15:09 of 16:13. Op deze manier kan ik bijvoorbeeld een query maken zodat ik uit alle orders, het zijn er 4300 in totaal, kan opmaken op welke tijdstippen een order actief is geweest.
Dus ik kan kijken welke van de 4300 orders om 12:00 actief waren en welke om 13:00 bijvoorbeeld zodat ik per tijdstip over een jaar gezien het gemiddelde aantal orders op dat tijdstip kan zien.
 
Ik snap gelukkig precies wat je bedoelt, en heb wellicht ook wel een oplossing waar je wat mee kunt. Daarbij maakt het niet uit of je een order al hebt afgesloten of niet, want in het laatste geval heb je nog geen eindtijd, maar neem je dan de huidige tijd als vergelijkingswaarde. Die loopt dan uiteraard netjes mee als je de query later nog een keer uitvoert.

Wat jij wilt kan in beginsel niet in Access; je hebt een begintijd en een (al dan niet reële) eindtijd, en de tijd ertussenin kun je moeilijk 'pakken' in een query. Overigens bestaat er in Access geen 'invulquery', maar ik vermoed dat je een selectiequery bedoelt met invulparameters voor de begin- en eindtijd. Die invulparameters zou ik van een formulier afhalen, want anders zadel je de gebruiker op met het vinden van de juiste manier om de tijd in te voeren. Doen ze dat niet correct, dan werkt de query niet. En dat is niet erg gebruiksvriendelijk.
Hoe kun je een order toch laten zien als die om 14:12 nog in bewerking is, als je als begintijd 12:00 hebt ingevuld en als eindtijd 19:00? Daarvoor heb je om te beginnen een aparte tabel nodig waarin je alle tijdsblokken vastlegt. In die tabel bepaal je de nauwkeurigheid waarmee je de overzichten wilt maken. Als je de orders per uur wilt monitoren, dan leg je de uren zo vast:
Begintijd - Eindtijd
7:00:01 - 8:00:00
8:00:01 - 8:00:00
9:00:01 - 10:00:00
ect.
Wil je de gegevens per kwartier zien, dan moeten de tijdsblokken ook per kwartier zijn. Dus zoiets:
Begintijd - Eindtijd
7:00:01 - 7:15:00
7:15:01 - 7:30:00
7:30:01 - 7:45:00
ect.

Als je die tabel hebt gemaakt, kun je m.b.v. die tabel een Cartesisch product query maken die de tijden filtert. Je ziet dan per order voor elk tijdsblok waarin de order loopt een record. In jouw voorbeeld zou je bij Order 1, als je met uren werkt, dus 7 records zien en bij Order 2 4 records. Op basis van die query kun je dan een Kruistabel query maken die de records telt, en dat is dan je overzicht. Daar kun je dan weer een grafiek van maken zodat je grafisch kunt zien waar de pieken liggen.
Het principe van deze constructie heb ik in de bijlage uitgewerkt, want deze vraag is natuurlijk al eerder aan bod geweest :).
Het gaat om de queries qBloktijden en qBloktijden_2, die met 2 verschillende urentabellen werken zodat je kunt zien wat zo'n bloktabel nu eigenlijk doet.
 

Bijlagen

Heel erg bedankt voor je reactie! Ik ga proberen of het me lukt
 
Ik dacht dat ik het snapte maar ik kom er toch niet uit. Als ik naar je database kijk die je hebt gestuurd ziet het er logisch uit maar ik krijg het niet voor elkaar om na te maken. Ik heb een tabel gemaakt met bloktijden, maar verder kom ik niet. Zou je me het misschien nog een keer uit kunnen leggen?
 
Geen probleem :). Een cartesisch product is eigenlijk een ongewenste variant van een query; het is een query waarin je gegevens laat zien uit tabellen die niet aan elkaar gekoppeld zijn. En op dat moment kan Access er niet zoveel mee, want eigenlijk wil je in een query gegevens uit tabel A zien die ook in tabel B staan. En die vind je meestal door het koppelveld. Dus alle orders van Klant A koppel je op basis van het KlantID. Doe je dat niet, dan kan Access de orders van Klant A niet zomaar uitfilteren. Wat er dan gebeurt is heel simpel: Access pakt het eerste record van Tabel A en koppelt die aan alle records uit Tabel B. Staan daar 100 records in, dan heb je dus, op basis van één klant, al 100 records in de query staan. En dat gebeurt ook bij het tweede record, dus dan heb je al 200 records. Bij een koppeling zou je van klant A, die 5 orders heeft, maar 5 records zien en van klant B met 3 orders maar 3 records, in totaal dus 8 records. Doordat je alle records ziet, zitten de correcte daar uiteraard wel tussen! Ook zonder gekoppelde tabellen kun je die er nog wel uit filteren, door een criterium te maken op basis van KlantID. Dat heeft hetzelfde effect als de tabellen koppelen op basis van het KlantID.

Wat we in jouw geval doen is iets vergelijkbaars. Maar net iets anders. We hebben namelijk geen waarden die exact overeenkomen. Wat je uiteraard niet wilt is om alle records uit Brontijden te zien, maar alleen de brontijden die binnen het gebied vallen van de begintijd en eindtijd. En daarom vind je deze 2 criteriums in de query:
Code:
CDbl([tblWerktijden].[Begin Werktijd]) <CDbl([tBloktijden_2].[Eindtijd])
en
Code:
CDbl([tblWerktijden].[Eind Werktijd]) > >CDbl([tBloktijden_2].[begintijd])
Ik zet hier de tijden om naar getallen om conversieproblemen voor te zijn. Maar dat kun je ook anders oplossen.
 
Ik heb er een tijdje niet aan kunnen werken door mijn tentamens maar ik ben er weer mee begonnen. Ik ben bang dat het maken van deze query mijn computerverstand wat te boven gaat. Ik kom er simpelweg niet uit. Het maken van de relaties lukt niet, laat staan het maken van de query. Ik heb echt maar basis verstand van Access doordat we in de les een aantal keren gewerkt hebben met het maken van querys en formulieren. Ik baal hier wel van, want dit is echt iets wat ik zoek. Ik heb wel al een tabel dus met bloktijden gemaakt, een tabel met in mijn geval de verschillende modaliteiten of type vervoermiddel en de ordertijden, alleen het leggen van de relaties lukt dus al niet. Ik heb naar het bestand gekeken wat je gestuurd hebt en dit vind ik er logisch uitzien alleen lukt het dus zelf niet. In de ontwerpweergave kan ik wel een relatie leggen, maar vervolgens gebeurt er helemaal niks als ik de tabel weer opnieuw open. Ik zou het graag willen leren, want ik denk dat Access echt een handig hulpmiddel kan zijn en ook met ik het in de toekomst gaan gebruiken voor mijn opleiding.
 
In een cartesisch product leg je nu juist géén relaties. Het enige wat je doet is de tabellen filteren. Daarbij kijk je dus naar de criteria zoals ze hierboven staan uitgelegd. Relaties leg je doorgaans tussen tabellen omdat je gegevensintegriteit wilt waarborgen. Dus in de tabel Orders wil je geen klantID's hebben die niet bestaan, want dan heb je die klant niet. Idem dito voor ArtikelID's in de tabel OrderRegels. Je gaat geen producten leveren die je niet hebt.
Als de relaties kloppen bij het maken, dan zijn de ingevoerde gegevens dus correct, anders heb je een probleem met de bestaande records dat je eerst op moet lossen. Verder doen relaties niks. Dus als je na het maken van de relaties de tabel opent, verandert er niks. Ergo: jouw laatste ervaring is dus helemaal goed :).
 
Haha nou dan gaat er toch iets goed. Ik zie alleen dat je in jouw query de codes die je twee berichten terug hebt gestuurd niet hebt geselecteerd op weergeven. Dan doen ze toch ook helemaal niks in jouw query?
 
Weergeven of niet maakt voor een query niet uit; het veld werkt namelijk altijd. Alleen zie je het resultaat niet. In dit geval hoeft dat ook niet. Je mag ze overigens best laten zien als je dat wilt. Kwestie van het vinkje aan zetten.
 
Ik heb nu de query nagemaakt op de volgende manier:
Access.jpg

Alleen nu krijg ik een venster waar ik een begin tijd en dergelijke moet invullen.
 
Kijk eens naar je velden; je gebruikt een tabel tblWerktijden. Die je niet hebt.
 
Dat was wel lomp. Heb het nu verbeterd maar ik krijg nog steeds een venster waarin ik parameters in moet vullen. Ik heb het nu op de volgende manier:
Access2.jpg
 
Zag dat ik nog een stukje in de code verkeerd had gedaan. Ik krijg nu een lege tabel als ik de query open.
 
Gooi er eens een voorbeeldje tegenaan, zou ik zeggen. Mijn voorbeeld werkt, zoals je gezien hebt dus als je die constructie netjes hebt overgenomen, zou het moeten werken. Als het dat niet doet, dan weet ik het zo ook niet meer.
 
Wat bedoel je met ''een voorbeeldje tegenaan gooien''? Bedoel je dat ik mijn database hier upload?
 
In één keer goed :). Uiteraard een kopie met wat dummy data, en alleen de tabellen/formulieren die met de vraag te maken hebben.
 
Ik probeer de database te uploaden, maar dan krijg ik een foutmelding. Hoe kan ik het toch uploaden?
 
Waarschijnlijk is de db te groot; een bestand mag maar 100kb zijn. En sowieso moet je de db zippen want je kunt geen databases uploaden. Eventueel kun je met Winrar nog deelbestanden maken van 100kb. Laatste uitweg: zet 'm op een fileshare als wikisend.com. Hoef je er weinig aan te doen (kan ook db bestand zijn) en de grootte is dan ook geen probleem.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan