FAQ
QueryDefで結合したレイヤに対してフィーチャの選択コマンドが利用できない

ナレッジ番号:5480 | 登録日:2023/07/27 | 更新日:2024/12/02

【概要】

QueryDefを使用してフィーチャクラスとテーブルを結合すると、
フィーチャの選択コマンドが利用できなくなります。そのレイヤのフィーチャを選択することができません。


【原因】

QueryDefを使用して生成された結合テーブルは選択をサポートしていません。
選択をサポートするにはテーブルにOBJECTID列が必要となりますが、
QueryDefを使用して生成された結合テーブルはレコードを識別するIDを持ちません。
例えば、QueryDefを使用して生成された結合テーブルは1対多のリレーションシップを定義します。
結合された左側のテーブルは各OIDに対して複数のレコードを返します。


【解決策】

QueryDefがレコード固有のIDを持つテーブルを作成するためにTableQueryName CoClassを使用します。
以下のコードはIQueryDefとIQueryName2を使用してパーソナルジオデータベースのテーブルを結合する例です。
IQueryName2は出力フィーチャクラスが選択できるようにOIDフィールドを指定するために使用されます。

QueryDefがレコード固有のIDを持つテーブルを作成するためにTableQueryName CoClassを使用します。以下のコードはIQueryDefとIQueryName2を使用してパーソナルジオデータベースのテーブルを結合する例です。IQueryName2は出力フィーチャクラスが選択できるようにOIDフィールドを指定するために使用されます。



Private Sub AddQueryLayer2()

  Dim pMxDoc As IMxDocument
  Dim pMap As IMap
  Dim pWorkspace As IWorkspace
  Dim pFWorkspace As IFeatureWorkspace
  Dim pWSFactory As IWorkspaceFactory
  Dim pFClass As IFeatureClass
  Dim pQueryDef As IQueryDef
  Dim pFLayer As IFeatureLayer
  Dim pDataset As IDataset
  Dim pWorkspaceName As IWorkspaceName
  Dim pDataSetName As IDatasetName
  Dim pName As IName
  Dim pQueryName2 As IQueryName2

  ' マップを取得します
  Set pMxDoc = ThisDocument
  Set pMap = pMxDoc.FocusMap

  ' ワークスペースを取得します
  Set pWSFactory = New AccessWorkspaceFactory
  Set pWorkspace = pWSFactory.OpenFromFile("C:\TestDB.mdb", 0)
  Set pFWorkspace = pWorkspace

  ' クエリを定義します
  Set pQueryDef = pFWorkspace.CreateQueryDef
  With pQueryDef
    .Tables = "Yield, YieldEvent"
    .WhereClause = "Yield.EventID=YieldEvent.EventID"
  End With

  'クエリを設定します。これによりOBJECTIDが真のOIDフィールドとなり、
  '選択が可能になります。
  Set pQueryName2 = New FeatureQueryName
  pQueryName2.PrimaryKey = "Yield.YieldID"
  pQueryName2.QueryDef = pQueryDef

  Set pDataset = pFWorkspace
  Set pWorkspaceName = pDataset.FullName
  Set pDataSetName = pQueryName2
  Set pDataSetName.WorkspaceName = pWorkspaceName
  Set pName = pQueryName2
  Set pFClass = pName.Open

  ' レイヤとしてフィーチャクラスをマップに追加します
  Set pFLayer = New FeatureLayer
  Set pFLayer.FeatureClass = pFClass

  pFLayer.Name = "Yields"
  pFLayer.ScaleSymbols = True
  pFLayer.Selectable = True

  pMap.AddLayer pFLayer

End Sub

メタデータ

種類

機能

製品