[Gvsig_desarrolladores] Re: Editar un valor en un registro

Nacho Uve nachouve en gmail.com
Mar Ene 27 13:48:17 CET 2009


He introducido el código que me ha sugerido Fran y ya he podido hacer los
cambios a los valores. Muchas gracias!!!

Esta solución tiene un par de problemillas que supongo en ese refactor que
comentas ya se solucionan. El primero es que tengo que recorrer todas las
filas y volverlas a escribir en disco una a una, en teoría, el acceso podría
ser aleatorio tratándose de dbf; afortunadamente la capas actuales con las
que estoy trabajando en este proyecto no son demasiado grandes...
Otra cosa que ocurre, es que hay mucho retardo en el refresco de los valores
en el recorset de la layer afectada por ese cambio y puede tardar mucho
tiempo de visualizarse el cambio realizado.  ¿Esto es normal? ¿Hay algún
modo de ordenar este refresco de las tablas?

Un saludo,
Nacho


El 26 de enero de 2009 13:40, Nacho Uve <nachouve en gmail.com> escribió:

> 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/20090127/b5b70d14/attachment.htm


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