Page 1 of 1

Seek and MySql

Posted: Sat Oct 31, 2009 6:12 am
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

Re: Seek and MySql

Posted: Sat Oct 31, 2009 11:17 am
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"

Re: Seek and MySql

Posted: Sat Oct 31, 2009 12:18 pm
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!

Re: Seek and MySql

Posted: Sat Oct 31, 2009 3:15 pm
by Armando
Hola:

Miren este hilo, tal vez les puede ayudar.

http://forums.fivetechsupport.com/viewt ... 46&start=0

Saludos

Re: Seek and MySql

Posted: Sat Oct 31, 2009 10:28 pm
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

Re: Seek and MySql

Posted: Sun Nov 01, 2009 6:25 am
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

Re: Seek and MySql

Posted: Sun Nov 01, 2009 8:31 pm
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

Re: Seek and MySql

Posted: Mon Nov 02, 2009 3:42 am
by Mauricio
Hola,

en SqlRDD puedes hacerlo,

alguna otra sugerencia para MySql,


saludos,
Mauricio

Re: Seek and MySql

Posted: Mon Nov 02, 2009 4:19 am
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.

Re: Seek and MySql

Posted: Mon Nov 02, 2009 4:30 am
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.

Re: Seek and MySql

Posted: Mon Nov 02, 2009 4:42 am
by Mauricio
Gracias Don Alfredo,

aqui estaremos muchos al pendiente de sus comentarios,

un saludo cordial,
Mauricio

Re: Seek and MySql

Posted: Mon Nov 02, 2009 5:56 am
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 */

Re: Seek and MySql

Posted: Mon Nov 02, 2009 7:13 pm
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.

Re: Seek and MySql

Posted: Tue Nov 03, 2009 12:21 am
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)

Re: Seek and MySql

Posted: Thu Nov 12, 2009 9:10 am
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