Uživatelské nástroje

Nástroje pro tento web


xml:datamodel.xml

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>
xml/datamodel.xml.txt · Poslední úprava: 2021/02/12 08:44 autor: Karel Petrů