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.
Despois de analisar o arquivo std.ch, a função OrdCondSet() e OrdFor() cheguei na resposta após rodar o sistema sem o letodb e com o debug para analisar a questão.
QUANDO A CONDIÇÃO ORDFOR() ENVOLVE VARIÁVEL TIPO CARACTER
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 SE FOR STRING 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.
QUANDO A CONDIÇÃO ORDFOR() ENVOLVE VARIÁVEL TIPO DATA
Deparei-me com outro problema: e quando as variáveis são do tipo data.
Fui para o debug novamente sem o letodb e após a criação do índice dei um ? ORDFOR(), resultado:
"( DRESULTADO >= dINI .AND. DRESULTADO <= dFIM ) .OR. ( INICIO >= dINI .AND. INICIO <= dFIM )"
Onde DRESULTADO e INICIO são campos do DBF, enquanto que, dINI e dFIM são variáveis do programa do tipo data. Sabemos que as variáveis dINI e dFIM vão dar erro de variável não existe com o letodb então, já que é assim, temos que montar nossa string de condição diferente, após vários testes funcionou desta forma:
cINI := "CTOD('"+DTOC(dINI)+"')" cFIM := "CTOD('"+DTOC(dFIM)+"')" cCOND := "( DRESULTADO >= " + cINI + " .AND. DRESULTADO <= " + cFIM + " ) .OR. "+; "( INICIO >= " + cINI + " .AND. INICIO <= " + cFIM + " )" INDEX ON MODALIDADE+ANO+STRZERO(NUMERO,3)+COMPL TAG TEMP TO (fINDEX) ; FOR &(cCOND) ; ADDITIVE TEMPORARY
Coloquei assim para entender melhor, se colocasse tudo dentro da variável cCOND iria ficar muito embolado. Assim ficou melhor também para ir depurando (analisando com debug).
Comentários recentes