Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-10-2006
Besto Besto is offline
Miembro
 
Registrado: abr 2006
Posts: 118
Poder: 19
Besto Va por buen camino
Problemas con Bookmark

Hola,

tengo un problema con los bookmarks, que paso a explicar:

Uso delphi 6 con MySql

El código es algo así:

Código Delphi [-]
      if qrPan.BookmarkValid(marca) then
         qrPan.FreeBookmark(marca);
      
      marca := qrPan.GetBookMark;
      while not qrPan.eof do
         begin
            {...}
            qrPan.next;
          end;
      qrPan.GoBookmark(marca);

Generalmente funciona bien, pero de repente me da error "Invalid pointer"

¿Alguien sabe que puede pasar??

Gracias.

Última edición por dec fecha: 19-10-2006 a las 10:17:39.
Responder Con Cita
  #2  
Antiguo 19-10-2006
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
¿Y el error dónde te salta? ¿Antes del bucle, durante el bucle o después del bucle?
Responder Con Cita
  #3  
Antiguo 19-10-2006
Besto Besto is offline
Miembro
 
Registrado: abr 2006
Posts: 118
Poder: 19
Besto Va por buen camino
El error salta despues de comprobar que es una marca valida independientemente de lo que haga despues, es decir compruebo que es válida da true y luego en la siguiente sentencia da el error.
Responder Con Cita
  #4  
Antiguo 19-10-2006
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Yo utilizo bookmarks pero no las utilizo como tú, y no me han fallado. Prefiero hacerlo al revés: liberar el elemento justo después de su último uso, en lugar de hacerlo como primera acción y dentro de un if.
Así me aseguro que después de su uso se borra y no tengo memoria ocupada.
Código Delphi [-]
procedure TfConciliacion.refrescar_posicionarPag;
var
  marca: TBookMark;
begin
// Refresca los datos de los pagos y se posiciona en el lugar que ocupaba.
  marca := qPagos.getbookmark;
  recalcular_querys_p(datoPago.Text, fechaIni_p.Date, fechaFin_p.Date);
  qPagos.GotoBookmark(marca);
  qPagos.freebookmark(marca);
end;
Responder Con Cita
  #5  
Antiguo 19-10-2006
Besto Besto is offline
Miembro
 
Registrado: abr 2006
Posts: 118
Poder: 19
Besto Va por buen camino
Gracias,
he hecho lo que comentas que igual es más lógico, pero de vez en cuando y solo de vez en cuando me sigue dando el mismos error de puntero inválido, ya que no es solo cuando libero la marca sino también me lo da cuando hago un GotoBookMark.

He mirado el código una y otra vez y no veo que puede pasar, pero seguiré insistiendo....
Responder Con Cita
  #6  
Antiguo 19-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En principio yo lo veo de otra forma:
Código Delphi [-]
if qrPan.BookmarkValid(marca) then // aqui no sé por qué va, supongo que hay
// codigo antes y por eso lo tienes.
         qrPan.FreeBookmark(marca);
      
      marca := qrPan.GetBookMark;
      while not qrPan.eof do
         begin
            {...}
            qrPan.next;
          end;
if qrPan.BookmarkValid(marca) then
begin
      qrPan.GoBookmark(marca);
      qrPan.FreeBookmark(marca);
end;
      marca := nil;

Es decir, lo normal es obtener la marca, mover el dataset y por último, preguntar si el BookMark es válido:
- si lo es, voy a ese Bookmark y despues lo libero
- si no lo es, es que ha habido algún problema, no sé si es conveniente llamar a FreeBookmark, puesto que en este caso, no es un puntero de marca Válido.

Por otra parte habría que mirar la implementación o ayuda sobre este tema en MySql.

Ten en cuenta que si cierras la consulta y despues la vuelves a abrir, los punteros no serán válidos, quizás sea convienente guardar la clave primaria de ese registro y usar un Locate, en lugar de usar un Bookmark.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 19-10-2006
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Pregunta: ¿Para qué necesitas la marca? ¿Para no perder la posición mientras recorres la consulta?
Porque si es eso puedes ver si te sirve DisableControls/EnableControls.
Responder Con Cita
  #8  
Antiguo 19-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Respuesta(): EnableControls es para que en un bucle no se tenga que refrescar los controles data aware asociados al dataset, por tanto, al deshabilitar ese refresco de datos, el bucle se procesa más rápido y el usuario no vé en la pantalla cómo pasan los registros a modo de ráfaga por los controles.

EnableControls hace lo mismo que BeginUpdate y EndUpdate de un TreeView, ListView, StringList, y otros controles no data aware.

Puede que MySql tambien implemente los métodos BookmarkStr que es un simple String que no se tiene que liberar y es algo más cómodo su uso.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con Bookmark marceloalegre Varios 4 02-10-2006 15:24:36
poner bookmark jsanchez OOP 2 22-06-2006 16:43:54
Bookmark kuan-yiu Conexión con bases de datos 6 13-06-2006 11:11:28
Duda sobre Bookmark. Jose_Pérez Conexión con bases de datos 0 04-03-2005 10:29:41
Utilizacion de Bookmark en Interbase Markoz Firebird e Interbase 4 29-05-2004 22:08:02


La franja horaria es GMT +2. Ahora son las 10:07:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi