Club Delphi  
    Paypal   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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-05-2008
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 23
Delfino Va por buen camino
Cita:
Si. El metodo locate implica un post.
Quien ha dicho esto?
Cita:
En lugar de Locate puedes usar LookUp para ver si el código ya existe sin cambiar el cursor del registro.
O mejor dejar q el manejador de BD lo compruebe (lo haria mucho mas rapido) y tratar el error en el evento OnPostError del Dataset..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #2  
Antiguo 09-05-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Cuando llamas a edit, la TTable.State esta en dsEdit. Cuando llamas a locate, la TTable.State pasa a dsBrowse. Si tienes activado UpdateWhereAll en la tabla, que es por defecto, se hace un post automatico. Compruebalo con algun programilla o el debbuger...

Saludos

Última edición por coso fecha: 09-05-2008 a las 12:53:43.
Responder Con Cita
  #3  
Antiguo 16-05-2008
JMGR JMGR is offline
Miembro
 
Registrado: jun 2003
Ubicación: Santa Cruz de Tenerife
Posts: 46
Poder: 0
JMGR Va por buen camino
Bueno primero que nada pido perdon por la tardanza en dar noticias pero es que tuve que irme de viaje y no pude conectarme hasta ahora...gracias por la multitud de respuestas.

En principio de las soluciones propuestas la que mejor entiendo es la de BlueSteel de hacerlo con un Query pero no se si es "matar mosquitos a cañonazos"...

El metodo LookUp ya lo he probado pero no me vale, por lo menos poniendolo en el OnExit, ya que sigue saltando el error...a lo mejor poniendolo en otro sitio pero no tengo claro donde...

En cuanto a controlar el evento OnPostError estoy en ello pero me esta costando bastante entender como debo usarlo...

Para empezar he probado a quitar el codigo del evento OnExit del DBEdit y no me salta ningun error aunque haya introducido un valor ya existente de lo cual deduzco que al salir del DBEdit no se produce automaticamente un POST...¿o si..?

Este codigo me produce un bucle infinito, se el por qué, pero no me aclaro de como hacerlo:

Código Delphi [-]
procedure TDataModule3.TablaClientesPostError(DataSet: TDataSet;
  E: EDatabaseError; var Action: TDataAction);
begin
if (E is EDatabaseError) then
 if MessageDlg('Parece que ese Codigo ya existe, ¿ Desea modificar el registro '+#13+#10+'con ese Codigo?', mtWarning, [mbYes,mbNo], 0) = mrYes then
  begin
     Action:=daAbort;
     TablaClientes.Locate('Codigo',Clientes.dbedit1.text,[]); //<--Esto debe ser lo que provoca el bucle
     TablaClientes.edit;
     Clientes.Dbedit1.SetFocus;
  end
 else
  begin
    ACtion:=daAbort;
    Tablaclientes.insert;
    Clientes.Dbedit1.SetFocus;
  end;
end;

¿Donde estoy tropezando?

PD:¿ Como puedo cambiar la opcion UpdateWhereAll?

Edito:
A la espera de respuestas por ahora lo he solucionado comprobando si existe el valor del campo con otro componente ADOTable apuntando a la misma tabla...

Última edición por JMGR fecha: 16-05-2008 a las 22:21:43.
Responder Con Cita
  #4  
Antiguo 16-05-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
no no al salir del DBEdit no se produce un post mil excusas. Eso si, el locate si que hace updates a la base de datos (no me preguntes cuando, creo q con el UpdateWhereAll activado pero no estoy seguro. Personalmente, estoy escarmentado de mover el cursor de una tabla si esta en modo edit). Si tu mueves el cursor de la tabla (locate, gotonearest, etc...) el valor de DBEdit se actualiza solo. Prueba de hacer, en el momento en que hagas post, olvidandote de los eventos, algo asi:

Código Delphi [-]

try
    TablaClientes.Post;
except
// Codigo si hay error.
raise exception.Create('error actualizando tabla. Posibles indices duplicados'); // se sale de la funcion
end;

// resto de codigo si no hay error en post.

Venga, a ver si te sirve.

PD: La propiedad UpdateMode de la tabla o query puede tener la opcion UpdateWhereAll, UpdateWhereChanged y UpdateKeyOnly
PDD : Si el codigo cliente es un indice, no seria mejor q lo adjudicase de manera automatica? En el caso q no, en el evento OnExit del dbedit del codigo cliente (poco elegante pero efectivo)

Código Delphi [-]

try
    Tabla.Post;
    Tabla.Edit;
except
    ShowMessage('Este codigo ya existe');
    DBEdit_codigo_cliente.SelectAll;
    DBEdit_codigo_cliente.SetFocus;
end;

Última edición por coso fecha: 16-05-2008 a las 22:37:04.
Responder Con Cita
  #5  
Antiguo 16-05-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Tus intuiciones son ciertas JMGR

Cuando se produce el OnPostError, debes tener en cuenta que tienes un registro en Edición (dsEdit o dsInsert) que está modificado pero aún no se ha guardado ese cambio, es más, no se puede guardar porque ha producido un error.

Pero que no se te escape otro detalle, la Tabla se encuentra apuntando a ese mismo registro que da error.

Tienes las alternativas del parámetro Action (no recuerdo cuales son ), pero tal y como veo tu código, no veo alternativas para tu usuario, es decir, tu usuario no podrá continuar hasta que cambie el código de ese cliente y al guardar no dé errores:

Código Delphi [-]
procedure TDataModule3.TablaClientesPostError(DataSet: TDataSet;
  E: EDatabaseError; var Action: TDataAction);
begin
//if (E is EDatabaseError) then  // siempre lo será, porque es de ese tipo el parámetro.
 MessageDlg('Parece que ese Codigo ya existe.'  +#13+#10+'Introduzca otro por favor', mtWarning, [mbYes], 0) ;
     Action:=daAbort;
end;

Con eso, informas al usuario y dejas el registro en edición, esperando a que cambie el código.

A otra cosa modosa: ¿estás seguro que el OnPostError se produce por el fallo del código de forma exclusiva? Obviamente no, ocurrirá cuando:

- Si un campo es Requerido (not null) pero tiene el valor null
- Un índice único sobre algún campo está a punto de violarse (
- Por pérdida repentina de conexión a la base de datos (... no sé si está en red o no).
- etc.

Para saber el error que ha ocurrido, tendrás que indagar en las "ADOExceptions" para obtener el código de error... y aquí será mejor que un entendido en ADO hable mejor que yo. Básicamente sería algo así como:
Código Delphi [-]
dentro del OnPostError
 if E is EADODBexception  then // me lo he inventado
  if E.ErrorCode = const_KeyViolation then
    ShowMessage('Codigo Repetido de cliente')
  else if E.ErrorCode = const_Indice_Unico_A_punto_de_Violar then
     ShowMessage('Por favor cambia el campo NombreCliente');
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 16-05-2008 a las 22:36:59.
Responder Con Cita
  #6  
Antiguo 18-05-2008
JMGR JMGR is offline
Miembro
 
Registrado: jun 2003
Ubicación: Santa Cruz de Tenerife
Posts: 46
Poder: 0
JMGR Va por buen camino
Bueno de momento lo he solucionado con la poco elegante pero efectivisima forma propuesta por coso ( no puedo generarlos de manera automatica porque esos codigos ya estan creados anteriormente):
Cita:
Tabla.Post;
Tabla.Edit;
en el evento OnExit del DBEdit, y controlando el error en el OnPostError

Lepe:
Cita:
Con eso, informas al usuario y dejas el registro en edición, esperando a que cambie el código.
Mi idea es que si se introduce un codigo ya existente exista la opcion de modificarlo o de introducir otro, y me interesa que se compruebe nada mas meter el codigo...
La mejor forma, como indicas, seria identificar el error segun su codigo y comprobar que es debido a un valor duplicado pero he estado buscando y no he encontrado ninguna lista de los errores asi que por ahora me conformo con que funcione...

Cualquier sugerencia mas sera bienvenida...
Gracias por el interes y sobre todo por las respuestas.
Un saludo.
JMGR
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Cancelar accion de un evento OnExit FGarcia Varios 5 11-05-2007 13:38:18
Evento 'OnExit' del Form Wellnic OOP 3 10-04-2007 19:08:51
Error en evento OnExit en TDBEdit halcon_rojo Varios 1 27-04-2006 23:17:19
Problemas con evento OnExit santi33a Varios 4 15-04-2006 13:30:50
Evento OnExit de un Edit Caro OOP 1 03-02-2006 17:57:01


La franja horaria es GMT +2. Ahora son las 19:58:36.


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