[Gvsig_desarrolladores] Re: Editar un valor en un registro

Nacho Uve nachouve en gmail.com
Mar Ene 27 17:10:45 CET 2009


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


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