mojaSymfonia FORUM
https://forum.mix-soft.pl/

Statystyka zatrudnienia - czas wykonywania raportu
https://forum.mix-soft.pl/viewtopic.php?f=3&t=7332
Strona 2 z 2

Autor:  MaciekCh [ 2016-07-19, 13:35 ]
Tytuł:  Re: Statystyka zatrudnienia - czas wykonywania raportu

Sprawdziliśmy dokładnie co zmieniło się w stanie pracowników i znaleźliśmy jedna osobę która miała przedłużaną umowę od 28.06 i to właśnie ona nie jest liczona. Drugi raport liczy do końca umowy i nie 'widzi' że zaczęła się kolejna.

Autor:  szepczący [ 2016-07-19, 20:09 ]
Tytuł:  Re: Statystyka zatrudnienia - czas wykonywania raportu

Dzięki za informację, błąd znaleziony i poprawiony. Kod poniżej:

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.FreeValues ()
      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()

Autor:  MaciekCh [ 2016-07-20, 10:52 ]
Tytuł:  Re: Statystyka zatrudnienia - czas wykonywania raportu

To ja dziękuję, liczy szybko i poprawnie.

Szkoda że nie ma jakiegoś podręcznika do tego AmBasica, czasem trzeba coś na szybko zmienić to bez szukania na ślepo się nie obejdzie.

Autor:  gregg [ 2016-07-20, 10:59 ]
Tytuł:  Re: Statystyka zatrudnienia - czas wykonywania raportu

http://pomoc.sage.com.pl/Help/ambasic :)

Autor:  MaciekCh [ 2016-07-20, 11:28 ]
Tytuł:  Re: Statystyka zatrudnienia - czas wykonywania raportu

wygląda mi na tę samą dokumentacją którą znajdę w helpie programu, ale dzięki, może znajdę coś więcej jak przekopie się głębiej.

Autor:  szepczący [ 2016-07-20, 18:56 ]
Tytuł:  Re: Statystyka zatrudnienia - czas wykonywania raportu

Do nieco starszych wersji programu (np. 2014) dołączony jest w dokumentacji plik "Funkcje do formuł i raportów". Opisane są w nim prawie wszystkie obiekty ambasic używane w KDP/KDF. Szkoda tylko że przestali go dołączać do programu i aktualizować :(

Strona 2 z 2 Strefa czasowa UTC+1godz. [letni]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/