Uživatelské nástroje

Nástroje pro tento web


lua:upravy_systemu_obis

Toto je starší verze dokumentu!


Úpravy systému OBIS

Obarvování

OBIS umožňuje na základě určité podmínky obarvovat jak písmo tak i pozadí řádku. Je možné měnit i styl písma.

Příklad obarvování - položky rozpočtu obarví červene, pokud je cena menší než náklady a zeleně, pokud je ceníková cena menší než náklady ale cena je vetší než náklady. Obarvování dle ceny má prioritu.

ClientSession:AddLUAEvent("rozpocty_rpolozky.PrintRow","RpolozkyCenaNaklady")
function RpolozkyCenaNaklady( DSI, FieldName)
 local cena=DSI:FieldByName("cena")
 local naklady=DSI:FieldByName("naklady")
 local cenikcena=DSI:FieldByName("cenikcena")
 if cena and naklady and cena < naklady then
     return {FontColor=RGB2Color(255,70,0)}
 elseif cenikcena and naklady and cenikcena < naklady then
     return {FontColor=RGB2Color(50,170,0)}
 end
end

Příklad obarvování - dle prvního znaku '*' v hlavičce rozpoctu

ClientSession:AddLUAEvent("rozpocty.rozpocty_rozpocty.PrintRow","RozpoctyPrvniZnak")
function RozpoctyPrvniZnak( DSI, FieldName)
local znak=string.sub(DSI:FieldByName("hlavicka"),1,1)
if znak=="*" then
return
{FontColor=RGB2Color(250,100,0),FontStyle=FontStyleBold,BrushColor=RGB2Color(0,100,250)}
end
end

FontColor – barva písma v řádku BrushColor – barva pozadí řádku FontStyle – styl písma

Obarvování písma a pozadí využívá funkci RGB2Color, která má tři barevne složky - R (red), G (green), B (blue). Všechny složky se nastavují v rozmezí 0 – 255. Např. bílá barva je {(255,255,255)}, černá barva je (0,0,0), červená barva je (255,0,0).

Styly písma mohou být FontStyleBold pro tučné písmo, FontStyleItalic pro kurzívu, FontStyleUnderline pro podtržené písmo a FontStyleStrikeOut pro písmo přeškrtnuté. Jednotlivé styly se sčítají. Pokud bychom tedy chtěli použít všechny čtyři styly napíšeme FontStyleBold+FontStyleItalic+FontStyleUnderline+FontStyleStrikeOut.

Kopírování, vkládání, potvrzování

Možné eventy

Popis na stránce eventy.

Příklady

pri kopirovani rozpoctu doplneni aktualniho datumu

ClientSession:AddLUAEvent("rozpocty.rozpocty_rozpocty.AfterCopy", "AktualniDatum")
function AktualniDatum( DSI, FieldName)
DSI:SetFieldByName("Datum",os.date("%d.%m.%Y %X"))
end

pri vytvoreni nove polozky faktury doplneni kodu DPH "0"

ClientSession:AddLUAEvent("faktury.faktury_fpolozky.AfterInsert", "PolozkaFaktury")
function PolozkaFaktury( DSI, FieldName)
DSI:SetFieldByName("iddph","0")
end

pri vytvoreni noveho skladu se doplni IDSklad a Popis dle cisla zakazky

ClientSession:AddLUAEvent("sklady.sklad_sklady.BeforePost", "PopisMeziskladu")
function PopisMeziskladu( DSI, FieldName)
if DSI:FieldByName("idzakaz") then
DSI:SetFieldByName("popis",
ClientSession:LookupFields("zakazky_zakazky","idzakaz",DSI:FieldByName("idzakaz"),"popis"))
DSI:SetFieldByName("idsklad", DSI:FieldByName("idzakaz"))
end
end

pri vytvoreni noveho partnera vyplneni cenove skupiny '2'

ClientSession:AddLUAEvent("partneri.partneri_partneri.AfterInsert", "PolozkaFaktury")
function PolozkaFaktury( DSI, FieldName)
DSI:SetFieldByName("CenSkupina","2")
end

pri zalozeni vyk.protokolu vyplneni druhu 'S'

ClientSession:AddLUAEvent("vykprot.prost_vykprot.AfterInsert", "DruhVykProtokolu")
function DruhVykProtokolu( DSI, FieldName)
DSI:SetFieldByName("idvpdruh","S")
end

po postu vykonu doplneni popisu dle idvyk

ClientSession:AddLUAEvent("prostredky.prost_vykony.BeforePost", "PopisVykonu")
function PopisVykonu( DSI, FieldName)
if DSI:FieldByName("idvyk") then
DSI:SetFieldByName("popis",
ClientSession:LookupFields("prost_vyktext","idvyk",DSI:FieldByName("idvyk"),"popis"))
end
end

pri pridani noveho partnera se automaticky vyplni v partnerech novy sloupecek 'v_idvyridil' se jmenem uzivatele, ktery partnera zapsal

ClientSession:AddLUAEvent("partneri.partneri_partneri.AfterInsert", "PridaniZapsalPartnera")
function PridaniZapsalPartnera(DSI, FieldName)
DSI:SetFieldByName("v_idvyridil",ClientSession:GetIDUzivatele())
end

Cenová politika

Příklad - když se bude vydávat materiál ze skladu 01, pak vydej za Cenu1 ze skladových karet. Když ze skladu 02, pak vydej za Cenu2 a když ze skladu 03, pak vydej za Cenu3. Když se bude vydávat z jiných skladů, vždy vydej za cenu ze sloupce Cena

ClientSession:AddLUAEvent("sklkarty_zaklad.sklad_karty.GetCena","CenovaPolitikaKarty")
function CenovaPolitikaKarty( DSI, DestDSI, Params)
  local SkladDS=DestDSI:OwnerMiddleDB():FindDataSetItem("sklad_prijemky")
  if not SkladDS then return  end
  local idsklad=SkladDS:FieldByName("idsklad")

  if idsklad=="01" then return DSI:FieldByName("Cena1") end
  if idsklad=="07" then return DSI:FieldByName("Cena2") end
  if idsklad=="13" then return DSI:FieldByName("Cena3") end
  return Params.CenikCena
end

Upozorňování - budík

Upozornování slouží k připomenutí nějaké události, akce na základě výběru pomocí SQL dotazu.

Syntaxe

<{název}>|<{interval_v_minutách}>|<{další_spuštění}>
|{Tablename}|<{SQL_dotaz}>

Příklad: Chceme upozornit na všechny {Akce} partnerů, které mají {Datum akce} starší, než je aktuální datum.

Akce|10|8.11.2005 8:01:49|partneri_akce|select * from partneri_akce where
datumakce < '<lua>return os.date('%d.%m.%Y %H:%M:%S')</lua>' and
piduzivatele = '<lua>return ClientSession:GetIDUzivatele()</lua>'

Čas dalšího spuštění se nastaví automaticky po předešlém spuštění - k času posledního spuštění se přičte interval v minutách.

Datamodel

Souborem {datamodel.xml} je popsána struktura OBISu. Každá tabulka a každý sloupec je nadefinován pomocí několika párových značek.

  • <Table Name> - "vnitřní" jméno tabulky
  • <Caption> - popis tabulky
  • <RequredIndexes> - indexy v tabulce
  • <Field Name Type> - "vnitřní" jméno sloupce
  • <DisplayLabel> - nadpis sloupce; je vidět v OBISu
  • <Hint> - nápověda na myš
  • <LookupKeyFields> - "odskok" do navázané tabulky
  • <DataType> - datový typ
  • <Size> - velikost
  • <DisplayWidt> - zobrazovaná velikost
  • <DisplayFormat> - formát zobrazovaných čísel (např. '0.## %')
  • <FieldKind> - {Data} nebo {Lookup}
  • <FieldID> - jedinecne ID v tabulce, max 63
  • <Tag> - vlastnost sloupce; 0-nic, 1-NO COPY, 8-READ ONLY
  • <Visible> - zobrazení sloupce; 0-NE, 1-ANO

Jednoduché změny se provádí předefinováním požadovaných hodnot v souboru datamodelv.xml. Jednoduchá změna je např. změna popisu sloupce, zobrazovaná velikost sloupce, nebo např. nastavení sloupce na READ ONLY. Jsou to tedy změny, které nepotřebují fyzickou změnu databáze.

Soubor datamodelv.xml má stejnou syntaxi jako datamodel.xml. Jsou zde ale uvedeny jen ty položky, které potřebujeme změnit.

Příklad: Změna popisu sloupce {hlavicka} v rozpočtech na {popis}.

V souboru {datamodelv.xml} je nutné uvést jméno tabulky a jméno sloupce a pak požadovanou změnu.

<?xml version="1.0" encoding="windows-1250"?>
<DataModel>
  <Table Name="rozpocty_rozpocty">
    <Field Name="Hlavicka" Type="String">
      <DisplayLabel>Popis</DisplayLabel>
    </Field>
  </Table>
</DataModel>

Pokud je potřeba udělat nějaký fyzický zásah do tabulky, musí se udělat {upgrade}. Do souboru {upgradev.dat} se vloží SQL dotaz, který provede v databázi požadovanou změnu a pak se tato změna popíše v souboru {datamodelv.xml}.

Příklad: Přidat do tabulky Akcí sloupeček Datum plnění, který bude mít formát datumu s odskokem do kalendáře.

Do souboru upgradev.dat se napíše SQL dotaz pro přidání sloupce do tabulky partneri_akce. U uživatelských sloupců se používá syntaxe v_jméno. Soubor {upgradev.dat} bude po doplnění vypadat následovně:

Entry{"31","10.9.2004", [[
   LuaObj:Print("vlastnost uzivatelskych upgrade dat aktivni")
]]}
Entry{"41","1.2.2005", [[
   UpData("alter table partneri_akce add v_datumplneni timestamp")
]]}

V souboru datamodelv.xml je pak nutné popsat nově vytvořený sloupec.

<?xml version="1.0" encoding="windows-1250"?>
<datamodel>
  <Table Name="partneri_akce">
    <Field Name="v_datumplneni" Type="DateTime">
      <DisplayLabel>Datum plnění</DisplayLabel>
      <Hint>Datum plnění</Hint>
      <LookupKeyFields></LookupKeyFields>
      <DataType>DateTime</DataType>
      <Size>0</Size>
      <DisplayWidth>0</DisplayWidth>
      <FieldKind>Data</FieldKind>
      <FieldID>63</FieldID>
      <Tag>0</Tag>
      <Visible>1</Visible>
    </Field>
  </Table>
</datamodel>

Lokální menu

Do lokálního menu ve všech hlavních tabulkách lze přidat vlastní uživatelskou funkci. tyto funkce jsou uloženy v xml souborech v /user/lua a jsou psané pomocí skriptovacího jazyka lua.

Příklad: Do lokálního menu v rozpočtech chceme přidat funkci, která u položek zaktualizuje ceníkovou cenu a náklady dle ceníku.

Výpis souboru rozpocty.rozpocty_rozpocty_menu.xml bude tedy vypadat např. takto:

<?xml version="1.0" encoding="windows-1250"?>
<menu>
  <menuitem>
    <caption>Aktualizace ceníkové ceny a nákladů v označeném rozpočtu</caption>
    <cmdstring>@
      local RozpoctyMD=DSI:OwnerMiddleDB()
      local RozpoctyDS=RozpoctyMD:FindDataSetItem("Rozpocty_rozpocty")
      RozpoctyDS:SetRangeDetail()
      RkapDS=RozpoctyMD:FindDataSetItem("Rozpocty_rkap")
      RpolozkyDS=RozpoctyMD:FindDataSetItem("Rozpocty_rpolozky")
      RkapDS:LocateFirst()
      repeat
        RkapDS:SetRangeDetail()
        RpolozkyDS:LocateFirst()
        repeat
          IDCen=RpolozkyDS:FieldByName("IDCen")
          if IDCen then
            Cena=ClientSession:LookupFields("Rozpocty_cenik","IDCen",IDCen,"Cena")
            Naklady=ClientSession:LookupFields("Rozpocty_cenik","IDCen",IDCen,"Naklady")
            LuaObj:Print(RpolozkyDS:FieldByName("IDRozp"))
            RpolozkyDS:Edit()
            RpolozkyDS:SetFieldByName("CenikCena", Cena)
            RpolozkyDS:SetFieldByName("Naklady", Naklady)
            RpolozkyDS:Post()
          end
        until not RpolozkyDS:LocateNext()
      until not RkapDS:LocateNext()
    </cmdstring>
    <imageindex>38</imageindex>
  </menuitem>
</menu>
lua/upravy_systemu_obis.1179747113.txt.gz · Poslední úprava: 2007/05/21 11:31 autor: Libor Kadaník