Olá!
Toledo escreveu:O que deve estar atrapalhando é o Trim( CNPJ_CPF ). Faz um teste, retirando o Trim( CNPJ_CPF )
É isto mesmo. Os testes que fiz mostram que o Toledo tem razão. É sabido que em chaves de Ãndice não se deve usar expressões que geram campos chave com tamanho variável.
asimoes escreveu:o trim é necessários porque esse campo CNPJ_CPF recebe os 2 tipos e é para o seek, se não não acha quando a busca for por cpf.
Veja no exemplo abaixo que isto não é verdade.
asimoes escreveu:Não tem como fazer isso se não for usando 2 vetores como eu postei
Veja no exemplo abaixo.
Function Main()
FIELD CNPJ_CPF
FIELD FONT
FIELD VALOR
REQUEST DESCEND
REQUEST DBFCDX
RDDSetDefault( "DBFCDX" )
If ! File( "tbTest.dbf" )
Setup()
Endif
ClS
USE tbTest SHARED NEW
hb_Alert( { "Primeiro Browse, sem indice", "Tecle algo..." } )
Browse()
// com esta linha abaixo, a ordenação fica errada
//INDEX ON Trim( CNPJ_CPF ) + FONTE + Descend( StrZero( VALOR, 10, 2 ) ) TAG IND_002
//-----------------------------------------------------------------------------------
// com esta linha abaixo, a ordenação fica correta
INDEX ON CNPJ_CPF + FONTE + Descend( StrZero( VALOR, 10, 2 ) ) TAG IND_002
DbSetIndex( "tbTest")
hb_Alert( { "Segundo Browse, com indice", "Tecle algo..." } )
Browse()
// Nenhum problema ao buscar um CPF na coluna CNPJ_CPF.
// É só completar o CPF com espaços à direita, ajustando para o tamanho da coluna
If tbTest->( dbSeek( PadR( "23538132089", 14 ) ) )
hb_Alert( { "CPF encontrado: 23538132089", "Tecle algo..." } )
Else
hb_Alert( { "CPF NÃO encontrado: 23538132089", "Tecle algo..." } )
Endif
// Busca por um lançamento qualquer existente. Sucesso...
// Note que no SEEK é preciso invocar a função Descend
If tbTest->( dbSeek( PadR( "43730787000150", 14 ) + ;
"100" + ;
Descend( StrZero( 5000.00, 10, 2 ) ) ) )
hb_Alert( { "Lancamento encontrado:", "PadR( '43730787000150', 14 ) " + ;
"100 + Descend( StrZero( 5000.00, 10, 2 ) ) )", "Tecle algo..." } )
Else
hb_Alert( { "Lancamento NAO encontrado:", "PadR( '43730787000150', 14 ) " + ;
"100 + Descend( StrZero( 5000.00, 10, 2 ) ) )", "Tecle algo..." } )
Endif
tbTest->( DbCloseArea() )
RETURN NIL
//------------------------------------------------------------------------------
STATIC Function Setup()
LOCAL aArray, e, i, aValor
aArray := {}
AAdd( aArray, { "CNPJ_CPF", "C", 14, 0 } )
AAdd( aArray, { "PROCESSO", "C", 13, 0 } )
AAdd( aArray, { "PROCBLOQ", "C", 10, 0 } )
AAdd( aArray, { "OP", "C", 10, 0 } )
AAdd( aArray, { "VALOR", "N", 10, 2 } )
AAdd( aArray, { "FONTE", "C", 3, 0 } )
DBCREATE("tbTest", aArray, "DBFCDX" )
USE tbTest EXCLUSIVE NEW
aValor := {1000000.00, 15000.00, 10000.00, 5000.00, 1010000.00 }
For I:=1 TO 5
tbTest->( DbAppend() )
tbTest->CNPJ_CPF := "79705909000103"
tbTest->PROCESSO := StrZero(i,11) + "BB"
tbTest->OP := StrZero(i,10)
tbTest->VALOR := aValor[i]
tbTest->FONTE := "101"
tbTest->( DbCommit(), DbUnlock() )
Next
aValor := {30000.00, 20000.00, 15000.00, 900000.00, 5000.00}
For I:=1 TO 5
tbTest->( DbAppend() )
tbTest->CNPJ_CPF := "43730787000150"
tbTest->PROCESSO := StrZero(i,11) + "AA"
tbTest->PROCBLOQ := "00000000000000000001"
tbTest->OP := StrZero(i,10)
tbTest->VALOR := aValor[i]
tbTest->FONTE := "100"
tbTest->( DbCommit(), DbUnlock() )
Next
aValor := {570.20, 201.82, 15021.00, 900000.00, 5000.00}
For I:=1 TO 5
tbTest->( DbAppend() )
tbTest->CNPJ_CPF := "23538132089"
tbTest->PROCESSO := StrZero(i,11) + "AA"
tbTest->PROCBLOQ := "00000000000000000001"
tbTest->OP := StrZero(i,10)
tbTest->VALOR := aValor[i]
tbTest->FONTE := "900"
tbTest->( DbCommit(), DbUnlock() )
Next
tbTest->( DbCloseArea() )
aArray := NIL
RETURN NIL
//------------------------------------------------------------------------------