SORT 명령어

본 장에서는 SORT 명령어의 사용법 및 오퍼랜드에 대해 기술한다.

1. 개요

다음은 OpenFrame이 제공하는 SORT 명령어(operator)목록이다. 각 명령어의 사용법 및 오퍼랜드는 해당 절에서 자세히 설명한다.

명령어 설명

ALTSEQ

ALTSEQ 변환 테이블을 이용하여 SORT, MERGE, COPY를 수행할 때 특정 문자들을 원하는 순서로 변경한다.

DUPKEYS

SORT/MERGE를 수행할 때 동일한 키 값을 가진 레코드들에 대해 주어진 필드의 값들에 대한 연산을 수행하고 하나의 레코드로 표시한다.

END

SORT 문의 마지막을 나타낸다.

INCLUDE/OMIT

INCLUDE 문은 설정된 조건을 만족하는 레코드만을 가지고 SORT/MERGE를 수행하며, OMIT 문은 설정된 조건을 만족하는 레코드들을 제외한 나머지 레코드만을 가지고 SORT/MERGE를 수행한다.

INREC

SORT/MERGE/COPY를 수행하기 전에 주어진 형식에 따라 입력 레코드를 재편집(reformatting)한다.

JOINKEYS , JOIN , REFORMAT

SORTJNF1과 SORTJNF2에 기술한 입력 데이터셋을 출력 데이터셋으로 조인(join)할 때 사용한다.

MERGE

기술한 nn개의 입력 데이터셋을 출력 데이터셋으로 병합할 때 사용한다.

MODS

MODS 제어문을 사용한 스크립트를 통해 사용자 함수를 등록할 수 있다.

OPTION

각종 옵션들을 설정한다.

OUTFIL

SORTOUT을 여러 개의 OUTFIL DD에 기술한 데이터셋에 저장한다.

OUTREC

SORT/MERGE/COPY를 수행하고 난 후 SORTOUT이나 OUTFIL에서 지정한 데이터셋으로 결과를 출력하기 전에 출력 레코드를 재편집(reformatting)한다.

RECORD

레코드의 형식 및 길이를 지정한다.

SORT

입력 데이터셋의 레코드를 주어진 키에 따라 오름차순 혹은 내림차순으로 정렬하여 출력 데이터셋으로 출력한다.

SUM

SORT/MERGE를 수행할 때 동일한 키 값을 가진 레코드들에 대해 주어진 필드의 값들은 모두 합치고 하나의 레코드로 합산한다.

2. ALTSEQ

ALTSEQ 변환 테이블을 이용하여 SORT, MERGE, COPY를 수행할 때 특정 문자들을 원하는 순서로 변경한다. 이에 따라 키의 순서를 바꾸거나 필터링 조건을 다르게 적용할 수 있다. OpenFrame에서는 ASCII 순서를 따른다.

순서의 변경사항은 SORT 또는 MERGE를 실행할 때에만 적용될 뿐 레코드의 출력 내용이 바뀌지는 않는다.

사용법

다음은 ALTSEQ 문의 사용법이다.

ALTSEQ CODE=(xxyy,xxyy,...,xxyy)
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • CODE

    • 변경할 기존 문자와 변경될 새로운 문자 순서를 지정한다. 변경할 문자에 대해 xxyy에 지정한 것에 따라 순서 변경 작업을 수행한다.

    • 다음은 항목에 대한 설명이다.

      항목 설명

      xx

      순서를 변경할 문자를 16진수의 2자리 수로 지정한다.

      yy

      새롭게 변경될 순서를 지정한다.

    • 다음은 SORT를 수행할 때 1(ASCII 번호: 31)의 순서를 a(ASCII 번호: 61)로 변경하여 오름차순으로 정렬하는 예제이다.

      SORT FILEDS=(1,8,AQ,A)
      ALTSEQ CODE=(3161)

3. DUPKEYS

SORT/MERGE를 수행할 때 동일한 키 값을 가진 레코드들에 대해 주어진 필드의 값들에 대해 연산을 수행하고 하나의 레코드로 표시한다. 표시된 하나의 레코드를 제외한 나머지 레코드들은 모두 삭제된다. 또한 키 값이 동일한 레코드들의 필드의 연산을 수행하지 않고 하나만 남기고 나머지 레코드들을 모두 삭제하는 기능도 제공한다.

사용법

다음은 DUPKEYS 문의 사용법이다.

DUPKEYS function[,function]...[,FORMAT=f]|
 FIELDS=NONE|ALLDUPS|FIRSTDUP[,NODUPS]|LASTDUP[,NODUPS]|NODUPS|[,XDUP]
 where function is
 AVG|MAX|MIN|SUM=(p1,l1,[,f1][,p2,l2[,f2]]...)
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • FORMAT=f

    • function에서 사용하는 필드들의 형식이 모두 같은 경우 필드 내에서 일일이 형식을 지정하지 않고 COND 문 뒤에서 FORMAT=f를 사용해 한꺼번에 지정해 줄 수 있다.

    • 다음은 10에서 2Bytes, 12에서 4Bytes, 16에서 8Bytes의 FI 형식의 레코드들을 합산하는 예제이다.

      DUPKEYS SUM=(10,2,12,4,16,8),FORMAT=FI

      OpenFrame에서는 제어 필드의 형식이 모두 일치하는 경우에만 FORMAT 옵션을 지정할 수 있다.

  • FIELDS=NONE

    • 레코드를 연산하지 않고 다만 동일한 키 값을 가진 레코드들을 하나만 남기고 모두 삭제할 때 사용한다.

    • 다음은 동일한 키 값을 가진 레코드들을 하나만 남기고 모두 삭제하는 예제이다.

      DUPKEYS FIELDS=NONE
  • ALLDUPS

    • 레코드를 연산하지 않고 동일한 키 값을 가진 레코드들만 남기고 모두 삭제할 때 사용한다.

    • 다음은 동일한 키 값을 가진 레코드들만 남기고 모두 삭제하는 예제이다.

      DUPKEYS ALLDUPS
  • FIRSTDUP[,NODUPS]

    • 레코드를 연산하지 않고 동일한 키 값을 가진 레코드들 중 첫 레코드만 남기고 모두 삭제할 때 사용한다. NODUPS 오퍼랜드를 추가하는 경우 동일한 키 값을 가지지 않는 레코드도 남긴다.

    • 다음은 동일한 키 값을 가진 레코드들을 중 첫 레코드와 동일한 키 값을 가지지 않는 레코드만 남기고 모두 삭제하는 예제이다.

      DUPKEYS FIRSTDUP,NODUPS
  • LASTDUP[,NODUPS]

    • 레코드를 연산하지 않고 동일한 키 값을 가진 레코드들 중 마지막 레코드만 남기고 모두 삭제할 때 사용한다. NODUPS 오퍼랜드를 추가하는 경우 동일한 키 값을 가지지 않는 레코드도 남긴다.

    • 다음은 동일한 키 값을 가진 레코드들을 중 마지막 레코드만 남기고 모두 삭제하는 예제이다.

      DUPKEYS LASTDUP
  • NODUPS

    • 레코드를 연산하지 않고 동일한 키 값을 가진 레코드들을 모두 삭제하고 동일한 키 값을 가지지 않는 레코드만 남길 때 사용한다.

    • 다음은 동일한 키 값을 가진 레코드들을 모두 삭제하고 동일한 키 값을 가지지 않는 레코드만 남기는 예제이다.

      DUPKEYS NODUPS
  • XDUP

    • DUPKEYS 명령어 처리 과정에서 삭제되는 레코드들을 DD명이 SORTXDUP인 데이터셋에 저장할 때 사용한다.

    • 다음은 동일한 키 값을 가진 레코드들을 DD명이 SORTXDUP인 데이터셋에 저장하는 예제이다.

      DUPKEYS NODUPS,XDUP
  • AVG|MAX|MIN|SUM

    • 입력 레코드를 연산하기 위한 키 필드를 지정한다.

      항목 설명

      AVG

      평균 연산

      MAX

      최댓값

      MIN

      최솟값

      SUM

      합산

    • 키 필드의 시작 위치와 길이, 형식을 결정할 수 있다.

    • 다음은 설정 항목에 대한 설명이다.

      항목 설명

      p

      연산을 수행할 필드의 시작 위치를 기술한다. 자세한 내용은 SORT의 'FIELDS' 오퍼랜드의 p 항목을 참조한다.

      m

      연산할 필드의 길이를 Byte 단위로 지정한다.

      f

      연산 필드의 형식을 지정한다.

      s

      제어 필드의 정렬 기준을 기술한다.

      • A(Ascending order) : 오름차순

      • D(Descending order) : 내림차순

      • E : 사용자 순서 변경(OpenFrame에서는 지원하지 않는다.)

    • 다음은 ZD 형식의 레코드를 시작점 10에서 10Bytes만큼 합산, 시작점 5에서 byte만큼 평균 연산하는 예제이다.

      DUPKEYS SUM=(10,10,ZD),AVG=(5,4,ZD)
주의사항

다음은 DUPKEYS 문을 작성할 때 주의사항이다.

  • SORT/MERGE에서 NOEQUALS가 지정되어 있을 때는 어떤 레코드에 연산되고 어떤 레코드가 삭제되는지는 무작위에 따른다.

    • SORT의 경우 EQUALS가 지정되어 있을 때 먼저 입력된 레코드에 나머지 레코드들을 연산한다.

    • MERGE의 경우 EQUALS가 지정되면 SORTINnn에서 번호가 가장 작은 레코드에 합산되며 SORTINnn이 같은 경우에는 먼저 입력된 레코드에 합산된다.

  • DUPKEYS을 수행할 때 지정된 레코드 필드의 내용만 연산되고 다른 필드의 내용은 연산되지 않는다.

  • DUPKEYS을 수행할 때 오버플로우가 발생하면 연산을 수행하지 않는다.. 연산을 수행하지 않은 레코드들은 삭제 또한 되지 않는다.

4. END

SORT 문의 마지막을 나타낸다. END 문 이후로는 더 이상 명령어를 처리하지 않으며, END 문에 대한 부가적인 오퍼랜드는 없다.

END 문은 직후에 "/*" 또는 그 외의 JOB 제어문이 있는 경우에는 생략이 가능하다.

사용법

다음은 END 문의 사용법이다.

END

5. INCLUDE/OMIT

입력 레코드에 대해서 SORT/MERGE를 수행하기 전에 임의로 조건을 설정하는 기능이다.

INCLUDE 문은 설정된 조건을 만족하는 레코드만을 가지고 SORT/MERGE를 수행하며, OMIT 문은 설정된 조건을 만족하는 레코드들을 제외한 나머지 레코드만을 가지고 SORT/MERGE를 수행한다. SORT/MERGE를 수행하기 전에 입력relational_condition 레코드의 크기를 줄여 작업 효율을 높일 수 있다.

INCLUDE와 OMIT은 함께 지정할 수 없다.

사용법

다음은 INCLUDE/OMIT 문의 사용법이다.

{INCLUDE | OMIT} COND=(logical_expression) [,FORMAT=f]
logical_expression=relational_condition1,[AND | OR],[,relational_condition2[,....]]
relational_condition=([(p1,m1,f1)],[EQ|NE|GT|GE|LT|LE],[(p2,m2,f2)|NUM|constant])
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • COND

    • SORT/MERGE를 수행할 레코드의 조건을 지정한다.

    • SORT/MERGE/COPY를 수행할 입력 레코드의 조건을 지정하는 부분이다. logical_expression의 각 relational_condition을 논리 연산한 값이 참(TRUE)일 때 조건을 만족한다. 논리 연산자로 AND/OR을 사용하며 2개 이상의 relational_condition을 이 논리 연산자로 결합한다. AND는 ‘&’로, OR은 ‘|’로 각각 치환하여 사용할 수 있다.

    • 다음은 logical_expression을 이용한 COND의 예제로 CH 형식의 5부터 8Bytes만큼의 레코드가 CH 형식의 13부터 8Bytes만큼의 레코드보다 크거나, 또는 BI 형식의 105부터 4Bytes만큼의 레코드가 1000보다 작거나 같은 경우 그 레코드를 포함시킨다.

      INCLUDE COND=(5,8,CH,GT,13,8,CH,OR,105,4,BI,LE,1000)
  • FORMAT=f

    • relational_condition의 필드들의 형식이 모두 같은 경우 필드 내에서 일일이 형식을 지정하지 않고 COND 문 뒤에서 FORMAT=f를 사용해 한꺼번에 지정할 수 있다.

    • 다음은 COND 조건의 모든 필드들의 형식이 모두 같은 경우에 FORMAT=f를 이용하는 예제이다.

      • 조건 1 : CH 형식의 레코드 필드의 5부터 1Byte와 8부터 1Byte가 같다.

      • 조건 2 : CH 형식의 레코드 필드의 10부터 1Byte가 A 또는 B이거나, 30부터 1Byte가 C가 아니고 D도 아니다.

        조건 1과 조건 2를 모두 만족하는 레코드를 제외한다.

        OMIT COND=((5,1,EQ,8,1),&,((10,1,EQ,C’A’,|,10,1,EQ,C’B’),|,(30,1,NE,C’C’,&,30,1,NE,C’D’))),FORMAT=CH

        OpenFrame에서는 FORMAT=f를 반드시 COND 오퍼랜드의 뒤에서만 지정할 수 있다. 또한 OpenFrame에서 필드의 형식이 모두 일치하는 경우에만 지정할 수 있다.

  • relational_condition

    입력 레코드에 대한 비교 조건을 지정한다. p1, m1, f1은 필드 1에 대한 정보이고, p2, m2, f2는 필드 2에 대한 정보이다.

    • p

      필드 1과 필드 2의 시작 위치를 기술한다. 자세한 내용은 SORT의 'FIELDS' 오퍼랜드의 p 항목을 참고한다.

    • m1, m2

      필드 1과 필드 2의 시작점으로부터의 상대적인 길이를 Byte로 기술한다.

    • f1, f2

      필드 1과 필드 2의 형식을 기술한다. 다음은 기술 가능한 형식과 형식에 따른 길이에 대한 설명이다.

      형식 설명 길이 부호

      CH

      문자 (ASCII)

      1 to 32760Bytes

      없음

      AC

      문자 (ASCII)

      1 to 32760Bytes

      없음

      ZD (Zoned Decimal)

      Zone 형식의 10진수

      1 to 18Bytes

      있음

      PD (Packed Decimal)

      Pack 형식의 10진수

      1 to 9Bytes

      있음

      FI (Fixed-point)

      고정소수점 2진수

      1 to 8Bytes

      있음

      BI (Binary Integer)

      2진수

      1 to 8Bytes

      없음

      CSF 또는 FS

      추가 전치 부동 부호가 있는 숫자

      1 to 17Bytes

      있음

      UFF (Unsigned Free Format)

      부호가 없는 자유 형식 숫자

      1 to 17Bytes

      없음

      SFF (Signed Free Format)

      부호가 있는 자유 형식 숫자

      1 to 17Bytes

      있음

      ASL

      전치 분리 부호가 있는 숫자, ASCII

      1 to 18Bytes

      있음

      AST

      후치 분리 부호가 있는 숫자, ASCII

      1 to 18Bytes

      있음

      AQ

      문자 (ALTSEQ에서 정의한 순서)

      1 to 32760Bytes

      없음

    • EQ|NE|GT|GE|LT|LE

      각 비교 필드들은 비교 연산자로 결합되며 비교 연산자가 지정하는 조건을 만족할 때 참(TRUE)이 된다. 다음은 비교 연산자의 종류이다.

      비교 연산자 설명

      EQ

      필드 1 = 필드 2

      NE

      필드 1 ≠ 필드 2

      GT

      필드 1 > 필드 2

      GE

      필드 1 ≥ 필드 2

      LT

      필드 1 < 필드 2

      LE

      필드 1 ≤ 필드 2

    • NUM

      필드가 숫자 형식인지 아닌지 판단하는 관계식이다.

      x1y1...xmym

      필드를 16진수로 표현한 결과가 위와 같다면, 연산자가 EQ인 경우 관계식의 결과는 다음과 같다.

      • f1이 CSF(또는 FS)이거나 FORMAT=CSF(또는 FS) 기술된 경우 : x1=…​=xm=3 이고 0≤y1,…​,ym≤9 이면 관계식은 참이 되고 그 외의 경우엔 관계식이 거짓이 된다.

      • f가 ZD이거나 FORMAT=ZD 기술된 경우 : x1=…​=xm-1=3 이고 xm∈{3,4,5,7} 이고 0≤y1,…​,ym≤9 이면 관계식은 참이 되고 그 외의 경우엔 관계식이 거짓이 된다.

      • f가 PD이거나 FORMAT=PD 기술된 경우 : 0≤x1,…​,xm≤9 이고 0≤y1,…​,ym-1≤9 이고 ym∈{C,D,F} 이면 관계식은 참이 되고 그 외의 경우엔 관계식이 거짓이 된다.

      연산자가 NE인 경우 관계식의 결과는 EQ 연산자를 사용한 경우와 정반대이다.

    • constant

      10진수(n, +n, -n), 문자열(C’xx…​x’), 16진 문자열(X’yy…​y’)이 기술 가능하다. 또한 현재 날짜(DATE1), 미래 날짜(DATE1+n)도 문자열로 사용할 수 있다.

      constant에서 부호를 붙이는 경우에는 반드시 숫자의 앞에 붙여야 한다. 또한 문자열은 반드시 apostrophe(')로 감싸야 하며 문자열 안에 apostrophe(')를 포함하려면 apostrophe(')를 2개 연속으로 써야 한다.

6. INREC

SORT/MERGE/COPY를 수행하기 전에 주어진 형식에 따라 입력 레코드를 재편집(reformatting)한다.

사용법

다음은 INREC 문의 사용법이다.

INREC PARSE=(parse_item[,parse_item[,...]]) |
      FIELDS=(reformat_command[,reformat_command[,...]]) |
      BUILD=(reformat_command[,reformat_command[,...]])
      OVERLAY=(reformat_command[,reformat_command[,...]])
      FINDREP={IN=incon,OUT=outcon | IN=(incon1,incon2[,...]),OUT=outcon |
               INOUT=(incon1,outcon1[,incon2,outcon2[,...]])}
              [,STARTPOS=p |ENDPOS=q]
      IFTHEN=WHEN=INIT,{BUILD | OVERLAY | FINDREP} |
                  WHEN=GROUP,BEGIN=(logexp),END=(logexp),RECORDS=n,PUSH=(items) |
                  WHEN=(logexp),{BUILD | OVERLAY | FINDREP} |
                  WHEN=NONE,{BUILD | OVERLAY | FINDREP}

[parse_item]

parse_item=%nn= { FIXLEN=m | ABSPOS=p | ADDPOS=x | SUBPOS=y |
               STARTAFT=string | STARTAFT=BLANKS |
               STARTAT=string | STARTAT=BLANKS | STARTAT=NONBLANK |
               ENDBEFR=string | ENDBEFR=BLANKS |
               ENDAT=string | ENDAT=BLANKS |
               PAIR=APOST | PAIR=QUOTE }

[reformat_command]

reformat_command=[c:] | s | %nn | p,m | p,m,TRAN=LTOU|UTOL | p,m,TRAN=ALTSEQ |
               p,m,Y2x | p,m,f,edit | p,m,f,to | arexp,edit | p,m,CHANGE | p,m,a |
               DATEn | DATE | &DATE | DATE=(abcd) | &DATE=(abcd) | TIME | &TIME |
               p,m,f,dateop | p,m,Yxx,todate | TIME=(abc) | &TIME=(abc) | seqnum | p,m,justify | %nn,justify | p,m,squeeze | %nn,squeeze
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • PARSE

    • 가변길이 입력 레코드에서 고정 길이의 parse된 필드를 추출한다. parse된 필드는 BUILD 또는 OVERLAY에서 (p,m)이 사용되는 곳에 사용할 수 있다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      %nn

      가변 길이 입력 레코드를 고정 길이 출력 레코드로 변환한다.

      parse된 필드는 BUILD 또는 OVERLAY에서 (p,m)이 사용되는 곳에서 사용할 수 있다.

      FIXLEN=m

      parse된 필드의 길이를 지정한다. 이 속성은 모든 parse 필드에 존재해야한다.

      ABSPOS=p

      입력 레코드에서 parse 시작 포지션 p를 지정한다.

      ADDPOS=x

      입력 레코드에서 parse 시작 포지션이 x만큼 증가한다.

      SUBPOS=y

      입력 레코드에서 parse 시작 포지션이 y만큼 감소한다.

      STARTAFT

      • STARTAFT=string : 입력 레코드의 첫 번째 string 이후부터 parse된 필드의 레코드가 시작한다.

      • STARTAFT=BLANKS : 입력 레코드의 선두부터 첫 번째 space들 이후부터 parse된 필드의 레코드가 시작한다.

      STARTAT

      • STARTAT=string : 입력 레코드의 첫 번째 string을 포함하여 parse된 필드의 레코드가 시작한다.

      • STARTAT=BLANKS : 입력 레코드의 선두부터 첫 번째 space부터 parse된 필드의 레코드가 시작한다.

      • STARTAT=NONBLANK : 입력 레코드의 선두부터 space가 아닌 부분부터 parse된 필드의 레코드가 시작한다.

      ENDBEFR

      • ENDBEFR=string : 입력 레코드의 첫 번째 string 전에 parse된 필드의 레코드가 끝난다.

      • ENDBEFR=BLANKS : 입력 레코드의 선두부터 첫 번째 space 전에 parse된 필드의 레코드가 끝난다.

      ENDAT

      • ENDAT=string : 입력 레코드의 첫 번째 string을 포함하여 parse된 필드의 레코드가 끝난다.

      • ENDBEFR=BLANKS : 입력 레코드의 선두부터 첫 번째 space들을 포함하여 parse된 필드의 레코드가 끝난다.

      PAIR

      • PAIR=APOST : apostrophe(')로 묶인 영역은 BLANK나 string으로 취급하지 않는다.

      • PAIR=QUOTE : quote(")로 묶인 영역은 BLANK나 string으로 취급하지 않는다.

  • FIELDS|BUILD

    • 입력 레코드에서 선택할 키 필드를 지정한다. 키 필드의 시작위치와 길이를 결정할 수 있다. 필드가 여러 개로 지정되는 경우 뒤에 지정되는 필드는 바로 앞에 지정된 필드의 뒤에 붙어서 출력 레코드로 재편집된다. 가변길이 레코드(VB)의 경우 재편집 결과 레코드의 길이가 변경되면 레코드 기술어(RDW)의 내용도 그에 따라 변경된다.

    • FIELDS 대신에 BUILD를 동일하게 사용할 수 있다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      c:

      c: 옵션 바로 다음에 올 필드의 재편집된 입력 레코드에서의 시작 위치를 지정한다. FB의 경우는 레코드의 선두를, VB의 경우는 RDW의 선두를 각각 1로 한다.

      c:로 지정하는 위치는 이전의 선택 필드나 삽입된 공백과 겹쳐질 수 없으며, 이 옵션으로 인해 정의되지 않는 구간이 생긴다면 그 구간은 빈칸으로 채워진다.

      s

      Separation 필드로 문자열이나 공백을 기술한다.

      • nX : n개의 공백 문자를 삽입한다.

      • nC’xx…​x' : 캐릭터 문자열을 삽입한다. n은 문자열의 반복 횟수를 의미한다.

      • nX’yy…​yy' : 16진 문자열을 삽입한다. n은 문자열의 반복 횟수를 의미한다.

      DATEn

      현재 날짜를 출력한다. OpenFrame에서는 DATE1만 지원하며 C’yyyymmdd’의 형태로 표시된다.

      TIMEn

      현재 시간을 출력한다.

      n은 1~3까지 지정 가능하며 다음의 형태로 표시된다.

      • 1 : C’hhmmss'

      • 2 : C’hhmm'

      • 3 : C’hh'

      DATE=(abcd) 또는 &DATE=(abcd)

      현재 날짜를 C’adbdc' 형식으로 출력한다. d는 구분자이다.

      a,b,c∈{M,D,Y,4} 이며, 각각의 의미는 다음과 같다.

      • M : 월(01~12)을 두 자리 숫자로 출력한다.

      • D : 일(01~31)을 두 자리 숫자로 출력한다.

      • Y : 연도의 마지막 두 자리 숫자를 출력한다.

      • 4 : 연도를 네 자리 숫자로 출력한다.

      DATE 또는 &DATE

      현재 날짜를 C’mm/dd/yy’의 형태로 출력한다.

      • mm : month(01-12)

      • dd : day(01-31)

      • yy : year의 뒤 두 자리

      DATENS=(abc) 또는 &DATENS=(abc)

      현재 날짜를 C’abc' 형식으로 출력한다.

      a,b,c∈{M,D,Y,4} 이며, 각각의 의미는 다음과 같다.

      • M : 월(01~12)을 두 자리 숫자로 출력한다.

      • D : 일(01~31)을 두 자리 숫자로 출력한다.

      • Y : 연도의 마지막 두 자리 숫자를 출력한다.

      • 4 : 연도를 네 자리 숫자로 출력한다.

      TIME 또는 &TIME

      현재 시간을 C’hh:mm:ss’의 형태로 출력한다.

      • hh : hour(00-23)

      • mm : minutes(00-59)

      • ss : seconds(00-59)

      TIME=(abc) 또는 &TIME=(abc)

      시간을 24시간제로 표시할지 12시간제로 표시할지 결정한다.

      • ab : 24 또는 12로 지정할 수 있으며 각각 24시간제와 12시간제로 출력할 것을 의미한다.

      • c : 구분자로 C’hhcmmcss’의 형태로 삽입된다.

      p,m

      지정된 입력 레코드 필드를 출력 필드에 출력한다.

      • p : 제어 필드의 시작 위치를 기술한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드의 p 항목을 참고한다.

      • m : 선택 필드의 길이를 Byte 수로 지정한다.

      %nn

      %nn label의 parse된 레코드 필드를 출력 필드에 출력한다.

      p,m,TRAN=LTOU|UTOL

      • p, m : 이전 항목 설명과 동일하다.

      • TRAN=LTOU : 해당 필드의 소문자(lowercase)를 대문자(uppercase)로 바꿔서 출력한다.

      • TRAN=UTOL : 대문자를 소문자로 바꿔서 출력한다.

      p,m,TRAN=ALTSEQ

      • p, m : 이전 항목 설명과 동일하다.

      • TRAN=ALTSEQ : 해당 필드의 레코드를 ALTSEQ 변환 테이블에 따라 변경한다.

      p,m,Y2x

      • p : 이전 항목 설명과 동일하다.

      • m : 연도를 나타낼 출력 필드의 길이를 지정한다.

      • Y2x : OpenFrame에서는 Y2C만 지원하고 있으며, C’yyyy’의 형태로 출력된다.

      p,m,f,edit

      지정된 필드를 정의된 형식으로 변환해서 OUTFIL 레코드로 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참고한다.

      p,m,f,to

      입력 필드의 형식을 변경해서 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참고한다.

      arexp,edit

      arithmetic expression을 edit 형식으로 변환해서 입력 레코드를 재편집한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참고한다.

      p,m,CHANGE

      입력 필드의 지정된 문자열을 다른 문자열로 치환한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참고한다.

      p,m,a

      지정된 입력 필드를 출력 필드에 출력하되, 정렬(alignment)이 안 맞으면 필드 앞에 널 문자(0x0)들을 채워 정렬을 맞춘다.

      a는 H,F,D 중 하나로 지정한다.

      • H : halfword(2Bytes)

      • F : fullword(4Bytes)

      • D : doubleword(8Bytes)

      p,m,f,dateop

      지정된 입력 필드에 date operation을 수행한다.

      date operation은 다음과 같다.

      • ADDDAYS : 지정된 입력 필드에 지정한 값만큼 일수를 더한다.

      • ADDMONS : 지정된 입력 필드에 지정한 값만큼 월수를 더한다.

      • ADDYEARS : 지정된 입력 필드에 지정한 값만큼 연수를 더한다.

      • SUBDAYS : 지정된 입력 필드에 지정한 값만큼 일수를 뺀다.

      • SUBMONS : 지정된 입력 필드에 지정한 값만큼 월수를 뺀다.

      • SUBYEARS : 지정된 입력 필드에 지정한 값만큼 연수를 뺀다.

      p,m,Yxx,todate

      지정된 입력 필드를 todate에 명시한 옵션으로 변환한다.

      todate에 지정할 수 있는 값은 다음과 같다.

      • DT=(abcd) :

        • a, b, c : 연(마지막 2자리 : Y, 4자리 : 4), 월(M), 일(D) 중 원하는 순서로 사용 한다.

        • d : 연, 월, 일 사이의 구분자를 지정한다.

      • TOJUL=[Yaa | Yaa(s)] : 입력 필드를 Julian date 형식으로 출력한다.

        • Yaa : Julian date의 형식을 지정한다.

          • Y2T : C’yysddd' | C’yyddd'

          • Y2W : C’dddsyy' | C’dddyy'

          • Y2U : X’yydddf'

          • Y2X : X’dddyyf'

          • Y4T : C’ccyysddd' | C’ccyyddd'

          • Y4W : C’dddsccyy' | C’dddccyy'

          • Y4U : X’ccyydddf'

          • Y4X : X’dddccyyf'

        • s : 구분자를 지정한다.

      • TOGREG=[Yaa | Yaa(s)] : 입력 필드를 Gregorian date 형식으로 출력한다.

        • Yaa : Gregorian date의 형식을 지정한다.

          • Y2T : C’yysmmsdd' | C’yymmdd'

          • Y2W : C’mmsddsyy' | C’mmddyy'

          • Y2V : X'0yymmddf'

          • Y2Y : X'0mmddyyf'

          • Y4T : C’ccyysmmsdd' | C’ccyymmdd'

          • Y4W : C’mmsddsccyy' | C’mmddccyy'

          • Y4V : X'0ccyymmddf'

          • Y4Y : X'0mmddccyyf'

        • s : 구분자를 지정한다.

      seqnum

      출력 레코드의 sequence number를 출력한다. sequence number는 입력 레코드의 뒤에 추가된다.

      OpenFrame에서 지원하는 형식은 다음과 같다.

      SEQNUM,n,fs[,START=j][,INCR=i][,RESTART=(p,m)]
      • SEQNUM : sequence number를 출력하라는 명령을 명시한다.

      • n : 필수 옵션이다. sequence number를 몇 자리로 나타낼 것인지 지정한다.

      • fs : 필수 옵션이다. sequence number를 나타낼 문자열 형식을 지정한다.

      • START=j : 생략 가능한 옵션이다(생략 시 START=1로 간주된다). sequence number 시작값을 j로 지정한다.

      • INCR=i : 생략 가능한 옵션이다(생략 시 INCR=1로 간주된다). sequence number 증가값을 i로 지정한다.

      • RESTART=(p,m) : 생략 가능한 옵션이다. RESTART=(p,m)를 지정할 때 명시한 필드가 이전 레코드의 필드와 일치하지 않을 경우 SEQNUM을 j로 초기화한다.

      p,m,justify

      지정된 필드를 정의된 형식으로 변환해서 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참고한다.

      %nn,justify

      %nn label의 parse된 레코드 필드를 정의된 형식으로 변환해서 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참고한다.

      p,m,squeeze

      지정된 필드를 정의된 형식으로 변환해서 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참고한다.

      %nn,squeeze

      %nn label의 parse된 레코드 필드를 정의된 형식으로 변환해서 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참고한다.

  • OVERLAY

    • 출력 레코드에 덮어 씌울 항목을 명시한다. 덮어 씌워지지 않은 열은 그대로 출력한다.

  • FINDREP

    • 입력 레코드에서 지정된 변수를 찾아서 다른 변수로 치환한다.

    • 변수 치환에 대한 자세한 내용은 자세한 내용은 OUTFIL의 'FINDREP' 오퍼랜드를 참고한다.

  • IFTHEN

    • 주어진 조건에 따라 각기 다른 레코드들을 각각 다른 방식으로 재편집할 수 있다.

    • 조건 설정에 대한 자세한 내용은 자세한 내용은 OUTFIL의 'IFTHEN' 오퍼랜드를 참고한다.

7. JOIN

조인 작업을 수행할 때 조인 조건과 일치하는 레코드들 출력 여부 및 나머지 레코드들 출력 여부를 설정한다. JOIN 문 미지정 시 양쪽 데이터셋(SORTJNF1, SORTJNF2)에서 조인 조건과 일치하는 레코드들만 출력한다(데이터베이스 관리 시스템의 inner join과 유사한 기능이다).

사용법

다음은 JOIN 문의 사용법이다.

JOIN UNPAIRED,[F1|F2|ONLY][,[F1|F2|ONLY][,...]]
오퍼랜드

JOIN 문에서는 여섯 가지 오퍼랜드 조합을 지원한다. 허용되는 조합과 그 의미는 다음과 같다.

  • UNPAIRED,F1,F2 또는 UNPAIRED

    • 양쪽 데이터셋에서 조인 조건과 일치하는 레코드들 뿐만 아니라 왼쪽 데이터셋(SORTJNF1)의 나머지 레코드들과 오른쪽 데이터셋(SORTJNF2)의 나머지 레코드들도 출력한다(데이터베이스 관리 시스템의 full outer join과 유사한 기능이다).

  • UNPAIRED,F1

    • 양쪽 데이터셋에서 조인 조건과 일치하는 레코드들 뿐만 아니라 왼쪽 데이터셋의 나머지 레코드들도 출력한다(데이터베이스 관리 시스템의 left outer join과 유사한 기능이다).

  • UNPAIRED,F2

    • 양쪽 데이터셋에서 조인 조건과 일치하는 레코드들 뿐만 아니라 오른쪽 데이터셋의 나머지 레코드들도 출력한다(데이터베이스 관리 시스템의 right outer join과 유사한 기능이다).

  • UNPAIRED,F1,F2,ONLY 또는 UNPAIRED,ONLY

    • 양쪽 데이터셋에서 조인 조건과 일치하는 레코드들은 출력하지 않고, 왼쪽 데이터셋의 나머지 레코드들과 오른쪽 데이터셋의 나머지 레코드들만 출력한다.

  • UNPAIRED,F1,ONLY

    • 양쪽 데이터셋에서 조인 조건과 일치하는 레코드들은 출력하지 않고, 왼쪽 데이터셋의 나머지 레코드들만 출력한다.

  • UNPAIRED,F2,ONLY

    • 양쪽 데이터셋에서 조인 조건과 일치하는 레코드들은 출력하지 않고, 오른쪽 데이터셋의 나머지 레코드들만 출력한다.

다음은 양쪽 데이터셋에서 조인 조건과 일치하는 레코드들은 출력하지 않고, 왼쪽 데이터셋의 나머지 레코드들만 출력하는 예제이다.

JOINKEYS FILE=F1,FIELDS=(1,8,A)
JOINKEYS FILE=F2,FIELDS=(1,8,A)
JOIN UNPAIRED,F1,ONLY
REFORMAT FIELDS=(F1:1,80)

8. JOINKEYS

조인을 수행할 때 조인 대상 데이터셋과 조인 필드, 정렬 여부 등을 지정한다.

입력 데이터셋의 RECFM이 V type일 경우 레코드 처리 시 RDW를 고려해야 한다.

사용법

다음은 JOINKEYS 문의 사용법이다.

JOINKEYS {{FILE|FILES}={F1|F2}|F1=ddname|F2=ddname},FIELDS=(p,m,s[,p,m,s[,...]]) [,SORTED|INCLUDE=(logical_expression)|OMIT=(logical_expression)]+
오퍼랜드

다음은 JOINKEYS 문에서 지원하는 오퍼랜드에 대한 설명이다.

  • FILES

    • FILES=F1이라고 기술하면 조인할 때 SORTJNF1을 왼쪽 데이터셋으로 삼는다. FILES=F2라고 기술하면 조인할 때 SORTJNF2를 오른쪽 데이터셋으로 삼는다. (별칭: FILE)

    • 다음은 SORTJNF1과 SORTJNF2를 조인하는 예제이다.

      JOINKEYS FILE=F1,FIELDS=(1,7,A)
      JOINKEYS FILE=F2,FIELDS=(1,7,A)
  • F1

    • ddname을 왼쪽 데이터셋으로 삼는다.

    • 다음은 DD1과 SORTJNF2를 조인하는 예제이다.

      JOINKEYS F1=DD1,FIELDS=(1,7,A)
      JOINKEYS FILE=F2,FIELDS=(1,7,A)
  • F2

    • ddname을 오른쪽 데이터셋으로 삼는다.

    • 다음은 SORTJNF1과 DD2를 조인하는 예제이다.

      JOINKEYS FILE=F1,FIELDS=(1,7,A)
      JOINKEYS F2=DD2,FIELDS=(1,7,A)
  • FIELDS

    • 입력 레코드를 조인하는 기준이 되는 조인 필드를 지정한다. 필드의 시작 위치와 길이, 오름차순 또는 내림차순을 결정할 수 있다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      p

      제어 필드의 시작 위치를 기술한다. 제어 필드는 경우에 따라 시작 지점이 달라진다.

      • 입력 레코드가 NVSM 고정길이(FB)인 경우에는 입력 레코드의 첫 번째 Byte가 1이 된다.

      • 입력 레코드가 NVSM 가변길이(VB)인 경우에는 레코드의 앞에 레코드 기술어(RDW) 4Bytes가 첨가되어 있으며 RDW의 시작점이 1이 되고 실제 레코드는 5부터 시작된다.

      • 입력 레코드가 VSAM 데이터셋이고 OpenFrame SORT에서 이를 가변길이 레코드로 처리할 경우, RDW를 레코드의 앞에 추가해 주고 그 시작점을 1로 한다. 따라서 조인을 수행할 때 실제 데이터는 5부터 시작된다.

      m

      제어 필드의 길이를 기술한다.

      s

      제어 필드의 정렬 기준을 기술한다.

      • A(Ascending order) : 오름차순

      • D(Descending order) : 내림차순

    • 다음은 SORTJNF1의 첫 번째 Byte부터 7Bytes까지와 SORTJNF2의 첫 번째 Byte부터 7Bytes까지의 내용을 기준으로 조인하는 예제이다.

      JOINKEYS FILE=F1,FIELDS=(1,7,A)
      JOINKEYS FILE=F2,FIELDS=(1,7,A)
  • TYPE

    • 입력 데이터셋이 TSAM일 경우 데이터셋의 레코드 처리 방법을 지정한다.

    • F일 경우 레코드에 RDW를 포함하지 않고, V일 경우 레코드에 RDW를 포함한다. default는 F이다.

    • 다음은 SORTJNF1과 SORTJNF2를 조인하는 예제이다. SORTJNF1은 TSAM 데이터셋이며 레코드 처리 타입은 V이다.

      JOINKEYS FILE=F1,FIELDS=(5,7,A),TYPE=V
      JOINKEYS FILE=F2,FIELDS=(1,7,A)
  • SORTED

    • 입력 데이터셋이 조인 필드를 기준으로 이미 정렬돼 있다면 본 오퍼랜드를 지정해 주는 게 좋다.

    • 다음은 SORTJNF1과 SORTJNF2를 조인하는 예제이다. SORTJNF1은 레코드의 첫 번째 Byte부터 7Bytes까지를 기준으로 이미 정렬돼 있다.

      JOINKEYS FILE=F1,FIELDS=(1,7,A),SORTED
      JOINKEYS FILE=F2,FIELDS=(1,7,A)
  • INCLUDE

    • 입력 레코드들 중 지정된 조건을 만족하는 레코드들만을 가지고 조인을 수행한다. logical_expression에 대한 상세 설명은 INCLUDE 문을 참조한다.

    • 다음은 SORTJNF1과 SORTJNF2를 조인하는 예제이다. SORTJNF1의 레코드들 중 9번째 Byte가 'A’인 레코드들만 조인에 참여한다.

      JOINKEYS FILE=F1,FIELDS=(1,7,A),INCLUDE=(9,1,CH,EQ,C'A')
      JOINKEYS FILE=F2,FIELDS=(1,7,A)
  • OMIT

    • 입력 레코드들 중 지정된 조건을 만족하는 레코드들을 제외한 나머지 레코드들만을 가지고 조인을 수행한다. logical_expression에 대한 상세 설명은 OMIT 문을 참조한다.

    • 다음은 SORTJNF1과 SORTJNF2를 조인하는 예제이다. SORTJNF1의 레코드들 중 9번째 Byte가 'A’가 아닌 레코드들만 조인에 참여한다.

      JOINKEYS FILE=F1,FIELDS=(1,7,A),OMIT=(9,1,CH,EQ,C'A')
      JOINKEYS FILE=F2,FIELDS=(1,7,A)

9. MERGE

SORTINnn(nn은 임의의 두 자리 숫자이며, 첫 번째 자리가 0으로 시작해도 무방)에 기술한 여러 개의 입력 데이터셋들을 출력 데이터셋으로 병합할 때 사용한다. SORTINnn은 최대 99개까지 사용 가능하며, 입력 데이터셋 내의 레코드들이 MERGE 문의 FIELDS 옵션에 기술된 키 필드 기준으로 정렬이 되어 있어야 한다.

사용법

다음은 MERGE 문의 사용법이다.

MERGE FIELDS=(p,m,f,s[,p,m,f,s[,...]]) | (p,m,s[,p,m,s[,...]]),FORMAT=f | COPY
      [SKIPREC | STOPAFT | CKPT | EQUALS | NOEQUALS | FILES=n | FILSZ=[E|U]n |
       SIZE=[E|U]n | Y2PAST | CENTWIN]
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • FIELDS

    • 입력 레코드를 병합하기 위한 키 필드를 지정한다.

    • 키 필드의 시작위치와 길이, 형식, 병합 기준을 결정할 수 있다.

    • 다음은 설정값에 대한 설명이다.

      항목 설명

      p

      제어 필드의 시작 위치를 기술한다. 자세한 내용은 SORT의 'FIELDS' 오퍼랜드의 p 항목을 참고한다.

      m

      제어 필드의 길이를 기술한다.

      f

      제어 필드의 형식을 기술한다. 기술 가능한 형식과 형식에 따른 길이는 SORT의 경우와 동일하다.

      s

      제어 필드의 정렬 기준을 기술한다.

      • A(Ascending order) : 오름차순

      • D(Descending order) : 내림차순

    • 다음은 포맷 형식이 문자인 고정길이 레코드의 첫 번째 Byte에서 시작하여 7Bytes까지의 내용을 오름차순으로 병합한 예이다.

      MERGE FIELDS=(1,7,CH,A)

      다음은 가변길이 레코드의 경우 1부터 4까지의 RDW를 제외하고 실제 레코드의 선두인 5부터 3Bytes만큼의 문자 형식의 레코드를 내림차순으로 병합한 예이다.

      MERGE FIELDS=(5,3,CH,D)

      가변길이 레코드의 경우 RDW를 제외한 레코드의 선두는 5이다. 만약 병합 시작점을 1에서 4 사이에 지정하였을 경우 에러가 발생하지는 않으나 RDW가 포함되므로 병합이 정상적으로 수행되지 않는다.

  • FORMAT=f

    • 제어 필드의 형식이 모두 일치하는 경우에는 제어 필드 내부에서 형식을 지정하지 않고 외부에서 FORMAT=f 명령을 사용하여 한꺼번에 지정할 수 있다.

    • 다음은 FORMAT의 예제로 2개의 CH 형식의 고정길이 제어 필드를 지정한다. 레코드의 처음 1Byte에서 10Bytes만큼 오름차순으로 정렬하고, 11Bytes부터 10Bytes만큼 내림차순으로 병합한다.

      MERGE FIELDS=(1,10,A,11,10,D),FORMAT=CH

      OpenFrame에서 FORMAT=f 오퍼랜드는 반드시 제어 필드의 형식이 모두 일치해야만 지정할 수 있다. 예를 들어, 여러 개의 제어 필드 중 한 필드의 형식만 다르고 나머지는 모두 같은 경우, 형식이 다른 한 필드만 내부에서 지정하고 나머지 필드의 형식을 외부에서 FORMAT=f로 지정하면 에러가 발생한다.

  • COPY

    • COPY 명령은 입력 데이터셋 레코드의 내용을 제어 필드의 지정없이 출력 데이터셋으로 복사한다.

    • 다음은 COPY의 예제이다.

      MERGE FIELDS=COPY

      MERGE에서 COPY 입력항목을 지정하는 경우 SORTIN은 여러 개를 사용할 수 없다. SORT에서 COPY를 수행하는 것과 마찬가지로, 입력 레코드를 그대로 출력하는 것이기 때문에 병합 기능은 수행하지 않는다.

  • SKIPREC=x

    • 입력 레코드의 첫 번째 레코드에서부터 몇 개의 레코드를 정렬하지 않고 삭제(discard)할 것인지를 기술한다.

    • x는 레코드의 개수를 의미한다.

    • SKIPREC는 COPY 명령을 사용할 때에만 사용할 수 있다.

    • 다음은 SKIPREC의 예제로 입력 데이터셋의 첫 번째 레코드부터 5번째 레코드까지를 제외한 나머지 레코드들을 출력 데이터셋에 복사한다.

      MERGE FIELDS=COPY,SKIPREC=5
  • STOPAFT=x

    • 입력 레코드의 첫 번째 레코드에서부터 몇 개의 레코드를 병합할 것인지를 기술한다. 지정된 숫자 이후의 레코드들은 삭제(discard)된다.

    • x는 레코드의 개수를 의미한다.

    • STOPAFT는 COPY 명령을 사용할 때에만 사용할 수 있다.

    • 다음은 STOPAFT의 예제로 입력 데이터셋의 첫 번째 레코드부터 5번째 레코드까지를 복사해서 출력하고 나머지 레코드들은 삭제한다.

      MERGE FIELDS=COPY,STOPAFT=5
  • CKPT

    • 체크포인트를 지정하는 기능이다.

    • OpenFrame에서는 문법 오류가 발생하지 않도록 형식적으로만 지원한다.

  • EQUALS | NOEQUALS

    • 제어 필드의 내용이 모두 동일한 레코드들이 입력되었을 경우 출력 순서를 지정한다.

    • 다음은 각 항목에 대한 설명이다.

      항목 설명

      EQUALS

      입력 순서대로 출력 순서가 결정(stable sort)된다.

      NOEQUALS

      입력 순서대로 출력된다는 보장이 없음(unstable sort)을 의미한다. (기본값)

    • 다음은 EQUALS/NOEQUALS의 예제로 제어 필드의 내용대로 정렬을 수행하되 제어 필드의 내용이 동일한 레코드들의 경우 입력 순서와 동일한 순서로 출력한다.

      MERGE FIELDS=(1,7,CH,A),EQUALS
  • FILES=n

    • MERGE의 입력 파일 수를 10진수로 지정한다.

    • OpenFrame에서는 문법 오류가 나지 않도록 형식적으로만 지원한다.

  • FILSZ=[E|U]n

    • 실제로 정렬에 사용되는 레코드의 개수를 지정한다.

    • OpenFrame에서는 문법 오류가 나지 않도록 형식적으로만 지원한다.

  • SIZE=[E|U]n

    • 입력 레코드의 개수를 지정한다.

    • 자세한 내용은 OPTION의 설명을 참조한다.

  • Y2PAST | CENTWIN

    • 자세한 내용은 OPTION의 설명을 참조한다.

10. MODS

MODS 제어문을 사용한 스크립트를 통해 사용자 함수(user exit function)를 등록할 수 있다.

사용자 함수는 이전 단계에서 전달된 레코드를 편집하여 다음 단계로 전달한다. SORT 및 COPY 연산에서는 사용자 함수 E15를 등록하여 입력되는 레코드를 편집할 수 있다. 사용자 함수 E35는 OUTREC 결과 레코드를 편집할 수 있다. MERGE 연산은 E32로 처리하나 OpenFrame에서는 지원하지 않는다.

사용법

다음은 MODS 문의 사용법이다.

MODS exit=(n1,m1[,s1][,L1]),…,exit=(nn,mn[,sn][,Ln])
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • exit

    • 등록할 사용자 함수의 명칭을 지정한다.

    • OpenFrame에서는 E15와 E35만을 지원하고 있다.

      함수 설명

      E15

      SORT에서 입력 레코드를 처리하는 사용자 함수이다. 지정된 입력 데이터셋으로부터 레코드를 읽어 들여 사용자가 지정한 곳으로 전달한다.

      E35

      출력 레코드를 처리하는 사용자 함수이다. SORT 또는 MERGE 후 출력 데이터셋으로 전달되기 전의 레코드를 제어한다.

    • 다음은 설정 항목에 대한 설명이다.

      항목 설명

      n

      사용자 함수의 라이브러리 내에서의 멤버명을 지정한다.

      m

      사용자 함수가 사용하는 저장 공간의 크기를 Byte 단위로 지정하는 항목으로 OpenFrame에서는 지원하지 않는다.

      s

      사용자 함수가 위치한 라이브러리의 DD 이름을 지정한다.

      본 오퍼랜드를 생략하면 STEPLIB에서 사용자 함수를 찾되, JCL에 STEPLIB이 기술되지 않은 경우엔 OpenFrame 환경설정의 sort 서브젝트, PATH 섹션의 EXITLIB 키에 지정된 디렉터리에서 사용자 함수를 찾는다. OpenFrame 환경설정에 대한 자세한 내용은 OpenFrame Batch "환경설정 안내서"를 참고한다.

      L

      사용자 함수에 대해 linkage editor가 필요한지를 지정하는 항목으로 OpenFrame에서는 지원하지 않는다.

예제

다음은 사용자 함수의 예제로, 모든 레코드를 그대로 전달하는 기능을 한다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
EXIT(int  *record_flags,
     char *new_rec,
     char *return_rec,
     char *unused1,
     int  *unused2,
     int  *new_rec_len,
     int  *return_rec_len,
     int  *unused3,
     int  *exitarea_len,
     char *exitarea)
{
    if (*record_flags == 8)
        return 8; /* do not return */

    return 0; /* no action */
}

다음은 모든 레코드를 복사해서 삽입하는 사용자 함수 예이다. 레코드 a, b, c가 이전 단계에서 전달되면 a, a, b, b, c, c의 형태로 다음 단계에 전달된다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
INSERT(int  *record_flags,
       char *leaving_rec,
       char *return_rec,
       char *output_rec,
       int  *unused1,
       int  *leaving_rec_len,
       int  *return_rec_len,
       int  *output_rec_len,
       int  *exitarea_len,
       char *exitarea)
{
    static int inserted = 0;
    /* insert된 record는 편집하지 않음 */
    if (inserted) {
        inserted = 0;
        return 0; /* no action */
    }

    if (*record_flags == 8)
        return 8; /* do not return */

    memcpy (return_rec, leaving_rec, *leaving_rec_len);
    *return_rec_len = *leaving_rec_len;
    inserted = 1;

    return 12; /* insert record */
}

다음은 E15에 EXIT라는 멤버명의 함수를 등록하고 E35에 INSERT라는 멤버명의 함수를 등록하는 예제이다. 동적 linking될 라이브러리 파일은 SYS1.JCLLIB 디렉터리에 존재하며 이 디렉터리는 MYLIB이라는 DD 이름으로 지정되어 있다.

MYLIB DD DSN=SYS1.JCLLIB,DISP=OLD
...
MODS E15=(EXIT,3990,MYLIB),
      E35=(INSERT,3990,MYLIB)

11. OPTION

OPTION 문은 각종 옵션들을 설정한다.

사용법

다음은 OPTION 문의 사용법이다.

OPTION COPY | MSGPRT | PRINT | SIZE=[E|U]n | FILSZ=[E|U]n | CKPT |
       DYNALLOC[=([d][,n])] | OVFLO=(RC0|RC4|RC16) | SOLRF | NOSOLRF |
       SORTDD=cccc | SORTIN=ddname | SORTOUT=ddname | ZDPRINT | NZDPRINT |
       Y2PAST=(s|f) | CENTWIN=value | NULLOUT=(RC0|RC4|RC16) |
       VLSHRT | NOVLSHRT | VLTESTI=(0|1|2) |
       USE_ALTERNATIVE_TP_TYPE=(Y|N)
옵션

제어 필드의 내용을 기술한 후 다음과 같은 옵션을 사용할 수 있다.

  • COPY

    • SORTIN 데이터셋을 그대로 출력한다.

    • SORT FIELDS=COPY와 동일한 기능이다.

      OpenFrame에서 OPTION COPY는 SORT 문 또는 MERGE 문과 함께 사용할 수 없다.

    • 해당 기능을 사용할 경우 SORT 구문은 무시된다.

  • MSGPRT

    • 메시지 출력 대상을 지정한다. OpenFrame에서는 문법적 오류가 발생하지 않도록 형식적으로만 지원한다.

  • PRINT

    • MSGPRT와 동일하게 기능한다. OpenFrame에서는 문법적 오류가 발생하지 않도록 형식적으로만 지원한다.

  • SIZE=[E|U]n

    • 입력 레코드의 개수가 본 옵션에 지정된 값(n)과 다르면 에러를 발생시킨다.

    • OpenFrame 환경설정에 sort 서브젝트, OPTION 섹션의 FSZEST 키의 VALUE 항목이 YES로 지정되어 있거나 n 앞에 E나 U가 붙어 있으면 본 옵션은 무시된다. 자세한 내용은 "OpenFrame 환경설정 안내서"를 참고한다.

  • FILSZ=[E|U]n

    • 실제로 정렬에 사용되는 레코드의 개수를 지정한다.

    • OpenFrame에서는 문법적 오류가 발생하지 않도록 형식적으로만 지원한다.

  • CKPT

    • COPY를 사용할 때 체크포인트를 지정하는 기능이다.

    • OpenFrame에서는 문법 오류가 발생하지 않도록 형식적으로만 지원한다.

  • DYNALLOC [=([d][,n])]

    • 작업용 데이터셋을 동적으로 할당하는 기능이다.

    • 다음은 설정 항목에 대한 설명이다.

      항목 설명

      d

      동적 할당을 하는 장치 타입 또는 그룹명을 지정한다.

      n

      동적 할당을 하는 작업용 데이터셋의 개수를 지정한다.

    • OpenFrame에서는 문법적 오류가 발생하지 않도록 형식적으로만 지원한다.

  • OVFLO=[RC0 | RC4 | RC16]

    • sum 필드에서 overflow가 발생했을 때 동작을 설정한다.

    • 다음은 설정 항목에 대한 설명이다.

      항목 설명

      RC0

      overflow가 발생하는 경우 경고 메시지를 1회 출력하고 리턴값으로 0을 반환한다.

      RC4

      overflow가 발생하는 경우 경고 메시지를 1회 출력하고 리턴값으로 4를 반환한다.

      RC16

      overfolw가 발생하는 경우 에러를 출력하고 리턴값으로 16을 반환한다.

  • SOLRF| NOSOLRF

    • SORTOUT 레코드 길이가 명시되지 않았을 때 어떤 길이를 따를지 결정한다.

    • 다음은 각 항목에 대한 설명이다.

      항목 설명

      SOLRF

      재편집된 레코드 길이를 따르도록 한다. 레코드 길이 지정의 우선순위는 데이터셋 정의 를 참조한다.

      NOSOLRF

      재편집된 레코드 길이를 따르지 않는다.

      레코드 길이 지정의 우선순위는 다음과 같다.

      1. RECORD 문의 L3에 지정된 값

      2. RECORD 문의 L2에 E15를 통해 지정된 값

      3. SORTIN에 지정된 최대 길이

      4. RECORD 문의 L1에 지정된 값

  • SORTDD=cccc

    • SORTIN, SORTnn, SORTOUT, SORTWKnn 등의 데이터셋 DD 이름 앞 4자리 문자 'SORT’를 대체하는 4자리 문자열을 설정한다.

  • SORTIN=ddname

    • SORTIN 데이터셋으로 사용할 DD 이름을 8자리 이하의 문자열로 설정한다.

  • SORTOUT=ddname

    • SORTOUT 데이터셋으로 사용할 DD 이름을 8자리 이하의 문자열로 설정한다.

  • ZDPRINT | NZDPRINT

    • ZD 형식 필드의 EBCDIC 표현과 관련된 옵션이다. OpenFrame에서는 ZD 형식 필드를 ASCII 형식으로 출력하므로 본 옵션이 필요 없다.

    • OpenFrame에서는 문법 오류가 발생하지 않도록 형식적으로만 지원한다.

  • Y2PAST=[s | f]

    • 일시적으로 sliding(s) 또는 fixed(f) century window로 Y2PAST 옵션을 덮어 쓴다.

      century window는 Y2 형식과 함께 2자리 연도 데이터값을 4자리 연도 데이터 값으로 올바르게 해석하기 위해 사용된다.

    • 다음은 설정 항목에 대한 설명이다.

      항목 설명

      s

      현재 연도에서 s값을 뺀 연도가 sliding century window의 시작값이 된다.

      예를 들어 Y2PAST=11이고 현재 연도가 2011일 때 century window는 2000-2099이 된다.

      f

      fixed century window의 시작값을 지정한다.

      예를 들어 Y2PAST=2011이라고 하면 century window는 2011-2110이 된다.

  • CENTWIN=value

    • Y2PAST=value와 동일하게 기능한다.

  • NULLOUT=[RC0 | RC4 | RC16]

    • SORTOUT 데이터셋에 write하는 record 건수가 0건일 때 동작을 설정한다.

    • 다음은 설정 항목에 대한 설명이다.

      항목 설명

      RC0

      SORTOUT 데이터셋에 write하는 record 건수가 0건일 때 리턴값으로 0을 반환한다.

      RC4

      SORTOUT 데이터셋에 write하는 record 건수가 0건일 때 리턴값으로 4를 반환한다.

      RC16

      SORTOUT 데이터셋에 write하는 record 건수가 0건일 때 리턴값으로 16을 반환한다.

  • VLSHRT|NOVLSHRT

    • SORT, MERGE, INCLUDE, OMIT, SUM 연산에서 지정된 필드가 입력 레코드에 없거나 일부만 존재하는 경우의 동작을 정의한다.

    • 다음은 각 항목에 대한 설명이다.

      항목 설명

      VLSHRT

      SORT나 MERGE 연산의 경우 지정된 필드가 입력 레코드에 없거나 일부만 존재하면 널 캐릭터로 채워(padding) 연산한다.

      • INCLUDE나 OMIT 연산의 경우 : 지정된 필드가 입력 레코드에 없거나 일부만 존재하면 관계식을 '거짓’으로 판단한다.

      • SUM 연산의 경우 : 지정된 필드가 입력 레코드에 없거나 일부만 존재하면 해당 레코드를 제외하고 연산한다.

      NOVLSHRT

      지정된 필드가 입력 레코드에 없거나 일부만 존재하면 에러를 발생시킨다.

  • VLTESTI=(0|1|2)

    • INCLUDE나 OMIT 연산에서, 지정된 필드가 입력 레코드에 없거나 일부만 존재하는 경우의 동작을 정의한다.

    • 다음은 설정 항목에 대한 설명이다.

      항목 설명

      0

      INCLUDE나 OMIT 연산에서 지정된 모든 필드들의 전체 범위가 입력 레코드에 존재해야 한다. 그렇지 않으면 에러를 발생시킨다. VLTESTI 옵션이 지정되지 않은 경우엔 마치 VLTESTI=0으로 지정된 것처럼 동작한다.

      1

      INCLUDE 연산의 경우 지정된 필드가 입력 레코드에 없거나 일부만 존재하면 해당 레코드를 출력하지 않는다. OMIT 연산의 경우 지정된 필드가 입력 레코드에 없거나 일부만 존재하면 해당 레코드를 출력한다.

      2

      INCLUDE나 OMIT 연산에서 지정된 필드가 입력 레코드에 없거나 일부만 존재하면 관계식을 '거짓’으로 판단한다.

12. OUTFIL

SORTOUT을 여러 개의 OUTFIL DD에 기술한 데이터셋에 저장한다. 레코드를 필터링하고 재편집하기 위해 사용할 수 있다. 각 출력 데이터셋에 같은 레코드를 출력할 수 있으며 각 출력 레코드에 대해 다른 편집을 하여 각자 다른 레코드를 출력할 수도 있다. (별칭: OUTFILE)

사용법

다음은 OUTFIL 문의 사용법이다.

OUTFIL param[,param[,...]]
param = <FNAMES=ddname[,ddname[,...]> |
      <FILES=suffix[,suffix[,...]> | STARTREC | ENDREC | INCLUDE | OMIT |
      SAVE | OUTREC | PARSE | BUILD | OVERLAY | FINDREP | IFTHEN | SPLIT |
      SPLITBY | SPLIT1R | VTOF | CONVERT | VLFILL=c | FTOV | VLTRIM=c |
      NULLOFL | LINES | HEADER | TRAILER | SECTIONS | NODETAIL | REMOVECC |
      IFTRAIL
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • FNAMES=ddname|(ddname,ddname,…​)

    • OUTFIL의 결과가 저장될 DD명의 식별자를 지정한다.

    • 다른 OUTFIL 문의 식별자와 중복해서 쓸 수 없으며, 오퍼랜드가 생략된 경우 출력 데이터셋의 ddname은 SORTOUT으로 지정된다.

    • 여러 개의 데이터셋에 동일한 처리를 하여 같은 레코드를 출력하는 경우, 예를 들어 SORTOF01, SORTOF02, SORTOF03에 같은 내용을 출력하는 경우에는 다음과 같이 한꺼번에 기술할 수 있다.

      FNAMES=(SORTOF01,SORTOF02,SORTOF03)
  • FILES=suffix

    • OUTFIL의 결과가 저장될 DD명의 식별자를 지정한다.

    • 여러 개의 레코드를 출력하는 경우 prefix로 ‘SORTOF’가 디폴트로 지정이 되며 FILES 오퍼랜드를 사용하여 1 문자 또는 2 문자의 식별자를 첨부한다. 다른 OUTFIL 문의 식별자와 중복해서 쓸 수 없으며, 오퍼랜드가 생략된 경우 출력 데이터셋의 ddname은 SORTOUT으로 지정된다.

    • 여러 개의 데이터셋에 동일한 처리를 하여 같은 레코드를 출력하는 경우, 예를 들어 SORTOF01, SORTOF02, SORTOF03에 같은 내용을 출력하는 경우에는 다음과 같이 한꺼번에 기술할 수 있다.

      FILES=(01,02,03)
  • STARTREC=n

    • 입력 레코드에서 OUTFIL 동작이 시작되는 지점을 설정한다.

  • ENDREC=n

    • 입력 레코드에서 OUTFIL 동작이 끝나는 지점을 설정한다.

  • INCLUDE | OMIT

    • OUTFIL 처리 중 조건을 만족하는 레코드만을 출력하거나(INCLUDE), 조건을 만족하는 레코드만을 제외하는(OMIT) 것을 지정한다.

    • INCLUDE/OMIT 제어문에서는 "INCLUDE/OMIT COND=" 형식으로 지정하지만 OUTFIL에서는 "INCLUDE/OMIT=" 형식으로 조건을 지정하는 차이가 있다.

    • FORMAT=f 오퍼랜드로 형식을 지정할 수 없는 것을 제외하고는 INCLUDE/OMIT 제어문의 사용법과 동일하다.

  • SAVE

    • INCLUDE, OMIT을 수행한 후 위 필터에 해당되지 않는 레코드들을 출력한다.

  • PARSE

    • 가변길이 입력 레코드에서 고정 길이의 parse된 필드를 추출한다. parse된 필드는 BUILD 또는 OVERLAY에서 (p,m)이 사용되는 곳에 사용할 수 있다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      %nn

      가변 길이 입력 레코드를 고정 길이 출력 레코드로 변환한다.

      parse된 필드는 BUILD 또는 OVERLAY에서 (p,m)이 사용되는 곳에서 사용할 수 있다.

      FIXLEN=m

      parse된 필드의 길이를 지정한다. 이 속성은 모든 parse 필드에 존재해야한다.

      ABSPOS=p

      입력 레코드에서 parse 시작 포지션 p를 지정한다.

      ADDPOS=x

      입력 레코드에서 parse 시작 포지션이 x만큼 증가한다.

      SUBPOS=y

      입력 레코드에서 parse 시작 포지션이 y만큼 감소한다.

      STARTAFT

      • STARTAFT=string : 입력 레코드의 첫 번째 string 이후부터 parse된 필드의 레코드가 시작한다.

      • STARTAFT=BLANKS : 입력 레코드의 선두부터 첫 번째 space들 이후부터 parse된 필드의 레코드가 시작한다.

      STARTAT

      • STARTAT=string : 입력 레코드의 첫 번째 string을 포함하여 parse된 필드의 레코드가 시작한다.

      • STARTAT=BLANKS : 입력 레코드의 선두부터 첫 번째 space부터 parse된 필드의 레코드가 시작한다.

      • STARTAT=NONBLANK : 입력 레코드의 선두부터 space가 아닌 부분부터 parse된 필드의 레코드가 시작한다.

      ENDBEFR

      • ENDBEFR=string : 입력 레코드의 첫 번째 string 전에 parse된 필드의 레코드가 끝난다.

      • ENDBEFR=BLANKS : 입력 레코드의 선두부터 첫 번째 space 전에 parse된 필드의 레코드가 끝난다.

      ENDAT

      • ENDAT=string : 입력 레코드의 첫 번째 string을 포함하여 parse된 필드의 레코드가 끝난다.

      • ENDBEFR=BLANKS : 입력 레코드의 선두부터 첫 번째 space들을 포함하여 parse된 필드의 레코드가 끝난다.

      PAIR

      • PAIR=APOST : apostrophe(')로 묶인 영역은 BLANK나 string으로 취급하지 않는다.

      • PAIR=QUOTE : quote(")로 묶인 영역은 BLANK나 string으로 취급하지 않는다.

  • OUTREC | BUILD

    • OUTFIL 처리 중 레코드 필터(INCLUDE/OMIT)를 통과한 레코드를 OUTFIL DD에 기록하기 전에 지정한 조건에 맞게 레코드의 재편집(reformatting)을 처리한다. 사용법은 "OUTREC COND="로 지정하지 않고 "OUTREC="로 지정하는 것을 제외하면 OUTREC 제어문의 사용법과 동일하다.

    • OUTREC 대신에 BUILD를 동일하게 사용할 수 있다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      c:

      출력 레코드의 시작 위치를 지정한다.

      s

      Separation 필드로 문자열이나 공백을 기술한다.

      • nX : n개의 공백 문자를 삽입한다.

      • nC’xx…​x' : 캐릭터 문자열을 삽입한다. n은 문자열의 반복 횟수를 의미한다.

      • nX’yy…​yy' : 16진 문자열을 삽입한다. n은 문자열의 반복 횟수를 의미한다.

      DATEn

      현재 날짜를 출력한다.

      OpenFrame에서는 DATE1만 지원하며 C’yyyymmdd’의 형태로 표시된다.

      DATEn+r

      미래 시점의 날짜를 출력한다.

      OpenFrame에서는 DATE1+r만 지원하며 현재 날짜에서 r일만큼 더한 날짜를 출력한다.

      TIMEn

      현재 시간을 출력한다.

      n은 1~3까지 지정 가능하며 다음의 형태로 표시된다.

      • 1 : C’hhmmss'

      • 2 : C’hhmm'

      • 3 : C’hh'

      DATE=(abcd) 또는

      &DATE=(abcd)

      현재 날짜를 C’adbdc' 형식으로 출력한다. d는 구분자이다.

      a,b,c∈{M,D,Y,4} 이며, 각각의 의미는 다음과 같다.

      • M : 월(01~12)을 두 글자로 출력한다.

      • D : 일(01~31)을 두 글자로 출력한다.

      • Y : 년도의 마지막 두 자리를 출력한다.

      • 4 : 년도를 네 글자로 출력한다.

      DATE 또는 &DATE

      현재 날짜를 C’mm/dd/yy’의 형태로 출력한다.

      • mm : month(01-12)

      • dd : day(01-31)

      • yy : year의 뒤 두 자리

      DATENS=(abc) 또는

      &DATENS=(abc)

      현재 날짜를 C’abc' 형식으로 출력한다.

      a,b,c∈{M,D,Y,4} 이며, 각각의 의미는 다음과 같다.

      • M : 월(01~12)을 두 글자로 출력한다.

      • D : 일(01~31)을 두 글자로 출력한다.

      • Y : 년도의 마지막 두 자리를 출력한다.

      • 4 : 년도를 네 글자로 출력한다.

      /…​/ or n/

      '/'의 개수 또는 n개만큼 new line을 삽입한다.

      현재 OpenFrame에서는 /…​/의 경우 5개까지만 지원하고 있으며, n/의 경우에는 제한이 없다.

      p

      지정된 입력 레코드 필드를 출력 필드에 출력한다. 키 필드의 시작 위치를 기술한다.

      입력 레코드는 경우에 따라 시작 지점이 달라진다.

      • 입력 레코드가 NVSM 고정길이(FB)인 경우에는 입력 레코드의 첫 번째 바이트가 1이 된다.

      • 입력 레코드가 NVSM 가변길이(VB)인 경우에는 레코드의 앞에 레코드 기술어(RDW) 4Bytes가 첨가되어 있으며 RDW의 시작점이 1이 되고 실제 레코드는 5부터 시작된다.

      • 입력 레코드가 VSAM 데이터셋이고 OpenFrame SORT에서 이를 가변길이 레코드로 처리할 경우, RDW를 레코드의 앞에 추가해 주고 그 시작점을 1로 한다. 따라서 SORT를 수행할 때 실제 데이터는 5부터 시작된다.

      또한 OpenFrame SORT를 수행할 때 VSAM 데이터셋을 고정길이 레코드로 판단할지 가변길이 레코드로 판단할지를 걸정해야 한다. 다음의 3가지 경우 중 하나를 만족하면 해당 데이터셋은 가변길이 레코드로 판단한다.

      1. RECORD TYPE=V로 지정되어 있는 경우

      2. SORTOUT이 RECFM=VB로 지정된 경우

      3. SORTIN과 SORTOUT이 모두 VSAM인 경우

      VB 레코드의 경우 첫 번째 키 필드를 기술할 때 항상 p를 1로 지정해야 하며 첫 번째 키 필드는 반드시 RDW를 포함해야 한다. 첫 번째 필드를 1에서 4까지 지정한 후 다음 필드를 지정하거나 첫 번째 필드가 1부터 시작하여 4 이상의 열까지 지정되어야 한다. 단, 후자의 경우 실제 레코드는 5부터 시작한다는 점을 염두해야 한다.

      m

      지정된 입력 레코드 필드를 출력 필드에 출력한다. 선택 필드의 길이를 Byte 수로 지정한다.

      %nn

      %nn label의 parse된 레코드 필드를 출력 필드에 출력한다.

      p,m,TRAN=LTOU|UTOL

      • p, m : 이전 항목 설명과 동일하다.

      • TRAN=LTOU : 해당 필드의 소문자(lowercase)를 대문자(uppercase)로 바꿔서 출력한다.

      • TRAN=UTOL : 해당 필드의 대문자를 소문자로 바꿔서 출력한다.

      p,m,TRAN=ALTSEQ

      • p, m : 이전 항목 설명과 동일하다.

      • TRAN=ALTSEQ : 해당 필드의 레코드를 ALTSEQ 변환 테이블에 따라 변경한다.

      p,m,Y2x

      • p : 이전 항목 설명과 동일하다.

      • m : 연도를 나타낼 출력 필드의 길이를 지정한다.

      • Y2x : OpenFrame에서는 Y2C만 지원하고 있으며, C’yyyy’의 형태로 출력된다.

      p,m,DTx

      • p : 이전 항목 설명과 동일하다.

      • m : 지정된 입력 레코드 필드를 출력 필드에 출력한다. 선택 필드의 길이를 Byte 수로 지정한다. 입력 레코드 필드는 X'0cyydddF' 형식이다. (c는 20세기인 경우엔 0이고 21세기인 경우엔 1이다. yy는 두 자릿수 년도, ddd는 1년 중 몇 번째 날인지를 의미한다.)

      • DT1 : 입력 레코드 필드를 C’yyyymmdd' 형식으로 출력한다. 여기서 yyyy는 네 자릿수 년도, mm은 월, dd는 일이다.

      • DT2 : 입력 레코드 필드를 C’yyyymm' 형식으로 출력한다. 여기서 yyyy는 네 자릿수 년도, mm은 월이다.

      • DT3 : 입력 레코드 필드를 C’yyyyddd' 형식으로 출력한다. 여기서 yyyy는 네 자릿수 년도, ddd는 1년 중 몇 번째 날인지를 의미한다.

      p,m,TMx

      • p : 이전 항목 설명과 동일하다.

      • m : 지정된 입력 레코드 필드를 출력 필드에 출력한다. 선택 필드의 길이를 Byte 수로 지정한다. 입력 레코드 필드는 X’nnnnnnnF' 형식이다. (nnnnnnn은 자정으로부터 경과한 시간을 100분의 1초 단위로 나타낸 값이다.)

      • TM1 : 입력 레코드 필드를 C’hhmmss' 형식으로 출력한다. 여기서 hh는 시, mm은 분, ss는 초이다.

      • TM2 : 입력 레코드 필드를 C’hhmm' 형식으로 출력한다. 여기서 hh는 시, mm은 분이다.

      • TM3 : 입력 레코드 필드를 C’hh' 형식으로 출력한다. 여기서 hh는 시이다.

      • TM4 : 입력 레코드 필드를 C’hhmmssxx' 형식으로 출력한다. 여기서 hh는 시, mm은 분, ss는 초, xx는 100분의 1초이다.

      p,m,f,edit

      지정된 필드를 정의된 형식으로 변환해서 OUTFIL 레코드로 출력한다.

      • p, m : 이전 항목 설명과 동일하다.

      • f : 필드의 포맷을 기술한다.

      • edit : 필드가 변환될 형식을 정의한다. EDIT 명령어에 대한 자세한 내용은 EDIT 명령어의 설명을 참고한다.

      p,m,f,to

      입력 필드의 형식을 변경해서 출력한다.

      • p,m,f : 이전 항목 설명과 동일하다.

      • to : 입력 필드의 형식 f가 변환될 출력 레코드의 형식을 지정한다.

        입력 필드의 형식 f가 ZDF인 경우 f가 ZD인 경우와 동일하게 동작한다.

        to 명령어 구문은 다음과 같다.

        of|TO=[of|(of)][,LENGTH=[n|(n)]]
        • TO=[of|(of)] : 변환될 형식을 정의한다. 'TO='를 생략한 채로 사용할 수도 있다.

        • LENGTH=[n|(n)] : 변환될 출력 필드의 길이를 정의한다.

      arexp,edit

      arithmetic expression을 edit 형식으로 변환해서 OUTFIL 레코드로 출력한다.

      arithmetic expression을 의미하며, 형식은 다음과 같다.

      p,m,f,operator,n[,operator,n,...]
      • p, m, f : 이전 항목 설명과 동일다.

      • n : 10진수로 양수와 음수 모두 사용 가능하다.

      p에서 m만큼 f 형식의 수를 operator를 사용해 n과 연산한다.

       

      다음은 operator의 종류이다.

      • MIN(minimum)

      • MAX(maximum)

      • MUL(multiplication)

      • DIV(division)

      • MOD(modulus)

      • ADD(addition)

      • SUB(sbutraction)

       

      operator 간의 우선순위는 다음과 같다.

      1. MIN, MAX

      2. MUL, DIV, MOD

      3. ADD, SUB

      p,m,CHANGE

      입력 필드의 지정된 문자열을 다른 문자열로 치환하여 출력한다.

      • p : 이전 항목 설명과 동일하다.

      • m : find에 명시된 문자열과 비교할 입력 필드의 길이를 지정한다.

      • CHANGE : 비교할 문자열을 검색하여 같은 것이 있으면 치환한다.

        CHANGE의 문법은 다음과 같다.

        CHANGE=(v,find,set[,find,set,...]),NOMATCH=(set)
        • v : 출력할 필드의 길이를 지정한다.

        • find : 입력 필드에서 찾을 문자열을 지정한다.

        • set : 출력 필드에 출력할 문자열을 지정한다.

        • NOMATCH : find에 해당하는 문자열이 없을 경우 NOMATCH 옵션을 지정한다. set은 find와 일치하는 문자열이 없을 때 출력할 문자열을 지정한다.

      seqnum

      출력 레코드의 sequence number를 출력한다. sequence number는 출력 레코드의 뒤에 추가된다.

      OpenFrame에서 지원하는 형식은 다음과 같다.

      SEQNUM,n,fs[,START=j][,INCR=i][,RESTART=(p,m)]
      • SEQNUM : sequence number를 출력하라는 명령을 명시한다.

      • n : 필수 옵션이다. sequence number를 몇자리로 나타낼 것인지 지정한다.

      • fs : 필수 옵션이다. sequence number를 나타낼 문자열 형식을 지정한다.

      • START=j : 생략 가능한 옵션이다(생략 시 START=1로 간주된다). sequence number 시작값을 j로 지정한다.

      • INCR=i : 생략 가능한 옵션이다(생략 시 INCR=1로 간주된다). sequence number 증가값을 i로 지정한다.

      • RESTART=(p,m) : 생략 가능한 옵션이다. RESTART=(p,m)를 지정할 때 명시한 필드가 이전 레코드의 필드와 일치하지 않을 경우 SEQNUM을 j로 초기화한다.

      p,m,justify

      지정된 필드를 정의된 형식으로 변환해서 OUTFIL 레코드로 출력한다.

      OpenFrame에서 지원하는 형식은 다음과 같다.

      JFY=(SHIFT=(LEFT|RIGHT),[LENGTH=n],[PREBLANK=list],
      [LEAD=string],[TRAIL=string])
      • SHIFT : 왼쪽 blank를 제거 후 왼쪽 정렬 또는 오른쪽 blank를 제거 후 오른쪽 정렬을 할 것인지 명시한다.

      • LENGTH=n : JFY의 output 필드의 length를 지정한다. 지정하지 않을 경우 input 필드의 length와 같다.

      • PREBLANK=list : 1개 이상의 string list를 blank로 변경한다.

      • LEAD=string : 첫 번째 non-blank 필드 앞에 string을 명시한다.

      • TRAIL=string : 마지막 non-blank 필드 뒤에 string을 명시한다.

      %nn,justify

      %nn label의 parse된 레코드 필드를 정의된 형식으로 변환해서 출력한다.

      p,m,squeeze

      지정된 필드를 정의된 형식으로 변환해서 OUTFIL 레코드로 출력한다.

      OpenFrame에서 지원하는 형식은 다음과 같다.

      SQZ=(SHIFT=(LEFT|RIGHT),[LENGTH=n],[PREBLANK=list],
      [LEAD=string],[MID=string],[TRAIL=string],[PAIR=(APOST|QUOTE)])
      • SHIFT : 모든 blank를 제거 후 왼쪽 정렬 또는 오른쪽 정렬을 할 것인지 명시한다.

      • LENGTH=n : SQZ의 output 필드의 length를 지정한다. 지정하지 않을 시 input 필드의 length와 같다.

      • PREBLANK=list : 1개 이상의 string list를 blank로 변경한다.

      • LEAD=string : 첫 번째 non-blank 필드 앞에 string을 명시한다.

      • MID=string : 첫 번째와 마지막 non-blank 필드 사이에 blank가 제거되는 부분에 string을 명시한다.

      • TRAIL=string : 마지막 non-blank 필드 뒤에 string을 명시한다.

      • PAIR=(APOST|QUOTE) : 작은따옴표(' ') 또는 큰따옴표(" ") 사이의 레코드 값은 blank를 제거하거나 PREBLANK로 blank 변환을 할 수 없다.

      %nn,squeeze

      %nn label의 parse된 레코드 필드를 정의된 형식으로 변환해서 출력한다.

  • OVERLAY

    • 출력 레코드에 덮어 씌울 항목을 명시한다. 덮어 씌워지지 않은 열은 그대로 출력한다.

      OUTREC/BUILD에서 사용하는 파라미터들을 동일하게 사용할 수 있으나 '/' 문법은 OVERLAY에서 사용할 수 없다.

  • FINDREP

    • 입력 레코드에서 지정된 변수를 찾아서 다른 변수로 치환한다.

    • 입력 레코드에서 incon에 해당하는 문자열을 찾아 outcon에 지정된 문자열로 치환한다.

      IN=incon,OUT=outcon
    • 입력 레코드에서 여러 개의 문자열을 지정하여 outcon으로 치환할 수 있다.

      IN=(incon1,incon2[,...]),OUT=outcon
    • 입력 레코드에서 inconi에 해당하는 문자열을 찾아 outconi에 지정된 문자열로 치환한다. (i ≥ 1)

      INOUT=(incon1,outcon1[,incon2,outcon2[,...]])
    • 입력 레코드에서 검색을 시작할 지점을 지정할 수 있다. STARTPOS를 명시하지 않은 경우에는 1로 지정된다.

      STARTPOS=p
    • 입력 레코드에서 검색을 끝낼 지점을 지정할 수 있다. ENDPOS를 명시하지 않은 경우에는 레코드의 마지막 열까지 검색한다.

      ENDPOS=q
  • IFTHEN

    • 주어진 조건에 따라 각기 다른 레코드들을 각각 다른 방식으로 재편집할 수 있다.

    • BUILD, OVERLAY, FINDREP 재편집 기능을 적용하기 전에 1번 이상 사용할 수 있다. WHEN=GROUP 항목은 IFTHEN=INIT 이외의 다른 항목들보다 먼저 수행된다.

      WHEN=GROUP,BEGIN=(logexp),END=(logexp),RECORDS=n,PUSH=(items)
      항목 설명

      BEGIN=(logexp)

      logexp 조건이 성립하면 새 GROUP이 시작된다.

      END=(logexp)

      logexp 조건이 성립하면 현재 GROUP이 끝난다.

      RECORDS=n

      GROUP에 속하는 record의 개수가 n개가 되면 GROUP이 끝난다.

      PUSH=(items)

      • c:p,m : GROUP의 선두 레코드에서 p,m에 해당하는 값을 c position에 OVERLAY한다.

      • c:ID=n : 길이가 n인 GROUP ID를 나타낸다. 현재 GROUP의 ID를 c position에 OVERLAY한다.

      • c:SEQ=n : 길이가 n인 GROUP 내 record sequence를 나타낸다. 현재 GROUP 내의 record sequence를 c position에 OVERLAY한다.

    • BUILD, OVERLAY, FINDREP 재편집 기능을 적용하기 위해 1번 이상 사용할 수 있다. WHEN=INIT 항목은 IFTHEN=GROUP 이외의 다른 항목들보다 먼저 수행된다.

      WHEN=INIT,BUILD/OVERLAY/FINDREP
    • 입력 레코드가 logexp에 명시된 logical expression을 만족하는 경우 BUILD, OVERLAY, FINDREP 재편집 기능을 적용하기 위해 1번 이상 사용할 수 있다.

      WHEN=(logexp),BUILD/OVERLAY/FINDREP
    • 입력 레코드가 logexp에 명시된 logical expression을 모두 만족하지 않는 경우 OVERLAY, FINDREP 재편집 기능을 적용하기 위해 1번 사용할 수 있다.

      WHEN=NONE,BUILD/OVERLAY/FINDREP
  • SPLIT | SPLITBY | SPLIT1R

    • 재편집된 레코드를 여러 개의 OUTFIL 데이터셋에 순차적으로 출력한다.

      항목 설명

      SPLIT

      여러 개의 출력 데이터셋에 레코드를 순차적으로 하나씩 돌아가며 출력한다.

      SPLITBY=n

      여러 개의 출력 데이터셋에 레코드를 순차적으로 n개씩 돌아가며 출력한다.

      SPLIT 기능은 SPLITBY=1과 같다.

      SPLIT1R=n

      여러 개의 출력 데이터셋에 레코드를 순차적으로 n개씩 출력하다가 마지막 데이터셋에 이르면 남은 레코드를 모두 출력한다.

  • VTOF | CONVERT

    • 가변 길이 레코드를 고정 길이 레코드로 변환한다.

  • VLFILL=c

    • 필드가 입력 레코드에 없거나 일부만 존재하는 경우, 우측을 문자 c로 채운다.

  • FTOV

    • 고정 길이 레코드를 가변 길이 레코드로 변환한다.

  • VLTRIM=c

    • 결과 레코드의 맨 우측에 한 개 혹은 그 이상의 문자 c가 존재하면 이를 제거한다.

  • NULLOFL= [ RC0 | RC4 | RC16 ]

    • 연산 결과의 레코드 건 수가 0건인 경우의 동작을 지정한다.

      항목 설명

      RC0

      반환값을 0으로 설정하고 이후의 연산을 계속한다.

      RC4

      반환값을 4로 설정하고 이후의 연산을 계속한다.

      RC16

      연산을 중단하고 16을 반환한다.

  • LINES=n

    • 리포트 페이지의 라인 수를 설정한다. (기본값: 60)

  • HEADER1

    • 리포트의 헤더를 작성한다. HEADER1은 리포트의 첫 번째 페이지에만 출력된다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      c:

      관련된 리포트 내용이 출력될 첫 번째 위치를 지정한다.

      r

      공백 또는 문자열을 출력 리포트 내부에 삽입할 수 있다.

      • nX : n개의 공백 문자를 삽입한다.

      • n’xx…​x' : 문자열을 n개 삽입한다.

      • nX’yy…​yy' : 16진 문자열을 n개 삽입한다.

      • /…​/ or n/ : '/'의 개수 또는 n개만큼 뉴라인을 삽입한다. 현재 OpenFrame에서는 /…​/의 경우 5개까지만 지원하고 있으며, n/의 경우에는 제한이 없다.

      p,m

      OUTFIL의 입력 레코드 필드를 리포트에 출력한다.

      • p : 입력 레코드의 첫 번째 바이트로부터 상대적인 위치이다.

      • m : 입력 필드의 길이를 의미한다.

      DATE 또는 &DATE

      현재 날짜를 C’mm/dd/yy’의 형태로 출력한다.

      • mm : month(01-12)

      • dd : day(01-31)

      • yy : year의 뒤 두 자리

      DATE=(abcd) 또는

      &DATE=(abcd)

      • abc : a, b, c에 M, D, Y를 사용할 수 있으며 각각 month, day, year를 의미한다. M, D, Y의 순서에 따라 어떤 것이 먼저 출력될지를 결정한다. Y의 경우 4로 대체할 수 있다 . 이때 연도는 4자리로 나타낸다.

      • d : 구분자로, 예를 들어 DATE=(MDY-)로 사용하는 경우 C’mm-dd-yy’의 형태로 출력된다.

      TIME 또는 &TIME

      현재 시간을 C’hh:mm:ss’의 형태로 출력한다.

      • hh : hour(00-23)

      • mm : minutes(00-59)

      • ss : seconds(00-59)

      TIME=(abc) 또는

      &TIME=(abc)

      시간을 24시간제로 표시할지 12시간제로 표시할지 결정한다.

      • ab : 24 또는 12로 지정할 수 있으며 각각 24시간제와 12시간제로 출력할 것을 의미한다.

      • c : 구분자로 C’hhcmmcss’의 형태로 삽입된다.

      PAGE 또는 &PAGE

      리포트의 페이지 번호를 헤더에 8자리로 1번만 출력한다.

  • TRAILER1

    • 리포트의 트레일러를 작성한다. TRAILER1은 리포트의 마지막 페이지에만 출력된다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      c:

      'HEADER1' 오퍼랜드 설명을 참조한다.

      r

      'HEADER1' 오퍼랜드 설명을 참조한다.

      p,m

      'HEADER1' 오퍼랜드 설명을 참조한다.

      DATE

      'HEADER1' 오퍼랜드 설명을 참조한다.

      & DATE

      'HEADER1' 오퍼랜드 설명을 참조한다.

      TIME

      'HEADER1' 오퍼랜드 설명을 참조한다.

      &TIME

      'HEADER1' 오퍼랜드 설명을 참조한다.

      PAGE 또는 &PAGE

      현재 페이지 번호를 트레일러에 1번만 출력한다.

      COUNT

      출력 레코드의 개수를 8자리로 표시한다.

      COUNT15

      출력 레코드의 개수를 15자리로 표시한다.

      SUBCOUNT

      입력 레코드의 현재까지의 누적 카운트를 출력한다.

      TRAILER1에서는 COUNT와 동일하게 동작한다.

      SUBCOUNT15

      입력 레코드의 현재까지의 누적 카운트를 출력한다.

      TRAILER1에서는 COUNT15와 동일하게 동작한다.

      TOTAL=(p,m,f)

      지정된 숫자 입력 필드의 총합을 출력한다. TOT로도 사용이 가능하다.

      p,m,f는 이전 항목 설명과 동일하다.

      MIN=(p,m,f)

      지정된 숫자 입력 필드에서 가장 작은 값을 출력한다.

      p,m,f는 이전 항목 설명과 동일하다.

      MAX=(p,m,f)

      지정된 숫자 입력 필드에서 가장 큰 값을 출력한다.

      p,m,f는 이전 항목 설명과 동일하다.

      AVG=(p,m,f)

      지정된 숫자 입력 필드의 평균값을 출력한다.

      p,m,f는 이전 항목 설명과 동일하다.

      SUBTOTAL=(p,m,f)

      현재까지의 누적 총합을 출력한다. TRAILER1에서는 TOTAL과 동일한 결과를 출력한다. SUBTOT 또는 SUB로도 사용할 수 있다.

      SUBMIN=(p,m,f)

      현재까지의 누적 최소값을 출력한다.

      TRAILER1에서는 MIN과 동일한 결과를 출력한다.

      SUBMAX=(p,m,f)

      현재까지의 누적 최대값을 출력한다.

      TRAILER1에서는 MAX와 동일한 결과를 출력한다.

      SUBAVG=(p,m,f)

      현재까지의 누적 평균을 출력한다.

      TRAILER1에서는 AVG와 동일한 결과를 출력한다.

  • HEADER2

    • 리포트의 헤더를 작성한다. HEADER2는 리포트의 각 페이지마다 출력된다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      c:

      'HEADER1' 오퍼랜드 설명을 참조한다.

      r

      'HEADER1' 오퍼랜드 설명을 참조한다.

      p,m

      'HEADER1' 오퍼랜드 설명을 참조한다.

      DATE

      'HEADER1' 오퍼랜드 설명을 참조한다.

      &DATE

      'HEADER1' 오퍼랜드 설명을 참조한다.

      TIME

      'HEADER1' 오퍼랜드 설명을 참조한다.

      &TIME

      'HEADER1' 오퍼랜드 설명을 참조한다.

      PAGE 또는 &PAGE

      각 페이지의 번호를 페이지에 8자리로 출력한다.

  • TRAILER2

    • 리포트의 트레일러를 작성한다. TRAILER2는 리포트의 각 페이지마다 출력된다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      c:

      'HEADER1' 오퍼랜드 설명을 참조한다.

      r

      'HEADER1' 오퍼랜드 설명을 참조한다.

      p,m

      'HEADER1' 오퍼랜드 설명을 참조한다.

      DATE

      'HEADER1' 오퍼랜드 설명을 참조한다.

      &DATE

      'HEADER1' 오퍼랜드 설명을 참조한다.

      TIME

      'HEADER1' 오퍼랜드 설명을 참조한다.

      &TIME

      'HEADER1' 오퍼랜드 설명을 참조한다.

      PAGE

      'HEADER2' 오퍼랜드 설명을 참조한다.

      &PAGE

      'HEADER2' 오퍼랜드 설명을 참조한다.

      COUNT

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      COUNT15

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      SUBCOUNT

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      SUBCOUNT15

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      TOTAL

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      MIN

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      MAX

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      AVG

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      SUBTOTAL

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      SUBMIN

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      SUBMAX

      'TRAILER1' 오퍼랜드 설명을 참조한다.

      SUBAVG

      'TRAILER1' 오퍼랜드 설명을 참조한다.

  • SECTIONS

    • OUTFIL에 의해 생성되는 리포트의 섹션을 구분한다. 지정된 필드의 바이너리값이 바뀜에 따라 섹션이 나누어진다.

    • p,m

      • 섹션 구분의 기준이 되는 필드를 지정한다. 자세한 내용은 'HEADER1' 오퍼랜드 설명을 참조한다.

    • SKIP=P | L | nL

      • 섹션을 어떻게 구분해서 나타낼지를 명시한다.

      • 다음은 설정 항목에 대한 설명이다.

        항목 설명

        P

        각각의 섹션을 새로운 페이지에 출력한다. OpenFrame에서는 파싱만 지원한다.

        L

        1개의 공백 라인을 사이에 두고 섹션을 같은 페이지에 출력한다.

        L은 1L과 동일하다.

        nL

        n개의 공백 라인을 사이에 두고 섹션을 같은 페이지에 출력한다.

    • HEADER3

      • 섹션의 헤더를 작성한다.

      • 다음은 옵션에 대한 설명이다.

        옵션 설명

        c:

        'HEADER1' 오퍼랜드 설명을 참조한다.

        r

        'HEADER1' 오퍼랜드 설명을 참조한다.

        p,m

        'HEADER1' 오퍼랜드 설명을 참조한다.

        DATE

        'HEADER1' 오퍼랜드 설명을 참조한다.

        &DATE

        'HEADER1' 오퍼랜드 설명을 참조한다.

        TIME

        'HEADER1' 오퍼랜드 설명을 참조한다.

        &TIME

        'HEADER1' 오퍼랜드 설명을 참조한다.

        PAGE 또는 &PAGE

        각 섹션의 페이지 번호를 8자리로 출력한다.

    • PAGEHEAD

      • 섹션 헤더가 리포트의 각 페이지 첫머리에 출력되도록 한다.

      • PAGEHEAD가 명시되지 않으면 섹션 헤더는 각 섹션의 앞에만 출력된다. 따라서 만약 섹션이 두 페이지에 걸쳐있게 되면 섹션 헤더가 페이지 중간에 출력되는 일이 발생하게 되는데, 섹션 헤더가 맨 위에 출력되기를 원할 때 본 옵션을 사용한다.

      • PAGEHEAD는 HEADER3이 있는 경우에만 사용할 수 있다.

      • OpenFrame에서는 파싱만 지원한다.

    • TRAILER3

      • 섹션의 트레일러를 작성한다.

      • 다음은 옵션에 대한 설명이다.

        옵션 설명

        c:

        'HEADER1' 오퍼랜드 설명을 참조한다.

        r

        'HEADER1' 오퍼랜드 설명을 참조한다.

        p,m

        'HEADER1' 오퍼랜드 설명을 참조한다.

        DATE

        'HEADER1' 오퍼랜드 설명을 참조한다.

        &DATE

        'HEADER1' 오퍼랜드 설명을 참조한다.

        TIME

        'HEADER1' 오퍼랜드 설명을 참조한다.

        &TIME

        'HEADER1' 오퍼랜드 설명을 참조한다.

        PAGE

        'HEADER2' 오퍼랜드 설명을 참조한다.

        &PAGE

        'HEADER2' 오퍼랜드 설명을 참조한다.

        COUNT

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        COUNT15

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        SUBCOUNT

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        SUBCOUNT15

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        TOTAL

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        MIN

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        MAX

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        AVG

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        SUBTOTAL

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        SUBMIN

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        SUBMAX

        'TRAILER1' 오퍼랜드 설명을 참조한다.

        SUBAVG

        'TRAILER1' 오퍼랜드 설명을 참조한다.

  • NODETAIL

    • OUTFIL에서 리포트를 출력할 때 데이터 레코드는 출력하지 않도록 설정한다. 즉, 리포트의 내용만 출력 데이터셋에 저장된다.

  • REMOVECC

    • OUTFIL 출력 레코드에서 ANSI 제어문자를 제거하고 출력하도록 설정한다.

  • IFTRAIL

    • input 데이터셋에서 TRAILER1의 record를 발견하면 기존 TRAILER1의 COUNT나 TOTAL 값을 UPDATE 해준다.

    • TRAILER1 record가 발견되면 그 이후의 record는 전부 무시가 되고 그 전 record까지 계산한 COUNT와 TOTAL 값으로 update가 되며, 이에 따라 TRAILER1 record 이후의 record는 OUTFIL에 명시한 OUTPUT dataset에도 나타나지 않게 된다.

    • IFTRAIL이 존재하는 같은 OUTFIL statement 안에 INCLUDE/OMIT이 존재할 때, HEADER와 TRAILER1으로 취급되는 record는 filter가 되지 않는다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      HD=YES

      input dataset의 첫 번째 record를 HEADER로 취급한다.

      명시하지 않으면 default는 첫 번째 record를 일반 record로 취급한다.

      TRLID=(logexp)

      이곳에 명시한 logexp를 기준으로 TRAILER1 record를 찾아낸다.

      logexp과 일치하는 record가 없어 TRAILER1이 발견되지 않는다면 update는 발생하지 않는다.

      TRLUPD=(c:item,…​)

      item에 TOTAL(TOT)가 명시되어 있다면 TRLID의 logexp에 맞는 TRAILER1 record가 발견되지 않아도 해당 지정된 필드의 총합은 계속 계산하기 때문에 지정된 필드가 numeric으로 계산할 수 없는 값이라면 exception을 발생시킬 수 있다.

      • c: 출력 레코드의 시작 위치를 지정한다.

      • item

        • COUNT=(edit) or (to)

        • COUNT+n=(edit) or (to)

        • COUNT-n=(edit) or (to)

        • TOTAL=(p,m,f,edit) or (p,m,f,to)

      COUNT는 현재까지 읽은 input record의 카운트를 출력해주며, n은 해당 숫자만큼 count 값을 더하고 빼준다.

      TOTAL은 지정된 숫자 입력 필드의 총합을 출력해주며, TOTAL 대신 TOT로 사용이 가능하다.

      item에 해당하는 설명은 아래에 명시하였다.

      p,m,f,edit

      지정된 필드를 정의된 형식으로 변환해서 OUTFIL 레코드로 출력한다.

      • p, m : 이전 항목 설명과 동일하다.

      • f : 필드의 포맷을 기술한다.

      • edit : 필드가 변환될 형식을 정의한다. EDIT 명령어에 대한 자세한 내용은 EDIT 명령어의 설명을 참고한다.

      p,m,f,to

      입력 필드의 형식을 변경해서 출력한다.

      • p,m,f : 이전 항목 설명과 동일하다.

      • to : 입력 필드의 형식 f가 변환될 출력 레코드의 형식을 지정한다.

        입력 필드의 형식 f가 ZDF인 경우 f가 ZD인 경우와 동일하게 동작한다.

        to 명령어 구문은 다음과 같다.

        of|TO=[of|(of)][,LENGTH=[n|(n)]]
        • TO=[of|(of)] : 변환될 형식을 정의한다. 'TO='를 생략한 채로 사용할 수도 있다.

        • LENGTH=[n|(n)] : 변환될 출력 필드의 길이를 정의한다.

    • IFTRAIL의 사용법 및 예시이다.

      IFTRAIL=([HD=YES,]TRLID=(logexp),TRLUPD=(c:item,...))
      
      IFTRAIL=(HD=YES,TRLID=(1,3,CH,EQ,C'TRL'),TRLUPD=(11:COUNT=(M11,LENGTH=4),21:TOT=(M11,LENGTH=6)))
EDIT 명령어

필드가 변환될 형식을 정의한다. EDIT 명령어 구문은 다음과 같다.

  • 사용법

    Mn|EDIT=(pattern)[,SIGNS=(lp,ln,tp,tn)][,LENGTH=[n|(n)]
    옵션 설명

    pattern

    I, T, S, CR과 프린트 가능한 문자로 주어진 숫자 필드가 변환될 편집 패턴을 정의한다.

    변환할 숫자 필드(ZD, PD, BI, FI 등)에 저장된 값의 digit과 편집 패턴의 I, T는 뒤에서부터 하나씩 매치되어 변환된다. 변환할 숫자 필드 값의 절대값 길이보다 I, T가 많은 경우에는 초과된 부분이 제거된 패턴을 내부적으로 사용하게 된다. 부호를 나타내는 부분은 보존된다.

    • I : 중요하지 않은 digit을 나타낸다. I에 해당하는 digit이 의미 없는 leading 0이라면 공백으로 대체된다.

    • T : 중요한 digit을 나타낸다. T에 해당하는 digit은 leading 0일지라도 0으로 표시된다.

    • S : 부호를 의미하며 패턴의 제일 앞에 등장하면 선행 부호(leading sign)로 SIGNS 옵션의 lp, ln으로 치환된다. 패턴의 제일 마지막에 등장하면 종지 부호 (tailing sign)로 SIGNS 옵션의 tp, tn으로 치환된다. 만약 SIGNS 옵션이 주어지지 않았다면 무시된다.

    • CR : 숫자 필드의 값이 음수였을 때 우측에 CR이라고 표시되고 양수이면 우측에 공백 2개로 표시된다.

    Mn

    미리 정의된 편집 패턴이다. (0 <= n <= 26) Mn에는 기본값으로 적용되는 SIGNS가 존재한다.

    SIGNS

    부호를 표시하는 문자를 정의한다.

    • lp : 값이 양수일 때 EDIT 결과의 맨 앞에 위치하는 부호문자를 정의한다.

    • ln : 값이 음수일 때 EDIT 결과의 맨 앞에 위치하는 부호문자를 정의한다.

    • tp : 값이 양수일 때 EDIT 결과의 맨 뒤에 위치하는 부호문자를 정의한다.

    • tn : 값이 음수일 때 EDIT 결과의 맨 뒤에 위치하는 부호문자를 정의한다.

    LENGTH

    출력 필드의 길이를 지정한다.

    • n : 출력 필드의 길이를 지정한다. (n)으로도 사용이 가능하다.

미리 정의된 EDIT 문은 다음과 같다.

마스크 유형 표시 예제(값) 예제(결과)

M0

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIITS

(없음,없음,공백,-)

+01234

□1234□

-00001

□□□□1-

M1

TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTS

(없음,없음,공백,-)

-00123

00123-

+00123

00123□

M2

II,III,III,III,III,III,III,III,III,IIT.TTS

(없음,없음,공백,-)

+123450

1,234.50□

-000020

□□□□0.20-

M3

II,III,III,III,III,III,III,III,III,IIT.TTCR

(없음,없음,없음,없음)

-001234

□□□12.34CR

+123456

1,234.56□□

M4

SII,III,III,III,III,III,III,III,III,IIT.TT

(+,-,없음,없음)

+0123456

□+1,234.56

-1234567

-12,345.67

M5

SII,III,III,III,III,III,III,III,III,IIT.TTS

(공백,좌괄호,공백,우괄호)

-001234

□□□(12.34)

+123450

□1,234.50□

M6

III-TTT-TTTT

(없음,없음,없음,없음)

00123456

□□□□012-3456

12345678

□□1-234-5678

M7

TTT-TT-TTTT

(없음,없음,없음,없음)

00123456

000-12-3456

12345678

012-34-5678

M8

IT:TT:TT

(없음,없음,없음,없음)

030553

□3:05:53

121736

12:17:36

M9

IT/TT/TT

(없음,없음,없음,없음)

123004

12/30/04

083104

□8/31/04

M10

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIT

(없음,없음,없음,없음)

01234

□1234

00000

□□□□0

M11

TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

(없음,없음,없음,없음)

00010

00010

01234

01234

M12

SI,III,III,III,III,III,III,III,III,III,IIT

(공백,-,없음,없음)

+1234567

□1,234,567

-0012345

□□□-12,345

M13

SI.III.III.III.III.III.III.III.III.III.IIT

(공백,-,없음,없음)

+1234567

□1.234.567

-0012345

□□□-12.345

M14

SI III III III III III III III III III IITS

(공백,좌괄호,공백,우괄호)

+1234567

□1 234 567□

-0012345

□□□(12 345)

M15

I III III III III III III III III III IITS

(없음,없음,공백,-)

+1234567

1 234 567□

-0012345

□□□12 345-

M16

SI III III III III III III III III III IIT

(공백,-,없음,없음)

+1234567

□1 234 567

-0012345

□□□-12 345

M17

SI’III’III’III’III’III’III’III’III’III’IIT

(공백,-,없음,없음)

+1234567

□1'234'567

-0012345

□□□-12'345

M18

SII,III,III,III,III,III,III,III,III,IIT.TT

(공백,-,없음,없음)

+0123456

□□1,234.56

-1234567

-12,345.67

M19

SII.III.III.III.III.III.III.III.III.IIT,TT

(공백,-,없음,없음)

+0123456

□□1.234,56

-1234567

-12.345,67

M20

SI III III III III III III III III IIT,TTS

(공백,좌괄호,공백,우괄호)

+0123456

□□1 234,56□

-1234567

(12 345,67)

M21

II III III III III III III III III IIT,TTS

(없음,없음,공백,-)

+0123456

□1 234,56□

-1234567

12 345,67-

M22

SI III III III III IIII III III III IIT,TT

(공백,-,없음,없음)

+0123456

□□1 234,56

-1234567

-12 345,67

M23

SII’III’III’III’III’III’III’III’III’IIT.TT

(공백,-,없음,없음)

+0123456

□□1'234.56

-1234567

-12'345.67

M24

SII’III’III’III’III’III’III’III’III’IIT,TT

(공백,-,없음,없음)

+0123456

□□1'234,56

-1234567

-12'345,67

M25

SIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIT

(공백,-,없음,없음)

+01234

□□1234

-00001

□□□□-1

M26

STTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

(+,-,없음,없음)

1234

+1234

-1

-1

13. OUTREC

SORT/MERGE/COPY를 수행하고 난 후 SORTOUT이나 OUTFIL에서 지정한 데이터셋으로 결과를 출력하기 전에 출력 레코드를 재편집(reformatting)한다. INREC이 SORT 처리를 하기 전의 레코드에 대해서 재편집을 수행하는 것에 비해 OUTREC은 SORT 처리를 한 후의 레코드에 대해서 재편집 기능을 수행한다는 점이 다르다.

사용법

다음은 OUTREC 문의 사용법이다.

OUTREC PARSE=(parse_item[,parse_item[,...]]) |
       FIELDS=(reformat_command[,reformat_command[,...]]) |
       BUILD=(reformat_command[,reformat_command[,...]])
       OVERLAY=(reformat_command[,reformat_command[,...]]) |
       FINDREP={IN=incon,OUT=outcon | IN=(incon1,incon2[,...]),OUT=outcon |
                INOUT=(incon1,outcon1[,incon2,outcon2[,...]])}
               [,STARTPOS=p | ENDPOS=q]
       IFTHEN=WHEN=INIT,{BUILD | OVERLAY | FINDREP} |
                   WHEN=GROUP,BEGIN=(logexp),END=(logexp),RECORDS=n,PUSH=(items) |
                   WHEN=(logexp),{BUILD | OVERLAY | FINDREP} |
                   WHEN=NONE,{BUILD | OVERLAY | FINDREP} |
       CONVERT

[parse_item]

parse_item=%nn= { FIXLEN=m | ABSPOS=p | ADDPOS=x | SUBPOS=y |
               STARTAFT=string | STARTAFT=BLANKS |
               STARTAT=string | STARTAT=BLANKS | STARTAT=NONBLANK |
               ENDBEFR=string | ENDBEFR=BLANKS |
               ENDAT=string | ENDAT=BLANKS |
               PAIR=APOST | PAIR=QUOTE }

[reformat_command]

reformat_command=[c:] | s | %nn | p,m | p,m,TRAN=LTOU|UTOL | p,m,TRAN=ALTSEQ |
               p,m,Y2x | p,m,f,edit | p,m,f,to | arexp,edit | p,m,CHANGE | p,m,a |
               DATEn | DATE | &DATE | DATE=(abcd) | &DATE=(abcd) | TIME | &TIME |
               p,m,f,dateop | p,m,Yxx,todate | TIME=(abc) | &TIME=(abc) | seqnum | p,m,justify | %nn,justify | p,m,squeeze | %nn,squeeze
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • PARSE

    • 가변길이 입력 레코드에서 고정 길이의 parse된 필드를 추출한다. parse된 필드는 BUILD 또는 OVERLAY에서 (p,m)이 사용되는 곳에 사용할 수 있다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      %nn

      가변 길이 입력 레코드를 고정 길이 출력 레코드로 변환한다.

      parse된 필드는 BUILD 또는 OVERLAY에서 (p,m)이 사용되는 곳에서 사용할 수 있다.

      FIXLEN=m

      parse된 필드의 길이를 지정한다. 이 속성은 모든 parse 필드에 존재해야 한다.

      ABSPOS=p

      입력 레코드에서 parse 시작 위치p를 지정한다.

      ADDPOS=x

      입력 레코드에서 parse 시작 위치가 x만큼 증가한다.

      SUBPOS=y

      입력 레코드에서 parse 시작 위치가 y만큼 감소한다.

      STARTAFT

      • STARTAFT=string : 입력 레코드의 첫 번째 string 이후부터 parse된 필드의 레코드가 시작한다.

      • STARTAFT=BLANKS : 입력 레코드의 선두를 기준으로 첫 번째 space들 이후부터 parse된 필드의 레코드가 시작한다.

      STARTAT

      • STARTAT=string : 입력 레코드의 첫 번째 string을 포함하여 parse된 필드의 레코드가 시작한다.

      • STARTAT=BLANKS : 입력 레코드의 선두를 기준으로 첫 번째 space부터 parse된 필드의 레코드가 시작한다.

      • STARTAT=NONBLANK : 입력 레코드의 선두를 기준으로 space가 아닌 부분부터 parse된 필드의 레코드가 시작한다.

      ENDBEFR

      • ENDBEFR=string : 입력 레코드의 첫 번째 string 전에 parse된 필드의 레코드가 끝난다.

      • ENDBEFR=BLANKS : 입력 레코드의 선두를 기준으로 첫 번째 space 전에 parse된 필드의 레코드가 끝난다.

      ENDAT

      • ENDAT=string : 입력 레코드의 첫 번째 string을 포함하여 parse된 필드의 레코드가 끝난다.

      • ENDBEFR=BLANKS : 입력 레코드의 선두를 기준으로 첫 번째 space들을 포함하여 parse된 필드의 레코드가 끝난다.

      PAIR

      • PAIR=APOST : apostrophe(')로 묶인 영역은 blank나 string으로 취급하지 않는다.

      • PAIR=QUOTE : quote(")로 묶인 영역은 blank나 string으로 취급하지 않는다.

  • FIELDS | BUILD

    • 입력 레코드에서 선택할 키 필드를 지정한다. 키 필드의 시작위치와 길이 결정할 수 있다.

      필드가 여러 개로 지정되는 경우 뒤에 지정되는 필드는 바로 앞에 지정된 필드의 뒤에 붙어서 출력 레코드로 재편집된다. 가변길이 레코드(VB)의 경우 재편집 결과 레코드의 길이가 변경되면 레코드 기술어(RDW)의 내용도 그에 따라 변경된다.

    • FIELDS 대신에 BUILD를 동일하게 사용할 수 있다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      c:

      c: 옵션 바로 다음에 올 필드의 재편집된 입력 레코드에서의 시작 위치를 지정한다. FB의 경우는 레코드의 선두를, VB의 경우는 RDW의 선두를 각각 1로 한다.

      c:로 지정하는 위치는 이전의 선택 필드나 삽입된 공백과 겹쳐질 수 없으며, 이 옵션으로 인해 정의되지 않는 구간이 생긴다면 그 구간은 빈칸으로 채워진다.

      s

      Separation 필드로 문자열이나 공백을 기술한다.

      • nX : n개의 공백 문자를 삽입한다.

      • nC’xx…​x' : 캐릭터 문자열을 삽입한다. n은 문자열의 반복 횟수를 의미한다.

      • nX’yy…​yy' : 16진 문자열을 삽입한다. n은 문자열의 반복 횟수를 의미한다.

      DATEn

      현재 날짜를 출력한다. OpenFrame에서는 DATE1만 지원하며 C’yyyymmdd’의 형태로 표시된다.

      TIMEn

      현재 시간을 출력한다.

      n은 1~3까지 지정 가능하며 다음의 형태로 표시된다.

      • 1 : C’hhmmss'

      • 2 : C’hhmm'

      • 3 : C’hh'

      DATE=(abcd) 또는 &DATE=(abcd)

      현재 날짜를 C’adbdc' 형식으로 출력한다. d는 구분자이다.

      a,b,c∈{M,D,Y,4} 이며, 각각의 의미는 다음과 같다.

      • M : 월(01~12)을 두 자리 숫자로 출력한다.

      • D : 일(01~31)을 두 자리 숫자로 출력한다.

      • Y : 연도의 마지막 두 자리 숫자를 출력한다.

      • 4 : 연도를 네 자리 숫자로 출력한다.

      DATE 또는 &DATE

      현재 날짜를 C’mm/dd/yy’의 형태로 출력한다.

      • mm : month(01-12)

      • dd : day(01-31)

      • yy : year의 뒤 두 자리

      DATENS=(abc) 또는 &DATENS=(abc)

      현재 날짜를 C’abc' 형식으로 출력한다.

      a,b,c∈{M,D,Y,4} 이며, 각각의 의미는 다음과 같다.

      • M : 월(01~12)을 두 자리 숫자로 출력한다.

      • D : 일(01~31)을 두 자리 숫자로 출력한다.

      • Y : 연도의 마지막 두 자리 숫자를 출력한다.

      • 4 : 연도를 네 자리 숫자로 출력한다.

      TIME 또는 &TIME

      현재 시간을 C’hh:mm:ss’의 형태로 출력한다.

      • hh : hour(00-23)

      • mm : minutes(00-59)

      • ss : seconds(00-59)

      TIME=(abc) 또는 &TIME=(abc)

      시간을 24시간제로 표시할지 12시간제로 표시할지 결정한다.

      • ab : 24 또는 12로 지정할 수 있으며 각각 24시간제와 12시간제로 출력할 것을 의미한다.

      • c : 구분자로 C’hhcmmcss’의 형태로 삽입된다.

      p,m

      지정된 입력 레코드 필드를 출력 필드에 출력한다.

      • p : 제어 필드의 시작 위치를 기술한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드의 p 항목을 참조한다.

      • m : 선택 필드의 길이를 Byte 수로 지정한다.

      %nn

      %nn label의 parse된 레코드 필드를 출력 필드에 출력한다.

      p,m,YDDDNS=(ab)

      지정된 입력 레코드 필드를 YDDDNS=(ab) 형태로 출력한다.

      • p,m : 이전 항목 설명과 동일하다.

      • YDDDNS=(ab) : a는 4, Y 중 하나, b는 D가 올 수 있다. 4, Y는 DATE=(abcd)의 설명과 동일하며 D는 1년에 해당 날짜의 수를 나타낸다. (1~366)

      p,m,TRAN=LTOU|UTOL

      • p, m : 이전 항목 설명과 동일하다.

      • TRAN=LTOU : 해당 필드의 소문자(lowercase)를 대문자(uppercase)로 바꿔서 출력한다.

      • TRAN=UTOL : 해당 필드의 대문자를 소문자로 바꿔서 출력한다.

      p,m,TRAN=ALTSEQ

      • p, m : 이전 항목 설명과 동일하다.

      • TRAN=ALTSEQ : 해당 필드의 레코드를 ALTSEQ 변환 테이블에 따라 변경한다.

      p,m,Y2x

      • p : 이전 항목 설명과 동일하다.

      • m : 연도를 나타낼 출력 필드의 길이를 지정한다.

      • Y2x : OpenFrame에서는 Y2C만 지원하고 있으며, C’yyyy’의 형태로 출력된다.

      p,m,Y2x,DT=(abcd)

      Y2x형태로 변환된 레코드 필드를 DT=(abcd)형태로 출력한다.

      • p,m,Y2x : 이전 항목 설명과 동일하다.

      • DT=(abcd) : Y2x 형태의 날짜를 C’adbdc’형식으로 출력한다. d는 구분자이다. a,b,c에 대한 내용은 옵션 DATE=(abcd)와 같다.

      p,m,f,edit

      지정된 필드를 정의된 형식으로 변환해서 OUTFIL 레코드로 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참조한다.

      p,m,f,to

      입력 필드의 형식을 변경해서 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참조한다.

      arexp,edit

      arithmetic expression을 edit 형식으로 변환해서 출력 레코드로 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참조한다.

      p,m,CHANGE

      입력 필드의 지정된 문자열을 다른 문자열로 치환한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참조한다.

      p,m,a

      지정된 입력 필드를 출력 필드에 출력하되, 정렬(alignment)이 안 맞으면 필드 앞에 널 문자(0x0)들을 채워 정렬을 맞춘다.

      a는 H,F,D 중 하나로 지정한다.

      • H : halfword(2Bytes)

      • F : fullword(4Bytes)

      • D : doubleword(8Bytes)

      p,m,f,dateop

      지정된 입력 필드에 date operation을 수행한다.

      date operation은 다음과 같다.

      • ADDDAYS : 지정된 입력 필드에 지정한 값만큼 일수를 더한다.

      • ADDMONS : 지정된 입력 필드에 지정한 값만큼 월수를 더한다.

      • ADDYEARS : 지정된 입력 필드에 지정한 값만큼 연수를 더한다.

      • SUBDAYS : 지정된 입력 필드에 지정한 값만큼 일수를 뺀다.

      • SUBMONS : 지정된 입력 필드에 지정한 값만큼 월수를 뺀다.

      • SUBYEARS : 지정된 입력 필드에 지정한 값만큼 연수를 뺀다.

      p,m,Yxx,todate

      지정된 입력 필드를 todate에 명시한 옵션으로 변환한다.

      todate에 지정할 수 있는 값은 다음과 같다.

      • DT=(abcd) :

        • a, b, c : 연(마지막 2자리 : Y, 4자리 : 4), 월(M), 일(D) 중 원하는 순서로 사용 한다.

        • d : 연, 월, 일 사이의 구분자를 지정한다.

      • TOJUL=[Yaa | Yaa(s)] : 입력 필드를 Julian date 형식으로 출력한다.

        • Yaa : Julian date의 형식을 지정한다.

          • Y2T : C’yysddd' | C’yyddd'

          • Y2W : C’dddsyy' | C’dddyy'

          • Y2U : X’yydddf'

          • Y2X : X’dddyyf'

          • Y4T : C’ccyysddd' | C’ccyyddd'

          • Y4W : C’dddsccyy' | C’dddccyy'

          • Y4U : X’ccyydddf'

          • Y4X : X’dddccyyf'

        • s : 구분자를 지정한다.

      • TOGREG=[Yaa | Yaa(s)] : 입력 필드를 Gregorian date 형식으로 출력한다.

        • Yaa : Gregorian date의 형식을 지정한다.

          • Y2T : C’yysmmsdd' | C’yymmdd'

          • Y2W : C’mmsddsyy' | C’mmddyy'

          • Y2V : X'0yymmddf'

          • Y2Y : X'0mmddyyf'

          • Y4T : C’ccyysmmsdd' | C’ccyymmdd'

          • Y4W : C’mmsddsccyy' | C’mmddccyy'

          • Y4V : X'0ccyymmddf'

          • Y4Y : X'0mmddccyyf'

        • s : 구분자를 지정한다.

      seqnum

      출력 레코드의 sequence number를 출력한다. sequence number는 출력 레코드의 뒤에 추가된다.

      OpenFrame에서 지원하는 형식은 다음과 같다.

      SEQNUM,n,fs[,START=j][,INCR=i][,RESTART=(p,m)]
      • SEQNUM : sequence number를 출력하라는 명령을 명시한다.

      • n : 필수 옵션이다. sequence number를 몇 자리로 나타낼 것인지 지정한다.

      • fs : 필수 옵션이다. sequence number를 나타낼 문자열 형식을 지정한다.

      • START=j : 생략 가능한 옵션이다(생략 시 START=1로 간주된다). sequence number 시작값을 j로 지정한다.

      • INCR=i : 생략 가능한 옵션이다(생략 시 INCR=1로 간주된다). sequence number 증가값을 i로 지정한다.

      • RESTART=(p,m) : 생략 가능한 옵션이다. RESTART=(p,m)를 지정할 때 명시한 필드가 이전 레코드의 필드와 일치하지 않을 경우 SEQNUM을 j로 초기화한다.

      p,m,justify

      지정된 필드를 정의된 형식으로 변환해서 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참조한다.

      %nn,justify

      %nn label의 parse된 레코드 필드를 정의된 형식으로 변환해서 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참조한다.

      p,m,squeeze

      지정된 필드를 정의된 형식으로 변환해서 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참조한다.

      %nn,squeeze

      %nn label의 parse된 레코드 필드를 정의된 형식으로 변환해서 출력한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드를 참조한다.

  • OVERLAY

    • 출력 레코드에 덮어 씌울 항목을 명시한다. 덮어 씌워지지 않은 열은 그대로 출력한다.

  • FINDREP

    • 입력 레코드에서 지정된 변수를 찾아서 다른 변수로 치환한다.

    • 변수 치환 방법에 대한 설명은 OUTFIL에 'FINDREP' 오퍼랜드를 참조한다.

  • IFTHEN

    • 주어진 조건에 따라 각기 다른 레코드들을 각각 다른 방식으로 재편집할 수 있다.

    • 조건 설정에 대한 설명은 OUTFIL에 'IFTHEN' 오퍼랜드를 참조한다.

  • CONVERT

    • 가변 길이 레코드를 고정 길이 레코드로 변환한다.

14. RECORD

레코드의 형식 및 길이를 지정한다.

사용법

다음은 RECORD 문의 사용법이다.

RECORD [TYPE=[F|V|D] [,LENGTH=[(L1)|(L1,L2,L3,L4,L5)]]
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • TYPE

    • 레코드의 형식을 지정한다.

    • 다음은 설정항목에 대한 설명이다.

      항목 설명

      F

      고정길이 레코드를 의미한다. FB로도 기술할 수 있다.

      V

      가변길이 레코드를 의미한다. VB로도 기술할 수 있다.

      D

      ASCII 가변길이 레코드를 의미한다. DB로도 기술할 수 있다. OpenFrame에서는 파싱만 지원한다.

    • 입력 데이터셋이 VSAM인 경우에 TYPE을 이용하여 FB 또는 VB로 처리할 수 있다. 이때 F를 지정하면 입력 레코드를 그대로 처리하고 V를 지정하면 입력 레코드 앞에 RDW를 첨가하여 처리한다. 입력 데이터셋이 NVSM인 경우에는 입력 데이터셋의 RECFM 정보를 보고 형식을 결정하며 TYPE은 무시한다.

  • LENGTH

    • 레코드의 길이를 지정한다.

    • 고정길이 레코드의 경우에는 L1부터 L3까지, 가변길이 레코드의 경우에는 L1부터 L5까지를 지정할 수 있다. L1을 제외하고는 모두 생략이 가능하다.

    • 다음은 설정 항목에 대한 설명이다.

      항목 설명

      L1

      필수 입력 항목으로, 입력 레코드의 길이를 지정한다.

      FB의 경우는 입력 레코드의 길이를, VB의 경우는 입력 레코드의 최대 길이를 지정한다. SORTIN의 lrecl(logical record length)이 주어지지 않았을 때 사용할 수 있다. 레코드 제어문 자체가 없는 경우에는 DCB 파라미터 내에 정의된 값을 따른다.

      L2

      FB의 경우에는 SORT 처리 중의 레코드 길이를, VB의 경우에는 SORT 처리 중의 레코드 최대 길이를 지정한다. 생략할 경우 L1에 지정한 값으로 설정된다.

      OpenFrame에서는 파싱까지만 처리하며 기능은 지원하지 않는다.

      L3

      FB의 경우는 출력 레코드의 길이를 지정하며 VB의 경우는 출력 레코드의 최대 길이를 지정한다. INREC이나 OUTREC이 있는 경우에는 처리 후의 길이를 나타내며 INREC/OUTREC이 없을 경우 L1의 값이 지정된다.

      L4

      입력 레코드의 최소 레코드 길이를 지정한다.

      OpenFrame에서는 파싱까지만 처리하며 기능은 지원하지 않는다.

      L5

      입력 레코드의 평균 길이를 나타낸다. 생략된 경우에는 L1과 L4의 평균으로 설정된다. 단, MERGE 경우에는 생략되어도 다른 값이 설정되지 않는다.

      OpenFrame에서는 파싱까지만 처리하며 기능은 지원하지 않는다.

예제

다음은 레코드 길이 200Bytes의 고정길이 레코드를 지정하는 예제이다.

RECORD TYPE=F,LENGTH=(200)

다음은 최대 길이 100Bytes, 최소 길이 50Bytes의 가변길이 레코드를 지정하는 예제이다.

RECORD TYPE=V,LENGTH=(100,,,50)

15. REFORMAT

OpenFrame에서는 조인을 수행할 때 REFORMAT 문을 지정하는 것을 권고한다. 조인 수행하는 경우 레코드 내에서 지정된 부분만 출력한다. 만약 REFORMAT 문을 명시하지 않을 경우 JOIN 문에 따라 F1, 또는 F2에 지정된 데이터셋의 max length로 REFORMAT 문을 지정한다.

사용법

다음은 REFORMAT 문의 사용법이다.

REFORMAT FIELDS=({F1|F2}:p,m[,p,m[,...]][,{F1|F2}:p,m[,p,m[,...]][,...]])
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • FIELDS

    • 입력 레코드에서 선택할 키 필드를 지정한다. 키 필드의 시작위치와 길이 결정할 수 있다.

      옵션 설명

      F1

      F1을 지정하면 왼쪽 데이터셋(SORTJNF1)의 레코드에서 키 필드를 선택한다.

      F2

      F2를 지정하면 오른쪽 데이터셋(SORTJNF2)의 레코드에서 키 필드를 선택한다.

      필드가 여러 개로 지정되는 경우 뒤에 지정되는 필드는 바로 앞에 지정된 필드의 뒤에 붙어서 출력 레코드로 재편집된다.

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      p,m

      지정된 입력 레코드 필드를 출력 필드에 출력한다.

      • p : 제어 필드의 시작 위치를 기술한다. 자세한 내용은 OUTFIL의 'OUTREC' 오퍼랜드의 p 항목을 참조한다.

      • m : 선택 필드의 길이를 Byte 수로 지정한다.

    • 다음은 SORTJNF1과 SORTJNF2를 조인하는 예제이다. SORTJNF1의 레코드의 첫 17Bytes와 SORTJNF2의 레코드의 첫 10Bytes만 출력된다.

      JOINKEYS FILE=F1,FIELDS=(11,7,A)
      JOINKEYS FILE=F2,FIELDS=(11,7,A)
      REFORMAT FIELDS=(F1:1,17,F2:1,10)
    • 다음은 REFORMAT 문을 명시하지 않았을 때 조인하는 예제이다. SORTJNF1과 SORTJNF2의 max length는 7이다. OpenFrame에서는 아래의 REFORMAT 문을 추가한다.

      JOINKEYS FILE=F1,FIELDS=(1,7,A)
      JOINKEYS FILE=F2,FIELDS=(1,7,A)
      JOIN UNPAIRED,ONLY,F1,F2
      REFORMAT FIELDS=(F1:1,7,F2:1,7)

16. SORT

입력 데이터셋의 레코드를 주어진 키에 따라 오름차순 혹은 내림차순으로 정렬하여 출력 데이터셋으로 출력한다.

사용법

다음은 SORT 문의 사용법이다.

SORT FIELDS=(p,m,f,s[,p,m,f,s[,...]]) | (p,m,s[,p,m,s[,...]]),FORMAT=f | COPY
     [SKIPREC | STOPAFT | CKPT | DYNALLOC | EQUALS | NOEQUALS | FILSZ=[E|U]n |
      SIZE=[E|U]n | Y2PAST | CENTWIN]
오퍼랜드

다음은 SORT 문에서 지원하는 오퍼랜드에 대한 설명이다.

  • FIELDS

    • 입력 레코드를 정렬하기 위한 키 필드를 지정한다. 키 필드의 시작 위치와 길이, 형식, 정렬 기준을 결정할 수 있다. (별칭: KEYS)

    • 다음은 옵션에 대한 설명이다.

      옵션 설명

      p

      제어 필드의 시작 위치를 기술한다. 제어 필드는 경우에 따라 시작 지점이 달라진다.

      • 입력 레코드가 NVSM 고정길이(FB)인 경우에는 입력 레코드의 첫 번째 Byte가 1이 된다.

      • 입력 레코드가 NVSM 가변길이(VB)인 경우에는 레코드의 앞에 레코드 기술어(RDW) 4Bytes가 첨가되어 있으며 RDW의 시작점이 1이 되고 실제 레코드는 5부터 시작된다.

      • 입력 레코드가 VSAM 데이터셋이고 OpenFrame SORT에서 이를 가변길이 레코드로 처리할 경우, RDW를 레코드의 앞에 추가해 주고 그 시작점을 1로 한다. 따라서 SORT를 수행할 때 실제 데이터는 5부터 시작된다.

      또한 OpenFrame SORT를 수행할 때 VSAM 데이터셋을 고정길이 레코드로 판단할지 가변길이 레코드로 판단할지를 걸정해야 한다. 다음의 3가지 경우 중 하나를 만족하면 해당 데이터셋은 가변길이 레코드로 판단한다.

      1. RECORD TYPE=V로 지정되어 있는 경우

      2. SORTOUT이 RECFM=VB로 지정된 경우

      3. SORTIN과 SORTOUT이 모두 VSAM인 경우

      m

      제어 필드의 길이를 기술한다.

      f

      제어 필드의 형식을 기술한다. 기술 가능한 제어 필드의 형식과 형식에 따른 길이에 대한 자세한 설명은 아래의 표를 참고한다.

      s

      제어 필드의 정렬 기준을 기술한다.

      • A(Ascending order) : 오름차순

      • D(Descending order) : 내림차순

      • E : 사용자 순서 변경(OpenFrame에서는 지원하지 않는다.)

      다음은 기술 가능한 제어 필드의 형식과 형식에 따른 길이이다.

      형식 설명 길이 부호

      CH

      문자 (ASCII)

      1 to 32760Bytes

      없음

      AC

      문자 (ASCII)

      1 to 32760Bytes

      없음

      ZD (Zoned Decimal)

      Zone 형식의 10진수

      1 to 32760Bytes

      있음

      PD (Packed Decimal)

      Pack 형식의 10진수

      1 to 32760Bytes

      있음

      PDF

      양수일 경우 부호비트가 'F’인 Pack 형식의 10진수

      1 to 32760Bytes

      있음

      PD0

      최상위 nibble과 최하위 nibble을 제외한 Pack 형식의 10진수

      1 to 32760Bytes

      없음

      FI (Fixed-point)

      고정소수점 2진수

      1 to 32760Bytes

      있음

      FL (Floating-point)

      부동소수점 10진수

      1 to 32760Bytes

      있음

      BI (Binary Integer)

      2진수

      1 to 32760Bytes

      없음

      CSF or FS

      추가 전치 부동 부호가 있는 숫자

      1 to 32760Bytes

      있음

      UFF

      부호가 없는 자유 형식 숫자

      1 to 32760Bytes

      없음

      SFF

      부호가 있는 자유 형식 숫자

      1 to 32760Bytes

      있음

      CSL

      전치 분리 부호가 있는 숫자

      1 to 32760Bytes

      있음

      CST

      후치 분리 부호가 있는 숫자

      1 to 32760Bytes

      있음

      CLO

      전치 overpunch 부호가 있는 숫자

      1 to 32760Bytes

      있음

      CTO

      후치 overpunch 부호가 있는 숫자

      1 to 32760Bytes

      있음

      ASL

      전치 분리 부호가 있는 숫자, ASCII

      1 to 32760Bytes

      있음

      AST

      후치 분리 부호가 있는 숫자, ASCII

      1 to 32760Bytes

      있음

      AQ

      문자 (ALTSEQ에서 정의한 순서)

      1 to 32760Bytes

      없음

      Y2C or Y2Z

      2자리 문자 또는 ZD 연도 데이터

      2Bytes

      없음

      Y2P

      2자리 PD 연도 데이터

      2Bytes

      없음

      Y2D

      2자리 10진 연도 데이터

      1Byte

      없음

      Y2S

      2자리 문자 또는 ZD 연도 데이터

      2Bytes

      없음

      Y2B

      2자리 2진 연도 데이터

      1Byte

      없음

    • 다음은 포맷 형식이 문자인 고정길이 레코드의 첫 번째 Byte에서 시작하여 7Bytes까지의 내용을 오름차순으로 정렬하는 예제이다.

      SORT FIELDS=(1,7,CH,A)

      다음은 가변길이 레코드의 경우 1부터 4까지의 RDW를 제외하고 실제 레코드의 선두인 5부터 3Bytes만큼의 문자 형식의 레코드를 내림차순으로 정렬하는 예제이다.

      SORT FIELDS=(5,3,CH,D)

      가변길이 레코드의 경우 RDW를 제외한 레코드의 선두는 5이다. 만약 SORT 시작점을 1에서 4사이에 지정하였을 경우 에러가 발생하지는 않으나 RDW가 포함되므로 SORT가 정상적으로 수행되지 않는다.

  • FORMAT=f

    • 제어 필드의 형식이 모두 일치하는 경우에는 제어 필드 내부에서 형식을 지정하지 않고 외부에서 FORMAT=f 명령을 사용하여 한꺼번에 지정할 수 있다.

    • 다음은 FORMAT의 예제로 2개의 CH 형식의 고정길이 제어 필드를 지정한다. 레코드의 처음 1Byte에서 10Bytes만큼 오름차순으로 정렬하고, 11Bytes부터 10Bytes만큼 내림차순으로 정렬한다.

      SORT FIELDS=(1,10,A,11,10,D),FORMAT=CH

      OpenFrame에서 FORMAT=f 오퍼랜드는 반드시 제어 필드의 형식이 모두 일치해야만 지정할 수 있다. 예를 들어, 여러 개의 제어 필드 중 한 필드의 형식만 다르고 나머지는 모두 같은 경우, 형식이 다른 한 필드만 내부에서 지정하고 나머지 필드의 형식을 외부에서 FORMAT=f로 지정하면 에러가 발생한다. FORMAT=f를 FIELDS의 뒤에 쓰지 않고 앞에 쓰는 경우에도 에러가 발생하므로 주의한다.

  • COPY

    • COPY 명령은 입력 데이터셋 레코드의 내용을 제어 필드의 지정없이 출력 데이터셋으로 그대로 복사한다.

    • 다음은 COPY의 예제이다.

      SORT FIELDS=COPY
  • FILSZ=[E|U]n

    • 실제로 정렬에 사용되는 레코드의 개수를 지정한다.

    • OpenFrame에서는 문법적 오류가 발생하지 않도록 형식적으로만 지원한다.

  • SIZE=[E|U]n

    • 입력 레코드의 개수를 지정한다.

    • 자세한 내용은 OPTION의 설명을 참조한다.

  • SKIPREC=x

    • 입력 레코드의 첫 번째 레코드에서부터 몇 개의 레코드를 정렬하지 않고 삭제(discard)할 것인지를 기술한다.

    • x는 레코드의 개수를 의미한다.

    • 다음은 SKIPREC의 예제로 입력 데이터셋의 첫 번째 레코드부터 5번째 레코드까지를 제외한 나머지 레코드들을 제어 필드에 기술한 내용에 따라 정렬한다.

      SORT FIELDS=(1,7,CH,A),SKIPREC=5
  • STOPAFT=x

    • 입력 레코드의 첫 번째 레코드에서부터 몇 개의 레코드를 정렬할 것인지를 기술한다. 지정된 숫자 이후의 레코드들은 삭제(discard)된다.

    • x는 레코드의 개수를 의미한다.

    • 다음은 STOPAFT의 예제로 입력 데이터셋의 첫 번째 레코드부터 5번째 레코드까지를 제어 필드에 기술한 내용에 따라 정렬하고 나머지 레코드들은 삭제(discard)한다.

      SORT FIELDS=(1,7,CH,A),STOPAFT=5
  • CKPT

    • SORT나 COPY를 사용할 때 체크포인트를 지정하는 기능이다.

    • OpenFrame에서는 문법적 오류가 발생하지 않도록 형식적으로만 지원한다.

  • DYNALLOC [=([d][,n])]

    • 작업용 데이터셋을 동적으로 할당하는 기능이다.

    • 다음은 설정 항목에 대한 설명이다.

      항목 설명

      d

      동적 할당을 하는 장치 타입 또는 그룹명을 지정한다.

      n

      동적 할당을 하는 작업용 데이터셋의 개수를 지정한다.

    • OpenFrame에서는 문법적 오류가 발생하지 않도록 형식적으로만 지원한다.

  • EQUALS | NOEQUALS

    • 제어 필드의 내용이 모두 동일한 레코드들이 입력되었을 경우 출력 순서를 지정해준다.

    • 다음은 각 항목에 대한 설명이다.

      항목 설명

      EQUALS

      입력 순서대로 출력 순서가 결정(stable sort)된다. (별칭: SEQ)

      NOEQUALS

      입력 순서대로 출력된다는 보장이 없음(unstable sort)을 의미한다. (기본값)

  • Y2PAST | CENTWIN

    • 자세한 내용은 OPTION의 설명을 참조한다.

17. SUM

SORT/MERGE를 수행할 때 동일한 키 값을 가진 레코드들에 대해 주어진 필드의 값들은 모두 합치고 하나의 레코드로 합산한다. 합산된 후 하나의 레코드를 제외한 나머지 레코드들은 모두 삭제된다. 또한 키 값이 동일한 레코드들의 필드를 합산하지 않은 채 하나만 남기고 나머지 레코드들을 모두 삭제하는 기능도 제공한다.

사용법

다음은 SUM 문의 사용법이다.

SUM FIELDS=(p,m,f,[p,m,f[,...]])|(p,m[,p,m[,...]),FORMAT=f|NONE[,XSUM]
오퍼랜드

다음은 사용법에서 설명된 오퍼랜드에 대한 설명이다.

  • FIELDS

    • 입력 레코드를 합산하기 위한 키 필드를 지정한다.

    • 키 필드의 시작 위치와 길이, 형식을 결정할 수 있다.

    • 다음은 설정 항목에 대한 설명이다.

      항목 설명

      p

      합산을 수행할 필드의 시작 위치를 기술한다. 자세한 내용은 SORT의 'FIELDS' 오퍼랜드의 p 항목을 참조한다.

      m

      합산할 필드의 길이를 Byte 단위로 지정한다.

      f

      합산 필드의 형식을 지정한다.

      s

      제어 필드의 정렬 기준을 기술한다.

      • A(Ascending order) : 오름차순

      • D(Descending order) : 내림차순

      • E : 사용자 순서 변경(OpenFrame에서는 지원하지 않는다.)

    • 다음은 ZD 형식의 레코드를 시작점 10에서 10Bytes만큼 합산하는 예제이다.

      SUM FIELDS=(10,10,ZD)
  • FORMAT=f

    • 합산 필드들의 형식이 모두 같은 경우 필드 내에서 일일이 형식을 지정하지 않고 COND 문 뒤에서 FORMAT=f를 사용해 한꺼번에 지정해 줄 수 있다.

    • 다음은 10에서 2Bytes, 12에서 4Bytes, 16에서 8Bytes의 FI 형식의 레코드들을 합산하는 예제이다.

      SUM FIELDS=(10,2,12,4,16,8),FORMAT=FI

      OpenFrame에서는 제어 필드의 형식이 모두 일치하는 경우에만 FORMAT 옵션을 지정할 수 있다.

  • NONE

    • 레코드를 합산하지 않고 다만 동일한 키 값을 가진 레코드들을 하나만 남기고 모두 삭제할 때 사용한다.

    • 다음은 동일한 키 값을 가진 레코드들을 하나만 남기고 모두 삭제하는 예제이다.

      SUM FIELDS=NONE
  • XSUM

    • 동일한 키 값을 가진 레코드들 중 삭제되는 레코드를 DD명이 SORTXSUM인 데이터셋에 저장할 때 사용한다.

    • 다음은 동일한 키 값을 가진 레코드들 중 삭제되는 레코드를 DD명이 SORTXSUM인 데이터셋에 저장하는 예제이다.

      SUM FIELDS=NONE,XSUM
주의사항

다음은 SUM 문을 작성할 때 주의사항이다.

  • SORT/MERGE에서 NOEQUALS가 지정되어 있을 때는 어떤 레코드에 합산되고 어떤 레코드가 삭제되는지는 무작위에 따른다.

    • SORT의 경우 EQUALS가 지정되어 있을 때 먼저 입력된 레코드에 나머지 레코드들을 합산한다.

    • MERGE의 경우 EQUALS가 지정되면 SORTINnn에서 번호가 가장 작은 레코드에 합산되며 SORTINnn이 같은 경우에는 먼저 입력된 레코드에 합산된다.

  • SUM을 수행할 때 지정된 레코드 필드의 내용만 합산되고 다른 필드의 내용은 합산되지 않는다.

  • SUM을 수행할 때 오버플로우가 발생하면 합산되지 않는다. 합산되지 않은 레코드들은 삭제 또한 되지 않는다.