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:
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:
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.