Busqueda numerica por aproximacion

Busqueda numerica por aproximacion

Postby FranciscoA » Fri Aug 19, 2016 12:20 am

Saludos amigos del foro.
Tengo necesidad de una funcion para buscar valores numericos por aproximacion, en una tabla dbf.
Agradeceré mucho si alguno de ustedes ya la ha desarrollado y pueda compartirla.

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Busqueda numerica por aproximacion

Postby cnavarro » Fri Aug 19, 2016 12:23 am

No entiendo bien lo que quieres decir
El número más aproximado al introducido?
Está ordenado por ese campo la base de datos?
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6541
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Busqueda numerica por aproximacion

Postby FranciscoA » Fri Aug 19, 2016 12:32 am

cnavarro wrote:No entiendo bien lo que quieres decir
El número más aproximado al introducido?
Está ordenado por ese campo la base de datos?


Gracias por contestar.
Asi es, el valor mas aproximado al introducido (o tomado de otra tabla).
La tabla está ordenada de manera ascendente por estos valores, y muchos de ellos se repiten (esto ultimo no tengo problema en controlar, con otro campo).

Nuevamente gracias por cualquier sugerencia o código.

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Busqueda numerica por aproximacion

Postby FranciscoA » Fri Aug 19, 2016 12:38 am

Se me olvidó comentar que al usar DbSeek(nValue,.t.) y no encontrar el valor, el cursor se sitúa en el siguiente registro.
El caso es que el valor aproximado a encontrar puede ser mayor o menor al valor digitado.
Gracias.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Busqueda numerica por aproximacion

Postby cnavarro » Fri Aug 19, 2016 2:05 am

Bien, te cuento lo que se me ocurre
Como el DbSeek( uval, .T. ) se sitúa en el valor superior al buscado, coge la diferencia con el anterior y posterior y compruebas cuál es el más aproximado
Se me debe escapar algo que no te he entendido porque seguro que esa solución ya la habías pensado
Lo segundo es hacer una búsqueda "dicotómica" a mano
Saludos
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6541
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Busqueda numerica por aproximacion

Postby FranciscoA » Fri Aug 19, 2016 2:21 am

Cristobal.
Muchisimas gracias.
Efectivamente, asi la he finalizado, comparando valores de registro anterior y registro donde se colocó el cursor, y el de menor diferencia lo tomo como el mas aproximado.
Aqui esta la funcioncita, algo "chapiolla", pero me funciona.

Code: Select all  Expand view
if misgets("Buscar valor aproximado","","Introduzca valor",@nVal,"lupa",.t.)
   if !(cAlias)->(dbSeek(nVal,.t.))
       msginfo("No encontrado valor exacto")
       nRec := Recno()
       dbskip(-1)
       nValAnt := Abs( nVal - field->debe )
       dbskip()
       nValPos := Abs( nVal - field->debe )
       nValAprox := Min(nValAnt,nValPos)  
       MsgInfo("Valor aproximado es "+Transform(nValAprox,"999,999,999.99"))
       if nValAnt < nValPos
          dbskip(-1)
       endif
       oBrw3:Refresh()
       MsgInfo("Valor a buscar  " + Transform(nVal,"999,999.99") +CRLF+;
               "Valor anterior  " + Transform(nValAnt,"999,999.99") +CRLF+;
               "Valor Posterior " + Transform(nValPos,"999,999.99") +CRLF+;
               "Valor Aproximado " + Transform(nValAProx,"999,999.99") )
   endif
endif
 

Saludos, y nuevamente agradezco tu interés.

Francisco

EDITADO...
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Busqueda numerica por aproximacion

Postby cnavarro » Fri Aug 19, 2016 3:26 am

Francisco, creo que te falta en los DbSkip controlar el Eof() y el Bof()
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6541
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Busqueda numerica por aproximacion

Postby FranciscoA » Fri Aug 19, 2016 12:34 pm

cnavarro wrote:Francisco, creo que te falta en los DbSkip controlar el Eof() y el Bof()

Tienes toda la razón. Voy a modificarla.
Muchas gracias.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 39 guests