[Gvsig_desarrolladores] Re: Editar un valor en un registro

Francisco José Peñarrubia fpenarru en gmail.com
Mar Ene 27 13:55:01 CET 2009


Puedes hacer tus cambios y luego llamar al reload de la capa. (No 
recuerdo ahora mismo cómo se hace eso, pero míralo en el menu "reload")
Revisa que estás haciendo bien lo de recorrer todas las filas y 
volverlas a escribir, porque IndexedShapeDriver ya hace eso 
automáticamente. Solo tienes que pasarle los registros modificados.
Y si no quieres usar eso, prueba el primer truco, que usa un acceso 
aleatorio.

Saludos.

Fran.

Nacho Uve 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 
> <mailto: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 <mailto: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>
>             <mailto: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
>             <mailto: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
>         <mailto: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
>   



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