FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Lentitud con xbrowse
Posts: 428
Joined: Thu Oct 19, 2006 12:28 PM
Lentitud con xbrowse
Posted: Mon Nov 03, 2008 01:03 PM

Hola amigos

Al utilizar una base de datos filtrada, ya sea con setfilter o con ordscope, me tarda un mundo en abrir el xbrowse, no se si será porque lo tendré mal estructurado o porque es así.

Saludos

Jose Luis

--------------------------

Saludos



Jose Luis
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Lentitud con xbrowse
Posted: Mon Nov 03, 2008 01:38 PM

publica un ejemplo del mismo para visualizar mejor el posible problema, incluye el filtrado y la creacion del xbrowse

Posts: 428
Joined: Thu Oct 19, 2006 12:28 PM
Lentitud con xbrowse
Posted: Mon Nov 03, 2008 06:31 PM
Después de algunas pruebas, he visto que es debido a que me fastidia los indices, al utilizar los tabs con filtros, me explico:

Tengo el siguiente codigo:
	@ 30, 0  XBROWSE oLbx COLUMNS	"Fecha","Fecha1","pro1","pobla1","Conductor","nConductor","Realizado","Incidencia","Operador";
				HEADER " F.Aviso "," F. Recog. ", " Recoger en ","Poblacion "," Cond. "," Nombre "," R ","Incidencia","Operador" ;
				COLSIZES 55,55,180,100,40,150,15,100,150;
				OF oDlg ALIAS aAlias[30];
				ON LEFT DBLCLICK  (iif(!(aAlias[30])->(eof()) .and. Publicas:cAccesoM,(cTitulo:="Visualización de Avisos ",Entalba(cTitulo,"V",aAlias),oLbx:Refresh()),.T.));
				AUTOCOLS LINES CELL
		   oLbx:bKeyChar := { | nKey, nFlags | ;
				iif (nKey == 43 .or. nKey == 65 .or. nKey == 97,;
					(entalba(cTitulo,"A",aAlias), oLbx:Refresh()),),;
				iif (nKey == 84 .or. nKey == 116,;
					(borrame(aAlias),oLbx:UpStable(), oLbx:Refresh()),),;
				iif (nKey == 77 .or. nKey == 109,  ;
					(entalba(cTitulo,"M",aAlias),oLbx:Refresh()),),;
				iif (nKey == 66 .or. nKey == 98,;
					(Borrar(aAlias[30],(aAlias[30])->pro1,'Aviso al cliente: '),oLbx:UpStable(), oLbx:Refresh()), ),;
				iif (nKey == 77 .or. nKey == 109,  ;
					(entalba(cTitulo,"M",aAlias),oLbx:Refresh() ), ) }
		   oLbx:nMarqueeStyle := MARQSTYLE_HIGHLROW 
		   oLbx:bClrGrad := { | lInvert | If( ! lInvert, ;
				{ { 0.50,8638963,13565951 }, ;
				{ 0.50,13565951,8638963 } }, ;
				{ { 0.50,768756,13565951 }, ;
				{ 0.50,13565951,768756 } } ) }
		   oLbx:bClrStd := { || If( ( (oLbx:cAlias)->(OrdKeyNo()) % 2 ) == 0, { CLR_BLACK, RGB(242,247,252) }, { CLR_BLACK, RGB(226,226,208) } ) } 
		   oLbx:lColDividerComplete := .F.
                   oLbx:lHScroll:=.F.
		   oLbx:CreateFromCode()
		   oLbx:l2007  := (.T.) 
		   oDlg:oClient := oLbx

	@ 8, 0  TABS oTab of oDlg;
				SIZE oDlg:nWidth()-80, 12 ;
				PROMPTS "&Fecha Aviso","Fecha &Recogida","C&liente","&Conductor","&Realizado" ;
				COLOR CLR_BLACK,  nRGB(226,226,208) ;
				PIXEL;
				ACTION ((aAlias[30])->(Ordsetfocus(cambia(oTab:nOption))),oLbx:Refresh())
     oDlg:oBottom = oTab

Y la funcion que se encarga de devolver el indice al tab
static function cambia(recibe)
local devuelve
if recibe=1
   devuelve:="Fecha"
endif
if recibe=2
   devuelve:="Fecha1"
endif
if recibe=3
   devuelve:="pro1"
endif
if recibe=4
   devuelve:="Conductor"
endif
if recibe=5
   devuelve:="Realizado"
endif
return devuelve


Bien, pues si la base no está filtrada, funciona perfectamente, el tab hace su función, cambiando el orden por fecha, conductor, etc.
Pero si la filtramos:
  Set filter to (aAlias[30])->Fecha1 = Date()


Entoces se descuajaringa todo, me dice que no existe el alias, y además me estropea el cdx.

Saludos

Jose Luis
--------------------------

Saludos



Jose Luis
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Lentitud con xbrowse
Posted: Mon Nov 03, 2008 07:48 PM

realmente yo no veo ningun problema, lo que me extraña es que te dañe los cdx cuando aplicas el filtro, yo particularmente siempre uso ORDSCOPE.
ORDSCOPE( 0, NIL )
ORDSCOPE( 1, NIL )
ORDSCOPE( 0, FiltroSuperior )
ORDSCOPE( 1, FiltroInferior )

y los filtro los hago con:

( cAlias )->( dbsetfilter({|| CampoFiltro == uValor }, "CampoFiltro == uValor" ) )

pero preferiblemente siempre con ORDSCOPE creo que es mucho mas rapido y si necesito un filtro puedo hacerlo dentro del rango del ORDSCOPE

Posts: 428
Joined: Thu Oct 19, 2006 12:28 PM
Lentitud con xbrowse
Posted: Mon Nov 03, 2008 08:21 PM

Realmente siempre suelo utilizar scopes pero cuando tengo tabs que cambian el orden del tag no se como hacerlo:

cFecha:=Date()

(aAlias[30])->(ordscope(0,Dtos(cFecha)))
(aAlias[30])->(ordscope(1,Dtos(cFecha)))

y sólo veo los registros de hoy

Pero si ahora quiero ver sólo los registros de hoy, pero ordenados por nombre, si pongo

(aAlias[30])->(ordsetfocus("Nombre"))

Pues ahora me los muestra por orden de nombre, pero ya no me muestra sólo los registros de hoy.

Hay alguna manera de hacer ésto sólo utilizando scopes?

Saludos

Jose Luis

--------------------------

Saludos



Jose Luis
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Lentitud con xbrowse
Posted: Tue Nov 04, 2008 02:24 AM
este es un ejemplo de como usar el xbrowse/filtro y scope, el archivo test.dbf es el mismo del ejemplo de fwh customer.dbf y esta indexado por los campos first, last y hiredate
#include "fivewin.ch"
#include "xbrowse.ch"

STATIC oWnd
FUNCTION MainTest()
local oWnd
local aGet := array( 6 )
local aVar := array( 6 )
local cFiltro := ""

aVar[ 1 ]:= space( 20 )
aVar[ 2 ]:= space( 20 )
aVar[ 3 ]:= space( 20 )
aVar[ 4 ]:= space( 20 )
aVar[ 5 ]:= date()
aVar[ 6 ]:= date()


		define dialog oDlg from 5,0 to 40,60 
		
			@ 1,1 SAY "DESDE NOMBRE  :" 	OF oDlg
			@ 2,1 SAY "HASTA NOMBRE  :" 	OF oDlg
			@ 3,1 SAY "DESDE APELLIDO:" 	OF oDlg
			@ 4,1 SAY "HASTA APELLIDO:" 	OF oDlg
			@ 5,1 SAY "DESDE FECHA   :" 	OF oDlg
			@ 6,1 SAY "HASTA FECHA   :" 	OF oDlg
		
			@ 1,10 GET aGet[ 1 ]		VAR aVar[ 1 ]	OF oDlg
			@ 2,10 GET aGet[ 2 ]		VAR aVar[ 2 ]	OF oDlg
			@ 3,10 GET aGet[ 3 ]		VAR aVar[ 3 ]	OF oDlg
			@ 4,10 GET aGet[ 4 ]		VAR aVar[ 4 ] OF oDlg
			@ 5,10 GET aGet[ 5 ]		VAR aVar[ 5 ] OF oDlg
			@ 6,10 GET aGet[ 6 ]		VAR aVar[ 6 ] OF oDlg
			
			@ 10,1 button oBtn prompt "Aceptar" action ( oDlg:end(),Prueba( aVar ) )
			@ 10,10 button oBtn2 prompt "Salir" action ( dbcloseall(), oDlg:end() )
			activate dialog oDlg 

return

procedure Prueba( aVar )
  local oChild, oBrw, oCol 
   local nFor 
   LOCAL oTab
   local cFiltro

   REQUEST DBFCDX 
   rddsetdefault( "DBFCDX" ) 

   USE TEST NEW 
   set index to test
  	Filtrar( aVar ) 
  	TEST->( DBGOTOP() )
   DEFINE WINDOW oChild TITLE "Ejemplo" 

   oBrw := TXBrowse():New( oChild ) 

   oBrw:nMarqueeStyle       := MARQSTYLE_HIGHLCELL 
   oBrw:nColDividerStyle    := LINESTYLE_BLACK 
   oBrw:nRowDividerStyle    := LINESTYLE_BLACK 
   oBrw:lColDividerComplete := .t. 

   oBrw:SetRDD() 

   for nFor := 1 to len( oBrw:aCols ) 
      oCol := oBrw:aCols[ nFor ] 
      oCol:nEditType := 1 
      oCol:bOnPostEdit := {|o, v, n| iif( n != VK_ESCAPE, FieldPut( o:nCreationOrder, v ), ) } 
   next 

   oBrw:CreateFromCode() 
   oChild:oClient := oBrw 

   @ 8, 0  TABS oTab of oChild;
            SIZE oChild:nWidth()-80, 12 ;
            PROMPTS "&Nombre","&Apellido","Fecha" ;
            COLOR CLR_BLACK,  nRGB(226,226,208) ;
            PIXEL ACTION ( OrdSetFocus(oTab:nOption), ;
            							 Filtrar( aVar, oTab:nOption ), ;
            							 test->( dbgotop() ), oBrw:Refresh( .t. ))
     oChild:oBottom = oTab



   ACTIVATE WINDOW oChild ON INIT ( oBrw:SetFocus() )

return

procedure Filtrar( aVar, nOpc )
local cFilter := ""
local bFilter
local uOrderBottom := NIL
local uOrderTop := NIL
default nOpc := 1

	
	test->( ordsetfocus( nOpc ) )
	test->( DBCLEARFILTER() )
	do case 
		case nOpc == 1
			if !empty( aVar[ 1 ] )
				uOrderTop := TRIM(aVar[ 1 ])
			endif
			if !empty( aVar[ 2 ] )
				uOrderBottom := TRIM(aVar[ 2 ])
			else
				if !empty( aVar[ 1 ] )
					uOrderBottom := TRIM(aVar[ 1 ])
				endif
			endif
			
			if !empty( aVar[ 3 ] )
				cFilter += ( if ( empty( cFilter ), "test->last >= '", " .and. test->last >='" ) + TRIM(aVar[ 3 ]) + "'" ) 
			endif
			if !empty( aVar[ 4 ] )
				cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 4 ]) + "'" ) 
			else
				if !empty( aVar[ 3 ] )
					cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 3 ]) + "'" ) 
				endif
			endif
			
			cFilter += ( if ( empty( cFilter ), "test->hiredate >= CTOD('", " .and. test->hiredate >= CTOD('" ) + dtoc( aVar[ 5 ] ) + "')" )
			cFilter += ( if ( empty( cFilter ), "test->hiredate <= CTOD('", " .and. test->hiredate <= CTOD('" ) + dtoc( aVar[ 6 ] ) + "')" )			


		case nOpc == 2
			if !empty( aVar[ 3 ] ) 
				uOrderTop := TRIM(aVar[ 3 ])
			endif
			if !empty( aVar[ 4 ] )
				uOrderBottom := TRIM(aVar[ 4 ])
			else
				if !empty( aVar[ 3 ] )
					uOrderBottom := TRIM(aVar[ 3 ])
				endif
			endif

			if !empty( aVar[ 1 ] )
				cFilter += ( if ( empty( cFilter ), "test->last >= '", " .and. test->last >= '" ) + TRIM(aVar[ 1 ]) + "'" ) 
			endif
			if !empty( aVar[ 2 ] )
				cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 2 ]) + "'" ) 
			else
				if !empty( aVar[ 1 ] )
					cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 1 ]) + "'" ) 
				endif

			endif
			
			cFilter += ( if ( empty( cFilter ), "test->hiredate >= CTOD('", " .and. test->hiredate >= CTOD('" ) + dtoc( aVar[ 5 ] ) + "')" )
			cFilter += ( if ( empty( cFilter ), "test->hiredate <= CTOD('", " .and. test->hiredate <= CTOD('" ) + dtoc( aVar[ 6 ] ) + "')" )			
			
		
		case nOpc == 3
			uOrderTop :=  aVar[ 5 ]
			uOrderBottom := aVar[ 6 ]
			
			
			if !empty( aVar[ 1 ] )
				cFilter += ( if ( empty( cFilter ), "test->last >= '", " .and. test->last >= '" ) + TRIM(aVar[ 1 ]) + "'" ) 
			endif
			if !empty( aVar[ 2 ] )
				cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 2 ]) + "'" ) 
			else
				if !empty( aVar[ 1 ] )
					cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 1 ]) + "'" ) 
				endif
			endif

			if !empty( aVar[ 3 ] )
				cFilter += ( if ( empty( cFilter ), "test->last >= '", " .and. test->last >='" ) + TRIM(aVar[ 3 ]) + "'" ) 
			endif
			if !empty( aVar[ 4 ] )
				cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 4 ]) + "'" ) 
			else
				if !empty( aVar[ 3 ] )
					cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 3 ]) + "'" ) 
				endif
			endif
		
	endcase

	test->( ordscope( 0, nil ) )
	test->( ordscope( 1, nil ) )
	test->( ordscope( 0, uOrderTop ) )
	test->( ordscope( 1, uOrderBottom ) )


	if !empty( cFilter )
		TEST->( DbSetFilter( &( "{||" + cFilter + "}" ), cFilter ) )
	endif
	
	
return
Posts: 128
Joined: Tue Jan 03, 2006 08:31 PM
Lentitud con xbrowse
Posted: Tue Nov 04, 2008 04:30 AM
Estimado McFox,
Aprovechanco el tema de los filtros. precisamente estoy en lo mismo, mi problema es que quiero presentar el xBrowse vacio antes de que se ejecute el filtro, una vez ejecutado el filtro que el xBrowse se rellena con los registros filtrados.
Estoy usando esta forma de presentar el xBrowse vacio
   WITH OBJECT oBrwSearch:= TXBrowse():New( oDlg )
        :bBof      := :bEof := { || .t. }
        :bKeyCount := :bKeyNo := :bBookMark := { || 0 }
        WITH OBJECT :AddCol()
             :bStrData  := { || Space(100) }
             :cHeader   := "NOMBRE DEL TITULO"
             :nWidth    := 370
        END
        .... mas columnas ....
        :CreateFromResource(800)
    END

Hasta aqui todo bien se presenta el xbrowse vacio y con las columnas, pero si quiero presentar dspues los datos filtrados no se vizualisan. aqui el codigo que actualiza el xbrowse
FUNCTION Filtro( oBrw )
   .... Se hace el filtro ....

        :cAlias:= "LIBROSBOOK"
        oBrw:SetRDD( .F., .F. )

        oBrw:aCols[01]
        oBrw:bStrData  := { || libros->CAMPO1 }
        oBrw:cHeader   := "NOMBRE DEL TITULO"

        oBrw:aCols[02]
        oBrw:bStrData  := { || libros->ISBN }
        oBrw:cHeader   := "ISBN"
        .... mas columnas ....
        oBrw:Refresh()

RETURN NIL


Alguna idea o tip que me pueda orientar que es lo que esta pasando, por que no se actualizan los registros ?.. ya comprobe que realmente se ejecute el filtro y efectivamente el proceso de filtrado es correcto..
Gracias anticipadas
Saludos
GABO
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Lentitud con xbrowse
Posted: Tue Nov 04, 2008 05:41 AM
agrega estas lineas en la funcion filtro

FUNCTION Filtro( oBrw )
   .... Se hace el filtro ....

          .... mas columnas ....

        oBrw:bBof := { || LIBROSBOOK->( bof() ) }
        oBrw:bEof := { || LIBROSBOOK->( eof() ) }
        oBrw:bKeyCount := {|| LIBROSBOOK->( OrdKeyCount() ) }
        oBrw:bKeyNo := {| n | iif( n == nil,;
                                        LIBROSBOOK->( OrdKeyNo() ),;
                                        LIBROSBOOK->( OrdKeyGoto( n );
                                        ) ) }
        oBrw:bBookMark := {| n | If( n == nil,;
                             LIBROSBOOK->( RecNo() ),;
                             LIBROSBOOK->( DBGoTo( n ) ) ) }

        oBrw:Refresh( .t. ) // <===PENDIENTE... AGREGA .T.

RETURN NIL
Posts: 428
Joined: Thu Oct 19, 2006 12:28 PM
Lentitud con xbrowse
Posted: Tue Nov 04, 2008 07:58 AM

En el ejemplo que me mandas, primero hace un scope y una vez hecho, hace el filtro, pero como te he explicado antes, no puedo hacer eso.

  • Siempre tengo que delimitar el día de hoy, por lo tanto lo primero que tengo que hacer es ordscope sobre la fecha de hoy.

  • Una vez delimitado, ya no tengo que filtrar nada, sólo cambiar el tag, osea Ordsetfocus("Nombre"), por lo que se fastidia el scope anterior, y me presenta organizado por nombre, pero ya sin la delimitación de la fecha de hoy.

  • Para ello, tendría que tener un índice que fuera nombre+Fecha, otro para vehiculo+fecha, etc...

No se si me explico

Saludos

Jose Luis

--------------------------

Saludos



Jose Luis
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Lentitud con xbrowse
Posted: Tue Nov 04, 2008 11:52 AM
El ejemplo que te mande hace lo que pides, ami parecer debes usar filtros y scopes para evitar hacer un índice que fuera nombre+Fecha, otro para vehiculo+fecha, etc...
te voy a cambiar el orden del ejemplo para quelo veas...
   @ 8, 0  TABS oTab of oChild;
            SIZE oChild:nWidth()-80, 12 ;
            PROMPTS "&Fecha","&Nombre","&Apellido" ;
            COLOR CLR_BLACK,  nRGB(226,226,208) ;
            PIXEL ACTION ( OrdSetFocus(oTab:nOption), ;
            							 Filtrar( aVar, oTab:nOption ), ;
            							 test->( dbgotop() ), oBrw:Refresh( .t. ))
     oChild:oBottom = oTab


la funcion filtrar cambia el orden de los case

Function Filtrar( aVar, nOpc, oBrw )
local cFilter := ""
local bFilter
local uOrderBottom := NIL
local uOrderTop := NIL
default nOpc := 3


	
	test->( ordsetfocus( nOpc ) )
	test->( DBCLEARFILTER() )
	do case 
		case nOpc == 2
			if !empty( aVar[ 1 ] )
				uOrderTop := TRIM(aVar[ 1 ])
			endif
			if !empty( aVar[ 2 ] )
				uOrderBottom := TRIM(aVar[ 2 ])
			else
				if !empty( aVar[ 1 ] )
					uOrderBottom := TRIM(aVar[ 1 ])
				endif
			endif
			
			if !empty( aVar[ 3 ] )
				cFilter += ( if ( empty( cFilter ), "test->last >= '", " .and. test->last >='" ) + TRIM(aVar[ 3 ]) + "'" ) 
			endif
			if !empty( aVar[ 4 ] )
				cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 4 ]) + "'" ) 
			else
				if !empty( aVar[ 3 ] )
					cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 3 ]) + "'" ) 
				endif
			endif
			
			cFilter += ( if ( empty( cFilter ), "test->hiredate >= CTOD('", " .and. test->hiredate >= CTOD('" ) + dtoc( aVar[ 5 ] ) + "')" )
			cFilter += ( if ( empty( cFilter ), "test->hiredate <= CTOD('", " .and. test->hiredate <= CTOD('" ) + dtoc( aVar[ 6 ] ) + "')" )			


		case nOpc == 3
			if !empty( aVar[ 3 ] ) 
				uOrderTop := TRIM(aVar[ 3 ])
			endif
			if !empty( aVar[ 4 ] )
				uOrderBottom := TRIM(aVar[ 4 ])
			else
				if !empty( aVar[ 3 ] )
					uOrderBottom := TRIM(aVar[ 3 ])
				endif
			endif

			if !empty( aVar[ 1 ] )
				cFilter += ( if ( empty( cFilter ), "test->last >= '", " .and. test->last >= '" ) + TRIM(aVar[ 1 ]) + "'" ) 
			endif
			if !empty( aVar[ 2 ] )
				cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 2 ]) + "'" ) 
			else
				if !empty( aVar[ 1 ] )
					cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 1 ]) + "'" ) 
				endif

			endif
			
			cFilter += ( if ( empty( cFilter ), "test->hiredate >= CTOD('", " .and. test->hiredate >= CTOD('" ) + dtoc( aVar[ 5 ] ) + "')" )
			cFilter += ( if ( empty( cFilter ), "test->hiredate <= CTOD('", " .and. test->hiredate <= CTOD('" ) + dtoc( aVar[ 6 ] ) + "')" )			
			
		
		case nOpc == 1
			uOrderTop :=  aVar[ 5 ]
			uOrderBottom := aVar[ 6 ]
			
			
			if !empty( aVar[ 1 ] )
				cFilter += ( if ( empty( cFilter ), "test->last >= '", " .and. test->last >= '" ) + TRIM(aVar[ 1 ]) + "'" ) 
			endif
			if !empty( aVar[ 2 ] )
				cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 2 ]) + "'" ) 
			else
				if !empty( aVar[ 1 ] )
					cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 1 ]) + "'" ) 
				endif
			endif

			if !empty( aVar[ 3 ] )
				cFilter += ( if ( empty( cFilter ), "test->last >= '", " .and. test->last >='" ) + TRIM(aVar[ 3 ]) + "'" ) 
			endif
			if !empty( aVar[ 4 ] )
				cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 4 ]) + "'" ) 
			else
				if !empty( aVar[ 3 ] )
					cFilter += ( if ( empty( cFilter ), "test->last <= '", " .and. test->last <= '" ) + TRIM(aVar[ 3 ]) + "'" ) 
				endif
			endif
		
	endcase

	test->( ordscope( 0, nil ) )
	test->( ordscope( 1, nil ) )
	test->( ordscope( 0, uOrderTop ) )
	test->( ordscope( 1, uOrderBottom ) )

	if !empty( cFilter )
		TEST->( DbSetFilter( &( "{||" + cFilter + "}" ), cFilter ) )
	endif
return .t.

cambie el orden del TABS ahora "FECHA" esta primero, al momento que creas el browse ya esta creado el "SCOPE" en "FECHA"(hiredate) y se "FILTRA" por los demas datos (FIRST Y LAST)...
Cuando cambias el TABS, es decir si te mueves a NOMBRE, se cambia el "SCOPE" a "NOMBRE"(First) te elimina el "SCOPE" de "FECHA" y te lo transforma en "FILTRO" para poder mantener la misma visualizacion anterior (Siempre tengo que delimitar el día de hoy) pero ahora ordenado por "NOMBRE", igualmente si tenias algun tipo de filtro en "APELLIDO"(last) lo mantiene...
cuando te mueves a "APELLIDO", hace la misma operacion...
se mantiene el FILTRO/SCOPE por "FECHA"que creaste al hacer el browse, lo que pasa es es se va "jugando" con estos... siempre vas a tener un SCOPE activo dependiendo de la selecion que tengas en el TABS y los demas datos seran FILTROS, espero hacerme entender...
debes adaptarlo a tu sistema, hacer bien OrdSetFocus ( yo lo hice diferente a como tulo hiciste )
Posts: 128
Joined: Tue Jan 03, 2006 08:31 PM
Lentitud con xbrowse
Posted: Tue Nov 04, 2008 05:10 PM
McFox,
Muy agradecido, como estoy usando ADS el codigo de ejemplo que me enviastes no me funciono pero me oriento para solucionarlo de esta manera
   oBrw:bGoTop    := NIL
   oBrw:bGoBottom := NIL
   oBrw:bSkip     := NIL
   oBrw:bBof      := NIL
   oBrw:bEof      := NIL
   oBrw:bBookMark := NIL
   oBrw:bKeyNo    := NIL
   oBrw:bKeyCount := NIL
   .....COLUMNAS...
   oBrw:SetRDD()
   oBrw:Refresh(.T.)


Muchas gracias !!!
Saludos
GABO
Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Lentitud con xbrowse
Posted: Tue Nov 04, 2008 05:52 PM
José Luis,


JoseLuis wrote:En el ejemplo que me mandas, primero hace un scope y una vez hecho, hace el filtro, pero como te he explicado antes, no puedo hacer eso.

- Siempre tengo que delimitar el día de hoy, por lo tanto lo primero que tengo que hacer es ordscope sobre la fecha de hoy.

- Una vez delimitado, ya no tengo que filtrar nada, sólo cambiar el tag, osea Ordsetfocus("Nombre"), por lo que se fastidia el scope anterior, y me presenta organizado por nombre, pero ya sin la delimitación de la fecha de hoy.

- Para ello, tendría que tener un índice que fuera nombre+Fecha, otro para vehiculo+fecha, etc...


Claro, los indices deberian ser siempre dtos(fecha)+lo que quieras para que te funcione, porque hacer un setscope y luego cambiar de orden no tiene sentido.

Algo que podrías probar es crear un indice temporal, con la cláusula TEMPORARY, que te crea un indice EN MEMORIA, no lo guarda en disco, y se destruye en cuanto cierras la base o le haces un set INDEX TO (Alias())

Por ejemplo, como ya tienes el indice por fecha, para ver los registros de hoy ordenados por nombre hara un

set order to 'Fecha'

dBSeek( Date() )

Index on nombre tag 'dnombre' TEMPORARY While Fecha == Date()

eso debe ser muy rápido si hay pocos registros, digamos menos de 1000

Otra alternativa podría ser que copies los registros de la fecha deseada a una tabla temporaria, en un directorio del disco C para que vaya rapido, y hacer el browse sobre esos datos, y si hay que modificar buscar el registro original en la tabla original. La verdad que conociendo con mas presicion el problema se pueden dar mejores alternativas de solucion.

Un saludo,

Carlos.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"

Continue the discussion