MFS機能

本章では、MFSの主要機能について説明します。

1. フィールド属性の動的変更

画面に表示されるフィールドの一般属性と拡張属性を動的に変更する機能です。ユーザー・アプリケーションで変更する属性値を該当するフィールドの前に追加して送信すると、MFSでこれを解釈し、マップに定義されたDFLDの属性を変更して端末に送信します。

1.1. 一般属性の変更

一般属性の変更は、カーソルの位置、フィールド保護の有無、数字/文字フィールドの指定、輝度の調整、隠しの有無、MDT on設定の有無などが指定できます。この機能を使用するには、MFLDステートメントの"ATTR=YES"に設定し、属性データのためにLTHを実データの長さより2バイト長く定義する必要があります。

属性データのビット構成は以下のとおりです。

figure 3 1
一般属性の変更:データのビット構成
バイト ビット 説明

0

0-1

現在のフィールドにカーソルを位置させます。

  • 00 : CURSOR OFF

  • 11 : CURSOR ON

2-7

0に固定します

1

0

1に固定します

1

属性の変更方法を設定します。

  • 0 : DFLDの属性のOR演算

  • 1 : DFLDの属性を代替

2

フィールド保護の有無を設定します。

  • 0 : NOPROT

  • 1 : PROT

3

数字/文字フィールドを指定します。

  • 0 : ALPHA

  • 1 : NUM

4-5

輝度を設定します。

  • 00 : NORM

  • 01 : NODISP

  • 10 : HIGH

  • 11 : HIGH

6

ライトペン関連のフィールドを指定します。(サポートされません)

7

MDTを設定します。

  • 0 : NOMOD(MDT OFFであり、データが変更された場合のみONになります)

  • 1 : MOD(MDTは常にON)

1.2. 拡張属性の変更

拡張属性は、強調表示、色、アウトラインを変更できます。この機能を使用するには、MFLDステートメントのATTR=(,nn)を設定します。各変更属性ごとに2バイトの領域が必要であるため、実際のデータの長さにnn*2を追加した値でLTHを定義する必要があります。属性データはATTRタイプ(1バイト)+ATTR値(1バイト)で構成されます。

以下は、データについての説明です。

  • 強調表示と色

    タイプ 説明

    C1(強調表示)

    X'00'

    デフォルト

    X’F1'

    HBLINK

    X’F2'

    HREV

    X’F4'

    HUL

    C2(色)

    X'00'

    デフォルト

    X’F1'

    BLUE

    X’F2'

    RED

    X’F3'

    PINK

    X’F4'

    GREEN

    X’F5'

    TURQ

    X’F6'

    YELLOW

    X’F7'

    NEUTRAL

  • アウトライン

    タイプ ビット 説明

    03(アウトラインの代替) 04(アウトラインの追加)

    0-3

    0に固定

    4

    Left line

    5

    Over line

    6

    Right line

    7

    Under line

    X'00'

    デフォルト

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環境で定義されたHex値をそのまま使用します。ユーザー・アプリケーションで属性データがリテラルで記述されている場合は、これをEBCDIC Hex値に変更する必要があります。

たとえば、特定のフィールドにカーソルを位置させ、NODISP属性を追加する動的属性変更データをEBCDIC文字で記述した場合は、以下のように全く異なる値として解釈されます。

  • 変更前

                  ...
          *      CURSOR ON, NODISP
                 MOVE '{d' TO OM-OUTFLD-ATTR.
                  ...
    figure 3 2
    '{d’文字のEBCDIC、ASCII値の比較
  • 変更後

                  ...
          *      CURSOR ON, NODISP
                 MOVE X'C084' TO OM-OUTFLD-ATTR.
                  ...

2. ページング

1つのメッセージはマルチ・セグメントで構成されます。このデータは1つのフォーマットで構成されていることもあれば、複数のフォーマットで構成されていることもあります。MFSでは両方に対応しており、シングル・フォーマットのメッセージをブラウジングすることを物理ページング、マルチ・フォーマットのメッセージをブランジングすることを論理ページングと呼びます。1つのメッセージに両方を使用する場合もあります。

各データの構造とマルチ・フォーマットのMFS定義ステートメントの作成方法について説明します。

2.1. シングル・フォーマット

通常MODは1つのSEGステートメントを使用しますが、複数のSEGステートメントを定義することもできます。

MODは2つのSEGステートメントで構成されており、アプリケーションから送信したデータが5つのセグメントを持っている場合は、以下の図のように1つのメッセージを3回に分けて出力します。最初の画面(1、2番目のセグメント出力)で次のデータ(3、4番目のセグメント)を確認するには、PA1ボタンを押します。詳細については、PA1とPA2を参照してください。

figure 3 3
シングル・フォーマット・メッセージの処理

2.2. マルチ・フォーマット

アプリケーションに応じて、1つのメッセージに複数のフォーマットのデータを送信する必要がある場合があります。

1つのMFS定義ステートメントに各画面を定義します。MODにはデータを区分する条件とLPAGEステートメントを、DOFには出力する画面をDPAGEステートメントごとに定義すると、データとLPAGEステートメントのCONDに従ってMFSで適切な画面を出力します。MFSが該当するデータがどのLPAGEのデータであるかをチェックする場合、適切な条件がなければ最後のLPAGEを選択します。条件チェックに使用するMFLDは、最初のSEGに位置する必要があります。

figure 3 4
マルチ・フォーマット・メッセージの処理

<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を押すと、現在のメッセージはデキューされ、端末には現在のページがそのまま残ります。(変化なし)

figure 3 5
PA1、PA2の実行例

2.4. Z2フィールドの使用

MODに定義したセグメントの数に合わせてメッセージを構成する場合は、出力メッセージのZ2フィールドは無視してもかまいません。ただし、アプリケーションで定義されたセグメントをすべて埋めずにページを終了する場合は、次のセグメントのZ2フィールドにX'40’を設定し、新しい論理ページの開始をMFSに通知する必要があります。

figure 3 6
出力メッセージの構造

2.5. OLP(Operator Logical Paging)機能

マルチ・フォーマットのマップを定義する際、MSGステートメントに’PAGE=YES’を設定すると、メッセージ内の特定の論理ページに移動する機能を使用できます。この機能を使用するには、入力値の先頭に次の値を配置します。

OLP 説明

=n, =nn, =nnn

nに該当するページに移動します。

=+n, =+nn, =+nnn

現在のページを基準にして「n」の分だけの後ろのページに移動します。

=-n, =-nn, =-nnn

現在のページを基準にして「n」の分だけの前のページに移動します。

1つのnは、1つの数字に対応します。

2.6. Operator control tables

制御関数を使用した論理ページ移動機能です。この機能は、次のバージョンでサポートされる予定です。