Hola de nuevo a todos,<div><br></div><div>He simplificado la consulta del anterior e-mail a algo asi como:</div><div><br></div><div>select min(abs( ATT1 - myVariable1 + ATT2 - myVariable2 + ... + ATTN - myVariableN)) from myTable;</div>
<div><br></div><div>Pero me he encontrado con el siguiente error en tiempo de ejecución:</div><div><br></div><div><div>java.lang.NullPointerException</div><div>        at com.hardcode.gdbms.engine.function.FunctionManager.getFunction(Funct</div>
<div>onManager.java:46)</div><div>        at com.hardcode.gdbms.engine.instruction.FunctionAdapter.isAggregated(F</div><div>nctionAdapter.java:36)</div><div>        at com.hardcode.gdbms.engine.instruction.UnaryExprAdapter.isAggregated(</div>
<div>naryExprAdapter.java:109)</div><div>        at com.hardcode.gdbms.engine.instruction.ProductExprAdapter.isAggregate</div><div>(ProductExprAdapter.java:128)</div><div>        at com.hardcode.gdbms.engine.strategies.FirstStrategy.select(FirstStrat</div>
<div>gy.java:53)</div><div>        at com.hardcode.gdbms.engine.data.DataSourceFactory.getDataSource(DataS</div><div>urceFactory.java:1342)</div><div>        at com.hardcode.gdbms.engine.data.DataSourceFactory.executeSQL(DataSour</div>
<div>eFactory.java:1622)</div><div>        at model.spatial.GISOutputExporterVectorLayer.addData(GISOutputExporter</div><div>ectorLayer.java:226)</div><div>        at model.core.Execution.executeRimerCrossValidation(Execution.java:223)</div>
<div>        at model.core.Execution.access$2(Execution.java:210)</div><div>        at model.core.Execution$ActualTask.&lt;init&gt;(Execution.java:256)</div><div>        at model.core.Execution$2.construct(Execution.java:96)</div>
<div>        at model.threadExec.SwingWorker$2.run(SwingWorker.java:60)</div><div>        at java.lang.Thread.run(Unknown Source)</div><div><br></div><div>He echado un vistazo a los ficheros fuente, especialmente a esos que implementan la interfaz &quot;function&quot; de la libGDBMS y he visto que no está implementadas las funciones Min, Abs o Max. Estoy desarrollando mi extensión sobre la versión estable gvSIG 1.11. ¿Sabeis si estas funciones SQL están implementadas en alguna otra librería/extensión o en alguna versión más reciente de gvSIG? Si ese es el caso, podría importarlas a la libGDBMS para trabajar con ellas?</div>
<div><br></div><div>Muchas gracias de antemano,</div><div><br></div><div>Un saludo,</div><div><br></div><div>Alberto</div><div><br></div><div><br></div><br><div class="gmail_quote">2012/8/7 Alberto Calzada <span dir="ltr">&lt;<a href="mailto:albertocalsa@gmail.com" target="_blank">albertocalsa@gmail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hola a todos de nuevo,<div><br></div><div>Estoy desarrollando una extensión para gvSIG y me he vuelto a encasillar en un problemilla que no sé si os habrá sucedido ya a alguno. Estoy intentando crear una consulta SQL para que me devuelva una sola fila (la que busco para añadir los resultados de la ejecución de mi extensión).</div>

<div><br></div><div>El caso es que tengo un problema de precisión de los datos (que tanto de entrada como de salida pueden tener cualquier valor y cualquier formato). Por ese motivo no puedo crear la consulta de forma sencilla con valores exactos tal que así:</div>

<div><br></div><div>select * from myTable where area = &quot;myVariableArea&quot; and perimeter = &quot;myVariablePerimeter&quot; and etc etc</div><div><br></div><div>Lo de area y perimeter es un ejemplo. Yo puedo tener cualquier otro tipo de dato entero o decimal, con cualquier número de decimales...</div>

<div><br></div><div>Por lo tanto, he decidido atacar el problema buscando &quot;la fila más parecida a la que busco&quot;. Por lo tanto estoy tratando de definir una consulta de esta forma:</div><div><br></div><div>select * from myTable as t1 where ( select min(abs( t1.PERIMETER - &quot;myVariablePerimeter&quot; + t1.AREA - &quot;myVariableArea&quot; + etc...</div>

<div><br></div><div>Mando este e-mail a las dos listas porque he probado a definir este tipo de consultas primero con la interfaz gráfica de gvSIG, con la herramienta &quot;Filtro&quot; de la tabla, pero me salta uno de esos bugs de cuando la consulta no está bien definida. (Que podría ser eso porque llevo bastantes años sin tocar SQL...). Si alguno sabe más del tema y ve algún fallo en mi consulta estaría agradecido si me lo pudiera aclarar.</div>

<div><br></div><div>Y también lo mando a la de desarrolladores porque no tengo claro que pueda definir consultas SQL anidadas sobre mi layer.getRecordset() y quizás alguno de los desarrolladores supiera algo al respecto.</div>

<div><br></div><div>El código fuente que utilizo es algo así:</div><div><br></div><div><div>String sqlQuery = &quot;select * from &#39;&quot;+lyr.getRecordset().getName()+&quot;&#39; &quot;;</div><div><span style="white-space:pre-wrap">                                </span></div>

<div><span style="white-space:pre-wrap">                                </span>sqlQuery += &quot;where &quot;+ this.generateQueryFromSample(dsl.getInputCombination(i), lyr.getRecordset().getName());</div><div><span style="white-space:pre-wrap">                                </span>System.out.println(sqlQuery);</div>

<div><span style="white-space:pre-wrap">                                </span>lyr.setActive(true);</div><div><span style="white-space:pre-wrap">                                </span>DataSource ds = lyr.getRecordset().getDataSourceFactory().executeSQL(sqlQuery, DataSourceFactory.AUTOMATIC_OPENING);</div>

<div><span style="white-space:pre-wrap">                                </span>ds.start();</div><div><br></div><div><span style="white-space:pre-wrap">                                        </span>ShpSchemaManager schemaManager = new ShpSchemaManager(docFile.getAbsolutePath());</div>

<div><span style="white-space:pre-wrap">                                        </span>schemaManager.createSchema(outputLyrDef);</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">                                        </span>IFeatureIterator it = lyr.getSource().getFeatureIterator(sqlQuery, lyr.getProjection());</div>

<div><br></div><div><span style="white-space:pre-wrap">                                        </span>for(int counter = 0; counter &lt; ds.getRowCount() &amp;&amp; it.hasNext(); counter++){</div><div><span style="white-space:pre-wrap">                                                </span></div>
<div><span style="white-space:pre-wrap">                                                </span>IFeature geom = (IFeature) it.next();</div><div><span style="white-space:pre-wrap">                                                </span>LinkedList&lt;Value&gt; values = new LinkedList&lt;Value&gt;();</div>
<div><br></div><div><span style="white-space:pre-wrap">                                                </span>//Adding antecedents</div><div><span style="white-space:pre-wrap">                                                </span>Value v[] = lyr.getRecordset().getRow(counter).clone();</div>
<div><span style="white-space:pre-wrap">                                                </span>for(int j=0; j&lt; fieldsExported.size(); j++){</div><div><span style="white-space:pre-wrap">                                                        </span>values.add(v[fieldsExported.get(j)]);</div>
<div><span style="white-space:pre-wrap">                                                </span>}</div><div><span style="white-space:pre-wrap">                                                </span>//AddingConsequent</div><div><span style="white-space:pre-wrap">                                                </span>values.add(v[consequentField]);</div>

<div><span style="white-space:pre-wrap">                                                </span>values.add(ValueFactory.createValueByType(&quot;20.2&quot;, Types.DOUBLE, 8, 4));</div><div><span style="white-space:pre-wrap">                                                </span>geom.setAttributes(values.toArray(new Value[0]));</div>

<div><span style="white-space:pre-wrap">                                                </span></div><div><span style="white-space:pre-wrap">                                                </span>DefaultRowEdited edRow = new DefaultRowEdited(geom,</div><div><span style="white-space:pre-wrap">                                                                </span>DefaultRowEdited.STATUS_ADDED, counter);</div>

<div><span style="white-space:pre-wrap">                                                </span>edRow.setAttributes(values.toArray(new Value[0]));</div><div><span style="white-space:pre-wrap">                                                </span>writeSHP.process(edRow);</div>
<div><span style="white-space:pre-wrap">                                        </span>}</div><div><span style="white-space:pre-wrap">                                        </span>writeSHP.postProcess();<span style="white-space:pre-wrap">                                </span></div>
<div><br></div><div>Donde la función &quot;generateQueryFromSample&quot; es la siguiente (para formar la subconsulta anidada):</div><div><br></div><div><div><span style="white-space:pre-wrap">        </span>private String generateQueryFromSample(Sample s, String tableName){</div>

<div><span style="white-space:pre-wrap">                </span>String <span style="white-space:pre-wrap">        </span>query = &quot; ( select min(abs( &quot;;</div><div><span style="white-space:pre-wrap">                </span>for(int i=0;i&lt;dsl.getHeaderTreeNodes().size();i++){</div>

<div><span style="white-space:pre-wrap">                        </span>if(dsl.getHeaderTreeNodes().get(i).getReferentialSetOfValues().isSpatial()){</div><div><span style="white-space:pre-wrap">                                </span>Input input = s.getInputByTreeNode(dsl.getHeaderTreeNodes().get(i));</div>

<div><span style="white-space:pre-wrap">                                </span>if(input instanceof InputNumerical){</div><div><span style="white-space:pre-wrap">                                        </span>query += dsl.getHeaderTreeNodes().get(i).getReferentialSetOfValues().getSpaAttName() + &quot; - &quot; + input.print();</div>

<div><span style="white-space:pre-wrap">                                        </span></div><div><span style="white-space:pre-wrap">                                        </span>if(i&lt;dsl.getHeaderTreeNodes().size() -1) </div><div><span style="white-space:pre-wrap">                                                </span>query += &quot; + &quot;;</div>

<div><span style="white-space:pre-wrap">                                </span>}</div><div><span style="white-space:pre-wrap">                        </span>}</div><div><span style="white-space:pre-wrap">                </span>}</div>
<div><span style="white-space:pre-wrap">                </span>return query + &quot;)) FROM &quot;+tableName+&quot;);&quot;;</div><div><span style="white-space:pre-wrap">        </span>}<span style="white-space:pre-wrap">        </span></div>
</div><div><br></div><div>Y bueno, por si os sirviera de algo para diagnosticar alguno de los muchos fallos que tengo por aquí, dejo también el stack del error en tiempo de ejecución que me salta cuando intento procesar la consulta:</div>

<div><br></div><div><div>getDbfIdForCharset windows-1252 dbfId = 0</div><div><b>select * from &#39;gdbms6b0a742e_139006f52eb__8000&#39; where  ( select min(abs( PERIMET</b></div><div><b>ER - 135.43919372558594 + AREA - 1071.75146484375 + h_p - 0.0)) FROM gdbms6b0a74</b></div>

<div><b>2e_139006f52eb__8000);</b></div><div>Exception in thread &quot;Thread-2624&quot; com.hardcode.gdbms.parser.SQLEngine$LookaheadS</div><div>uccess</div><div>        at com.hardcode.gdbms.parser.SQLEngine.&lt;init&gt;(SQLEngine.java:3462)</div>

<div>        at com.hardcode.gdbms.engine.data.DataSourceFactory.executeSQL(DataSourc</div><div>eFactory.java:1609)</div><div>        at model.spatial.GISOutputExporterVectorLayer.addData(GISOutputExporterV</div><div>ectorLayer.java:224)</div>

<div>        at model.core.Execution.executeRimerCrossValidation(Execution.java:223)</div><div>        at model.core.Execution.access$2(Execution.java:210)</div><div>        at model.core.Execution$ActualTask.&lt;init&gt;(Execution.java:256)</div>

<div>        at model.core.Execution$2.construct(Execution.java:96)</div><div>        at model.threadExec.SwingWorker$2.run(SwingWorker.java:60)</div><div>        at java.lang.Thread.run(Unknown Source)</div></div><div><br>

</div><div>En negrita es un system.out.println de la consulta que hago.</div><div>Decir que cuando hago una consulta simple sin la claúsula &quot;WHERE&quot; sí que me devuelve un DataSource con todos los registros de mi tabla, por lo que la tabla, y creo que los campos, sí que son correctos.</div>

<div><br></div><div>Espero que alguien me pueda echar un cable,</div><div><br></div><div>Muchísimas gracias de antemano,</div><div><br></div><div>Un saludo,</div><div><br></div><div>Alberto</div><div><br></div><div><br></div>

-- <br><i><font face="arial, helvetica, sans-serif" color="#666666">-- <br></font></i><div><p style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><i><font face="arial, helvetica, sans-serif" color="#666666"><span style="background-image:initial">Mr Alberto Calzada<br>

Full-time PhD Candidate</span><u></u><u></u></font></i></p><p style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><i><font face="arial, helvetica, sans-serif" color="#666666"><span style="background-image:initial">Room 16J25</span> </font></i>
</p></div><div><p style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><i><font face="arial, helvetica, sans-serif" color="#666666"><span style="background-image:initial">School of Computing and Mathematics<br>

Faculty of Computing and Engineering</span></font></i></p></div><div><p style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><i><font face="arial, helvetica, sans-serif" color="#666666"><span style="background-image:initial">University of Ulster at Jordanstown Campus<br>

Northern Ireland, UK<br>Email: </span><span style="background-repeat:initial initial;background-image:initial"><a href="mailto:Calzada-A@email.ulster.ac.uk" target="_blank">Calzada-A@email.ulster.ac.uk</a></span></font></i></p>

<p style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><i><font face="arial, helvetica, sans-serif" color="#666666"><span style="background-image:initial">Tel: </span>
<span style>+44 28 90361114</span> </font></i></p></div><br>
</div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><i><font face="arial, helvetica, sans-serif" color="#666666">-- <br></font></i><div><p style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">
<i><font face="arial, helvetica, sans-serif" color="#666666"><span style="background-image:initial;background-color:white">Mr Alberto Calzada<br>Full-time PhD Candidate</span><u></u><u></u></font></i></p><p style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">
<i><font face="arial, helvetica, sans-serif" color="#666666"><span style="background-image:initial;background-color:white">Room 16J25</span> </font></i>
</p></div><div><p style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><i><font face="arial, helvetica, sans-serif" color="#666666"><span style="background-image:initial;background-color:white">School of Computing and Mathematics<br>
Faculty of Computing and Engineering</span></font></i></p></div><div><p style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><i><font face="arial, helvetica, sans-serif" color="#666666"><span style="background-image:initial;background-color:white">University of Ulster at Jordanstown Campus<br>
Northern Ireland, UK<br>Email: </span><span style="background-image:initial;background-color:white;background-repeat:initial initial"><a href="mailto:Calzada-A@email.ulster.ac.uk" target="_blank">Calzada-A@email.ulster.ac.uk</a></span></font></i></p>
<p style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><i><font face="arial, helvetica, sans-serif" color="#666666"><span style="background-image:initial;background-color:white">Tel: </span>
<span style="background-color:rgb(255,255,255)">+44 28 90361114</span> </font></i></p></div><br>
</div>