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.
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>
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.
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:
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 je ve formátu:
Middle:[Table.]KeyFields[=LookupKeyFields][:ResultField]
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>
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
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"> ...
<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>