Página 1 de 2

Parametro softseek da dbseek()

Enviado: 11 Ago 2007 12:03
por Ademir
Boa tarde a todos. Alguem saberia me dizer se o parametro softseek da Dbseek() não funciona com DBFNTX ?

Testei a função e só funciona sem o parametro.

Enviado: 11 Ago 2007 12:27
por Maligno
Funciona. Mas note que, não sendo encontrado o registro, mesmo com SOFTSEEK sendo TRUE, o retorno de dbSeek() continua sendo FALSE. A diferença é que, indicando o SOFTSEEK como TRUE, não sendo encontrando o registro procurado, o ponteiro não vai para o final do arquivo. Ele é posicionado no registro cuja chave seja imediatamente posterior à chave do registro procurado.

Enviado: 11 Ago 2007 12:37
por Ademir
quer dizer que se ele nao encontrar o registro identico ao pesquisado ele retornara false mesmo o parametro softseek estando true ?

Enviado: 11 Ago 2007 12:42
por Ademir
Até então uso o comando seek com o parametro softseek. Aí verifico se eof() então "registro nao cadastrado".

Na verdade estou querendo mudar a forma de programar e passar a usar o menor numero de comandos possivel passando a utilizar funcoes.

Enviado: 11 Ago 2007 12:43
por Maligno
Sim, o retorno de dbSeek() só poderá ser TRUE se ele realmente encontrar a chave informada. Se não fosse desta forma, dbSeek() sempre retornaria TRUE, em qualquer caso. Seria um erro fazer assim.
Você só pode definir a estratégia de posicionamento do cursor nesse caso de falha. Ou vai para o final do arquivo (SOFTSEEK OFF) ou vai para a posição posterior de onde estaria a chave pesquisada (SOFTSEEK ON).

Enviado: 11 Ago 2007 12:53
por Ademir
O segundo parametro da Dbseek() que é o Last só funciona com DBFCDX ?

Enviado: 11 Ago 2007 12:57
por Maligno
Repare no NG que o segundo parâmetro de dbSeek() é o valor do SoftSeek. Esse parâmetro Last não existe.

Enviado: 11 Ago 2007 13:06
por Ademir
Na verdade é o terceiro parametro. Utilizo clipper 5.3b. Este parametro verifica se o Dbseek() irá posicionar o ponteiro na primeira ocorrencia ou na ultima.

Enviado: 11 Ago 2007 13:13
por Maligno
Ah, então está explicado. Eu só uso a versão 5.2. Até tenho, mas não carrego o NG com o help do 5.3.
De qualquer forma, a função, claro, mantém compatibilidade. O segundo parâmetro, no 5.3, é igual na versão 5.2. Nem sabia desse terceiro parâmetro.
Então, com relação à sua pergunta anterior, se funciona com CDX, minha resposta é: provavelmente sim. Não dou certeza porque nunca usei o 5.3. Mas a lógica me diz que deve funcionar sim.

Enviado: 11 Ago 2007 13:57
por Ademir
Valeu !

Um abraço a todos.

Enviado: 11 Ago 2007 17:22
por Eolo
No 52, pra suprir a "falta" do terceiro parâmetro, é só usar descend() na indexação e procura.

Enviado: 11 Ago 2007 17:50
por Maligno
Adicione-se a isso, o conjunto de recursos de busca que a SIX oferece. Para encontrar a última ocorrência de uma chave, inclusive, ela tem a função sx_SeekLast(), que não precisa da função Descend().

Enviado: 13 Ago 2007 10:48
por gvc
A partir da versão 5.3, o clipper acrescentou o terceiro parâmetro ao dbseek.
Isso funciona no DBFNTX tambem.
A pesquisa normal é posicionar o ponteiro na primeira ocorrencia da chave.
Com o terceiro parâmetro ativo, é retornada a ultima ocorrencia da chave.
Exemplo:
Se vc tem um arquivo ordenado por código do produto + data de venda e fizer a pesquisa "normal" por código, o sistema posiciona o ponteiro de arquivo na primeria venda do produto. Se o terceiro parâmetro estiver ativo, a mesma pesquisa posiciona na última venda do produto.

Lembrando aos amigos que existe a função descend e o parâmetro de indexação descending. Este último inverte totalmente o arquivo de índice.

Enviado: 13 Ago 2007 11:25
por Ademir
Bom dia a todos !

Testei dbseek() com o terceiro parametro usando DBFNTX mas o ponteiro de registros localizou a primeira e nao a ultima ocorrencia.

Exemplo:

dbseek(vcodigo, ,.t.)

Enviado: 13 Ago 2007 11:28
por Ademir
O manual do clipper diz o seguinte sobre o parametro lLast da DBSEEK:

Note: This parameter is only supported for specific RDDs. DBFNTX is NOT one of them.