banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 Fri 07 September 2007 16:34

20centimes1
Juste Inscrit !
Date d'inscription: 15 Feb 2007
Messages: 4

Augmenter le nombre de caractères dans un champ

Bonjour,

je n'ai pas trouvé de réponse à ce problème dans les anciens posts, pourtant, je ne dois pas être le premier à me poser la question. Sous ArcView 3.2, comment augmenter la largeur d'un champ (pour passer de 16 à 32 ou 40 carcatères) dans une table attributaire?

Meric d'avance.

Hors ligne

 

#2 Fri 07 September 2007 17:16

Sylvain T.
Membre
Lieu: Musée de l'Homme, Paris France
Date d'inscription: 7 Sep 2005
Messages: 742
Site web

Re: Augmenter le nombre de caractères dans un champ

Hello,

Pas de possibilité d'augmenter le nombre de caractère d'un champ en natif (peut-être exsite-t-il un script ou une extension).
Il y a cependant une solution manuelle:
1. créer un nouveau champ avec le nb de caractère voulu.
2. recopier le contenu du champ dans le nouveau avec la calculatrice.
3. supprimer l'ancien champ.

Cordialement,
Sylvain

Hors ligne

 

#3 Fri 07 September 2007 22:46

20centimes1
Juste Inscrit !
Date d'inscription: 15 Feb 2007
Messages: 4

Re: Augmenter le nombre de caractères dans un champ

Ok, merci beaucoup! Très basique en effet, mais ça marche!

Hors ligne

 

#4 Mon 10 September 2007 17:07

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

Re: Augmenter le nombre de caractères dans un champ

Hello,

Les ET Geowizards font ca aussi.
Il faut aller dans l'onglet Basic puis Choisir "Redefine Fields".

Le descriptif avec quelques trad rapide :

Redefine Fields Wizard

Change field names and definitions.
(Change les nom de champ et leur définition)

Inputs:
(Entrée :)

A feature layer
(Une couche d'entités)
Point
Polyline
Polygon
New field names, length, precision, scale

Outputs:
(Sortie :)

A new feature class.
(Une nouvelle couche d'entités)

How to use:
(Mode d'emploi)

Select a layer to be exported and a location for the new feature class
A list of all the fields in the layer is presented in a grid where the user can change the names and definitions of the fields
Notes:

The type of the fields can't be changed
(Le type de champ ne peut pas être changé)
The new field names should be max 10 characters long
(Le nouveau champ ne peut avoir plus de 10 caractères)
If the sorce layer is a Personal Geodatabase layer the numeric fields will be reported incorrectly in the grid with Precision = 0 and Scale = 0.
(attention si le fichier vient d'une geodatabase)
If the Precision and Scale  are incorrectly set to 0, the original field definition will be used.
(s'il y a des erreurs dans la saisie la définition utilisée sera l'originale)

Hors ligne

 

#5 Tue 11 September 2007 10:58

Sylvain T.
Membre
Lieu: Musée de l'Homme, Paris France
Date d'inscription: 7 Sep 2005
Messages: 742
Site web

Re: Augmenter le nombre de caractères dans un champ

Hello,

Euh Robin, on parle d'AV3.x. L'extension ET Geowizards Tools pour cette version ne comprend pas d'outil de manipulation de champs.
Sous AV3.x, il y a bien une extension qui fait (notamment) cela, PowerStructure, mais elle est payante.

Amicalement,
Sylvain

Hors ligne

 

#6 Tue 11 September 2007 11:28

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

Re: Augmenter le nombre de caractères dans un champ

Woups, bien vu, mes excuses.

Robin, confus.

Ps : Pour me rattraper, et pour ceux qui ne connaissent pas et qui bosse encore sur ArcView 3.x, un p'tit lien vers les Xtools version Arview 3.x : http://arcscripts.esri.com/details.asp?dbid=11526. Je n'y ai pas trouvé la fonction qui change le nom des champs mais ca fait quelques trucs sympa

Hors ligne

 

#7 Tue 11 September 2007 11:33

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

Re: Augmenter le nombre de caractères dans un champ

Ah si, j'ai quand même trouvé un truc (voir ci dessous)
C'est un code trouvé ici avec d'autres trucs utile sur cette page

MOD.AVE (4.2K) -- Renames or Modifies Fields

5/29/98

You can't directly modify fields in ArcView, but this script works around that by creating a new table and copying over the values. Allows you to rename fields, redefine them (e.g. change width or precision), and convert CHAR fields to DECIMAL and vice versa. The old .DBF file is given a .BAK extension and the table document recreated for the new file. Not recommended for use on Table documents created using FTheme.EditTable.


En somme ca fait un peu pareil que l'astuce de Sylvain, qui est plus simple, je pense.
Attention à l'utilisation du code, il y a un avertissement sur le type de tables traitées, j'ai l'impression qu'il s'agit des tables liées à un Ftheme.

Code:

' Table.Modify
' Renames or modifies fields in a Table document

' Assumes that the base table is a shapefile or dBase (.DBF) file
' Saves the old table with a .BAK extension
' At this point, only DECIMAL and CHAR fields are supported

'**** see if directory and dBase file write-protected

theTable = av.GetActiveDoc
tabName = theTable.GetName
tabExt = theTable.GetWin.ReturnExtent
tabOrigin = theTable.GetWin.ReturnOrigin
theVTab = theTable.GetVTab
theFName = theVTab.GetBaseTableFileName
theDir = theFName.ReturnDir
theTitle = "Modify"
if (File.IsWritable(theDir).Not) then
   MsgBox.Error("Cannot write to directory.",theTitle)
   return nil
end
if (File.IsWritable(theFName).Not) then
   MsgBox.Error("File is not writable.",theTitle)
   return nil
end

'**** get list of field names

fl = List.Make
for each f in theVTab.GetFields
   fnm = f.GetName
   ft = f.GetType.AsString.AsTokens("_").Get(1)
   if ((ft = "CHAR") or (ft = "DECIMAL")) then
      fl.Add(fnm.AsString)
   end
end

'**** get modifications

f_list = List.Make
modlist = List.Make
modfield = true
theMsg = "Enter modifications"
theLabels = {"Name","Type","Width","Precision"}
while (modfield)
   f = MsgBox.ChoiceAsString(fl,"Select field to modify",theTitle)
   if (f = nil) then
      return nil
   elseif (f_list.FindByValue(f) > -1) then
      MsgBox.Info("Field already selected",theTitle)
   else
      theField = theVTab.FindField(f)
      theType = theField.GetType.AsString.AsTokens("_").Get(1)
      theWidth = theField.GetWidth.AsString
      thePrecision = theField.GetPrecision.AsString
      theDefaults = {f,theType,theWidth,thePrecision}
      result = MsgBox.MultiInput(theMsg,theTitle,theLabels,theDefaults)
      if (result = nil) then
         return nil
      end
      newName = result.Get(0)
      nt = result.Get(1)
      if ((nt = "CHAR") or (nt = "DECIMAL")) then
         newType = ("#FIELD_"+nt).AsEnum
      else
         MsgBox.Error("Unsupported type",theTitle)
         return nil
      end
      newWidth = result.Get(2).AsNumber
      newPrecision = result.Get(3).AsNumber
      f_list.Add(f)
      modlist.Add({newName,newType,newWidth,newPrecision})
   end
   modfield = MsgBox.MiniYesNo("Modify another field?",false)
end

'**** generate field list

oldFields = List.Make
newFields = List.Make
for each f in theVTab.GetFields
   fnm = f.GetName
   if (fnm <> "Shape") then
      i = f_list.FindByValue(fnm)
      if (i > -1) then
         nm = modlist.Get(i).Get(0)
         nt = modlist.Get(i).Get(1)
         nw = modlist.Get(i).Get(2)
         np = modlist.Get(i).Get(3)
         nf = Field.Make(nm,nt,nw,np)
         newFields.Add(nf)
      else
         newFields.Add(f.Clone)
      end
      oldFields.Add(f)
   end
end

'**** generate scratch file

tmpFName = theDir.MakeTmp("tmp","dbf")
tmpVTab = VTab.MakeNew(tmpFName,dBase)
tmpVTab.AddFields(newFields)

'**** populate records

i_last = newFields.Count - 1
numdone = 0
numrec = theVTab.GetNumRecords
for each r in theVTab
   r2 = tmpVTab.AddRecord
   for each i in 0..i_last
      of = oldFields.Get(i)
      nf = newFields.Get(i)
      v = theVTab.ReturnValue(of,r)
      if (nf.IsTypeString) then
         if (v.Is(Number)) then
            theVal = v.AsString
         else
            theVal = v
         end
      else
         if (v.Is(String)) then
            theVal = v.AsNumber
         else
            theVal = v
         end
      end
      tmpVTab.SetValue(nf,r2,theVal)
   end
   numdone = numdone + 1
   av.SetStatus(numdone / numrec * 100)
end
tmpVTab.Flush
tmpVTab.DeActivate
tmpVTab = nil
theVTab.DeActivate
theVTab = nil
av.GetProject.RemoveDoc(theTable)
theTable = nil
av.PurgeObjects
av.ClearStatus

'**** rename files

bakFName = FileName.Make(theFName.AsString)
bakFName.SetExtension("bak")
File.Copy(theFName,bakFName)
File.Copy(tmpFName,theFName)
File.Delete(tmpFName)

'**** create new table doc

theVTab = VTab.Make(theFName,false,false)
theTable = Table.Make(theVTab)
av.GetProject.AddDoc(theTable)
theTable.SetName(tabName)
theTable.GetWin.MoveTo(tabOrigin.GetX,tabOrigin.GetY)
theTable.GetWin.Resize(tabExt.GetX,tabExt.GetY)
theTable.GetWin.Activate

return nil

Hors ligne

 

#8 Tue 11 September 2007 11:44

Sylvain T.
Membre
Lieu: Musée de l'Homme, Paris France
Date d'inscription: 7 Sep 2005
Messages: 742
Site web

Re: Augmenter le nombre de caractères dans un champ

Hello,

J'ai aussi codé quelques outils pour les tables, dont renommer, convertir, agrandir, qui sont inclus dans cette extension.

A+
Sylvain

Hors ligne

 

Pied de page des forums

Powered by FluxBB