[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