[Gvsig_desarrolladores] Re: campos date en postGIS

Santiago Lorenzo santiago.lorenzo en alborgis.com
Vie Abr 25 14:53:00 CEST 2008


A continuación, publico la traza del error que me salta al terminar 
edición en la capa, por si sirve de ayuda para debugar el tema de los 
campos date en postGIS. Lo que hace mi código es:

            VectorialEditableDBAdapter vea = 
(VectorialEditableDBAdapter) capa.getSource();
            FBitSet fbs = vea.getSelection();
            int ix = fbs.nextSetBit(0);
            IRowEdited row = vea.getRow(ix);
            Value[] values = row.getAttributes();
             //manipulo los valores...

             //Aqui manipulo el campo date:
                values[3] = ValueFactory
                    .createValue(fechaDate(txtFecOrig.getText()));

             //...
            IRow newRow = null;
            if (row.getLinkedRow() instanceof IFeature) {
                IGeometry geometry = ((DefaultFeature)
row.getLinkedRow())
                        .getGeometry();
                newRow = new DefaultFeature(geometry, values,
row.getID());
            } else {
                newRow = new DefaultRow(values, row.getID());
            }
            vea.modifyRow(ix, newRow, "Editar valor", 13);

Mi función fechaDate parsea el texto y lo convierte a tipo Date para 
pasarselo al ValueFactory. A partir de ahí, es el ValueFactory y el 
resto de clases de gvSIG quienes manipulan el objeto de tipo Date 
(java.util.Date) y le dan formato. Al parecer, segun se ve en la 
consola, al terminar la edición, gvSIG intenta pasar a la base de datos 
la sentencia:

sql = INSERT INTO public.fichas ( id_informante, bibliografia_ficha, 
fecha_origen_ficha, lugar_origen_ficha, descriptor1, descriptor2, 
descriptor3, categoria, subcategoria, texto_ficha, imagen_ficha, 
documento_ficha, notas_ficha, geometria ) VALUES (2, ' tgreaw ge', 
'12-dic-2012', 'ewgfw', 2, 29, null, 'HISTORIA', 'VISIGODA', 'gwgwg', 
'wgwg', 'gwgw', 'wg',  GeometryFromText( 'POINT (480442.7734516218 
4598657.129832971)', 23030) )

donde se ve que intenta colarle a postGIS la cadena '12-dic-2012' en un 
campo de tipo date.

org.postgresql.util.PSQLException: ERROR: la sintaxis de entrada no es 
válida para tipo date: «12-dic-2012»

    at 
org.postgresql.util.PSQLException.parseServerError(PSQLException.java:139)
    at org.postgresql.core.QueryExecutor.executeV3(QueryExecutor.java:152)
    at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:100)
    at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:43)
    at 
org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:517)
    at 
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:50)
    at 
org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:298)
    at 
com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter.process(PostGISWriter.java:142)
    at 
com.iver.cit.gvsig.fmap.edition.EditableAdapter.saveEdits(EditableAdapter.java:379)
    at 
com.iver.cit.gvsig.fmap.edition.EditableAdapter.stopEdition(EditableAdapter.java:262)
    at 
com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter.stopEdition(VectorialEditableAdapter.java:961)
    at 
com.iver.cit.gvsig.fmap.edition.VectorialEditableDBAdapter.stopEdition(VectorialEditableDBAdapter.java:411)
    at com.iver.cit.gvsig.StopEditing.saveLayer(StopEditing.java:226)
    at com.iver.cit.gvsig.StopEditing.stopEditing(StopEditing.java:138)
    at com.iver.cit.gvsig.StopEditing.execute(StopEditing.java:85)
    at 
com.iver.cit.gvsig.project.documents.view.toc.actions.StopEditingTocMenuEntry.execute(StopEditingTocMenuEntry.java:42)
    at 
com.iver.cit.gvsig.project.documents.view.toc.AbstractTocContextMenuAction.execute(AbstractTocContextMenuAction.java:39)
    at 
com.iver.cit.gvsig.project.documents.view.toc.gui.FPopupMenu$MenuItem.actionPerformed(FPopupMenu.java:305)
    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)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:302)
    at 
javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1051)
    at 
javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1092)
    at java.awt.Component.processMouseEvent(Component.java:5517)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
    at java.awt.Component.processEvent(Component.java:5282)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3984)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3819)
    at 
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Component.dispatchEvent(Component.java:3819)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at 
com.iver.andami.ui.AndamiEventQueue.dispatchEvent(AndamiEventQueue.java:58)
    at 
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at 
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
DEBUG [AWT-EventQueue-1] (NotificationManager.java:104) - 
com.iver.cit.gvsig.fmap.edition.EditionException: 
org.postgresql.util.PSQLException: ERROR: la sintaxis de entrada no es 
válida para tipo date: «12-dic-2012»

com.iver.cit.gvsig.fmap.edition.EditionException: 
org.postgresql.util.PSQLException: ERROR: la sintaxis de entrada no es 
válida para tipo date: «12-dic-2012»

    at 
com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter.process(PostGISWriter.java:175)
    at 
com.iver.cit.gvsig.fmap.edition.EditableAdapter.saveEdits(EditableAdapter.java:379)
    at 
com.iver.cit.gvsig.fmap.edition.EditableAdapter.stopEdition(EditableAdapter.java:262)
    at 
com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter.stopEdition(VectorialEditableAdapter.java:961)
    at 
com.iver.cit.gvsig.fmap.edition.VectorialEditableDBAdapter.stopEdition(VectorialEditableDBAdapter.java:411)
    at com.iver.cit.gvsig.StopEditing.saveLayer(StopEditing.java:226)
    at com.iver.cit.gvsig.StopEditing.stopEditing(StopEditing.java:138)
    at com.iver.cit.gvsig.StopEditing.execute(StopEditing.java:85)
    at 
com.iver.cit.gvsig.project.documents.view.toc.actions.StopEditingTocMenuEntry.execute(StopEditingTocMenuEntry.java:42)
    at 
com.iver.cit.gvsig.project.documents.view.toc.AbstractTocContextMenuAction.execute(AbstractTocContextMenuAction.java:39)
    at 
com.iver.cit.gvsig.project.documents.view.toc.gui.FPopupMenu$MenuItem.actionPerformed(FPopupMenu.java:305)
    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)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:302)
    at 
javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1051)
    at 
javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1092)
    at java.awt.Component.processMouseEvent(Component.java:5517)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
    at java.awt.Component.processEvent(Component.java:5282)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3984)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3819)
    at 
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Component.dispatchEvent(Component.java:3819)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at 
com.iver.andami.ui.AndamiEventQueue.dispatchEvent(AndamiEventQueue.java:58)
    at 
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at 
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Caused by: org.postgresql.util.PSQLException: ERROR: la sintaxis de 
entrada no es válida para tipo date: «12-dic-2012»

    at 
org.postgresql.util.PSQLException.parseServerError(PSQLException.java:139)
    at org.postgresql.core.QueryExecutor.executeV3(QueryExecutor.java:152)
    at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:100)
    at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:43)
    at 
org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:517)
    at 
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:50)
    at 
org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:298)
    at 
com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter.process(PostGISWriter.java:142)
    ... 36 more

Santiago Lorenzo escribió:
> Gracias Cesar,
>
> El problema de escribir en postGIS con una sentencia SQL parece que lo 
> he resuelto con ayuda del SimpleDateFormat de Java. La verdad es que 
> estoy acostumbrado a programar en .NET y, de entrada, las clases de 
> Java para manejar fechas me resultan... poco amigables.
>
> El problema está en editar capas de gvSIG a traves de las clases de 
> gvSIG (VectorialEditableDBAdapter, ValueFactory, etc..) En particular, 
> creo que hay un bug en el funcionamiento del DataValue o de algún 
> objeto que lo maneje. Los errores que describo se ponen de manifiesto 
> con las tablas de gvGIG tal como está, sin tocar nada en el código.
>
> Gracias de nuevo.
>
> Un saludo
>
> Cesar Escribano escribió:
>> Buenos días santiago.
>> No se si ya habrás resuelto tu problema con las fechas en PostGIS.
>> Yo te envío una especie de apaño qeu utilizo yo para escribir fechas 
>> en la base de datos.
>> Como he estado trabajando simultáneamente con Oracle y con PostGIS, 
>> verás que en cada caso trato la fecha de un modo algo distinto.
>>  
>>
>> public void crearOperacion(int gid){
>>  Date fecha = null;
>>  SimpleDateFormat sdf = null;
>>  String DATE_FORMAT_ORACLE="dd-MM-yyyy HH:mm:ss";
>>  String DATE_FORMAT_POSTGIS="yyyy-MM-dd";
>>  String cadenaFecha=null;
>>  
>>  op.set_Gid(gid);
>>  //fecha=limpiaFecha(String.valueOf(op.get_Fecha()));
>>  if (pdb.getNombreDriver().equals("Oracle Spatial Database Driver")){
>>   if (sdf==null){
>>    sdf=new SimpleDateFormat(DATE_FORMAT_ORACLE);
>>   }
>>  }
>>
>>  if (pdb.getNombreDriver().equals("PostGIS JDBC Driver")){
>>   if (sdf==null){
>>    sdf=new SimpleDateFormat(DATE_FORMAT_POSTGIS);
>>   }
>>  }
>>  if (fecha==null){
>>   fecha = new Date();
>>  }
>>  
>>  cadenaFecha=limpiaFecha(sdf.format(fecha));
>>  //JOptionPane.showMessageDialog(null,cadenaFecha);
>>  
>>    try {
>>   if(gps.getGestorBD().conectar2(pdb)==true){
>>    gps.getGestorBD().consultaINSERT("INSERT INTO "+tablaOP+" 
>> (id_operacion, id_tipooperacion, id_estado, id_usuario, fecha, 
>> id_usuariovalida, fecha_valida, gid) VALUES 
>> ("+op.getId_operacion()+","+op.getId_tipooperacion()+","+op.get_Estado()+","+op.getId_Usuario()+","+cadenaFecha+",null,null,"+op.get_Gid()+")"); 
>>
>>    gps.getGestorBD().close();
>> ....
>>
>>  
>>
>>  
>>
>> public String limpiaFecha(String cadenafecha){
>>  String cadenaauxiliar="";
>>  String fecha="";
>>  
>>  //Nos quedamos con los primeros 10 caracteres
>>  
>>  cadenaauxiliar=cadenaauxiliar+cadenafecha.substring(0,10);
>>  
>>  //Si lo primero que aparece es el año, aplicamos un formato
>>  //Si lo primero que aparece es el día, aplicamos otro formato
>>  if(cadenaauxiliar.charAt(2)!='-'){
>>   fecha="to_date('"+cadenaauxiliar+"','YYYY-MM-DD')";
>>  }else{
>>   fecha="to_date('"+cadenaauxiliar+"','DD-MM-YYYY')";
>>  }//Fin del if
>>  return fecha;
>> }// fin de LimpiaFecha
>>
>>
>> No te pierda en gps.getGestorBD().conectar2(pdb... son objetos 
>> creados por mi, propios de mi aplicación. Lo importante es el formato 
>> de las fechas y la función limpiaFecha(). Esta función devuelve una 
>> "cadenaauxiliar" tipo String que es la que escribo el correspondiente 
>> campo de la base de datos. Escribir en la base de datos lo hago 
>> mediante gps.getGestorBD().consultaINSERT("INSERT INTO "+tablaOP........
>>  
>> Un saludo.
>> Espero qeu te sirva o que alguien te haya ayudado de otra forma más 
>> satisfactoria.
>>  
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> 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