Me gustaría añadir un parámetro como tabla de valores siendo uno de los campos una lista de valores. La tabla de valores consta de 3 columnas, a saber, "tabla", "campo", "descripción", mientras que "campo" es una lista de valores. Los valores de la lista de valores dependerán de la "tabla" de entrada, por lo que cambiarán con cada nueva entrada. Por ejemplo, si se añade una tabla xyz a la lista de valores, se obtendrá una lista de campos que podrá seleccionarse a continuación.
Mi código por ahora:
def getParameterInfo(self):
in_tables = arcpy.Parameter(
displayName = "test",
name = "test",
datatype = "GPValueTable",
parameterType = "Optional",
direction = "Input")
in_tables.columns = [["DETable", "table"],["GPString","field"],["GPString","description"]]
in_tables.filters[1].type = 'ValueList'
in_tables.filters[1].list = ["<marker spalte>"] #dummy list which is updated in updateParamters
...
def updateParameters(self, parameters):
if parameters[0].value and parameters[0].altered:
fields_list = [field.name for field in arcpy.Describe(parameters[0].value[0][0]).fields]
parameters[0].filters[1].list = fields_list #update of dummy list
En realidad, esto funciona, pero siempre obtengo la lista de campos de la primera entrada. He pensado en utilizar len para obtener siempre la última entrada (lo que es un poco más útil pero sigue sin ser satisfactorio). Lo que preferiría es la identificación de la fila seleccionada para actualizar dinámicamente la lista de valores con los nombres de los campos relacionados.
¿Hay alguna forma de hacerlo?
ArcGIS 10.3.1
Actualización: El problema con mi parameters[0].value[0][0]
El problema al trabajar con len() es que se produce un error si uno de los campos seleccionados anteriormente no existe en la última lista de campos. Por eso he cambiado mi método updateParameters.
if parameters[0].value and parameters[0].altered:
all_tables_list = parameters[0].value
number_of_tables = len(all_tables_list)
i = 0
fields_list_tmp = []
for in_table in all_tables_list:
fields_list_tmp.append([field.name for field in arcpy.Describe(parameters[0].value[i][0]).fields])
i += 1
fields_list = list(set([item for sublist in fields_list_tmp for item in sublist]))
parameters[0].filters[1].list = fields_list
que básicamente crea una lista con todos los campos existentes en todas las tablas seleccionadas.