最近のアクセス:
GAM エンティティプロパティの拡張性

GAM API には、OAV パターンを使用して GAM データベース内の GAM エンティティのプロパティを拡張するメソッドが用意されています。
つまり、GAM データベース内にある GAMUser テーブルの項目属性は、新しい項目属性を追加して拡張できます。再編成は必要ありません。
同様に、ロールアプリケーションアクセス許可リポジトリなど、ほかの GAM エンティティも、シナリオに合わせて動的にプロパティを拡張できます。

GAMUser テーブルの項目属性の拡張性

既定では GAMUser テーブルに含まれていない「Company」や「Telephones」などの項目属性を、GAMUser テーブルに動的に追加できるようにすることが目的です。GAMUser 外部オブジェクト ([ Enable Integrated Security ] プロパティが True に設定されている場合に統合される GAM ライブラリの一部) によって提供されるメソッドを使用すると、GAM User テーブル内で項目属性を動的に追加、更新、削除できます。この動的な項目属性は、GAMUserAttribute データタイプとして表されます。GAMUserAttribute も GAM ライブラリフォルダに含まれる外部オブジェクトです。
次に、これらのオブジェクト、およびオブジェクトが提供するメソッドについて詳しく見ていきます。また、これらの機能を使用する方法の例も確認します。

GAMUserAttribute オブジェクト

GAMUserAttribute は外部オブジェクトであり、[ Enable Integrated Security ] プロパティが True に設定されているときに統合される GAM ライブラリの一部です。これは、GAMUser エンティティ内で、項目属性が動的に追加または更新されることを表します。
次のプロパティがあります:
  • Id
  • Value
イメージ:19635.png

GAMUser オブジェクト 

GAM データベース内のユーザーを表します。次に、GAMUser テーブル内で項目属性 (GAMUserAttribute オブジェクトとして表される) を取得、更新、削除するためのメソッドを示します。
  • GetAttribute
  • SetAttribute
  • DeleteAttribute

1.特定のユーザーの拡張項目属性をスキャンする方法
GAMUser オブジェクトには [ Attributes ] という名前のプロパティがあり、このプロパティは GAMUserAttribute のコレクションを返します。特定のユーザーのすべての拡張項目属性を取得するためには、次のサンプルコードに示すように、コレクション全体をループする必要があります:
&GAMUser.Load(&UserGUIDselected)   //&GAMUser は GAMUser データタイプ、&UserGUIDselected は GAMGUID データタイプ
For &UserAttr In &GAMUser.Attributes //&UserAttr は GAMUserAttribute データタイプ
    &UserAttribute = &UserAttr.Id //&UserAttribute は GAMPropertyID データタイプ
    &AttrValue = &UserAttr.Value //&AttrValue は GAMPropertyValue データタイプ
EndFor
コレクションを使用した実装が完了したら、コレクションに対して有効なすべての処理 (追加や削除など) を実行できます。ただし、この API では、コレクションに対して処理を実行することなく、動的に項目属性を追加、更新、削除できるメソッドを提供します。これは次の例に示します。
2.ID が指定された拡張項目属性の値を取得する方法: GAMUser オブジェクトの GetAttribute メソッド
&GAMUser.Load(&UserGUIDselected) //&GAMUser は GAMUser データタイプ、&UserGUIDselected は GAMGUID データタイプ
&GAMUserAttribute = &GAMUser.GetAttribute(&UserAttribute.Id,&Errors) //&UserAttribute は GAMPropertyID データタイプ
//&UserAttribute は GAMPropertyID データタイプ、&Errors は GAMError のコレクション、&GAMUserAttribute は GAMUserAttribute データタイプ
&AttrValue = &GAMUserAttribute.Value //&AttrValue は GAMPropertyValue データタイプ
3.拡張項目属性を更新する方法: GAMUser オブジェクトの SetAttribute メソッド
SetAttribute メソッドでは、指定した項目属性が存在しない場合は、新たに挿入されます。既に存在する場合は、値が更新されます。
動的な項目属性は、User テーブルとは別のテーブルに挿入されることを考慮する必要があります。このテーブルのキーは UserGUID と UserAttId (ユーザーの GUID および項目属性の ID) から構成されます。
&GAMUser.Load(&UserGUIDselected) //&GAMUser is GAMUser data type, &UserGUIDselected is GAMGUID data type
&GAMUserAttribute.Id = &UserAttribute //&GAMUserAttribute is GAMUserAttribute data type, &UserAttribute is GAMPropertyID data type
&GAMUserAttribute.Value = &UserAttributeValuenew
&isOK= &GAMUser.SetAttribute(&GAMUserAttribute,&Errors) //&Errors is collection of GAMError 
if &isOK
   commit
else
   For &Error in &Errors
      Msg(Format(!"%1 (GAM%2)", &Error.Message, &Error.Code))
   EndFor
endif
たとえば、"HairColor" 項目属性をユーザーに対して追加する必要があるとします。その場合、この例では、&UserAttribute に "HairColor"、&UserAttributeValuenew に "black" を指定します。
項目属性を追加するもう 1 つの方法は、GAMUserAttribute のコレクションを管理することです。この場合、次のコードに示すように、save() および commit コマンドを実行する必要があります:
&GAMUser.Load(&UserGUIDselected)
&GAMUserAttribute     = new () //&GAMUserAttribute は GAMUserAttribute データタイプ
&GAMUserAttribute.Id    = &UserAttribute //&UserAttribute は GAMPropertyID データタイプ
&GAMUserAttribute.IsMultiValue = False
&GAMUserAttribute.Value   = &UserAttributeValuenew
&GAMUser.Attributes.Add(&GAMUserAttribute)
&GAMUser.Save()

For &Error In &GAMUser.GetErrors()
  msg(&Error.Message + !"(GAM" + &Error.Code.ToString().Trim() + !")")
EndFor

if &GAMUser.Success()
  commit
endif
コレクションの add メソッドを使用して項目属性を追加すると、常にコレクションに新しい項目が追加されます。UserAttId が既に存在する場合、「Record already exists(GAM42)」のエラーがスローされます。
4.拡張項目属性を削除する方法: GAMUser オブジェクトの DeleteAttribute メソッド
&GAMUser.Load(&UserGUIDselected)
&GAMUserAttribute = new() //&GAMUserAttribute is GAMUserAttribute data type
&GAMUserAttribute.Id = &UserAttribute //it can be "HairColor"
&GAMUserAttribute.Value = &AttrValue //it can be "black"
&isOK = &GAMUser.DeleteAttribute(&GAMUserAttribute,&errors)
For &Error In &GAMUser.GetErrors()
  msg(&Error.Message + !"(GAM" + &Error.Code.ToString().Trim() + !")")
EndFor
if &isOK
  commit
endif
項目属性を削除するもう 1 つの方法は、GAMAttribute 項目のコレクションの remove メソッドを実行することです。

参考情報

HowTo: GAM User table extensibility: multivalued attributes
GAM エンティティのプロパティを拡張する方法








サブページ
Created: 15/01/07 22:46 by Admin Last update: 21/05/21 04:33 by Admin
カテゴリ
Powered by GXwiki 3.0