Ga naar inhoud
  • 0

Probleemstelling berekening vrije uren


Grinwell

Vraag

Hoi Allemaal,

 

Volgende situatie:

Ik heb een portaal per week met werk diensten erin, deze hebben een begin en eind tijd.

Nu is het verplicht om in deze week minimaal 32 uur aaneengesloten rust te hebben.

Als deze niet bereikt is, dan moet er een waarschuwing komen,

maar voor nu ben ik alleen geïnteresseerd in het hoogste aantal aaneengesloten rusturen in deze week.

 

De database bevat de volgende regels:

Dienst Datum Type Start Eind

1 16-9 Avond 18:00 22:00

2 17-9 Avond 18:00 22:00

3 18-9 Avond 18:00 22:00

4 19-9 Avond 18:00 22:00

5 20-9 Avond 18:00 22:00

6 21-9 Avond 18:00 22:00

7 22-9 Vrij

 

Hierbij moet rekening worden gehouden de week start op 16-9 00:00 en eindigt op 22-9 24:00.

 

Het portaal, calculatie of script zou het volgende moten berekenen:

Voor 1 18 uur rust

Voor 2 of Na 1 20 uur rust

Voor 3 of Na 2 20 uur rust

Voor 4 of Na 3 20 uur rust

Voor 5 of Na 4 20 uur rust

Voor 6 of Na 5 20 uur rust

Na 6 26 uur rust

 

Maximum aantal is hier 26 uur, waar ik dus in geïnteresseerd ben.

 

Heeft er iemand een idee hoe ik zou kunnen aanpakken?

 

Met vriendelijke groet,

 

 

Bob

VrijeUren.fp7

Link naar reactie

8 antwoorden op deze vraag

Aanbevolen berichten

  • 0

Er zijn verschillende mogelijkheden, maar dit is er eentje:

Uitgangspunt in dit voorbeeld is dat je alleen wilt weten of de 32 uur rust is bereikt en zo nee hoeveel uur rust is er bereikt. Kan allemaal anders natuurlijk, maar ik heb hier even die keuze gemaakt. De 2 relaties die zij gelegd hebben strikt genomen 5 extra velden nodig (de zesde is voor de persoon, want je kan meerdere personen hebben).

Je hebt een beginTijdstempel en een eindTijdstempel én je hebt een limiet (van 32 uur) waarbinnen je wilt weten of er is gewerkt en met die gegevens bereken je de scope: De minimale tijd waarbinnen de vorige eindtijd en de huidige begintijd valt én de maximale tijd waarbinnen de volgende begintijd en de huidige eindtijd valt.

 

Dan worden er twee tableoccurrences toegevoegd waar de nieuwe velden worden gebruikt voor de relaties en daarmee kunnen de vrije uren sinds de vorige entry en de vrije uren totaan de volgende entry worden berekend. Buiten de scope van 32 uur is de conclusie simpelweg meer dan 32 uur. in dit voorbeeldje is dat leeg.

VrijeUren.fp7

Link naar reactie
  • 0

Hoi Bob,

 

Hierbij nog een optie; bij deze optie maakt het niet uit in welke volgorde je de regels invoert, in de eerste regel wordt de afstand tot het begin van de week bepaald, in de volgende regels wordt de afstand tot de vorige regel bepaald, en het maximale aantal uren is de maximale uren van de regels, of de afstand van het einde van de week tot aan de laatste regel.

 

zie bijgaand voorbeeld,

 

prettig weekend,

 

Ruben

VrijeUren.fp7

Link naar reactie
  • 0
Er zijn verschillende mogelijkheden, maar dit is er eentje:

Uitgangspunt in dit voorbeeld is dat je alleen wilt weten of de 32 uur rust is bereikt en zo nee hoeveel uur rust is er bereikt. Kan allemaal anders natuurlijk, maar ik heb hier even die keuze gemaakt. De 2 relaties die zij gelegd hebben strikt genomen 5 extra velden nodig (de zesde is voor de persoon, want je kan meerdere personen hebben).

Je hebt een beginTijdstempel en een eindTijdstempel én je hebt een limiet (van 32 uur) waarbinnen je wilt weten of er is gewerkt en met die gegevens bereken je de scope: De minimale tijd waarbinnen de vorige eindtijd en de huidige begintijd valt én de maximale tijd waarbinnen de volgende begintijd en de huidige eindtijd valt.

 

Dan worden er twee tableoccurrences toegevoegd waar de nieuwe velden worden gebruikt voor de relaties en daarmee kunnen de vrije uren sinds de vorige entry en de vrije uren totaan de volgende entry worden berekend. Buiten de scope van 32 uur is de conclusie simpelweg meer dan 32 uur. in dit voorbeeldje is dat leeg.

 

Deze berekend inderdaad of 32 uur bereikt is tussen de regels in.

Helaas is deze oplossing niet mogelijk, doordat als er af word afgeweken van 32 uur het totaal over twee weken op 72 uit moet komen.

Het is dus noodzakelijk dat ik het aantal uur weet.

 

Heel erg voor je reactie.

aangepast door Gast
Link naar reactie
  • 0
Hoi Bob,

 

Hierbij nog een optie; bij deze optie maakt het niet uit in welke volgorde je de regels invoert, in de eerste regel wordt de afstand tot het begin van de week bepaald, in de volgende regels wordt de afstand tot de vorige regel bepaald, en het maximale aantal uren is de maximale uren van de regels, of de afstand van het einde van de week tot aan de laatste regel.

 

zie bijgaand voorbeeld,

 

prettig weekend,

 

Ruben

 

Hoi Ruben,

 

Bedankt voor je reactie.

 

Ik heb inderdaad een te goed weekend gehad :D

Deze benadering heb ik inderdaad over het hoofd gezien.

 

Heel erg bedank, hiermee kan ik zeker mee verder,

 

Groet,

 

Bob.

Link naar reactie
  • 0

Solved it

 

Zoals gewoonlijk had ik weer eens geen zin om moeilijk te gaan doen met relaties en andere rotzooi.

Onderstaand werkt en doet precies wat ik wil.

 

Ben nog wel op zoek om het portaal zelf mee te geven, maar dit zal waarschijnlijk wel weer te veel gevraagd zijn van File Maker.

 

Thnx all greetz.

 

// Net schilletje om aan te roepen.

 // Creator: Grinwell
 // FunctionName: CalculateRust

 CalculateRustRecursive ( "" ; "" )

 

// De functie zelf

Let([

 // Creator: Grinwell
 // FunctionName: CalculateRustRecursive
 // Parameter 1 = StartRecordNumber, call function with empty string
 // Parameter 2 = PreviousEndDate, de einddatum van de vorige dienst of start van de week

 // param
 record_number = If ( StartRecordNumber > 1 ; StartRecordNumber ; 1) ;

 // record gegevens
 record_betreft = GetNthRecord( Regelsviaplanning_Portal1::Betreft_regels ; record_number ) ;
 record_datum = GetNthRecord( Regelsviaplanning_Portal1::Datum_regels ; record_number ) ;
 record_start_time = GetNthRecord( Regelsviaplanning_Portal1::Begintijd_regels ; record_number ) ;
 record_end_time = GetNthRecord( Regelsviaplanning_Portal1::Eindtijd_regels ; record_number ) ;
 record_start_timestamp = Timestamp ( record_datum ; record_start_time ) ;
 record_end_timestamp =  CreateTimestampEindTijd ( record_datum ; record_start_time ; record_end_time ) ;

 // Bereken minimum en maximum van de week
 first_record_datum = GetNthRecord( Regelsviaplanning_Portal1::Datum_regels ; 1) ;
 maandag_date = first_record_datum -(If(DayOfWeek ( first_record_datum )=1;7;DayOfWeek ( first_record_datum )-1)-1) ;
 zondag_date = maandag_date +6 ; 
 maandag_min_timestamp = Timestamp ( maandag_date ; Time ( 0 ; 0 ; 0 ) ) ;
 zondag_max_timestamp = Timestamp ( zondag_date ; Time ( 24 ; 0 ; 0 ) ) ;

 // beslissingen
 has_record = not ( record_betreft = "?" and record_end_timestamp = "?" ) ;
 has_time = not (record_start_timestamp = "?" or record_start_timestamp = "" ) ;

 // bereken aantal uren
 previous_date = If ( record_number = 1 ; maandag_min_timestamp ; PreviousEndDate ) ;
 hours_rest = If ( has_record and has_time ; record_start_timestamp - previous_date ; zondag_max_timestamp - previous_date ) ;
 hours_rest = hours_rest / 3600 ;

 // recursive gedeelte
 previous_date = If ( has_record and has_time ; record_end_timestamp ; PreviousEndDate ) ;
 next_hours_rest = If ( has_record  ; CalculateRustRecursive ( record_number + 1 ; previous_date ) ; 0 ) ;

 // geef het grootste getal terug
 hours_rest = If ( hours_rest >  next_hours_rest ; hours_rest ; next_hours_rest )

];

 hours_rest 

)

Link naar reactie
  • 0

Zoals gewoonlijk had ik weer eens geen zin om moeilijk te gaan doen met relaties en andere rotzooi.

Ben nog wel op zoek om het portaal zelf mee te geven, maar dit zal waarschijnlijk wel weer te veel gevraagd zijn van File Maker.

 

Tsja, beste Grinwell, wat moet ik nu eigenlijk met zulke opmerkingen? Is het niet zo dat de inspanning die je wilt doen, de creativiteit en volharding die je hebt, zullen bepalen wat je wel en niet met FM kunt doen?

 

Het was ook maar een opmerking die niks betekend, vond het alleen weer apart dat ik toch weer terug kwam op een recursieve oplossing.

Hier heb ik er namelijk nog een aantal van inzitten.

 

Maar je hebt helemaal gelijk Felix, volharding en creativiteit heb je zeer zeker nodig.

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...