Natural プログラミングモード

このドキュメントでは、Natural で提供される 2 つのプログラミングモードについて説明します。

注意:
アプリケーションの構造がより明確になるため、通常はストラクチャードモードを排他的に使用することをお勧めします。したがって、『プログラミングガイド』の説明と例は通常、ストラクチャードモードのみを参照します。

以下のトピックについて説明します。


プログラミングモードの目的

Natural では次の 2 つのプログラミング方法が提供されます。

レポーティングモード

レポーティングモードが役に立つのは、複雑なデータやプログラミング構成を必要としない、アドホックレポートおよび小さなプログラムを作成する場合のみです。レポーティングモードでプログラムを作成すると、小さなプログラムが大きくなり、かつ複雑になりやすいので注意してください。

一部の Natural ステートメントはレポーティングモードでのみ使用できること、また、その他のステートメントはレポーティングモードで使用すると特別な構造になることに注意してください。レポーティングモードで使用可能なステートメントの概要については、『ステートメント』ドキュメントの「レポーティングモードのステートメント」を参照してください。

ストラクチャードモード

ストラクチャードモードは、明確で適切に定義されたプログラム構成で複雑なアプリケーションを実装するときに使用します。ストラクチャードモードの主な利点は、次のとおりです。

  • プログラムを構造化して記述する必要があるため、読みやすく、管理しやすくなります。

  • プログラムで使用するすべてのフィールドを、レポーティングモードでできるようなプログラム全体に散在させるのではなく、1 つの一元的な場所に定義する必要があるため、データの全体的な制御がはるかに容易になります。

ストラクチャードモードでは、実際のプログラムをコーディングする前に、より詳細な計画を立てる必要があります。このため、多くのプログラミングエラーや非効率な作業を回避できます。

ストラクチャードモードで使用可能なステートメントの概要については、『ステートメント』ドキュメントの「機能別ステートメント」を参照してください。

プログラミングモードの設定と変更

デフォルトのプログラミングモードは、Natural 管理者がプロファイルパラメータ SM で設定します。

設定されたモードは、システムコマンド GLOBALS とセッションパラメータ SM を使用して変更できます。

モード システムコマンド
Structured GLOBALS SM=ON
レポーティング GLOBALS SM=OFF

Natural のプロファイルおよびセッションパラメータ SM の詳細については、『パラメータリファレンス』の「SM - ストラクチャードモードでのプログラミング」を参照してください。

プログラミングモードの変更方法の詳細については、『パラメータリファレンス』の「SM - ストラクチャードモードでのプログラミング」を参照してください。

機能上の違い

レポーティングモードとストラクチャードモード間の機能上の主な違いは、次のとおりです。

注意:
これら 2 つのモード間の機能上の違いについては、『ステートメント』ドキュメントを参照してください。モードが区別されるステートメントごとに、個別の構文図と構文要素を説明しています。レポーティングモードで使用可能なステートメントの機能概要については、『ステートメント』ドキュメントの「レポーティングモードのステートメント」を参照してください。

ループおよび機能ブロックを閉じるための構文

レポーティングモード: (CLOSE) LOOP および DO ... DOEND ステートメントは、この目的のために使用されます。

END-... ステートメント(END-DEFINEEND-DECIDE および END-SUBROUTINE を除く)は使用できません。

ストラクチャードモード: すべてのループや論理構成は、対応する END-... ステートメントで明示的に閉じる必要があります。したがって、どのループまたは論理構成がどこで終わるかがすぐにわかります。

LOOP および DO/DOEND ステートメントは使用できません。

次の 2 つの例は、処理ループと論理条件の構成における 2 つのモードの違いを示しています。

レポーティングモードの例:

レポーティングモードの例では、DO ステートメントおよび DOEND ステートメントを使用して、AT END OF DATA 条件に基づくステートメントブロックの開始と終了を示しています。END ステートメントによって、アクティブな処理ループがすべて閉じます。

READ EMPLOYEES BY PERSONNEL-ID 
DISPLAY NAME BIRTH 
AT END OF DATA 
   DO 
      SKIP 2 
      WRITE / 'LAST SELECTED:' OLD(NAME) 
   DOEND 
END

ストラクチャードモードの例:

このストラクチャードモードの例では、END-ENDDATA ステートメントを使用して AT END OF DATA 条件を閉じ、END-READ ステートメントを使用して READ ループを閉じています。結果として、プログラムはさらに明確に構造化され、各構成がどこで開始し、どこで終了するかを即座に確認できます。

DEFINE DATA LOCAL 
1 MYVIEW VIEW OF EMPLOYEES 
  2 PERSONNEL-ID 
  2 NAME 
  2 BIRTH 

END-DEFINE 
READ MYVIEW BY PERSONNEL-ID 
   DISPLAY NAME BIRTH 
   AT END OF DATA 
      SKIP 2 
      WRITE / 'LAST SELECTED:' OLD(NAME) 
   END-ENDDATA 
END-READ  
END

レポーティングモードで処理ループを閉じる

処理ループを閉じるために、ENDLOOP(または CLOSE LOOP)または SORT ステートメントを使用できます。

LOOP ステートメントを使用すると複数のループを閉じることができ、END ステートメントを使用するとアクティブなすべてのループを閉じることができます。1 つのステートメントで複数のループを閉じることができるのは、ストラクチャードモードと基本的に異なる点です。

SORT ステートメントはすべての処理ループを閉じてから、別の処理ループを開始します。

例 1 - LOOP:

FIND ... 
   FIND ... 
   ... 
   ... 
   LOOP      /* closes inner FIND loop 
LOOP         /* closes outer FIND loop 
... 
...

例 2 - END:

FIND ... 
   FIND ... 
   ... 
   ... 
END             /* closes all loops and ends processing

例 3 - SORT:

FIND ... 
   FIND ... 
   ... 
   ... 
SORT ...        /* closes all loops, initiates loop 
... 
END             /* closes SORT loop and ends processing

ストラクチャードモードで処理ループを閉じる

ストラクチャードモードでは、それぞれの処理ループに対してループを閉じるための特定のステートメントを使用します。END ステートメントで処理ループを閉じることはできません。SORT ステートメントの前にEND-ALL ステートメントを指定する必要があり、SORT ループは END-SORT ステートメントで閉じる必要があります。

例 1 - FIND:

FIND ... 
   FIND ... 
   ... 
   ... 
   END-FIND       /* closes inner FIND loop 
END-FIND          /* closes outer FIND loop 
...

例 2 - READ:

READ ... 
   AT END OF DATA 
   ... 
   END-ENDDATA 
   ... 
END-READ           /* closes READ loop 
... 
... 
END

例 3 - SORT:

READ ... 
   FIND ... 
   ... 
   ... 
END-ALL         /* closes all loops 
SORT            /* opens loop 
... 
... 
END-SORT        /* closes SORT loop 
END

プログラム内のデータ要素の位置

レポーティングモードでは、DEFINE DATA ステートメントで定義する必要なくデータベースフィールドを使用することができるうえ、プログラムのどこにでもユーザー定義変数を定義できるので、ユーザー定義変数をプログラム全体に散在させることができます。

ストラクチャードモードでは、使用するすべてのデータ要素を 1 つの一元的な場所、つまりプログラムの先頭の DEFINE DATA ステートメント またはプログラム外部のデータエリアに定義する必要があります。

データベース参照

レポーティングモード:

レポーティングモードでは、データベースフィールドとデータ定義モジュール(DDM)は、データエリアにあらかじめ定義しておかなくても参照できます。

ストラクチャードモード:

ストラクチャードモードでは、使用する各データベースフィールドを、「フィールド定義」および「データベースアクセス」で説明されているように、DEFINE DATA ステートメントに指定する必要があります。