In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Erro em TDbfDataSet:Seek()

Foro público de Xailer en español
Responder
Avatar de Usuario
Marcelo Coelho Silva
Mensajes: 269
Registrado: Sab May 31, 2008 4:49 pm
Ubicación: Brasil
Contactar:

Erro em TDbfDataSet:Seek()

Mensaje 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.
Att.

Marcelo Coelho Silva
Brasil.
Roberto
Mensajes: 177
Registrado: Mar Oct 16, 2007 11:53 pm

Erro em TDbfDataSet:Seek()

Mensaje por Roberto »

Voce ja tentou ordernar usando o formato aaaammdd (DtoS(dia), por exemplo)?
Avatar de Usuario
Marcelo Coelho Silva
Mensajes: 269
Registrado: Sab May 31, 2008 4:49 pm
Ubicación: Brasil
Contactar:

Erro em TDbfDataSet:Seek()

Mensaje 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)?
Att.

Marcelo Coelho Silva
Brasil.
lilosoft
Mensajes: 41
Registrado: Lun May 11, 2015 2:54 am

Re: Erro em TDbfDataSet:Seek()

Mensaje 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.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Erro em TDbfDataSet:Seek()

Mensaje 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().
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
jvtecheto
Mensajes: 127
Registrado: Jue Dic 19, 2013 1:18 pm

Re: Erro em TDbfDataSet:Seek()

Mensaje por jvtecheto »

hola Jose :

Infomacion oficial sobre DBSeek y SOFTSEEK en Harbour

http://harbour.edu.pl/clipper/en/ng2ff8b.html
http://harbour.edu.pl/clipper/en/ngdd095.html

Saludos :

Jose Vte.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Erro em TDbfDataSet:Seek()

Mensaje 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.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
lilosoft
Mensajes: 41
Registrado: Lun May 11, 2015 2:54 am

Re: Erro em TDbfDataSet:Seek()

Mensaje 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,
lilosoft
Mensajes: 41
Registrado: Lun May 11, 2015 2:54 am

Re: Erro em TDbfDataSet:Seek()

Mensaje 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,
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Erro em TDbfDataSet:Seek()

Mensaje 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.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
Carlos Ortiz
Mensajes: 872
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Re: Erro em TDbfDataSet:Seek()

Mensaje 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
Responder