Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

9.31 CREATE_SPACE

Note
title注意

 9.1 組み込み関数の規則     利用オプション

指定した名前でスペース・オブジェクトを作成します。

...

そのような状況では、スペースの作成を試みる前に、スペースの存在検査を行ってください。以下のRDMLXコード・フラグメントに示されているような技法を使用することができます。

     Define #SpaceName RefFld(#SysVar$Av) Default(*Component)
    Define #SpaceRC *Char 2
    Def_Cond *NoSpace '#SpaceRC *ne OK'
 
    EvtRoutine Handling(#Com_Owner.CreateInstance)
    Use Space_Operation (#SpaceName CheckExistence) (#SpaceRC)
    If *NoSpace
    Use Create_Space (#SpaceName)
    Use Define_Space_Cell (#SpaceName EmpNo Key)
    Use Define_Space_Cell (#SpaceName SurName)
    Use Define_Space_Cell (#SpaceName GiveName)
    Endif
    EndRoutine

これ以上に複雑な複数インスタンスのRDMLXコンポーネントでは、コンポーネントのそれぞれのインスタンスに対して固有のスペースが必要になる場合があります(スペースは、名前によって固有に識別されることを忘れないでください)。 

以下のような技法を使用することができます。

     Define #SpaceName RefFld(#SysVar$Av) Default(*Component)
    Define #SpaceRC *Char 2
    Def_Cond *NoSpace '#SpaceRC *ne OK' 
    EvtRoutine Handling(#Com_Owner.CreateInstance)
    Invoke #Com_Owner.CreateUniqueSpace ReturnName(#SpaceName)
    Use Define_Space_Cell (#SpaceName EmpNo Key)
    Use Define_Space_Cell (#SpaceName SurName)
    Use Define_Space_Cell (#SpaceName GiveName)
    EndRoutine
    MthRoutine CreateUniqueSpace
    Define_Map *Output #SysVar$av #ReturnName
    Define #TempName RefFld(#SpaceName)
    Define #TempChar *Char 10
    Define #TempNum RefFld(#Date) Length(10) Decimals(0) edit_code(4) default(0) To_Overlay(#TempChar)
    Begin_Loop Using(#TempNum)
    Use TConcat  (*Component '.' #TempChar) (#TempName)
    Use Space_Operation (#TempName CheckExistence) (#SpaceRC)
    Leave *NoSpace
    End_Loop
    Use Create_Space (#TempName)
    Set #ReturnName Value(#TempName)
    EndRoutine

その他のヒント、技法、アドバイス 

何回も繰り返されるコマンドでは、絶対に必要な場合を除いて、マッピング値としてビジュアルに定義されたフィールドを使用することは避けてください。フィールドがビジュアルに定義されている場合、値へ、または値からのマッピングを行うと、ベースとなるビジュアル・コンテキストのために処理速度が著しく低下します。 

例えば、社員のスペース(およそ125,000行あります)内で、行の合計数を数える場合のことを考えてみましょう。 

以下のようにコーディングする場合があります。

     Def_Cond *Okay '#SpaceRC = OK'
    Change #EmpTotal 0
    Use Select_in_Space #Space (#SpaceRc #EmpNo #GiveName #SurName)
    DoWhile *okay
    Change #EmpTotal '#EmpTotal + 1'
    Use SelectNext_in_Space #Space (#SpaceRc #EmpNo #GiveName #SurName)
    EndWhile

#Space、#SpaceRc、#EmpNo、#GiveName、#SurNameフィールドのいずれか1つがビジュアル・コンテキスト内に(すなわち、DEFINE_COMの一部として)定義されている場合、値を125,000回マッピングするため、このループのパフォーマンスに悪影響が生じます。 

#EmpNo、#GiveName、#SurNameが1つのビジュアル・コンテキスト内に定義されていれば、以下のようにして、このロジックのパフォーマンスを向上させることができます。

     Def_Cond *Okay '#SpaceRC = OK'
    Change (EmpTotal 0
    Use Select_in_Space #Space (#SpaceRc)
    DoWhile *okay
    Change #EmpTotal '#EmpTotal + 1'
    Use SelectNext_in_Space #Space (#SpaceRc)
    EndWhile

または、以下のように実行することもできます。

     Def_Cond *Okay '#SpaceRC = OK'
    Define #XEmpNo RefFld(#EmpNo)
    Define #XGiveName RefFld(#GiveName)
    Define #XSurName RefFld(#SurName); 
    Change (EmpTotal 0
    Use Select_in_Space #Space #SpaceRc #XEmpNo #XGiveName #XSurName)
    DoWhile *okay
    Change #EmpTotal '#EmpTotal + 1'
    Use SelectNext_in_Space #Space (#SpaceRc #XEmpNo #XGiveName #XSurName)
    EndWhile

このサンプルは、現在のコンポーネント名+".emp"という名前のスペースを作成して、その中に3つのセルを定義するものです。3つのセルのタイプと長さは、それぞれEMPNO、GIVENAME、SURNAMEの定義に基づきます。最初のセルは、スペースへのキーです。

...