[ |../../index.htm#lansa/create_space.htm]
現在地:
9.31 CREATE_SPACE
注意: 9.1 組み込み関数の規則 利用オプション
指定した名前でスペース・オブジェクトを作成します。
引数
番号 |
タイプ |
必須/ 任意 |
記述 |
最小長 |
最大長 |
最小小数桁数 |
最大小数桁数 |
1 |
A |
R |
スペース名 |
1 |
256 |
|
|
戻り値
番号 |
タイプ |
必須/ 任意 |
記述 |
最小長 |
最大長 |
最小小数桁数 |
最大小数桁数 |
1 |
A |
O |
標準戻りコード |
2 |
2 |
|
|
技術上の注記
スペース・オブジェクトは、その名前によって、オペレーティング・システム・プロセス(またはジョブ)内で固有に識別されます(名前では、大文字と小文字は区別されません)。
スペース・オブジェクトは、オペレーティング・システム・プロセス(またはジョブ)間で共有することはできません。オペレーティング・システム・プロセスAおよびBが両方ともXという名前のスペース・オブジェクトを使用している場合は、スペース・オブジェクトXの固有の独立したインスタンスをそれぞれ使用していることになります。
スペース・オブジェクトは、永続的なものではありません。スペース・オブジェクトとそのデータ内容は、オーナーのオペレーティング・システム・プロセス(またはジョブ)が終了すると消滅します。
スペースのネーミングに関するアドバイスと技法
シンプルなRDMLファンクションのコンテキストでは、ほとんどの場合、現在のファンクションの名前に基づくネーミング規約を使用してください。
以下は、この場合のファンクションの動作サンプルです。
FUNCTION OPTIONS(*DIRECT) ********** COMMENT(Prototypical cells must be referenced) GROUP_BY NAME(#XG_SPACE) FIELDS(#EMPNO #SURNAME #GIVENAME) ********** COMMENT(Space name is based on function name and default) DEFINE FIELD(#SPACENAME) REFFLD(#FUNCTION) ********** COMMENT(Create space keyed cell EMPNO and with 2 data cells) USE BUILTIN(CREATE_SPACE) WITH_ARGS(#SPACENAME) USE BUILTIN(DEFINE_SPACE_CELL) WITH_ARGS(#SPACENAME EMPNO KEY) USE BUILTIN(DEFINE_SPACE_CELL) WITH_ARGS(#SPACENAME GIVENAME) USE BUILTIN(DEFINE_SPACE_CELL) WITH_ARGS(#SPACENAME SURNAME) ********** COMMENT(Don't forget to destroy the space when finished) USE BUILTIN(DESTROY_SPACE) WITH_ARGS(#SPACENAME)
複数のスペースを作成するフォームあるいはファンクションでは、スペース名に固有の識別子を付ける方法をお勧めします。
以下は、この技法によるコード・フラグメントの例です。
********** COMMENT(Name is longer and contains the function name) DEFINE FIELD(#EMPSPACE) REFFLD(#SYSVAR$AV) DEFAULT(*FUNCTION) DEFINE FIELD(#DEPSPACE) REFFLD(#SYSVAR$AV) DEFAULT(*FUNCTION) DEFINE FIELD(#SECSPACE) REFFLD(#SYSVAR$AV) DEFAULT(*FUNCTION) ********** COMMENT(During initialization/startup) USE BUILTIN(TCONCAT) WITH_ARGS(#EMPSPACE '.Emp') TO_GET(#EMPSPACE) USE BUILTIN(TCONCAT) WITH_ARGS(#DEPSPACE '.Dep') TO_GET(#DEPSPACE) USE BUILTIN(TCONCAT) WITH_ARGS(#SECSPACE '.Sec') TO_GET(#SECSPACE)
(もちろん、コンポーネント内では、スペース名に対して、*FUNCTIONではなく、*COMPONENTのデフォルトを使用するようになります。)
より複雑な環境では、別のインスタンスや同じロジックが前に実行されたことによって、スペースがすでに作成され、定義されているということもあり得ます。
そのような状況では、スペースの作成を試みる前に、スペースの存在検査を行ってください。以下の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の定義に基づきます。最初のセルは、スペースへのキーです。
Define #SpaceName *char 20 Use TConcat (*component '.EMP') (#SpaceName) Use Create_Space (#SpaceName) Use Define_Space_Cell (#SpaceName EmpNo Key) Use Define_Space_Cell (#SpaceName GiveName) Use Define_Space_Cell (#SpaceName SurName)
[ |../../index.htm#lansa/create_space.htm]