2.6.7 VariableArray型プロパティの操作

VariableArray型プロパティは,データ型がObject型で,基本単位がVariableArray型のプロパティです。VariableArray型プロパティの値は,複数の要素から構成される可変長配列です。

ここでは,VariableArray型プロパティの値である可変長配列の操作方法およびVariableArray型プロパティの操作方法について説明します。

<この項の構成>
(1) VariableArray型プロパティを操作するクラス
(2) VariableArray型プロパティの操作手順
(3) VariableArray型プロパティを操作するコールシーケンス

(1) VariableArray型プロパティを操作するクラス

ここでは,VariableArray型プロパティを操作するクラスであるCdbrVariableArrayクラスとCdbrCompoundクラスについて説明します。

(a) CdbrVariableArrayクラス

CdbrVariableArrayクラスは,可変長配列全体のデータを格納するために使用するクラスです。

配列の各要素は,0~(要素数-1)のインデクスで指定します。

要素数は,次のどちらかの方法で変更します。

また,VariableArray型プロパティを参照,設定する場合,CdbrCompoundオブジェクトだけが要素として使用できます。

CdbrVariableArrayクラスで使用するメソッドについては,マニュアル「DocumentBroker Version 3 クラスライブラリ C++ リファレンス 基本機能編」を参照してください。

なお,このクラスに対応するDMAのクラスはありません。ただし,VariableArray型プロパティは,データベースではDMAオブジェクトのedmClass_VariableArrayクラスのオブジェクトとして定義されています。したがって,CdbrVariableArrayオブジェクトに設定した情報は,PutPropertyValuesメソッドをコールした時に,DMAオブジェクトのVariableArray型プロパティを表すedmClass_VariableArrayOfObjectクラスのオブジェクトの情報としてコピーされます。

(b) CdbrCompoundクラス

複合データを表すクラスです。複合データとは,複数の異なる型によって表されるデータです。VariableArray型プロパティの要素の値を格納するために使用します。

各要素は,DmaId型の識別子で指定します。この識別子は,CdbrCompound::SetValueメソッドをコールした時に設定したものです。可変長配列の操作では,この識別子はDMAオブジェクトのedmClass_Structクラスのサブクラスに定義したプロパティのプロパティ識別子になります。

CdbrCompoundクラスで使用するメソッドについては,マニュアル「DocumentBroker Version 3 クラスライブラリ C++ リファレンス 基本機能編」を参照してください。

なお,このクラスには,対応するDMAのクラスはありません。ただし,VariableArray型プロパティの要素は,データベースではDMAオブジェクトのedmClass_Structクラスのオブジェクトとして定義されています。したがって,CdbrCompoundオブジェクトに設定した情報は,PutPropertyValuesメソッドをコールした時に,DMAオブジェクトのVariableArray型プロパティの要素を表すedmClass_Structオブジェクトの情報としてコピーされます。

(2) VariableArray型プロパティの操作手順

CdbrVariableArrayクラスとCdbrCompoundクラスを使用したVariableArray型プロパティの操作手順を説明します。

ここでは,文書またはコンテナに定義された「Member」というVariableArray型プロパティを例にして説明します。このプロパティは,文書やコンテナの管理者情報を格納するために使用します。管理者情報としては,「Name」と「Age」があります。

Memberプロパティを次の図に示します。

図2-6 VariableArray型プロパティの例

[図データ]

Memberプロパティは,CdbrVariableArrayクラスのオブジェクトとして作成します。CdbrVariableArrayオブジェクトは,管理者の人数分のCdbrCompoundオブジェクトを要素として持っています。一人の管理者の情報は,一つのCdbrCompoundオブジェクトに対応します。管理者のそれぞれの情報(名前:Nameおよび年齢:Age)は,CdbrCompoundオブジェクトのプロパティに対応します。

CdbrCompoundオブジェクトのプロパティの操作は,CdbrCompoundクラスのメソッドによって実行します。プロパティを設定したCdbrCompoundオブジェクトは,CdbrVariableArrayクラスのメソッドによってCdbrVariableArrayオブジェクトの要素として設定することで,VariableArray型プロパティの要素の一つになります。

CdbrVariableArrayオブジェクトとして作成された可変長配列は,Object型の値として扱います。プロパティの値として設定する場合は,プロパティ構造体(SDBR_PROP構造体)にObject型の値として設定します。VariableArray型プロパティの値を設定する場合には,このプロパティ構造体を引数としてPutPropertyValuesメソッドをコールします。

(a) VariableArray型プロパティ設定の手順

VariableArray型プロパティを設定する手順を示します。

  1. 複合データを表すCdbrCompoundオブジェクトを作成し,値を設定します。
    複合データの値は,CdbrCompound::SetValueメソッドをコールして設定します。
  2. 可変長配列を表すCdbrVariableArrayオブジェクトを作成し,可変長配列の要素数を設定します。
    可変長配列の要素数は,CdbrVariableArray::Resizeメソッドをコールして設定します。
  3. CdbrCompoundオブジェクトをCdbrVariableArrayオブジェクトの要素として設定します。
    CdbrVariableArray::SetValueメソッドをコールします。
  4. CdbrVariableArrayオブジェクトのアドレスをポインタ(CdbrVariableArray*型の変数)に格納します。
  5. 4.のポインタのアドレスをSDBR_PROP構造体(プロパティ構造体)のuniValue.ppObjectに設定します。
    ここで指定するアドレスは,CdbrVariableArrayオブジェクトのポインタではありませんので,注意してください。
    この操作によって,可変長配列のアドレスがuniValue.ppObject[0]に設定されます。
  6. 5.のSDBR_PROP構造体を,SDBR_PROPLIST構造体(プロパティリスト構造体)に格納しPutPropertyValuesメソッドで引数に指定して,メソッドをコールします。
(b) VariableArray型プロパティ取得の手順

VariableArray型プロパティを取得する手順を示します。

  1. GetPropertyValuesメソッドなどの,プロパティを取得するメソッドをコールします。
    取得したプロパティ構造体の値のデータ型がObject型(lType = DMA_DATATYPE_OBJECT)であり,かつ基本単位がVariableArray型(lCardinality = EDM_DMA_CARDINALITY_VARRAY)である場合,メンバuniValue.ppObject[0]にCdbrVariableArrayクラスのオブジェクトへのポインタが格納されます。
  2. CdbrVariableArray::GetValueメソッドの引数に,可変長配列の要素のインデクスを指定して,メソッドをコールします。
    VariableArray型プロパティから取得したCdbrVariableArrayオブジェクトの要素のデータ型は,複合データ型(DBR_DATATYPE_COMPOUND)です。CdbrCompoundクラスの変数のアドレスを指定します。
  3. 複合データ型からの値を,CdbrCompound::GetValueメソッドにプロパティ識別子を指定して,取得します。

(3) VariableArray型プロパティを操作するコールシーケンス

ここでは,VariableArray型プロパティを操作する場合のコールシーケンスを示します。

(a) 新しく可変長配列を作成してVariableArray型プロパティの値を設定する

可変長配列を作成してVariableArray型プロパティの値を設定するコールシーケンスの例を次に示します。ここでは,Memberプロパティの要素として,管理者「日立太郎」の情報を設定します。

可変長配列を作成してVariableArray型プロパティの値を設定するコールシーケンス

CdbrCompound  CompoValue;
CdbrVariableArray  VArray(DBR_DATATYPE_COMPOUND);
SDBR_PROP Prop;
SDBR_PROPLIST PropList;
Dmapv pObj;
//要素となる複合データの値を設定する
CompoValue.SetValue(&usrProp_Name, "日立太郎");
CompoValue.SetValue(&usrProp_Age, 25L);
//可変長配列の要素数を設定する
VArray.Resize(1);
//可変長配列の一つ目の要素にCompoValueの値を設定する
VArray.SetValue(0,CompoValue);
//可変長配列をプロパティ構造体に設定する
Prop.lType = DMA_DATATYPE_OBJECT;
Prop.lCardinality = EDM_DMA_CARDINALITY_VARRAY;
Prop.lCount = 1;
pObj = &VArray;
Prop.uniValue.ppObject = &Obj;
Proplist.pItem = &Prop;
Proplist.lCount = 1;
//プロパティをオブジェクトに設定する
ObjDoc.PutPropertyValues(&PropList);
ObjDoc.ReleaseObject();
pSession->Commit();

(b) 可変長配列の要素を追加および削除する

可変長配列の要素は,CdbrVariableArray::Addメソッドによって追加できます。追加した要素は,可変長配列の末尾に追加されます。

また,可変長配列の要素の削除は,CdbrVariableArray::Deleteメソッドで,引数に削除する要素のインデクスを指定して実行します。削除された要素以降の要素は,前に詰まります。

可変長配列の要素数を追加および削除するコールシーケンスの例を次に示します。ここでは,Memberプロパティの要素として,二人分の管理者情報を追加します。その後,先頭の要素を削除します。

要素を追加および削除するコールシーケンス

CdbrVariableArray  VArray(DBR_DATATYPE_COMPOUND);
//要素を作成する
CdbrCompound CompoValue1,CompoValue2;
CompoValue1.SetValue(&usrProp_Name, "鈴木一郎");
CompoValue1.SetValue(&usrProp_Age, 28L);
CompoValue2.SetValue(&usrProp_Name, "山田二郎");
CompoValue2.SetValue(&usrProp_Age, 35L);
//可変長配列に要素を二つ追加する
VArray.Add(CompoValue1);
VArray.Add(CompoValue2);
//先頭の要素を削除する
VArray.Delete(0);
//可変長配列をプロパティ構造体に設定する
Prop.lType = DMA_DATATYPE_OBJECT;
Prop.lCardinality = EDM_DMA_CARDINALITY_VARRAY;
Prop.lCount = 1;
pObj = &VArray;
Prop.uniValue.ppObject = &Obj;
Proplist.pItem = &Prop;
Proplist.lCount = 1;
//オブジェクトのプロパティを更新して
//要素の追加・削除をVariableArray型プロパティに
//反映させる
ObjDoc.PutPropertyValues(&Proplist);
ObjDoc.ReleaseObject();
pSession->Commit();

(c) 可変長配列のすべての要素を削除する

可変長配列のすべての要素を一括して削除するには,CdbrVariableArray::Resizeメソッドによって要素数に0を指定します。要素数0の可変長配列をVariableArray型プロパティに設定すると,VariableArray型プロパティのすべての要素が削除されます。

すべての要素を削除するコールシーケンスの例を次に示します。

すべての要素を削除するコールシーケンス

CdbrDocument Obj;
CdbrVariableArray VArray(DBR_DATATYPE_COMPOUND);
SDBR_PROP Prop;
SDBR_PROPLIST PropList;
Dmapv pObj;

pSession->Begin();
Obj.SetOIID(pSession,pOIID);
//要素の数を0にする
pVArray->Resize(0);
//要素を削除した可変長配列をプロパティ構造体に設定する
//...
//オブジェクトのプロパティを更新する
//VariableArray型のプロパティの要素はすべて削除される
Obj.PutPropertyValues(&PropList);
Obj.ReleaseObject();
pSession->Commit();

(d) VariableArray型プロパティの取得

VariableArray型プロパティの値を取得する場合のコールシーケンスの例を次に示します。

VariableArray型プロパティの値を取得するコールシーケンス

CdbrDocument ObjDoc;
SDBR_PROPDEF    Propdef;
SDBR_PROPLIST*  pPropList;
SDBR_PROP*      pProp;
pDmaString_T    pName;
DmaInteger32    lAge;
CdbrVariableArray* pVArray;
CdbrCompound       CompoValue;
Propdef.PropId = usrProp_Member;
pSession->Begin();
ObjDoc.SetOIID(pSession, pOIID);
ObjDoc.GetPropertyValuesAndLock(1,&Propdef,&pPropList,
                               DMA_LOCK_WRITE);
//プロパティの型の記号定数がDMA_DATATYPE_OBJECTであり
//プロパティの基本単位がEDM_DMA_CARDINALITY_VARRAYである
//要素を判定し,型を取得する
//...
pVArray = (CdbrVariableArray*) pProp->uniValue.ppObject[0];
//要素の型がDMA_DATATYPE_COMPOUNDである
//複合データを判定する
//...
//値を取得する
pVArray->GetValue(0,&CompoValue);
//usrProp_Nameプロパティの値を取得する
CompoValue.GetValue(&usrProp_Name, &pName);
//usrProp_Ageプロパティの値を取得する
CompoValue.GetValue(&usrProp_Age, &lAge);
ObjDoc.ReleaseObject();
pSession->Commit();