====== Datamodel.xml ====== ===== Struktura ===== 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. ===== Popis elementů ===== * - "vnitřní" jméno tabulky *
- popis tabulky * - indexy v tabulce * - "vnitřní" jméno sloupce a Typ (String, Float, Smallint, Currency, Memo, MMMemo, Right, DateTime) * - nadpis sloupce; je vidět v OBISu * - nápověda na myš * - detailní nápověda pro manuál/wiki * - "odskok" do navázané tabulky nebo SQL dotaz * - datový typ - již není potřeba (je nahrazeno atributem u elementu Field) * - velikost * - zobrazovaná velikost * - formát zobrazovaných čísel (např. 0.## viz. [[:lua:formatovaci_funkce#formatfloat_-_pouziva_se_pro_formatovani_meny|FormatFloat]]) * - charakter sloupce (Data, Lookup, Calculated, Sql) * - jedinecne ID v tabulce, max 63 * - vlastnost sloupce 0-nic, 1-NO COPY, 2-Ignore RowRights, 8-READ ONLY (OnlyForView), 16-ignorovat NoCopy v pripade kopirovani jako detail tabulka * - zobrazení sloupce; 0-NE, 1-ANO * - ovlivňuje způsob otevírání číselníku: 0-small, 1-normal, 2-big, 3-huge ===== Uživatelské změny ===== ==== Bez změny databáze ==== Jednoduché změny se provádí předefinováním požadovaných hodnot v souboru //user/datamodel.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 v adresáři //user// obsahuje jen ty položky, které potřebujeme změnit. //Příklad//: Změna popisu sloupce //hlavicka// v rozpočtech na //popis//. V souboru //user/datamodel.xml// je nutné uvést jméno tabulky a jméno sloupce a pak požadovanou změnu. Popis
==== Se změnou databáze ==== Pokud je potřeba udělat nějaký fyzický zásah do tabulky, musí se udělat upgrade. Do souboru //user/upgrade.dat// se vloží SQL dotaz, který provede v databázi požadovanou změnu a pak se tato změna popíše v souboru //datamodel.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. === Upgrade.dat === Do souboru //upgrade.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 //upgrade.dat// bude po doplnění vypadat následovně: Entry{"41","1.2.2005", [[ UpData("alter table partneri_akce add v_datumplneni timestamp") ]]} Položky tabulky Entry mají následující význam: * **41** - číslo verze uživatelských dat. Číslování systémových verzí je prováděno po desítkách. Pro uživatelské verze jsou pak vyhrazeny hodnoty mezi. Verze uživatelských dat by tedy měla být o jedničku vyšší než je aktuální verze dat systému. * **1.2.2005** - datum vytvoření změny dat * **Updata ...** - příkazy úprav dat (typicky SQL alter table) === Datamodel.xml === V souboru //datamodel.xml// je pak nutné popsat nově vytvořený sloupec. Datum plnění Datum plnění 0 0 Data 63 0 1
===== LookupKeyFields ===== LookupKeyFields je ve formátu: Middle:[Table.]KeyFields[=LookupKeyFields][:ResultField] * slozene KeyFields a LookupKeyFields se pisi se strednikem * moznost filtrace lookup tabulky dle druhu napr. Zastupci:Zastupce|IDPartner=IDPartner * na pozici Middle muze byt #FieldName, dle jehoz hodnoty je dohledano middle dle ShortCut v midregisteru ===== Běžné ===== Datové pole s vazbou do číselníku: sklad_karty:idskladkarta Data ReadOnly lookup na hodnotu v číselníku: sklad_karty:idskladkarta=idskladkarta:popis Lookup ===== Složený ===== Pridani mnozstvi ze skladu do polozek rozpoctu (rpolozky): Prida se prvni join na cenik pomoci LookupKeyFields: rozpocty_cenik:idcen=idcen:idrezervace a druhy join na sklad_karty pomoci: sklad_karty:rozpocty_cenik.idrezervace=idskladkarta:mnozstvi vysledkem je nasledujici join: select ... from rozpocty_rpolozky LEFT JOIN rozpocty_cenik rozpocty_cenik ON rozpocty_cenik.idcen = rozpocty_rpolozky.idcen LEFT JOIN sklad_karty sklad_karty ON sklad_karty.idskladkarta = rozpocty_cenik.idrezervace ===== Variantní ===== Pokud potřebujeme, aby byl Lookup variantní (odskok do různých tabulek), lze toto docílit následujícím postupem. Nejprve musí existovat sloupec, který bude rozhodovat o tom, do které tabulky bude Lookup proveden. Např. sloupec //Typ dokladu// v položkách majetku. V sloupci //Č. dokladu// je pak odkaz na tento "rozhodovací sloupec" v tagu //LookupKeyFields// uvozený znakem #. Ukázka části souboru //Datamodel.xml//: ... Č. dokladu Číslo dokladu #TypDokl String 8 8 Data 5 0 1 ... Typ dokladu Typ dokladu [F - Faktury, P - Pohyby na skladu (výdejky)] String 1 1 Data 10 0 1 F-Faktury P-Pohyby skladu ... V uvedeném příkladu tedy může //typ dokladu// nabývat hodnot //F resp. P//. Která tabulka se má otevřít se pak zjistí ze souboru //Midregister.xml// z atributu //ShortCut// v tagu //Middle// (viz. následující ukázka: ... ... ... ===== SQL field ===== Dodací listy všechny Dodací listy (select CAST(list(distinct f.idfaktura,',') as VARCHAR(100)) from faktury_faktury f JOIN faktury_fpolozky fp ON fp.idfaktura = f.idfaktura JOIN faktury_fdruh fd ON fd.idfdruh = f.idfdruh where fp.idzakaz = zakazky_zakpol.idzakaz and fp.idzakpol = zakazky_zakpol.idzakpol and fd.znamenko = 0 and fd.znamenkodph = 0) String 100 100 Sql 0 1