Seek and MySql

Seek and MySql

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

Re: Seek and MySql

Postby pablovidal » 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: Select all  Expand view
"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
pablovidal
 
Posts: 401
Joined: Thu Oct 06, 2005 10:15 pm
Location: Republica Dominicana

Re: Seek and MySql

Postby TecniSoftware » 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
User avatar
TecniSoftware
 
Posts: 235
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

Re: Seek and MySql

Postby Armando » Sat Oct 31, 2009 3:15 pm

Hola:

Miren este hilo, tal vez les puede ayudar.

viewtopic.php?f=6&t=17146&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
User avatar
Armando
 
Posts: 3201
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Seek and MySql

Postby jbrita » 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
jbrita
 
Posts: 502
Joined: Mon Jan 16, 2006 3:42 pm

Re: Seek and MySql

Postby Mauricio » Sun Nov 01, 2009 6: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
User avatar
Mauricio
 
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Re: Seek and MySql

Postby Ramon Paredes » Sun Nov 01, 2009 8: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......
User avatar
Ramon Paredes
 
Posts: 215
Joined: Fri Feb 02, 2007 3:38 pm
Location: Managua, Nicaragua

Re: Seek and MySql

Postby Mauricio » Mon Nov 02, 2009 3:42 am

Hola,

en SqlRDD puedes hacerlo,

alguna otra sugerencia para MySql,


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

Re: Seek and MySql

Postby Alfredo Arteaga » Mon Nov 02, 2009 4: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.
User avatar
Alfredo Arteaga
 
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico

Re: Seek and MySql

Postby Alfredo Arteaga » Mon Nov 02, 2009 4: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.
User avatar
Alfredo Arteaga
 
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico

Re: Seek and MySql

Postby Mauricio » Mon Nov 02, 2009 4:42 am

Gracias Don Alfredo,

aqui estaremos muchos al pendiente de sus comentarios,

un saludo cordial,
Mauricio
User avatar
Mauricio
 
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Re: Seek and MySql

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

Re: Seek and MySql

Postby Alfredo Arteaga » Mon Nov 02, 2009 7: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.
User avatar
Alfredo Arteaga
 
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico

Re: Seek and MySql

Postby Willi Quintana » 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)
User avatar
Willi Quintana
 
Posts: 1019
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Re: Seek and MySql

Postby Mauricio » Thu Nov 12, 2009 9:10 am

Hola

la forma mas sencilla que pude encontrar fue hacer un medio seek
Code: Select all  Expand view


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

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: SantaCroya and 37 guests