sexta-feira, setembro 09, 2005

Observação sobre o método FIND da DataWindow

Recentemente passei por uma situação que pode afetar outras pessoas, por isso resolvi publicar essa informação.

O método FIND da DataWindow serve para localizarmos uma linha especifica a partir dos valores informados. A sintaxe do comando é

long dwcontrol.Find ( string expression, long start, long end )

Gostaria de chamar a atenção para a posição inicial da pesquisa. Se a posição inicial for maior que a posição final, o PowerBuilder ignora a posição inicial e faz a pesquisa a partir do inicio da datawindow (row = 1). Esta situação pode causar um loop infinito, se o você estiver procurando todas as ocorrências de um valor e existir uma ocorrência no último registro da datawindow.

Por exemplo:

Tenho a seguinte situação que procura a ocorrência de um string em todas as linhas da datawindow:

Do While VLLROW > 0
VLLROW = DW_1.FIND(VLSFIND,VLLROW + 1,DW_1.ROWCOUNT()
LOOP


Se a última linha da datawindow tiver o valor procurado, na próxima volta do LOOP, VLLROW +1 será maior que ROWCOUNT(). Nesta situação, o PowerBuilder irá ignorar VLLROW +1 e começar a pesquisa a partir da Linha 1, entrando em um LOOP infinito.

Para evitarmos essa situação, devemos alterar o código acima para que fique da seguinte forma:
Do While VLLROW > 0
VLLROW = DW_1.FIND(VLSFIND,VLLROW + 1,DW_1.ROWCOUNT()
IF VLLROW = DW_1.ROWCOUNT() THEN EXIT
LOOP



Estas características estão documentadas no HELP do PowerBuilder. Abaixo se encontra um trecho do Help com a informação sobre o procedimento acima

…When the start value becomes greater than end, the search reverses direction and Find would always succeed, resulting in an endless loop….

Nenhum comentário: