# Protokoly a sestavy

Mnoho aplikací musí výsledná data prezentovat v podobě různých graficky úhledných protokolů či sestav. Pro tvorbu takových protokolů a sestav jsou v systému Control Web k dispozici různé prostředky ať již vnitřní, nebo vnější — například lze využívat ActiveX komponenty nebo aplikace, do kterých je možné data z aplikace zapisovat přes ODBC nebo DDE (nebo nějak jinak). Protokoly nebo sestavy mohou být plněny přímo aktuálními daty získanými v reálném čase, stejně tak dobře je však možné data zpracovávat postupně nebo po určitém čase (data se mohou načítat například z archivních souborů).

## Načítání dat z archivních souborů

Pro načítání dat z archivních souborů, je možné v systému Control Web využívat přístrojů sql a recipe. Pomocí přístroje recipe lze přistupovat pouze k archivním souborům ve formátu dBase III Plus, přičemž je nutné, aby definice jednotlivých položek přístroje (které popisují strukturu záznamu), přesně odpovídala formátu záznamu v databázovém souboru. Tato omezení plně eliminuje přístroj sql, kde pomocí nativních procedur můžete přes rozhraní ODBC přistupovat do libovolných databázových systémů (existují-li pro ně příslušné ovladače). Výsledky uskutečněných SQL příkazů můžete z přístroje sql vyčíst prostřednictvím jeho nativních procedur. V aplikaci lze pak snadno získané výsledky použít v jakémkoli protokolu.

Pro názornost následují příklady načítání dat z archivních souborů do aplikačního programu prostřednictvím obou výše zmiňovaných přístrojů.

### Načtení dat pomocí přístroje recipe

    Recipe.OpenFile( Path, &ok );
    (* Načtení souboru obsaženého v parametru Path *)

    if ok then (* Soubor byl úspěšně načten *)
      n = 1;
      Recipe.SetRecipe( n, &ok );
      (* Nastavení dat z prvního záznamu *)

      while ok do (* Pokud jsou data k dispozici, provedou se příkazy v cyklu *)
      (*  Na datových elementech nadefinovaných u jednotlivých položek přístroje
          recipe, jsou nyní nastaveny hodnoty položek z aktuálního záznamu. *)
        n = n + 1;
        Recipe.SetRecipe( n, &ok ); (* Nastavení dat z n-tého záznamu*)
      end;
    end;

### Načtení dat pomocí přístroje sql

    Sql.OpenDatabase( 'vxmodule.dsn', '', '', &ok );
    (* Připojení se ke zdroji dat *)

    if ok then
      (* Připojení bylo úspěšné *)
      (* Výběrový dotaz, jehož výsledkem bude množina odpovídajících záznamů *)
      Sql.OpenRecordset( 'Modul',
                         'SELECT * FROM VXA1459 WHERE SN = 990814590638',
                          &ok );

      if ok then (* Dotaz byl úspěšně zpracován *)
        Sql.MoveToFirstRecord( 'Modul', &ok );
        (* Nastavení kursoru na první záznam *)

        while) ok do
          Sql.ReadData( 'Modul', 'Input', &In1, &ok );
          (* Načtení dat z aktuálního záznamu *)
          Sql.ReadData( 'Modul', 'Output1', &Out1, &ok );
          Sql.ReadData( 'Modul', 'Output2', &Out2, &ok );
          Sql.ReadData( 'Modul', 'Output3', &Out3, &ok );

         (* Datové elementy 'In1', 'Out1', 'Out2' a 'Out3'
            obsahují nyní načtené hodnoty z aktuálního záznamu *)

          Sql.MoveToNextRecord( 'Modul', &ok);
          (* Nastavení kursoru na další záznam *)
        end;

        Sql.CloseRecordset( 'Modul' );
      end;

      Sql.CloseDatabase();
    end;

## Využití přístroje table

Přístroj table, nebo chcete-li tabulkový přístroj, umožňuje díky své přímé vazbě na tabulkový kalkulátor InCalc velmi snadné použití při tvorbě protokolů. Tvorba protokolu probíhá ve dvou fázích. V tabulkovém kalkulátoru InCalc je nejprve třeba vytvořit šablonu protokolu, do které definujete vzhled tabulky, grafy, matematické vztahy a i případné umístění dekorativních obrázků. V přístroji table se pak soubor s předdefinovanou šablonou protokolu definuje parametrem template_file. V druhé fázi je třeba definovat, jak se mají (a kam) příslušná data z aplikace do tabulky zapisovat.

Protokol o měření vytvořený v přístroji table

Zápis do jednotlivých buněk tabulky je možné realizovat pomocí nabízených parametrů přístroje table

    item_expr
      layer = Layer;
      row = Row;
      column = Col;
      expression = In1;
    end_item_expr;
    item_expr
      layer = Layer;
      row = Row;
      column = Col + 1;
      expression = Out1;
    end_item_expr;
    item_expr
      layer = Layer;
      row = Row;
      column = Col + 2;
      expression = Out2;
    end_item_expr;
    item_expr
      layer = Layer;
      row = Row;
      column = Col + 3;
      expression = Out3;
    end_item_expr;

nebo pomocí nativních procedur

    ...
    Table.SetRealValue( Layer, Row, Col, In1, false, false );
    (* Zápis datového elementu In1 do vrstvy Layer, řádku Row a sloupce Col *)
    Table.SetRealValue( Layer, Row, Col + 1, Out1, false, false );
    (* Zápis datového elementu Out1 do vrstvy Layer, řádku Row a sloupce Col + 1 *)
    Table.SetRealValue( Layer, Row, Col + 2, Out1, false, false );
    (* Zápis datového elementu Out2 do vrstvy Layer, řádku Row a sloupce Col + 2 *)
    Table.SetRealValue( Layer, Row, Col + 3, Out1, false, false );
    (* Zápis datového elementu Out3 do vrstvy Layer, řádku Row a sloupce Col + 3 *)
    ...

Každnou sestavu lze pro pozdější použití uložit do souboru nebo vytisknout na tiskárně.

## Tisk pomocí systémových nativních procedur

Ze systému Control Web lze také tisknout prostřednictvím systémových nativních procedur. Tisknout se dá na jakoukoliv tiskárnu definovanou v operačním systému. Navíc je také možné zapnout souběžné zapisování tištěného protokolu do textového souboru.

Tento způsob tvorby sestav je poněkud náročnější, protože je třeba programově formátovat jednotlivé řádky sestavy. Pomocí procedury PrintCmd je také možné posílat řídicí kódy pro použitou tiskárnu (volba velikosti písma apod.).

Příklad:

    OpenPrinter( 'Protokol', &ok ); (* Otevření tiskové úlohy *)
    if ok then
      (* Otevření tiskové úlohy bylo úspěšné *)
      system.Print( 'Modul VXA1459)' ); (* Nadpis protokolu *)
      system.PrintLn(); (* Odřádkování *)

      system.PrintCharRep( '-', 13 ); (* Podtržení nadpisu *)
      system.PrintLn(); system.PrintLn();

      system.Print( 'Výrobní číslo: ' ); system.Print( SerialNumber );
      system.PrintLn();

      system.Print( 'Datum: ' ); system.Print( DateString );
      system.PrintLn();

      system.Print( 'Technik: ' ); system.Print( user_name );
      system.PrintLn();
      system.PrintLn();

      ...
      (* Další řádky protokolu *)

      system.ClosePrinter();
      (* Uzavření tiskové úlohy a spuštění tisku *)
    end;