==== Doplnění LUA reportů o správné ukládání při SaveDocument ====
* MiddleName je použit jako podadresář v reports (report/MiddleName/)
* doplnit query o nadřazený tag ...
* POZOR pro ukladání Excelu MUSÍ být MiddleName - v cestě nemohou být 2xbackslash (chyba není vidět)
* pokud se tiskne z Query a chceme dokument ukládat k danému rozpočtu, musí byt v prvním Query field //TypDokl=R// a v printu **NESMÍ** být //GotoNextPage=false//
=== pokud je použit GotoNextPage=false, ale v dialogu výběru dat pro tisk je vybrána zakázka nebo partner doplnit po Print odpovídající pole v dokumentu ===
--pro specielni pripady ze je dialogu vybran konktretni partner nebo zakazka a dokument pak chci s nim spojit (napr. seznam faktur)
if res.idpartner ~= "" and Action==PRINT_DOCUMENT and dokumenty_dokumenty.LastIDDokument then
local MD=ClientSession:ActivateMid("DOKUMENTY")
do
local function finally_MD() MD=ClientSession:Passivate(MD) end
local DokumentyDS=MD:FindDataSetItem("")
assert(DokumentyDS:LocateRange("IDDokument", dokumenty_dokumenty.LastIDDokument))
DokumentyDS:Edit()
DokumentyDS:SetFieldByName("IDPartner", res.idpartner)
DokumentyDS:Post()
finally_MD()
end
end
====Ukázka tisku vizuálního:====
Konstanty pro Option Print: (typ akce)
* PRINT_FILE - pouze vytvoří soubor
* PRINT_PREVIEW
* PRINT_PRINT
* PRINT_DOCUMENT
Pomocí output lze nastavit jméno výstupního souboru (má přednost před nastavením v sekci pro HTML).
====Ukázka nevizuálního tisku middle:====
Vytiskne do souboru "/tmp/out.pdf" řádky "R0015267", "RZ00005" z middle MD
Middle musí být otevřené a vybrané řádky musí být "dohledatelné".
ClientSession:Print(MD, {Report=REPORTSDIR().."rozpocty/rozp.rep", Print=PRINT_FILE}, {output="/tmp/out.pdf"}, {"R0015267", "RZ00005"}, WR_USE_SELECTED)
====Ukázka tisku vizuálního:====
-pokud potřebuji **ID** a tiskne se z **SQL** je potřeba nastavit **primarni index root DSI**. GotoNextPage urcuje, zda je report seznam ID="" nebo neni ID~="" \\
-pro doplneni **TypDokl** a **Cisla dokladu** do dokumentu je potreba v SQL mit field TypDokl a mit nastaven **primarni index** nebo **DataModelName** (potreba pro BeforeSaveToDocumentDir)\\
-**CDokladu** do dokumentu si to bere pres **DSI:GetPrimaryIndex**. Tzn. musí být nadefinován **DataModel** s **RequredIndexes**\\
-//// pro podadresář v reports (report/MiddleName/)\\
-pokud neni DSI z SQL **otevřené** otevře se automaticky v cf.LuaFormPrintReport
local query = enc[[
\\
=== Základní metoda tisku PrintReport (WindowsManager:Print) ===
LuaForm.Func.v_zakazky_zakazky_reports_PrintZakpol={
function(Data)
Data.PrintMid = v_zakazky_zakazky.reports.PrintZakpol(Data.DSI, Data.Form)
return cf.LuaFormPrintReport(Data, Data.PrintMid, {GotoNextPage=true, SetRangeDetail=false, Recalculate=false})
end,
finally=function(Data)
if Data.PrintMid then Data.PrintMid:Free() end
end
}
function v_zakazky_zakazky.reports.PrintZakpol(DSI, Form)
local idzakaz=DSI:FieldByName("idzakaz")
local polDS = DSI:OwnerMiddleDB():FindDataSetItem("zakazky_zakpol")
polDS:SetRangeDetail()
local tIDZakpol = Form:GetSelectedRows(polDS)
local tisk=[[
select z.idzakaz, z.idpartner, zp.*, z.popis as popiszak
from zakazky_zakpol zp
JOIN zakazky_zakazky z ON z.idzakaz = zp.idzakaz
where ]]..cf.ConstructWhereFromString("idzakaz;idzakpol", tIDZakpol, "zp")..[[
]]
if DEBUG_DETAIL then DEBUG_WRITE({mid=tisk}) end
local TiskMD=ClientSession:CreateMidFromXML(tisk)
if DEBUG_DETAIL and not DEBUG_NOVISIBLE then
local form=WindowsManager:CreateDetailMidDBForm(TiskMD)
local outSP=WindowsManager:ShowFormSP(form, {Modal=true})
form=form:Free()
if outSP.MRCode==2 then TiskMD=TiskMD:Free() return end
end
--pro save dokument musi byt otevrene DSI
local ds = TiskMD:FindDataSetItem("")
ds:LocateRange("", "")
return TiskMD
end
=== Metoda tisku Start/EndPrintReport pokud nelze použít jednodušší PrintReport ===
LuaForm.Func.v_rozpocty_rozpocty_reports_Specifikace={
function(Data)
return cf.LuaFormStartPrintReport(Data, {GotoNextPage=(#Data.Form:GetSelectedRows()==1)})
end,
function(Data)
...
return LuaForm.CallFunc("WalkRecordsVisual", nil, Data.DSI, Data.Form, {WR_USE_SELECTED, function(DSI, ID, ntf)
v_rozpocty_rozpocty.reports.TiskKapitol(Data.DSI, Data.Form, Data.Report, GroupPolozky)
end, "Tisk zakazek", "PrCarKod"})
end,
function(Data)
...
return cf.LuaFormEndPrintReport(Data)
end,
}
function v_rozpocty_rozpocty.reports.TiskKapitol(DSI, Form, Report, GroupPolozky)
...
if GroupPolozky then
local md = v_rozpocty_rozpocty.reports.GetMiddlelGroupPolozky(kapDS:FieldByName("idrozp"), kapDS:FieldByName("idkap"))
md:PrintPrepareReport(Report, {GotoNextPage=false, SetRangeDetail=false, Recalculate=false})
if md then md=md:Free() end
else
...
Report:BandDSAndByNames("body_rpolozky", rpDS, {})
...
end
Report:BandDSAndByNames("afterdetail_rkap", kapDS, {})
end
\\
==== Vložení LUA bandu do existujícího reportu ====
Do předcházejícího bandu než se má tisknout náš nový "lua_band", vložíme field s následujícím kódem:
@cf.trydofile(VLUADIR().."v_faktury_faktury-reports.lua") v_faktury_faktury.reports.TiskPolozek(DSI, Params, Report)
{{lua:tisk_lua_bandu.png|Report}}
Toto zavolá funkci, která pak tiskne band "lua_fpolozky". Nadřazený QueryItem "lua_faktury" je tam kvůli správnému zobrazení měn.
Funkce tisku ve v_faktury_faktury-reports.lua:
function v_faktury_faktury.reports.TiskPolozek(DSI, Params, Report)
local idfaktura=DSI:FieldByName("idfaktura")
local tisk=[[
select * from faktury_faktury
where idfaktura = ']]..idfaktura..[['
select * from faktury_fpolozky
where
idfaktura=']]..idfaktura..[['
]]
if DEBUG_DETAIL then DEBUG_WRITE({mid=tisk}) end
local TiskMD=ClientSession:CreateMidFromXML(tisk)
TiskMD:PrintPrepareReport(Report,{GotoNextPage=true})
TiskMD:Free()
end
==== Tisk v cizí měně ====
Tisku vlastního bandu a hodnot v cizí měně. Parametr DSI je povinný, stejně jako znak $
Report:BandDSAndByNames("body_neco", DSI, {["cena$"]=cena})
==== Command Band ====
Nově lze nastavit v reportu příznak "Command band". Tento band nebude ve výstupu, ale budou v něm spuštěny lua funkce.
* V R-line je "zaškrtávátko" ve vlatsnostech bandu.
* V excelu a openoffice se napíše kouzelné slovíčko **commandband** do 1. řádku a posledního + 3 sloupce daného bandu.
* V html se prostě mezi značky nic nevloží. ''#@...#''