PROBLEMAS DBFCDX

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

jhilbert
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 17 Set 2005 16:53

PROBLEMAS DBFCDX

Mensagem por jhilbert »

Caros colegas....

Estou com problemas na indexação usando o dbfcdx..... Tenho um indice com (02) dois TAG's... cliecod e cliente... segue a estrutura do arquivo:

CAMPO TIPO TAMANHO
cliecod C 8
cliente C 40

Estou usando o clipper52e, FW2.4, blinker 6...

A indexação no campo cliente está OK.

Mas a indexação no campo cliecod não enxerga todos os registros...

O problema não de ve ser da rotina, pois quando atinge um determinado numero de registros funciona normalmente...

Segue as linhas de compilação e linker... e a rotina de indexação....

compilação e linker....................................
clipper iptu -M -N
clipper imprime -M -N
clipper printer -M -N
clipper rpreview -M -N
clipper tdosprn -M -N
clipper cliente -M -N
clipper ruas -M -N
clipper imovel -M -N
clipper tabela -M -N
clipper funcoes -M -N
clipper cob -M -N
pause
blinker fi iptu,imprime,printer,rpreview,tdosprn,cliente,ruas,imovel,funcoes,tabela,cob,mpar @Fivewin.lnk
......................................................

Fivewin.lnk ...........................
LINKER INCREMENTAL OFF
BLINKER CLIPPER SYMBOL OFF
BLINKER EXECUTABLE COMPRESS
MAP A,S
BLINKER LINK VERSION 6.0
PACKCODE
PACKDATA
DEFBEGIN
name FiveWin
description 'Clipper for Windows library'
exetype Windows 3.1
code moveable discardable
data preload moveable
stacksize 9500
heapsize 2048
segment 'PLANKTON_TEXT' nondiscardable
segment 'EXTEND_TEXT' nondiscardable
segment 'OM_TEXT' nondiscardable
segment 'OSMEM_TEXT' nondiscardable
segment 'SORTOF_TEXT' nondiscardable
segment 'STACK_TEXT' nondiscardable
DEFEND
NOBELL
SEARCH Five, FiveC, Objects
LIB WinApi, Clipper, Extend, Dbfcdx, Dbfntx, Terminal

rotina de Indexação.................
oText:SetText("Classificando Clientes...")
Ferase("clientes.cdx")
** // BD Clientes
IF Use_Arq("clientes",.F.,.F.)
oMeter:nTotal:= cli->(LastRec()*2)
PACK
INDEX ON cliecod TAG codigo TO clientes EVAL{||oMeter:Set(cli->(Recno() ))} EVERY 5
INDEX ON cliente TAG nome TO clientes EVAL{||oMeter:Set(cli->(cli->(LastRec())+Recno() ))} EVERY 5
ENDIF
CLOSE DATA
........................................

Espero que possam me ajudar....

PS: No sistema quanto uso o tag nome, o dbseek acha o registro solicitado.... já quando uso o TAG codigo o dbSeek não encontra.. (é como se não existisse o registro)..
Jeorge Hilbert
Clipper52e FW2.4 Blinker6.0
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Não sei se já resolveu o seu problema, mas quando indexamos campos numéricos é boa prática usar métodos para infalibilizar a busca.

Se o campo é numérico é bom transformar o campo em caracter tanto na indexação como na pesquisa, use:

Se o campo CLIECOD tem tamanho 5, use:

...
INDEX ON str(cliecod,5) TAG codigo TO clientes ...
...

E na pesquisa use:

SEEK str(m->cliecod,5)

Provavelmente voce obtera mais exito.

@braços :?)
jhilbert
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 17 Set 2005 16:53

Mensagem por jhilbert »

Caro colega,

Consegui resolver... o pessoal do fivewin me deu uma força....

use nomes diferentes nos tag's e retirei a função do meter..

Está tudo funcionando perfeitamente...

Obrigado pela dica,

Jeorge Hilbert
Jeorge Hilbert
Clipper52e FW2.4 Blinker6.0
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Se voce gosta de medir o andamento das indexações faça como eu:

Coloque como STATIC a variavel de suporte ao objeto Window de sua aplicação.

...
STATIC oWnd

FUNCTION MAIN()
...
DEFINE WINDOW oWnd ...
...
// Chame sua função de Indexação
...

E então use a função abaixo como no exemplo:

INDEX ON blablabla EVAL dbProgress()

FUNCTION dbProgress( cMensagem )
LOCAL cComplete := LTRIM(STR(INT((RECNO()/LASTREC()) * 100)))
cMensagem := OemToAnsi( ;
iif(cMensagem=nil,"Indexacao de ",cMensagem) )
MENSAGEM(OemToAnsi(cMensagem + cComplete + "% Completada."))
RETURN(.T.)

FUNCTION MENSAGEM( MENSAGEM, TEMPO )
MENSAGEM := OemToAnsi(MENSAGEM)
IF TEMPO <> NIL
MSGSTOP( MENSAGEM )
ELSE
oWnd:SetMsg( MENSAGEM )
ENDIF

Desta forma a operação será apresentada em sua barra de status e voce não terá problemas de memória que são causados pelo uso excessivo do METER.

@braços :?)
Responder