Lentitud con xbrowse

Lentitud con xbrowse

Postby JoseLuis » Mon Nov 03, 2008 1: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
JoseLuis
 
Posts: 426
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Postby Daniel Garcia-Gil » Mon Nov 03, 2008 1:38 pm

publica un ejemplo del mismo para visualizar mejor el posible problema, incluye el filtrado y la creacion del xbrowse
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Postby JoseLuis » Mon Nov 03, 2008 6: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:
Code: Select all  Expand view
   @ 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
Code: Select all  Expand view
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:
Code: Select all  Expand view
  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
JoseLuis
 
Posts: 426
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Postby Daniel Garcia-Gil » Mon Nov 03, 2008 7: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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Postby JoseLuis » Mon Nov 03, 2008 8: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
JoseLuis
 
Posts: 426
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Postby Daniel Garcia-Gil » Tue Nov 04, 2008 2: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
Code: Select all  Expand view
#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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Postby gabo » Tue Nov 04, 2008 4: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
Code: Select all  Expand view
   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
Code: Select all  Expand view
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
gabo
 
Posts: 128
Joined: Tue Jan 03, 2006 8:31 pm

Postby Daniel Garcia-Gil » Tue Nov 04, 2008 5:41 am

agrega estas lineas en la funcion filtro

Code: Select all  Expand view
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

User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Postby JoseLuis » Tue Nov 04, 2008 7: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
JoseLuis
 
Posts: 426
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Postby Daniel Garcia-Gil » 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...
Code: Select all  Expand view
   @ 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

Code: Select all  Expand view
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 )
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Postby gabo » Tue Nov 04, 2008 5: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
Code: Select all  Expand view

   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
gabo
 
Posts: 128
Joined: Tue Jan 03, 2006 8:31 pm

Postby Carlos Mora » Tue Nov 04, 2008 5: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.
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España


Return to FiveWin para Harbour/xHarbour

Who is online

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