FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Lentitud de Browse en programas en RED
Posts: 38
Joined: Thu Oct 13, 2005 09:38 AM
Lentitud de Browse en programas en RED
Posted: Thu Oct 09, 2014 11:42 AM
Hola compañeros,

Haciendo pruebas de velocidad de dos PCs en RED, con filtros y Browse(), me sucede lo siguiente.

1) Accedo desde el primer PC, ejecuto un filtro y despues visualizo la informacion con un browse(), perfecto en pocos segundos se muestra.
2) Accedo desde el segundo PC, ejecuto un filtro y despues visualizo la informacion con un browse(), y tambien perfecto en pocos segundos se muestra.
3) Al volver a ejecutar el filtro desde el primer PC, el filtrado tarda algun segundo mas, pero el browse() tarda minutos en aparecer, pero si antes de ejecutar el filtro cierro el archivo DBF y lo vuelvo a abrir, entonces todo funciona mas rapido.

¿Teneis alguna idea de por que sucede?

El codigo es sencillo

Opcion 1: Los DBF solo se abren una vez, funciona lentisimo el paso 3

Code (fw): Select all Collapse
    dArc:=AbreDbf("ARCHIVO","Archivo")
    (dArc)->(OrdSetFocus(1))

    DO WHILE .t.

    IF !MsgNoYes("Desea volver a ejecutar el filtro")
       EXIT
    ENDIF

    cIni:=TIME()
    SET FILTER TO VAL((dArc)->Codigo)>=21000000000 .AND. VAL((dArc)->Codigo)<=21200000000
    cFin:=TIME()
    MsgInfo("Inicio: "+cIni+CRLF+"Fin filtro: "+cFin)

        (dArc)->(DBGOTOP())
    IF (dArc)->(EOF())
         MsgInfo("Archivo vacio")
         EXIT
    ENDIF

    Browse()

    ENDDO

    (dArc)->(DBCLOSEAREA())


Opcion 2: se abre el DBF cada vez que se ejecuta el filtro y el browse(), va perfecto

Code (fw): Select all Collapse
    DO WHILE .t.

    IF !MsgNoYes("Desea volver a ejecutar el filtro")
       EXIT
    ENDIF

    dArc:=AbreDbf("ARCHIVO","Archivo")
    (dArc)->(OrdSetFocus(1))

    cIni:=TIME()
    SET FILTER TO VAL((dArc)->Codigo)>=21000000000 .AND. VAL((dArc)->Codigo)<=21200000000
    cFin:=TIME()
    MsgInfo("Inicio: "+cIni+CRLF+"Fin filtro: "+cFin)

        (dArc)->(DBGOTOP())
    IF (dArc)->(EOF())
         MsgInfo("Archivo vacio")
         EXIT
    ENDIF

    Browse()

    (dArc)->(DBCLOSEAREA())

    ENDDO


Gracias de antemano por vuestra ayuda.
Un saludo
Alfonso Larrinaga
info@bsinformatica.net
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: Lentitud de Browse en programas en RED
Posted: Thu Oct 09, 2014 02:30 PM

Hola,
Los filtros son tremendamente lentos.
Hay varias alternativas al respecto. (Índice temporal condicionado y Scope por ejemplo)
Saludos,

Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Lentitud de Browse en programas en RED
Posted: Thu Oct 09, 2014 02:56 PM

Txon,

Hipótesis sobre el aumento de velocidad cuando varias aperturas: quiza tenga que ver con la caché del disco duro.
Los filtros para navegar son lentísimos.

Yo utilizo la estrategia Federer: peticion de datos, carga de una dbf temporal y mostrado (browse) de la dbf temporal. Digo estrategia Federer porque es algo asi como un saque, remate y volea ganadora :)

Saludos

Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Lentitud de Browse en programas en RED
Posted: Thu Oct 09, 2014 03:48 PM
Como indica Esteban es por el FILTER

Con índices TEMPORARY/MEMORY o con SCOPE que necesita un índice.
Code (fw): Select all Collapse
INDEX ON CODIGO TO TEMP TEMPORARY FOR VAL((dArc)->Codigo)>=21000000000 .AND. VAL((dArc)->Codigo)<=21200000000

ó
INDEX ON CODIGO TO TEMP TEMPORARY
SCOPE(0,"21000000000");SCOPE(0,"21200000000")


Saludos,

Adhemar
Saludos,



Adhemar C.
Posts: 38
Joined: Thu Oct 13, 2005 09:38 AM
Re: Lentitud de Browse en programas en RED
Posted: Thu Oct 09, 2014 04:11 PM

Muchas gracias, por vuestra ayuda,
Lo cierto es que el filtrado lo hace muy rapido, he puesto un aviso al principio y al final del filtro y son segundos lo que tarda, el problema es al abrir el browse(), este es el que se dilata minutos, pero solo la segunda vez que se abre, cuando hay otro PC, usando la misma DBF.
De ahi, mi curiosidad.
Si a alguien se le ocurre algo mas, soy todo oidos.
Por otra parte voy a hacer algunas pruebas con los filtros temporales y scopes, que proponeis.

Gracias de nuevo.

Un saludo
Alfonso Larrinaga
info@bsinformatica.net
Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
Re: Lentitud de Browse en programas en RED
Posted: Thu Oct 09, 2014 04:20 PM

Buenas

Olvida set filter. Usa SCOPES o subindices.

Aunque es cierto lo que comentas, nos pasa de tanto en tanto en algunas instalaciones, y no sabemos el motivo.
Tiene algo que ver entre las versiones de Windows, sobretodo con Vista.

Te recomiendo http://xthefull.blogspot.com.es/2014_02_01_archive.html

Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Posts: 38
Joined: Thu Oct 13, 2005 09:38 AM
Re: Lentitud de Browse en programas en RED
Posted: Fri Oct 10, 2014 12:46 PM
En primer lugar gracias a todos por vuestra ayuda.
He dejado los FILTER y lo estoy intentando con OrdWildSeek().
He probado algun codigo que he visto del funcionamiento de OrdWildSeek(), pero me da error al ejecutarlo.
Trabajo con Fivewin 2.7 + xHarbour 0.99.6 + ADS (local)

El codigo es simple.

Code (fw): Select all Collapse
#include "fivewin.ch"
#include "Ads.ch"

FUNCTION Main()

      LOCAL aCust := {}
      Local cExpr:=""

      USE Archivo
      SET INDEX TO Archivo
      SET ORDER TO 1

      cExpr:="220"
      DO WHILE OrdWildSeek( "*"+cExpr+"?",.t. )
         AADD( aCust, FIELD->Codigo )
      ENDDO

      AEval( aCust, {|c| QOut(c) } )

      GO TOP

      cExpr:="121"
      aCust := {}
      DO WHILE OrdWildSeek( "*"+cExpr+"?",.t. )
         AADD( aCust, FIELD->Codigo )
      ENDDO

      AEval( aCust, {|c| QOut(c) } )

      USE

RETURN nil

INIT PROCEDURE Inicio

  Local nFiles

  SET CENTURY ON
  SET EPOCH TO 1950
  SET DATE BRITISH
  SET SAFETY OFF
  SET EXACT OFF
  SET DELETE ON
  SET AUTORDER TO 1

//  REQUEST _ADS          // Controlador de DBFs por defecto
  RddRegister("ADS",1)   //
  RDDSetDefault("ADS")   //
  AdsSetSerVerType(7)    // Local, Remoto, AIS (Internet), Todos = 7
  AdsSetFileType(2)      // Indices CDX
  Request OrdKeyNo,OrdKeyCount,AdsKeyCount,AdsKeyNo
  Request HB_LANG_ES     // Idioma español pagina de codigo 850
  HB_LANGSELECT( "ES" )  // Mensajes en español, dia semana, mes, ...

  nFiles=SetHandleCount(255)

RETURN

El error que aparece es:

Error occurred at: 10/10/2014, 14:27:08
Error description: Error DBCMD/1015 Error de argumento: ORDERINFO

Stack Calls
===========
Called from: => ORDWILDSEEK(0)
Un saludo
Alfonso Larrinaga
info@bsinformatica.net

Continue the discussion