Ga naar inhoud
  • 0

Tijdsregistratie met negatieve jobtijden


Zero55

Vraag

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

Link naar reactie

14 antwoorden op deze vraag

Aanbevolen berichten

  • 0

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.

Link naar reactie
  • 0

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.

Link naar reactie
  • 0
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

Link naar reactie
  • 0

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

Link naar reactie
  • 0

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.

Link naar reactie
  • 0

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 ) 

)

 

Link naar reactie
  • 0

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 !

Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...