Programatically identifying Joined Field in ArcMap?
Here is an ArcObjects approach, based off this example, to enumerate all joins on a layer and list their destination and source table names and primary and foreign keys:
- Get a reference to an
ILayer
that has one or more joins - Cast the
ILayer
toIDisplayTable
- Cast the
IDisplayTable.DisplayTable
property toIRelQueryTable
- While the current table is an
IRelQueryTable
:- Inspect the
RelQueryTable
'sDestinationTable
andSourceTable
properties - Inspect the
OriginPrimaryKey
andOriginForeignKey
properties of theIRelQueryTable.RelationshipClass
property. - Set the current table to the current
RelQueryTable
'sSourceTable
property
- Inspect the
This Python script (using comtypes and this helper module) will go through all of the joins, from latest to earliest, and print the destination and source table names, origin primary key and origin foreign key for each join:
from ESRICOMHelpers import * # helper module from https://gis.stackexchange.com/a/5082/753
esriArcMapUI = GetESRIModule("esriArcMapUI")
esriCarto = GetESRIModule("esriCarto")
esriGeoDatabase = GetESRIModule("esriGeoDatabase")
def listJoins(table):
while CType(table, esriGeoDatabase.IRelQueryTable):
relQueryTable = CType(table, esriGeoDatabase.IRelQueryTable)
destTable = relQueryTable.DestinationTable
sourceTable = relQueryTable.SourceTable
destDataset = CType(destTable, esriGeoDatabase.IDataset)
sourceDataset = CType(sourceTable, esriGeoDatabase.IDataset)
relClass = relQueryTable.RelationshipClass
print destDataset.Name, sourceDataset.Name, relClass.OriginPrimaryKey, relClass.OriginForeignKey
table = sourceTable
if __name__ == "__main__":
#app = GetCurrentApp() # Use if run in-process
app = GetApp("ArcMap") # Use if run in a standalone script
mxd = CType(app.Document, esriArcMapUI.IMxDocument)
# Gets the first layer in the active data frame
map = mxd.FocusMap
lyr = map.Layer[0]
# Need to get the "display table" to access the joins
displayTable = CType(lyr, esriCarto.IDisplayTable).DisplayTable
# List the layer's joined tables
listJoins(displayTable)
Example output, given a source layer with three joins:
join_table_3 master_fc_join_table_1_join_table_2 JOIN_ID_3 master_fc.MASTER_ID join_table_2 master_fc_join_table_1 JOIN_ID_2 master_fc.MASTER_ID join_table_1 master_fc JOIN_ID_1 MASTER_ID
For more info, see How do I access ArcObjects from Python?