Jump to content
Fivewin Brasil

erro ao indexar indices com descricao nome


syspel

Recommended Posts

ola pessoal

tenho um campo no banco de dados dbf,chamado descricao onde tem os nomes das pessoas

quando faco os indices assim como exemplo abaixo

index on rtrim(descricao ) to nome

ou alltrim

da o erro tamanho do dato muito longo

ordcreate(0)

\source\rdd\rddord.prg

deste ja obrigado

carlos

fhw 14.04 xharbour 1.2.1 dbf cdx .bat

Link to comment
Share on other sites

Carlos,

A não ser que esteja errado, você não pode indexar CDX ou NTX com campos de comprimento variável.

Fiz um teste com: INDEX ON TRIM(descricao) TO NOME

Deu o erro: Error description: Error DBFCDX/1026 Data width error

Sugiro utilizar: index on subs(descricao, 1, 20) to nome

O comprimento do campo do INDEX é 20 pode ser variado à vontade.

T+

Euclides

Link to comment
Share on other sites

Teste e comente:



#Include "FiveWin.ch"

REQUEST DBFCDX

Function Main()

Field First, Last, State // Campos a Indexar no .CDX

Local oBrw , otecla

USE CUSTOMER SHARED NEW

Index On TRIM( First ) + Space( 1 ) + Last Tag Nome TO CUSTOMER ;
FOR !DELETED() EVAL( CursorWait(), SysRefresh() ) EVERY 10

Index On State Tag Estado TO CUSTOMER ;
FOR !DELETED() EVAL( CursorWait(), SysRefresh() ) EVERY 10

xBrowse()

Return Nil


Link to comment
Share on other sites

Resolvido un est...



#Include "FiveWin.ch"

ANNOUNCE RDDSYS
REQUEST DBFCDX, DBFFPT

REQUEST OrdKeyNo, OrdKeyCount, OrdCreate, OrdKeyGoto

Function Main()

Field First, Last, State // Campos a Indexar no .CDX

RDDSETDEFAULT( "DBFCDX" ) // CARREGA RDD DEFINIDO NO CASO, *.CDX

USE CUSTOMER SHARED NEW

/* // Funciona normal
Index On TRIM( First ) + Space( 1 ) + Last Tag Nome TO CUSTOMER ;
FOR !DELETED() EVAL( CursorWait(), SysRefresh() ) EVERY 10
*/

/*
// Assim quebra:
// Error description: Error DBFCDX/1026 Data width error
Index On TRIM( First ) Tag Nome TO CUSTOMER ;
FOR !DELETED() EVAL( CursorWait(), SysRefresh() ) EVERY 10
*/

// Funciona normal
Index On TRIM( First ) + Space( 1 ) Tag Nome TO CUSTOMER ;
FOR !DELETED() EVAL( CursorWait(), SysRefresh() ) EVERY 10

Index On State Tag Estado TO CUSTOMER ;
FOR !DELETED() EVAL( CursorWait(), SysRefresh() ) EVERY 10

xBrowse()

Return Nil


Link to comment
Share on other sites

na versao do clipper 5.3 vc podia index os descricao assim

index on len(rtrim(descricao)) to aa

quando eu for procurar uma palavra começando com (a) ele colocaria o ponteiro em cima da palavra alberto,ou

se eu quiser colocar tudo comecado com a letra a ele colocaria o ponteiro em cima da letra a

o index nao aceita alltrim,rtrim ltrim

porque ?

fwh 1404 xharbour dbf xdev cdx

carlos

syspel

Link to comment
Share on other sites

Pois eu agarantcho, que assim funcionará perfeito, eu acho que ele nem testou.

   // Funciona normal
   Index On TRIM( Nome ) + Space( 1 )        Tag Nome TO CUSTOMER        ;
            FOR !DELETED() EVAL( CursorWait(), SysRefresh() ) EVERY 10

Só deveria funcionar se o banco estiver com todos os registros com o mesmo tamanho

Link to comment
Share on other sites

noo funcionou o ultimo exemplo

denttro do banco de dados

estao assim

antonio carlo

antonio cae

antonio caefaz

antonio pereira

antonio brito

antonio sergueira

a ideia e a seguinte ni clipper 53 funciona

quando eu procuro pelo nome antonio c ele posicione o ponteiro em cima do anotnio carlos

se eu procura-se pelo antonio carlos o poniteiro ficaria em cima

como eu tenho varios antonio se procura-se pelo antonio e ficaria em cima do antonio o ponteiiro

fui mais claro

carlos

Link to comment
Share on other sites

noo funcionou o ultimo exemplo

denttro do banco de dados

estao assim

antonio carlo

antonio cae

antonio caefaz

antonio pereira

antonio brito

antonio sergueira

a ideia e a seguinte ni clipper 53 funciona

quando eu procuro pelo nome antonio c ele posicione o ponteiro em cima do anotnio carlos

se eu procura-se pelo antonio carlos o poniteiro ficaria em cima

como eu tenho varios antonio se procura-se pelo antonio e ficaria em cima do antonio o ponteiiro

fui mais claro

carlos

A ordem alfabética correta é:

antonio brito
antonio cae
antonio caefaz
antonio carlo
antonio pereira
antonio sergueira

Então caso procure por "antonio" iria focar primeiro no "antonio brito"

Se procurar por "antonio c" vai focar em "antonio cae"

Se procurar por "antonio p" vai focar em "antonio sergueira"

Certifique-se que está pesquisando com AllTrim() pois caso contrário vai dar diferença.

Exemplo:

index on NOME tag NOMEASC to ("C:\TABELA")

/*---------------------------*/

Select TABELA

DbSetOrder(1)

cGet := "antonio"

If DbSeek( AllTrim( cGet ) )

? NOME //-- "antonio brito"

Else

? "Falhou ao pesquisar (" + AllTrim( cGet ) + ")"

End

cGet := "antonio c"

If DbSeek( AllTrim( cGet ) )

? NOME //-- "antonio cae"

Else

? "Falhou ao pesquisar (" + AllTrim( cGet ) + ")"

End

Obs.: A indexação diferencia maiúsculo de minusculo, então pode causar diferença, nesse caso utilize Upper no indice e na pesquisa para sanar a diferença

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...