Seek and MySql
Seek and MySql
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
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
- pablovidal
- Posts: 398
- Joined: Thu Oct 06, 2005 10:15 pm
- Location: Republica Dominicana
- Contact:
Re: Seek and MySql
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:
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
------------------------------------------------------
*/
Pablo Alberto Vidal
/*
------------------------------------------------------
Harbour 3.2.0, Fivewin 17.02, BCC7
------------------------------------------------------
*/
- TecniSoftware
- Posts: 213
- Joined: Fri Oct 28, 2005 6:29 pm
- Location: Quilmes, Buenos Aires, Argentina
Re: Seek and MySql
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!
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
Buenos Aires, Argentina
Re: Seek and MySql
Hola:
Miren este hilo, tal vez les puede ayudar.
http://forums.fivetechsupport.com/viewt ... 46&start=0
Saludos
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
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Re: Seek and MySql
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
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
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
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
- Ramon Paredes
- Posts: 215
- Joined: Fri Feb 02, 2007 3:38 pm
- Location: Managua, Nicaragua
Re: Seek and MySql
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
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......
Re: Seek and MySql
Hola,
en SqlRDD puedes hacerlo,
alguna otra sugerencia para MySql,
saludos,
Mauricio
en SqlRDD puedes hacerlo,
alguna otra sugerencia para MySql,
saludos,
Mauricio
- Alfredo Arteaga
- Posts: 326
- Joined: Sun Oct 09, 2005 5:22 pm
- Location: Mexico
- Contact:
Re: Seek and MySql
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.
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.
- Alfredo Arteaga
- Posts: 326
- Joined: Sun Oct 09, 2005 5:22 pm
- Location: Mexico
- Contact:
Re: Seek and MySql
...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.
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
Gracias Don Alfredo,
aqui estaremos muchos al pendiente de sus comentarios,
un saludo cordial,
Mauricio
aqui estaremos muchos al pendiente de sus comentarios,
un saludo cordial,
Mauricio
- Alfredo Arteaga
- Posts: 326
- Joined: Sun Oct 09, 2005 5:22 pm
- Location: Mexico
- Contact:
Re: Seek and MySql
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 */
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 */
- Alfredo Arteaga
- Posts: 326
- Joined: Sun Oct 09, 2005 5:22 pm
- Location: Mexico
- Contact:
Re: Seek and MySql
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.
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.
- Willi Quintana
- Posts: 859
- Joined: Sun Oct 09, 2005 10:41 pm
- Location: Cusco - Perú
- Contact:
Re: Seek and MySql
Holas...
Deberian probar con esta busqueda binaria, talvez se deba hacer algunos ajustes:
Salu2
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
Hola
la forma mas sencilla que pude encontrar fue hacer un medio seek
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