report probleem met aftrekken 2 tijdvelden

Status
Niet open voor verdere reacties.

JohanRVT

Gebruiker
Lid geworden
2 mrt 2011
Berichten
555
Hallo groep,
In bijgevoegde PDF report wil ik de zogezegde GAP (verstreken tijd tussen de tijd van de winnaar van een loopwedstrijd en de tijden van de volgende) laten verschijnen. Daarvoor kijk ik via een =DLookUp("Tijd1";"Huidige_Uitslag";"Plaats1=1") naar de tijd van de eerste en zet deze tijd dan in een txtveld bovenaan de report (lichtgroen ingekleurd en in dit geval gewoon "TijdEerste" genoemd). Ik trek dan van de tijd van alle atleten dit txtveld af in een txtveld in de kolom GAP. Blijkt dat het voor de eerste record netjes de uitkomst 0:00:00 geeft maar in plaats van voor de 2° record het vewachte resultaat van 0:02:06 te geven krijg ik 0:31:33 als uitkomst. Blijkt dat de waarde van "Tijdeerste" verdubbeld wordt vanaf de 2° record maar dan behouden blijft. Vanwaar komt dit fenomeen en waarom blijft het dan behouden (zie de lichtgroene dtailrecords die in feite een copie zijn van Tijdeerste) na de 2° record, er staat nml overal bij "lopend totaal" NEE
Of is er een betere, eenvoudige oplosing om deze GAP te laten verschijnen in de report?
Bedankt op voorhand voor suggesties.
 

Bijlagen

Daar zul je toch wat meer informatie bij moeten doen, en bij voorkeur een db met testrecords. Want zonder de structuur te zien kunnen we er niet veel mee...
 
Wat je fout doet in je pdf weet ik niet, omdat je db een ander rapport bevat. Daarin klopte de formule niet, omdat je met verkeerde velden werkte ([Tijd1]-[Tijd1] is natuurlijk altijd 0). En een Oplopende som op dat veld helpt ook niet mee.
In bijgaand voorbeeld de oplossing. Overigens heb je de functie ElapsedTime helemaal niet nodig. Dus ook nog een extra textveld met alleen een Tijdberekening en aangepaste veldopmaak.
 

Bijlagen

lichtje gaat op

Timeserial, had daar niet aan gedacht en ik had inderdaad de verkeerde report laten zitten
Heb 't zo aangepast aan jouw manier van werken, beetje de notatie nog verandert dat die gap kolom er gelijk uit ziet als de tijd1
Weeral bedankt Michel :thumb:
 

Bijlagen

berekenen tijdveld

Johan,

Hier nog een oplossing vanuit een formulier waarbij je ook de score volgorde niet hoeft in te voeren, het rapport opent vanuit je formulier.

Wel zal je nog een aantal velden moeten toevoegen.

Groet, Pletter.
 

Bijlagen

Persoonlijk hou ik niet zo van oplossingen waarbij je op een knop moet drukken om uitslagen/verschillen te berekenen. Je hebt dan nooit dynamische resultaten, dus je kunt er nooit van uitgaan dat het rapport de goede gegevens toont. Je ben namelijk verplicht om altijd de knop te gebruiken.
Dat principe geldt niet alleen voor de tijdverschillen, maar ook voor de plaatsbepaling zelf die nu hard ingevoerd in het veld Plaats1 is. Die moet je natuurlijk dynamisch laten uitrekenen; er is geen enkele noodzaak om dat met de hand in te voeren.

In bijgaand voorbeeldje dus een aantal queries met voorbeelden, en het rapport is nu ook gebaseerd op de berekende plaatsbepaling. In deze oplossing wordt dus (afgezien van de functie <GetElapsedTime> die weg zou kunnen) geen enkele functie meer gebruikt, en wordt alles via berekeningen uitgevoerd. En dat lijkt mij toch de meest functionele oplossing.

De query <qUitslagen_per_Gemeente> zit er bij om te laten zien dat je resultaten gegroepeerd kunt laten zien. Eigenlijk had ik dat willen doen met verschillende wedstrijden (elke wedstrijd heeft natuurlijk een eigen rangorde) maar omdat je maar één wedstrijd in de tabel hebt staan, gaat dat niet op. Vandaar als voorbeeld een uitslag per gemeente. De techniek is denk ik wel aan te passen naar andere groepen.
 

Bijlagen

Laatst bewerkt:
Hallo,

ik heb aan de hand van Octafish zijn idee de volgende uitslag gemaakt algemeen en per reeks met dus gemiddelde snelheid en de zogezegde GAP. Voor de uitslag per reeks moest ik wel een aantal dingen nog toevoegen omdat dan in de tabel "huidige uitslag" de plaatsen evenveel keren identiek voorkomen als er reeksen zijn en dus de Gap van de tweede en volgende reeks niet juist zouden zijn.
Maar ik leer graag bij en bekeek even Pletter zijn voorbeeld; ik heb het nog nergens gezien maar het is geen slecht idee om ook in een aparte kolom het verschil met de atleet voor U te zien (maar soms staat het blad al aardig vol met kolommen zie bv hier.) :thumb:
Ik ga zeker ook die query "per gemeente" gebruiken omdat er soms deeluitslagen gevraagd worden van de deelnemers van de plaatselijke gemeente.
Hard invoeren van data of plaatsen doe ik natuurlijk niet Michel, dat gebeurt via VBA die telkens (of enkele als het nodig) is die tabel "huidige_uitslag" eerste leegmaakt en dan terug opvult via een combinatie van eerste enkele queries en toevoegqueries uit te voeren en daarna de plaatsen te berekenen (points berekenen is uitgeschakeld omdat dat momenteel niet meer hoeft maar wat niet is kan terugkeren en dus liet ik ze gewoon staan). Lang geleden had een collega voor mij iets gelijkaardigs gemaakt maar daar werd het gemiddelde en verschil ook hard opgeslagen in aparte kolommen in een algemene tabel wat dus eigenlijk niet hoeft.
 
Laatst bewerkt:
verschil tijdveld

Octafish,

Bij het invoeren van een tijd in het formulier wordt het geheel opnieuw berekend, dit geeft toch wel een meerwaarde dan de invoer in een tabel doen.

Groet, COr.
 
Het verschil tussen twee personen is met een query ook prima uit te rekenen. Wel heb je dan een hulpquery nodig die eerst die verschillen uitrekent.
Een voorbeeldje die netjes de ranglijsten uitwerkt op basis van Categorie:

Code:
SELECT Atleet_Id, Naam, Club, Gemeente, Categorie, Plaats_Cat, Laureaat, Start_Nr, Tijd1, (SELECT DISTINCT TOP 1 Tijd1 FROM Huidige_Uitslag AS T1 WHERE (T1.Tijd1 < Huidige_Uitslag.Tijd1) AND (Huidige_Uitslag.Categorie = T1.Categorie) ORDER BY T1.Tijd1 DESC ) AS VorigeTijd, Huidige_Uitslag.Plaats1, Huidige_Uitslag.Reeks_Id, Plaats1_9999, Points, Tijd_Verschil, Plaats1_9999_Txt
FROM Huidige_Uitslag
GROUP BY Atleet_Id, Naam, Club, Gemeente, Categorie, Plaats_Cat, Laureaat, Start_Nr, Tijd1, Plaats1, Reeks_Id, Plaats1_9999, Points, Tijd_Verschil, Plaats1_9999_Txt
ORDER BY Categorie, Tijd1;

En dat resulteert dan in:
Code:
SELECT a.Atleet_Id, a.Naam, a.Club, a.Gemeente, a.Categorie, a.Plaats_Cat, a.Start_Nr, a.Tijd1, a.VorigeTijd, [a].[tijd1]-[a].[Vorigetijd] AS Tijdverschil, a.Plaats1_9999_Txt, Count(*) AS VolgNummer
FROM qUitslagen AS a, qUitslagen AS b
WHERE (((TimeValue([a].[Tijd1]))>=TimeValue([b].[Tijd1])) AND ((a.Categorie)=[b].[Categorie]))
GROUP BY a.Atleet_Id, a.Naam, a.Club, a.Gemeente, a.Categorie, a.Plaats_Cat, a.Start_Nr, a.Tijd1, a.VorigeTijd, a.Plaats1_9999_Txt
ORDER BY a.Categorie, TimeValue([a].[Tijd1]);

@Plettter: het aanpassen van een waarde in tabel/formulier resulteert automatisch in een correcte query/rapport. Je kunt niet met droge ogen beweren dat iets dat altijd automatisch de juiste waarden laat zien minder goed werkt als iets waarvoor je op zijn minst één keer op een knop moet drukken...
 
Laatst bewerkt:
En, als laatste voorbeeldje, want het principe zal onderhand wel duidelijk zijn, een query van de volgorde van deelnemers per plaats per geslacht:

Query [qUitslagen_PlaatsGeslacht]:
Code:
SELECT Atleet_Id, Naam, Club, Gemeente, Categorie, Plaats_Cat, Laureaat, Start_Nr, Tijd1, (SELECT DISTINCT TOP 1 Tijd1 FROM Huidige_Uitslag AS T1 WHERE (T1.Tijd1 < Huidige_Uitslag.Tijd1) AND (Huidige_Uitslag.Categorie = T1.Categorie) AND (Huidige_Uitslag.Gemeente = T1.Gemeente) ORDER BY T1.Tijd1 DESC ) AS VorigeTijd, Plaats1, Reeks_Id, Plaats1_9999, Points, Tijd_Verschil, Plaats1_9999_Txt
FROM Huidige_Uitslag
GROUP BY Atleet_Id, Naam, Club, Gemeente, Categorie, Plaats_Cat, Laureaat, Start_Nr, Tijd1, Plaats1, Reeks_Id, Plaats1_9999, Points, Tijd_Verschil, Plaats1_9999_Txt
ORDER BY Gemeente, Categorie, Tijd1;

En:
Code:
SELECT a.Atleet_Id, a.Naam, a.Club, a.Gemeente, a.Categorie, a.Plaats_Cat, a.Start_Nr, a.Tijd1, a.VorigeTijd, [a].[tijd1]-[a].[Vorigetijd] AS Tijdverschil, a.Plaats1_9999_Txt, Count(*) AS VolgNummer
FROM qUitslagen_PlaatsGeslacht AS a, qUitslagen_PlaatsGeslacht AS b
WHERE (((TimeValue([a].[Tijd1]))>=TimeValue([b].[Tijd1])) AND ((a.Gemeente)=[b].[Gemeente]) AND ((a.Categorie)=[b].[Categorie]))
GROUP BY a.Atleet_Id, a.Naam, a.Club, a.Gemeente, a.Categorie, a.Plaats_Cat, a.Start_Nr, a.Tijd1, a.VorigeTijd, a.Plaats1_9999_Txt
ORDER BY a.Gemeente, a.Categorie, TimeValue([a].[Tijd1]);
 
Laatst bewerkt:
verschil tijdveld

Octafish,

Als je de invoer in de tabel doet dan is dat 1 klik daarna het rapport openen is de 2e klik.

Zie hier in dus geen verschil in, formulier openen 1 klik rapport openen 2e klik.

Maar goed om je ego te strelen mag je het laatste woord hebben.

Groet, Cor.
 
Ik wil best het laatste woord hebben :) Bij jouw oplossing moet je altijd eerst het formulier openen (één klik) en daarna op de knop klikken. (da's twee). Vervolgens moet er van alles worden gedaan in de tabel wat in beginsel tijd kost want er moeten zowiezo transacties worden uitgevoerd in de tabel.

Met queries is het simpel: je voert in als je wilt invoeren, en als je het rapport wilt zien: rapport openen. Wanneer je maar wilt, zo vaak als je wilt. Je kunt dus nooit vergeten om de gegevens bij te werken. Da's toch echt vriendelijker dan jouw oplossing. Bovendien kan je met een klein beetje SQL kennis zelf de queries maken/aanpassen, en bij jou moet je echt gaan programmeren, dus VBA kennis hebben. En daar wou ik het maar bij laten ;)
 
Laatst bewerkt:
Tardis: Denk je dat Pletter geestelijke ondersteuning nodig heeft? Beetje triest... Ik dacht dat we van het zielig doen af waren; bovendien heb ik geen enkele keer iets afkeurends gezegd over Pletter's oplossing, want daar mankeert verder helemaal niks aan.
Ik wil het ook nog wel even over het normaliseringsaspect hebben; zeggen de regeltjes niet dat je gegevens die je kunt berekenen niet opslaat in een tabel, maar via een query berekent? Kijk dan nog eens naar de oplossing van Pletter (extra velden) en die van mij...
 
Laatst bewerkt:
OctaFish,

ik geef Cor een compliment, meer niet.
Als jij dat anders wilt opvatten, prima.

Tardis
 
normalisering

Die tabel "huidige_uitslag" is voor mij dus een tabel die steeds maar tijdelijke gegevens opslaat (tot een VBa functie ze leegt en heropvult), dit maakt dat als het systeem éénmaal een uitslag heeft aangemaakt het bij het herprinten veel sneller gaat omdat alle berekeningen al zijn gemaakt (buiten die Gap en gemiddelde van nu natuurlijk), doordat er nog een 2-tal andere rapporten (per categorie en podia) dezelfde tabel gebruiken zonder herberekenen scheelt dat veel tijd in verwerken tijdens een wedstrijd (vooral voelbaar bij veel deelnemers en werken over netwerk met toch niet zo sterke Laptop's). Bij berekenen per reeks herbegint het proces en bij triathlon's (met nu wel al tot 6verschillende tussentijden) voel je dat natuurlijk nog meer. Vandaar dat hard opslaan hier wel genuttigd is.
 
wat met lege records?

Ik probeer die Gap functie nu ook te gebruiken voor uitslagen met tussentijden waarbij dat de tabel huidige_uitslag ook atleten bevat die een onvolledig parcours hebben afgelegd en die toch in de uitslag staan als DNF, in hun geval hebben ze dus geen eindtijd die kan afgetrokken worden van de tijd van de eerste en geeft de formule een #fout uitkomst. Wat moet er gebeuren (met bv een nz) om dat op te lossen dat je zo'n foutmelding niet meer ziet verschijnen?

Een van de formuleaanpassingen die ik heb geprobeerd, in dit geval is de tijd1 vervangen door tijd1_7 maar daar ligt 't niet aan want dat werkt voor alle atleten die correct zijn aangekomen (zie deze PDF )
Code:
=Nz(TimeSerial(Hour([Tijd1_7]);Minute([Tijd1_7]);Second([Tijd1_7]));"0:00:00")-Nz(TimeSerial(Hour([EersteTijd]);Minute([EersteTijd]);Second([EersteTijd]));"0:00:00")

Weeral bedankt op voorhand voor suggesties.
 
Laat maar zitten, heb het opgelost met voorwaardelijke opmaak (tenzij er een waarde groter of gelijk aan 0 in de cel staat de tekst zwart maken, zoniet alles wit)
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan