13.5.4 Klauzule COLUMN Formát: {COLUMN | COL} NUMBER IS celé-číslo Funkce: Klauzule COLUMN určuje umístění tiskové položky na řádku. Pravidla: 1) Slova COLUMN a COL jsou ekvivalentní. 2) Klauzule COLUMN smí být uvedena pouze v popisu elementární položky, tj. položky popsané dle formátu 3. Elementární položka s klauzulí COLUMN se nazývá tisková položka (viz 13.5.). 3) Uvedení klauzule COLUMN v popisu položky určuje, že tato položka je určena k tisku a že se bude tisknout vždy, když dojde k tisku té skupiny sestavy, k níž patří (pokud ovšem nebude tisk této položky potlačen pomocí klauzule GROUP). 4) Celé-číslo uvedené v klauzuli COLUMN určuje pozici (tj. pořadové číslo sloupce) na tiskové řádce pro levý krajní znak položky. Prvnímu znaku tiskové řádky odpovídá tedy klauzule "COLUMN 1". Při určování pořadového čísla prvního znaku položky se nepočítají identifikační znak zařazený pomocí klauzule CODE ani řídicí znaky tiskárny, jedná se tedy o pořadové číslo znaku pouze v rámci datové oblasti logické věty (označené v 13.3. písmenem D). Toto pořadové číslo může však být ještě modifikováno pomocí klauzule SHIFT (viz 13.5.10.). 5) Celé-číslo uvedené v klauzuli COLUMN musí být kladné a nejvýše tak velké, aby poslední znak tiskové položky ještě ležel v rámci datové oblasti logické věty (viz 13.3.); vystupují-li logické věty sestavy prostřednictvím dvou výstupních souborů s nestejnými délkami logických vět, provádí se tato kontrola pouze pro soubor s delšími logickými větami. Je-li použita klauzule SHIFT (viz 13.5.10.), budou tyto kontroly prováděny až po příslušné modifikaci celého-čísla uvedeného v klauzuli COLUMN. 6) Položka s klauzulí COLUMN musí mít současně klauzuli PICTURE. Dále je povinné, aby buďto u ní anebo u některé z položek popsaných před ní v rámci téže skupiny sestavy byla uvedena klauzule LINE. 7) Popisy tiskových položek patřících k téže klauzuli LINE (a tedy tisknutých na témže řádku) nemusí být seřazeny tak, aby celá čísla uvedená v klauzulích COLUMN tvořila vzrůstající posloupnost; je to však vhodné kvůli přehlednosti a pro možnost účinného použití klauzule SHIFT. 8) Úseky řádku, příslušející jednotlivým tiskovým položkám tisknutým na témže řádku, se smí překrývat. V překrývané části úseku řádku bude tisknuta vždy ta tisková položka, která je popsána později. 9) Elementární položka bez klauzule COLUMN patří sice do příslušné skupiny sestavy, nebude však při jejím tisku nikdy tisknuta. Taková položka nesmí mít klauzuli VALUE; musí tedy mít buďto klauzuli SUM (pak se jedná o sumátor neurčený pro tisk, nýbrž pravděpodobně pro přičítání k jinému sumátoru anebo pro použití v PROCEDURE DIVISION nebo v klauzuli SOURCE) anebo klauzuli SOURCE (pak se jedná o netiskovou položku, jejíž jediný možný smysl je zajistit, aby argument uvedený za slovem SOURCE byl přičítán k nějakému sumátoru při vytváření určité detailní skupiny; podrobněji viz 13.5.7.). 13.5.5. Klauzule VALUE - - | literál | Formát: VALUE IS < figurativní-konstanta > | ALL-klauzule | - - Pravidla: 1) Klauzule VALUE smí být uvedena pouze v popisu tiskové položky (tj. položky popsané dle formátu 3, která má v popisu klauzule COLUMN a PICTURE). 2) Má-li být tato položka tisknuta (tj. provádí-li se tisk její nadřízené skupiny sestavy, přičemž tisk položky není potlačen pomocí klauzule GROUP), bude údaj uvedený v klauzuli VALUE přesunut do této tiskové položky podle pravidel příkazu MOVE (viz 6.1.). Tento přesun musí být přípustný. 3) Úsek paměti položky s klauzulí VALUE je přímo součástí tiskového řádku a je tedy po každém tisku vymezerován. 13.5.6. Klauzule SOURCE Formát: SOURCE IS položka Pravidla: 1) Klauzule SOURCE smí být uvedena pouze v popisu elementární položky (tj. položky popsané dle formátu 3). 2) Položka uvedená za slovem SOURCE smí být definována kdekoliv v DATA DIVISION; z REPORT SECTION lze však v klauzuli SOURCE uvést pouze tyto položky: - položky PAGE-COUNTER, LINE-COUNTER a CBL-CTR patřící k téže sestavě anebo k sestavám popsaným před tou sestavou, k níž patří položka s klauzulí SOURCE; - položku PRINT-SWITCH; - sumátory (tj. položky s klauzulí SUM) definované v téže sestavě anebo v sestavách popsaných před tou sestavou, k níž patří položka s klauzulí SOURCE. 3) Položka uvedená za slovem SOURCE smí být jakéhokoliv typu s výjimkou USAGE INDEX. Lze zde uvést též libovolnou položku definovanou překladačem (viz 4.11.). Funkce: Je-li klauzule SOURCE uvedena v popisu tiskové položky (tj. elementární položky s klauzulemi COLUMN a PICTURE), pak před tiskem této tiskové položky bude položka uvedená za slovem SOURCE přesunuta do této tiskové položky podle pravidel příkazu MOVE (viz 6.1.). Platí pak následující: a) Do tiskové položky se bezprostředně před jejím tiskem přesune okamžitá hodnota položky uvedené za slovem SOURCE. Je to většinou hodnota položky, jaká byla na začátku provádění toho příkazu GENERATE resp. TERMINATE, jenž způsobil tisk této skupiny sestavy; ke změnám může dojít jen v těchto případech (viz též popis příkazu GENERATE): - Jedná-li se o sumátor, k němuž se již přičítalo (neboť křížové a postupné přičítání se provádí na začátku provádění příkazu GENERATE resp. TERMINATE, zatímco prosté přičítání se provádí až bezprostředně před vytvořením skupiny typu DETAIL). - Jedná-li se o řídicí položku, přičemž položka s klauzulí SOURCE je popsána ve skupině typu CONTROL FOOTING; pak má v době provádění přesunu do položky s klauzulí SOURCE tato řídicí položka navrácenu starou hodnotu, která platila před řídicí změnou. (Naproti tomu při vytváření skupin CONTROL HEADING a DETAIL již opět platí nové hodnoty řídicích položek.) - Změní-li uživatel sám hodnotu položky v deklarativní sekci typu USE BEFORE REPORTING popsané pro tuto skupinu, v níž je položka s klauzulí SOURCE, anebo v deklarativní sekci popsané pro některou z dříve vytvářených skupin v rámci provádění téhož příkazu GENERATE resp. TERMINATE. b) Úsek paměti tiskové položky s klauzulí SOURCE je přímo součástí tiskového řádku a je tedy po každém tisku vymezerován. (Obsah položky uvedené za SOURCE se ovšem nemění.) Je-li klauzule SOURCE uvedena v popisu netiskové položky (tj. položky bez klauzule COLUMN), žádný přesun ani žádný tisk této položky se neprovádí. Položce není přidělen žádný úsek paměti a jsou-li v jejím popisu uvedeny klauzule PICTURE, BLANK a JUSTIFIED, jsou zcela bezvýznamné a ignorují se. Popis takovéto položky má smysl pouze ve skupině typu DETAIL, je-li položka uvedená za slovem SOURCE zároveň argumentem v některé klauzuli SUM; popis pak udává, že se tato položka má k sumátoru přičítat při vytváření právě té skupiny typu DETAIL, do níž patří popis s klauzulí SOURCE (viz 13.5.7.). (Tuto funkci plní ovšem i klauzule SOURCE uvedená v popisu tiskové položky, kdy vlastně plní současně dvě rozdílné funkce.) 13.5.7. Klauzule SUM Formát: SUM numerická-položka ... [UPON jméno-skupiny] Funkce: Položka, v jejímž popisu je uvedena klauzule SUM, se nazývá sumátor. Klauzule SUM určuje, které položky a ve kterém okamžiku mají být do tohoto sumátoru přičítány. Pravidla: 1) Klauzule SUM smí být uvedena pouze v popisu elementární položky patřící do skupiny typu CONTROL FOOTING. Tato položka musí mít klauzuli PICTURE a musí být numerická (tzn. její klauzule PICTURE musí určovat položku rozpakovanou, exponenciální znakovou nebo numerickou editovanou). 2) Generátor sestav vytvoří pro každý sumátor zvláštní pomocnou exponenciální dlouhou položku (COMP-2). Tato pomocná položka se přiděluje i k sumátoru, který není tiskovou položkou (tj. který nemá v popisu klauzuli COLUMN). Jméno přidělené uživatelem sumátoru bude ve skutečnosti označovat právě tuto pomocnou položku přidělenou k sumátoru. Tedy právě této pomocné položky se týká dále popsané nulování sumátoru, přičítání k sumátoru, přičítání tohoto sumátoru k jiným sumátorům a též všechna použití sumátoru uživatelem v příkazech v PROCEDURE DIVISION a v klauzulích v ENVIRONMENT DIVISION a v DATA DIVISION (např. v klauzuli SOURCE nebo v klauzuli SUM). Příkaz INITIATE vynuluje všechny tyto pomocné položky přidělené ke všem sumátorům; totéž pak učiní i první prováděný příkaz GENERATE. (V dalším textu již, nehrozí-li nebezpečí omylu, nerozlišujeme mezi sumátorem a jemu přidělenou pomocnou položkou.) Je-li sumátor tiskovou položkou (tj. má-li v popisu uvedenu klauzuli COLUMN), přidělí se mu ještě druhý úsek paměti, přesně odpovídající vzoru uvedenému v klauzuli PICTURE. Tento úsek paměti je přímo součástí tiskového řádku, pro uživatele je nepřístupný a po každém tisku je vymezerován. Má-li dojít k tisku sumátoru, bude před tiskem nejprve pomocná položka přidělená k sumátoru numericky přesunuta do tohoto úseku paměti podle pravidel příkazu MOVE (viz 6.1.). 3) Za slovem SUM musí být uvedena jedna numerická položka anebo (což se v praxi používá zřídka) několik numerických položek. Tyto položky mohou být definovány kdekoliv v DATA DIVISION; z REPORT SECTION lze však v klauzuli SUM uvést pouze sumátory patřící do téže skupiny CONTROL FOOTING jako náš sumátor anebo do skupin CONTROL FOOTING téže sestavy příslušných k řídicím položkám nižších úrovní. 4) Generátor sestav přičítá každý z operandů uvedených za slovem SUM k sumátoru (přesněji k pomocné položce popsané v bodě 2) podle pravidel příkazu ADD (bez klauzulí CORR, ROUNDED a ON SIZE ERROR). Okamžik přičítání závisí na tom, kde je tento operand popsán. Z tohoto hlediska rozlišujeme tři typy přičítání: - prosté přičítání (subtotalling), - postupné přičítání (rolling forward), - křížové přičítání (crossfooting). Prosté přičítání se týká těch operandů, které nejsou popsány jako sumátory, a které tedy nutně leží mimo REPORT SECTION. Přičítání se provádí při vytváření skupiny typu DETAIL (viz popis příkazu GENERATE). Protože však obecně může uživatel popsat více skupin typu DETAIL, je nutno definovat, při vytváření kterých z těchto skupin typu DETAIL k přičítání dojde a při vytváření kterých ne: a) Není-li v klauzuli SUM uvedena podklauzule UPON, pak každý z operandů uvedených za slovem SUM (s výjimkou operandů, které jsou sumátory) musí být uveden v popisu alespoň jedné skupiny typu DETAIL téže sestavy jakožto argument v alespoň jedné klauzuli SOURCE. (U operandů s indexy musí být indexy uvedené u položky v klauzuli SUM přesně tytéž jako v klauzuli SOURCE; nepožaduje se však přesně stejný zápis kvalifikace, pokud určuje touž položku.) Operand se pak přičítá při vytváření právě těchto skupin typu DETAIL, v nichž je uveden jakožto argument v alespoň jedné klauzuli SOURCE; může jich být i více a operand se pak přičítá při vytváření kterékoliv z nich. Při vytváření takovéto skupiny typu DETAIL se ovšem operand přičítá pouze jednou, i kdyby byl uveden v jejím popisu ve více klauzulích SOURCE. b) Je-li v klauzuli SUM uvedena podklauzule UPON, musí být za slovem UPON uvedeno jméno skupiny typu DETAIL patřící k téže sestavě jako sumátor. Pak se všechny operandy uvedené za slovem SUM (s výjimkou operandů, které jsou sumátory) přičítají k sumátoru právě při vytváření této skupiny typu DETAIL a žádné jiné. V tomto případě nezáleží na tom, zda operandy jsou nebo nejsou uvedeny v klauzulích SOURCE v popisu této skupiny případně i v popisech jiných skupin. Poznámka: Klauzule UPON je nutná tehdy, mají-li být všechny operandy (s výjimkou sumátorů) přičítány při vytváření téže jediné skupiny typu DETAIL, přičemž alespoň jeden z těchto operandů buďto není v této skupině uveden v žádné klauzuli SOURCE, anebo naopak je uveden v klauzuli SOURCE i v jiné skupině typu DETAIL, při jejímž vytváření se však nemá přičítat. Poznámka: Je-li popsáno několik skupin typu DETAIL, a má-li klauzule SUM několik operandů (což bývá ovšem zřídka), pak formát klauzule UPON nestačí obecně k tomu, aby uživatel mohl pro každý z operandů zvlášť zadat, při vytváření kterých skupin typu DETAIL se má tento operand k sumátoru přičítat a při vytvářeních kterých ne. Tomuto nedostatku jazyka COBOL může uživatel jednoduše odpomoci tím, že zajistí, aby každý z operandů (s výjimkou sumátorů) byl použit v klauzulích SOURCE právě v popisech těch skupin typu DETAIL, při jejichž vytváření se má přičítat. Toho se dosáhne takto: a) Má-li se operand přičítat při vytváření určité skupiny typu DETAIL, v jejímž popisu není dosud uveden v klauzuli SOURCE, stačí do popisu této skupiny přidat na kterékoliv místo netiskový popis (bez klauzule COLUMN), nejlépe pouze ve tvaru "02 SOURCE operand." (viz 13.5.6.). b) Nemá-li se operand přičítat při vytváření určité skupiny typu DETAIL, v níž jej však potřebujeme uvést v klauzulích SOURCE (jedné nebo více), nahradíme jej ve všech těchto klauzulích SOURCE položkou, která redefinuje náš operand a má stejný popis jako on (neboť pak už se operand klauzule SUM považuje za rozdílný od takto změněného operandu klauzule SOURCE), anebo jej nahradíme položkou, do níž náš operand předem přesuneme. Při této taktice není třeba klauzuli UPON vůbec používat. (V praxi je ovšem třeba sáhnout k zákrokům tohoto typu jen zcela vyjímečně.) Poznámka: Je-li uveden parametr CBL SUM a v klauzuli SUM není uvedena podklauzule UPON, pak každý z operandů uvedených za slovem SUM (s výjimkou těch operandů, které jsou sumátory) se přičítá při vytváření každé detailní skupiny zcela nezávisle na tom, zda v ní je nebo není uveden jako argument v nějaké klauzuli SOURCE. (Parametr CBL SUM je realizován především kvůli možnosti dosažení kompatibility s těmi implementacemi jazyka COBOL, které mají uvedenou taktiku jako standardní. Při použití parametru CBL SUM je však podklauzule UPON jedinou možností, jak dosáhnout, aby se určitý operand při vytváření určité detailní skupiny nepřičítal - což může být potřebné zvláště při více detailních skupinách. Při více než jednom operandu v klauzuli SUM však nemusí podklauzule UPON použitelná, a pak by v takovém případě nebylo možno použít ani parametr CBL SUM.) Při tzv. "souhrnném výstupu" (tj. při provádění příkazu "GENERATE jméno-sestavy", viz 13.6.2.), kdy se prosté přičítání provádí tak, jako kdyby byly provedeny za sebou příkazy "GENERATE jméno-skupiny" pro všechny detailní skupiny, lze rozumně uvést parametr CBL SUM pouze tehdy, je-li v sestavě popsána právě jedna skupina typu DETAIL. Přitom tato detailní skupina může být popsána např. pomocí pouze "01 TYPE DE." beze všech dalších klauzulí a bez podřízených elementárních položek, které by se v tomto případě stejně neuplatnily. Kdyby nebyla popsána ani jedna detailní skupina, nepřičítalo by se k sumátorům vůbec; kdyby bylo popsáno více detailních skupin, přičítal by se týž argument k sumátoru vícekrát při každém příkazu "GENERATE jméno-sestavy". Postupné přičítání se týká těch operandů, které jsou popsány jako sumátory v některé skupině typu CONTROL FOOTING (téže sestavy) s nižší hierarchickou úrovní. Přičítání se provádí při vzniku řídicí změny na té anebo na vyšší hierarchické úrovni, než je úroveň skupiny CONTROL FOOTING obsahující sumátor uvedený jako operand v naší klauzuli SUM. Příklad: V klauzuli RD je uvedena podklauzule CONTROL PRVNI DRUHA TRETI CTVRTA PATA, ve skupině CONTROL FOOTING CTVRTA je popsán sumátor CTVRTEK a ve skupině CONTROL FOOTING DRUHA je popsán sumátor 02 UTERY COL 10 PIC ZZZ9 SUM CTVRTEK. Přičítání sumátoru CTVRTEK k sumátoru UTERY je postupné přičítání a provádí se při řídicích změnách na úrovních FINAL, PRVNI, DRUHA, TRETI a CTVRTA. Křížové přičítání se týká těch operandů, které jsou popsány jako sumátory v téže skupině CONTROL FOOTING jako ten sumátor, k němuž mají být přičítány. Přičítání se provádí při řídicí změně na té anebo na vyšší hierarchické úrovni, než je úroveň této společné skupiny CONTROL FOOTING. Poznámka: Předpokládejme, že při provádění příkazu GENERATE (nebo TERMINATE) byla zjištěna řídicí změna určité hierarchické úrovně. Pak se přede všemi tisky (tj. ještě před tiskem skupiny CONTROL FOOTING nejnižší úrovně i před vyvoláním případné deklarativní sekce) provedou všechna postupná i křížová přičítání způsobená touto řídicí změnou. Pořadí jednotlivých přičítání je definováno takto: Berou se postupně všechny sumátory popsané ve skupinách CONTROL FOOTING počínaje nejnižší úrovní a konče tou úrovní, na níž došlo k řídicí změně (sumátory z téhož CF se berou v tom pořadí, v jakém jsou popsány), a každý z těchto sumátorů se přičte ke všem sumátorům, u nichž je uveden v klauzuli SUM. Tyto sumátory, k nimž má být náš sumátor přičítán, nutně leží ve skupinách CF téže nebo vyšší úrovně než náš sumátor. Náš sumátor se přičítá nejprve k sumátorům z téhož CF, pak k sumátorům z CF nejblíže vyšší úrovně atd., až nakonec k sumátorům z CF nejvyšší úrovně (FINAL, je-li ovšem popsána). Má-li být přičítán k více sumátorům z téhož CF, děje se tak v tom pořadí, v jakém jsou tyto sumátory popsány. Poznámka: Podklauzule UPON nemá na postupné a křížové přičítání žádný vliv; tato podklauzule se vztahuje jen na ty operandy, které nepatří mezi sumátory a které jsou tedy přičítány pomocí prostého přičítání.