Filtrado rápido

Filtrado rápido

Postby Loren » Thu Mar 26, 2009 11:26 am

Compañeros:

Tengo una DBF con CDX, y necesito filtrar y mostrar en un listbox aquellos registros cuyo campo "nombre" contengan una cadena determinada: Por ejemplo: "GARCIA". Esto es facil utilizando AT() o $.

El tema es que si uso:
* SET FILTER TO cGet $ clientes->NOMBRE ---> es demasiado lento en una DBF grande y sobre todo en RED Local
* DBSETFILTER ---> no se si mejoraría la velocidad. Lo desconozco.
* ORDWILDSEEK ---> es rapidísimo, pero me busca registro a registro. O al menos eso creo.
* SCOPES --> no admiten " $ " por lo cual no me vale. O al menos eso creo.

¿ Hay más opciones ? Cual me recomendais ?
Mil gracias.
LORENZO
Loren
 
Posts: 479
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Re: Filtrado rápido

Postby jrestojeda » Thu Mar 26, 2009 12:13 pm

Yo te rocemdaría el uso de ADS, notarás un cambio de volocidad importante y en ADS puedes usar el DBSETFILTER({|| }) que funciona muy bien.
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
User avatar
jrestojeda
 
Posts: 601
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Re: Filtrado rápido

Postby pymsoft » Fri Mar 27, 2009 8:45 am

Prueba a hacer un indice temporal con la clausula FOR, es muy rapido.


Code: Select all  Expand view  RUN

  ..
  cCercaArticolo := "DONNA"
  CursorWait()
  SET INDEX TO
  cTmpFiltroArt := ALLTRIM( UPPER( cCercaArticolo ) )
  FERASE( cNomeIndice )
  INDEX ON FIELD->des TAG "INDTMPART" TO (cNomeIndice) FOR ( cTmpFiltroArt $ UPPER( FIELD->DES ) )

  SET INDEX TO (cIndPrincipale), (cNomeIndice)

  art->( ordSetFocus("INDTMPART") )
  art->( dbGoTop() )
  CursorArrow()
  ..
 


Cierro los indices activos, creo indice temporal, abro database con los dos indices, por las dudas que haga modificaciones en la base de datos, asi se actualiza el indice principal.

espero te sirva la idea

Saludos
Pedro Gonzalez
User avatar
pymsoft
 
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia

Re: Filtrado rápido

Postby carlos vargas » Fri Mar 27, 2009 5:12 pm

Tengo entendido que tanto en clipper cuando se usan CDX asi como los produtos foxpro, dbase, usan algo llamado rushmore que no es mas que el aprovechamiento de los indices para realizar ciertas tareas como filtrados, recorridos de tablas en instrucciones como sum, average, count, etc.

Esto implica que si la expresion utilizada para el filtro, contiene campos que estan definidos en el tag de los idices de la tabla, se usan estos indices para
realizar la operacion de salto de registro de forma mas eficiente.

ejemplo:
set filter to cod_cli="001"
count to cod_cli="001" and num_fac ="002"

si cod_cli esta contenido en un tag del indice el filtrado sera mas eficiente.

NO estoy seguro que esta tecnologia Rushmore este en los rdd de [x]harbour, en parte por eso es mas eficiente el filtrado.
(por lo menos en xharbour comercial creo que ellos apuntan a una mejora en esto, pero no aplica en el caso de los org).

otro punto es que como comentan se mejora el rendimiento si la tabla es creada nativamente con [x]harbour, por ello crea la tabla y pasa los datos a esta tabla nueva.

Creo que el rdd ads si cuenta con una tecnologia similar.

Mucho de estas cosas son como se dice Leyenda Urbana, por lo que no necesariamente lo que digo es correcto, seria importante que alguien con conocimiento de harbour a nivel interno nos lo aclarara, para de una vez por toda estar seguro. :-)
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Filtrado rápido

Postby carlos vargas » Fri Mar 27, 2009 5:30 pm

Otras cosa es que en los rdd de [x]harbour existen un simnumeros de mejoras que muy pocos sabe, por ejemplo exieten funciones como
dbdrop(cTabla) que permite borar en una sola instruccion la tabla indicada asi como su dbt, y cdx.
existen maneras de crear indices temporales que se eliminan en cuanto el indice es creado, recientemente agregaron una dbcreatetmp que crea una tabla temporal que se elimina a si misma cuando se cierra la tabla. existen mejoras en cuanto al tipos de campos en las tablas, como integer, autoinc, datetime, y recientemente timestamp.

y asi como esto, deben existir otras mas, yo me entero por que muchas veces me doy a la tarea de leer los changelog del cvs, pero se que pocos lo hacen ya que incluso en la mayoria de los paquetes binarios no los incluyen, los whatsnew son poco informativos a nivel de usuario, si tienem mucha info tecnica para el dessarollador o los que empiezan sus pinitos a nivel del api de harbour.

Seria muy interesante saber con cuales mejoras contamos a la fecha, para un mejor aprovechamiento del trabajo de los desarrolladores.
hoy por hoy [x]harbour es superior a clipper. menos en la salida de datos a pantalla bajo dos.


salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Filtrado rápido

Postby Biel EA6DD » Fri Mar 27, 2009 6:27 pm

Sin duda Carlos, comparto 100 % tu opinion, es dificil estar al corriente de las nuevas funciones y mejoras que se van incorparando a [x]Harbour.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 71 guests