Uživatelské nástroje

Nástroje pro tento web


lua:tisk_pomoci_lua

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 <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 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 <CONFIG> 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
-<Middle Name="MiddleName"> pro podadresář v reports (report/MiddleName/)
-pokud neni DSI z SQL otevřené otevře se automaticky v cf.LuaFormPrintReport

  local query = enc[[
  <Middle Name="POHYBY_TAB">
    <DataModel>
      <Table Name="a">
        <RequredIndexes>
IDPRIJEMKA-P
        </RequredIndexes>
      </Table>
    </DataModel>
 
    <QueryItem Name="" DataModelName="a"><SQL><![CDATA[
    select p.idprijemka, 'P' as typdokl
    ...
    Data.TiskMD=ClientSession:CreateMidFromXML(query)
    local ds=Data.TiskMD:FindDataSetItem("")
    ds:LocateRange("", "")
    ...  


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=[[
  <Middle Name="ZAKAZKY">
    <DataModel>
      <Table Name="zakazky_zakpol">
        <Field Name="idpartner" Type="String"/>
        <Field Name="popiszak" Type="String"/>
      </Table>
    </DataModel>
 
    <QueryItem Name="lua_zakpol" DataModelName="zakazky_zakpol"><SQL>
        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")..[[
      </SQL>
    </QueryItem>
  </Middle>
  ]]
  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)

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.txt · Poslední úprava: 2023/05/25 11:34 autor: Karel Petrů