Filtro com índices temporarios utilizando LetoDBf

Foto de Anderson

Categoria: 

Já postei sobre como agilizar o tráfego na rede utilizando arquivo de índices com filtros, ou seja, colocando condições na criação do índice. Fica muito mais rápido do que usar SET FILTER.

Entretanto, esbarrei num problema sério quando fui implementar meu sistema com o LetoDBf porque nas minhas condições o Leto só enxergava os campos de DBF e não enxergava as variáveis de memória porque os DBFs rodam no servidor e as variáveis localmente, mesmo declarando-as como variáveis públicas não dava certo.

Exemplo:

cRANDOM  := ALLTRIM(STR(RAN(9999))) // gera número aleatório de 0 a 9999
fINDEX3  := xTEMP+"TEMP" + cRANDOM  // gera nome do arquivo temporário. xTEMP é uma pasta local.
cANO     := "2020" // EXEMPLIFICAR O FILTRO COM VARIÁVEIS
INDEX ON RIGHT(CTR,2)+LEFT(CTR,3)+DESCEND(DTOS(PRAZO)) TAG PRAZO TO (fINDEX3) ;
	 FOR ANO=cANO; /* AQUI VAI O "FILTRO" */
	 ADDITIVE TEMPORARY /* ADDITIVE: Cria índice sem fechar o demais abertos. TEMPORARY: apaga esse índice se fechar o respectivo DBF.

O exemplo acima simplesmente dá erro de variável não existe: CANO, caso esteja utilizando o LetoDBf. Mesmo que coloque como pública, dá erro.

Erro LETO/1003

Despois de analisar o arquivo std.ch, a função OrdCondSet() e OrdFor() cheguei na resposta.

O mesmo exemplo do código acima deve ser refeito assim:

cRANDOM  := ALLTRIM(STR(RAN(9999))) // gera número aleatório de 0 a 9999
fINDEX3  := xTEMP+"TEMP" + cRANDOM  // gera nome do arquivo temporário. xTEMP é uma pasta local.

cANO  := "2020" // EXEMPLIFICAR O FILTRO COM VARIÁVEIS
cCOND := "ANO = "
cCOND += CHR(34)+cANO+CHR(34) // VARIÁVEL DEVE ESTAR ENTRE ASPAS

INDEX ON RIGHT(CTR,2)+LEFT(CTR,3)+DESCEND(DTOS(PRAZO)) TAG PRAZO TO (fINDEX3) ;
	 FOR &(cCOND) ; /* AQUI VAI O "FILTRO" */
	 ADDITIVE TEMPORARY /* ADDITIVE: Cria índice sem fechar o demais abertos. TEMPORARY: apaga esse índice se fechar o respectivo DBF.

Observe que se um dia você pensar em utilizar um servidor de banco de dados com o Harbour ou xHarbour terá que já começar a ir fazendo assim.

Total votes: 0