Formula文

Formula文を使用して、Formulaに実行させる操作を指示します。文を使用するには、文のタイプや正しい順序、文のグループ化に関する知識が必要です。

文のタイプ

次に、Formulaで使用できる命令用の文を示します。

文の形式

説明および例

ALIAS

ALIAS name1 AS name2

データベース・アイテムまたはグローバル値に別の名前を付与します。アプリケーションから提供されたデータベース・アイテム名が長すぎて、Formulaで使用できない場合があります。

ALIAS文を使用してデータベース・アイテムの名前を短縮できます。ALIASの作成後は、これをデータベース・アイテム名のかわりに使用します。別名は、短い名前のローカル変数にデータベース・アイテムを代入するよりも効率的です。

ALIAS OVERTIME_QUALIFYING_LENGTH_OF_SERVICE AS OT_QLS

ASSIGNMENT

variable = expression

array[index] = expression

変数、または配列変数の索引の位置に式値を代入します。Formulaは文の右側にある式を評価します。その結果を左側に指定されている変数に格納します。Formulaではローカル変数の値しか変更できないため、代入文の左側には常にローカル変数を指定してください。

"CHANGE_CONTEXTS"文の中では、コンテキストにのみ値を代入します。"CHANGE_CONTEXTS"文の外側では、入力、出力およびローカル変数にのみ値を代入します。

RATE = HOURLY_RATE + 14
WAGE = HOURS_WORKED * RATE

CHANGE_CONTEXTS

(context1 = expression1 [,context2 = expression2 ]

Formula内の1つ以上のコンテキストを変更します。"CHANGE_CONTEXTS"文内で、ASSIGNMENT文を使用して新しい値を代入します。

CHANGE_CONTEXTS(AREA1 = TAX_REPORTING_UNIT_INCOME_TAX_JURISDICTION_GEOGRAPHY_ID)
(
  CHANGE_CONTEXTS(DEDUCTION_TYPE = 'SBJ_TO_REGULAR_TAX')
  (
    L_TAXATION_METHOD = 'NONE'
    EXECUTE('TAXABILITY_RULE_EXISTS')
    IF GET_OUTPUT('TR_EXISTS', 'N') = 'Y' THEN
      L_TAXATION_METHOD = 'REGULAR_TAX'
  ) /* DEDUCTION_TYPE context change undone here. */
) /* AREA1 context change undone here. */

DEFAULT

DEFAULT FOR variable IS literal

DEFAULT_DATA_VALUE FOR variable IS literal

DEFAULT FOR文は、次の状況のときにFormulaが入力またはデータベース・アイテムとして使用する値を提供します。

  • 入力で値が代入されなかった。

  • データベースからデータベース・アイテムの値を取得できなかった。

  • 非配列データベース・アイテムの値がNULLである。

DEFAULT_DATA_VALUE FOR文は、配列データベース・アイテムで個々のデータ値がNULLである場合に使用する値を提供します。

一部のデータベース・アイテムはデフォルト値を必要とします。データベースからデータが返されなかったり、NULL値が返されたりすることがあるためです。

DEFAULT FOR HOURLY_RATE IS 3.00
INPUTS ARE HOURLY_RATE
X = HOURS_WORKED * HOURLY_RATE

EXIT

EXIT

囲んでいるWHILEループをただちに終了します。EXIT文はWHILEループの外側では使用できません。

FOUND = -1 /* -1 is not a valid index for A. */
I = A.FIRST(-1)
WHILE (A.EXISTS(I)) LOOP
(
  /* EXIT-clause for early exit. */
  IF A[I] = KEY THEN
  (
    FOUND = I
    /* Exit the loop. */
    EXIT;
  )
  I = A.NEXT(I,-1)
)

FORMULA CALLING FORMULA

SET_INPUT(input [,value]): 非呼出し側Formulaに入力値またはコンテキスト値を設定します。

EXECUTE(formula): 被呼出し側Formulaを実行します。

GET_OUTPUT(output, default-value): 非呼出し側Formulaから返された値を取得します。

IS_EXECUTABLE(formula): Formulaが実行可能かどうかをテストします。

あるFormulaから別のFormulaを呼び出します。たとえば、あるFormulaから共通の計算を実行する小さいFormulaを呼び出せます。この方法を使用することで、Formulaが長くなるのを回避できます。

SET_INPUT('UNIT','Hourly')
EXECUTE('RATE_FORMULA')
HOURLY_RATE = GET_OUTPUT('RATE',0.0)
WAGE = HOURS_WORKED * HOURLY_RATE
RETURN WAGE

IF

IF condition THEN statements

IF condition THEN statements ELSE statements

条件がtrueの場合に、1つまたは複数の文を実行します。条件がfalseの場合に実行する文のセットを指定する場合は、IF ELSE文を使用します。

IF (AGE < 20) THEN
  TRAINING_ALLOWANCE = 30
ELSETRAINING_ALLOWANCE = 40

INPUT

INPUTS ARE input1 [,input2]

Formulaの入力変数を列挙します。INPUT文はFormula内に1つしかありません。

INPUTS ARE HOURS_WORKED
WAGE = HOURS_WORKED * HOURLY_RATE
RETURN WAGE

RETURN

RETURN [ output1 ] [,output2]

Formulaの実行をただちに停止します。呼出し側に返す値がある場合は、Formulaを停止するRETURN文内にFormula出力変数を入力する必要があります。

Formula内には複数のReturn文を入力できます。

INPUTS ARE HOURS_WORKED
IF HOURS_WORKED <= 10 THEN(
  RETURN
  /* This is ignored. */
  BONUS = 10
)
/* This is executed if HOURS_WORKED > 10. */
BONUS = 50
RETURN BONUS

WHILE

WHILE condition LOOP statements

1つの条件がtrueの間は多くの文が繰り返し実行されます。

WHILE文のループで実行される反復が多すぎると、無限ループを防ぐためにエラーが発生します。

/* -1234 is not a valid index for A in this instance, so use as default. */
NI = A.FIRST(-1234)
WHILE A.EXISTS(NI) LOOP
  VA = A[NI] /* Do some processing with element at index NI. */
  NI = A.NEXT(NI,-1234) /
 Go to next index. */
)

WORKING STORAGE

WSA_DELETE([item]) - ストレージ領域から値を削除します。

WSA_EXISTS(item[,type]) - アイテムが存在するかどうかを判断します。

WSA_GET(item, value) - ストレージ領域から値を取り出します。

WSA_SET(item, value) - ストレージ領域から値を設定します。

参照データを格納します。これらのデータを設定、取出しまたは削除できます。

/* Formula: RATE_SETTER */
WSA_SET('RATE:HOURLY1',3.5)
WSA_SET('RATE:HOURLY2',4.0)
WSA_SET('RATE:HOURLY3',4.5)
WSA_SET('RATE_FLAG','Y') /* Flag to say that the rates have been set. */

文の順序

次の順序で文をFormulaに配置します。

  1. ALIAS文(ある場合)

  2. DEFAULT文(ある場合)

  3. INPUT文(ある場合)

  4. その他の文

文のグループ化

IF/THEN文、ELSE句、WHILEループ、CHANGE_CONTEXTSの中で複数の文をグループ化するには、文のグループをカッコで囲みます。カッコがない場合、先行する文は最初の文にしか適用されません。

文をグループ化できる方法の例を次に示します。

I = A.FIRST
WHILE (A.EXISTS(I)) LOOP
(
  A[I] = I
  I = A.NEXT(I,-1)
)

文をグループ化できていない方法の例を次に示します。

I = A.FIRST
WHILE (A.EXISTS(I)) LOOP
  A[I] = I
  I = A.NEXT(I,-1) /* This is not executed as part of the loop. */