Página 1 de 1
Erro em TDbfDataSet:Seek()
Publicado: Sab Oct 15, 2011 3:52 am
por Marcelo Coelho Silva
Senhores,
Ao utilizar o método Seek() do objeto TDbfDataSet encontramos uma falha.
Se o índice (utilizando CDX) for do tipo DATE e utilizarmos a busca por
SoftSeek (ex: oDbf:Seek( date(), .T. ), esta não funciona, ou seja, se a
Data a ser procurada não existir, ele retorna o ponteiro de registro a
posição original e retorna .F. .
Deveria (SoftSeek) colocar o penteiro de registro no registro mais perto
da busca e retornar .T. .
Aparentemente ele ignora a opção de SoftSeek.
Como posso fazer para contornar este problema ???
Obrigado,
Marcelo Coelho Silva
Brasil.
Erro em TDbfDataSet:Seek()
Publicado: Sab Oct 15, 2011 2:20 pm
por Roberto
Voce ja tentou ordernar usando o formato aaaammdd (DtoS(dia), por exemplo)?
Erro em TDbfDataSet:Seek()
Publicado: Sab Oct 15, 2011 6:19 pm
por Marcelo Coelho Silva
Senhores,
Após mais alguns teste, verifiquei melhor e o SoftSeek esta funcionando,
porem o metodo :Seek() retorna o valor .F. .
Bastou eu tratar esta característica do :Seek() .
Desculpe-me a falha. O erro não existe.
Obrigado,
Marcelo Coelho Silva
Brasil.
Em 15/10/2011 09:20, Roberto escreveu:
> Voce ja tentou ordernar usando o formato aaaammdd
> (DtoS(dia), por exemplo)?
Re: Erro em TDbfDataSet:Seek()
Publicado: Dom Nov 22, 2015 12:01 am
por lilosoft
Señores buenas tardes he tratado de hacer funcionar softseek con dtos pero no funciona. Alguien me puede ayudar
adjunto segmento del programa
Siempre me retorna Falso y no se la razón el indice esta generado de la siguiente forma:
Strzero(Empresa,2)+ Dtos(fecha)
Si yo hago un debug al programa el texto a consultar es el siguiente 0120151101
With object ::oDbfHisTran
:OrdSetFocus( "Histran5" )
If ::oDbfHisTran:Seek(Strzero(appdata:pCodempre,2)+ DToS(::oDBFecIniTra:Value), .t. ) //LINEA CON EL PROBLEMA
Do while :Numdoc == Val(::oEdCodigo:Value) .and. :Empresa == appdata:pCodEmpre .and. !:Eof()
AAdd( aLines, {:Cuotas, :CodOpe, :NumOpe, :Monto, :Comision, :MonIva, :Monto+:Comision+:MonIva, ;
IIF(:Tipdoc = 6, "D","C")} )
:Skip()
Enddo
EndIf
End With
::oBrwHisTranAsi:aArrayData := aLines
Por favor su ayuda, he mandado otras consultas pero nunca me han contestado espero que esta si.
De antemano muchas gracias
Saludos
Marcelo Coelho Silva escribió:Senhores,
Ao utilizar o método Seek() do objeto TDbfDataSet encontramos uma falha.
Se o índice (utilizando CDX) for do tipo DATE e utilizarmos a busca por
SoftSeek (ex: oDbf:Seek( date(), .T. ), esta não funciona, ou seja, se a
Data a ser procurada não existir, ele retorna o ponteiro de registro a
posição original e retorna .F. .
Deveria (SoftSeek) colocar o penteiro de registro no registro mais perto
da busca e retornar .T. .
Aparentemente ele ignora a opção de SoftSeek.
Como posso fazer para contornar este problema ???
Obrigado,
Marcelo Coelho Silva
Brasil.
Re: Erro em TDbfDataSet:Seek()
Publicado: Dom Nov 22, 2015 12:32 pm
por jfgimenez
Si no recuerdo mal (disculpame pero hace años que no utilizo DBFs), DbSeek( ..., .t. ) devuelve .T. sólo si ha encontrado un registro "exacto". En cambio, si el resultado es "inexacto", el valor de retorno es .F.
Por lo tanto, si vas a hacer una búsqueda inexacta, nunca deberías tener en cuenta el valor de retorno. En su lugar, debes comprobar el valor de Eof().
Re: Erro em TDbfDataSet:Seek()
Publicado: Dom Nov 22, 2015 6:46 pm
por jvtecheto
Re: Erro em TDbfDataSet:Seek()
Publicado: Dom Nov 22, 2015 7:42 pm
por jfgimenez
José Vicente,
gracias por los enlaces. Ya había visto la documentación de Clipper al respecto, y a mí no me quedaba del todo claro lo que devuelve DbSeek() cuando no encuenta un registro "exacto" pero sin llegar a irse a Eof(). De todos modos, siguiendo los enlaces que has puesto he llegado a esta otra documentación (
http://harbour.edu.pl/harbour/api.html#dbseek) y ahí sí que queda más claro (las negritas y cursivas las he puesto yo):
This function searches for the first record in a database file whose index key matches <expKey>. If the item is found, the function will return a logical true (.T.), the value of Found() wilI be a logical true (.T.), and the value of Eof() wilI be a logical false (.F.). If no item is found. then the function will return a logical false, the value of Found( ) will be a logical false (.F.), and the value of Eof() will be a logical true (.T.).
This function always "rewinds" the database pointer and starts the search from the top of the file.
If the SOFTSEEK flag is on or if <lSoftSeek> is set to a logical true (.T.) the value of Found() will be a logical false and Eof() will be false if there is an item in the index key with a greater value than the key expression <expKey>; at this point the record pointer will position itself on that record. However, if there is no greater key in the index, Eof() will return a logical true (.T.) value. If <lSoftSeek> is not passed, the function will look to the internal status of SOFTSEEK before performing the operation. The default of <lSoftSeek> is a logical false (.F.)
Por lo tanto, esto confirma lo que he comentado en el otro mensaje... que si el valor de retorno es .F. sólo significa que no se ha encontrado un registro "exacto", pero sí que se puede haber encontrado un registro con un valor de clave mayor que el que se ha buscado.
Re: Erro em TDbfDataSet:Seek()
Publicado: Mar Nov 24, 2015 10:51 pm
por lilosoft
He realizado muchas pruebas pero no funciona.
Ordenado con dtos, aaaammdd, diferentes formas de hacer los indices. pero nada no funciona.
Gracias por las respuestas.
Ojala alguien tenga una solución a este problema.
Saludos,
Re: Erro em TDbfDataSet:Seek()
Publicado: Mar Nov 24, 2015 10:53 pm
por lilosoft
No había visto el último comentario lo pruebo y les comento.
Gracias.
Pd.
Estoy comenzando con la migración a BD.
Saludos,
Re: Erro em TDbfDataSet:Seek()
Publicado: Mié Nov 25, 2015 9:47 am
por jfgimenez
La solución parece muy sencilla: sólo tienes que quitar el "IF" de la línea que has indicado que tenía el problema (y su "ENDIF" correspondiente). Es decir, tienes que llamar a Seek() pero sin preocuparte del valor de retorno. Como la siguiente línea es un "DO WHILE" donde ya compruebas el estado de Eof(), debería funcionar sin problemas.
Re: Erro em TDbfDataSet:Seek()
Publicado: Jue Nov 26, 2015 5:19 am
por Carlos Ortiz
jfgimenez escribió:La solución parece muy sencilla: sólo tienes que quitar el "IF" de la línea que has indicado que tenía el problema (y su "ENDIF" correspondiente). Es decir, tienes que llamar a Seek() pero sin preocuparte del valor de retorno. Como la siguiente línea es un "DO WHILE" donde ya compruebas el estado de Eof(), debería funcionar sin problemas.
Efectivamente como dice Jose ahora recuerdo esos seek con softseek on (viene desde el año del ñaupa, no debes preocuparte por el valor de retorno) a lo mejor te retorna falso pero estas parado en un registro que si te sirve tener en cuenta.
saludos