Como criar filtros rápidos em xBase/Clipper/Harbour

Foto de Anderson

Exemplo de como criar filtros em banco de dados que funcionem rapidamente em Harbour/xHarbour

Vou apresentar alguns segmentos de códigos para tentar dar um panorama geral.

Vamos começar do início com as configurações iniciais:

*** SETs
SET(36, 23)   // _SET_MESSAGE
SET(37, .F.)  // _SET_MCENTER
SET(39,159)   // _SET_EVENTMASK, MOUSE NOS GETs
SETMODE(43,80)
SETMOUSE(.t.)
SETBLINK(.T.)   // PISCA A COR SE TIVER * NA COR DE FUNDO
SET SCOREBOARD OFF
SET DATE BRITISH
SET DELETED ON
SET EPOCH TO 1980 // Bug do milênio
SET MESSAGE TO 24
SET OPTIMIZE ON       // Vai optimizar filtros, se for usar o SET FILTER
SET TIME FORMAT TO "hh:mm"
SET CONFIRM ON
SET HARDCOMMIT OFF // É MELHOR DAR UM DBCOMMIT() NO FINAL DE CADA TAREFA
SET WRAP ON

Para criar os bancos de dados com os índices DBFCDX e usar a acentuação de nosso idioma português:

*** DEFINIR TIPO DE BANCO DE DADOS: DBFCDX Nativo ***
REQUEST DBFCDX
REQUEST DBFFPT
ANNOUNCE FPTCDX
RDDSETDEFAULT("DBFCDX")
RDDREGISTER( "DBFCDX", 1 ) // RDT_FULL
SET AUTOPEN OFF

*** DEFINIR IDIOMA PORTUGUÊS ***
REQUEST HB_CODEPAGE_PT850  // PARA INDEXAR CAMPOS ACENTUADOS
HB_SETCODEPAGE("PT850")          // PARA INDEXAR CAMPOS ACENTUADOS

Depois do Clipper 5.2e eu passei a usar uma função para abrir os banco de dados sem problemas:

ABREDBF("ESTAGIO",  "EST")
EST->(ORDSETFOCUS("POSICAO"))
ABREDBF("POSICAO",  "POS")
ABREDBF("PROCESSO", "PRO")
ABREDBF("EMPRESAS", "EMP")
ABREDBF("CADASTRO", "CRC")
ABREDBF("UNIDADE",  "UG")

Aqui vem o exemplo que mais uso, criar um índice temporário localmente com o filtro desejado. Eu uso a função RAN para criar um número aleatório (randômico) e não repetir os nomes de arquivos. Todavia, é sempre bom apagar esses arquivos temporários após o uso e, para não esquecer disso, já deixe o parâmetro "ADDITIVE TEMPORARY" para que ele se autodestrua após ser fechado.

SELECT PRO
// FILTRA ABERTAS E FINALIZADAS NO EXERCÍCIO
cRANDOM := ALLTRIM(STR(RAN(9999)))
fINDEX  := xTEMP+"TEMP" + cRANDOM
INDEX ON MODALIDADE+ANO+STRZERO(NUMERO,3)+COMPL TAG TEMP TO (fINDEX) ;
            FOR ( DRESULTADO >= dINI .AND. DRESULTADO <= dFIM ) .OR. ;
            ( INICIO >= dINI .AND. INICIO <= dFIM ) ;
            ADDITIVE TEMPORARY
PRO->(DBGOTOP())   // ATIVA FILTROS E RELAÇÕES MOVENDO O PONTEIRO DO REGISTRO PARA O INÍCIO

 

Espero que tenha como ter dado uma boa idéia geral de como fazer.

Já tem uma função para gerar números aleatórios na página de downloads, então só vou deixar aqui embaixo a função ABREDBF:

FUNCTION ABREDBF(cDBF, cALIAS, cINDEX)
IF EMPTY(cINDEX)
   IF FILE(cDBF+INDEXEXT())
      cINDEX := cDBF
   ENDIF
ENDIF

bORD    := cALIAS + "->(INDEXORD())"
bSETORD := cALIAS + "->(ORDSETFOCUS(1))"

IF SELECT(cALIAS)=0
   USE (cDBF) ALIAS (cALIAS) SHARED NEW
   IF !EMPTY(cINDEX)
      SET INDEX TO (cINDEX)
   ENDIF

ELSEIF EVAL( { || &bORD } ) > 1
       // CASO JA ESTEJA ABERTO, ASSEGURA QUE ESTÁ NA 1ª CHAVE DO INDICE
       EVAL( { || &bSETORD } )
ENDIF
RETURN

Leia também: Como Agilizar o Tráfego da Rede no Clipper.

Total votes: 0