Filtro em browse usando CDX e OrdScope em Minigui

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

jcsjesus
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 16 Out 2005 18:51
Localização: Minas Gerais

Filtro em browse usando CDX e OrdScope em Minigui

Mensagem por jcsjesus »

O exemplo abaixo demonstra o uso em MiniGui de um filtro em browse usando arquivos de indice CDX e filtrando com uso de OrdScope. Até ai tudo bem. O que eu gostaria de saber é como implementar um filtro temporário em CDX que possa substituir o indice "INDICE3". Isto como eliminar a necessidade de se criar o indice "INDICE3", através de um índice temporário.


*---------------------------------------------------------------*
#include "minigui.ch"
#define DRIVER "DBFCDX"

/*
* Filtro em Browse com OrdScope V. 1.00
* José Carlos dos Santos Jesus - jcsjesus@ufla.br
* 06/10/2005
*/

FUNCTION MAIN
Local aItema,aItemb
///////////////////////////////////////////////////////////////////////////////
// Inicializacion RDD DBFCDX Nativo
///////////////////////////////////////////////////////////////////////////////
REQUEST DBFCDX, DBFFPT
RDDSETDEFAULT( "DBFCDX" ) // tem que ficar dentro da função que vai criar o indice
///////////////////////////////////////////////////////////////////////////////
SET DELETED ON
SET DATE FRENCH
SET CENTURY ON
SET BROWSESYNC ON
set softseek on
*altd()
*FERASE( "teste.cdx" ) // apaga o teste.cdx
*FERASE( "teste.dbf" )
IF !file ("TESTE.DBF")
DBCREATE("TESTE.DBF",{{"CAMPO1","N",5,0},{"CAMPO2","N",5,0}})
USE TESTE
aItema:={}
FOR I=1 TO 10000
FOR A=1 TO 100
TESTE->(DBAPPEND())
TESTE->CAMPO1:=I
TESTE->CAMPO2:=A
NEXT
aadd(aItema,str(i,5,0))
NEXT
aItemb:={"1","2","3","4","5","6","7","8","9","10"}
ELSE
aItema:={}
FOR I=1 TO 10000
FOR A=1 TO 100
NEXT
aadd(aItema,str(i,5,0))
NEXT
aItemb:={"1","2","3","4","5","6","7","8","9","10"}
ENDIF
use teste // Alias teste New
IF !file ("TESTE.CDX")
index on STR(CAMPO1,5,0) TAG indice1 to teste.cdx
index on STR(CAMPO2,5,0) TAG indice2 to teste.cdx
index on STR(CAMPO1,5,0)+ STR(CAMPO2,5,0) TAG indice3 to teste.cdx
ENDIF
set index to teste.cdx

DEFINE WINDOW principal;
AT 82,80 ;
WIDTH 400 ;
HEIGHT 350 ;
TITLE 'Filtro em Browse com Ordscope - v.1.00' ;
ICON '' ;
MAIN ;
BACKCOLOR {212,208,251} ;
FONT 'Sans serif' ;
SIZE 10 ;

DEFINE STATUSBAR
STATUSITEM "Filtrando em 1.000.000 de registros"
END STATUSBAR

@ 31,42 COMBOBOX combo_1 ;
WIDTH 80 ;
FONT 'Sans serif' ;
items aitema;
SIZE 10 ;
ON CHANGE DOCOMBO_1()

@ 35,150 LABEL label_1;
WIDTH 100;
HEIGHT 20;
VALUE "Filtra Campo 1";
BACKCOLOR {212,208,251} ;
FONT "ARIAL";
SIZE 10

@ 61,43 COMBOBOX combo_2 ;
WIDTH 80 ;
FONT 'Sans serif' ;
items aitemb;
SIZE 10 ;
ON CHANGE DOCOMBO_2()

@65,150 LABEL label_2;
WIDTH 100;
HEIGHT 20 ;
VALUE "Filtra Campo 2" ;
BACKCOLOR {212,208,251} ;
FONT "ARIAL" SIZE 10

@255,100 BUTTON Button_1;
CAPTION "Cancelar Filtro" ;
TOOLTIP "Pressione aqui para cancelar o filtro";
WIDTH 100 ;
ON CLICK cancel_filter()

@ 96,41 BROWSE browse_1 ;
OF form ;
WIDTH 180 ;
HEIGHT 139 ;
HEADERS {"Campo 1","Campo 2"} ;
WIDTHS {80,80} ;
WORKAREA teste ;
FIELDS {'teste->CAMPO1','teste->CAMPO2'} ;
VALUE 1
END WINDOW
activate window principal
declare window principal
******************************************************************
STATIC FUNCTION DOCOMBO_1
*ALTD()
xcombo1= str(principal.COMBO_1.VALUE,5,0)
xcombo2= str(principal.COMBO_2.VALUE,5,0)
IF EMPTY(VAL(xcombo2))
ORDSETFOCUS("INDICE1")
CsCOPE := xcombo1
ELSE
ORDSETFOCUS("INDICE3")
CsCOPE := xcombo1+xcombo2
ENDIF
IF LEN(CsCOPE) # 0
TESTE->(OrdScope( 0, CsCOPE))
TESTE->(OrdScope( 1, CsCOPE))
DBGOTOP()
principal.Browse_1.Value := teste->(recno())

principal.BROWSE_1.REFRESH
ELSE
DBGOTOP()
principal.Browse_1.Value := teste->(recno())
OrdScope( 0, NIL)
OrdScope( 1, NIL)
principal.browse_1.REFRESH
ENDIF
RETURN
******************************************************************
STATIC FUNCTION DOCOMBO_2
*ALTD()
xcombo1= str(principal.COMBO_1.VALUE,5,0)
xcombo2= str(principal.COMBO_2.VALUE,5,0)
IF EMPTY(VAL(xcombo1))
ORDSETFOCUS("INDICE2")
CsCOPE := xcombo2
ELSE
ORDSETFOCUS("INDICE3")
CsCOPE := xcombo1+xcombo2
ENDIF
IF LEN(CsCOPE) # 0
TESTE->(OrdScope( 0, CsCOPE))
TESTE->(OrdScope( 1, CsCOPE))
DBGOTOP()
principal.Browse_1.Value := teste->(recno())
principal.BROWSE_1.REFRESH
ELSE
DBGOTOP()
principal.Browse_1.Value := teste->(recno())
OrdScope( 0, NIL)
OrdScope( 1, NIL)
principal.browse_1.REFRESH
ENDIF
RETURN
******************************************************************
FUNCTION cancel_filter
*ALTD()
principal.COMBO_1.VALUE:=0
principal.COMBO_2.VALUE:=0
ORDSETFOCUS("INDICE3")
TESTE->(OrdScope( 0, NIL))
TESTE->(OrdScope( 1, NIL))
DBGOTOP()
principal.Browse_1.Value := teste->(recno())
principal.browse_1.REFRESH
RETURN
****************************************************************** :(
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Mensagem por Hasse »

Eu uso bastante o recurso de filtro no Clipper, e também no xHarbour.

Tentei compilar. Acusou a falta das seguintes funções:
THTTP
LOADLIBRARY
GERPROCADDRESS
CALDLL
FREELIBRARY

Favor disponibilizar.
Hasse
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
jcsjesus
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 16 Out 2005 18:51
Localização: Minas Gerais

Mensagem por jcsjesus »

Hasse escreveu:Eu uso bastante o recurso de filtro no Clipper, e também no xHarbour.

Tentei compilar. Acusou a falta das seguintes funções:
THTTP
LOADLIBRARY
GERPROCADDRESS
CALDLL
FREELIBRARY

Favor disponibilizar.
Hasse
Hasse,
Este exemplo é para ser compilado usando xharbour e Minigui. Você usou o compile.bat da minigui. Se usou tem que modificá-lo para trabalhar com xharbour. Estou enviando o meu compile.bat para xharbour:

Código: Selecionar todos


@echo off
CLS

Rem Set Paths 

IF "%MG_BCC%"=="" SET MG_BCC=c:\bcc55
IF "%MG_ROOT%"=="" SET MG_ROOT=c:\minigui
IF "%MG_HRB%"=="" SET MG_HRB=c:\xharbour

if exist %1.exe del %1.exe

Rem Debug Compile

if "%2"=="/d" GOTO DEBUG_COMP
if "%2"=="/D" GOTO DEBUG_COMP
if "%3"=="/d" GOTO DEBUG_COMP
if "%3"=="/D" GOTO DEBUG_COMP
if "%4"=="/d" GOTO DEBUG_COMP
if "%4"=="/D" GOTO DEBUG_COMP
if "%5"=="/d" GOTO DEBUG_COMP
if "%5"=="/D" GOTO DEBUG_COMP
if "%6"=="/d" GOTO DEBUG_COMP
if "%6"=="/D" GOTO DEBUG_COMP

%MG_HRB%\bin\harbour %1.prg -n -i%MG_HRB%\include;%MG_ROOT%\include; %2 %3

GOTO C_COMP

:DEBUG_COMP

ECHO OPTIONS NORUNATSTARTUP > INIT.CLD

%MG_HRB%\bin\harbour %1.prg -n -b -i%MG_HRB%\include;%MG_ROOT%\include; %2 %3

:C_COMP

%MG_BCC%\bin\bcc32 -c -O2 -tW -M -I%MG_HRB%\include;%MG_BCC%\include; -L%MG_BCC%\lib; %1.c

if exist %1.rc %MG_BCC%\bin\brc32 -r %1.rc

echo c0w32.obj + > b32.bc
echo %1.obj, + >> b32.bc
echo %1.exe, + >> b32.bc
echo %1.map, + >> b32.bc
echo %MG_ROOT%\lib\minigui.lib + >> b32.bc
echo %MG_HRB%\lib\dll.lib + >> b32.bc

echo %MG_HRB%\lib\rtl.lib + >> b32.bc
echo %MG_HRB%\lib\vm.lib + >> b32.bc
echo %MG_HRB%\lib\gtwin.lib + >> b32.bc
echo %MG_HRB%\lib\lang.lib + >> b32.bc
echo %MG_HRB%\lib\codepage.lib + >> b32.bc
echo %MG_HRB%\lib\macro.lib + >> b32.bc
echo %MG_HRB%\lib\rdd.lib + >> b32.bc
echo %MG_HRB%\lib\dbfntx.lib + >> b32.bc
echo %MG_HRB%\lib\dbfcdx.lib + >> b32.bc
echo %MG_HRB%\lib\dbfdbt.lib + >> b32.bc
echo %MG_HRB%\lib\dbffpt.lib + >> b32.bc
echo %MG_HRB%\lib\common.lib + >> b32.bc
echo %MG_HRB%\lib\debug.lib + >> b32.bc
echo %MG_HRB%\lib\pp.lib + >> b32.bc
echo %MG_HRB%\lib\libct.lib + >> b32.bc
echo %MG_HRB%\lib\libmisc.lib + >> b32.bc
echo %MG_HRB%\lib\hbole.lib + >> b32.bc
echo %MG_HRB%\lib\hbprinter.lib + >> b32.bc
echo %MG_HRB%\lib\socket.lib + >> b32.bc
echo %MG_HRB%\lib\miniprint.lib + >> b32.bc

Rem ODBC Libraries Link

if "%2"=="/O" echo %MG_HRB%\lib\hbodbc.lib + >> b32.bc
if "%2"=="/O" echo %MG_HRB%\lib\odbc32.lib + >> b32.bc
if "%2"=="/o" echo %MG_HRB%\lib\hbodbc.lib + >> b32.bc
if "%2"=="/o" echo %MG_HRB%\lib\odbc32.lib + >> b32.bc

if "%3"=="/O" echo %MG_HRB%\lib\hbodbc.lib + >> b32.bc
if "%3"=="/O" echo %MG_HRB%\lib\odbc32.lib + >> b32.bc
if "%3"=="/o" echo %MG_HRB%\lib\hbodbc.lib + >> b32.bc
if "%3"=="/o" echo %MG_HRB%\lib\odbc32.lib + >> b32.bc

if "%4"=="/O" echo %MG_HRB%\lib\hbodbc.lib + >> b32.bc
if "%4"=="/O" echo %MG_HRB%\lib\odbc32.lib + >> b32.bc
if "%4"=="/o" echo %MG_HRB%\lib\hbodbc.lib + >> b32.bc
if "%4"=="/o" echo %MG_HRB%\lib\odbc32.lib + >> b32.bc

if "%5"=="/O" echo %MG_HRB%\lib\hbodbc.lib + >> b32.bc
if "%5"=="/O" echo %MG_HRB%\lib\odbc32.lib + >> b32.bc
if "%5"=="/o" echo %MG_HRB%\lib\hbodbc.lib + >> b32.bc
if "%5"=="/o" echo %MG_HRB%\lib\odbc32.lib + >> b32.bc

if "%6"=="/O" echo %MG_HRB%\lib\hbodbc.lib + >> b32.bc
if "%6"=="/O" echo %MG_HRB%\lib\odbc32.lib + >> b32.bc
if "%6"=="/o" echo %MG_HRB%\lib\hbodbc.lib + >> b32.bc
if "%6"=="/o" echo %MG_HRB%\lib\odbc32.lib + >> b32.bc

Rem ZIP Libraries Linking

if "%2"=="/Z" echo %MG_HRB%\lib\zlib1.lib + >> b32.bc
if "%2"=="/Z" echo %MG_HRB%\lib\ziparchive.lib + >> b32.bc
if "%2"=="/z" echo %MG_HRB%\lib\zlib1.lib + >> b32.bc
if "%2"=="/z" echo %MG_HRB%\lib\ziparchive.lib + >> b32.bc

if "%3"=="/Z" echo %MG_HRB%\lib\zlib1.lib + >> b32.bc
if "%3"=="/Z" echo %MG_HRB%\lib\ziparchive.lib + >> b32.bc
if "%3"=="/z" echo %MG_HRB%\lib\zlib1.lib + >> b32.bc
if "%3"=="/z" echo %MG_HRB%\lib\ziparchive.lib + >> b32.bc

if "%4"=="/Z" echo %MG_HRB%\lib\zlib1.lib + >> b32.bc
if "%4"=="/Z" echo %MG_HRB%\lib\ziparchive.lib + >> b32.bc
if "%4"=="/z" echo %MG_HRB%\lib\zlib1.lib + >> b32.bc
if "%4"=="/z" echo %MG_HRB%\lib\ziparchive.lib + >> b32.bc

if "%5"=="/Z" echo %MG_HRB%\lib\zlib1.lib + >> b32.bc
if "%5"=="/Z" echo %MG_HRB%\lib\ziparchive.lib + >> b32.bc
if "%5"=="/z" echo %MG_HRB%\lib\zlib1.lib + >> b32.bc
if "%5"=="/z" echo %MG_HRB%\lib\ziparchive.lib + >> b32.bc

if "%6"=="/Z" echo %MG_HRB%\lib\zlib1.lib + >> b32.bc
if "%6"=="/Z" echo %MG_HRB%\lib\ziparchive.lib + >> b32.bc
if "%6"=="/z" echo %MG_HRB%\lib\zlib1.lib + >> b32.bc
if "%6"=="/z" echo %MG_HRB%\lib\ziparchive.lib + >> b32.bc

Rem ADS Libraries Linking

if "%2"=="/A" echo %MG_HRB%\lib\rddads.lib + >> b32.bc
if "%2"=="/A" echo %MG_HRB%\lib\ace32.lib + >> b32.bc
if "%2"=="/a" echo %MG_HRB%\lib\rddads.lib + >> b32.bc
if "%2"=="/a" echo %MG_HRB%\lib\ace32.lib + >> b32.bc

if "%3"=="/A" echo %MG_HRB%\lib\rddads.lib + >> b32.bc
if "%3"=="/A" echo %MG_HRB%\lib\ace32.lib + >> b32.bc
if "%3"=="/a" echo %MG_HRB%\lib\rddads.lib + >> b32.bc
if "%3"=="/a" echo %MG_HRB%\lib\ace32.lib + >> b32.bc

if "%4"=="/A" echo %MG_HRB%\lib\rddads.lib + >> b32.bc
if "%4"=="/A" echo %MG_HRB%\lib\ace32.lib + >> b32.bc
if "%4"=="/a" echo %MG_HRB%\lib\rddads.lib + >> b32.bc
if "%4"=="/a" echo %MG_HRB%\lib\ace32.lib + >> b32.bc

if "%5"=="/A" echo %MG_HRB%\lib\rddads.lib + >> b32.bc
if "%5"=="/A" echo %MG_HRB%\lib\ace32.lib + >> b32.bc
if "%5"=="/a" echo %MG_HRB%\lib\rddads.lib + >> b32.bc
if "%5"=="/a" echo %MG_HRB%\lib\ace32.lib + >> b32.bc

if "%6"=="/A" echo %MG_HRB%\lib\rddads.lib + >> b32.bc
if "%6"=="/A" echo %MG_HRB%\lib\ace32.lib + >> b32.bc
if "%6"=="/a" echo %MG_HRB%\lib\rddads.lib + >> b32.bc
if "%6"=="/a" echo %MG_HRB%\lib\ace32.lib + >> b32.bc

Rem MySql Libraries Linking

if "%2"=="/M" echo %MG_HRB%\lib\mysql.lib + >> b32.bc
if "%2"=="/M" echo %MG_HRB%\lib\libmysql.lib + >> b32.bc
if "%2"=="/m" echo %MG_HRB%\lib\mysql.lib + >> b32.bc
if "%2"=="/m" echo %MG_HRB%\lib\libmysql.lib + >> b32.bc

if "%3"=="/M" echo %MG_HRB%\lib\mysql.lib + >> b32.bc
if "%3"=="/M" echo %MG_HRB%\lib\libmysql.lib + >> b32.bc
if "%3"=="/m" echo %MG_HRB%\lib\mysql.lib + >> b32.bc
if "%3"=="/m" echo %MG_HRB%\lib\libmysql.lib + >> b32.bc

if "%4"=="/M" echo %MG_HRB%\lib\mysql.lib + >> b32.bc
if "%4"=="/M" echo %MG_HRB%\lib\libmysql.lib + >> b32.bc
if "%4"=="/m" echo %MG_HRB%\lib\mysql.lib + >> b32.bc
if "%4"=="/m" echo %MG_HRB%\lib\libmysql.lib + >> b32.bc

if "%5"=="/M" echo %MG_HRB%\lib\mysql.lib + >> b32.bc
if "%5"=="/M" echo %MG_HRB%\lib\libmysql.lib + >> b32.bc
if "%5"=="/m" echo %MG_HRB%\lib\mysql.lib + >> b32.bc
if "%5"=="/m" echo %MG_HRB%\lib\libmysql.lib + >> b32.bc

if "%6"=="/M" echo %MG_HRB%\lib\mysql.lib + >> b32.bc
if "%6"=="/M" echo %MG_HRB%\lib\libmysql.lib + >> b32.bc
if "%6"=="/m" echo %MG_HRB%\lib\mysql.lib + >> b32.bc
if "%6"=="/m" echo %MG_HRB%\lib\libmysql.lib + >> b32.bc

echo cw32.lib + >> b32.bc
echo import32.lib, >> b32.bc

if exist %1.res echo %1.res + >> b32.bc
if exist %MG_ROOT%\resources\hbprinter.res echo %MG_ROOT%\resources\hbprinter.res + >> b32.bc
if exist %MG_ROOT%\resources\miniprint.res echo %MG_ROOT%\resources\miniprint.res + >> b32.bc
echo %MG_ROOT%\resources\minigui.res >> b32.bc

Rem Debug Link

if "%2"=="/d" GOTO DEBUG_LINK
if "%2"=="/D" GOTO DEBUG_LINK
if "%3"=="/d" GOTO DEBUG_LINK
if "%3"=="/D" GOTO DEBUG_LINK
if "%4"=="/d" GOTO DEBUG_LINK
if "%4"=="/D" GOTO DEBUG_LINK
if "%5"=="/d" GOTO DEBUG_LINK
if "%5"=="/D" GOTO DEBUG_LINK
if "%6"=="/d" GOTO DEBUG_LINK
if "%6"=="/D" GOTO DEBUG_LINK

%MG_BCC%\bin\ilink32 -Gn -Tpe -aa -L%MG_BCC%\lib; @b32.bc

GOTO CLEANUP

:DEBUG_LINK

%MG_BCC%\bin\ilink32 -Gn -Tpe -ap -L%MG_BCC%\lib; @b32.bc

:CLEANUP

del *.tds
del %1.c
del %1.map
del %1.obj
del b32.bc
if exist %1.res del %1.res
%1
Qualquer outra dúvida entre em contato comigo. Um abraço.
culik

Mensagem por culik »

Buenas

amanha vou colocar seu pegueno programa aqui escrito com a hwgui

[]s
Luiz
culik

Mensagem por culik »

Ola jcsjesus

Abaixo, esta o codigo que vc postou totalmente em hwgui
note que nao uso variaveis private e nem publicas. alem de que a hwgui nao USA VARIAVEIS publicas internamente para armarzenar controles

e TUDO oop, Note que passo os objetos de controle para as funcoes

#include "hwgui.ch"
announce rddsys
REQUEST DBFCDX, DBFFPT

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function MAIN()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION MAIN

LOCAL aItema
LOCAL aItemb
LOCAL cCombo := 0
LOCAL cCombo1 := 0
LOCAL lchange := .f.
LOCAL lchange1 := .f.
LOCAL combo_1 := 1
LOCAL combo_2 := 1
LOCAL i
LOCAL a
LOCAL principal
local oStatus
///////////////////////////////////////////////////////////////////////////////
// Inicializacion RDD DBFCDX Nativo
///////////////////////////////////////////////////////////////////////////////

Rddsetdefault( "DBFCDX" ) // tem que ficar dentro da função que vai criar o indice
///////////////////////////////////////////////////////////////////////////////
SET DELETED ON
SET DATE FRENCH
SET CENTURY ON

SET SOFTSEEK ON
// altd()
// FERASE( "teste.cdx" ) // apaga o teste.cdx
// FERASE( "teste.dbf" )
IF !File( "TESTE.DBF" )
Dbcreate( "TESTE.DBF", { { "CAMPO1", "N", 5, 0 }, { "CAMPO2", "N", 5, 0 } } )
USE TESTE new
aItema := {}
FOR I := 1 TO 10000
FOR A := 1 TO 100
TESTE->( Dbappend() )
TESTE->CAMPO1 := I
TESTE->CAMPO2 := A
NEXT
Aadd( aItema, Str( i, 5, 0 ) )
NEXT
aItemb := { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }
USE
ELSE
aItema := {}
FOR I := 1 TO 10000
FOR A := 1 TO 100
NEXT
Aadd( aItema, Str( i, 5, 0 ) )
NEXT
aItemb := { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }
ENDIF
CLOSE ALL
USE teste new
? Alias()
IF !File( "TESTE.CDX" )
INDEX ON Str( CAMPO1, 5, 0 ) TAG indice1
INDEX ON Str( CAMPO2, 5, 0 ) TAG indice2
INDEX ON Str( CAMPO1, 5, 0 ) + Str( CAMPO2, 5, 0 ) TAG indice3
ENDIF
//set index to teste.cdx

INIT dialog principal ;
TITLE 'Filtro em Browse com Ordscope - v.1.00' ;
AT 82, 80 ;
size 400, 350 clipper ;
on init {||writestatus(principal,1,"Filtrando em 1.000.000 de registros" )}

add status oStatus to principal parts 400
// writestatus(principal,1,"Filtrando em 1.000.000 de registros" )

@ 31, 30 SAY "Filtra Campo 1" of principal ;
BACKCOLOR RGB( 212, 208, 251 ) ;
SIZE 100, 20 ;
FONT HFont():Add( "ARIAL",, 10 )

@ 31, 50 COMBOBOX combo_1 items aitema of principal SIZE 100, 150 ;
FONT HFont():Add( 'Sans serif',, 10 ) ;
ON change { || DOCOMBO_1( combo_1, combo_2,browse_1 ) }

@ 31, 80 SAY "Filtra Campo 2" of principal ;
SIZE 100, 20 ;
BACKCOLOR RGB( 212, 208, 251 ) ;
FONT HFont():Add( "ARIAL",, 10 )

@ 31, 110 COMBOBOX combo_2 items aitemb of principal SIZE 100, 150 ;
FONT HFont():Add( 'Sans serif',, 10 ) ;
ON change { || DOCOMBO_2( combo_1, combo_2,browse_1 ) }

@ 31, 140 BUTTON "Cancelar Filtro" of principal ;
TOOLTIP "Pressione aqui para cancelar o filtro" ;
size 100, 20 ;
ON CLICK { || cancel_filter( combo_1, combo_2,browse_1 ) }

@ 31, 170 BROWSE browse_1 DATABASE ;
OF principal ;
SIZE 370, 120

ADD COLUMN { || teste->CAMPO1 } TO browse_1 ;
HEADER "Campo 1"

ADD COLUMN { || teste->CAMPO2 } TO browse_1 ;
HEADER "Campo 2"

activate dialog principal

// *****************************************************************

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Static Function DOCOMBO_1()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
STATIC FUNCTION DOCOMBO_1( x, y, browse_1 )

// ALTD()
LOCAL xcombo1
LOCAL xcombo2
LOCAL CsCOPE

xcombo1 := Str( Val( x:getText() ), 5, 0 )
xcombo2 := Str( Val( y:getText() ), 5, 0 )

IF Empty( Val( xcombo2 ) )
Ordsetfocus( "INDICE1" )
CsCOPE := xcombo1
ELSE
Ordsetfocus( "INDICE3" )
CsCOPE := xcombo1 + xcombo2
ENDIF
IF Len( CsCOPE ) # 0
TESTE->( Ordscope( 0, CsCOPE ) )
TESTE->( Ordscope( 1, CsCOPE ) )
Dbgotop()
BROWSE_1:REFRESH()
ELSE
Dbgotop()

Ordscope( 0, NIL )
Ordscope( 1, NIL )

browse_1:REFRESH()
ENDIF
RETURN .t.
// *****************************************************************

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Static Function DOCOMBO_2()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
STATIC FUNCTION DOCOMBO_2( x, y, browse_1 )

LOCAL xcombo1
LOCAL xcombo2
LOCAL CsCOPE

xcombo1 := Str( Val( x:gettext() ), 5, 0 )
xcombo2 := Str( Val( Y:gettext() ), 5, 0 )

IF Empty( Val( xcombo1 ) )
Ordsetfocus( "INDICE2" )
CsCOPE := xcombo2
ELSE
Ordsetfocus( "INDICE3" )
CsCOPE := xcombo1 + xcombo2
ENDIF
IF Len( CsCOPE ) # 0
TESTE->( Ordscope( 0, CsCOPE ) )
TESTE->( Ordscope( 1, CsCOPE ) )
Dbgotop()

BROWSE_1:REFRESH()
ELSE
Dbgotop()
Ordscope( 0, NIL )
Ordscope( 1, NIL )

browse_1:REFRESH()
ENDIF
RETURN .t.
// *****************************************************************

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function cancel_filter()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
FUNCTION cancel_filter( x, y, browse_1 )

x:value := 0
y:value := 0
x:refresh()
y:refresh()
Ordsetfocus( "INDICE3" )
TESTE->( Ordscope( 0, NIL ) )
TESTE->( Ordscope( 1, NIL ) )
Dbgotop()
browse_1:REFRESH()

RETURN

[]s
Luiz
jcsjesus
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 16 Out 2005 18:51
Localização: Minas Gerais

Mensagem por jcsjesus »

Ola Culik,
Agradeço o seu esforço em traduzir o código de meu exemplo para hwgui. Creio que enriquecerá ainda mais este fórum. Vejo que o código, apesar de estar todo em oop, não é muito diferente do código original do meu exemplo. Contudo, a principal questão permaneceu ainda sem sua observação:
Como implementar um filtro temporário em CDX que possa substituir o indice "INDICE3". Isto como eliminar a necessidade de se criar o indice "INDICE3", através de um índice temporário. Creio que esta seria outra importante contribuição como exemplo ao usuário deste fórum que como eu não tem grandes conhecimentos ainda em CDX, Minigui ou mesmo em hwgui. Meu objetivo é estudar uma forma de usar CDX com OrdScope com a flexibilidade do SET FILTER.
Mais uma vez agradeço o seu esforço e um abraço.
culik

Mensagem por culik »

Jesus
>Como implementar um filtro temporário em CDX que possa substituir o >indice "INDICE3". Isto como eliminar a necessidade de se criar o >indice "INDICE3", através de um índice temporário
Nao tem como.
ORDSCOPE requer um indice ativo para funcionar

e a unica forma de fazer o scope pelos dois campos e ter um indice por esses campos

[]s
Luiz
Responder