Informix - Generování sestav ACE

  1. Úvod

    ACE je programový prostředek INFORMIX-SQL, který umožňuje uspořádání uložených dat do výstupních tiskových sestav v požadovaném formátu. Můžeme jej použít například k vytvoření faktur, dopisních štítků, jmenovek, pozvánek atd.
    Specifikace sestavy je uložena v souboru sestava.ACE

    Přeložená sestava v souboru sestava.ARC

  2. Nabídka REPORT

    REPORT: Run Modify Generate New Compile Drop Exit

    Run
    Provede sestavu (generuje tiskový výstup)
    Modify
    Editace existující sestavy
    Generate
    Vygeneruje a přeloží standartní sestavu
    New
    Vytvoří (edituje) zcela novou sestavu
    Compile
    Přeloží specifikaci sestavy (ARC soubor)
    Drop
    Zruší existující specifikace sestavy
    Exit
    Přechod do nadřazeného menu

    Při zadávání nové sestavy se zadává:

  3. Specifikace sestavy

    Může se skládat z šesti částí

    Database
    Určí databázi, ze které budou načítána data
    [ Define ]
    Definuje lokální parametry sestavy a parametry příkazové řádky
    [ Input ]
    Zajišťuje interaktivní vstup parametrů
    [ Output ]
    Určuje rozměry a umístění výstupu
    Select
    Specifikuje příkaz/y Select pro získání dat.
    Format
    Formátuje výstupní data

    Pořadí všech částí je dané a nelze jej měnit.

    1. Sekce Database

      	DATABASE
      		jméno_databáze
      	END
      	

      Sekce je povinná, musí být uvedena jako první a určuje databázi, ze které budeme data načítat.

    2. Sekce Define

      	DEFINE
      		[VARIALE jméno_proměnné datový_typ]
      		[PARAM [celé_číslo] jméno_proměnné datový_typ]
      	END
      	

      Jména proměnných musí začínat písmenem, smí obsahovat písmena, číslice a podtržítko a smí být maximálně 18 znaků dlouhá.

      Parametry jsou naplněny pouze při spouštění sestavy z příkazové řádky. Odkazy na hodnoty proměnných musí předcházet znak $

    3. Sekce Input

      	INPUT
      		[PROMPT FOR jméno_proměnné USING "řetězec"]
      	END
      	

      Pomocí této sekce můžeme od uživatele interaktvině přebírat parametry.

    4. Sekce Output

      	OUTPUT
      		[REPORT TO {"jméno_souboru" | PIPE "program" | PRINTER}]
      		[LEFT MARGIN celé_číslo]
      		[RIGHT MARGIN celé_číslo]
      		[TOP MARGIN celé_číslo]
      		[BOTTOM MARGIN celé_číslo]
      		[PAGE LENGTH celé_číslo]
      	END
      	

      Určuje nastavení okrajů a délek výstupních stran a umístění výstupu.

      Standartně: výstup na obrazovku, levý okraj 6, pravý 132, horní 3, dolní 3, délka stránky 66 řádek.

    5. Sekce Select

      	příkaz_select;
      	...
      	END
      	

      Specifikuje výběr dat z databáze jedním nebo více selekty. V příkazu lze použít odkazy na proměnné nebo parametry, ale je nutné je uvodit znakem $. Až za posledním příkazem Select následuje END.

    6. Sekce Format

      	FORMAT
      		[PAGE HEADER řídící_blok]
      		[PAGE TRAILER řídící_blok]
      		[FIRST PAGE HEADER řídící_blok]
      		[ON EVERY ROW řídící_blok]
      		[ON LAST ROW řídící_blok]
      		[BEFORE GROUP OF řídící_blok]
      		[AFTER GROUP OF řídící_blok]
      	END
      	

      Formátování výstupních dat buď pomocí kompletního nastavení nebo zjednodušeného:

      	FORMAT
      		EVERY ROW
      	END
      	

      Za návěštím řídícího bloku (PAGE HEADER, PAGE TRAILER, ...) se uvádí posloupnost tiskových příkazů, které zajišťují jednotlivé výstupy.

  4. Příkazy, funkce a operátory v řídících blocích

    Lze zde použít:


    1. Print

      	PRINT [seznam_výrazů] [;]
      	PRINT FILE "jméno_souboru"
      	

      Tiskne znakové řetězce, hodnoty sloupců, obsahy proměnných a hodnoty funkcí uvedených v seznamu_výrazů. Středník potlačí odřádkování.

    2. Column

      	COLUMN číselný_výraz
      	

      V seznamu_výrazů příkazu Print převede aktuální pozici tisku v aktuální řádce do uvedeného sloupce.

    3. Space

      	číselný_výraz SPACE[S]
      	

      V seznamu_výrazů příkazu Print přesune aktuální pozici tisku v aktuální řádce o uvedený počet mezer.

    4. Using

      	výraz1 USING výraz2
      	

      Formátuje číselné a datové hodnoty výrazu1 podle formátovacího řetězce výraz2.

      Ve výrazu2 můžete použít speciální znaky:

      <
      Zarovnání doleva
      #
      Zarovnání doprava
      $
      Vpředu doplňuje symbolem měny
      &
      Na plnou délku doplňuje mezerami

    5. Clipped

      	znakový_výraz CLIPPED
      	

      Vynechává ze znakových dat koncové mezery.

    6. LineNo, PageNo

      	LINENO
      	PAGENO
      	

      Vrací aktuální číslo řádky nebo stránky.

    7. Skip

      	SKIP číselný_výraz LINES
      	SKIP TO TOP OF PAGE
      	

      Přeskočí uvedený počet řádek, případně celou stránku.

    8. Need

      	NEED číselný_výraz LINES
      	

      Zajistí, aby se uvedený počet řádek následující za Lines nerozdělil. Pokud by k tomu mělo dojít, převede se celý výstup na další stranu.

    9. Pause

      	PAUSE ["Výzva"]
      	

      Vytiskne výzvu a čeká na potvrzení. Vhodné pro ukončení strany.

    10. Today

      	TODAY
      	

      Vrací hodnotu typu Date s aktuálním kalendářním datem. Standartně se tiskne ve formátu mm/dd/yy, ale lze naformátovat pomocí příkazu Using s následujícími parametry:

      dd
      den v měsíci
      ddd
      třípísmenná zkratka dne v týdnu
      mm
      číselné vyjadření měsíce v roce
      mmm
      třípísmenná zkratka měsíce
      yy
      dvouciferné vyjádření roku
      yyyy
      čtyřciferné vyjádření roku

  5. Řídíci bloky

    1. ON EVERY ROW

      Určuje zpracování jednotlivých řádek vracených Selectem. Za klíčovými slovy uveďte příkaz pro tisk jedné řádky.

    2. FIRST PAGE HEADER a PAGE HEADER

      Tisk titulní strany a horních záhlaví ostatních stránek. First page header na první straně potlačí Page header.

    3. PAGE TRAILER a ON LAST ROW

      Tisk patiček, závěru, souhrnu On last row potlačí vykonání Page trailer na poslední stránce. Na konci řídícího bloku Page trailer se hodí příkaz Pause.

    4. BEFORE GROUP OF a AFTER GROUP OF

      Umožňují seskupovat data podle stejné hodnoty v uvedených sloupích. Blok Before... se provádí před zpracováním řádek z dané skupiny naopak blok After ... se provádí až po jejím zpracování. Mohou obsahovat stejné příkazy jako blok On every row a navíc agregační funkce vyhodnocované nad danou skupinou.

  6. Další funkce a příkazy v řídících blocích

    1. Funkce pracující s datem a časem

      Očekávájí jako argument hodnotu typu Date

      Day
      vrací den v měsíci 1 - 31
      Weekday
      vrací den v týdnu 1 - 7
      Month
      vrací měsíc v roce 1 - 12
      Year
      vrací rok

    2. Agregační funkce
      	[GROUP] {COUNT | PERCENT} [WHERE podmínka]
      	[GROUP] {TOTAL | AVG | MIN | MAX} OF výraz
      	[WHERE podmínka]
      	

      Provádí výpočty nad všemi řádkami a nad řádkami skupin, používají se často v řídících blocích skupin. Předchází-li je klíčové slovo Group, pak vracejí hodnotu získanou výpočtem nad řádkami skupin.

      Count
      vrací počet řádek vracených příkazem Select
      Percent
      vrací procentuální výčíslení počtu řádků skupiny vzhledem k celkovému počtu vybraných řádek
      Total
      vrací součet hodnot sloupce ze všech vybraných řádek.
      Average (Avg)
      vrací průměrnou hodnotu sloupce ze všech vybraných řádek
      Min, Max
      vraci minimální (maximální) hodnotu sloupce ze všech vybraných řádek

    3. Další funkce
      	ASCII číselný_výraz
      	DATE
      	DATE (datový_výraz)
      	MDY (číselný_výraz, číselný_výraz, číselný_výraz)
      	TIME
      	
      Ascii
      vrací znak s udanou číselnou hodnotou
      Date
      vrací retězec s aktuálním datem a nebo datem určeným argumentem
      Mdy
      sestavuje datum z jednotlivých položek data
      Time
      vrací aktuální čas

  7. Řídící příkazy v řídících blocích sestav

    	IF výraz THEN příkaz
    		[ELSE příkaz]
    
    	WHILE výraz DO
    
    	FOR čítač = výraz1 TO výraz2 [STEP výraz3]
    
    	LET proměnná [číselný_výraz [, číselný_výraz]] = seznam_výrazů
    
    	BEGIN příkaz ... END
    	

    V řídících blocích sestav můžete použít podmíněný příkaz IF-THEN-ELSE, cykly WHILE a FOR a přiřazovací příkaz LET. Do příkazů IF-THEN-ELSE, WHILE a FOR se začleňují buď jednotlivé příkazy nebo skupiny příkazů uzavřené do bloku BEGIN-END. Příkaz IF-THEN-ELSE musí mít v řídícich blocích FIRST PAGE HEADER a PAGE HEADER stejný počet vytištěných řádek v části IF i ELSE.

  8. Překlad a spuštění sestavy z příkazové řádky

    Při návrhu není nutné používat prostředí INFORMIX-SQL. Vzhled sestavy můžeme vytvořit v libovolném editoru a uložit do souboru s příponou .ace

    Překlad sestavy se následně provede příkazem saceprep jméno_sestavy.ace. Pokud byl překlad sestavy úspěšný, specifikace je uložena do souboru s příponou arc. Nebyl-li překlad úspěšný v souboru jméno_sestavy.err nalezneme lokalizaci a popis chyby.

    Úspěšně přeloženou sestavu potom spustíme příkazem sacego jméno_sestavy. Tento způsob je jediný možný, pokud chceme do sestavy přidávat externí parametry na příkazové řádce.

  9. Příklady na ukázku

    Vytvoření databáze pro naše pokusy
    CREATE TABLE students (
     id INTEGER not NULL,
     name char(20),
     surname char(25),
     math integer,
     biology integer,
     chemistry integer,
     history integer,
     primary key (id)
    );
    
    Vlož nějaké hodnoty
    INSERT INTO students (id, name, surname, math, biology, chemistry, history)
    VALUES (1, 'Karel', 'Novak', 1, 2, 1, 2);
    INSERT INTO students (id, name, surname, math, biology, chemistry, history)
    VALUES (2, 'Pavel', 'Zahrada', 2, 3, 1, 2);
    INSERT INTO students (id, name, surname, math, biology, chemistry, history)
    VALUES (3, 'Tomas', 'Blaha', 3, 2, 1, 1);
    INSERT INTO students (id, name, surname, math, biology, chemistry, history)
    VALUES (4, 'Ondrej', 'Semrad', 1, 1, 2, 1);
    

    database krylm9am end
    
    output
      left margin 2
      right margin 100
      page length 15
    end
    
    select name, surname, math, biology, chemistry, history from students order by surname, name
    end
    
    format
    
    page header
      print "-----------------------------------------------------------------"
      print " jmeno     | prijmeni    |  Math   |  Biol    |  Chem   | Hist  |"
      print "-----------|-------------|---------|----------|---------|--------"
    
    on every row
      print column 3, name CLIPPED ;
      print " ";
      print column 15, surname CLIPPED ;
      print column 31, math using "<<<" ;
      print column 41, biology using "<<<" ;
      print column 51, chemistry using "<<<" ;
      print column 61, history using "<<<"
    
    page trailer
      print "-----------------------------------------------------------------"
      pause " --- enter dalsi strana --- "
    end
    

    database krylm9am end
    
    output
      page length 30
    end
    
    select name, surname, math, biology, chemistry, history from students order by surname, name
    end
    
    format
    
    page header
      print "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"
      print column 3, "Prospechove karty vsech zaku"
      print "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"
      print column 2, "Strana ", PAGENO using "<<<";
      print column 35, "Dne: ", TODAY using "ddd dd. mmm yyyy"
      skip 2 lines
    
    
    on every row
      need 8 lines
      print column 3, "+----------------------------------------+"
      print column 3, "| Prijmeni: ", surname CLIPPED, 1 space;
      print column 44, "|"
      print column 3, "| Jmeno: ", name CLIPPED, 1 space;
      print column 44, "|"
      print column 3, "| Matematika: ", math;
      print column 44, "|"
      print column 3, "| Biologie:   ", biology;
      print column 44, "|"
      print column 3, "| Chemie:     ", chemistry;
      print column 44, "|"
      print column 3, "| Dejepis:    ", history;
      print column 44, "|"
      print column 3, "+----------------------------------------+"
    
    skip to top of page
    
    page trailer
      skip 2 lines
      print "---------------------------------------------------"
      pause "---- dalsi karta ENTER ----"
    
    on last row
      skip 2 lines
      print "---------------------------------------------------"
      print column 3, "Prohledli jste si kompletni zaznamy nasi skoly"
      skip 2 lines
      print "Pocet karet: ", COUNT using "<<<"
      print "Prumer znamek "
      print "--------------------------"
      print "Matematika: ", avg of math using "<<<"
      print "Biologie: ", avg of biology using "<<<"
      print "Chemie: ", avg of chemistry using "<<<"
      print "Dejepis: ", avg of history using "<<<"
    
    end