Posty bez odpowiedzi |oraz Aktywne tematy Dzisiaj jest 2024-11-25, 08:11x



Odpowiedz w temacie  [ Posty: 21 ]  Przejdź na stronę 1, 2  Następna
Statystyka zatrudnienia - czas wykonywania raportu 
Autor Wiadomość

Rejestracja: 2014-10-13, 11:23
Posty: 24
Pomógł: 2
Post 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
Wyświetl profil
Autor Wiadomość
 


Ekspert
Ekspert
Awatar użytkownika

Rejestracja: 2009-03-07, 11:13
Posty: 597
Pomógł: 34
Post Re: Statystyka zatrudnienia - czas wykonywania raportu
Ta wiadomość była pomocna.(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
Wyświetl profil

Rejestracja: 2014-10-13, 11:23
Posty: 24
Pomógł: 2
Post 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
Wyświetl profil
Ekspert
Ekspert
Awatar użytkownika

Rejestracja: 2009-03-07, 11:13
Posty: 597
Pomógł: 34
Post 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
Wyświetl profil

Rejestracja: 2014-10-13, 11:23
Posty: 24
Pomógł: 2
Post 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
Wyświetl profil
Ekspert
Ekspert
Awatar użytkownika

Rejestracja: 2009-03-07, 11:13
Posty: 597
Pomógł: 34
Post 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
Wyświetl profil

Rejestracja: 2014-10-13, 11:23
Posty: 24
Pomógł: 2
Post 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
Wyświetl profil

Rejestracja: 2016-05-17, 20:41
Posty: 392
Pomógł: 75
Post 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
Wyświetl profil

Rejestracja: 2016-05-17, 20:41
Posty: 392
Pomógł: 75
Post Re: Statystyka zatrudnienia - czas wykonywania raportu
Ta wiadomość była pomocna.(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
Wyświetl profil

Rejestracja: 2014-10-13, 11:23
Posty: 24
Pomógł: 2
Post 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
Wyświetl profil

Rejestracja: 2016-05-17, 20:41
Posty: 392
Pomógł: 75
Post 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
Wyświetl profil

Rejestracja: 2014-10-13, 11:23
Posty: 24
Pomógł: 2
Post 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
Wyświetl profil

Rejestracja: 2016-05-17, 20:41
Posty: 392
Pomógł: 75
Post 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
Wyświetl profil

Rejestracja: 2014-10-13, 11:23
Posty: 24
Pomógł: 2
Post 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
Wyświetl profil

Rejestracja: 2016-05-17, 20:41
Posty: 392
Pomógł: 75
Post 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
Wyświetl profil
Wyświetl posty nie starsze niż:  Sortuj wg  
Odpowiedz w temacie   [ Posty: 21 ]  Przejdź na stronę 1, 2  Następna
   Podobne tematy   Autor   Odpowiedzi   Odsłony   Ostatni post 
Na tym forum nie ma nowych nieprzeczytanych postów. Statystyka zatrudnienia

w Programy Kadrowo Płacowe

chemosh

3

3007

2009-09-23, 15:50

dejwmag Wyświetl najnowszy post

Na tym forum nie ma nowych nieprzeczytanych postów. Błąd podczas wykonywania raportu RSA

w Programy Kadrowo Płacowe

suand

2

2922

2011-11-17, 09:54

suand Wyświetl najnowszy post

Na tym forum nie ma nowych nieprzeczytanych postów. generowanie raportu: data zatrudnienia, data końca umowy

w Programy Kadrowo Płacowe

Jana

2

3218

2017-09-01, 07:48

Jana Wyświetl najnowszy post

Na tym forum nie ma nowych nieprzeczytanych postów. statystyka inna kwota niz na liscie plac

w Programy Kadrowo Płacowe

Gia65

8

4604

2009-07-29, 09:06

Gia65 Wyświetl najnowszy post



Kto jest online

Użytkownicy przeglądający to forum: Nie ma żadnego zarejestrowanego użytkownika i 14 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

Szukaj:
Przejdź do:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Support forum phpbb by phpBB Assistant