Acces query berekenen tijd tussen records

Status
Niet open voor verdere reacties.

carlos201

Gebruiker
Lid geworden
14 jan 2013
Berichten
7
Hi,

Ik heb een probleem met access. Mijn kennis is beperkt maar ik probeer het zo goed mogelijk uit te leggen.
Wat ik graag wil doen is tijd berekenen tussen records. Operators op mijn werk scannen hun naam en taak in een access formulier en deze hangt er automatisch een timestamp aan. De data wordt als volgt aangeleverd in een tabel:

Capture.PNG

Om dit te verwerken heb ik de volgende query geschreven (gedeelte van internet gehaald).

SELECT sub2.Opr, sub2.Task,
Format(Sum(Nz(sub2.duration,0)),'hh:nn:ss') AS SumOfduration
FROM (SELECT
sub1.Opr, Task,
(sub1.next_timestamp - sub1.timestamp) AS duration
FROM
(
SELECT
i.Opr,
i.Task,
i.timestamp,
(
SELECT Min([timestamp])
FROM Activity_Scanned
WHERE [timestamp] > i.timestamp
) AS next_timestamp
FROM Activity_Scanned AS i
WHERE i.timestamp BETWEEN #2016-02-17 06:00:00#
AND #2016-02-17 18:00:00#
) AS sub1
) AS sub2
GROUP BY sub2.Opr, sub2.Task;

Deze querry berekent wel de tijd tussen records maar specificeert dat niet per operator per taak. Wat ik ook graag zou willen is dat als een operator nog niet een volgende taak heeft gescanned, dat access dan bij houdt hoe lang deze operator al aan de taak werkt. Zodat ik een realtime beeld krijg welke taken worden uitgevoerd, hoe lang en door wie.

Ik hoop dat iemand mij kan helpen. Bij voorbaat dank!

Groet,

Carlos
 
Hier hebben we niet zoveel aan; ik heb liever een db met data. Want volgens mij kan die query ook een heel stuk simpeler.
 
Hi,

Dank je voor je snelle bericht. Ik heb het bestand in de bijlage gezet.
Ik heb wat records verwijderd om hem kleiner te maken.
De tabel activity scanned is de output van de scans die de operators maken.
Ik hoop dat je er iets mee kunt.

Dank je wel
 

Bijlagen

Ik ben er wel mee bezig geweest, maar ik zie nog niet helemaal wat er nu precies gebeurt. Ik snap de logica dus nog niet helemaal.... Ik vind je selectiemethode wel erg ongelukkig, met die hard ingeprogrogrammeerde datum.
 
Met een functie (dankzij Michel indertijd) in te bouwen en die dan te gebruiken in je formulier/rapport zou je er moeten geraken. Ik zie wel nog een gebruikers die je logt dus kun je moeilijk vastleggen wie wat gedaan heeft.
In bijkomende afbeelding van een subrapport is de tijd 1 het tijdstip waar de actie begon en 2 het tijdstip waarop die actie gedaan is. Via een kruistabelquery kun je die twee tijdstippen netjes naast elkaar tonen zodat je 't een van 't ander kan aftrekken, optellen, etc..... (in mijn geval toon ik vier subrapporten naast elkaar waardoor er dus vier verschillende periodes getoond worden, je kan daar dus heel ver in gaan en 't systeem telt de uren netjes op over de 24 uur :thumb: )


Code:
Function GettotalTime(veldnaam)
On Error GoTo GettotalTime_Err
    Dim totalhours As Long, totalminutes As Long
    Dim totalseconds As Long
    Dim hours As Long, minutes As Long
    Dim seconds As Long
    Rem days = Int(CSng(veldnaam))
    totalhours = Int(CSng(veldnaam * 24))
    totalminutes = Int(CSng(veldnaam * 1440))
    totalseconds = Int(CSng(veldnaam * 86400))
    hours = totalhours
    minutes = totalminutes Mod 60
    seconds = totalseconds Mod 60
    GettotalTime = hours & ":" & minutes & ":" & seconds
GettotalTime_Exit:
    Exit Function

GettotalTime_Err:
'MsgBox Error$
Resume GettotalTime_Exit

End Function
 

Bijlagen

  • Knipsel.PNG
    Knipsel.PNG
    7,7 KB · Weergaven: 62
  • Knipsel2.PNG
    Knipsel2.PNG
    6,5 KB · Weergaven: 68
  • Knipsel3.PNG
    Knipsel3.PNG
    17,6 KB · Weergaven: 68
Laatst bewerkt:
Ik heb zelf een (veel simpelere) query gemaakt, maar ik krijg daar met geen mogelijkheid de resultaten uit die jij in je query hebt. Mind you: volgens mij zijn die van mij wel juist.... Dus ik wil toch graag weten wat er volgens jou uit zou moeten komen. Misschien dat je dat in een Excelletje of zo kunt zetten als het in Access niet lukt. Maar volgens mij kan het prima met een query.
 
Dank jullie wel voor jullie help. Ik waardeer het enorm :)

In de bijlage zit een bestand waar de uitkomst in zit waar naar ik opzoek ben.
In excel heb ik de if formule gemaakt dat een eindtijd alleen van de volgende record wordt gepakt, als de operator hetzelfde is.
Anders laat excel als eindtijd de huidige tijd zien.

@ Johan, ik ben bezig om jouw antwoord te proberen. Wat ik me afvraag is hoe access nu weet hoe hij moet sorteren op operator naam? dat staat niet in deze code....

Nogmaals dank!Bekijk bijlage Time duration.xlsx
 
Laten we maar gelijk even uitleggen waarom je deze formule (ALS(B7=B8;D8;NU())) wél in Excel kunt gebruiken, maar nooit in Access: je anticipeert namelijk op het volgende record. En in beginsel kan dat niet; er is altijd wel een leeg (nieuw)record. Daarnaast heb je nu een oplopende nummering in je tabel, maar je sorteert op OPR. En je vergelijkt de naam van de OPR met die van het volgende record (wat dus niet juist kan zijn). Omdat je verschillende OPR's hebt, zul je altijd een record hebben dat verschilt van de volgende. In jouw Excel bestand kun je dat nooit afsluiten. De tijd blijft dus, wat je ook nog invoert, altijd de timestamp met Nu() berekenen. In rij 6 heb je dus nu al dit staan:
PHP:
3214	IXH	PACKEN REGULAR	17-02-16 12:17	22-02-16 21:23	129:05:56
Want in rij 7 ga je over op JXL, dus hoe wou je dat oplossen in Excel?

Maar dat zijn zo wat dingen die mij opvallen. Jouw Excelletje kun je prima met een query namaken op de volgende manier:

PHP:
SELECT Activity_Scanned.ID, Activity_Scanned.Opr, Activity_Scanned.Task, Activity_Scanned.a_date, Activity_Scanned.a_time, IIf((SELECT TOP 1 [a_time] FROM [Activity_Scanned] AS T1 
WHERE (T1.[ID] > [Activity_Scanned].[ID] AND T1.Opr = [Activity_Scanned].[Opr]) ORDER BY T1.[ID] ASC ) Is Null,Time(),(SELECT TOP 1 [a_time] FROM [Activity_Scanned] AS T1 
WHERE (T1.[ID] > [Activity_Scanned].[ID] AND T1.Opr = [Activity_Scanned].[Opr]) ORDER BY T1.[ID] ASC )) AS VolgendeTijd, IIf([VolgendeTijd] Is Null,Time(),[VolgendeTijd]-[a_time]) 
AS Duration
FROM Activity_Scanned
GROUP BY Activity_Scanned.ID, Activity_Scanned.Opr, Activity_Scanned.Task, Activity_Scanned.a_date, Activity_Scanned.a_time
ORDER BY Activity_Scanned.ID, Activity_Scanned.Opr;
 
Ik begrijp je punt. Zo had ik er nog niet over nagedacht.
Zolang de operators op alfabetische volgorde zijn gesorteerd zal het werken, maar het is fout gevoelig.

Wat zou je anders voorstellen?
 
Waarom zou je de laatste record niet controleren op de laatste mogelijke handeling? Het lijkt er op alsof de activiteiten onderdeel zijn van een bepaald proces. Dat begint ergens mee, en eindigt met een actie. Daar kun je rekening mee houden. Overigens zit je dan nog steeds met het probleem dat Nu() wel doortelt, en de beschikbare werkuren niet.
 
Helaas is het niet een standaard proces wat ze afwerken. Welke taken ze doen is volledig random.

Ik heb zojuist je querry in access gezet maar access geeft de volgende fout meldingen: 1.JPG2.JPG3.JPG

Wat zie ik over het hoofd?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan