[Gvsig_desarrolladores] Re: Editar un valor en un registro

Nacho Uve nachouve en gmail.com
Lun Ene 26 13:40:48 CET 2009


Muchas gracias! Voy a probar tus consejos y ya cuento como fué.


El 26 de enero de 2009 13:35, Francisco José Peñarrubia
<fpenarru en gmail.com>escribió:

> Ahí van unos trucos:
>
>       DbaseFile driver = new DbaseFile();
>       String dbfPath = "c:/0libro.dbf";
>       File myFile = new File(dbfPath);
>       try {
>           // Abrimos el fichero
>           driver.open(myFile);
>           driver.setFieldValue(1,0, new Integer(54));
>           System.out.println("Valor nuevo:" +
> driver.getStringFieldValue(1,0));
>           driver.close();
>
>                 }
>       catch (Exception e)
>       {
>           e.printStackTrace();
>       }
>   }
>
>
> Es decir, si recuperas el driver, y le pides getFile(), obtienes el fichero
> del dbf. Luego puedes usar la clase DbaseFile para editar de manera sencilla
> (siempre que sea un dbf). De esta forma, y si solo quieres cambiar valores,
> no hace falta ni que entres en edición.
> La manera "larga" pero que sirve para todas las capas, es usar el interfaz
> IWriter:
>
>       DBFDriver driver = new DBFDriver();
>       File myFile = new File("c:/0libro.dbf");
>       try {
>           // Abrimos el fichero
>           driver.open(myFile);
>                                 // Comprobamos que tenemos acceso de
> escritura.
>           if (driver.canSaveEdits())
>           {                                           // Creamos el nuevo
> campo
>                             FieldDescription dateField = new
> FieldDescription();
>               dateField.setFieldName("Date");
>               dateField.setFieldType(Types.VARCHAR);
>               dateField.setFieldLength(20);
>                             // Creamos un array con el nuevo campo
>               ITableDefinition tableDef = driver.getTableDefinition();
>               FieldDescription[] oldFields = tableDef.getFieldsDesc();
>               int numOldFields = oldFields.length;
>               FieldDescription[] newFields = new
> FieldDescription[numOldFields + 1];
>               System.arraycopy(oldFields, 0, newFields, 0, numOldFields);
>               newFields[numOldFields] = dateField;
>
>               tableDef.setFieldsDesc(newFields);
>                             driver.initialize(tableDef);
>               driver.preProcess();
>               Value[] att = new Value[newFields.length];
>               Calendar today = Calendar.getInstance();
>               for (int i=0; i < driver.getRowCount(); i++)
>               {                     for (int j=0; j < numOldFields; j++)
>                   {
>                       att[j] = driver.getFieldValue(i, j);
>                   }
>                   att[numOldFields] =
> ValueFactory.createValue(today.getTime().toLocaleString());
>                   DefaultRow row = new DefaultRow(att);
>                   DefaultRowEdited edRow = new DefaultRowEdited(row,
>                           DefaultRowEdited.STATUS_MODIFIED, i);
>
>                   driver.process(edRow);
>               }
>               driver.postProcess();
>                             System.out.println("Fichero modificado");
>                         }
>           else
>           {
>               System.err.println("El fichero no tiene permiso de edición");
>           }
>           driver.close();
>       } catch (IOException e) {
>           // TODO Auto-generated catch block
>           e.printStackTrace();
>       } catch (EditionException e) {
>           // TODO Auto-generated catch block
>           e.printStackTrace();
>       } catch (DriverException e) {
>           // TODO Auto-generated catch block
>           e.printStackTrace();
>       }
>
>
> Es decir, esas preprocess, process y postProcess, y necesitas componer un
> DefaultRowEdited. De todas formas, cuidado con esto. En el futuro, y después
> del refactoring todo esto cambiará totalmente.
> Espero que te sirva.
> Saludos.
>
> Fran.
>
> Nacho Uve escribió:
>
>> He estado leyendo el código de ciertas clases relacionadas con las Tablas,
>> pero no consigo encontrar una forma sencilla de hacer un cambio sencillo en
>> un atributo de una capa vectorial y que éste quede registrado en el
>> shapefile asociado en disco.  :S
>>
>> ¿Alguien puede darme una pequeña guía para avanzar en este sentido?
>> Gracias... :)
>>
>> Un saludo,
>> Nacho
>>
>>
>>
>>
>> El 22 de enero de 2009 14:02, Nacho Uve <nachouve en gmail.com <mailto:
>> nachouve en gmail.com>> escribió:
>>
>>    Hola de nuevo,
>>
>>    Seguramente en muy sencillito, pero ¿cómo se modifica un valor de
>>    un registro en una capa vectorial por código en la versión 1.2?
>>    Quisiera tener una función del tipo:
>>
>>    void modifyValue(FLyrVect lyr, int rowIdx, int attrIdx, Object
>>    newValue){
>>        //...
>>    }
>>
>>    Pero no sé muy bien cómo poner en edición la tabla asociada a la
>>    capa, y guardar los cambios.
>>
>>    Un saludo,
>>    Nacho
>>
>>
>>
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> gvSIG_desarrolladores mailing list
>> gvSIG_desarrolladores en runas.cap.gva.es
>> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>>
>>
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en runas.cap.gva.es
> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://runas.cap.gva.es/pipermail/gvsig_desarrolladores/attachments/20090126/f80ea12d/attachment.htm


Más información sobre la lista de distribución gvSIG_desarrolladores