[Gvsig_desarrolladores] Re: Editar un valor en un registro

Nacho Uve nachouve en gmail.com
Jue Feb 12 18:23:54 CET 2009


Hola de nuevo,

No consigo modificar un valor en un registro de una tabla FLyrVect en gvSIG.
Las soluciones planteadas por Fran alterando el dbf dan errores... o no lo
hacen, o dan excepciones, etc... pero me han acercado a conseguirlo.

En la primera editando a pelo el DBF parece que no guardar los cambios... he
cargado de nuevo el dbf del disco y nada.
El otro tampoco tampoco fue eficaz.

Supongo que esto tiene que estar resulto, ya que cuando la capa está en
Edición y se abre una tabla los cambios en las celdas se graban. Justamente
el código fuente relacionado con este tema es un poco complejo y no consigo
encontrar la forma de hacerlo.

En OpenJUMP la cosa es tan fácil como,

             feature.setAttribute("attribute_name", value);

independientemente del origen de datos, lo cual creo que es bastante cómodo.

¿Alguna sugerencia más en este sentido?

Un saludo,
Nacho









El 27 de enero de 2009 17:10, Nacho Uve <nachouve en gmail.com> escribió:

> Hola,
>
> Parece que la cosa ya funciona tras poner redraw() tras las modificaciones.
> De todos modos, me daba error [1] cuando la ProjectTable de la capa que
> modificaba estaba abierta en el ProjectManager e intentaba guardar el
> proyecto.
>
> Salvo eso, ahora va todo muy bien.
>
> Un saludo,
> Nacho
>
>
>
>
> [1]:
> DEBUG [AWT-EventQueue-1] (MDIFrame.java:615) - Execute command:GUARDAR
> DEBUG [AWT-EventQueue-1] (NotificationManager.java:104) - Fallo guardando
> el Proyecto en : com.iver.cit.gvsig.project.documents.table.ProjectTable
> java.lang.RuntimeException: The layer 'ET' is not in a view
>     at com.iver.cit.gvsig.project.Project.getView(Project.java:1295)
>     at
> com.iver.cit.gvsig.project.documents.table.ProjectTable.getXMLEntity(ProjectTable.java:356)
>     at com.iver.cit.gvsig.project.Project.getXMLEntity(Project.java:683)
>     at
> com.iver.cit.gvsig.ProjectExtension.writeProject(ProjectExtension.java:457)
>     at
> com.iver.cit.gvsig.ProjectExtension.guardar(ProjectExtension.java:234)
>     at
> com.iver.cit.gvsig.ProjectExtension.execute(ProjectExtension.java:353)
>     at
> com.iver.andami.plugins.ExtensionDecorator.execute(ExtensionDecorator.java:88)
>     at
> com.iver.andami.ui.mdiFrame.MDIFrame.actionPerformed(MDIFrame.java:616)
>     at
> javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
>     at
> javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
>     at
> javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
>     at
> javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
>
>
>
>
>
>
>
>
> El 27 de enero de 2009 15:22, Nacho Uve <nachouve en gmail.com> escribió:
>
> Probando más cosas... parece que la capa pierde la referencia al origen de
>> los datos!! Esto lo he visto en el diálogo de propiedades. Adjunto una
>> captura en la que se muestra como no muestra el origen de los datos ni el
>> fichero asociado.
>>
>>
>>
>>
>> El 27 de enero de 2009 13:48, Nacho Uve <nachouve en gmail.com> escribió:
>>
>> 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/20090212/5c233392/attachment.htm


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