Report writer

본 장에서는 Report writer의 statement의 사용법에 대해서 설명한다.

1. Report Files과 RD 항목

본 절에서는 프로그램의 ENVIRONMENT DIVISION과 FILE SECTION에 나타날 수 있는 COBOL report write의 요소에 대한 전체 정보를 포함하며, RD 항목에 사용될 수 있는 절들을 알파벳 순으로 설명한다.

1.1. Report Files

COBOL report writer는 출력 레코드를 생성하고, 프로그램이 GENERATE와 TERMINATE를 실행할 때, report 파일에 자동으로 기록한다. report 파일은 다른 출력 순차적 파일과 매우 유사하다. ENVIRONMENT DIVISION에 SELECT...ASSIGN 절과 FILE SECTION에 FD 절이 있어야 한다. 이것은 PROCEDURE DIVISION에서 OPEN과 CLOSE 문을 통해 처리된다.

figure rw select
SELECT ... ASSGN clause

부가적인 절들이 있지만 일반적으로는 'SELECT file-name ASSIGN TO assignment-name' 항목까지만 사용된다. 그 외의 부가적인 절들은 지원하고 있지 않다.

figure rw fd
FD entry

FD 항목은 Sequential File과 유사하다(Input-Output section - FILE-CONTROL paragraph 참고). 따라서, FILE STATUS 절을 사용하여 보고서 파일의 상태를 되돌릴 수있다. 해당 조항의 순서는 중요하지 않다.

report-name은 최대 30자이며, COBOL 이름에 대한 일반적인 규칙에 따라 구성된다. 각 report-name은 REPORT SECTION의 RD에 있는 이름과 동일해야 한다. 모든 보고서를 동일한 파일에 작성하고자 할 때 REPORTS ARE ALL로 작성하면 되지만 현재 버전에서는 지원하고 있지 않다. REPORTS ARE 절에 두 개 이상 report-name을 지정하면, 동일한 파일에 대해 데이터를 연속 또는 동시에 생성할 수 있다.

report writer는 보고서 파일에 대한 모든 WRITE statement을 코드화할 필요성을 없애주기 때문에 일반적으로 FD 항목 다음에 record-description-entry를 지정하면 안된다. 해당 SELECT에 MODE 절이 없고 RD에 CODE 절이 없는 경우 프로그램이 report writer와 독립적으로 보고서 파일에 기록될 수 있으며, 이 경우에는 FD 항목에 하나 이상의 01 레벨 레코드 설명을 지정해야 한다.

FD 항목 다음에 record-description을 코드화하고 고정 길이 레코드를 얻고 싶다면, RECORDING MODE IS F로 지정한 경우에도 RECORD CONTAINS 절을 코드화해야 한다. RECORD CONTAINS 절의 integer는 레코드의 크기와 일치해야 한다.

1.2. REPORT SECTION과 RD

각 Report description은 DATA DIVISION의 마지막 섹션인 REPORT SECTION에 표시되어 있다. FILE SECTION이 일련의 FD 항목으로 구성되어 있는 것과 같이, REPORT SECTION은 RD 항목으로 구성되고, 그 뒤에 Report 그룹 설명이 01레벨 항목으로 이어지게 된다.

각 report description은 원하는 수만큼의 report 그룹 설명으로 RD 항목들이 구성되어 있으며 항목들의 순서는 중요하지 않다.

figure rw section
REPORT SECTION
figure rw rd
REPORT SECTION : report-description-entry

report-name은 고유해야 하며, 하나 이상의 FD 항목의 REPORT 절에 지정된 report-name과 같아야 한다. report-name이 하나 이상의 FD에 선언되어 있으면, INITIATE에 UPON 절이 필요하다. 각 RD 항목은 적어도 하나의 report-group-description이 있어야 한다.

report-description-entry에는 위처럼 부가적인 절들이 존재하지만 CONTROL 절, LINE LIMIT 절, PAGE LIMIT 절만 지원하고 있다.

1.3. CONTROL Clause

CONTROL Clause은 하나 이상의 "key" 필드 ("control" 필드)에서 값이 변경 될 때 생성될 합계 라인이나 부제목과 같은 추가적인 라인이 있는 경우 코드화한다.

figure rw control
CONTROL clause

REPORT/FINAL 또는 control-id(식별자 목록) 또는 둘다 코드화할 수 있다. 하나 이상의 피연산자가 코드화되어야 하며, 피연산자 사이에는 최소한 하나의 공백이나 줄 바꿈을 작성해야 한다. 둘 이상의 control-id가 있는 경우 계층 구조가 존재한다. 상위 control에 대해 control break(값의 변경)이 발생하면 실제 하위 control의 break 여부에 관계 없이 하위 계층의 control이 모두 break 발생함을 의미한다. control break가 발생하는 경우 CONTROL HEADING은 상위 계층부터 하위 계층으로 CONTROL FOOTING은 하위 계층부터 상위 계층으로 출력된다. 단, control break는 GENERATE 문이 수행되지 않으면 감지되지 않는다.

control-id에 해당하는 CONTROL HEADING과 CONTROL FOOTING이 있는 경우 control-id의 새로운 값을 시작할 때마다 CONTROL HEADING 그룹이 생성되고, control-id의 새로운 값이 끝날 때마다 CONTROL FOOTING 그룹이 생성된다. 단, CONTROL FOOTING 그룹은 control break 발생 이전의 control-id 값을 사용하여 생성된다. CONTROL HEADING 및 CONTROL FOOTING 그룹은 각 control-id에 대해 선택적으로 작성될 수 있으나, 한 control-id에 하나씩만 코드화할 수 있다. CONTROL HEADING 그룹만 코딩하거나 CONTROL FOOTING 그룹만 코딩하거나 모두 코딩하거나 모두 코딩하지 않거나 할 수 있다.

  • REPORT/FINAL

    • REPORT와 FINAL은 동일한 의미를 가진다. REPORT/FINAL은 control-id 목록 중 가장 먼저 나타나야 하지만 생략할 수 있다.

    • REPORT/FINAL은 가장 높은 제어를 나타낸다. 보고서의 시작과 끝에서 한번만 수행해야 하는 특별한 작업이 필요한 경우 작성한다.

  • control-id

    • control-id는 DATA DIVISION에 있는 데이터 항목의 이름이어야 한다. 필요하다면 qualifier나 subscript를 포함할 수 있다. 하지만, PAGE-COUNTER와 같은 special register는 사용될 수 없다.

    • control-id의 PICTURE에는 'V' 기호가 포함될 수 없다. 동일한 CONTROL 절에서 동일한 control-id를 두 번 이상 사용할 수는 없지만, 다른 RD에서는 중복해서 사용할 수 있다.

1.4. LINE LIMIT Clause

LINE LIMIT Clause은 보고서의 가장 긴 행에 필요한 열의 최대 수를 나타낸다. 행의 한도 내에서 필드가 나타날 수 있는지 확인하고 데이터의 손실 여부에 대해 확인할 수 있다. 보고서 필드가 LINE LIMIT 절에 제공된 값을 초과하면 컴파일하거나 런타임에 오류가 발생한다.

LINE LIMIT 절을 생략하면 기본값으로 설정되는데 소프트웨어에 따라 다르지만 일반적으로 240이 설정된다. 단, FD 항목에 'BLOCK 또는 RECORD CONTAINS integer CHARACTERS' 절이 있으면, 해당 값이 최대 값이 된다.

figure rw linelimit
LINE LIMIT clause
  • integer

    • 코드화된 값은 열의 최대 수를 나타낸다. 해당 보고서가 지정된 값을 넘지 않도록 한다.

  • identifier

    • 보고서의 행의 너비가 다른 값으로 사용될 때, 숫자 필드로 정의된 identifier를 사용할 수 있다.

    • INITIATE 시에 해당 값을 평가하여 사용한다. 이 형식은 REPEATED 절이나 WRAP 절을 사용할 때만 적용되므로, 일반적으로는 사용하지 않도록한다.

1.5. PAGE LIMIT Clause

PAGE LIMIT Clause은 보고서를 페이지로 나눌 때 사용한다. 또한 페이지를 heading, main data, footing으로 영역별로 더 세분화할 수 있다. 각 하위 절은 선택 사항이지만, PAGE LIMIT Clause이 없으면 하위 절은 존재할 수 없다. 하위 절을 임의의 순서로 코딩할 수 있지만, 페이지 상단에서 하단으로 코딩하는 것을 권장한다.

figure rw pagelimit
PAGE LIMIT clause
  • PAGE LIMIT

    • PAGE LIMIT Clause을 생략하면 보고서는 페이지 나눔없이 하나의 연속적인 출력 스트림으로 구성된다. 그럴 경우 report-group-descirption에는 절대 라인, NEXT GROUP 및 PAGE HEADING 그룹, FOOTING 그룹, 키워드 PAGE를 포함하는 모든 절이 포함될 수 없다.

  • HEADING

    • HEADING은 반드시 필요한 것은 아니지만 보고서에 상대적인 라인으로 시작하는 PAGE HEADING이 있으면, HEADING을 기준점으로 사용할 수 있다.

    • HEADING이 생략되면 페이지의 최상위인 1의 값이 기준점이 된다.

  • FIRST DE

    • PAGE HEADING 그룹이 있는 경우 페이지의 본문이 그 아래의 고정된 위치에 오도록 FIRST DETAIL을 코드화하는 것이 좋다. 만약 PAGE HEADING 그룹이 FIRST DETAIL 위치를 침범하면, 첫 번째 body group은 PAGE HEADING 그룹 바로 뒤에 나타난다. FIRST DE가 생략되면 다음과 같은 기본값을 갖는다.

      • PAGE HEADING이 없을 경우 HEADING 값이 기본값이 된다.

      • PAGE HEADING이 있을 경우 PAGE HEADING 그룹 바로 다음에 본문이 시작된다.

  • LAST DE/CH

    • LAST DETAIL을 사용하는 경우 identifier는 숫자필드여야 하며 그 값은 FIRST DETAIL과 LAST CONTROL FOOTING 위치 사이에 있어야 한다. CONTROL HEADING과 DETAIL 그룹은 LAST DETAIL 위치 아래에 나타나면 안된다. LAST DETAIL이 LAST CONTROL FOOTING 보다 위에 있으면, CONTROL FOOTING 그룹에 추가 공간이 생기게 된다.

    • LAST DE/CH가 생략되면 다음과 같은 기본값을 갖는다.

      • LAST CONTROL FOOTING이 있을 경우 LAST DETAIL은 동일한 값을 갖는다. 즉 모든 body group이 LAST CONTROL FOOTING 위치로 내려갈 수 있다.

      • + integer-5 형식을 갖는 LAST CONTROL FOOTING이 있을 경우 "page footing의 첫 번째 줄 - 1 - integer-5' 값이 사용된다. LAST CONTROL FOOTING이 없을 경우 LAST CONTROL FOOTING과 동일한 기본값이 사용된다.

  • LAST CF (FOOTING)

    • PAGE FOOTING이 시작되기 전에 약간의 공간을 두고 싶다면, LAST CF 또는 FOOTING을 코드화해야 한다.

    • LAST CONTROL FOOTING 이 생략되면, 다음과 같은 기본값을 갖는다.

      • PAGE FOOTING이 없을 경우 PAGE LIMIT 값이 사용된다. 즉, 모든 CONTROL FOOTING 그룹이 페이지의 맨 아래로 내려갈 수 있다.

      • PAGE FOOTING이 있는 경우 PAGE FOOTING 이전의 마지막 행이 된다.

2. Report Descriptions

본 절에서는 REPORT SECTION의 RD 항목을 따르는 report description에 대해 자세히 설명한다.

report group은 0부터 어느 수까지 중단없이 보고서의 라인 블럭을 의미한다. report group의 라인은 항상 동일한 페이지에 있으며 단일 작업으로 생성된다. 일곱 개의 TYPE 중 DETAIL 그룹을 제외한 모든 그룹은 자동으로 생성된다. 프로그램은 각 DETAIL 그룹(또는 보고서 전체)에 대해 하나 이상의 GENERATE statement을 수행하고, 정의한 다른 그룹은 DETAIL에 따라 올바른 위치에 자동으로 생성된다.

RD 항목에 따라 report group description을 입력할 수 있지만, DETAIL 이외의 각 TYPE의 수는 제한이 있다. 각 report group description은 A-margin에 01 레벨 항목부터 시작한다.

2.1. Coding Report Group Descriptions

Report group description은 01 레벨을 시작으로 하위 항목들을 포함하는 REPORT SECTION 데이터 구조이다. 01 레벨의 report gorup 항목으로만 구성될 수 있다. RD 항목 다음에 원하는 수의 report group description을 작성할 수 있다.

figure rw group desc
Report group descriptions
figure rw group entry
Report group descriptions : report-group-entry
figure rw multiple choice
Report group descriptions : multiple-choice

각 clause들에 대한 설명은 아래에 알파벳 순으로 정의되어 있다. 하지만 일부 clause는 지원하고 있지 않기 때문에 정의되어 있는 것을 사용하도록 한다.

  • level-number

    • DATA DIVISION에서와 같이 level-number는 요소 레벨보다 높은 그룹 레벨의 계층을 설정하는데 사용된다. 각 보고서 그룹의 시작 부분에 있는 level-number는 01 레벨이어야 한다.

  • data-name

    • 다음과 같은 경우를 제외하고 보고서 그룹 항목에 data-name을 배치할 필요가 없다.

      • DETAIL 그룹의 01 레벨 항목 또는 Declarative SECTION의 USE BEFORE PREORTING 헤더에서 참조될 수 있는 다른 그룹의 경우

        data-name을 01 레벨에서 사용할 때, 전체 보고서 그룹에 이름이 지정되고, 그것은 report-group-name 또는 group-name 이라고 한다. group-name은 RD 내에서 고유해야 한다.

      • SUM 절 또는 용어에서 참조되는 numeric 항목인 경우

      • COUNT 절 또는 용어에서 참조되는 모든 레벨의 항목인 경우

  • general-purpose DATA DIVISION clauses

    • 다음과 같은 일반적으로 DATA DIVISION 절을 보고서 그룹에 사용할 수 있다.

      처음 4개는 그룹 및 요소 레벨에서 모두 사용할 수 있다. PICTURE와 VALUE는 요소 레벨에서만 허용된다.

      • BLANK WHEN ZERO

      • JUST/JUSTIFIED

      • OCCURS

      • SIGN

      • PIC/PICTURE

      • VALUE/VALUES

    • 다음은 보고서 그룹에서 사용할 수 없다.

      • USAGE DISPLAY 이외의 모든 USAGE

      • REDEFINES

      • SYNC/SYNCHRONIZED

      • RENAMES

      • 88-level 항목

  • special-purpose clauses

    • 일반적인 DATA DIVISION 절뿐만 아니라, 필드의 위치와 내용을 설명하는 특별한 목적을 가지는 절들이 포함될 수 있다.

      처음 4개인 TYPE, NEXT GROUP, GROUP LIMIT, REPEATED는 01 레벨에서만 나타날 수 있다. 그리고 PICTURE, COLUMN, SOURCE, VALUE, SUM, COUNT, FUNCTION은 요소 항목에서만 나타날 수 있다.

      구분 설명

      TYPE

      그룹의 타입을 나타낸다.

      NEXT GROUP

      그룹 간의 추가 공간을 만든다.

      GROUP LIMIT

      그룹에 대해 특별한 낮은 제한을 준다.

      REPEATED

      그룹을 나란히 배치한다.

      LINE

      수직 위치를 제공한다.

      MULTIPLE PAGE

      다중 페이지를 통해 보고서 그룹을 여러 페이지에 걸쳐 배치할 수 있다.

      COLUMN

      수평 위치를 제공한다.

      SOURCE

      이름으로 데이터 필드를 점유하기 위해 사용한다.

      SUM

      합계를 생성하기 위해 사용한다.

      COUNT

      횟수를 생성하기 위해 사용한다.

      FUNCTION

      특수 형식 지정 루틴을 호출한다.

      WRAP

      새로운 라인에서 데이터를 계속 사용할 수 있도록 한다.

      VARYING

      반복 항목에 대한 카운터를 제공한다.

      STYLE

      특수 프린터 효과를 생성한다.

      PRESENT/ABSENT

      WHEN/AFTER

      PRESENT/ABSENT는 항목, 라인, 그룹의 출력 여부를 제어한다.

      GROUP INDICATE

      PRESENT AFTER의 오래된 형식이다.

  • LINE, COLUMN clause

    • COLUMN 절이 있는 모든 항목에 대해 동일한 레벨 또는 상위 레벨에 LINE 절이 있어야 한다.

      • 특정 보고서 라인에 하나의 요소 필드만 포함된 경우(단, 해당 항목이 multiple-choice 항목이 아닌 경우) LINE과 COLUMN 절을 동일한 항목으로 결합할 수 있다.

        03   LINE 5   COL 60   VALUE "REPORT".
      • 보고서 라인에 포함될 수 있는 요소 필드 수는 제한되어 있지 않다. 보고서 라인에 여러 개의 요소 필드가 포함된 경우 라인 내의 모든 COLUMN 항목을 LINE 항목보다 낮은 레벨로 작성해야 한다.

        03   LINE 5.
          05   COL 60   VALUE "REPORT".
          05   COL 90   VALUE "TEST".
      • 일부 또는 모든 요소 항목이 non-LINE 그룹 항목에 포함되어 있을 수 있기 때문에 LINE 내의 모든 COLUMN 절은 동일한 레벨일 필요는 없다.

        03   LINE 5.
          05   COL 60   VALUE "REPORT".
          05   PRESENT WHEN DATA01 NOT = SPACES.
            07   COL 90   VALUE "TEST".
    • LINE 절은 다른 LINE 절에 종속되어서는 안된다.

    • 특정 보고서 그룹에 여러 라인이 포함된 경우 해당 그룹의 모든 LINE 항목에 01 이외의 level-number를 지정해야 한다. 그룹이 단일 보고서 라인만 포함하는 경우에만 01 레벨 항목에 LINE 절을 작성할 수 있다.

  • SOURCE, VALUE, SUM, COUNT clause

    • SOURCE, VALUE, SUM, COUNT 절 중에 하나를 선택하여 자동으로 요소 항목의 내용을 제공할 수 있다. 자세한 내용은 각 절의 설명을 참조하도록 한다.

    • 요소 항목에 SOURCE, VALUE, SUM, COUNT 절이 없는 경우 다음 조건을 충족해야 한다.

      • 항목에 data-name이 있어야 한다.

      • 항목에 COLUMN 절이 있어야 한다.

      • COLUMN 절이 상대적이면, 항목에 고정된 수직 위치가 있어야 한다.

    • LINE 절은 다른 LINE 절에 종속되어서는 안된다.

    • 특정 보고서 그룹에 여러 라인이 포함된 경우 해당 그룹의 모든 LINE 항목에 01 이외의 level-number를 지정해야 한다. 그룹이 단일 보고서 라인만 포함하는 경ㅇ우에만, 01 레벨 항목에 LINE 절을 작성할 수 있다.

    • 각 SOURCE, VALUE 피연산자가 바로 WHEN 조건 다음에 이어지는 multiple-choice 항목의 경우를 제외하고, 모든 순서로 보고서 그룹의 절을 작성할 수 있다.

2.2. BLANK WHEN ZERO clause

BLANK WHEN ZERO clause은 숫자 필드가 0인 경우 공백으로 대체한다.

figure rw bwz
BLANK WHEN ZERO clause
  • BLANK WHEN ZERO

    • 요소 항목에 BLANK WHEN ZERO를 작성하는 경우 항목에는 숫자 PICTURE가 있어야 한다.

    • 그룹 레벨 항목에 작성하는 경우 그룹 내의 모든 숫자 요소 항목에 적용된다.

2.3. COLUMN clause

COLUMN clause은 보고서 라인에서 필드의 수평 위치를 지정한다.

figure rw column
COLUMN clause
Coding Rules

다음은 COLUMN clause의 Coding Rules에 대한 설명이다.

  • 피연산자가 없는 COLUMN은 COLUMN + 1의 약어이다.

  • COLUMN 절이 있는 모든 항목의 경우 동일한 레벨 또는 더 높은 레벨에 LINE 절이 있어야 한다.

    • LINE 5 내에 다른 항목이 없는 경우 다음과 같이 작성할 수 있다.

      03   LINE 5   COL 60   VALUE "REPORT".
    • 라인에 두 개 이상의 필드가 있는 경우 다음과 같이 새로운 레벨을 생성해야 한다.

      03   LINE 5.
        05   COL 60   VALUE "REPORT".
        05   COL 90   VALUE "TEST".
  • COLUMN은 항목에서 유일한 조항으로 사용할 수 있다. 그 결과 공백 필드는 현재 수평 위치를 오른쪽으로 이동하는 용도로만 사용된다. 공백 필드는 COLUMN에 대한 일반적인 간격 외에 하나의 열 너비를 차지한다. 따라서 COLUMN 절과 함께 단일 공간으로 구성된 VALUE를 작성하는 것과 같다. 예를 들어 단독으로 작성된 COL +4는 현재 수평위치를 4열 오른쪽으로 변경한다.

  • 항목의 크기는 PICTURE 절 또는 VALUE "Literal"의 크기에서 계산되고, 두 항목이 모두 COLUMN 절과 사용되는 경우는 라인 폭을 초과하거나 겹치지 않는지 확인한다.

Operation

다음은 COLUMN clause의 Operation 방법에 대한 설명이다.

  • COLUMN 절에서는 요소 필드를 수평으로 배치한다.

    다음은 옵션 목록이다.

    • COLUMN + integer-1.

      상대적인 형식으로 라인 내에 수평적인 위치 앞 필드의 마지막 문자에서 이필드의 첫 번째 문자에 integer-1 column 위치로 이동하는 것을 나타낸다. 필드 앞의 차이는 inger-1의 값보다 작다는 점에 유의한다. 예를 들면 다음과 같다.

      COLUMN + 1 = "차이 없음"
      COLUMN + 2 = "필드 전에 하나의 공간이 있음"

      라인의 첫 번째 필드에 COLUMN + integer-1를 사용하는 경우 수평 위치의 초기값이 0이므로 절대적인 형식인 COLUMN integer-1을 작성한 것으로 간주된다.

    • COLUMN integer-2.

      절대적인 형식으로 필드의 왼쪽 열이 라인 내의 해당 고정 위치에 나타나야 하는 것을 나타낸다. 라인의 첫 번째 column은 COLUMN 1이다.

  • 요소 항목에 COLUMN 절이 없는 경우 data-name이 있으면 해당 항목은 보고서에 표시되지 않는다. 인쇄 불가능한 항목이라고 한다.

2.4. COUNT clause

COUNT clause은 지정된 보고서 필드 또는 그룹 항목이 나타나는 횟수를 센다.

figure rw count
COUNT clause
Coding Rules

다음은 COUNT clause의 Coding Rules에 대한 설명이다.

  • 각 data-name은 RD를 제외한 모든 REPORT SECTION 항목의 이름이어야 한다. COUNT 절을 포함하는 그룹 항목의 data-name일 수도 있다.

  • COUNT 절은 카운트되는 해당 항목이 포함된 같은 보고서 그룹이나 다른 보고서 그룹에 배치할 수 있다.

  • SUM 절과 달리 카운트된 항목이 숫자 필드일 필요는 없다.

  • SUM 절과 마찬가지로 다음과 같은 방식으로 사용할 수 있다. 그 자체로 하나의 절로써 SOURCE, VALUE 절 대신 SUM 절을 작성할 수 있다.

    03   LINE 5   COL 60   PIC ZZZ9    COUNT OF R-DATA-NAME.
Operation

다음은 COUNT clause의 Operation 방법에 대한 설명이다.

  • COUNT clause에는 참조된 항목이 나타난 횟수의 count가 나타난다. 즉, 보고서에 해당 항목이 나타날 때마다 1씩 count에 더해진다. REPORT SECTION 외부에 있는 항목에 대해서는 count 할 수 없다.

    참조되는 항목은 다음과 같은 레벨에 있을 수 있다.

    레벨 설명

    01 레벨 항목

    특정 그룹의 표시 횟수

    LINE 항목

    특정 라인의 표시 횟수

    COLUMN 항목

    특정 요소 항목의 표시 횟수

  • RESET 구문을 사용하지 않는다고 가정하면 COUNT 필드가 출력되었을 때 count는 0으로 돌아간다. 따라서, 마지막으로 count가 출력된 이후 항상 항목의 표시 횟수를 얻을 수 있다. RESET 구문을 사용하면 더 높은 레벨의 control break가 발생할 때까지 count 재설정을 0으로 지연시킬 수 있다. 하지만, 현재 버전에서는 COUNT 절의 RESET 구문을 지원하고 있지 않다.

2.5. LINE clause

LINE clause은 페이지에 라인을 수직으로 배치한다.

figure rw line
LINE clause
Coding Rules

다음은 LINE clause의 Coding Rules에 대한 설명이다.

  • 다음은 선택 가능한 형식의 목록이다.

    • LINE + integer-1.

      상대적인 형식으로 '+' 대신 PLUS를 쓸 수 있다. 라인이 이전 위치에서 integer-1 라인을 전진한다는 것을 나타낸다. LINE + 0 또는 LINE + ZERO가 허용되며, 이는 라인 진전이 이루어지지 않음을 나타낸다. 그 결과 라인이 이전 라인에 덧인쇄된다.

    • LINE integer-2.

      절대적인 형식으로 라인이 페지이의 해당 고정 위치에 나타난다. 허용되는 가장 높은 라인 번호는 PAGE LIMIT 피연산자가 제공한다. 이 절대 형식은 RD에 PAGE LIMIT 절이 있는 경우에만 허용된다.

    • LINE integer-2 ON NEXT PAGE.

      LINE integer-2 형식과 비슷하지만 ON NEXT PAGE 구문은 라인이 출력되기 전에 페이지 진전이 강제로 발생된다. 이 항목이 포함된 그룹이 현재 페이지에 적합한지에 관계 없이 발생한다.

    • LINE ON NEXT PAGE.

      다음 페이지 또는 HEADING 위치에서 FIRST DETAIL 위치에 라인을 출력한다.

    • LINES ARE integer-1 integer-2 ... 또는 LINES + integer-1, + integer-2 ...

      다중 형식으로 동일한 절에 여러 줄을 설명하여 코딩 작업을 수행할 수 있다. 자세한 내용은 Multiple LINES Clause를 참고한다. 마지막에 ON NEXT PAGE를 쓸 수 있으나, 이 구문은 모든 라인에 적용되는 것이 아니라, 첫 번째 integer-1 라인에만 해당된다.

  • 각 그룹의 첫 번째 LINE 절은 그룹 전체가 상대적인지 절대적인지 여부를 결정한다.

    첫 번째 LINE 절이 상대적이면, 그룹은 상대적 그룹이고 다른 모든 LINE 절이 상대 그룹이어야 한다. 첫 번째 LINE 절이 절대적이면, 그룹은 절대적 그룹이고, 나머지 LINE 절은 절대적 또는 상대적일 수 있다.

    예를 들어 그룹 내의 다음 두 가지 LINE 절은 동일하다.

    01     TYPE PH.
      03     LINE 1.
         ...
      03     LINE 2.
         ...
      03     LINE 4.
         ...
    01     TYPE PH.
      03     LINE 1.
         ...
      03     LINE +1.
         ...
      03     LINE +2.
         ...

    상대적인 라인을 사용하면 첫 번째 LINE 번호만 변경하여 전체 그룹의 위치를 조정할 수 있는 장점이 있다.

  • 그룹에 ON NEXT PAGE가 사용된 경우를 제외하고 절대적인 LINE 절이 있는 경우 integer 값은 순차적으로 증가해야 한다.

  • LINE에는 COLUMN 항목이 포함되어 있지 않아도 된다. 결과는 어떠한 데이터도 포함되지 않은 빈 라인이 생성된다. 예를 들어 다음과 같을 경우 데이터는 라인 2에만 작성되지만 PAGE HEADING은 2-4 라인을 차지하게 된다.

    01     TYPE PH.
      03     LINE 2     VALUE "--PAGE HEADING--"
      03     LINE 4.
    --PAGE HEADING--
  • 하나의 LINE 절이 다른 LINE 절에 종속되어서는 안된다.

Operation

다음은 LINE clause의 Operation 방법에 대한 설명이다. 그룹이 절대적이라면, 첫 번째 LINE 절은 그룹의 시작 위치를 나타낸다.

  • 상대적인 본체 그룹(CH, DE, CF)의 위치

    • 그룹이 페이지의 첫 번째 본체 그룹인 경우 그룹의 첫 번째 라인은 LINE 절의 integer와 관계없이 FIRST DETAIL 위치에 있다. RD에 FIRST DETAIL 하위 절을 코드화하지 않은 경우 첫 번째 라인은 PAHE HEADING 그룹이 있는 경우 PAGE HEADING 다음 라인에 나타나거나, PAGE HAEDING 그룹이 없는 경우 HEADING 위치에 나타나게 된다. 그룹의 다음 순서의 라인은 서로 상대적으로 배치된다.

    • 그룹이 페이지의 첫 번째 본체 그룹이 아닌 경우 그룹의 첫 번째 라인은 LINE-COUNTER를 기준으로 배치되며, 일반적으로 앞서 나온 본체 그룹의 마지막 라인 위치가 포함된다. 그러나, NEXT GROUP 절 또는 LINE-COUNTER의 값을 변경하면 위치의 영향을 받을 수 있다.

  • 본체 그룹(CH, DE, CF)에 대한 page-fit 테스트

    보고서에 PAGE LIMIT 절이 있을 때 report writer는 본체 그룹을 출력하기 전에 page-fit 테스트를 수행한다. 이는 그룹의 모든 라인이 해당 본체 그룹 타입에 잡아둔 페이지 영역에 들어가지 않는 한, 그룹의 라인이 출력되지 않도록 하기 위한 것이다.

    수행되는 page-fit 테스트의 타입은 그룹이 절대적인지 상대적인지에 따라 달라진다. 모든 경우에, LINE-COUNTER에는 일반적으로 이 그룹이 생성되기 전에 마지막으로 작성된 라인의 위치인 현재 수직 위치가 포함되어 있다.

    • 본체 그룹에 대한 절대적인 page-fit 테스트

      첫 번째 LINE이 절대적일 경우 report writer는 첫 번째 LINE 번호를 그룹의 시작 위치로 사용한다. LINE-COUNTER가 그룹의 시작선 위치에 있는 라인에 해당하는 경우 report writer는 새로운 페이지로 건너뛴다. 다른 모든 경우에 페이지 이동이 발생하고 그룹이 새 페이지에 지정된 줄에 출력된다.

    • 본체 그룹에 대한 상대적인 page-fit 테스트

      그룹의 모든 LINE 절이 상대적일 경우 report writer는 LINE + 절의 모든 정수의 합계를 계산한다. 그 값은 그룹의 전체 크기를 나타낸다. LINE-COUNTER와 이 그룹의 전체 크기를 더한 값은 현재 페이지에서 생성되었을 때 그룹이 나타는 마지막 라인이다. 이 마지막 라인의 위치가 그룹의 허용된 범위를 벗어나면 그룹이 페이지에 맞지 않고 페이지 이동이 발생한다.

      그룹의 허용된 아래 범위는 다음과 같다.

      • 그룹이 DETAIL이나 CONTROL HEADING인 경우 RD의 LAST DETAIL

      • 그룹이 CONTROL FOOTING인 경우 RD의 LAST CONTROL FOOTING

      report writer는 PAGE LIMIT 절에 설명된 대로 해당 하위 절의 기본 값을 가정하므로, LAST DETAIL과 LAST CONTROL FOOTING 하위 절은 RD에 명시적으로 지정할 필요가 없다.

  • 상대적인 본체가 아닌 그룹(RH, PH, PF, RF)의 위치

    그룹 설명

    RH, PH

    HEADING - 1에 상대적

    PF

    LAST CONTROL FOOTING에 상대적

    RF

    HEADING - 1에 상대적

  • 페이지 이동 처리

    report writer는 페이지 이동을 실행할 때 다음을 수행한다.

    • PAGE FOOTING이 정의되어 있는 경우 PAGE FOOTING을 출력한다.

    • PAGE-COUNTER는 1씩 증가한다.

    • 다음 페이지의 맨 위로 이동된다. LINE-COUNTER는 0으로 설정된다.

    • PAGE HEADING이 정의되어 있는 경우 PAGE HEADING을 출력한다.

2.5.1. Multiple LINES Clause

LINE 절에 여러 integer 또는 + integer를 작성하면, 모두 유사한 레이아웃을 가진 라인 그룹을 정의하는 데 시간이 절약된다. 단, 다음 사항에 주의한다.

  • 라인이 발생할 때마다 단순 VALUE, SOURCE가 반복된다. Multiple LINE이 발생할 때 마다 Multiple VALUE, Multiple SOURCE 절을 사용하여 보고서 필드에 다른 값을 배치할 수 있다.

  • 다음은 Multiple LINES 절의 예제이다. 아래 두 그룹은 출력 결과가 동일하다.

    01   TYPE   PH.
      03     LINES 1 2.
        05   COL  1      VALUES "REPORT" "YEAR".
        05   COL  11     VALUES "TEST" "MONTH".
        05   COL  21     VALUES " " "DAY".
    01   TYPE   PH.
      03     LINES 1.
        05   COL  1      VALUES "REPORT".
        05   COL  11     VALUES "TEST".
        05   COL  21     VALUES " ".
      03     LINES 2.
        05   COL  1      VALUES "YEAR".
        05   COL  11     VALUES "MONTH".
        05   COL  21     VALUES "DAY".

    VALUE의 값이 없더라도 라인의 갯수만큼 VALUE의 갯수도 공백 리터럴로 맞춰주도록 한다.

2.6. LINE-COUNTER

LINE-COUNTER는 데이터가 생성된 최근 보고서 라인 번호를 포함하는 내부 특수 레지스터이다.

figure rw line cnt
LINE-COUNTER clause
  • LINE-COUNTER는 페이지의 현재 수직 위치를 제공한다. INITIATE statement와 페이지 이동시 0으로 설정된다.

  • LINE-COUNTER를 PROCEDURE DIVISION에서 값을 변경할 수 있지만, LINE-COUNTER의 값을 줄이지 않도록 한다.

    03  COL 100  PIC ZZZ9 SOURCE IS LINE-COUNTER.
  • REPORT SECTION에 여러 개의 report description이 있는 경우 각 고유한 LINE-COUNTER가 있다. 따라서 report-name을 한정자로 사용하여 어느 보고서의 LINE-COUNTER 인지 작성해야 한다.

    03  COL 100  PIC ZZZ9 SOURCE IS LINE-COUNTER OF REPORT-01.

2.7. NEXT GROUP clause

NEXT GROUP clause은 추가되는 빈 라인이 페이지에 여유가 없을 경우 페이지 넘침이 발생하지 않도록 그룹 뒤에 추가 수직 공간을 만드는데 사용된다.

figure rw next group
NEXT GROUP clause
Coding Rules

다음은 NEXT GROUP clause의 Coding Rules에 대한 설명이다.

  • NEXT GROUP clause은 01 레벨에서만 작성되어야 한다.

  • 모든 본체 그룹(CH,DE,CF)에서 이 절을 사용할 수 있고, PAGE HEADING이 있는 경우 REPORT HEADING에서 이 절을 사용할 수 있으며, REPORT FOOTING이 있는 경우 PAGE FOOTING에서 사용할 수 있다.

  • PAGE LIMIT 절이 없는 경우 + integer-1 형식만 사용할 수 있다.

  • NEXT BODY GROUP은 DETAIL 또는 CONTROL HEADING 그룹에만, NEXT DE OR CH GROUP은 CONTROL FOOTING 그룹에만 쓸 수 있다.

  • DE OR CH는 DETAIL OR CONTROL HEADING 또는 CH OR DE 또는 CONTROL HEADING OR DETAIL로도 쓸 수 있다.

2.7.1. Effect of NEXT GROUP on Body Groups

  • 특정 제약 조건에 따라 NEXT GROUP 절은 본체 그룹의 모든 라인이 생성된 후에 report writer가 LINE-COUNTER 값을 증가시켜서, 다음 본체 그룹이 새 페이지에 나타나거나 추가적인 수직 간격을 나타나게 한다.

  • NEXT GROUP + integer-1을 작성하면 report writer는 LINE-COUNTER에 integer-1을 더하지만 LAST CONTROL FOOTING 값을 최대 한계로 사용한다.

  • NEXT GROUP integer-2 형식은 지정된 라인 번호에 대해 다음 본체 그룹을 강제로 생성할 수 있다. report writer는 먼저 LINE-COUNTER를 검사한다. 이 값이 integer-2 보다 작으면 (해당 위치에 아직 도달하지 않은 경우), LINE-COUNTER는 integer-2로 설정된다.

    그렇지 않으면 report wirter는 LINE-COUNTER를 LAST CONTROL FOOTING과 동일하게 설정하여, 더 이상 본체 그룹이 페이지에 나타나지 않도록 하고, 저장된 다음 그룹의 위치 정수 값에 integer-2의 값을 저장한다. 다음 본체 그룹이 생성되기 전에 report writer는 저장된 정수와 동일한 LINE-COUNTER를 설정한다. 다음 본체 그룹이 항상 상대 그룹이 아닌 이 형식의 조항을 사용하는 것은 바람직하지 않다.

  • NEXT GROUP NEXT PAGE를 작성하면, report writer는 LINE-COUNTER를 LAST-CONTROL FOOTING 값으로 설정한다. 이 경우 report writer는 페이지의 나머지를 공백으로 두고, 다음 페이지에서 다음 본체 그룹을 시작한다.

  • CONTROL FOOTING 그룹에 NEXT GROUP 절을 작성한 경우 report writer는 처리 중인 해당 절을 적용하기 전에 처리 중인 control break의 수준을 확인한다. break의 수준이 이 그룹의 수준보다 높으면 NEXT GROUP 절은 무시된다. 즉 CONTROL FOOTING의 NEXT GROUP 절이 다음 CONTROL FOOTING 위치에 영향을 미칠 수 없다.

    예를 들어 다음과 같이 CONTROL FOOTING FOR REPORT는 이전 레벨의 CF에 NEXT DE OR CH GROUP NEXT PAGE가 있으면, 새 페이지로 강제로 이동되지 않는다.

    01   CF  FOR STATE     NEXT DE OR CH GROUP NEXT PAGE.
        ....
    
    01   CF  FOR REPORT.
      03 LINES + 2.
        ....

    이 경우 CONTROL FOOTING FOR REPORT를 새로운 페이지에 표시하려면, 첫 번째 LINE 절에 ON NEXT PAGE를 코드화한다.

  • 다음과 같이 NEXT GROUP 절만 포함하는 더미 보고서 그룹을 코드화할 수 있다. 그룹이 처리될 때 출력이 발생하지 않지만 NEXT GROUP NEXT PAGE 절 때문에 LINE-COUNTER는 LAST CONTROL FOOTING과 동일하게 설정된다.

    01  CF FOR STATE     NEXT GROUP NEXT PAGE.

    LINE-COUNTER를 직접적으로 변경하는 대신 언제든지 일정한 간격을 확보하려면 다음과 같이 코드화할 수 있다. 그리고 PROCEDURE DIVISION에서 GENERATE LINE-GAP을 작성하면 된다.

    01  LINE-GAP    DE    NEXT GROUP + 3.

2.7.2. Effect of NEXT GROUP on Non-Body Groups

  • REPORT HEADING 그룹에 NEXT GROUP을 작성할 수 있다.

    이 경우 영향을 받는 그룹은 REPORT HEADING 바로 뒤에 오는 첫 번째 PAGE HEADING 그룹이 된다. NEXT GROUP NEXT PAGE는 REPORT HEADING이 PAGE HEADING 위의 첫 번째 페이지가 아닌 별도의 페이지가 있음을 나타낸다. 그러나 REPORT HEADING이 첫 번째 PAGE HEADING에 라인 상 위에 있지 않더라도 마찬가지이다.

  • PAGE FOOTING 그룹에 NEXT GROUP을 작성할 수 있다.

    이 경우 영향을 받는 그룹은 REPORT FOOTING이다. REPORT FOOTING에서 사용되는 첫 번째 LINE 절이 이 경우를 처리하는데 더 좋은 방법이므로 이 형식은 필요하지 않다.

2.8. OCCURS clause

OCCURS clause은 수평 차원의 필드 또는 그룹, 수직 차원의 라인 또는 그룹에 대해 규칙적인 반복을 표시하는 데 사용된다. 하지만 라인의 반복을 표시하는 것만 지원하고 있다.

figure rw occurs
OCCURS clause
Coding Rules

다음은 OCCURS clause의 Coding Rules에 대한 설명이다.

  • OCCURS 절은 01 레벨에서 작성되어서는 안되며, 4가지 레벨로 사용할 수 있으나 아래의 경우만 지원하고 있다.

    • LINE 레벨에 사용할 수 있다. 라인은 피연산자가 지정한 횟수만큼 수직으로 반복된다.

        03 LINES OCCURS 3.
          05  COL + 2    "HELLO".

      반복된 결과는 다음과 같다.

        HELLO
        HELLO
        HELLO
  • 반복 횟수가 가변적인 경우 DEPENDING ON 구문을 이용할 수 있지만, 지원하고 있지 않다. DEPENDING ON 구문을 이용할 경우에만, integer-1 TO가 함께 사용된다.

  • 반복 시작간의 거리를 지정하기 위해서는 STEP / WIDTH / DEPTH 구문 이용할 수 있지만, 지원하고 있지 않다.

Operation

다음은 OCCURS clause의 Operation 방법에 대한 설명이다.

  • 보고서 그룹 내에서 수직으로 자동 반복을 얻고자 하는 경우 OCCURS 절을 사용하여 개별적으로 코딩한 것과 같은 효과를 얻을 수 있다.

  • PRESENT WHEN 절이 OCCURS 절과 동일한 항목에 코딩된 경우 PRESENT WHEN은 각 발생에 대해 개별적으로 적용된다.

    01 TYPE DE.
     03 LINE OCCURS 12 VARYING R-MONTH PRESENT WHEN PROFIT (R-MONTH) > 0.
        05 COL 1 PIC X(9)     SOURCE NAME-MONTH (R-MONTH).
        05 COL 12 PIC $(6)9   SOURCE PROFIT-MONTH (R-MONTH).

    결과는 다음과 같이 나올 수 있다.

    JANUARY   $1000
    FEBRUARY  $2000
    MARCH     $3000
    ...

2.9. PAGE-COUNTER

이 특수 레지스터에는 현재 페이지의 번호가 포함되어 있다.

figure rw page cnt
PAGE-COUNTER clause
  • INITIATE statement를 통해 1로 설정되며 보고서에 PAGE LIMIT 절이 있는 경우 초기 페이지 이후 각 페이지 이동이 1씩 증가한다. PAGE FOOTING과 PAGE HEADING의 생성 사이에 증가현상이 일어난다. TERMINATE statement는 PAGE-COUNTER를 변경하지 않고 그대로 둔다.

  • PAGE-COUNTER를 SOURCE 절에 숫자로 처리할 수 있다.

    예를 들어 페이지 번호를 인쇄하기 위해 다음과 같이 작성할 수 있다.

    03  COL 100  PIC ZZZ9 SOURCE IS PAGE-COUNTER.
  • 프로그램에 두 개 이상의 보고서가 있는 경우 report-name을 한정자로 사용하여 어느 보고서의 PAGE-COUNTER 인지 작성해야 한다.

    03  COL 100  PIC ZZZ9 SOURCE IS PAGE-COUNTER  OF REPORT-01.

2.10. PICTURE clause

기본 COBOL과 마찬가지로 PICTURE clause을 사용하여 각 보고서 필드의 크기와 형식을 나타낸다.

figure rw picture
PICTURE clause
Coding Rules

다음은 PICTURE clause의 Coding Rules에 대한 설명이다.

  • 사용 가능한 모든 PICTURE 기호는 DISPLAY 필드와 일치하고 이러한 기호의 결합 규칙이 기본 COBOL과 동일할 경우 CURRENCY SIGN 구문에 정의된 통화 기호를 포함하여 사용할 수 있다. PICTURE 기호에 대한 정보는 COBOL의 PICTURE를 참고하도록 한다.

  • VALUE 절이 있는 항목에서 PICTURE 절을 생략할 수 있다. ALL "literal"이나 QUOTE와 같은 figurative constant가 사용되는 경우에는 PICTURE가 필요하다.

  • SOURCE, SUM/COUNT 절을 사용하는 경우 저장되어 있는 동일한 형식으로 표시하려는 경우에도 PICTURE가 필요하다.

2.11. PRESENT/ABSENT AFTER clause

PRESENT/ABSENT AFTER clause은 일반적인 COBOL 조건을 평가하기보다는 report writer의 자동 control-break와 페이지 이동 처리에서 내부적으로 발생하는 조건을 테스트한다는 점을 제외하고는 PRESENT WHEN과 유사하다.

figure rw present after a
PRESENT AFTER Format A
figure rw present after b
PRESENT AFTER Format B
figure rw present after c
PRESENT AFTER Format C
Coding Rules

다음은 PRESENT/ABSENT AFTER clause의 Coding Rules에 대한 설명이다.

  • PAGE 키워드를 지정하는 경우 RD에 PAGE LIMIT 절이 있어야 한다. control-id를 지정하는 경우 REPORT 또는 FINAL이 항상 CONTROL 절에 있는 것으로 가정되는 것을 제외하고, RD의 CONTROL 절에 나열된 control 중 하나여야 한다.

  • 그룹 또는 요소 레벨에서 이 절을 코드화할 수 있으며, 절이 중첩될 수 있다.

  • 모든 본체 그룹(DE,CH,CF)에서 형식을 사용할 수 있지만 CONTROL HEADING이나 CONTROL FOOTING 그룹에서 contol-id 옵션을 사용할 경우 참조하는 control 레벨은 PRESENT AFTER 절에 있는 control 레벨보다 더 높은 레벨이어야 한다.

  • PAGE HEADING이나 PAGE FOOTING 그룹에서 A 형식을 사용할 수 있지만 control-id 옵션이 있을 때만 사용할 수 있다.

  • B 형식은 본체 그룹에서만 사용할 수 있다.

  • C 형식은 아래와 동일하게 동작한다.

    PRESENT  AFTER  NEW  PAGE  OR  lowest-control-id

    여기서 보고서에 PAGE LIMIT 절이 있는 경우 PAGE가 있으며, CONTROLS 절이 있는 경우 control-id가 있다.

  • SUM 절에서 PRESENT/ABSENT AFTER 또는 GROUP INDICATE의 항목을 참조하지 않도록 한다.

Operation

다음은 PRESENT/ABSENT AFTER clause의 Operation 방법에 대한 설명이다.

  • PRESENT 대신 ABSENT를 쓴다면, 정확히 반대 효과를 가지게 된다.

  • PRESENT AFTER 절은 보고서 자체 내에서 당사 조건이 설정된다는 점을 제외하고는 PRESENT WHEN 절과 유사한 방식으로 동작한다.

    • PRSENT AFTER NEW control-id

      PRSENT WHEN이 그룹이 아직 출력되지 않음 OR 마지막 출력 이후 해당 레벨 또는 이상에서 control break가 발생

    • PRESENT AFTER NEW PAGE

      PRSENT WHEN이 그룹이 아직 출력되지 않음 OR 마지막 출력 이후 페이지 진행이 발생

  • PRESENT AFTER NEW control-id

    report writer는 보고서 시작 이후 또는 control-id 이상의 수준에서 마지막 control break 이후 이 보고서 그룹이 출력된 첫 번째 경우 필드를 출력한다. 예를 들어 PRESENT AFTER NEW YEAR-NO를 작성하는 경우 보고서 필드는 YEAR-NO이나 YEAR-NO 보다 더 높은 control 레벨이 변경될 때마다 보고서의 시작 및 첫 번째 GENERATE에서 생성된다. 그렇지 않으면 PRSENT WHEN 절과 동일한 방식으로 하위 항목과 함께 무시된다.

    다음 예에서는 필드 YEAR-NO는 처음 및 변경될 때마다 출력되고, SEASON-NO는 처음에 출력되고, SEASON-NO나 YEAR-NO가 변경될 때마다 출력된다.

    RD ...
       CONTROLS ARE YEAR-NO, SEASON-NO.
      ...
    
    01   NEW-MEM    TYPE DE    LINE + 1.
      05  COL  2    PIC 9(4)   SOURCE YEAR-NO     PRESENT AFTER NEW YEAR-NO.
      05  COL  7    PIC X(6)   SOURCE SEASON-NO   PRESENT AFTER NEW SEASON-NO.
      05  COL  15   PIC X(20)  SOURCE MEM-NAME.
     YEAR SEASON   NAME
     2017 SPRING   JOHN
                   ANDREW
          SUMMER   JANE
     2018 SUMMER   PETER
          ...
  • PRESENT AFTER NEW PAGE

    report writer는 보고서 시작 이후 또는 마지막 페이지 진행 이후 이 그룹이 생성된 첫 번째 경우 해당 필드를 출력한다. 그렇지 않으면, 필드가 출력되지 않는다.

  • PRESENT AFTER PAGE OR control-id

    둘 중 하나 이거나 모든 조건이 만족할 경우 필드가 출력된다. 예를 들어 위 예제에서 YEAR-NO 및 SEASON-NO 필드를 변경 사항이 없더라도 새 페이지를 시작할 때마다 다시 출력할 수 있다.

    01   NEW-MEM    TYPE DE    LINE + 1.
      05  COL  2    PIC 9(4)   SOURCE YEAR-NO     PRESENT AFTER NEW YEAR-NO OR PAGE.
      05  COL  7    PIC X(6)   SOURCE SEASON-NO   PRESENT AFTER NEW SEASON-NO OR PAGE.
      05  COL  15   PIC X(20)  SOURCE MEM-NAME.
  • PRSENT AFTER NEW REPORT

    처음 한번만 생성되길 바라는 필드, 라인 등이 있을 때, 사용한다(REPORT 또는 FINAL은 최고 control 레벨이고, CONTROL 절에 없더라도 항상 있다고 가정한다).

  • GROUP INDICATE

    GROUP INDICATE 절은 한 항목만 출력할 수 있도록 한다.

2.12. PRESENT/ABSENT WHEN clause

PRESENT/ABSENT WHEN clause은 모든 보고서 항목에 일반적인 COBOL 조건을 적용한다. 조건을 평가하여 report writer는 항목이 정상적으로 출력될지 건너뛸지를 결정한다.

figure rw present when a
PRESENT WHEN format A
figure rw present when b
PRESENT WHEN format B
Coding Rules

다음은 PRESENT/ABSENT WHEN clause의 Coding Rules에 대한 설명이다.

  • PRESENT 대신 ABSENT를 쓴다면, 정확히 반대 효과를 가지게 된다. 즉, ABSENT는 PRESENT WHEN NOT과 동일하다.

  • condition은 유효한 COBOL 조건 표현식일 수 있다. 자세한 내용은 COBOL의 조건 표현식을 참조하도록 한다.

  • CONTROL IS control-id 형식은 현재 그룹이 multiple CONTROL FOOTING인 경우에만 허용한다. 즉, 둘 이상의 control-id 피연산자가 있는 CONTROL FOOTING 절이거나 CONTROL FOOTING FOR ALL인 경우 사용할 수 있다.

  • 다음과 같은 경우 PRESENT는 생략하여 사용할 수 있다.

    ...
    05     COL 10   PIC X(10)   VALUE "OVER LIMIT"     PRESENT WHEN AMT > 100.
    05     COL 20               VALUE "BLACK"          WHEN  AMT = 1
                                VALUE "WHITE"          WHEN  AMT = 2
                                VALUE "RED"            WHEN  OHTER.
  • PRSENT UNLESS는 ABSENT WHEN과 동일하다.

2.12.1. Multiple-Choice Form

figure rw multiple choice
Multiple-Choice Format
  • 특정 요소 필드에 일련의 대체 내용을 지정해야 하는 경우 PRESENT WHEN 절이 포함된 여러 개별 항목 대신 단일 항목으로 지정할 수 있다. 여러 개의 SOURCE, VALUE 절로 항목을 코드화한 후 바로 PRESENT WHEN 절이 뒤에 나온다. PRSENT WHEN OTHER 형식은 필요한 경우 단 한번만 작성될 수 있으며 맨 마지막에 배치된다.

  • report writer는 코드 순서대로 첫 번째 조건부터 시작하여 실제 조건을 찾을 때까지 when 조건을 검색한다. 그런 다음 해당 PRESENT WHEN 절 앞에 있는 SOURCE, VALUE 절을 사용하고, 나머지 모든 PRSENT WHEN 및 SOURCE, VALUE 절을 무시한다.

  • PICTURE 절 없이 VALUE 리터럴 절만 지정하는 경우 조건에 따라 생성되는 크기가 다를 수 있다. 실제 생산되는 필드의 크기는 선택한 값의 크기가 된다.

  • LINE 절과 동일한 레벨에 multiple-choice 항목을 배치할 수 없다.

    01   NEW-MEM    TYPE DE.
     03  LINE  1     COL 1     VALUE "BLACK"   WHEN SHADE = 1
                                     "WHITE"   WHEN SHADE = 0.

    따라서 다음과 같이 작성해야 한다.

    01   NEW-MEM    TYPE DE.
     03  LINE  1.
       05  COL 1     VALUE "BLACK"   WHEN SHADE = 1
                           "WHITE"   WHEN SHADE = 0.

2.13. SOURCE clause

SOURCE 절에서는 보고서의 필드 내용을 제공하는 source 필드를 지정한다. source 필드는 일반적으로 REPORT SECTION 외부에 있지만, REPORT SECTION 내에 정의될 수도 있다.

figure rw source
SOURCE clause
Coding Rules

다음은 SOURCE clause의 Coding Rules에 대한 설명이다.

  • 유효한 COBOL 식별자 또는 arithmetic 표현식을 사용할 수 있다.

  • 필요한 경우 다음과 같이 각 피연산자에 qualfier나 subscript를 붙일 수 있다.

    05     COL 10  PIC 999V99 SOURCE IS DATA01 IN DATA-RECORD (A-NO, B-NO)

    피연산자는 MOVE statement에서 일반적으로 허용되는 qulaifer, subscript, index를 가질 수 있다. 상대적 subscripting과 reference modification이 사용될 수 있다.

  • 또한 PICTURE가 없는 VALUE와 달리 동일한 항목에서 PICTURE 절을 코드화해야 한다. PICTURE는 피연산자의 PICTURE와 호환되어야 한다. 두 PICTURE의 길이는 다를 수 있으며, 이 경우 잘라지거나 채워지는 작업이 있을 수 있다. SOURCE 절의 규칙은 MOVE나 COMPUTE statement의 규칙과 동일하다.

  • SOURCE IS와 SOURCES ARE 키워드는 VARYING 절 다음에 바로 올 때를 제외하고는 생략할 수 있다. 그러나, 명확히 하기위해서는 SOURCE 키워드를 작성해야 한다.

  • 표현식은 arithmetic 표현식이 올 수 있다.

    05     COL 10  PIC 999V99 SOURCE IS DATA01 * DATA02 / 100

    표현식을 구성하는 규칙은 COBOL PROCEDURE DIVISION의 arithmetic expression에 설명되어 있는 것을 참고한다. 하지만, 표현식을 사용하는 것은 권장하지 않는다.

  • SOURCE 식별자보다 소수점 오른쪽에 자릿수가 적은 숫자 PICTURE를 사용하는 경우 ROUNDED 구문을 동일한 항목에 사용할 수 있다. 이렇게 하면 항상 원치 않는 숫자를 자르는 대신 생성되는 값이 가능한 두 값의 수치에 더 가까워진다.

    05     COL 10  PIC 999V99 SOURCE DATA01   ROUNDED

    DATA01이 100.50 또는 100.99의 값을 포함하는 경우 생성되는 값은 100이 아니라 101이 된다. ROUNDED 키워드에 대한 자세한 내용은 COMPUTE statement를 참고한다.

  • SOURCE 절에 WHEN 또는 UNLESS 조건을 추가한 다음 동일한 항목에 있는 SOURCE 및 WHEN/UNLESS 절을 추가로 작성하여 multiple-choice 항목을 나타낼 수 있다.

Operation

다음은 SOURCE clause의 Operation 방법에 대한 설명이다.

  • Rules for Generating Report Field

    SOURCE 절의 효과는 COBOL의 MOVE나 COMPUTE statement와 동일한 규칙이기 때문에 해당 statement를 참조해서 설명할 수 있다.

    SOURCE 절의 형식 동일한 statement

    identifier

    MOVE identifier TO report-filed

    identifier ROUNDED

    ADD ZERO, identifier GIVING report-field ROUNDED

    arithmetic-expression

    COMPUTE report-filed = arithmetic-expression

    arithmetic-expression ROUNDED

    COMPUTE report-filed ROUNDED = arithmetic-expression

    CURRENT-DATE 및 TIME-OF-DAY는 개념적 데이터 항목 DATE 및 TIME을 사용한다.

  • Reference to controls

    SOURCE 절이 직접 또는 간접적으로 CONTROL 피연산자를 참조하고 CONTROL FOOTING 시간에 SOURCE를 가져오는 경우 control break 전의 control 식별자의 내용이 사용된다. 즉, 다음 보고서 그룹에서 control 필드에 대한 break 이전의 내용을 얻을 수 있다.

    • 모든 CONTROL FOOTING

    • 페이지를 이동하는 경우 PAGE FOOTING과 PAGE HEADING

2.13.1. Multiple SOURCES

키워드 뒤에 둘 이상의 식별자 또는 표현식을 작성하여 SOURCE 절의 여러 형식을 사용하는 경우 여러 개의 개별 항목을 코드화하지 않아도 된다. 단 다음 사항에 주의하도록 한다.

  • 특정 필드에 저장된 내용이 없음을 나타내는 키워드로 NONE을 포함할 수 있다.

  • 입력 내용은 Multiple LINES 절과 함께 사용할 수 있다. Multiple COLUMNS 절은 지원하고 있지 않다.

  • Multiple SOURCE의 항목 갯수는 Multiple LINE에 정의된 갯수와 동일해야 한다.

Multiple LINES와 함께 사용된 Multiple SOURCE가 함께 사용된 다음의 예를 살펴본다.

...
   03 LINE 1 2.
      05 COLUMN  1    PIC X(04)    SOURCE  YEAR  MONTH.
...

위의 코드는 다음과 같은 의미를 가진다.

...
   03 LINE 1.
      05 COLUMN  1    PIC X(04)    SOURCE  YEAR.
   03 LINE 2.
      05 COLUMN  1    PIC X(04)    SOURCE  MONTH.
...

2.14. SUM clause

SUM 절은 자동으로 다른 숫자 필드의 합계를 형성한다.

figure rw sum
SUM clause
Coding Rules

다음은 SUM clause의 Coding Rules에 대한 설명이다.

  • SUM 절을 코드화하는 방법은 다음과 같이 그 자체로 하나의 절로써 SOURCE, VALUE 절 대신 작성할 수 있다.

    05     COL 10  PIC 999V99 SUM OF SALE.

    expression과 함께 작성하거나 expression의 일부로 작성할 수는 있으나, 현재 버전에서는 지원하고 있지 않다.

  • 합계되는 항목은 다음 두 가지 중 하나이다.

    • REPORT SECTION에 있는 숫자 데이터 항목의 이름이다. 이것을 사용하려면 총계할 REPORT SECTION의 항목에 데이터 이름을 지정해야 한다.

      05 R-SALES    COL 10  PIC 99999  SOURCE SALE.

      보고서의 다른 항목에 SUM OF R-SALES를 작성하여 합계를 구성할 수 있다. 이 것을 REPORT SECTION의 SUM 절이라고 한다. SUM 연산자는 subscript와 산술 기호를 가질 수 없다. 오직 SUM OF data-name 만 쓸 수 있다.

      05    COL 10  PIC 999999  SUM OF R-SALES.

      SUM 절에 언급된 데이터 항목은 SUM R-SALES IN SUMMARY-SALES 처럼 report-name과 함께 작성할 수 있다.

    • REPORT SECTION 외부에 있는 숫자 타입의 식별자 또는 표현식이다. 이 형식은 SOURCE 절의 피연산자와 유사하다. 이를 non-REPORT SECTION SUM 절이라고 한다. 현재 표현식은 지원하고 있지 않다.

  • 보고서에는 그룹의 TYPE에서 원하는 만큼 SUM 절의 항목이 포함될 수 있다. 요소 항목에서만 SUM 절을 사용할 수 있다.

  • UPON 구문을 코드화하는 경우 각 group-name은 DETAIL 그룹의 이름이어야 하며, 현재 정의 중인 그룹과 동일하지 않아야 한다.

  • SUM 절이 DETAIL 그룹에 있고, SUM 절의 피연산자가 REPORT SECTION에 있지 않은 경우 보고서에는 둘 이상의 DETAIL 그룹을 포함해야 하고, 추가할 GENERATE를 지정하기 위해 UPON 구문을 논리적으로 코드화해야 한다.

  • RESET 구문을 코드화하는 경우 control-id 피연산자는 보고서의 CONTROL 절에 정의된 것 중 하나여야 한다. 현재 CONTROL FOOTING 그룹을 정의한다면, RESET ON의 control 레벨이 이 그룹의 레벨보다 높아야 한다.

  • RESET 구문은 multiple CONTROL FOOTING 그룹의 어느 곳에서도 정의할 수 없다.

Operation

다음은 SUM clause의 Operation 방법에 대한 설명이다.

report writer는 자동으로 총합, 표시 및 재설정(합계를 0으로 설정)을 수행한다.

  • 총합

    총합에 사용되는 방법은 SUM에서 참조하는 항목이 REPORT SECTION 항목의 data-name인지의 여부에 따라 달라진다.

    • REPORT SECTION SUM

      SUM 절에 있는 원본 데이터 항목이 보고서에 출력될 때마다 참조하는 항목이 합계 필드에 더해진다. 총합된 REPORT SECTION 데이터 항목에 SOURCE 또는 VALUE 절이 포함된 경우 총계에 추가된 양은 중간 REPORT SECTION 필드가 아닌 REPORT SECTION 외부에 있는 SOURCE 또는 VALUE 피연산자이다.

      예를 들어 다음과 같이 작성할 경우 합계에 더해지는 필드(S-FLD1, S-FLD2)는 R-FLD1, R-FLD2가 아닌 10과 SALES의 값이다.

      05   R-FLD1    COL 1   PIC 999    VALUE 10.
      05   R-FLD2    COL 10  PIC 9999   SOURCE SALES.
      ...
      05   S-FLD1    ...                SUM OF R-FLD1.
      05   S-FLD2    ...                SUM OF R-FLD2.

      REPORT SECTION 총합의 두 가지 예를 구분하는데 사용되는 두 가지 이름이 있다.

      • Cross-Footing

        다음은 총계 할 항목이 SUM 절과 동일한 보고서 그룹에 있다. SUM 항목은 합계를 계산하는 항목은 물리적 순서대로 작성하는 것이 좋다.

        01  SALES-TOTLAS     CF FOR CITY.
          03 LINE + 2.
            05  R-T-SALES COL 31   PIC $(6)9     SOURCE VAL-THIS-YR.
            05            COL 31   PIC $(7)9     SUM OF R-T-SALES.
          03 LINE + 1     COL 31   VALUE "----------------------".

        다음과 같은 순환적인 종속성은 피해야 한다.

        05 R-A ... SUM OF R-A ...
        or
        05 R-A ... SUM OF R-B ...
        05 R-B ... SUM OF R-A ...
      • Rolling Forward

        다음처럼 합계를 계산할 항목은 SUM 절과 다른 보고서 그룹에 있다.

        01  SALES-DETAIL     DETAIL.
          03  LINE + 1.
            05            COL 1    PIC X(20)     SOURCE SALES-DESC.
            05  R-T-SALES COL 31   PIC $(6)9     SOURCE VAL-THIS-YR.
            05  R-L-SALES COL 41   PIC $(6)9     SOURCE VAL-LAST-YR.
        01  SALES-TOTLAS     CF FOR CITY.
          03 LINE + 2.
            05            COL 1    PIC X(20)     VALUE "TOTLAS".
            05            COL 31   PIC $(7)9     SUM OF R-T-SALES.
            05            COL 41   PIC $(7)9     SUM OF R-L-SALES.
          03 LINE + 1     COL 31   VALUE "----------------------".

        DETAIL에는 더해지는 값이 표시되고, 합계는 CONTROL FOOTING에 표시된다.

        또한 다음 중 하나에서 이 SUM 방법을 사용할 수 있다.

        • 낮은 수준의 CONTROL FOOTING과 높은 수준의 CONTROL FOOTING

        • DETAIL과 DETAIL

        • 어느 그룹과 REPORT FOOTING

        • 어느 본체 그룹과 PAGE FOOTING

        • PAGE FOOTING과 CONTROL FOOTING

    • non-REPORT SECTION SUM

      이 합계는 REPORT SECTION 외부에 있는 값에서 점차 누적된다. 이것은 보통 subtotalling이라고 부른다. 식별자나 표현식이 REPORT SECTION 외부에 있기 때문에, 합계에 값이 더해질 때 REPORT SECTION SUM 절처럼 명확하지 않으므로 다음 규칙이 중요하다.

      • SOURCE SUM correlation이 적용되는 경우 SUM 절에 표시되는 식별자가 SOURCE 항목과 동일한 식별자를 포함하고 있는 DETAIL이 생성될 때 덧셈이 발생하게 된다.

      • UPON 구문을 사용하는 경우 해당 구문에 지정된 DETAIL이 생성될 때 덧셈이 발생하게 된다.

      • SOURCE SUM correlation이 적용되지 않고 UPON 구문이 없는 경우 report를 참조하는 각 GENERATE 마다 덧셈이 발생한다.

      거의 모든 totalling은 REPORT SECTION SUM 절을 통해서도 수행할 수 있다.

  • 합계 표시

    SUM이 포함된 항목이 출력될 때, 편집되지 않은 최신 합계는 필드 내용의 내부 "source"로 사용된다. 따라서 코드화 하면 다음과 같다.

    05    COL 5    PIC $$,$$$,$$9.99      SUM R-SALES.

    내부 합계 필드는 이 report 필드로 이동되고, SOURCE 절과 동일한 규칙에 따라 지정된 PICTURE에 따라 편집된다.

  • 합계 재설정

    합계는 RESET 구문을 사용하여 이 값을 오버라이드하지 않는 한 정의된 report group에 대한 처리가 끝날 때 재설정(0으로 초기화)된다. 그러므로 합계 필드는 내용이 지워지기 전에 동일한 그룹 내에서 사용할 수 있는 상태로 유지된다.

다음의 사항에 주의한다.

  • 합계에 값을 더할 때 report writer는 ADD statement 규칙을 준수한다. size error가 있으면 run time 에러가 표시된다.

  • 프로그램에 두 개 이상의 report가 있는 경우 한 report 내에서만 rolling forward가 제한되지는 않는다. 한 report에서의 SUM 절은 다른 report의 이름이 지정된 숫자 데이터 항목을 나타낼 수 있다. 단일 report 합계와 마찬가지로 참조된 필드 값은 필드가 출력될 때마다 더해진다.

    report 내에 모든 합계 필드는 INITIATE statement를 통해 초기화된다. 그러므로, 한 report에서 다른 report로 SUM을 수행해야 하는 경우 처리를 시작할 때 두 report가 모두 INITIATE되어 있는지 확인해야 한다.

  • PRESENT WHEN 절은 조건연산자에서 참조된 전체 필드 값을 테스트할 수 있다. 그러나 SUM 절이 있는 항목이나 SUM 절에 의해 합계된 항목을 범위 내에 포함하면 안된다.

2.14.1. 합계 필드 사용

data-name은 SUM 절이 포함된 항목에 지정하면 report writer는 data-name을 SOURCE, VALUE 절의 경우처럼 보고서 라인의 외부 필드가 아닌 자체 내부 합계 필드와 연관시킨다.

다음 두가지 사례를 비교해본다.

  • With SOURCE etc.

    05   R-PAYMENT    COL 11    PIC $(7)9.99    SOURCE IS WS-PAYMENT.

    R-PAYMENT 필드는 SUM 절에서 참조될 경우를 제외하고 실제 보고서 라인 필드이며, WS-PAYMENT는 추가된 항목이다.

  • With SUM

    05   TOT-PAYMENT    COL 11    PIC $(7)9.99    SUM OF WS-PAYMENT.

    TOT-PAYMENT 필드는 REPORT SECTION의 내부 합계 필드이다. 보고서 라인 필드에 출력되는 것은 이름이 없게 된다.

다음은 내부 합계 필드와 합계 필드의 사용법에 대한 설명이다.

  • 내부 합계 필드

    내부 합계 필드는 SUM 항목만큼 정수 및 소수 자릿수를 가진 순수한 숫자이며 부호가 있는 계산 가능한 필드이다. 따라서 보고서 필드에 합계 필드를 저장될 때 정밀도가 손실되지 않는다.

    SUM 절이 REPORT SECTION 항목을 참조하는 경우 필요한 경우 합계 필드의 정밀도가 증가하여 합계 항목과 적어도 동일한 정수 및 소수 자릿수를 갖는다. 따라서 합계는 최소한 누적되는 필드의 정밀도를 가지며, 표시된 경우 필드가 누적되는 동안이 아니라 출력될 때 반올림 또는 절단이 발생한다.

    SUM 항목의 PICTURE REPORT SECTION 내에 있는 경우 SUM 피연산자의 PICTURE 내부 합계의 PICTURE

    99999

    (REPORT SECTION 내에 없음)

    S9(5) COMP

    ZZZ9.99

    ZZ9.99

    S9(4)V99 COMP

    $(6)9-

    $(5)9.99-

    S9(6)V99 COMP

    보고서 라인 필드가 부호가 없더라도 합계 필드는 항상 부호를 갖게 된다는 것을 기억한다.

  • 합계 필드의 접근

    다음과 같은 방법으로 내부 합계 필드에 직접 접근할 수 있다.

    • SOURCE clause

      단일 피연산자 항목으로 SOURCE 절이 포함된 내부 합계 필드를 가져올 수 있다.

      다음과 같이 접근하는 합계 필드의 범주에 따라 값이 달라진다.

      • 동일한 보고서 그룹에 정의된 합계 필드를 참조하는 SOURCE

        이 경우 항상 지정된 합계의 정확한 값을 얻을 것이다. 정밀도를 잃지 않고 non-REPORT SECTION에서 인쇄할 수 없는 총계를 형성하고자 할 때 유용하다.

        다음과 같이 두 가지 경우를 살펴보도록 한다.

        ...
          05   TOT-PAYMENT    COL 11    PIC S9(6).99    SUM OF WS-PAYMENT.
          05                  COL 21    PIC -(6)9       SOURCE TOT-PAYMENT.
        ...
        ...
          05                  COL 21    PIC -(6)9      SUM OF WS-PAYMENT.

        첫 번째 경우는 SUM 피연산자가 REPORT SECTION data-name인 경우로 합계에 잘림 현상이 발생하지 않는다. 하지만, 두번째 경우는 , 내부 합계 필드가 암시적으로 PICTURE S9(6) 으로 되기 때문에 소수점 이하의 값이 보장되지 않게 된다. 따라서 정확한 값을 얻을 수 없다.

      • 동일한 보고서 그룹에 정의되지 않은 합계 필드를 참조하는 SOURCE

        이 경우 총 SUM 필드가 non-REPORT SECTION 항목 또는 다른 보고서 그룹의 항목을 참조하는 경우 그 순간에 누적된 값을 얻고자 할 때 유용하다. SUM 항목은 보고서의 특정 부분에 점차적으로 누적되므로 최종 합계까지 모든 상태의 버전을 얻을 수 있다.

    • PRESENT WHEN clause

      PRESENT WHEN의 조건에서 합계 필드의 값을 확인하여, 보고서 그룹에서 생성되는 내용을 제어할 수 있다.

      ...
        05   TOT-PAYMENT      PIC S9(6).99    SUM OF WS-PAYMENT.
        05   LINE + 2 PRESENT WHEN TOT-PAYMENT NOT = ZERO.
           07  COL  1                         VALUE "TOTAL :".
           07  COL  11        PIC -(6)9       SOURCE TOT-PAYMENT.
      ...

      위와 같은 코드가 작성되어 있을 경우 TOT-PAYMENT의 값은 PRESENT WHEN 조건에 따라 인쇄할 수도 있고 안할 수도 있다.

2.14.2. RESET phrase

앞부분에서 설명했듯이 합계 필드는 해당 그룹의 처리가 끝나면 0으로 재설정된다. RESET 구문을 이용하여 재설정되는 일을 제어할 수 있다.

  • RESET ON control-id를 지정하면 해당 control-id의 발생이 일어날 때까지 합계 필드가 초기화되지 않는다.

    다음의 예를 살펴본다. REPORT 정의는 다음과 같다.

    RD SALES-REPORT ...
       CONTROLS    YEAR   MONTH.
    ...
    01 SALES-DETAIL  DETAIL.
      03 LINE + 1.
         05          COL  20    PIC ZZZ9.99  SOURCE AMOUNT.
    01 CONTROL HEADING FOR YEAR.
      03 LINE + 1.
         05          COL  1     PIC X(5)     VALUE 'YEAR:'.
         05          COL  10    PIC X(4)     SOURCE YEAR.
    01 CONTROL FOOTING FOR MONTH.
      03 LINE + 1.
         05          COL  1                  VALUE 'TOTALS '.
         05          COL  10    PIC X(3)     SOURCE MONTH.
         05  M-SUM   COL  20    PIC ZZZ9.99  SUM OF AMOUNT.
         05  Y-SUM   COL  30    PIC ZZZ9.99  SUM OF AMOUNT  RESET ON YEAR.

    M-SUM의 경우는 RESET 구문을 지정하지 않았고, Y-SUM의 경우는 RESET 구문을 지정하였다.

    ...
    YEAR:     2018
                         100.00
                         200.00
    TOTALS    JAN        300.00    300.00
                          50.00
    TOTALS    FEB         50.00    350.00
                         300.00
                         100.00
    TOTALS    MAR        400.00    750.00
    ...
    YEAR:     2019
                         100.00
                         150.00
    TOTALS    JAN        350.00    350.00
    ...

    M-SUM의 값은 MONTH의 control break가 발생할 때마다 합계를 출력하고 0으로 재설정된 후 값이 누적되는 것을 확인할 수 있다. 하지만 RESET 구문이 지정된 Y-SUM의 경우는 YEAR의 control break가 발생할 때까지 재설정되지 않고 계속 누적되고 있다.

2.15. TYPE clause

TYPE clause은 7가지 보고서 그룹 중 어떤 유형이 정의되고 있는지를 나타내기 위해 01 레벨에서 사용된다.

figure rw type
TYPE clause

여기서 control-id는 CONTROL(S) 절의 식별자 또는 REPORT 또는 FINAL이라는 단어이다.

Coding Rules

다음은 TYPE clause의 Coding Rules에 대한 설명이다.

  • TYPE claus은 01 레벨 항목에만 작성해야 한다. TYPE IS 키워드는 생략할 수 있다. 그룹에 대한 TYPE 절을 코드화하지 않으면 TYPE DETAIL로 간주된다.

  • 보고서 그룹의 모든 TYPE은 상황에 관계없이 선택 사항이지만, 모든 보고서에는 적어도 하나의 본체 그룹(DE, CH, CF)이 있어야 한다.

  • RD에 PAGE LIMIT 절이 있는 경우에만 CONTROL HEADING 그룹의 OR PAGE 구문과 PAGE HEADING, PAGE FOOTING을 사용할 수 있다.

  • CONTROL HEADING과 CONTROL FOOTING에서 각 control-id 피연산자는 항상 존재한다고 가정되는 REPORT 또는 FINAL을 포함하여 CONTROL 절의 control 목록에서 선택한다.

  • CONTROL HEADING에 control-id 피연산자 없이 작성한 경우 CONTROL 절에 하나 이상의 control-id가 있으면 안된다. CONTROL 절에 단 하나의 control-id가 있는 경우 CONTROL HEADING FOR control-id를 의미하고, CONTROL 절이 없는 경우 CONTROL HEADING FOR REPORT를 의미한다.

  • CONTROL FOOTING에 하나 이상의 control-id가 작성된 경우 그 결과는 multiple CONTROL FOOTING 보고서 그룹의 집합이 된다. 하지만, 현재 버전에서는 multiple CONTROL FOOTING을 지원하지 않는다.

  • CONTROL FOOTING에 control-id 피연산자 없이 작성한 경우 CONTROL 절에 하나의 control-id가 있는 경우 CONTROL FOOTING FOR ALL 또는 CONTROL FOOTING FOR control-id를 의미하고, CONTROL 절이 없는 경우 CONTROL FOOTING FOR REPORT를 의미한다.

  • 모든 보고서에는 여러 개의 DETAIL 보고서 그룹이 있을 수 있지만, PAGE HEADING, PAGE FOOTING, REPORT HEADING, REPORT FOOTING은 하나만 가능하고, 각 control-id에 대한 CONTROL HEADING과 CONTROL FOOTING 도 하나씩만 가능하다. CONTROL FOOTING FOR ALL이 작성된 경우 보고서에 유일한 CONTROL FOOTING이어야 한다.

Operation

TYPE claus을 사용하여 보고서에서 그룹을 암묵적으로 어디에 어떻게 생성해야 하는지를 나타낼 수 있다. 다음은 각 TYPE을 처리하는 방법에 대한 요약이다.

TYPE 설명

REPORT HEADING

이 그룹은 보고서의 시작 부분에 한번만 나타난다.

PAHE HEADING

이 그룹은 각 페이지에서 첫 번째 그룹으로 생성된다.

CONTROL HEADING

이 그룹은 해당 control의 각 실제 값이 달라지는 시작 부분에 자동으로 나타난다.

DETAIL

나머지 여섯 가지 보고서 그룹 중 하나가 아닌 모든 보고서 그룹은 TYPE DETAIL 이다.

DETAIL 그룹은 프로그램에서 명시적으로 GENERATE 될 수 있는 유일한 보고서 그룹이다. 보고서 그룹의 나머지 여섯 가지 TYPE은 DETAIL 그룹이 처리되기 전에 필요할 때마다 자동으로 생성된다.

CONTROL FOOTING

이 그룹은 해당 control의 각 실제 값이 달라지는 끝 부분에 자동으로 나타난다.

PAGE FOOTING

이 그룹은 각 페이지의 마지막 그룹으로 생성된다.

REPORT FOOTING

이 그룹은 보고서의 맨 끝에 한번만 나타난다.

CONTROL HEADING에서 OR PAGE 구문

TYPE CONTROL HEADING에 대한 control-id 피연산자 뒤에 OR PAGE 구문을 추가할 수 있다. 이로 인해 각 페이지 상단에 CONTROL HEADING이 생성된다. 이렇게 하면 일반 PAGE HEADING 이후 필수 핵심 정보를 반복할 수 있다. 정확한 작동 규칙은 다음과 같다.

  • 보고서에 OR PAGE 구문이 포함된 TYPE CH 그룹이 있는 경우 CONTROL HEADING 그룹은 PAGE 옵션이 없을 때와 마찬가지로 해당 레벨에서 control break 후에 나타난다. 또한 추가적으로 페이지 진행시의 작업 처리는 다음과 같이 수정된다.

    • DETAIL 그룹이 페이지 이동의 원인이 되는 경우 일반적인 페이지 진행 후 CONTROL HEADING 그룹이 출력된다. 둘 이상의 CH 그룹에 OR PAGE 옵션이 있는 경우 이 CH 그룹은 최고에서 최저까지 계층적 순서로 출력된다. 각 CH 역시 이전 페이지에 적합한지 여부에 관계없이 새 페이지에 출력된다.

    • CONTROL HEADING 그룹이 페이지 이동의 원인이 되는 경우 OR PAGE 구문이 있는지 여부와 관계없이 페이지 이동의 원인이 된 CONTROL HEADING 그룹이 새 페이지에 한 번만 출력되는 것을 제외하면 위와 동일하게 동작한다.

    • CONTROL FOOTING 그룹이 페이지 이동의 원인이 되는 경우 CONTROL FOOTING 레벨 아래의 CONTROL HEADING이 출력되지 않는 것을 제외하고 DETAIL과 동일하게 동작한다.

  • 그룹에 control-id가 없는 CH FOR PAGE가 있는 경우 CH FOR PAGE OR REPORT로 간주된다.

2.16. VALUE clause

VALUE clause은 출력한 보고서 필드가 고정 리터럴 값으로 구성될 때마다 사용할 수 있다.

figure rw value
VALUE clause
Coding Rules

다음은 VALUE clause의 Coding Rules에 대한 설명이다.

  • figruative constant를 포함한 리터럴을 지정할 수 있다.

  • ALL 또는 figurative constant를 지정하지 않는 한 PICTURE 절이 필요하지 않다. 예를 들면 다음과 같다.

    05     COL 10  VALUE "*** REPORT START ***".
  • ALL "literal" 형식 또는 numeric 리터럴 또는 figurative constant를 사용할 수 있지만 이러한 모든 경우 PICTURE를 지정해야 한다.

2.16.1. Multiple VALUES

Multiple VALUE 절을 사용하는 경우 키워드 뒤에 두 개 이상의 리터럴을 작성하여 여러 갱의 개별 항목을 코딩하는 작업이 절약된다.

사용할 때 다음 사항에 주의해야 한다.

  • 특정 발생에 값을 지정하지 않으려면, 공백 문자(" ")로 코드화할 수 있다.

  • 입력 내용은 Multiple LINES 절과 함께 사용할 수 있다.

  • Multiple VALUE에서 허용되는 리터럴 수에 대한 규칙은 Multiple SOURCE 절의 반복 횟수와 정확히 같아야 한다.

2.17. VARYING clause

이 절은 반복 필드를 생성하는 숫자 카운터의 값을 변경하는데 사용한다.

figure rw varying
VARYING clause
Coding Rules

다음은 VARYING clause의 Coding Rules에 대한 설명이다.

  • VARYING 절에는 원하는 만큼 FROM과 BY 구문과 함께 data-name 피연산자를 사용할 수 있지만, 현재 버전에서는 하나의 FROM과 BY 구문이 포함되지 않은 data-name 피연산자를 지원하고 있다. FROM 구문과 BY 구문이 생략되어 있는 경우 FROM 1과 BY1로 처리된다.

  • 해당 절은 OCCURS 절이나 Multiple LINES 절이 있어야 사용할 수 있다.

  • data-name은 프로그램의 다른 곳에서 이미 정의되어서는 안되며, 별도로 정의하지 않아야한다. COBOL의 index-name을 처리하는 것과 유사하게 report writer 내부적으로 description을 생성한다.

Operation

다음은 VARYING clause의 Operation 방법에 대한 설명이다.

  • OCCURS 절과 함께 사용되어 첫 번째 발생을 생성할 때 VARYING 절에 의해 암시적으로 설정된 데이터 항목에 FROM 값인 1을 배치한다.

  • VARYING 절을 사용하여 반복 필드를 생성한 예시는 다음과 같다.

     03 LINE.
        05   COL + 2   PIC Z9   OCCURS 10   VARYING  C-INDEX    SOURCE C-INDEX.

    결과는 다음과 같다.

       1   2   3   4   5   6   7   8   9  10

3. Report Statements

본 절에서는 report writer에서 사용되는 statements에 대해서 설명한다.

COBOL report writer는 report writer에서 사용되는 statement를 실행할 때까지 작동하지 않는다. 주요 statement로는 INITIATE, GENERATE, TERMINATE 3가지가 있다.

INITIATE와 TERMINATE는 보고서 처리의 시작과 끝에 각각 수행되며, GENERATE는 반복적으로 실행되는 동안 하나의 DETAIL을 생성할 수 있다. 이 주요 3가지 statement는 다른 COBOL statement들과 동일한 방식으로, USE BEFORE REPORTING Declarative SECTION을 제외하고 프로그램 내의 모든 위치에서 사용될 수 있다.

  • Operation 순서

    input으로 단순한 파일을 사용하는 단일 보고서의 경우 일반적인 report writer 작업 순서는 다음과 같다.

    • 시작할 때 한번 파일을 OPEN

      OPEN INPUT input-file
      OPEN OUTPUT report-file
    • 시작할 때 한번 report writer를 준비

      INITIATE report
    • input 파일에서 각 레코드에 대한 처리

      GENERATE detail-group 또는 report
    • 끝에 한번 report writer를 종료

      TERMINATE report
    • 끝에 한번 파일을 CLOSE

      CLOSE input-file
      CLOSE report-file

3.1. GENERATE

GENERATE statement는 출력을 생성하기 위한 COBOL Report Writer의 기본 문법이다. report writer가 제어를 전달하여 DETAIL 그룹에 설명된 모든 라인과 필드를 생성하기 전에 필요한 control-break와 page-break 처리를 비롯한 모든 필수적인 처리 작업을 수행할 수 있도록 한다.

GENERATE는 Declarative의 USE BEFORE REPORTING 지시문에 나타날 수 없다.

figure rw generate
GENERATE statement
  • detail-group-name

    • GENERATE detail-group-name을 코드화하는 경우 이 이름은 현재 프로그램에 코딩된 DETAIL 그룹의 이름이거나 포함하고있는 프로그램에서 정의된 GLOBAL report에 있는 이름이어야 한다. 그룹 이름은 01 레벨 바로 다음에 나타난다.

  • report-name

    • GENERATE report-name은 특별한 의미를 가지며, 요약 보고 형식으로 알려져 있다. 이 경우 DETAIL 그룹이 억제될 수 있으므로, GENERATE 실행 시점에서 report의 본문에서 CONTROL HEADING이나 CONTROL FOOTING 그룹만 필요하지 않는다면, 이 형식을 사용하지 않도록 한다. 이 형식을 사용하는 경우 report에 적어도 하나 이상의 CONTROL HEADING이나 CONTROL FOOTING을 가져야 한다.

Operation

다음은 GENERATE statement의 Operation 방법에 대한 설명이다.

GENERATE 문은 report writer가 일반적인 report에서 3가지 주요 조치를 수행하도록 한다.

  • control break에 대해 확인하고 필요한 경우 CONTROL FOOTING과 CONTROL HEADING을 생성한다.

  • page-fit에 대해 확인하고 페이지 이동 및 필요한 경우 PAGE FOOTING과 PAGE HEADING을 생성한다. 이는 또한 CONTROL HEADING이나 CONTROL FOOTING의 결과로 생성될 수 있다.

  • 요약 보고서(GENERATE report-name)를 수행하지 않는다면 DETAIL 그룹에 대한 각 라인을 생성한다.

일단 report가 INITIATE 되면, 프로그램은 report 내의 각 DETAIL 그룹에 대한 GENERATE 문을 실행할 수 있다. Report Description에 여러 DETAIL 그룹이 포함되어 있다면, 프로그램의 어떤 부분에서도 일련의 다른 GENERATE 문을 코드화할 수 있고, 이런 방법으로 필요한 report layout을 작성할 수 있다. 또한 프로그램의 한 곳 이상에서 동일한 DETAIL 그룹에 대한 GENERATE를 작성할 수 있다.

GENERATE 후 detail-group-name 대신 report-name을 코드화하는 요약 보고서에는, 다음과 같은 영향이 있다.

  • DETAIL 그룹이 출력되지 않는다.

  • SUM 피연산자의 모든 rolling forward는 DETAIL 그룹에서 rolling forward 되는 경우를 제외하고 평소대로 수행된다.

  • SUM 피연산자의 모든 cross-footing은 DETAIL 그룹에서 cross-footing 되는 경우를 제외하고 평소대로 수행된다.

  • REPORT SECTION 내에 있지 않는 SUM 피연산자의 subtotalling은 다음과 같이 실행된다.

    • SOURCE 피연산자와 SUM 피연산자의 상관 관계가 적용되는 경우 DETAIL 그룹의 SOURCE 피연산자에 해당하는 모든 SUM 피연산자는 각 DETAIL 그룹이 차례대로 GENERATE를 수행한것처럼 합계에 더해진다. SOURCE 피연산자와 일치하지 않고 REPORT SECTION 내에 있지 않는 SUM 피연산자는 합계에 한 번만 더해진다.

    • SOURCE SUM 상관 관계가 적용되지 않는 경우 SUM 피연산자는 합계에 한 번만 더해진다.

  • control break는 평소대로 수행된다. control break가 감지되면, 모든 CONTROL FOOTING, CONTROL HEADING 그룹이 평소대로 출력되고, 페이지 증가가 발생하면 PAGE FOOTING, PAGE HEADING 그룹이 함께 출력될 수 있다.

GENERATE report-name은 control break 이후와 INITIATE 후 첫 GENERATE에서만 출력을 생성할 수 있다. INITIATE와 TERMINATE 사이에 프로그램은 GENERATE report-name과 GENERATE group-name 형태의 statement를 모두 수행할 수 있다.

Processing Cycle

보고서가 아직 INITIATE를 수행하지 않았다면, 정상적으로 동작하지 않는다.

  • INITIATE 이후 첫 번째 GENERATE인 경우 다음과 같은 동작을 한다.

    • REPORT HEADING 그룹이 있는 경우 REPORT HEADING이 생성된다.

    • CONTROL HEADING 글부이 있는 경우 각각 최고 레벨 부터 최저까지 생성되고, 각 control의 초기 값이 저장된다.

    • THROUGH clause가 사용되면 literal-4, literal-5는 길이가 1인 문자이어야 한다.

  • INITIATE 이후 첫 번째 GENERATE가 아닌 경우 각 control 식별자를 가장 높은 레벨부터 시작하여 저장된 해당 이전 값과 비교한다. control이 변경되지 않은 경우 특별한 작업은 수행되지 않는다. 값의 차이(control break)가 발생하면, 다음과 같은 control break 동작이 발생한다.

    • 각 control-id 값은 일시적으로 control break 직전 값으로 변경된다.

    • CONTROL FOOTING 그룹이 있는 경우 최저 레벨의 CONTROL FOOTING부터 control break가 발생한 레벨의 CONTROL FOOTING까지 생성된다.

    • control-id 값은 control break 후의 값으로 복원된다.

    • CONTROL HEADING 그룹이 있는 경우 control break가 발생한 레벨의 CONTROL HEADING 부터 최저 레벨의 CONTROL HEADING까지 생성된다.

    CONTROL HEADING과 CONTROL FOOTING 그룹은 자체적인 권한으로 작성된 독립 보고서 그룹이기 때문에, DETAIL 그룹과 마찬가지로 여러가지 동일한 작업이 적용된다.

DECLARATIVES에서 해당 그룹에 대해 USE BEFORE REPORTING section이 있다면, 해당 section이 수행된다.

라인이 생성되고 있고 report에 PAGE 절이 있다면 LINE-COUNTER를 확인하여 그룹이 출력되기 전에 페이지 이동이 필요한지 여부를 확인한다. 페이지 이동이 필요한 경우 다음 작업이 수행된다.

  • PAGE FOOTING 그룹이 있는 경우 PAGE FOOTING이 생성된다.

  • PAGE-COUNTER가 1 증가한다.

  • PAGE HEADING 그룹이 있는 경우 PAGE HEADING이 생성된다.

  • OR PAGE가 지정된 CONTROL HEADING 그룹이 있는 경우 최고레벨부터 최저레벨까지 생성된다.

3.2. INITIATE

INITIATE statement 보고서에 대해 실행할 첫 번째 report writer statement 이어야 한다.

INITIATE는 Declarative의 USE BEFORE REPORTING 지시문에 나타날 수 없다.

figure rw initiate
INITIATE statement
  • report-name

    • 각 report-name은 현재 프로그램의 보고서 이름이나 포함된 프로그램에 정의된 GLOBAL 보고서 이름이어야 한다.

  • UPON

    • UPON 구문이 있는 경우 각 report-name은 지정된 file-name의 FD에 REPORT(S) 절에서 정의해야 한다. report-name이 둘 이상의 FD 항목에 정의된 경우 UPON 구문이 사용되어야 한다.

    • UPON 구문이 있으면 지정된 파일에만 보고서가 작성된다. 하지만, 현재 버전에서는 UPON 구문을 지원하고 있지 않다.

Operation

동일한 보고서(또는 보고서의 DETAIL)를 참조하는 GENERATE, TERMINATE를 실행하기 전에 보고서에 대해 INITIATE를 수행해야 한다.

INITIATE를 실행하기 전에 해당 보고서 파일의 OPEN을 실행해야 한다. INITIATE가 파일을 OPEN 하지 않는다. 그러나 파일을 닫았다가 다시 열지 않은 상태에서 TERMINATE가 실행된 보고서에 대해 INITIATE를 다시 실행할 수 있다.

TERMINATE가 처음 수행되지 않는 한, 보고서가 INITIATE 된 상태가 되면 보고서가 보내질 파일에 대해 CLOSE를 실행하면 안된다.

Processing Cycle

다음은 INITIATE statement를 실행할 때 각 단계에 대한 설명이다.

  • LINE LIMIT 절의 식별자 형식이 코드화된 경우 식별자가 확인되고 유효한 경우 보고서 제어 영역에 저장된다.

  • LINE-COUNTER가 0으로 재설정된다.

  • PAGE-COUNTER가 1로 설정된다.

3.3. SUPPRESS PRINTING

SUPPRESS PRINTING statement는 특정 상황에서 특정 report 그룹이 출력되는 것을 방지할 수 있다.

figure rw suppress
SUPPRESS PRINTING statement
  • SUPPRESS PRINTING

    • SUPPRESS PRINTING statement는 Declarative의 USE BEFORE REPORTING 지시문에만 코드화할 수 있다.

  • MOVE integer TO PRINT-SWITCH

    • MOVE 1 TO PRINT-SWITCH는 SUPPRESS PRINTING과 동일한 의미를 가진다.

    • MOVE 0 TO PRINT-SWITCH는 SUPPRESS PRINTING의 효과를 취소하는 의미로 사용할 수 있다.

Operation

SUPPRESS PRINTING 또는 MOVE 1 TO PRINT-SWITCH는 USE BEFORE REPORTING에 지정된 그룹이 출력을 생성하지 못하도록 한다. 즉, 그룹의 라인에 설정된 데이터가 없으며, 라인이 생성되지 않는다. LINE-COUNTER도 변경되지 않은 상태로 유지되므로 페이지 이동이 차단된다. 이 statement는 보고서의 데이터를 저장하는 것과 라인의 출력만을 억제한다.

SUPPRESS PRINTING 또는 MOVE 1 TO PRINT-SWITCH는 실행할때마다 해당 단일 상황에서만 출력이 방지된다. report writer는 USE BEFORE REPORTING section 으로 이동할 때마다 PRINT-SWITCH를 0으로 재설정한다.

3.4. TERMINATE

TERMINATE는 각 보고서에 대해 실행할 마지막 report writer 명령문이어야 한다.

TERMINATE는 Declarative의 USE BEFORE REPORTING 지시문에 나타날 수 없다.

figure rw terminate
TERIMINATE statement
  • report-name

    • report-name은 현재 프로그램에 있는 report 이름이거나 포함하고 있는 프로그램에 정의되어 있는 GLOBAL report 이름이어야 한다.

Operation

프로그램을 최종적으로 종료하기 전에 INITIATE 되어 있는 모든 report에 대해 TERMINATE가 실행되어야 한다. 보고서의 마지막에 필요할 수 있는 마지막 CONTROL FOOTING, PAGE FOOTING, REPORT FOOTING 그룹을 출력한다. PAGE-COUNTER와 LINE-COUNTER는 보고서의 끝에서 얻은 최종 값을 포함하지만, 총 필드는 0이 된다. 관련 보고서 파일에 대해서는 별도로 CLOSE를 수행해야 한다. TERMINATE는 파일을 CLOSE 하지 않는다.

INITIATE 실행 이후에 보고서에 대해 GENERATE 문이 실행되지 않고 TERMINATE를 실행하면, 출력이 전혀 생성되지 않는다. 적어도 REPORT HEADING과 REPORT FOOTING 그룹이 나타나도록 하려면, TERMINATE 전에 빈 DETAIL 그룹을 GENERATE 해주어야 한다.

보고서는 보고서 파일을 닫지 않고 언제든지 다시 INITIATE와 TERMINATE를 할 수 있다. 새로운 INITIATE는 PAGE-COUNTER를 다시 1로 되돌리고, PAGE LIMIT 절이 있는 경우 새로운 페이지에서 다시 보고서를 실행한다.

Processing Cycle

다음은 TERMINATE statement 실행 시 각 단계에 대한 자세한 설명이다.

  • 최소 1개 이상의 GENERATE를 수행한 경우 각 control-id의 값은 마지막 GENERATE 실행될 때의 값으로 일시적으로 변경되며, 각 CONTROL FOOTING 그룹은 최저 레벨부터 최고 레벨까지 생성된다.

  • PAGE FOOTING 그룹이 있는 경우 PAGE FOOTING이 생성된다.

  • REPORT FOOTING 그룹이 있는 경우 REPORT FOOTING이 생성된다.