Obsah
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ů
- <Table> - "vnitřní" jméno tabulky
- <Caption> - popis tabulky
- <RequredIndexes> - indexy v tabulce
- <Field> - "vnitřní" jméno sloupce a Typ (String, Float, Smallint, Currency, Memo, MMMemo, Right, DateTime)
- <DisplayLabel> - nadpis sloupce; je vidět v OBISu
- <Hint> - nápověda na myš
- <Help> - detailní nápověda pro manuál/wiki
- <LookupKeyFields> - "odskok" do navázané tabulky nebo SQL dotaz
- <DataType> - datový typ - již není potřeba (je nahrazeno atributem u elementu Field)
- <Size> - velikost
- <DisplayWidth> - zobrazovaná velikost
- <DisplayFormat> - formát zobrazovaných čísel (např. 0.## viz. FormatFloat)
- <FieldKind> - charakter sloupce (Data, Lookup, Calculated, Sql)
- <FieldID> - jedinecne ID v tabulce, max 63
- <Tag> - vlastnost sloupce 0-nic, 1-NO COPY, 2-Ignore RowRights, 8-READ ONLY (OnlyForView), 16-ignorovat NoCopy v pripade kopirovani jako detail tabulka
- <Visible> - zobrazení sloupce; 0-NE, 1-ANO
- <LargeTable> - 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.
<?xml version="1.0" encoding="windows-1250"?> <!DOCTYPE DataModel SYSTEM "../system/datamodel.dtd"> <DataModel> <Table Name="rozpocty_rozpocty"> <Field Name="Hlavicka" Type="String"> <DisplayLabel>Popis</DisplayLabel> </Field> </Table> </DataModel>
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.
<?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> <Size>0</Size> <DisplayWidth>0</DisplayWidth> <FieldKind>Data</FieldKind> <FieldID>63</FieldID> <Tag>0</Tag> <Visible>1</Visible> </Field> </Table> </datamodel>
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:
<LookupKeyFields>sklad_karty:idskladkarta</LookupKeyFields> <FieldKind>Data</FieldKind>
ReadOnly lookup na hodnotu v číselníku:
<LookupKeyFields>sklad_karty:idskladkarta=idskladkarta:popis</LookupKeyFields> <FieldKind>Lookup</FieldKind>
Složený
Pridani mnozstvi ze skladu do polozek rozpoctu (rpolozky):
Prida se prvni join na cenik pomoci LookupKeyFields:
<LookupKeyFields>rozpocty_cenik:idcen=idcen:idrezervace</LookupKeyFields>
a druhy join na sklad_karty pomoci:
<LookupKeyFields>sklad_karty:rozpocty_cenik.idrezervace=idskladkarta:mnozstvi</LookupKeyFields>
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:
... <Field Name="IDFaktura" Type="String"> <DisplayLabel>Č. dokladu</DisplayLabel> <Hint>Číslo dokladu</Hint> <LookupKeyFields>#TypDokl</LookupKeyFields> <DataType>String</DataType> <Size>8</Size> <DisplayWidth>8</DisplayWidth> <FieldKind>Data</FieldKind> <FieldID>5</FieldID> <Tag>0</Tag> <Visible>1</Visible> </Field> ... <Field Name="TypDokl" Type="String"> <DisplayLabel>Typ dokladu</DisplayLabel> <Hint>Typ dokladu [F - Faktury, P - Pohyby na skladu (výdejky)]</Hint> <DataType>String</DataType> <Size>1</Size> <DisplayWidth>1</DisplayWidth> <FieldKind>Data</FieldKind> <FieldID>10</FieldID> <Tag>0</Tag> <Visible>1</Visible> <Selections> F-Faktury P-Pohyby skladu </Selections> </Field> ...
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:
... <Middle Name="POHYBY_TAB" ShortCut="P"> ... <Middle Name="FAKTURY" ShortCut="F"> ...
SQL field
<Field Name="v_DodakyVse" Type="String"> <DisplayLabel>Dodací listy všechny</DisplayLabel> <Hint>Dodací listy</Hint> <LookupKeyFields> (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) </LookupKeyFields> <DataType>String</DataType> <Size>100</Size> <DisplayWidth>100</DisplayWidth> <FieldKind>Sql</FieldKind> <Tag>0</Tag> <Visible>1</Visible> </Field>