Toto je starší verze dokumentu!
−Obsah
Doplnění LUA reportů o správné ukládání při SaveDocument
- Name - jméno reportu, je použito v názvu souboru: [ID-]Name-IDDokument.ext
- v reports.xml doplnit volaní LUA funkce o parametr Name (…, Use, Name)
- volanou Lua funkci doplnit o parametr Name
- ve volání Print doplnit třetí parametr hash: {document_name=Name}
- MiddleName je použit jako podadresář v reports (report/MiddleName/)
- doplnit query o nadřazený tag <Middle Name="MiddleName"> … </Middle>
- 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 potřebuji ID a tiskne se z SQL je první field v SQL (ID)
Do typu reportu napsat: @cf.trydofile(VLUADIR().."zakazky/v_zakazky_zakazky-reports.lua") v_zakazky_zakazky.reports.PracVykaz(DSI, Form, Action, ReportName, Use, Name)
Pro doplneni TypDokl a Cisla dokladu do dokumentu je potreba v SQL mit field TypDokl a mit nastaven primarni index nebo DataModelName. CDokladu do dokumentu si to bere pres DSI:GetPrimaryIndex.
function v_zakazky_zakazky.reports.PracVykaz(DSI, Form, Action, ReportName, Use, Name) local TiskMD=v_prost_vykony.ZakazkaVykazMiddle(DSI:FieldByName("IDZakaz")) if TiskMD then TiskMD:FindDataSetItem(""):SetOptions({FetchAllBlobs=true}, true) --nutne protoze se zapisuje do syslogu a je jina transakce TiskMD:FindDataSetItem(""):LocateRange("","") --DS musi byt otevrene kvuli primarnimu indexu WindowsManager:Print(TiskMD, {GotoNextPage=true, SetRangeDetail=true, Recalculate=false, Report=ReportName, Print=Action}, {document_name=Name}) TiskMD:Free() end end
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
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
Pro tisk metodou CreatePrint-CreateReport-StartPrint
Pro doplneni TypDokl a Cisla dokladu do dokumentu je potreba ve BeforeSaveToDocumentDir(DSI, ID…) mit parametry DSI a ID. Z DSI se bere TypDokl a CDokladu pres DSI:GetPrimaryIndex. ID urcuje, zda je report seznam ID="" nebo neni ID~="".
local prnt=WindowsManager:CreatePrint() local report=prnt:CreateReport(ReportName) local FileName local Options = {Report=ReportName, Print=Action, Caption=enc"Popis dokumentu", Poznamka="Poznamka dokumentu"} if Action==PRINT_DOCUMENT then if ID ~= "" then Name=ID.."-"..Name end FileName=dokumenty_dokumenty.BeforeSaveToDocumentDir(DSI, ID, dokumenty_dokumenty.GetDocumentFileName("middle_name", ReportName, Name, DSI), Options) end prnt:StartReport(Action, {output=FileName}) ... prnt:PrintReport() report:Free() prnt:Free() if Action==PRINT_DOCUMENT then dokumenty_dokumenty.AfterSaveToDocumentDir(nil, "", FileName, Options) 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 <CONFIG> sekci pro HTML).
Preferovaný způsob fungujívcí v mobisu.
function(Data) ... local Options = {Report = Data.FirstParams.ReportName, Print = Data.FirstParams.Action} local Config = {output_type = Data.FirstParams.OutputType, document_name = Data.FirstParams.Name} return LuaForm.PrintReport(Middle, Options, Config, [Form, Use]) end,
mid=ClientSession:ActivateMid("majetek_majetek") mid:FindDataSetItem(""):LocateRange("idmajetek", "M0605091") WindowsManager:Print(mid, {Typ=1, Report=REPORTSDIR()..'majetek/vypis.rep', Print=PRINT_FILE}, {output=USERDIR().."M0605091.rep"}) ClientSession:Passivate(mid)
Tisk přímo z tiskového dialogu. Umožňuje tisknout označené/všechny řádky dle volby uživatele. Výsledek se uloží do souboru pojmenovaném dle sloupce IDMajetek.
WindowsManager:Print(DSI:OwnerMiddleDB(), {Report=REPORTSDIR()..'majetek/vypis.rep', Print=PRINT_FILE}, {output=USERDIR()..DSI:FieldByName("IDMajetek")..".csv"}, Form, Use)
Uložení reportu do dokumentu
WindowsManager:Print(DSI:OwnerMiddleDB(), {Report=REPORTSDIR()..'majetek/vypis.rep', Print=PRINT_FILE}, {document_name = Name}, Form, Use)
Ukázka nevizuálního tisku middle:
Vytiskne do souboru "m:/tmp/out.sxc" řá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.stc"}, {output="m:/tmp/out.sxc"}, {"R0015267", "RZ00005"}, WR_USE_SELECTED)
Ukázka tisku nevizuálního:
mid=ClientSession:ActivateMid("majetek_majetek") mid:FindDataSetItem(""):LocateRange("idmajetek", "M0605091") print=ClientSession:CreatePrint() report=print:CreateReport(REPORTSDIR()..'majetek/vypis.rep') print:StartReport(PRINT_FILE, {output=USERDIR().."report-output"}) mid:PrintPrepareReport(report) print:PrintReport() report:Free() print:Free() ClientSession:Passivate(mid)
Ukázka tisku vizuálního:
Preferovaný způsob fungující v mobisu:
function(Data) ... Data.Options = {Report = Data.FirstParams.ReportName, Print = Data.FirstParams.Action, Caption=enc"Specifikace souhrn"} local ID = "" --pokudse tiskne jeden rozpocet, muze se do dokumentu doplnit odkaz na rozpocet if #Data.Form:GetSelectedRows()==1 then ID=Data.DSI:FieldByName("idrozp") end if Data.FirstParams.Action==PRINT_DOCUMENT then Data.FileName=dokumenty_dokumenty.BeforeSaveToDocumentDir(Data.DSI, ID, dokumenty_dokumenty.GetDocumentFileName("rozpocty", Data.FirstParams.ReportName, Data.FirstParams.Name, Data.DSI), Data.Options) end local Config = {output = Data.FileName, output_type = Data.FirstParams.OutputType, document_name = Data.FirstParams.Name} return LuaForm.StartPrintReport(Options, Config) end, function(Data) Data.Report:BandDSAndByNames("body_druhy", Data.DSI, {"field"="Value"}) ... if Data.FirstParams.Action==PRINT_DOCUMENT then dokumenty_dokumenty.AfterSaveToDocumentDir(nil, "", Data.FileName, Data.Options) end return LuaForm.EndPrintReport() end
function Tisk(DSI, Form, Action, ReportName, Use) local prnt=WindowsManager:CreatePrint() local report=prnt:CreateReport(ReportName) local FileName if Action==PRINT_DOCUMENT then FileName=dokumenty_dokumenty.BeforeSaveToDocumentDir(nil, "", dokumenty_dokumenty.GetDocumentFileName("MiddleName", ReportName, Name, DSI), {}) end prnt:StartReport(Action, {oput=FileName, document_name=Name}) report:BandDSAndByNames("body_druhy", DSI, {"field"="Value"}) prnt:PrintReport() report:Free() prnt:Free() if Action==PRINT_DOCUMENT then dokumenty_dokumenty.AfterSaveToDocumentDir(nil, "", FileName, {}) end end
Konkrétní příklad
LuaForm.Func.v_faktury_faktury_reports_PrehledFakturZakPol={ function(Data) return LuaForm.ShowDlg({ Caption=enc"Přehled faktur s vybranou zakpol", Items={ {"idfdruh", "luaform", enc"Druh dokladů", "MultiSelectLookup", nil, nil, nil, {ArgumentStr="faktury_fdruh:idfddruh"}}, {"datum", "calbetweentime", enc"Datum vystavení od|Datum vystavení do", "From|To" }, {"idzakpol", "lookup", enc"Zakázková položka", "zakazky_czakpol:idzakpol"}, } }) end, function(Data) if Data.Params.Result == DLG_CANCEL then return end local Options = {Report = Data.FirstParams.ReportName, Print = Data.FirstParams.Action} local Config = {output_type = Data.FirstParams.OutputType, document_name = Data.FirstParams.Name} return LuaForm.StartPrintReport(Options, Config) end, function(Data) Data.PrintMid = v_faktury_faktury.reports.PrehledFakturZakPol(Data.Params, Data.DSI, Data.Form, Data.FirstParams.Action, Data.FirstParams.ReportName, Data.FirstParams.Use) return cf.LuaFormPrintReport(Data, Data.PrintMid) end, finally=function(Data) if Data.PrintMid then Data.PrintMid:Free() end end } function v_faktury_faktury.reports.PrehledFakturZakPol(res, DSI, Form, Action, ReportName, Use) ... ... return md, {GotoNextPage=false, SetRangeDetail=false, Recalculate=false, Report=ReportName, Print=Action} 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)
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=[[<?xml version="1.0" encoding="]]..encoding..[["?> <Middle Name="v_PolozkyFaktury"> <QueryItem Name="lua_faktury" DataModelName="faktury_faktury"> <SQL> select * from faktury_faktury where idfaktura = ']]..idfaktura..[[' </SQL> <QueryItem Name="lua_fpolozky" DataModelName="faktury_fpolozky"> <SQL> select * from faktury_fpolozky where idfaktura=']]..idfaktura..[[' </SQL> </QueryItem> </QueryItem> </Middle>]] 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ží.
<BAND>#@…#</BAND>