¿Reemplazar / actualizar permanentemente el servidor / servicio en cada capa de ArcSDE en MXD?

8

Usando el método mxd.findAndReplaceWorkspacePaths, si se actualiza y MXD y la ruta de acceso del archivo de conexión .sde se vuelven a romper todas las fuentes de datos.

¿Existe algún método para actualizar permanentemente cada capa SDE en una tabla de contenido MXD para almacenar permanentemente el servidor y el servicio SDE? Es decir. ¿Simplemente reemplace el SERVIDOR y la INSTANCIA para cada capa SDE en un MXD usando Python o ArcObjects en Pyhton?

MMV
fuente
Hasta donde sé, Arcmap siempre usa la ruta al archivo de conexión, por ejemplo "Database Connections\Connection to Foobar.sde", y no hay forma de pasar o guardar la información del SERVIDOR y SERVICIO directamente. Estaría encantado de que se demuestre lo contrario . Puedo imaginar un truco para almacenar un archivo sde generado dinámicamente en el mismo directorio que el mxd, o incluso tal vez dentro del mxd, y luego referirme a eso; Sin embargo, no sé cómo implementarlo.
Matt Wilkie
1
@matt, no creo que sea completamente correcto; ArcMap utilizará las propiedades de conexión persistentes dentro de la capa. El archivo de conexión SDE nunca se vuelve a mirar, su ruta son solo metadatos. El problema aquí parece ser específico de los métodos de reemplazo de fuentes de datos arcpy. Definitivamente puede establecer propiedades de conexión sin usar un archivo de conexión con ArcObjects (por ejemplo, usando la interfaz IWorkspaceName ). Sin embargo, con arcpy estás limitado a los métodos proporcionados.
blah238
@matt tienes razón. Estoy usando los métodos Arcpy. No puedo obtener las propiedades de conexión para cada capa para 'guardar'. Una dependencia para obtener propiedades de conexión de la ruta al archivo de conexión permanece después de un mxd.save () o mxd.saveACopy ()
MMV

Respuestas:

7

He encontrado una solución para romper la dependencia de la ruta al archivo de conexión .sde usando ArcPy y el siguiente método.

De esta manera funciona:

lyr.replaceDataSource(sdeConn, "SDE_WORKSPACE", lyr.datasetName, False)
table.replaceDataSource(sdeConn, "SDE_WORKSPACE", lyr.datasetName, False)

Puede cambiar el nombre o eliminar el archivo de conexión después de que el MXD haya sido reparado y guardado. Continuará abriéndose sin problemas después de que el archivo de conexión ya no esté allí.

Estos métodos NO funcionan:

mxd.findAndReplaceWorkspacePaths
lyr.findAndReplaceWorkspacePath

NO PUEDE cambiar el nombre o eliminar el archivo de conexión después de que se haya reparado el MXD. El MXD buscará el archivo de conexión .sde en la misma ubicación siempre que se abra.

MMV
fuente
Estoy usando lyr.replaceDataSource, sin embargo, parece que arcmap no puede detectar la nueva fuente de datos ya que muestra un "!" antes de la capa, así que tengo que reparar la fuente de datos a mano. Aquí está mi código:
Smalis
arcpy de importación; mxd = arcpy.mapping.MapDocument (r "C: \ Users \ SMALIS \ Documents \ ArcGIS \ pythonSwitchSource.mxd"); para lyr en arcpy.mapping.ListLayers (mxd): if lyr.supports ("DATASOURCE"): lyr.replaceDataSource ("C: \ Users \ SMALIS \ AppData \ Roaming \ ESRI \ Desktop10.2 \ ArcCatalog \ DB1.sde" , "SDE_WORKSPACE", lyr.datasetName, False) mxd.saveACopy (r "C: \ Users \ SMALIS \ Documents \ ArcGIS \ 1.mxd"); del mxd;
Smalis
Su comentario sobre los métodos que para los conjuntos de datos de características que NO FUNCIONAN me ha ahorrado muchos intentos fallidos. ¡MUCHAS GRACIAS! Estoy de acuerdo en que esto tampoco me ha funcionado, ¿es un error? the lyr.workspacePath muestra el conjunto de datos de características
woodwa
1

Debe recorrer capas de grupo anidadas y luego usarlas arcpy.CreateArcSDEConnectionFile_managementpara crear nuevos SDE utilizando parámetros de lyr.serviceProperties, y pasar parámetros como servProp.geto arcpy.GetParameterAsText(0).

No te olvides de usar os.remove(temp_sde) if os.path.exsists(temp_sde) else None.

for maplayer in lyr_list:
    walknestedgroups(maplayer)
    servProp = maplayer.serviceProperties
    if maplayer.serviceProperties["ServiceType"] == "SDE":
        host = servProp.get('Server','N\A')
    if host in ("MyServer"):
        remap_sde(maplayer)
Andy
fuente
0

Esto puede ser demasiado simple pero ...
Si cambia el nombre de la conexión anterior y nombra la nueva con el nombre anterior, ¿eso logra un mejor resultado?

Brad Nesom
fuente
Si vuelve a apuntar cada Capa en un MXD para usar un archivo de conexión ubicado en '\\ corpshare \ sde \ corpsde.sde', todo funciona muy bien. Sin embargo, si esa ruta no está disponible, ahora todos los MXD están rotos. Estoy más interesado en las propiedades de conexión SERVIDOR y SERVICIO dentro del archivo de conexión, en lugar de la ruta a él. En esencia, quiero actualizar cada SERVIDOR y SERVICIO de capas, por lo que si esa ruta no está disponible, el MXD aún puede acceder al servidor sin una ruta a un archivo de conexión válido.
MMV
@MMV, ¿estás seguro? Lo acabo de probar: 1) Agregue una capa al mapa usando un archivo de conexión SDE 2) Guarde el MXD y cierre ArcMap 3) Elimine / cambie el nombre del archivo de conexión SDE 4) Abra MXD guardado. La capa se carga sin problemas.
blah238
@ Blah238 correcto He visto esto: si el archivo sde desapareció, ¿aún se conecta? Lo que pensé es que si cambias las propiedades de conexión en un archivo sde (para señalarlo a otro servidor / servicio que lo encontraría) (tan pronto como no abras y rompas los enlaces primero. Lo probaré y volver.
Brad Nesom
Solo lea la publicación de blah238 arriba. No estaba al tanto de eso. porque he tenido problemas de contraseña antes y los arreglé cambiando las cadenas de conexión. quizás el truco es romperlo y repararlo con las nuevas cadenas de conexión. pero para romperlo debes detener el servicio existente. ??
Brad Nesom
@ blah238 Al crear manualmente un MXD en ArcMap, guardarlo y eliminar el archivo de conexión, todo continuará funcionando después de que la ruta al archivo .sde se haya "roto". Actualizando un MXD ya existente usando ArcPy, es donde permanece la dependencia de la ruta al archivo de conexión.
MMV