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 class="Apple-tab-span" style="white-space:pre">                                </span></div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>sqlQuery += &quot;where &quot;+ this.generateQueryFromSample(dsl.getInputCombination(i), lyr.getRecordset().getName());</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>System.out.println(sqlQuery);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>lyr.setActive(true);</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>DataSource ds = lyr.getRecordset().getDataSourceFactory().executeSQL(sqlQuery, DataSourceFactory.AUTOMATIC_OPENING);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>ds.start();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>ShpSchemaManager schemaManager = new ShpSchemaManager(docFile.getAbsolutePath());</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>schemaManager.createSchema(outputLyrDef);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>IFeatureIterator it = lyr.getSource().getFeatureIterator(sqlQuery, lyr.getProjection());</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>for(int counter = 0; counter &lt; ds.getRowCount() &amp;&amp; it.hasNext(); counter++){</div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span></div>
<div><span class="Apple-tab-span" style="white-space:pre">                                                </span>IFeature geom = (IFeature) it.next();</div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span>LinkedList&lt;Value&gt; values = new LinkedList&lt;Value&gt;();</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span>//Adding antecedents</div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span>Value v[] = lyr.getRecordset().getRow(counter).clone();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                                </span>for(int j=0; j&lt; fieldsExported.size(); j++){</div><div><span class="Apple-tab-span" style="white-space:pre">                                                        </span>values.add(v[fieldsExported.get(j)]);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span>//AddingConsequent</div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span>values.add(v[consequentField]);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                                </span>values.add(ValueFactory.createValueByType(&quot;20.2&quot;, Types.DOUBLE, 8, 4));</div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span>geom.setAttributes(values.toArray(new Value[0]));</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span>DefaultRowEdited edRow = new DefaultRowEdited(geom,</div><div><span class="Apple-tab-span" style="white-space:pre">                                                                </span>DefaultRowEdited.STATUS_ADDED, counter);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                                </span>edRow.setAttributes(values.toArray(new Value[0]));</div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span>writeSHP.process(edRow);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>writeSHP.postProcess();<span class="Apple-tab-span" style="white-space:pre">                                </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 class="Apple-tab-span" style="white-space:pre">        </span>private String generateQueryFromSample(Sample s, String tableName){</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>String <span class="Apple-tab-span" style="white-space:pre">        </span>query = &quot; ( select min(abs( &quot;;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>for(int i=0;i&lt;dsl.getHeaderTreeNodes().size();i++){</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>if(dsl.getHeaderTreeNodes().get(i).getReferentialSetOfValues().isSpatial()){</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>Input input = s.getInputByTreeNode(dsl.getHeaderTreeNodes().get(i));</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>if(input instanceof InputNumerical){</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>query += dsl.getHeaderTreeNodes().get(i).getReferentialSetOfValues().getSpaAttName() + &quot; - &quot; + input.print();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span></div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>if(i&lt;dsl.getHeaderTreeNodes().size() -1) </div><div><span class="Apple-tab-span" style="white-space:pre">                                                </span>query += &quot; + &quot;;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>return query + &quot;)) FROM &quot;+tableName+&quot;);&quot;;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}<span class="Apple-tab-span" style="white-space:pre">        </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;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>