[Gvsig_desarrolladores] Re: Editar un valor en un registro

Francisco José Peñarrubia fpenarru en gmail.com
Lun Ene 26 13:35:56 CET 2009


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
>   



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