8.31 CREATE_SPACE

注意: 8.1 組み込み関数の規則      利用オプション

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

 

引数

番号

タイプ

必須/ 任意

記述

最小長

最大長

最小小数桁数

最大小数桁数

1

A

R

スペース名

名前の指定は必須です。

名前では、大文字と小文字は区別されません。

名前は、アスタリスク(*)またはブランク文字で始めることはできません。

1

256

 

 

 

 

戻り値

番号

タイプ

必須/ 任意

記述

最小長

最大長

最小小数桁数

最大小数桁数

1

A

O

標準戻りコード

OK:スペースが作成されたか、すでに存在する

ER:作成が失敗した。発行されるメッセージに失敗の原因が示されます。

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)