Jump to content
  • 0

Tijdsregistratie met negatieve jobtijden


Zero55

Question

Posted

Hallo,

In bijlage een snippet (1 dag) van een tijdsregistratie-database (credits gaan naar een andere persoon dan mezelf), probleem is dat het veld "Job_Time" enkele negatieve tijden zijn terechtgekomen. De gerelateerde velden "End_Times" en "Chk" zijn berekende velden en kunnen dus niet manueel aangepast worden om te corrigeren. Zelf ben ik helaas niet wijs genoeg om dit probleem opgelost te krijgen, vandaar mijn vraag op dit forum.

Alvast bedankt om er eens naar te kijken.

PS. bij het openen van het bestand, negeer de gerelateerde waarschuwingen

GR
Zer0

Registratie_Lineitem_copy.fmp12

14 answers to this question

Recommended Posts

  • 0
Posted

Het is nogal een complex geheel. Je ziet in ieder geval dat bij de negatieve job times de end times ontbreken. Laat nu juist de berekening dáárvan gebruik maken van allerlei velden vanuit andere bestanden.. Die kan ik dus niet nalopen. Zonder degelijk datamodel is dat verder ook zinloos want wat is de betekenis van de verschillende gebruikte velden? Wat zijn überhaupt de invoervelden waar de berekeningen  op losgelaten worden?

Kortom: hopeloos. Het beste wat je kunt doen is in een kopie wat puzzelen met andere invoerwaarden en delen van berekeningen wijzigen of weglaten en dan zien hoe je uitvoer verandert. Hopelijk krijg je dan inzicht in de werking en betekenis van de verschillende velden en kun je achterhalen waar het fout loopt en hoe dat aangpast moet worden.

  • 0
Posted

Je ziet ondanks dat er bestanden ontbreken dat het resultaat van de berekening negatief is wanneer "End_times" leeg is, dus dat is het enige dat je moet opvangen en dan werkt het prima. Als de eindtijd kleiner is dan de starttijd (leeg is ook kleiner dan de starttijd) dan kan je geen resultaat hebben en dus moet dat leeg blijven.

Als je haast hebt, zou je kunnen volstaan met het toevoegen van:

End_times < tijd ; "" ; 

in de eerste lijn van de case-statement

Verder wordt er in die berekening nogal gerommeld met formaten en conversies daarvan. In FM is dat helemaal niet nodig, want dat is toevallig een van de sterkste punten van FM. De formule kan dan iets leesbaarder worden gemaakt en als volgt worden omgevormd:

Let ( [ 

	start = tijd ; 
	einde = End_Times 

] ; 

	Case(
		einde < start ; "" ; 
		start < Time (  9 ; 50 ; 0 ) and einde > Time ( 14 ; 40 ; 0 ) ; einde - start - Time ( 0 ; 50 ; 0 ) ; 
		start < Time (  9 ; 50 ; 0 ) and einde > Time ( 12 ; 30 ; 0 ) ; einde - start - Time ( 0 ; 40 ; 0 ) ; 
		start < Time (  9 ; 50 ; 0 ) and einde > Time ( 10 ;  0 ; 0 ) ; einde - start - Time ( 0 ; 10 ; 0 ) ; 

		start < Time ( 12 ;  0 ; 0 ) and einde > Time ( 14 ; 40 ; 0 ) ; einde - start - Time ( 0 ; 40 ; 0 ) ; 
		start < Time ( 12 ;  0 ; 0 ) and einde > Time ( 12 ; 30 ; 0 ) ; einde - start - Time ( 0 ; 30 ; 0 ) ; 

		start < Time ( 14 ; 30 ; 0 ) and einde > Time ( 14 ; 40 ; 0 ) ; einde - start - Time ( 0 ; 10 ; 0 ) ; 

		einde - start ) 

)

Er wordt geen enkel dataformaat omgezet, er wordt alleen maar met tijden gerekend.

  • 0
Posted

Hallo Menno,

Ik zal het vanavond moeten proberen, aangezien er tijdens kantooruren clients zijn ingelogd en ik geen wijzigingen in calculations kan doorvoeren. Ik post sowieso het resultaat ;-)

 

GR

Rudi

  • 0
Posted

als ik de registraties bekijk, vermoed ik dat bij de records met een negatieve tijd, gewoon de algemene eindtijd (einde van de dag = 16:40:00) ingevuld moet worden, zou ik dat op één of andere manier kunnen doen, enkel voor de records die ik in een found set heb? 

  • 0
Posted
If ( werknemers_Badge::Afdeling = "Polen" ; 
End_Times_Polen
; 
Case( End_Times < tijd ; "" ;
          IsEmpty(Chk) and DayOfWeek( datum ) <> 6; Dag_Einde::EindTijd ;
          IsEmpty(Chk) and DayOfWeek( datum ) = 6; Dag_Einde::EindTijd;
          PatternCount( Times_Day ; C_Begin_Tijd) = 1 ; 
          GetAsTime( Middle( Times_Day ; 
                                             Position( Times_Day ; C_Begin_Tijd; 1 ; 1 )  + 9
                                             ; 8 ) )
 
;"")
)

Dit is hoe het er nu in zit

  • 0
Posted

Ja, dat dacht ik dus al, je hebt een heel ander veld aan zitten passen. Het veld "Job_Time" gaf negatieve getallen weer, dus dat is het veld dat ik heb bekeken. Door enig en alleen DIE berekening aan te passen, was het probleem in jouw testbetand weg.

Als je andere velden hebt die soortgelijke problemen hebt, dan is dat met deze testgegevens niet zichtbaar. Wat mij opvalt aan de berekening voor "End_Times_Polen" is dat er met tijden worden gerekend, maar dat er als het ware tekst wordt "geïnjecteerd", dat zou je technisch wat robuster moeten oplossen.

In de bijlage het aangepaste testbestand, daarin is enkel "Job_Time" aangepast.

Registratie_Lineitem_aangepast.fmp12

  • 0
Posted

Als het veld End_Times leeg is óf de waarde erin is kleiner dan de tijd dan is Job_time ook leeg, dat wordt door de eerste case-clausule geregeld. 

End_Times is óók een berekend veld en daar zou je indien tijd is ingevuld, zou je daar bijvoorbeeld de einde v/d dag tijd in kunnen zetten: Time ( 16 ; 40 ; 0 ) 

Een Case() werkt als volgt: de clausules wordt na elkaar getest en zodra er een resultaat true / yes / >0 is, wordt de statement direct na de clausule uitgevoerd. Alle clausules daarna worden niet meer getest (dus genegeerd). Met die kennis kan je gemakkelijk de werking en de smanehang van alle velden nalopen.

  • 0
Posted

Wat je eventueel zou kunnen doen is de invoer en de structuur laten zoals die is en alleen het veld Job_Time aan te passen:

Let ( [ 

	start = tijd ; 
	einde = Case ( 
		End_Times > 0 ; End_Times ; 
		tijd > 0 ; Time ( 16 ; 40 ; 0 ) ; 
		"" )

] ; 

	Case(
		einde < start ; "" ; 
		start < Time (  9 ; 50 ; 0 ) and einde > Time ( 14 ; 40 ; 0 ) ; einde - start - Time ( 0 ; 50 ; 0 ) ; 
		start < Time (  9 ; 50 ; 0 ) and einde > Time ( 12 ; 30 ; 0 ) ; einde - start - Time ( 0 ; 40 ; 0 ) ; 
		start < Time (  9 ; 50 ; 0 ) and einde > Time ( 10 ;  0 ; 0 ) ; einde - start - Time ( 0 ; 10 ; 0 ) ; 

		start < Time ( 12 ;  0 ; 0 ) and einde > Time ( 14 ; 40 ; 0 ) ; einde - start - Time ( 0 ; 40 ; 0 ) ; 
		start < Time ( 12 ;  0 ; 0 ) and einde > Time ( 12 ; 30 ; 0 ) ; einde - start - Time ( 0 ; 30 ; 0 ) ; 

		start < Time ( 14 ; 30 ; 0 ) and einde > Time ( 14 ; 40 ; 0 ) ; einde - start - Time ( 0 ; 10 ; 0 ) ; 

		einde - start ) 

)

 

  • 0
Posted

Hallo Menno, 

Ik heb de berekening van Job_Time aangepast zoals je hierboven aangeeft, maar die 16:40:00 komt helaas niet tevoorschijn, veld Job_time blijft leeg.

Ook na aanpassen van End_Times om daar eventueel die 16:40:00 in te krijgen, is het resultaat een "?"

De velden en berekeningen zitten zo verstrengeld in elkaar dat ik er zelf niet aan uitkom. Nu, het is al goed dat er geen negatieve tijden meer staan, zo worden die registraties gewoon genegeerd in de rapportage. We weten nu dat 14/12 een "foute" dag is en dat de rapporten rond die datum uit de haak zijn, so be it.

Alvast bedankt voor al je moeite !

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...