Tengo un tremendo problema, me ha pedido que instale en una red Novell, un sistema que estaba en disco local, funcionando bien, pero la busqueda Incremental en Xbrowse en Red, se ha enlentesido demaciado y me han reclamado y pedido solucion:
La Dbf contiene 350 registro y para ello el Xbrowse uso indices Temporales:
INDEX ON FIELD->Est_Pro + FIELD->Nom_Doc TAG Med3 TO ARCHTEMP FOR FIELD->Est_Pro = "S" MEMORY
Como podria corregir este problema, ya que el requerimiento de a busqueda es que vaya filtrando el Xbrowse y mostrando solo lo que cumple con lo digitado.
Quedo atento a sus comentarios.
Muchas gracias y saludos,
Antonio
Dejo el codigo:
- Code: Select all Expand view RUN
#include "FiveWin.ch"
#include "xbrowse.ch"
#DEFINE TOPSCOPE 0
#DEFINE BOTTOMSCOPE 1
REQUEST HB_LANG_ESWIN
REQUEST HB_CODEPAGE_ESWIN // Para establecer código de página a Español (Ordenación, etc..)
Static cSeek:="",oSeek
Function Activa_Profe()
Local oDlg1, oBrw, oFont1,oFont2, oTitu1,oTitu2,oFont3,aStruc,oSay1,oSay2,oGet1,oFont4,oFont5,oTitu3
Local nPro:=2, aEstado := {},Estado1:=""
SET ESCAPE OFF
AADD( aEstado,{"TODOS "})
AADD( aEstado,{"SOLO VIGENTES"})
AADD( aEstado,{"DESACTIVADOS "})
AADD( aEstado,{"SOLO AGENDA "})
Abre_dbf("Profesi1",1,.f.,"Profe")
INDEX ON FIELD->Est_Pro + FIELD->Nom_Doc TAG Med3 TO ARCHTEMP ;
FOR FIELD->Est_Pro = "S" MEMORY
*cAlias1="Profe"
*(cAlias1)->(OrdScope(TOPSCOPE, cVar1))
*(cAlias1)->(OrdScope(BOTTOMSCOPE, cVar1))
ORDSETFOCUS("MED3")
Profe->(DbGotop())
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
DEFINE FONT oFont1 NAME 'TAHOMA' SIZE 0,24 BOLD
DEFINE FONT oFont2 NAME "TAHOMA" SIZE 0,-12 BOLD
DEFINE FONT oFont3 NAME 'TAHOMA' SIZE 0,18 BOLD
DEFINE FONT oFont7 NAME "TAHOMA" SIZE 0,-14 BOLD
DEFINE DIALOG oDlg1 SIZE 580,570 PIXEL FONT oFont3 STYLE nOr( WS_POPUP, WS_VISIBLE, WS_DLGFRAME )
@ 00,35 SAY otitu1 PROMPT " MAESTRO DE PROFESIONALES " PIXEL OF oDlg1 COLORS RGB(12, 135, 27) FONT oFont1
@ 018,103 SAY "Seleccione" SIZE 80,10 PIXEL OF oDlg1 RIGHT FONT oFont1
@ 018,190 ComboBox oGet1 Var nPro Items ArrTranspose(aEstado)[1] SIZE 70,200 PIXEL OF oDlg1 COLORS RGB(55, 255, 153) FONT oFont2;
ON CHANGE ((Estado1:=ArrTranspose(aEstado)[1][oGet1:nAt]),IF(!Filtra_Pro1(@nPro,oBrw,@cSeek),(MsgStop("TODO BIEN"),oBrw:Setfocus(),.F.), (oBrw:Refresh(),oBrw:Setfocus(), .T.) ))
@ 45,10 XBROWSE oBrw SIZE 300,-35 PIXEL OF oDlg1 DATASOURCE "Profe" ;
HEADERS 'Nombre del Profesional','Especialidad','Vigencia','Agenda';
COLUMNS 'Nom_Doc','Tip_Esp','Est_Pro','Ate_Hor';
PICTURES "@!","@!" ,"!","!";
COLSIZES 310, 85, 70, 70;
CELL LINES AUTOSORT NOBORDER;
oBrw:nMarqueeStyle :=MARQSTYLE_HIGHLROW
oBrw:nColDividerStyle := LINESTYLE_RAISED
oBrw:nRowDividerStyle := LINESTYLE_RAISED
oBrw:bClrHeader := {|| { nRGB(140, 0, 0), nRGB( 231, 242, 255 ), } }
oBrw:nOpacity := 230
oBrw:nHeaderHeight := 35
oBrw:nFreeze := 2
oBrw:lSeekBar:= .F.
oBrw:bClrStd := { || If( Eval( oBrw:bKeyNo,,oBrw1) % 2 == 0, { CLR_BLACK, RGB( 198, 255, 198 ) },;
{ CLR_BLACK, RGB( 232, 255, 232 ) } ) } // Efecto Cebra
oBrw:aCols[ 1 ]:oDataFont := oFont7
oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } }
oBrw:bClrSelFocus := {|| { nRGB( 255, 255, 255), nRGB(102, 178, 255) } }
oBrw:bClrSel := {|| { nRGB( 0, 0,255), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
oBrw:lAutoSort := .t.
oBrw:lFooter := .f.
oBrw:lHScroll := .f.
oBrw:lIncrFilter := .T.
oBrw:lSeekWild := .T. && .T. Busca Contenido, .F. Que comience con lo que digita
oBrw:Seek("")
oBrw:SetStyle( 2018)
oBrw:nColorPen := CLR_RED
oBrw:bChange := {|| oBrw:Refresh() }
oBrw:aCols[1]:bClrHeader := { || { CLR_HRED,CLR_WHITE } } // Aplico Color a Una Columna
oBrw:aCols[ 1 ]:oHeaderFont := oFont7 // Aplico Font a una Columna
oBrw:aCols[ 3]:nDataStrAlign := AL_CENTER
oBrw:aCols[ 4]:nDataStrAlign := AL_CENTER
WITH OBJECT oBrw:Vigencia
:bLDClickData := { || Cambia_Esta(),oBrw:Seek( "" ), oBrw:GoTop(), oBrw:SetFocus() } // Permite Seleccionar Sobre una Celda y Posicionarse en el 1º
//:bLDClickData := { || Cambia_Esta(),oBrw:Seek( "" ), oBrw:SetFocus() } // Permite Seleccionar Sobre una Celda y Mantener el foco
END WITH
WITH OBJECT oBrw:Agenda
:bLDClickData := { || Cambia_Agen(), oBrw:Refresh() }
END WITH
oBrw:CreateFromCode()
@ 35,10 SAY otitu3 PROMPT "Buscar : " PIXEL OF oDlg1 COLORS RGB(12, 135, 27) FONT oFont7
@ 35,40 SAY oBrw:oSeek VAR oBrw:cSeek SIZE 100,10 PIXEL OF oDlg1 PICTURE "@X" FONT oFont7 COLOR CLR_HRED,CLR_YELLOW
@ 032,250 BTNBMP SIZE 40, 10 PROMPT "LIMPIAR" OF oDlg1 PIXEL 2007 FONT oFont7 ;
ToolTip "LIMPIAR BUSQUEDA";
ACTION ( oBrw:Seek( "" ), oBrw:GoTop(), oBrw:SetFocus() )
@ 253,90 BTNBMP SIZE 30, 30 PROMPT "VOLVER" OF oDlg1 PIXEL 2007 Resource "#8002" FONT oFont7 ;
ToolTip "VOLVER AL MENU";
ACTION oDlg1:End()
ACTIVATE DIALOG oDlg1 CENTERED ON INIT ( oBrw:cSeek( "" ), oBrw:SetFocus(), .F. )
RELEASE FONT oFont,oFont1,oFont7,oFont3,oFont2
Close all
Return nil
Function Cambia_Esta()
Sele Profe
If Est_Pro=="S"
mensa="** DESACTIVADO **"
Est:="N"
Else
Est:="S"
mensa="** ACTIVADO **"
Endif
Do While .t.
If Rlock()
Repl Est_Pro With Est
DbCommit()
DbUnlock()
MsgInfo( "* Prof. "+Trim(Nom_Doc)+" ** "+CRLF+CRLF+mensa )
Exit
Endif
Enddo
Return .t.
Function Cambia_Agen()
Sele Profe
If Ate_Hor=="S"
mensa="** ATIENDE POR ORDEN DE LLEGADA **"
Age:="N"
Else
mensa="** ATIENDE CON AGENDA **"
Age:="S"
Endif
Do While .t.
If Rlock()
Repl Ate_Hor With Age
DbCommit()
DbUnlock()
MsgInfo( "* Prof. "+Trim(Nom_Doc)+" ** "+CRLF+CRLF+mensa )
Exit
Endif
Enddo
Return .t.
Function Filtra_Pro(nP,oBrw)
Sele Profe
Set Filter to
Do Case
Case nP >= 1 .and. nP <= 3
Do Case
Case nP == 1
// Set Filter To
ORDSETFOCUS("MED2")
Case nP == 2
// Set Filter To Est_Pro=="S"
ORDSETFOCUS("MED3")
Case nP == 3
//Set Filter To Est_Pro#"S"
ORDSETFOCUS("MED4")
EndCase
Other
//Set Filter to Ate_Hor == "S"
ORDSETFOCUS("MED5")
EndCase
DbGotop()
oBrw:Update()
oBrw:Refresh()
Return .T.
//-> Para Cambiar Filtro del Combobox.
FUNCTION Filtra_Pro1( nP, oBrw ,cSeek)
cSeek:=""
SELE Profe // USANDO COMANDO MEMORY/TEMPORARY - MUI BUENO E FACIL.
DO CASE
CASE nP >= 1 .AND. nP <= 3
DO CASE
CASE nP == 1 // TODOS
INDEX ON FIELD->Nom_Pro TAG MED2 TO ARCHTEMP MEMORY
CASE nP == 2 // SOLO VIGENTES
INDEX ON FIELD->Est_Pro + FIELD->Nom_Doc TAG Med3 TO ARCHTEMP ;
FOR FIELD->Est_Pro = "S" MEMORY
CASE nP == 3 // DESACTIVADOS
INDEX ON FIELD->Ate_Hor + FIELD->Nom_Doc TAG Med4 TO ARCHTEMP ;
FOR FIELD->Est_Pro = "N" MEMORY
ENDCASE
OTHERWISE // SOLO AGENDA
INDEX ON FIELD->Ate_Hor + FIELD->Nom_Doc TAG Med5 TO ARCHTEMP ;
FOR FIELD->Ate_Hor = "S" .and. FIELD->Est_Pro = "S" MEMORY
ENDCASE
DbGotop()
oBrw:cSeek( "" )
oBrw:Update()
oBrw:Refresh()
RETURN .T.