Novinky pro vývojáře květen-srpen 2011

vydání: 20110831 - verze: 12

Zajištění referenční integrity dat ve vlastních databázích

Modul nebo doplněk rozšiřující Vario (dále jen doplněk) může používat vlastní databáze. V databázi doplňku mohou být uloženy klíče nějakého záznamu Varia (např. Firma, Produkt), u kterých je potřeba zajistit referenční integritu. Například odstranění souvisejících záznamů z databáze doplňku při odstranění kontaktu z adresáře nebo aktualizaci klíče Firma při přejmenování firmy.

Vario nyní umožňuje definovat systémové akce, které tuto integritu zajistí. Akce se ukládají do možností Varia. Předpokládá se, že tvůrce doplňku bude tyto akce distribuovat pomocí manifestu.

Tip: pro vytvoření vazby je někdy lepší použít pole RowGUID, které obsahuje identifikátor typu GUID. Hodnotu tohoto pole uživatel nemůže změnit. Řešení integrity se potom omezí pouze na případ odstranění záznamu.

Do tabulky Firmy. Moznosti_varia_profil se uvedou akce pro zajištění integrity dat následovně:
Do pole Klíč se uvede: VARIO\<Modul>\<Agenda>\\<Typ události>, kde
<Modul> je název modulu,
<Agenda> je název agendy, u níž se sledují změny a
<Typ události> je { "PoPridaniZaznamu" | "PoAktualizaciKlice" | "PredOdstranenimZaznamu" | "PoOdstraneniZaznamu" }.
Do pole Nazev_hodnoty se uvede: <Agenda nebo Doplněk>\<Popis>
<Agenda nebo Doplněk> - Název agendy nebo doplňku, u jejichž dat se má udržovat integrita.
<Popis> - Krátký popis, co se má stát.
Pozor: primární klíč tabulky Moznosti_varia_profil je tvořen poli Klic a Nazev_hodnoty.

Do pole Hodnota se uvede jedna ze dvou možností:
1) Definice SQL dotazu v syntaxi "Vario". Pro události PoPridaniZaznamu, PredOdstranenimZaznamu a PoOdstraneniZaznamu může obsahovat nejvýše jeden parametr libovolného jména, který se doplní hodnotou primárního klíče přidávaného, resp. odstraňovaného záznamu. Např.:
Data####;Parameters par1 Text;delete from MojeTabulka where PK_Klic = [par1];PASSTHROUGH=*
Pro událost PoAktualizaciKlice může obsahovat nejvýše dva parametry libovolného jména, z nichž první se vyplní novou hodnotou klíče a druhý parametr původní hodnotou klíče. Např.:
Data####;Parameters parNovy Text, parStary Text; Update MojeTabulka set PK_Klic = [parNovy] where PK_Klic = [parStary];PASSTHROUGH=*

2) Skript pro VarioLib.Evaluator uvedený textem "EVAL:".
Například:
EVAL:Msgbox([ZaznamPuvodni] & " se změnil na " & [ZaznamNovy])
Evaluator je nainicializován tak, aby ve skriptu byla dostupná proměnná Vario, a předává se mu kolekce s prvky "ZaznamPuvodni" (původní hodnota klíče - události PoAktualizaciKlice, PredOdstranenimZaznamu a PoOdstraneniZaznamu) a "ZaznamNovy" (nová hodnota klíče - události PoPridaniZaznamu a PoAktualizaciKlice).

Díky těmto akcím můžete zajistit aktualizaci záznamů v databázích vašich doplňků. Aktualizace se řeší jednotným způsobem pro data na souborovém i SQL serveru.

Nové funkce VytvoritAkciAgendy a PridatAkciAgendy

Do třídy VarioLib.Agenda byly přidány funkce
Function VytvoritAkciAgendy(NazevAkce As String) As AgendaAkce
Function PridatAkciAgendy(Akce As AgendaAkce) As AgendaAkce
Standardní agendy Varia umožňují definovat akce uživatelsky. Někteří vývojáři však potřebují ve svých agendách akce pevně dané, které nelze uživatelským nastavením změnit. Tyto funkce slouží pro vytvoření akce programem. Takto vytvořené akce se nezobrazují v možnostech agendy a uživatelsky je není možné modifikovat. To zajišťuje, že akce, na které je řešení závislé, bude vždy k dispozici.

První funkce vytvoří instanci třídy AgendaAkce. Této instanci nastavíte požadované vlastnosti a poté ji předáte agendě funkcí PridatAkciAgendy. Takto vytvořené akce nejsou persistentní, při příštím spuštění programu je musíte vytvořit znovu.

Událost PoVlozeniProduktuDoDokladu se volá také při změně Varianty

Nově se událost PoVlozeniProduktuDoDokladu volá též při změně Varianty produktu. Díky tomu mohou událostí doplňky reagovat též na upřesnění Varianty.

Změny datové struktury (ve vydání 20110803)

Data####.Katalog_varianty_produktu přidána analogická pole z tabulky Katalog:

  • Publikovat
  • Novinka
  • Akce
  • Top_produkt
  • Nabizet_v_dokladech
  • Vyrobni_strategie
  • Doba_dodani
Jedná se o přípravu na rozšíření možností katalogu Variant.

 
Pole Komentář bylo zvětšeno na 255 znaků:

  • Data####.Doklady.Komentar
  • DUct####.Penezni_denik_doklady.Komentar
  • DUct####.Ucetni_denik_doklady.Komentar
  • DEvi####.Smlouvy_polozky.Komentar_dokladu

Data####.Sklad byla přidána analogická pole z tabulky Katalog:

  • Pouzivat_sarze_sklad
  • Pouzivat_trvanlivosti_sklad
  • Pouzivat_seriova_cisla_sklad
  • Pouzivat_umisteni_sklad
  • Pouzivat_baleni_sklad

Jedná se o přípravu možností nastavení těchto hodnot pro skladové položky.

DEvi####.Smlouvy_polozky přidáno pole Nasobit_cenu_intervalem : typ Boolean

DEvi####.Smlouvy přidána pole Telefon: text 40 a e_mail : text 100

DMzd####.Pracovnici pole E_mail: zvětšeno z 50 na 100 znaků

DUDR####.Zarizeni_udrzby přidána nová pole

  • Nazev_zarizeni : text 150
  • Seriove_cislo : text 50
  • Vyrobce : text 50
  • Datum_nakupu : date
  • Datum_prodeje : Date
  • Doklad_prodeje : text 30
  • Doklad_nakupu : text 30
  • Pole Kod zvětšeno na 30 znaků.

DUDR####.Zarizeni_udrzby_ukony přidána nová pole

  • Produkt : text 30
  • Mnozstvi : desetinne cislo
  • Doba_trvani : mena

DUDR####.Servisni_tikety_ukony přidána nová pole

  • Produkt : text 30
  • Mnozstvi : desetinne cislo 14.6
  • Doba_trvani : mena

Nové řešení tiskového formuláře Faktura

Tiskový formulář Faktura byl přepracován tak, aby se tiskly jen údaje, které jsou vyplněné. Pokud uživatel nevyplní například údaj Konstantní symbol, netiskne se zbytečně titulek Konstantní symbol vedle prázdné hodnoty.

Toto vylepšení si vyžádalo formátování reportu pomocí programu. Kód za reportem skrývá nepotřebné prvky a rovná rozestupy následujících prvků tak, aby místo na reportu bylo co nejúsporněji využito.

Při úpravách vzhledu faktury je potřeba na to pamatovat. Při odstranění prvku z reportu je potřeba odstranit jeho volání z programu. Při přidání prvku bude pravděpodobně potřeba do programu přidat jeho zarovnávání k ostatním prvkům.

Logo na tiskové formuláře

Vario umožňuje uživatelsky nastavit logo na tiskové formuláře typu faktura. Doporučujeme vám využívat tuto možnost i ve vámi vyvíjených řešeních. Implementace je snadná. Z originálního tiskového formuláře Faktura zkopírujte prvek LogoFaktury do záhlaví stránky (záhlaví není podmínkou) vašeho reportu. Potom zkopírujte následující řádek kódu z události Report_Open do stejné události vašeho reportu:
mFormulare.ZobrazitLogoNaFakture Me!LogoFaktury, Me!labDoklad_a_cislo_dokladuDruhý parametr je volitelný a obsahuje odkaz na prvek, který se má zobrazit vedle loga. U standardních formulářů Varia se jedná o velké číslo dokladu, které tiskneme v záhlaví vedle loga.

Tip: Logo by se z úsporných důvodů mělo používat pouze na tiskových formulářích, které se posílají mimo firmu (faktura, dodací list apod.) nikoli na reportech určených pro interní potřebu.

Užitečná funkce ReportRamecek

V modulu mFormulare ve Vario.mda je funkce ReportRamecek
Sub ReportRamecek(pReport As Report, pPrvekLevaStrana As Control, pPrvekPravaStrana As Control, pPrvekHorniStrana As Control, pPrvekSpodniStrana As Control, Optional pColor As Long, Optional pPouzitVetsiPrvekSpodniStrana As Control, Optional pKorekceLevaStrana As Long, Optional pKorekcePravaStrana As Long, Optional pKorekceHorniStrana As Long, Optional pKorekceSpodniStrana As Long)
Tato funkce kreslí rámečky okolo skupiny prvků na reportu. Využije se například pokud zákazník vyžaduje fakturu klasického vzhledu. Rámečky lze samozřejmě vytvořit i pomocí prvků obdélník nebo čára, ale v tom případě nebude fungovat vlastnost zvětšení na prvcích uzavřených v rámečku.
 

Tip: Zajistěte načtení všech záznamů v recordsetu

Když čtete data pomocí recordsetu, který může vrátit více než jeden záznam, ujistěte se, že načtete všechny záznamy, které vrací dotaz, na němž je recordset založen. Probíhající čtení za prvé vytváří čtecí zámky nad danou tabulkou a za druhé blokuje připojení na SQL server. Blokování připojení na SQL server může vést k nečekaným chybám. Například vytvoříte dočasnou tabulku na SQL serveru. Tabulka je vytvořena pro určité ID připojení. Následně chcete z tabulky číst. Připojení, které bylo použito pro vytvoření dočasné tabulky, nelze pro čtení použít, protože je blokováno nekonečným čtením. Automaticky se proto vytvoří nové připojení s novým ID. Toto připojení ovšem "nevidí" dočasnou tabulku, protože ta je vytvořena pro připojení s původním ID. Problémy s blokováním uživatelů čtecími zámky asi není třeba popisovat.

Načtení všech záznamů lze provést dvěma způsoby.

1) Pokud používáte pro otevírání recordsetů třídu Data (což doporučujeme), můžete využít flag UvolnitZamky.
Například
Set R = Vario.Databaze.AdHocDotaz(dbData, SQL).DejRecordset(KeCteni + UvolnitZamky)
2) Použijte metodu MoveLast pro vynucení načtení.
Například
With R
    If Not .EOF Then
        .MoveLast
Problém se čtením se týká též recordsetů, které vytváří uživatelské rozhraní. Konkrétně formuláře a seznamy.

Příklad vynucení načtení pro formuláře
Private Sub Form_Current()
    On Error Resume Next 
    If AktualniFirmaInstance.JeNaSQLServru Then
      Me.RecordsetClone.MoveLast
    End If
End Sub

Příklad vynucení načtení pro pole se seznamem
    Me!Stredisko.RowSource = "S_Strediska"
    UvolniZamkyKomba Me!Stredisko