mastnak | Pocet hodin mezi dvema datumy bez svatku a vikendu |
| Chlapi, potrebuju radu. Chci vypocitat pocet hodin mezi dvema datetime polema, ale nepocitat do toho svatky a vikendy. Mam rozdelany nasledujici. Klasika startDate-endDate/3600 Potom jsem si pomoci tohodle kodu zjistil kolik vikendu bylo v danym rozpeti to prevedu na hodiny a odectu od prvniho cisla. Dale mam seznam ceskych svatku, tam si ale lamu hlavu, jak zjistit kolik svatku se udalo behem rozsahu se kterym pocitam, tady bych potreboval nakopnout. Potom uz bych zase jen dopocital hodiny a odecet od prvniho cisla. Co na tuhle konstrukci rikate, nema to nekde diru?
Tady je vzorce na pocet vikendu pocVikendu := @BusinessDays(vytvoreni;Odeslano;2 : 3 : 4 : 5: 6); pocVikendu
a tady svatky DB := "aaa/aaa":"names.nsf"; GRP := "Státní svátky"; ss := @DbLookup("":""; DB; "Holidays"; GRP; 2); os := @DbLookup("":""; DB; "Holidays"; "Ostatní svátky"; 2); szn := @Text(ss:os); test := @ReplaceSubstring(szn;@Word(szn;".";3);@Text(@Year(@Now))); sw := @Sort(@ToTime(@Unique(test))); |
mastnak | Update |
08.12.2016 12:40:43
ID: 3660.1
| Spachal jsem nasledujici, ale pocita to minusovy hodnoty pokud svatek vychazi na vikend. Takze ted koukam, jak bych vypsal datumy vikendu, abych pak udelal jen replace ze vsech dnu. Nejakej tip???
DB := "aaa":"names.nsf"; GRP := "Státní svátky"; ss := @DbLookup("":""; DB; "Holidays"; GRP; 2); os := @DbLookup("":""; DB; "Holidays"; "Ostatní svátky"; 2); szn := @Text(ss:os); test := @ReplaceSubstring(szn;@Word(szn;".";3);@Text(@Year( @Now))); sw := @Sort(@ToTime(@Unique(test)));
pocVikendu := @ToNumber(@BusinessDays(vytvoreni;Odeslano;2 : 3 : 4 : 5: 6));
hodinyVikend := pocVikendu * 24;
dnyVse := @Explode( @TextToTime("["+@Text(vytvoreni)+"-"+@Text(Odeslano )+"]"));
DnyBezSvatku := @Trim(@ReplaceSubstring( @Text(dnyVse) ; @Text(sw) ; "" )) ;
hodPrvniDen := ([00:00:00] - @Time(vytvoreni))/60/60 + 24;
hodDruhyDen := ([00:00:00] - @Time(Odeslano))/60/60 * -(1);
hodinyPracDny := (@ToNumber(@Count(DnyBezSvatku))*24 ) - @ToNumber(hodinyVikend);
celkem :=( hodinyPracDny - (@ToNumber(hodPrvniDen) + @ToNumber(hodDruhyDen)) ) ;
@If( @Date(Odeslano) = @Date(vytvoreni); (Odeslano-vytvoreni)/3600; celkem )
|
VZ | Vyřadit ze seznamu svátky o víkendech? |
09.12.2016 10:29:22
ID: 3660.2
| Co třeba vzít seznam všech svátků a na ně použít @Weekday. Když to bude 1 nebo 7, tak ten konkrétní datum svátku vychází na neděli anebo sobotu a tak by se měl z toho seznamu svátků vyřadit.
Na to by byla možná ideální funkce @Transform, tedy něco jako @Transform(sw; "swday"; @If(@Weekday(swday) = 1 :7; @Nothing; swday), ale to @Nothing dělalo problémy v seznamech, které byly typu datetime. Padalo na nějaké chybě, že seznam neobsahuje hodnotu typu datetime nebo něco takového, takže místo @Nothing byle lepší nějaký nereálný datum, např.[1.1.1900], který se pak v dalším zpracování přeskakoval. Nebo by to šlo možná obejít nějakou konverzí na text a zase zpět na datum/čas. Tzn. možná udělat takové vyřazení víkendových svátků už v szn ještě před naplněním proměnné test. |
mastnak | re |
09.12.2016 10:53:56
ID: 3660.3
| Castecne jsem to vyresil takhle pocVikendu := @ToNumber(@BusinessDays(vytvoreni;Odeslano;2 : 3 : 4 : 5: 6; sw));
Ale to me vynecha vikend, pokud nekdo treba z domu neco vyresil i o svatku o vikendu. No musim to jeste znova cely promyslet. Ale diky za tim s tim Weekday jsem to uz taky zvazoval. |
mastnak | re |
16.12.2016 12:03:55
ID: 3660.4
| Potreboval bych zase radu. Mam tenhle kod, kterej posune datum vytvoreni na dalsi pracovni den. Ted si lamu hlavu jak udelat to same, pokud mam seznam svatku, aby se datum posunul na prvni pracovni den. Nema nekdo napad?
REM { pokud je zapsano o vikendu , nastavi vytvoreni na dalsi pracovni den }; @If( @Weekday(vytvoreni) = 7; dvytv := @ToTime("[" + @Text(@Day(@Adjust(vytvoreni;0;0;2;0;0;0))) +"." + @Text(@Month(@Adjust(vytvoreni;0;0;2;0;0;0))) + "." + @Text(@Year(@Adjust(vytvoreni;0;0;2;0;0;0))) + " 00:00:00" +"]"); @Weekday(vytvoreni) = 1; dvytv := @ToTime("[" + @Text(@Day(@Adjust(vytvoreni;0;0;1;0;0;0))) +"." + @Text(@Month(@Adjust(vytvoreni;0;0;1;0;0;0))) + "." + @Text(@Year(@Adjust(vytvoreni;0;0;1;0;0;0))) + " 00:00:00" +"]"); REM { pokud je zapsano o vikendu , nastavi vytvoreni na dalsi pracovni den }; |
mastnak | Snad final |
17.12.2016 21:34:20
ID: 3660.5
| Dela to snad uz to co se po me chtelo, svatky a vikendy to posune na nejblizsi pracovni den. Mam nekolik verzi, ze se pouzijou puvodni casy pokud se zapsalo o vikendu nebo svatku, ze se nastavi cas na 00:00 nebo 07:00.
REM { seznam svatku }; DB := "aaa/bbb":"names.nsf"; GRP := "Státní svátky"; ss := @DbLookup("":""; DB; "Holidays"; GRP; 2); os := @DbLookup("":""; DB; "Holidays"; "Ostatní svátky"; 2); szn := @Text(ss:os); test := @ReplaceSubstring(szn;@Word(szn;".";3);@Text(@Year( @Now))); sw := @Sort(@ToTime(@Unique(test))); holidays:=@Text(@Exp lode(sw));
REM { pokud je zapsano o vikendu nastavi vytvoreni na dalsi pracovni den 07:00 }; @If( @Weekday(@Date(vytvoreni)) = 7; dvytv := @TextToTime("[" + @Text(@Day(@Adjust(vytvoreni;0;0;2;0;0;0))) +"." + @Text(@Month(@Adjust(vytvoreni;0;0;2;0;0;0))) + "." + @Text(@Year(@Adjust(vytvoreni;0;0;2;0;0;0))) + " 07:00:00:00" +"]"); @Weekday(vytvoreni) = 1; dvytv := @TextToTime("[" + @Text(@Day(@Adjust(vytvoreni;0;0;1;0;0;0))) +"." + @Text(@Month(@Adjust(vytvoreni;0;0;1;0;0;0))) + "." + @Text(@Year(@Adjust(vytvoreni;0;0;1;0;0;0))) + " 07:00:00:00" +"]"); dvytv := vytvoreni);
REM { pokud je zapsano o svatku, nastavi vytvoreni na dalsi pracovni }; @If( @IsNotMember(@Text(@Date(dvytv));@Text(sw)) ; dvytv := dvytv ; @Do( Count:= 0; noofdays:=0; @While(0 >=noofdays; noofdays:=@BusinessDays (dvytv;@Adjust (dvytv;0;0;count;0;0;0);1:7;@Transform(holidays; "x";@TextToTime(x) )); Count := Count+ 1); adjusteddate:=@Adjust (dvytv;0;0;count -1;0;0;0); dvytv := adjusteddate ) );
REM { pokud je ukonceno o vikendu nastavi ukonceni na dalsi pracovni den cas zustava }; @If( @Weekday(Odeslano) = 7; dodesl := @Adjust(Odeslano;0;0;2;0;0;0); @Weekday(Odeslano) = 1; dodesl := @Adjust(Odeslano;0;0;1;0;0;0); dodesl := Odeslano);
@If( @IsNotMember(@Text(@Date(dodesl)); @Text(sw)); dodesl := dodesl ; @Do( Count:= 0; noofdays:=0; @While(0 >=noofdays; noofdays:=@BusinessDays (dodesl;@Adjust (dodesl;0;0;count;0;0;0);1:7;@Transform(holidays; "x";@TextToTime(x) )); Count := Count+ 1); adjusteddate:=@Adjust (dodesl;0;0;count -1;0;0;0); dodesl := adjusteddate ) );
REM { naplneni promennych }; startDate := @Date(dvytv); endDate := @Date(dodesl);
startTime := @Time(dvytv); endTime := @Time(dodesl);
@If( startDate = endDate; @Do( hodPrvniAposledniDen := @Round( (endTime - startTime)/3600 ; 0,01) ; hist := "Hodiny zapsano a vyreseno stejny den : " + @Text(hodPrvniAposledniDen); FIELD seznam := seznam : hist );
@Do(
pocVikendu := @ToNumber(@BusinessDays(startDate;endDate;2 : 3 : 4 : 5: 6)); pocPracDniBezSvatku := @ToNumber(@BusinessDays(startDate;endDate;1 : 7;sw)); hodinyVikend := pocVikendu * 24; hodPrvniDen := ([23:59:59] - startTime)/3600; hodDruhyDen := (endTime - [00:00:00] )/3600 ; hodinyPracDny := (pocPracDniBezSvatku*24 ) - @ToNumber(hodinyVikend); celkem :=@Round( ( @ToNumber(hodinyPracDny) + ( hodPrvniDen + hodDruhyDen)) ; 0,01);
hist := "Hodiny za vsechny dny ne stejny den : " + @Text(celkem); FIELD seznam := seznam : hist)
) |