Lo spostamento di un campo in una tabella e lo script VBA
giovedì, settembre 14, 2006
Necessario: Licenza di ArcMap 9.x
Livello:

QUESTO E' UN PROBLEMA IRRISOLTO

Ciao a tutti,
ho letto nel post “Domande e Suggerimenti” la richiesta particolare di Dario (è quello di “Arcviuuuu noveeee” qui a fianco), che vorrebbe spostare un campo all’interno di una tabella di attributi.
Ad esempio, avendo una tabella di attributi di uno shape con 5 campi, Dario vorrebbe spostare l’ultimo campo al primo posto e fare in modo che alla nuova apertura di quello shape il suddetto campo avesse mantenuto la posizione, ovvero il primo posto.
Attualmente questo non succede, sia procedendo allo “spostamento” con ArcMap che con ArcCatalog, in quanto alla successiva apertura dello shape i campi si ripresentano nelle loro posizioni originali.
Non sapendo trovare risposta per Dario ho cercato qualcosa nel sito di supporto di ESRI….ovviamente la risposta era lì…..l’unico problema è CAPIRLA!
Infatti, al dilà della richiesta di Dario, che probabilmente vuole spostare il campo di una tabella per questioni pratiche o “estetiche”, mi sono appassionato a questo argomento con la scusa di capire qualcosa in più sull’utilizzo degli script in VBA all’interno di ArcMap.
Infatti un ESRIdipendente postato nel sito di supporto ESRI un listato in VBA per ottenere lo spostamento di un campo, attraverso l’artificio del drag and drop. (copia e incolla = sposta)
Public Sub SetFieldPosition(pFeatureLayer As IFeatureLayer, sFieldName As String, lPosition As Long)
On Error GoTo ErrorHandler

Dim pMxDoc As IMxDocument
Set pMxDoc = gpApp.Document

Dim vList As Variant
Dim lPos As Long
Dim l As Long
Dim sTableProp As String
Dim pEnumTProps As IEnumTableProperties
Set pEnumTProps = pMxDoc.TableProperties.IEnumTableProperties
pEnumTProps.Reset
Dim pTableProp As ITableProperty2
Set pTableProp = pEnumTProps.Next
Do Until pTableProp Is Nothing
If pTableProp.FeatureLayer Is pFeatureLayer Then
sTableProp = pTableProp.FieldOrder
vList = Split(sTableProp, ",")
If vList(UBound(vList)) = sFieldName Then
sTableProp = Replace(sTableProp, "," & sFieldName, "")
vList = Split(sTableProp, ",")
sTableProp = sFieldName & "," & sTableProp
sTableProp = ""
For l = 0 To UBound(vList)
If l = lPosition Then
sTableProp = sTableProp & "," & sFieldName
End If
sTableProp = sTableProp & "," & vList(l)
Next l
If Left(sTableProp, 1) = "," Then sTableProp = Right(sTableProp, Len(sTableProp) - 1)
If Right(sTableProp, 1) = "," Then sTableProp = Left(sTableProp, Len(sTableProp) - 1)
pTableProp.FieldOrder = sTableProp
End If
End If
Set pTableProp = pEnumTProps.Next
Loop


Exit Sub
ErrorHandler:
HandleError True, "SetFieldPosition " & c_sModuleFileName & " " & GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1
End Sub

Il problema rimane ora come far “digerire” da ArcMap tale script.
Quello che ho capito è che questo script ha 3 parametri (nome layer, nome campo da spostare, posizione del campo dopo lo spostamento).
Mi piacerebbe anche capire se è possibile far funzionare lo script che vedete attraverso una tool di toolbox creata ad hoc.
Vediamo chi mi dice come far funzionare lo script in ArcMap ….io ci sto provando:
sto cercando di inserire lo script all’interno dell’editor di VBA presente in ArcMap.

Probabilmente non è la strada giusta, ma sembra la più logica.
Se riusciamo a risolvere il problema dello script in VBA raggiungiamo 2 obbiettivi: riuscire a spostare un campo di una tabella di attributi e imparare a utilizzare gli script VBA in ArcMap, non male!

Etichette:

 
posted by Paolo at 8:08 AM | Permalink |


6 Commenti:


At 15/9/06 9:34 AM, Anonymous bulmachan

Premessa la mia ignoranza, e non riuscendo a richiamare la subroutine passando direttamente i parametri (non ho idea di come si faccia), ho tentato di realizzarne un'altra che non richiedesse parametri e che al suo interno chiamasse SetFieldPosition, esplicitando direttamente i parametri. Mentre i tipi di dato dei parametri sFieldName e lPosition sono chiari (una stringa, ovvero il nome del campo che vogliamo spostare tra "", e la posizione dove spostare il campo), non riesco a capire come funziona il tipo di dato IFeatureLayer, nello specifico dovrei passare un oggetto di questo tipo, cercando di specificare il nome del layer che vogliamo modificare.

Purtroppo non conosco le classi che consentano di manipolare nello specifico questi oggetti. Qualcuno sa dove posso trovare un buon tutorial?

 

At 29/9/06 12:55 PM, Blogger Conte Oliver

Non è una risposta molto "GIS" la mia, ma il problema lo risolvi velocemente aprendo il dbf dello shape in excel, inserisci un campo vuoto nella posizione dove vuoi che vada a finire il tuo campo da spostare, selezioni e ci trascini quest'ultimo ed elimini la colonna vuota che si è formata al posto del campo spostato. Funziona anche se vuoi inserire un campo nuovo, rinominare i nomi dei campi e il formato. (Problemi li puoi riscontrare solo se il campo da spostare è proprio l'ultimo, per gli inetrmedi nessun problema).
Resta comunque irrisolto come si possa importare lo script di Paolo in Arc GIS....forza e coraggio!!!

 

At 14/12/06 9:18 AM, Blogger fnvespucci@gmail.com

Una volta inserito lo script nel VBE di ArcMap, bisogna fare altre due cose:

1) Caricare lo shape in ArcMap
2) Richiamare lo script da un altro che gli passi i parametri adeguati

Ipotizziamo che lo shape in questione abbia un campo "Layer" su cui agire, e di volerlo spostare nella posizione 2

Creiamo questo script e lanciamolo

Public sub Test()
dim pDoc as IMXDocument
dim pMap as IMap
dim pFLayer as IFeatureLayer

set pDoc=ThisDocument
set pMap=pDoc.FocusMap
'Referenzio il primo layer nella mappa
set pFLayer=pMap.Layer(0)

SetFieldPosition pFLayer,"Layer",2

end sub

Byez

 

At 4/1/07 3:56 PM, Anonymous Anonimo

L'unica soluzione secondo me sarebbe creare un form anche minuscolo ed eseguire tutte le operazioni all'interno di esso...

 

At 31/1/07 12:08 AM, Anonymous tano

per evitarsi di passare direttamente al VB si potrebbe utilizzare la funzione "order field" di et-geowizard (che molti di voi sicuramente conosceranno)..per chi non lo conosce..basta fare una breve ricerca su internet..

ps..
l'unico fastidio è che crea un nuovo shape con i campi ordinati

tano

 

At 26/10/07 2:04 PM, Blogger GisAldus

Premessa: sono appena arrivato e colgo l'occasione per salutare tutti ed in particolare il fondatore di questa miniera di sapere GIS: Paolo Orlandi!

...veniamo al problema...se
non si vuole ricorre all'utilizzo, per altro molto comodo del VBA, ma che può portare dei problemi di eseguzione del codice come sta accadendo a me (vedi in seguito) si poù rapidamenet ovviare allo spostamento dei campi di una tabella se si lavora con le features entrando direttamente nell BD,anche con il + banale degli Access, e dalla struttura della tabella scambiare la successione dei campi, salvare la nuova struttura e chiudere motore DB.A quel punto richiamando in ArcMap la feature troveremo i campi ordinati come noi vogliamo.

PS: ho iniziato a provare ad usare alcuni script in VBA per ArcGis e proprio su quello relativo allo spostamento dei campi ho trovato i seguenti 2 problemi:
1)dove posso trovare la function GetErrorLineNumberString
2)nella riga "Set pMxDoc = gpApp.Document" da errore sull'oggetto gpApp; qualcuno mi sa dire come farlo riconoscere all'editor del mio ArcInfo 9.1?

Grazie ;-))

 


Torna all'inizio della pagina