Seek and MySql

Post Reply
User avatar
Mauricio
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Seek and MySql

Post by Mauricio »

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
User avatar
pablovidal
Posts: 398
Joined: Thu Oct 06, 2005 10:15 pm
Location: Republica Dominicana
Contact:

Re: Seek and MySql

Post by pablovidal »

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: Select all

"select descripcion, direccion, otra_mas from mitabla where codigo='001' limit 1"
Saludos,

Pablo Alberto Vidal
/*
------------------------------------------------------
Harbour 3.2.0, Fivewin 17.02, BCC7
------------------------------------------------------
*/
User avatar
TecniSoftware
Posts: 213
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

Re: Seek and MySql

Post by TecniSoftware »

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
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: Seek and MySql

Post by Armando »

Hola:

Miren este hilo, tal vez les puede ayudar.

http://forums.fivetechsupport.com/viewt ... 46&start=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
jbrita
Posts: 425
Joined: Mon Jan 16, 2006 3:42 pm

Re: Seek and MySql

Post by jbrita »

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
User avatar
Mauricio
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Re: Seek and MySql

Post by Mauricio »

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
User avatar
Ramon Paredes
Posts: 215
Joined: Fri Feb 02, 2007 3:38 pm
Location: Managua, Nicaragua

Re: Seek and MySql

Post by Ramon Paredes »

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......
User avatar
Mauricio
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Re: Seek and MySql

Post by Mauricio »

Hola,

en SqlRDD puedes hacerlo,

alguna otra sugerencia para MySql,


saludos,
Mauricio
User avatar
Alfredo Arteaga
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico
Contact:

Re: Seek and MySql

Post by Alfredo Arteaga »

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.
User avatar
Alfredo Arteaga
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico
Contact:

Re: Seek and MySql

Post by Alfredo Arteaga »

...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.
User avatar
Mauricio
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Re: Seek and MySql

Post by Mauricio »

Gracias Don Alfredo,

aqui estaremos muchos al pendiente de sus comentarios,

un saludo cordial,
Mauricio
User avatar
Alfredo Arteaga
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico
Contact:

Re: Seek and MySql

Post by Alfredo Arteaga »

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 */
User avatar
Alfredo Arteaga
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico
Contact:

Re: Seek and MySql

Post by Alfredo Arteaga »

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.
User avatar
Willi Quintana
Posts: 859
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú
Contact:

Re: Seek and MySql

Post by Willi Quintana »

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)
User avatar
Mauricio
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Re: Seek and MySql

Post by Mauricio »

Hola

la forma mas sencilla que pude encontrar fue hacer un medio seek

Code: Select all


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

 
Post Reply