VariableArray型プロパティは,データ型がObject型で,基本単位がVariableArray型のプロパティです。VariableArray型プロパティの値は,複数の要素から構成される可変長配列です。
ここでは,VariableArray型プロパティの値である可変長配列の操作方法およびVariableArray型プロパティの操作方法について説明します。
ここでは,VariableArray型プロパティを操作するクラスであるCdbrVariableArrayクラスとCdbrCompoundクラスについて説明します。
CdbrVariableArrayクラスは,可変長配列全体のデータを格納するために使用するクラスです。
配列の各要素は,0~(要素数-1)のインデクスで指定します。
要素数は,次のどちらかの方法で変更します。
また,VariableArray型プロパティを参照,設定する場合,CdbrCompoundオブジェクトだけが要素として使用できます。
CdbrVariableArrayクラスで使用するメソッドについては,マニュアル「DocumentBroker Version 3 クラスライブラリ C++ リファレンス 基本機能編」を参照してください。
なお,このクラスに対応するDMAのクラスはありません。ただし,VariableArray型プロパティは,データベースではDMAオブジェクトのedmClass_VariableArrayクラスのオブジェクトとして定義されています。したがって,CdbrVariableArrayオブジェクトに設定した情報は,PutPropertyValuesメソッドをコールした時に,DMAオブジェクトのVariableArray型プロパティを表すedmClass_VariableArrayOfObjectクラスのオブジェクトの情報としてコピーされます。
複合データを表すクラスです。複合データとは,複数の異なる型によって表されるデータです。VariableArray型プロパティの要素の値を格納するために使用します。
各要素は,DmaId型の識別子で指定します。この識別子は,CdbrCompound::SetValueメソッドをコールした時に設定したものです。可変長配列の操作では,この識別子はDMAオブジェクトのedmClass_Structクラスのサブクラスに定義したプロパティのプロパティ識別子になります。
CdbrCompoundクラスで使用するメソッドについては,マニュアル「DocumentBroker Version 3 クラスライブラリ C++ リファレンス 基本機能編」を参照してください。
なお,このクラスには,対応するDMAのクラスはありません。ただし,VariableArray型プロパティの要素は,データベースではDMAオブジェクトのedmClass_Structクラスのオブジェクトとして定義されています。したがって,CdbrCompoundオブジェクトに設定した情報は,PutPropertyValuesメソッドをコールした時に,DMAオブジェクトのVariableArray型プロパティの要素を表すedmClass_Structオブジェクトの情報としてコピーされます。
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メソッドをコールします。
VariableArray型プロパティを設定する手順を示します。
VariableArray型プロパティを取得する手順を示します。
ここでは,VariableArray型プロパティを操作する場合のコールシーケンスを示します。
可変長配列を作成してVariableArray型プロパティの値を設定するコールシーケンスの例を次に示します。ここでは,Memberプロパティの要素として,管理者「日立太郎」の情報を設定します。
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();
可変長配列の要素は,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();
可変長配列のすべての要素を一括して削除するには,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();
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();