MFS 기능
본 장에서는 MFS의 주요 기능에 대해서 설명한다.
1. 동적 필드 속성 변경
화면에 표시되는 필드의 일반 속성과 확장 속성을 동적으로 변경하는 기능이다. 사용자 애플리케이션에서 변경할 속성 값들을 해당 필드의 앞에 추가해 전송하면 MFS에서 이를 해석하여 맵에 정의된 DFLD의 속성을 바꾸어 단말에 전송한다.
1.1. 일반 속성 변경
일반 속성 변경은 커서위치, 필드보호여부, 숫자/문자 필드 지정, 밝기 조정, 숨김 여부, MDT on 설정 여부 등을 설정할 수 있다. 이 기능을 사용하기 위해서는 MFLD 문의 "ATTR=YES"로 설정하고, 속성 데이터를 위해 LTH를 실제 데이터 길이보다 2Bytes 길게 정의해야 한다.
속성 데이터의 Bit 구성은 아래와 같다.
Byte | Bit | 설명 |
---|---|---|
0 |
0-1 |
현재 필드에 커서를 위치시킨다.
|
2-7 |
0으로 고정한다 . |
|
1 |
0 |
1로 고정한다. |
1 |
속성 변경 방법을 설정한다.
|
|
2 |
필드 보호 여부를 설정한다.
|
|
3 |
숫자/문자필드를 지정한다.
|
|
4-5 |
밝기를 설정한다.
|
|
6 |
라이트펜 관련 필드를 지정한다. (미지원) |
|
7 |
MDT를 설정한다.
|
1.2. 확장 속성 변경
확장 속성은 하이라이팅, 색상, 아웃라인을 변경할 수 있다. 이 기능을 사용하기 위해서는 MFLD 문의 ATTR=(,nn)을 설정하고, 변경 속성 당 2Bytes의 공간이 필요하므로 LTH를 실제 데이터의 길이에 nn*2를 더한 값으로 정의해야 한다. 속성 데이터는 ATTR Type(1Byte)+ATTR Value(1Byte)로 구성된다.
다음은 데이터 내용에 대한 설명이다.
-
하이라이팅, 색상
Type Value 설명 C1(하이라이팅)
X'00'
Default
X’F1'
HBLINK
X’F2'
HREV
X’F4'
HUL
C2(색상)
X'00'
Default
X’F1'
BLUE
X’F2'
RED
X’F3'
PINK
X’F4'
GREEN
X’F5'
TURQ
X’F6'
YELLOW
X’F7'
NEUTRAL
-
아웃라인
Type Bit 설명 03(아웃라인 대체) 04(아웃라인 첨가)
0-3
0으로 고정
4
Left line
5
Over line
6
Right line
7
Under line
X'00'
Default
1.3. 예제
다음은 CODE 필드의 일반 속성과 확장 속성 2개를 동적으로 변경하는 MFS 맵과 COBOL 프로그램의 예이다. CODE 필드는 비보호 필드로 정의되어 있었지만, COBOL 프로그램에서 X’C0E8’로 설정하였으므로 커서가 위치하는 보호필드에 문자의 색은 터키색으로, 윤곽선은 위아래로 표시된다.
<TEST001.TXT>
********************************************************************* TEST001 FMT DEV TYPE=(3270,2), X FEAT=IGNORE, X DSCA=X'00A0' ... CODE DFLD POS=(7,4), X LTH=10, X ATTR=(NOPROT,ALPHA,NORM,MOD) ... FMTEND ********************************************************************* TEST001I MSG TYPE=INPUT, X SOR=(TEST001,IGNORE), X NXT=TEST001O SEG MFLD 'TESTMPP1', X LTH=8 ... MSGEND ********************************************************************* TEST001O MSG TYPE=OUTPUT, X SOR=(TEST001,IGNORE), X NXT=TEST001I SEG ... MFLD CODE, X LTH=16,ATTR=(YES,2) ... MSGEND **********************************************************************
<TESTMPP1.cob>
ID DIVISION. PROGRAM-ID. TESTMPP1. AUTHOR. TMAXSOFT. DATA DIVISION. WORKING-STORAGE SECTION. ... 01 OUTPUT-MESSAGE-IO-AREA. 05 OM-LL PIC S9(3) COMP. 05 OM-Z1-Z2 PIC S9(3) COMP VALUE ZERO. 05 OM-MSG-DATA. ... 10 OM-OUT1. 15 OM-OUTFLD-DYNA-ATTR. 25 OM-OUTFLD-ATTR PIC X(2). 25 OM-OUTFLD-EATTR1 PIC X(2). 25 OM-OUTFLD-EATTR2 PIC X(2). 15 OM-OUTFLD-DATA PIC X(10). ... PROCEDURE DIVISION. ... * CURSOR ON, ATTR OVERRIDE, PROT, HIGH MOVE X'C0E0' TO OM-OUTFLD-ATTR. * COLOR: TURQ MOVE X'C2F5' TO OM-OUTFLD-EATTR1. * OUTLINE: OVER,RIGHT,UNDER MOVE X'0305' TO OM-DAMFLD-EATTR2. ...
1.4. 주의사항
OpenFrame은 ASCII 환경을 기반으로 하고 있지만, 속성 데이터는 문자 자체가 의미를 가진것이 아니고 각 비트가 의미를 가지고 있기 때문에 EBCDIC 환경에서 정의한 Hexa 값을 그대로 사용한다. 만약 사용자 애플리케이션에서 속성 데이터가 literal로 기술되어 있다면, 이를 EBCDIC Hexa 값으로 변경해야 정상적으로 동작한다.
예를 들어 어떤 필드에 커서를 위치시키고 NODISP 속성을 추가하는 동적 속성 변경 데이터를 EBCDIC 문자로 기술한 경우 아래처럼 전혀 다른 값으로 해석된다.
-
변경 전
... * CURSOR ON, NODISP MOVE '{d' TO OM-OUTFLD-ATTR. ...
'{d' 문자의 EBCDIC, ASCII 값 비교 -
변경 후
... * CURSOR ON, NODISP MOVE X'C084' TO OM-OUTFLD-ATTR. ...
2. 페이징
하나의 메시지는 멀티 세그먼트로 구성될수 있는데, 이 데이터는 한 가지 포맷으로 이루어져 있을 수도 있고 여러 가지 포맷으로 이루어져 있을 수도 있다. MFS에서는 두 가지 경우 모두 지원하며 싱글 포맷의 메시지를 브라우징하는것을 피지컬 페이징, 멀티 포맷의 메시지를 브라우징 하는것을 로지컬 페이징이라고 한다. 하나의 메시지에 로지컬과 피지컬 페이징을 모두 사용하는 경우도 있을 수 있다.
각 데이터의 구조와 멀티 포맷의 MFS 정의문은 어떻게 작성하는지 알아보도록 하겠다.
2.1. 싱글 포맷
보통 MOD는 하나의 SEG 문을 사용하지만, 여러 개의 SEG 문을 정의할 수도 있다.
MOD가 2개의 SEG 문으로 이루어져 있고, 애플리케이션에서 보낸 데이터가 5개의 세그먼트를 가지고 있다면, 아래 그림처럼 1개의 메시지를 3번에 나눠 출력한다. 첫 번째 화면(1,2번째 세그먼트 출력)에서 다음 데이터(3,4번째 세그먼트)를 보려면 PA1 버튼을 누르면 된다. 자세한 설명은 PA1, PA2 기능을 참고한다.
2.2. 멀티 포맷
업무에 따라서 하나의 메시지에 여러 포맷의 데이터를 보내야 하는 경우가 있을수 있다.
하나의 MFS 정의문에 각각의 화면을 정의하게 되는데, MOD에는 데이터를 구분할 조건과 해당하는 LPAGE 문, DOF에는 각 경우에 출력할 화면을 DPAGE 문 별로 정의하면, MFS에서 데이터와 LPAGE 문의 COND에 따라서 알맞은 화면을 출력한다. MFS가 해당 데이터가 어떤 LPAGE의 데이터인지 검사할 때, 맞는 조건이 없으면 마지막 LPAGE를 선택한다. 조건 검사에 사용하는 MFLD는 반드시 첫 번째 SEG에 위치해야 한다.
<TEST002.TXT>
********************************************************************* TEST002 FMT DEV TYPE=(3270,2), X FEAT=IGNORE, X DSCA=X'00A0' ... PAGEA DPAGE CURSOR=((3,2)) DFLD 'PRODUCT CODE:', X POS=(2,2), X ATTR=(PROT,ALPHA,HI,NOMOD) CODE DFLD POS=(3,2), X LTH=6, X ATTR=(NOPROT,NUM,NORM,MOD) ... PAGEB DPAGE CURSOR=((1,2)) DFLD 'ORDER LIST:', X POS=(2,2), X ATTR=(PROT,ALPHA,HI,NOMOD) ODATE1 DFLD POS=(3,2), X LTH=4, X ATTR=(PROT,ALPHA,HI,NOMOD) OLOCA1 DFLD POS=(3,7), X LTH=4, X ATTR=(PROT,ALPHA,HI,NOMOD) ONUMB1 DFLD POS=(3,12), X LTH=3, X ATTR=(PROT,ALPHA,HI,NOMOD) ... PAGEC DPAGE CURSOR=((1,2)) DFLD 'STOCK LIST:', X POS=(2,2), X ATTR=(PROT,ALPHA,HI,NOMOD) SLOCA1 DFLD POS=(3,2), X LTH=4, X ATTR=(PROT,ALPHA,HI,NOMOD) SNUMB1 DFLD POS=(3,7), X LTH=3, X ATTR=(PROT,ALPHA,HI,NOMOD) ... FMTEND ********************************************************************* TEST002I MSG TYPE=INPUT, X SOR=(TEST002,IGNORE), X NXT=TEST002O SEG MFLD 'TESTMPP2',LTH=8 ... MSGEND ********************************************************************* TEST002O MSG TYPE=OUTPUT, X SOR=(TEST002,IGNORE), X NXT=TEST002I PRODLP LPAGE SOR=PAGEA,COND=(LPAGEID,=,'A') SEG LPAGEID MFLD LTH=1 MFLD CODE,LTH=6 ... ORDRLP LPAGE SOR=PAGEB,COND=(LPAGEID,=,'B') SEG LPAGEID MFLD LTH=1 MFLD ODATE1,LTH=4 MFLD OLOCA1,LTH=4 MFLD ONUMB1,LTH=3,JUST=R ... STOCLP LPAGE SOR=PAGEC,COND=(LPAGEID,=,'C') SEG LPAGEID MFLD LTH=1 MFLD SLOCA1,LTH=4 MFLD SNUMB1,LTH=3,JUST=R ... MSGEND **********************************************************************
2.3. PA1, PA2 기능
한 번에 출력할 수 없는 메시지는 여러 페이지에 나눠서 출력하게 되는데, 이때 다음 페이지로 넘어가기 위해서 PA1 버튼을 사용한다. 만약 출력된 페이지가 메시지의 마지막 페이지이고 큐에 다음 메시지가 있다면, PA1을 누르면 다음 메시지의 첫 페이지가 출력된다. 큐에 다음 메시지가 없다면, 단말에는 현재 페이지가 그대로 남겨진다(변화없음).
PA2 버튼은 현재 보고있는 메시지를 큐에서 제거하고 다음 메시지의 첫 페이지를 를 보여준다. 큐에 다음 메시지가 없는데 PA2를 누르면, 현재 메시지는 Deq되고 단말에는 현재 페이지가 그대로 남아있게 된다(변화없음).
2.4. Z2 필드의 사용
MOD에 정의한 세그먼트 수에 맞추어 메시지를 구성한다면 출력 메시지의 Z2 필드는 신경쓰지 않아도 되지만, 애플리케이션에서 정의된 세그먼트를 다 채우지 않고 페이지를 끝내고 싶은 경우 다음 세그먼트의 Z2 필드에 X'40’을 설정해서 새로운 Logical Page의 시작을 MFS에 알려주어야 한다.
2.5. OLP(Operator Logical Paging) 기능
멀티 포맷의 맵을 정의할 때 MSG 문에 'PAGE=YES’를 설정하면, 메시지 내에서 특정 Logical Page로 이동하는 기능을 사용할 수 있다. 사용 방법은 입력 값의 제일 앞에 아래와 같은 값들이 위치하도록 하면 된다.
OLP | 설명 |
---|---|
=n, =nn, =nnn |
n에 해당하는 페이지로 이동한다. |
=+n, =+nn, =+nnn |
현재 페이지를 기준으로 n만큼 뒤에 있는 페이지로 이동한다. |
=-n, =-nn, =-nnn |
현재 페이지를 기준으로 n만큼 앞에 있는 페이지로 이동한다. |
n 하나가 숫자 하나에 해당한다. |