FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Seek and MySql
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Seek and MySql
Posted: Sat Oct 31, 2009 06:12 AM

Hola,

Cual es la forma de hacer un Seek en una tabla de MySql, usando TMySql.

en DBF hacemos
cTabla->( ordsetfocus(1)) // por codigo
cTabla->( dbseek(cCodigo))

como se reemplaza este codigo en TMySql, en la clase TMySql viene LOCATE, pero hace una busqueda secuencial, lo cual en tablas grandes es una locura.

ahora lo estoy haciendo con un while a la tabla y comparo la cadena a buscar, pero es muy lento.

Saludos,
Mauricio

Posts: 401
Joined: Thu Oct 06, 2005 10:15 PM
Re: Seek and MySql
Posted: Sat Oct 31, 2009 11:17 AM
Saludos,

Para trabajar con MySql OLVIDATE de lo que es trabajar con DBF's es algo totalmente diferente.
recueda en Mysql son como 7 comandos que se usan para todo.

Un ejemplo de busqueda es:

Code (fw): Select all Collapse
"select descripcion, direccion, otra_mas from mitabla where codigo='001' limit 1"
Saludos,



Pablo Alberto Vidal

/*

------------------------------------------------------

Harbour 3.2.0, Fivewin 17.02, BCC7

------------------------------------------------------

*/
Posts: 244
Joined: Fri Oct 28, 2005 06:29 PM
Re: Seek and MySql
Posted: Sat Oct 31, 2009 12:18 PM

Pablo

Yo tambien estoy experimentando para tratar empezar a desarrollar en con TMySql y al igual que Mauricio, tengo la misma duda con DbSeek().
Se que son dos cosas totalmente distintas pero ha de haber algun tipo de equivalencia.

Por ejemplo: cuando haces un dbseek, éste de devuelve un .T. o .F. dependiendo de la existencia o no de lo que buscas, pero como se reproduce
la misma respuesta usando TMySql ?

Muchos saludos!

Alejandro Cebolido

Buenos Aires, Argentina
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Seek and MySql
Posted: Sat Oct 31, 2009 03:15 PM

Hola:

Miren este hilo, tal vez les puede ayudar.

viewtopic.php?f=6t=17146start=0

Saludos

&&

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: Seek and MySql
Posted: Sat Oct 31, 2009 10:28 PM

puede ser esto:

oLbx:bKeyDown := {|nKey| ( SeekMySql(nKey,@cBusca,oLbx,oOrden,oTabla),oLbx:Refresh(),oGet:Refresh() )}

STATIC FUNCTION SeekMySql(nKey,cBusca,oLbx,oOrden,oTabla)
*-----------------------------------------------------
oTB:End()

If nKey=8
cbusca:= SubStr(cbusca,1,Len(cbusca)-1)
oTb:cQuery:= 'SELECT * FROM '+oTabla+' WHERE '+oOrden+" LIKE '"+cbusca+"%' ORDER BY "+oOrden
Else
cbusca:=cbusca + Upper(chr(nkey))
oTb:cQuery:= 'SELECT * FROM '+oTabla+' WHERE '+oOrden+" LIKE '"+UPPER( cBusca)+"%' ORDER BY "+oOrden
if oTb:reccount() == 0
msginfo('No se encotro el nombre ', "Atencion" )
cbusca:=left(cbusca,len(cbusca)-1)
oTb:cQuery:= 'SELECT * FROM '+oTabla+' WHERE '+oOrden+" LIKE '"+UPPER( cBusca)+"%' ORDER BY "+oOrden
Endif
Endif
oLbx:REFRESH()
oLbx:oVScroll:SeTPOS(oTB:RECNO())

oTb:refresh()
oLbx:Refresh(.t.)
return nil

Saludos

Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: Seek and MySql
Posted: Sun Nov 01, 2009 06:25 AM

Gracias a todos por sus respuestas.

Pablo, como lo comento Alejandro, el ejemplo que pongo del Seek en DBF es para buscar algo similar.

probare las soluciones ofrecidades por todos, aqui comentare los resultados.

aunque estaba pensando en hacerlo con las antiguas soluciones de GW Basic o Pascal, haciendo mi busqueda con el metodo de l burbuja.

alguien recuerda como se hacian las busquedas en GW Basic , Pascal , la famosa busqueda binaria que xBase nos hizo que la olvidaramos.

saludos,
Mauricio

Posts: 215
Joined: Fri Feb 02, 2007 03:38 PM
Re: Seek and MySql
Posted: Sun Nov 01, 2009 08:31 PM

Estimados,

Actualmente estoy en desarrollo de una aplicacion amplia con xhb904 + mysql 5.1 + SQLRDD y me tope con ese problema que el seek normal no funciona, lo resolvi de la siguiente manera y me funciona :

SELECT MITABLA
MITABLA->(ORDSETFOUCS("MIINDICE" )) // OJO USO INDICES SOLO PARA BUSQUEDAS Y CONSULTAS
LOCATE FOR MITABLA->CAMPO = CCAMPO
IF EOF()
MSGALERT(" NO ENCUENTRO ESE DATO" )
ELSE
MSGALERT(" EL DATO YA EXISTE" )
ENDIF

RETURN XRESULTADO

... Desde la Tierra de lagos y Volcanes......
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: Seek and MySql
Posted: Mon Nov 02, 2009 03:42 AM

Hola,

en SqlRDD puedes hacerlo,

alguna otra sugerencia para MySql,

saludos,
Mauricio

Posts: 326
Joined: Sun Oct 09, 2005 05:22 PM
Re: Seek and MySql
Posted: Mon Nov 02, 2009 04:19 AM

Uso SQLRDD y no he tenido problema de búsquedas con (cAlias)->(DBSeek(cKey)).

He revisado un proceso crítico y tengo más de 40 instrucciones de búsqueda a mas de 15 diferentes tablas, digo crítico porque el proceso es usado en forma local y remota en forma concurrente.

Posts: 326
Joined: Sun Oct 09, 2005 05:22 PM
Re: Seek and MySql
Posted: Mon Nov 02, 2009 04:30 AM

...y respondiendo a Mauricio.

El proceso comentado esta sobre MySQL. Y el mismo esquema esta probado y trabajando sobre SQL Server y PosgreSQL.

Vere si puedo hacer un 'trace' para descubrir como es que lo hace el RDD.

Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: Seek and MySql
Posted: Mon Nov 02, 2009 04:42 AM

Gracias Don Alfredo,

aqui estaremos muchos al pendiente de sus comentarios,

un saludo cordial,
Mauricio

Posts: 326
Joined: Sun Oct 09, 2005 05:22 PM
Re: Seek and MySql
Posted: Mon Nov 02, 2009 05:56 AM

Si de algo sirve.

Con: Clientes->(DbSeek(Alltrim(cNombre),.T.))
Se genera: SELECT A.nombre FROM clientes_dbf A WHERE (( A.nombre >= 'HOLA' )) ORDER BY A.nombre LIMIT 1 / SoftSeek 1 /

Posts: 326
Joined: Sun Oct 09, 2005 05:22 PM
Re: Seek and MySql
Posted: Mon Nov 02, 2009 07:13 PM

Aquí una prueba: http://www.despachoarteaga.com.mx/TestSQL.zip

Es un ejemplo que genera una tabla y permite agregar, borrar, modificar, buscar, etc.

Lo interesante. He agregado una función que obtiene las sentencias SQL generadas por el RDD (ver Log.Txt), con esto podemos ver como lo hace y en su caso copiarlas a TMySQL o cualquier otra herramienta toda vez que el tratamiento de datos debe ser el mismo.

Si revisan el ejemplo y quitan algunos comentarios el programa funcionará igual para CDX.

Pueden agregar Scopes, Filters, etc. y activar/descativar el 'trace' donde gusten a fin de obtener el 'query' deseado.

Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
Re: Seek and MySql
Posted: Tue Nov 03, 2009 12:21 AM
Holas...
Deberian probar con esta busqueda binaria, talvez se deba hacer algunos ajustes:
Salu2

...
..
.
cDatos := "8999828982"
nRow := MySeek(oProduc, cDato, nCol)
.
..
...

donde:
oProduc es el contenedor de datos xargado mediante uns SELECT....... ajustar para Eagle, TMySQL, SQLRD etc etc
cDatos es el datos que debemos ubicar
nCol es la columna del contenedor de datos en la que haremos la busqueda.



//-----------------------------------------------------------------------------------------------
Function MySeek(oProduc, cDato, nCol)
local nLen, nRec1, lOk, cCampo, nRow
local nLimIn, nLimSu, nMedio

If oProduc:RecCount() = 0 // si el contenedor esta vacio,,, retornamos 0
Return(0)
EndIf

cDato := ALLTRIM(cDato)
nLen := LEN(cDato) // tomamos la longitud del dato a buscar
nRec1 := oProduc:Recno() // ubicamos el puntero inicial del contenedor
lOk := .f.

nLimIn := 1 // limite inferior 1
nLimSu := oProduc:RecCount() // limite superior numero de registros del contenedor

oProduc:GoTop() // nos ubicamos en el 1er registro

WHILE nLimIn + 1 <> nLimSu // hacemos el while entre los limires inferior y superior
nMedio := INT( (nLimIn + nLimSu) / 2 + 0.5) // tomamos el medio relativo del contenedor
oProduc:GoTo(nMedio) // nos reubicamos al medio relativo
cCampo := SUBSTR(oProduc:FieldGet(nCol),1, nLen) ) // tomamos el dato

IF cCampo == cDato // establecemos la comparacion y recalculamos loslimites si no hallamos el dato
lOk := .t.
EXIT
EndIf
If cDato < cCampo
nLimIn := nLimIn
nLimSu := nMedio
EndIf
If cDato > cCampo
nLimIn := nMedio
nLimSu := nLimSu
EndIf
ENDDO

If !lOk
oProduc:GoTo(nRec1)
nRow := 0
Else
nRow := oProduc:Recno()
EndIf
Return(nRow)
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: Seek and MySql
Posted: Thu Nov 12, 2009 09:10 AM
Hola

la forma mas sencilla que pude encontrar fue hacer un medio seek
Code (fw): Select all Collapse
function xSeek( nFolio )
   local lBusqueda := .f.
   nFolio := str(nFolio)
   nFolio := ltrim(nFolio)
   cSeek :=;
       oMysql:Query( "SELECT codigo,nombre FROM facturas WHERE folio = " + nFolio )
   lBusqueda := iif( cSeek:recCount() != 0, .t., .f.)
   cSeek:end()
   cSeek := NIL
return lBusqueda

Continue the discussion