|
Statystyka zatrudnienia - czas wykonywania raportu
Autor |
Wiadomość |
MaciekCh
Rejestracja: 2014-10-13, 11:23 Posty: 24 Pomógł: 2
|
Statystyka zatrudnienia - czas wykonywania raportu
Witam Mam taki problem, z programu Kadry i Płace generuję raport Statystyka zatrudnienia i proces generowania raportu trwa bardzo długo, około godziny na końcówce i 15/20 minut na serwerze
wersja programu 2016, pervasiwe serwer 12 serwer Lenovo ThinkServer TD350 Intel Xeon E5-2600 v3 8GB RAM Windows Serwer 2012 x64
Końcówki Lenovo ThinkCentre Edge E73 Intel Core i5-4400 8GB RAM Windows 8.1 x64
na komputerach działa eset endpoint security, sprawdzałem z wyłączonym i całkowicie usuniętym zmieniałem ustawienia serwera pervasiwa według porad na forum, ustawienia portu tylko tcp/ip, nasłuch na konkretnym adresie, bufor ustawiony na większy od BD kilkukrotnie przeinstalowywałem pervasiva
wielkość BD KiP to trochę ponad 2GB na serwerze jest jeszcze Symfonia FK z baza ponad 3GB też na pervasive i działa poprawnie oprócz tego w usługach jest jeszcze SQL Express, BD dla Platnika i Uplooka, serwer jest kontrolerem domeny
próbowałem wykonywać ten sam raport na innym komputerze (na świeżo zainstalowanym systemie, tylko symf KP i Pervasive server ) i też działało dość długo około pół godziny
nie wiem czy to błąd z BD, czy jakieś ograniczenie i trzeba zmigrować do ERP, ludzie z pomocy technicznej robią wszystko żeby tylko nie pomóc, w kółko te same pytania, rejestracja zgłoszenia czekanie i brak odpowiedzi...
|
2016-06-27, 09:44 |
|
|
Autor |
Wiadomość |
Mix-soft.pl
|
|
|
Jarek75
Ekspert
Rejestracja: 2009-03-07, 11:13 Posty: 597 Pomógł: 34
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
(1)
Też kiedyś zgłaszałem ten błąd. Raport robił się bardzo długo po przekroczeniu jakiejś granicznej liczby osób, może 64. Chyba jakiś cache danych kadrowych się przepełniał. Nie udało mi się jednak nic wyegzekwować. Zdaje się, że informatyk wpuścił panią na serwer, a ostatecznie zmigrowali do ERP.
Można zrobić tak: potwierdzić moją diagnozę, poprzez podzielenie raportu na 2 przebiegi (po połowie pracowników) i stwierdzenie, że wtedy robi się 10 razy szybciej. Czyli coś nie tak z algorytmem programu. Jeżeli klient zgodzi się na wysłanie bazy, to niech się tym zajmą.
|
2016-06-27, 10:05 |
|
|
MaciekCh
Rejestracja: 2014-10-13, 11:23 Posty: 24 Pomógł: 2
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Sprawdziłem, faktycznie jak daje 50 pracowników to robi raport migiem, od 100 już idzie ponad 5 minut a według grupy mieli niemiłosiernie przynajmniej pół godziny.
Czyli jedyną możliwością jest migracja na ERP? Dla pervasiva nic nie da się zdziałać?
|
2016-06-27, 14:30 |
|
|
Jarek75
Ekspert
Rejestracja: 2009-03-07, 11:13 Posty: 597 Pomógł: 34
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Trzeba przycisnąć Sage. To nie błąd w Pervasive, nie w sieci, nie za duża baza, tylko błąd w aplikacji Sage.
|
2016-06-27, 15:02 |
|
|
MaciekCh
Rejestracja: 2014-10-13, 11:23 Posty: 24 Pomógł: 2
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
W takim razie lipa, trzeba będzie przejść na ERP, bo wątpię żeby sage kiedykolwiek poprawił błędy. Dzięki za pomoc.
|
2016-06-28, 08:47 |
|
|
Jarek75
Ekspert
Rejestracja: 2009-03-07, 11:13 Posty: 597 Pomógł: 34
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Muszę jednak stanąć trochę w obronie Sage. Jeżeli wyślesz bazę i opiszesz problem - są duże szanse, że naprawią. Czasem ciężko jest przedrzeć się przez pierwszy bastion obronny hotline, ale uważam, że pracują profesjonalnie i jak uda im się odtworzyć błędne działanie programu - poprawiają.
W Twoim przypadku, jak masz więcej niż 100 ludzi, to w sumie i tak i tak musisz przejść na ERP.
|
2016-06-28, 09:10 |
|
|
MaciekCh
Rejestracja: 2014-10-13, 11:23 Posty: 24 Pomógł: 2
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Wydaje mi się że problemem będzie styl pracy księgowej, która natworzyła różnych grup, list i program mieli długo kiedy ma ponad 100 pracowników do wyliczenia za jednym zamachem, kiedy pracowała na małej BD jakoś to działało (~5-10 minut na kilkadziesiąt osób).
|
2016-06-29, 09:13 |
|
|
szepczący
Rejestracja: 2016-05-17, 20:41 Posty: 392 Pomógł: 75
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Styl pracy na pewno ma wpływ na wydajność (przykładowo więcej okresów płacowych ma znaczący wpływ), ale aplikacja i tak powinna dawać radę. Zgaduję, że w tym przypadku to nie jest do końca błąd aplikacji jako takiej, tylko raportu Statystyka zatrudnienia. Jeśli dobrze pamiętam, aplikacje KDP / KDF domyślnie przechowują w cache dane ostatnio "odwiedzonych" 64 osób, wszelkie operacje na tych osobach wykonywane są znacznie szybciej. Zwykle raporty różnego typu działają na zasadzie takiej, że odczyt pracowników wykonują po kolei - w sensie pętla główna po pracownikach, wewnątrz tej pętli algorytm który coś robi per pracownik. Ale z tego co widzę Statystyka zatrudnienia wykonuje się odwrotnie - iteruje się po dniach kalendarzowych, a następnie wykonuje odczyty wszystkich pracowników dla których wykonywany jest raport. W praktyce oznacza to, że już przy 65 osobach wybranych cache'owanie na nic się nie przydaje i musi wykonywać odczyty z bazy nonstop...
Zerknę później na kod, może da się ten kawałek bez strat dla wyników na szybkości przepisać.
|
2016-06-29, 12:22 |
|
|
szepczący
Rejestracja: 2016-05-17, 20:41 Posty: 392 Pomógł: 75
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
(1)
Zrobiłem poprawkę, wyniki wyszły mi dobre ale ktoś mógłby to przetestować. Jeśli chodzi o czas wykonania to u mnie skrócił się o ok. 95% (KDP2016D + pervasive, próbka 68 osób), wystarczyło odwrócenie kolejności czynności. Kod: //1,"statzatrplus.sc","Statystyka zatrudnienia plus","Zestawienia/Dla kierownika",0,2.1.1,SYSTEM #include "pdfparam.sci" #define OK 2 #define ANULUJ -1
#include "strings.sci" #include "funprac.sci" #include "funeksp.sci" #include "table.sci" #include "hf_graf.sci"
int iDrukujSzarosci,iUlamki = 1 int rv
float sub EtatStrToFloat(String sval) float liczniki float mianowniki buf = sval if !((find regular"{:d#}//{:d#}") == "") then liczniki = Val(regular 1) mianowniki = Val(regular 2) else liczniki =Val(buf) mianowniki = 1 endif EtatStrToFloat=liczniki/mianowniki endsub
string sub EtatStrToStr(String sval,int ulamek) float liczniki float mianowniki buf = sval if !((find regular"{:d#}//{:d#}") == "") then if ulamek==0 then EtatStrToStr=sval else liczniki = Val(regular 1) mianowniki = Val(regular 2) EtatStrToStr=using "%.3f",(liczniki/mianowniki) endif else if ulamek==0 then liczniki =Val(sval) EtatStrToStr =ToFactorFormat(liczniki,1) else EtatStrToStr=sval endif endif
endsub
string sOd,sDo,sRok, sMiesiac int idOk string sKomunikat = "Nieprawidłowa wartość pola \"%s\"." date dataDo date dat
int sub OnCommand(int id,int msg) if idOk == id then Save endif endsub
int sub Sprawd() dat.Set(Val(sRok),Val(sMiesiac),Val(sOd)) dataDo.Set(Val(sRok),Val(sMiesiac),Val(sDo)) Sprawd=0 if dat.Valid() then if dataDo.Valid() then if dat.IS_LE(dataDo) then Sprawd=OK else message "Wartość \"dni od\" musi być miniejsza równa od wartości \"do\"." endif else message using sKomunikat, "do" endif else message using sKomunikat, "dni od" endif endsub
long IdSk1 InfoPrac prac
if !(IdSk1 = IdSkladnika("Umowa o pracę")) then message "\"brak elementu Umowa o prace\"{{icon=s}}" : error "" if Arg4 != "" then sOd = Arg4 else sOd = DataOkresu(Okres()) sOd += "-01" endif dat.FromStr(sOd) sRok = using"%d",dat.year sMiesiac = using"%d",dat.month sOd = using"%d",dat.day sDo = sOd Form "Statystyka zatrudnienia", 290,200 Edit "Rok", sRok,70,10,43,20, (len(find regular "^:d:d:d:d$") && Val(sRok)>1950 && Val(sRok)<2050), using sKomunikat, "Rok" Edit "Miesiąc", sMiesiac, 172, 10, 30,20,(len(find regular "(^:d$)|(^:d:d$)") && Val(sMiesiac)>0 && Val(sMiesiac)<13), using sKomunikat, "Miesiąc" Edit "Za dni od",sOd,70,35,30,20,(len(find regular "(^:d$)|(^:d:d$)") && Val(sOd)>0 && Val(sOd)<32), using sKomunikat, "dni od" Edit "do",sDo,130,35,30,20, (len(find regular "(^:d$)|(^:d:d$)") && Val(sDo)>0 && Val(sDo)<32), using sKomunikat, "do" ChkBox "Eksport do MSExcel", bCzyExcel, 40, 60, 200, 20 ChkBox "Drukuj wypełnienia", iDrukujSzarosci, 40, 85, 120, 20 ChkBox "Ułamki prezentuj w postaci dziesiętnej", iUlamki, 40, 110, 200, 20 idOk = Button "&OK",40,135,85,25,Sprawd() Button "&Anuluj",165,135,85,25,ANULUJ rv = ExecForm(OnCommand) if rv == ANULUJ then error ""
string sOd1 = dat.ToStr()
string tmpFileName //tmpFIleName=GetTempFileName("xml","C:\\") tmpFIleName=GetTempFileName("xml")
XmlParser XMLParss MapValue MapaEtatow
MapaEtatow.type(long) MapaEtatow.Clear() int ileWartMap //zmienne z XML'a long lile string etat int bile int betat long SumIlePrac float SumIleEtat date DataSumy
int iTworzArkusz = 0
int ile,i, iluPracownikow
#ifdef FORTE
//tutaj genryjemy sobie XML'a XmlAdoExport xmlexp
Int Sub AddParamsPracownicy(String sod, string sdo) long idprac long idgrupy = val( Arg0 ) int typ = val( Arg1 )
xmlexp.StartXMLElement("PRACOWNICY") if !idgrupy && !typ then message "sErrTylkoZOknaPrac" : error "" if !SetGroup( idgrupy, typ, TR_PRACOWNICY ) then message "sErrBlednaGrupa" : error "" //if !SetGroup( idgrupy, typ, TR_PRACOWNICY , okres_od, okres_do ) then message sErrBlednaGrupa : error "" idprac= GetFirst() while idprac xmlexp.XMLElement("id",idprac) idprac = GetNext() wend xmlexp.EndXMLElement("PRACOWNICY") endsub
xmlexp.SetXmlOutputFile(tmpFIleName) xmlexp.StartXMLParams()
AddParamsPracownicy(dat.ToStr(),dataDo.ToStr()) xmlexp.XMLElement("data_od",dat.ToStr() ) xmlexp.XMLElement("data_do",dataDo.ToStr() ) xmlexp.EndXMLParams() xmlexp.ExecuteCommand("xml_kd_StatystykaZatrudnienia")
#else
//error("TO JEST BETRIF")
HrMgr hMgr HrComponent hComp HrValue hVal XMLFile xmlf
// int i, ileWartMap // int iKtWie = 0 // float fIloscEtatow
xmlf.Encoding("utf-8") xmlf.open(tmpFIleName) //<STATYSTYKA_ZATRUDNIENIA><DATA data="2005-06-01"><DZIAL nazwa="Administracja"> xmlf.StartElement("STATYSTYKA_ZATRUDNIENIA")
//debugger PobierzPracKadrZGrupy(IdSk1, dat.ToStr(), datado.ToStr()) iluPracownikow = MapaPracownikow.Size()//pracownicy w osobach MapaEtatow.Clear() date dtTemp hMgr.AddHRComponent(IdSk1)
dataPD = dat
for i = 1 to i > iluPracownikow idprac = Val(MapaPracownikow.GetKey(i)) Pracownik(prac, idprac) hMgr.FreeValues () hMgr.SetEmpId(idprac) dtTemp = dat
while (dtTemp.IS_LE (dataDo)) sOd = dtTemp.ToStr() hMgr.LoadValues(sOd,sOd) hMgr.GetComponent(hComp,IdSk1) If hComp.GetValuesCount() > 0 then hComp.GetValue(hVal, hComp.GetValuesCount(), hComp.GetAttrIndexById(8490)) if hval.Value != 0 then ile = MapaEtatow.Index(sOd+"|"+hVal.StrValue) if (ile == 0) then MapaEtatow.Set(sOd+"|"+hVal.StrValue,1) else ile = MapaEtatow.Get(sOd+"|"+hVal.StrValue) ile += 1 MapaEtatow.Set(sOd+"|"+hVal.StrValue,ile) endif EndIf endif // iKtWie+=1 dtTemp.AddDays(1) wend
next i
// <ZATRUDNIENIE wymiar="0" liczba_etetow="1"> ileWartMap=MapaEtatow.Size() dtTemp = dat while (dtTemp.IS_LE (dataDo)) sOd = dtTemp.ToStr() xmlf.Attribute("data",sOd) xmlf.StartElement("DATA") xmlf.Attribute("nazwa","Razem") xmlf.StartElement("DZIAL") for i=1 to i >ileWartMap buf = MapaEtatow.GetKey(i) if (find regular "{[~/#]#}/|{[~/#]#}") != "" then if (regular 1) == sOd then xmlf.Attribute("wymiar" ,(regular 2)) xmlf.Attribute("liczba_etetow",MapaEtatow.Get(i)) xmlf.Element("ZATRUDNIENIE") endif endif // xmlf.EndElement("ZATRUDNIENIE") next i xmlf.EndElement("DZIAL") xmlf.EndElement("DATA") dtTemp.AddDays(1) wend
xmlf.EndElement("STATYSTYKA_ZATRUDNIENIA") xmlf.Close() MapaEtatow.Clear() #endif
//utworzenie mapy etatów
//<STATYSTYKA_ZATRUDNIENIA><DATA data="2005-06-01"><DZIAL nazwa="Administracja"><ZATRUDNIENIE wymiar="0" liczba_etetow="1">
int sub EndElem(string sTagName,string strVal ) if UCASE(sTagName)=="ZATRUDNIENIE" then if bile>0 && betat>0 then if MapaEtatow.Index(etat)== 0 then MapaEtatow.Set(etat,0) endif else Error ("Nie poprawnie zdefiniowany XML") endif lile=0 etat="" bile=0 betat=0 endif endsub
int sub Attrib(string sTagName,string sAtrName ,string strVal ) if UCASE(sTagName)=="ZATRUDNIENIE" then if sAtrName=="wymiar" then etat=EtatStrToStr(strVal,1) betat=1 endif if sAtrName=="liczba_etetow" then lile=Val(strVal) bile=1 endif endif if UCASE(sTagName)=="DATA" then if sAtrName=="data" then DataSumy.FromStr(strVal) endif endif endsub
//Najpierw robimy sobie mapke etatuf posortujemy ja a potem wydrukujemy
XMLParss.OnEndElement( EndElem ) XMLParss.OnAttribute( Attrib) XMLParss.Parse(tmpFileName)
//mamy tabliczkem etetuf wiec mozemy zacac dalej walczyc
MapaEtatow.Sort (1)
if MapaEtatow.Size() <= 12 then str.wydruk(0,-1,0) else str.wydruk(0,-1,1) endif
#include "fonty.sci" Strona 50,230,50,100 if MapaEtatow.Size() == 0 then print "Brak pracowników do statystyki" end endif //int iTworzArkusz = 0 ileWartMap = MapaEtatow.Size()
if (sOd1 == dataDo.ToStr()) then nazwaRaportu = "Statystyka zatrudnienia w dniu "+ sOd1 else nazwaRaportu = "Statystyka zatrudnienia za okres od " + sOd1 + " do "+dataDo.ToStr() endif if (sNazwaGrupy) then nazwaRaportu += " dla grupy "+sNazwaGrupy endif
long lKolorWypRamki =-1 int dn,gl,gl1 gl = 130 gl1 = 170 dn = 120//(str.szer - 430)/ileWartMap+1 //if dn > 120 then dn = 120 if iDrukujSzarosci then lKolorWypRamki = RGB(240, 240, 240) int stlNormalCentered = styl( tekst1, 0 ) int tblH = Init( 1, 10) AddKol(gl, stlNormalCentered,lKolorWypRamki) AddKol(gl1, stlNormalCentered,lKolorWypRamki) AddKol(gl, stlNormalCentered,lKolorWypRamki) For i = 4 to i > ileWartMap+3 AddKol(dn,stlNormalCentered,lKolorWypRamki) Next i Define()
int tbl1 = Init( 1, 10) AddKol( gl, stlNormalCentered, lKolorWypRamki ) AddKol( gl1, stlNormalCentered, -1) AddKol( gl, stlNormalCentered, -1) For i = 4 to i > ileWartMap+3 AddKol(dn,stlNormalCentered,-1) Next i Define()
int sub Header() #ifdef STORE Store() #endif int ileWart = MapaEtatow.Size() ramka #H SubHead() koniec CreateTable(tblH) SetKol(1, "Dnia") SetKol(2, "Liczba\nzatr.\nw etatach") SetKol(3, "Liczba\nzatr.\nw osobach") for i = 4 to i > ileWart+3 SetKol(i,"wymiar " + EtatStrToStr( MapaEtatow.GetKey(i-3),iUlamki)) next i Show( 0,str.Pozycja(#Y)) #ifdef STORE ReStore() #endif endsub
int sub Footer() ramka #F SubFoot() koniec endsub
int sub FormatujArkusz() d.Rows("2:2").Select d.Selection.NumberFormat = "@" d.Columns("B:B").Select d.Selection.NumberFormat = "@" endsub
int iWiersz = 0 int sub HeaderExc() int ileWart = MapaEtatow.Size() string sWieHead = "Dnia:|Liczba zatr. w etatach|Liczba zatr. w osobach|" for i = 1 to i > ileWart sWieHead+=MapaEtatow.GetKey(i)+"|" next i iWiersz += 1 ZapiszWierszS(iWiersz, 1, sWieHead) endsub
int iPrzycisk if (ileWartMap > 22)then//Jeżeli ilość rodzajów etatów jest większa //od 22 wówczas rezygnujemy z wydruku w //symfonii i eksportujemy do excel iPrzycisk = message "Ilosc rodzajów etatów jest większa od 22\nRaport może zostać wykonany wyłącznie przez eksport do MSExcel\nCzy chcesz kontynuować wykonanie raportu? DefBtn: &Tak=1 Btn: &Anuluj=2 Ico:?" if (iPrzycisk == 1) then bCzyExcel = 1 TworzArkusz() FormatujArkusz() ScalajKomorki(1, 1, ileWartMap+3) iWiersz += 1 ZapiszWiersz(iWiersz, 1, nazwaRaportu+"|") HeaderExc() iTworzArkusz = 1 else // error"" endif else if bCzyExcel then TworzArkusz() FormatujArkusz() ScalajKomorki(1, 1, ileWartMap+3) iWiersz += 1 ZapiszWartosc(iWiersz, 1, nazwaRaportu) HeaderExc() iTworzArkusz = 2 endif Header() endif
int sub PiszWiersz(Date datawr, int czyExp,string sIleEtat, float ilePrac)
int IloscWart = MapaEtatow.Size() int j string sWiersz
// find regular "/-{:d^2}$" if (iTworzArkusz != 1) then CreateTable(tbl1) SetKol(1, (using"%d",datawr.day)) SetKol(2,sIleEtat) SetKol(3,(using"%d",ilePrac)) for j = 1 to j > IloscWart // if !((j+3)>size(stabWyn)) then SetKol(j+3,(using"%d", MapaEtatow.Get(j))) // endif next j Show( 0,str.Pozycja(#Y)) if ( iTworzArkusz == 2 ) then sWiersz = (using"%d",datawr.day)+"|" sWiersz += sIleEtat+"|" sWiersz += (using"%d",ilePrac)+"|" for j = 1 to j > IloscWart sWiersz += (using"%d",MapaEtatow.Get(j))+"|" next j iWiersz += 1 ZapiszWiersz(iWiersz, 1, sWiersz) endif else sWiersz = (using"%d",datawr.day)+"|" sWiersz += sIleEtat+"|" sWiersz += (using"%d",ilePrac)+"|" for j = 1 to j > IloscWart sWiersz += (using"%d",MapaEtatow.Get(j))+"|" next j iWiersz += 1 ZapiszWiersz(iWiersz, 1, sWiersz) endif endsub
int sub EndElemPas2(string sTagName,string strVal ) string sIleEtat if UCASE(sTagName)=="ZATRUDNIENIE" then if bile>0 && betat>0 then SumIlePrac+=lile SumIleEtat+=lile*EtatStrToFloat(etat) if MapaEtatow.Index(etat)!= 0 then // jet niepotrzebne ale moze cos przeo lile+=MapaEtatow.Get(etat) MapaEtatow.Set(etat,lile) else Error ("Zmiana zawartosci pliku XML") endif else Error ("Nie poprawnie zdefiniowany XML") endif lile=0 etat="" bile=0 betat=0 endif if UCASE(sTagName)=="DATA" then //Tu koniczymy przetwarzanie dla danej daty if iUlamki then sIleEtat=using "%.3f",SumIleEtat else sIleEtat=ToFactorFormat(SumIleEtat,1)//WyliczIloscEtatow(MapaEtatow) endif
PiszWiersz(DataSumy,iTworzArkusz,sIleEtat,SumIlePrac) //SumIleEtat,0)// // Wyczyscic mape etatuf -> wpisac zera for SumIlePrac = 1 to SumIlePrac > ileWartMap MapaEtatow.Set(MapaEtatow.GetKey(SumIlePrac),0) next SumIlePrac SumIlePrac=0 SumIleEtat=0 endif endsub
//Tu przeparsowac jesecze raz zeby wypluc wyniczki XMLParss.OnEndElement( EndElemPas2 ) XMLParss.OnAttribute( Attrib) XMLParss.Parse(tmpFileName)
Delete File tmpFileName
if (iTworzArkusz != 1) then Footer() if (iTworzArkusz == 1 || iTworzArkusz == 2) then d.visible = 1 PD()
Co do zgłaszania błędów Jarek ma pełną rację - zgłaszać należy wszystko, błędy nie zgłaszane same nie znikają :)
|
2016-06-29, 14:22 |
|
|
MaciekCh
Rejestracja: 2014-10-13, 11:23 Posty: 24 Pomógł: 2
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Problem był już zgłaszany "ileśtam" razy, był raz przedstawiciel taki co to po partnerach jeździ i nie mógł się nadziwić czemu tak wolno.
Zrobiłem test na bazie zmigrowanej do ERPa, czas wykonywania tego samego raportu to kilka sekund, inne raporty też trochę żwawiej działają ale właśnie ten jeden jest głównym problemem.
Dzięki za skrypt raportu, potestujemy i odpiszę jak działa.
|
2016-07-01, 17:02 |
|
|
szepczący
Rejestracja: 2016-05-17, 20:41 Posty: 392 Pomógł: 75
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Fragment kodu z komentarzem z oryginalnego raportu: Kod: #ifdef FORTE (...) #else
//error("TO JEST BETRIF") Mówi w zasadzie wszystko ;) część dla ERP/Forte jest OK, a kawałek dla Symfonii zrobiony na szybkości, testy na bazie "demo" musiały przejść poprawnie i szybko bo jest tam za mało pracowników.
|
2016-07-01, 17:41 |
|
|
MaciekCh
Rejestracja: 2014-10-13, 11:23 Posty: 24 Pomógł: 2
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Witam Niestety nie mogłem wcześniej napisać, wersja raportu Szepczącego działa dużo szybciej niż oryginalna, na końcówce dla pojedynczego pracownika raport za miesiąc wykonywał się około sekundy, oryginalny około 10 sekund. Dla wszystkich (103) 10/15 minut, nie wiem od czego ten rozrzut, wybrałem w grupach wszyscy i zrobiłem 3 razy, raz za razem, nic innego w międzyczasie nie było robione. Dla pojedynczych grup poniżej 10 minut. Niestety jest też niewielka różnica w wynikach raportów, druga wersja raportu pod koniec wybranego okresu 'zgubiła' jednego pracownika. Sprawdzałem z oryginalnym i tam przez cały okres jest identyczna liczba pracowników, na drugim pod koniec miesiąca jednego zabrakło. Chyba że oryginał bierze pierwszą liczbę i przyjmuje tą wartość dla każdego dnia okresu a drugi podaje faktyczną ilość osób na każdy dzień. (były jakieś rotacje z zastępstwami które jeszcze trzeba dokładnie sprawdzić)
W tym momencie nasuwa mi się kolejne pytanie, kiedy jeden pracownik ma wolne i ktoś inny go zastępuje to symfonia zlicza etaty obu pracowników zamiast tylko jednego, z kolei nie chcę usuwać z zaznaczenia 'wolnego' pracownika bo wtedy nie zgodzi się ogólna liczba pracowników, jest jakaś możliwość zablokowania naliczania takiego podwójnego etatu?
|
2016-07-15, 16:23 |
|
|
szepczący
Rejestracja: 2016-05-17, 20:41 Posty: 392 Pomógł: 75
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Co do zgubionej pojedynczej osoby jeśli tak jest potrzebowałbym jakiś opis sytuacji, w której to się stało i (o ile da się sprawdzić) jakieś szczegóły o datach z umowy o pracę i wymiarze etatu osoby, która nie została uwzględniona. Na danych z bazy demo wyniki były ogólnie poprawne.
Co do pomijania osób to choć symfonia przechowuje informację w umowie o pracę na zastępstwo kto jest zastępowany, to ta dana nie jest powiązana z ID tego drugiego pracownika - więc dałoby się w zasadzie rozpoznać po nazwisku ale nie jest to 100% pewne. Druga rzecz to rozpoznawanie stosunku pracy - ten raport w zasadzie jedyne co robi to sprawdza pole "wymiar etatu" u osób i grupuje wyniki wg. wymiaru i dat. W efekcie uwzględnia np. osoby na długich nieobecnościach (które czasami trzeba pominąć w niektórych deklaracjach GUS) czy urlopach bezpłatnych. Można by było niby wpisać 0 wymiar etatu na czas takiej zastępowanej nieobecności ale to wprowadzi ewentualność wystąpienia innych poważniejszych błędów...
Podsumowując - dałoby się, ale trzeba by było trochę przepisać raport tak aby "sprytniej" badał te dane - szukając np. zastępstw i w momencie w którym zastępstwo występuje pomijał oryginalną osobę. Dodatkowo można by było dodać obsługę niektórych zdarzeń zwyczajowo pomijanych przy takich statystykach (np. urlop bezpłatny czy wychowawczy), jakbyś był zainteresowany to najlepiej byłoby skontaktować się z jednym z ekspertów.
Edit: Co do czasów wykonania nie było tak, że za pierwszym razem 15 minut, a za kolejnymi dwoma już trochę krócej? Takie czasy byłyby zgodne ze sposobem cache'owania danych.
|
2016-07-15, 16:43 |
|
|
MaciekCh
Rejestracja: 2014-10-13, 11:23 Posty: 24 Pomógł: 2
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Nie wiem w jaki sposób mógłbym ustalić kto nie został w raporcie policzony, chyba gdyby była możliwość wykonania raportu krok po kroku i żeby wypisywał w konsoli co się dzieje. Ogólnie sytuacja wygląda tak: raport generuje tabele z czterema kolumnami: dzień | liczba etatów | liczba pracowników | nazwy czwartej nie pamiętam; jeśli stan osobowy firmy się nie zmieniał to kolumny 3 i 4 powinny mieć cały czas tę samą wartość, a tutaj od 1 do 27 jest odpowiednio 78 (dla 3) i 76 (dla 4) a 28-30 o jeden mniej. Raport wykonany tylko dla grupy pracownicy etatowi za czerwiec, w zwykłej statystyce żadna wartość się nie zmienia. Wykonałem też raport za jeden dzień 28.06 tam gdzie jest pierwsza inna wartość i wyniki są takie same, jakby ubyło od tego dnia jednego pracownika. Co ciekawe zniknął pracownik ale liczba godzin etatów (druga kolumna) się nie zmieniła.
|
2016-07-15, 18:04 |
|
|
szepczący
Rejestracja: 2016-05-17, 20:41 Posty: 392 Pomógł: 75
|
Re: Statystyka zatrudnienia - czas wykonywania raportu
Ta ilość osób w etatach to iloczyn - dany wymiar etatu * ilość osób na nim w danym dniu. Jak sprawdzam to nie udało mi się wygenerować takiej sytuacji aby te liczby były niezgodne... możesz sprawdzić, czy dla tych dat od 28 czerwca liczba w 2 kolumnie = liczba z 3 * etat tej kolumny + liczba z 4 * etat tej kolumny itp?
|
2016-07-15, 20:50 |
|
|
Kto jest online |
Użytkownicy przeglądający to forum: Nie ma żadnego zarejestrowanego użytkownika i 25 gości |
|
Nie możesz tworzyć nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz dodawać załączników
|
|
|
|