Por qual motivo NUNCA devemos usar Trim em Seeks

No artigo de hoje vamos falar o motivo de evitarmos usar algum tipo de Trim em posicionamentos como DbSeek e MsSeek.

Uma dúvida corriqueira de alguns alunos, é que eles afirmam que mesmo passando os campos corretamente no Seek, ele não encontra o registro, então o que pode ser?

Vamos tomar como exemplo, esse trecho em AdvPL:

//Declara as variáveis
Local cDescricao := "Batata"
Local cCodigo    := "L0001"

//Abre a tabela e usa o índice 3
DbSelectArea("SB1")
SB1->(DbSetOrder(3)) // B1_FILIAL + B1_DESC + B1_COD

//Se conseguir posicionar conforme o índice
If SB1->(MsSeek(FWxFilial("SB1") + cDescricao + cCodigo))

Vocês perceberam que as variáveis cDescricao e cCodigo não tem nenhum espaço a direita (que seria como se tivéssemos dado um AllTrim ou RTrim). Só que no banco de dados, o campo é salvo com os espaços a direita, tanto que notem o que acontece quando tentamos executar uma query com o seek acima:

Exemplo de pesquisa tudo junto (usando trim)

 

Notem que não veio nenhum registro. Então o que pode ter acontecido? Simplesmente pessoal, o sistema espera no Seek, que você passe a expressão com o tamanho real. No caso do B1_DESC dessa base, ele tem 30 caracteres e o B1_COD ele tem 15, agora note o resultado da query com os espaços:

Exemplo de pesquisa com espaços (sem usar trim)

 

Perceberam que trouxe certinho as informações, então é o mesmo caso do nosso Seek. Então devemos evitar usar a pesquisa sem os espaços, e para isso, existe a função AvKey onde é possível passar o conteúdo e o nome do campo, e ela já adiciona os espaços a direita, ficando da seguinte forma em AdvPL:

//Declara as variáveis
Local cDescricao := "Batata"
Local cCodigo    := "L0001"

//Abre a tabela e usa o índice 3
DbSelectArea("SB1")
SB1->(DbSetOrder(3)) // B1_FILIAL + B1_DESC + B1_COD

//Deixa as variáveis com espaço a direita para usar no Seek
cDescricao := AvKey(cDescricao , "B1_DESC")
cCodigo    := AvKey(cCodigo    , "B1_COD")

//Se conseguir posicionar conforme o índice
If SB1->(MsSeek(FWxFilial("SB1") + cDescricao + cCodigo))

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação