( Mode : Byte; RefDate : Date; SepDate : Date; Periods : String; Rights : Longint; PolRNStr : String[10]; PolName : String[10]; OnlyId : String; Except : Byte; ... dim Error : String) : Byte
Tato funkce spouští universální generátor třídění zaměstnanců. Způsob práce a pojetí parametrů řídí parametr Mode.
Mode | Řídí způsob práce funkce a pojetí vstupních parametrů. |
RefDate | Referenční datum pro získávání historických hodnot. |
SepDates | Separační datum pro získávání historických hodnot. |
Periods | Seznam požadovaných mzdových období ve formě řetězce. Jedná se o seznam roků a měsíců oddělených oddělovači | nebo ; . Seznam musí obsahovat vždy celé páry: 'měsíc|rok'. |
Rights | Přístupová práva (skupiny) na zaměstnance. Jestliže zadáte 0, budou automaticky doplněna přístupová práva pro přihlášeného zaměstnance. |
PolRNStr | Název položky, ve které je uloženo režijní středisko pro rozpočítání nákladů (Př.: 'O0400').
Jestliže bude tento parametr prázdný, nebudou SQL příkazy vytvářeny s ohledem na rozpočítávání nákladů ani u projektů, zakázek a zdrojů. |
... | ... |
Error | Jestliže funkce vrací false, je zde textová informace o chybě. |
Skupiny těchto položek se opakují do té doby, než bude v název položky '#'.
PolName | Název položky ve tvaru 'O0400'. Položka musí existovat, nebo může být prázdná. V tom případě nebude třídění bráno v úvahu. Načítání třídicích kritérií končí ve chvíli, kdy bude nalezen název položky '#'. |
OnlyId | Jestliže se jedná o relační položku (například relace na střediska), lze v tomto řetězci omezit množinu nalezených středisek. Formát je: identy oddělené oddělovači | nebo ; . Jestliže jako první znak napíšete '#', následuje číslo skupiny systemu označení _DiaMark. Lze tak používat standardní system označování vět. |
Except | true = identy v parametru OnlyId budou z výsledného třídění vypuštěny false = pouze věty s identy v parametru OnlyId budou do výsledného dotazu zahrnuty |
'#' | Toto jméno položky ukončí načítání třídicích kritérií. |
... dim From : StringZ; dim Where : StringZ; dim OrderBy : StringZ; ...
Vrací výsledný SQL příkaz, pro setřídění jednotlivých zaměstnanců, bez vykonání. Jestliže bude potřeba vytvořit pomocné tabulky, budou vytvořeny.
Aby bylo možno používat příkazy rovnou v programu 'Microsoft SQL Server Management Studio', dodá funkce před jména tabulek vlastníka ve tvaru 'XXXX.'. Pak lze jednoduše funkcí najdi / nahraď zaměnit tento řetězec za jiný.
Příklad:
dim nMes : Integer; dim nRok : Integer; dim dtRef : Date; dim dtSep : Date; dim sFrom : StringZ; dim sWhere : StringZ; dim sOrderBy : StringZ; Mes := _ActMonth; Rok := _SysYear; dtRef := _LastDate(nMes,nRok); dtSep := _LastDate(nMes,nRok); if(_SortGenerate(sortVratSQL, dtRef, dtSep, _Str(nMes) + "|" + _Str(nRok), 0 { Rights }, "O0400", "O0400", "", false, "O0407", "", false, "#", sFrom, sWhere, sOrderBy, sError))then printup(_PutToClipboard("select OSOBNI.O0007" + #13+#10 + "from " + sFrom + #13+#10 + "where " + sWhere + #13+#10 + "order by " + sOrderBy)); else _MsgBox(0, "Chyba třídění: " + sError, 0); endif
Příklad výsledku z clipboardu:
select OSOBNI.O0007 from ((((XXXX.OSOBNI inner join XXXX.RN_MZDY rnm on (rnm.XUVAZEKID=OSOBNI.IDENT and rnm.XPERIOD=132055041) ) inner join XXXX.RN_MZDY_CAST rnmc on (rnmc.XPARENTID=rnm.IDENT) ) left outer join XXXX.CEN rn1 on (rn1.IDENT=rnmc.XTKCENID) ) left outer join XXXX.RN_PROJEKTY rn2 on (rn2.IDENT=rnmc.XTKPROJEKTID) ) where exists(select * from XXXX.RIGHTS R where (OSOBNI.IDENT=R.XMANIDENT) and (R.XPERIOD=132055041) and (R.XR0 = 1 or R.XR1 = 1 or R.XR2 = 1 or R.XR3 = 1)) group by OSOBNI.IDENT,rn1.XNAME,rn1.IDENT,rn2.XNAZEV,rn2.IDENT,OSOBNI.O0007,OSOBNI.O0006 order by rn1.XNAME,rn2.XNAZEV,OSOBNI.O0007,OSOBNI.O0006
... dim From : StringZ; dim Where : StringZ; dim OrderBy : StringZ; dim FPopis : File; ...
Vrací výsledný SQL příkaz pro agregaci částí mzdy z rozpočítávání nákladů podle zadaných třídicích kritérií. Vracený dotaz je možné použít pro získávání nasčítaných částí mzdy.
Aby bylo možno používat příkazy rovnou v programu 'Microsoft SQL Server Management Studio', dodá funkce před jména tabulek vlastníka ve tvaru 'XXXX.'. Pak lze jednoduše funkcí najdi / nahraď zaměnit tento řetězec za jiný.
Do klauzule Where bude vždy dodán příkladný text 'rnmc.XPOLIDX=101 or rnmc.XPOLIDX=271', který nahradíte vlastním seznamem potřebných mzdových položek. Jestliže potřebujete všechny mzdové položky, nahraďte ho výrazem 'rnmc.XPOLIDX<>0'.
Ve streamu FPopis přichází informace popisující použité sloupce.
FPopis | Data |
0 | Textový sloupec pro třídění (třeba název střediska Př.:'rn1.XNAME') pro SQLBind. |
1 | Skutečný typ třídicí položky (polString, polInteger, polLongint, ...) |
2 | Jestliže se jedná o relaci - typ databáze (dbtStr, ...) - jinak 0 |
3 | Jestliže se jedná o relaci - ident sloupce relace (Př.:'rn1.IDENT') pro SQLBind. - jinak '' |
-- následuje druhé třídicí kriterium -- | |
10 | Textový sloupec pro třídění (třeba název střediska Př.:'rn1.XNAME') |
... | ... |
Mode sortVratSQLSumRNZam vytvoří SQL tak, aby byli rozděleni zaměstnanci.
Příklad:
Ukazuje součet mzdové položky M0281 podle třidicích kritérií O0400 (Nákladová střediska) a O0407 (Projekty)
procedure Test1 dim nMes, nRok : Integer; dim dtRef, dtSep : Date; dim sFrom, sWhere, sOrderBy : StringZ; dim sError, S, sCol : String; dim Set : Word; dim sL1, sL2, sL3 : StringZ; dim nIdxPol, nIdx : Integer; dim rSum : Real; dim FPopis : File; dim nDBT1, nDBT2, nDBT3 : Longint; dim nRel1, nRel2, nRel3 : Longint; nMes := _ActMonth; nRok := _SysYear; dtRef := _LastDate(nMes,nRok); dtSep := _LastDate(nMes,nRok); SRewrite(FPopis, "", true); if(_SortGenerate(sortVratSQLSumRN, dtRef, dtSep, _Str(nMes) + "|" + _Str(nRok), 0 { Rights }, "O0400", "O0400", "", false, "O0407", "", false, "#", sFrom, sWhere, sOrderBy, FPopis, sError))then SQLOpen(SQLDB_SYSHANDLE, Set); { Bind sloupců podle popisu ve streamu FPopis } nIdx := 0; while(_SGetTyp(FPopis, nIdx) <> 0)do if(nIdx = 0)then nDBT1 := _SGet(FPopis, nIdx+2); call PridejDBSloupec(_SGet(FPopis, nIdx+0), sL1, nDBT1, _SGet(FPopis, nIdx+3), nRel1); else if(nIdx = 10)then nDBT2 := _SGet(FPopis, nIdx+2); call PridejDBSloupec(_SGet(FPopis, nIdx+0), sL2, nDBT2, _SGet(FPopis, nIdx+3), nRel2); else if(nIdx = 20)then nDBT3 := _SGet(FPopis, nIdx+2); call PridejDBSloupec(_SGet(FPopis, nIdx+0), sL3, nDBT3, _SGet(FPopis, nIdx+3), nRel3); endif endif endif _Inc(nIdx, 10); endwhile SQLBind(Set, "rnmc.XPOLIDX", SQL_INTEGER, nIdxPol); SQLBind(Set, "sum(rnmc.XCASTKA)", SQL_DOUBLE, rSum); { Do klauzule Where doplníme pouze položku M0281 } nIdx := _Pos("rnmc.XPOLIDX=101 or rnmc.XPOLIDX=271", sWhere); if(nIdx <> 0)then Delete(sWhere, nIdx, _Len("rnmc.XPOLIDX=101 or rnmc.XPOLIDX=271")); Insert("rnmc.XPOLIDX=281", sWhere, nIdx); endif { Z klauzule FROM vyházej vlastníka tabulek 'XXXX.' } call SmazSubString("XXXX.", sFrom); { Z klauzule WHERE vyházej vlastníka tabulek 'XXXX.' } call SmazSubString("XXXX.", sWhere); { Zpracuj agregace na SQL serveru } SQLSelect(Set, sFrom, sWhere, sOrderBy); if(_SQLFirst(Set))then repeat Trace(sL1, ", ", sL2, ", ", sL3, ", IdxPol:", nIdxPol, ", Sum:", rSum); until _SQLNext(Set) = false; endif SQLClose(Set); endif return; procedure PridejDBSloupec( sCol : String; dim sLX : StringZ; nDBType : Integer; sColRel : String; dim nRelX : Longint) SQLBind(Set, sCol, SQL_VARCHAR, sLX); if(nDBType <> 0)then SQLBind(Set, sColRel, SQL_INTEGER, nRelX); endif endproc { PridejDBSloupec } procedure SmazSubString( sSub : String; dim sRes : StringZ) dim nIdx : Integer; repeat nIdx := _Pos(sSub, sRes); if(nIdx <> 0)then Delete(sRes, nIdx, _Len(sSub)); endif until nIdx = 0; endproc { SmazSubString } endproc { Test1 }
... dim FDta : File; dim FRel : File; ...
Plní výsledný stream FDta daty z třídění.
Index streamu FDta | Data |
000000...99999 | Identy úvazků |
100000...199999 | Období - Perioda v binárním tvaru 'RRRRMMDD' |
200000...299999 | Data třídění 1 |
300000...399999 | Data třídění 2 |
... | ... |
Dále plní výsledný stream FRel relacemi z třídění, jestliže relace existují. Jestliže relace neexistuje, stejně bude uložena nula.
Index streamu FRel | Data |
000000...99999 | Ident relace pro třídění 1. |
100000...199999 | Ident relace pro třídění 2. |
200000...299999 | Ident relace pro třídění 3. |
300000...399999 | Ident relace pro třídění 4. |
... | ... |
... dim FDta : File; dim FRel : File; ...
Plní výsledný stream FDta daty z třídění. Jedná se o speciální formát záznamů tak, jak ho používala původní makra. Věty jdou za sebou 1..x .
Konstrukce záznamu je:
| 24 | 24 | 24 | 34 | 4 | | 24 | 24 | 24 | 34 | 4 | 4 | +-------Key(110)--------+ +-----------114-------------+ +------------------------224+4=228------------------------+ dim Jmeno : String; dim MesRok : String; Jmeno := _RightSP(O[oJmeno], 34); MesRok := _StrPut(_SysYear, _ActMonth); PomS := _RightSP(lsKeyCS + _StrToCSW(_UpperS(Jmeno)) + MesRok, 114) + Key + Jmeno + MesRok + _LIToKey(O[dbIdent]);
Konstrukce streamu FRel je stejná jako u sortDoStreamu_1.
Podívejte se na: Ostatní
Příklad:
call TestSortGenerate; exit procedure TestSortGenerate dim sError : String; dim dtRef : Date; dim dtSep : Date; dim sFrom : StringZ; dim sWhere : StringZ; dim sOrderBy : StringZ; dim FDta : File; dim FRel : File; dim Tag : Byte; dim Mes, Rok : Integer; Mes := _ActMonth; Rok := _SysYear; dtRef := _LastDate(Mes,Rok); dtSep := _LastDate(Mes,Rok); SRewrite(FDta,"",true); SRewrite(FRel,"",true); if(_DiaMark(dbtO, 400, Tag) = cmOK)then if(_SortGenerate( 1, dtRef, dtSep, _Str(Mes) + "|" + _Str(Rok), 0 { Rights }, "O0400", "O0400", "#" + _Str(Tag), false, { Nákladové středisko } "O0407", "", false, { Projekt } "", "", false, { prázdné třídění } "#", FDta, FRel, sError) = true) then call ZobrazStream_1(FDta, FRel); else _MsgBox(0, "Chyba třídění: " + sError, 0); endif endif endproc procedure ZobrazStream_1(dim FDta : File; dim FRel : File) dim UvazekId: Longint; dim Perioda : Longint; dim Idx : Longint; dim sRec : String; dim RelId1 : Longint; dim RelId2 : Longint; dim RelId3 : Longint; dim Data1 : String; dim Data2 : String; dim Data3 : String; dim T : Text; TRewrite(T, "Test_SortGenerate.CSV"); TWriteLn(T, "Jmeno;TK1;TK2;TK3"); if(_SFirst(FDta, Idx))then repeat UvazekId := _SGet(FDta, Idx + 000000); Perioda := _SGet(FDta, Idx + 100000); if(_SGetTyp(FDta,Idx + 200000) <> 0)then Data1 := _SGet(FDta, Idx + 200000); endif if(_SGetTyp(FDta,Idx + 300000) <> 0)then Data2 := _SGet(FDta, Idx + 300000); endif if(_SGetTyp(FDta,Idx + 400000) <> 0)then Data3 := _SGet(FDta, Idx + 400000); endif if(_SGetTyp(FRel,Idx + 000000) <> 0)then RelId1 := _SGet(FRel, Idx + 000000); endif if(_SGetTyp(FRel,Idx + 100000) <> 0)then RelId2 := _SGet(FRel, Idx + 100000); endif if(_SGetTyp(FRel,Idx + 200000) <> 0)then RelId3 := _SGet(FRel, Idx + 200000); endif if(_FindRecId(dbtO, UvazekId))then TWriteLn(T, O[oJmeno],";",Data1,";",Data2,";",Data3); endif until _SNext(FDta, Idx) = false or Idx > 100000; endif endproc procedure ZobrazStream_2(dim F : File) dim Idx : Longint; dim sRec : String; if(_SFirst(F, Idx))then repeat sRec := _SGet(F, Idx); Trace(sRec); until _SNext(F, Idx) = false; endif SClose(F); endproc