Uživatelské nástroje

Nástroje pro tento web


lua:tisk_pomoci_lua

Toto je starší verze dokumentu!


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)
    ...
    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.Report:BandDSAndByNames("body_druhy", Data.DSI, {"field"="Value"})
    ...
    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)
    local md = v_faktury_faktury.reports.PrehledFakturZakPol(Data.Params, Data.DSI, Data.Form, Data.FirstParams.Action, Data.FirstParams.ReportName, Data.FirstParams.Use)
    Data.PrintMid=md
    return cf.LuaFormPrintReport(Data, v_faktury_faktury.reports.PrehledFakturZakPol(Data.Params, Data.DSI, Data.Form, Data.FirstParams.Action, Data.FirstParams.ReportName, Data.FirstParams.Use))
  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)

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>
lua/tisk_pomoci_lua.1584613845.txt.gz · Poslední úprava: 2020/03/19 10:30 autor: Libor Kadaník