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 26-08-2004
images images is offline
Miembro
 
Registrado: ago 2004
Posts: 23
Poder: 0
images Va por buen camino
en red al acer insert o edit si ya est pr otro user, q siga intentand asta conseguirl

Hola de nuevo

Este es mi segundo hilo, me registre ayer y puse un hilo relacionado Paradox en red.

Bien pues en ese hilo, marto tuvo la amabilidad de ayudarme y me dijo q antes de hacer un refresh a las tablas comprobara q no estan en modo insert o edit.

Entonces he pensado q en tambien deberia poner eso en todos los insert o edit q haga no ( pues madre mia!!). Osea cada vez q hago un edit o insert a una tabla comprobar q no esta ya en insert o edit por otro usuario.
¿como puedo hacer esto de otra manera? porque es una locura hay tropecientos inserts y edits.
Esque se me ha ocurrido poner otro timer para seguir intentandolo hasta q le deje. ¿q os parece? pero esto es otro problema porque por ejemplo para una tabla y un par de insert y/o edits pues vale pero ponerselo a todooooo

Osea yo tengo un determinado codigo, edit y modificar algunos campos por ejemplo. Si no puede porque esta ya en edit o inser por otro usuario pues q salte el otro timer q digo el cual tendra el mismo codigo a ejecutar q lo que quiero hacer.

Madre mia, esto es muy lioso. Pero esque no se q otra manera. Por que he pensado hacerlo en los eventos BeforeEdit y BeforeInsert de cada tabla. osea con un timer. Pero ¿q codigo le pongo al timer? ¿como puedo repetir la accion q ha llamado a edit o insert?

A ver si me explico: El asunto es q si ya esta en edit o insert q siga hasta q le deje.
A lo peor esto es una locura, no se. Pero como dije en el otro hilo, acabo de empezar en esto y no tengo ni zorra. Eso si, estoy explorando bien el club antes de postear nada, tambien me acabo de comprar el libro "Delphi 6 y Kylix" y me he bajado la cara oculta de delphi 4 (gracias marto). Pero esto lo necesito para el sabado

Ojala podais ayudarme.

Saludos
Responder Con Cita
  #2  
Antiguo 26-08-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Mírate el evento OnEditError, hablo de memoria y desde Francia así que compruebalo por si acaso, pero si se produce este error es que el registro está siendo edtiado por otro usuario, entonces creas un bucle con x intentos y cierta espera entre uno y otro y cuando sea liberado el registro lo editas....


Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 26-08-2004
images images is offline
Miembro
 
Registrado: ago 2004
Posts: 23
Poder: 0
images Va por buen camino
Gracias por tu respuesta

Pero si en el evento OnEditError hago un bucle, q esa era la idea, ¿un bucle de que?

Me refiero a que yo llamo a Tabla.Edit desde muchas partes de mi programa para hacer distintas cosas ¿como hago referencia al codigo en concreto para q haga el bucle? creo q sera imposible hacer esto ¿verdad?

Osea desde una ventana donde busco articulos en una tabla articulos(libros) hago un insert o un edit. Desde otra ventana AñadirALasListas hago otro edit o insert pero hago cosas distintas y asi etc.. etcc...

¿existe en Delphi alguna manera de decirle por ejemplo en el evento OnEditError: " Si Hay Error, Intenta de nuevo lo q se iva a hacer x veces o hasta conseguirlo?

Los q teneis mas experiencia en trabajo en Red ¿como lo haceis? No quiero q me deis el trabajo hecho ni nada, solo q sisteme utilizais, por que si tuviera todo el mes para averiguarlo por mi mismo, pero lo necesito este fin de semana


Saludos !!
Responder Con Cita
  #4  
Antiguo 26-08-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 21
marto Va por buen camino
Wop!

Lo que quieres hacer es bastante sencillo. Supongamos que tienes un DataModule con tus DataSet's (si no lo tienes, deberías), bien, te declaras una variable privada de tipo integer, supongamos que se llama ContError. Bien, luego te programas una rutina de este estilo:

Código Delphi [-]
procedure TDataModule1.EditErrore(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
  if ContError > 3 then
  begin
    ShowMessage('El registro no se puede editar, intentelo más tarde');
    Action := daFail;
    ContError := 0;
  end else
  begin
    Inc(ContError);
    Sleep(2000);
    Action := daRetry;
  end;
end;
Bien, la rutina hace lo siguiente. Si el contador de intentos es mayor que 3 (por ejemplo), saca un mensajote avisando, reinicia el contador y cancela. Si es menor, aumenta el contador, "duerme" durante 2 segundos (con la esperanza que el registro deje de estar bloqueado) e intenta de nuevo la acción.

Ahora solamente te falta asignar esta rutina al OnEditError de todos los datasets que quieras controlar.
Evidentemente puedes sofisticar el procedimiento, por ejemplo, con un form que avise al usuario de que se está intentando acceder al registro.
__________________
E pur si muove
Responder Con Cita
  #5  
Antiguo 26-08-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El evento OnEditError pasa un parámetro Action en el que tú le especificas que hacer. Uno de los valores posibles es daRetry que le dice que reintente la operación. Quedaría algo así:

Código Delphi [-]
procedure TForm1.Table1EditError(...);
begin
  if Intentos < MaxIntentos then
  begin
    Inc(intentos);
    Sleep(TiempoEspera);
    Action := daRetry;
  end
  else
  begin
    Intentos := 0;
    raise Exception.CreateFmt('Falló operación luego de %d intentos', [MaxIntentos]);
  end;
end;

El bucle no lo haces tú explícitamente sino que lo provocas al poner Action := daRetry. Para que no sea un bucle infinito usas una variable Intentos que controle el número de intentos con un máximo (MaxIntentos). En cada intentos usas Sleep para esperar TiempoEspera milisegundos antes de reintentar.

Un comentario: yo en lo personal dejaría que fuera el usuario el que realice el bucle, esto es:

El usuario intenta insertar o editar un registro; si éste está bloqueado le mandas un mensaje y abortas la operación y dejas que sea él quien lo intente nuevamente.

No alcanzo a ver la necesidad de que sea el sistema en automático el que haga los reintentos.

// Saludos
Responder Con Cita
  #6  
Antiguo 26-08-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Otra vez te me adelantaste marto!

Responder Con Cita
  #7  
Antiguo 26-08-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 21
marto Va por buen camino
Cita:
Empezado por roman
¡Otra vez te me adelantaste marto!
Tienes que hacer un curso de mecanografía

Por cierto, yo tampoco soy partidario de hacerlo así, creo que es mejor que sea el usuario quien reintente la operación.
__________________
E pur si muove
Responder Con Cita
  #8  
Antiguo 27-08-2004
images images is offline
Miembro
 
Registrado: ago 2004
Posts: 23
Poder: 0
images Va por buen camino
Cita:
Empezado por marto
Supongamos que tienes un DataModule con tus DataSet's (si no lo tienes, deberías), ...
Si, tengo un DataModule con mis DataSet, Sessions ...

Supongo q estas cosas solo se aprenden con la experiencia, experimentando y la ayuda del propio Delphi. Lo digo porque estas cosas nunca vienen en los cursos de Programacion de IBM, ni en las guias rapidas. No se si vendra en el "Delphi 6 y Kylix" q acabo de adquirir. Supongo q debere meterle mano tambien a la ayua de Delphi y a la pagina de Borland.

En este mundo que esta tan "fragmentado" y "corrupto" resulta gratificante encontrar a personas como vosotros, que prestais vuestra ayuda, vuestro tiempo a los demas incondicionalmente.

Gracias
Responder Con Cita
  #9  
Antiguo 27-08-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 21
marto Va por buen camino
Cita:
Empezado por images
Supongo q estas cosas solo se aprenden con la experiencia, experimentando y la ayuda del propio Delphi.
Bueno, la experiencia es un grado
Cita:
Empezado por images
Lo digo porque estas cosas nunca vienen en los cursos de Programacion de IBM, ni en las guias rapidas. No se si vendra en el "Delphi 6 y Kylix"
Pues yo tampoco lo sé, pero si te recomendé el libro de Marteens es porque se diferencia de otros en que, más que una extensa referencia, es una guia en la que se tocan muchos de estos "trucos" que los programadores necesitamos a diario.
Tambien te recomiendo que le eches un vistazo a trucomanía, allí encontrarás un montón de "recetas" para tareas muy frecuentes.

Cita:
Empezado por images
resulta gratificante encontrar a personas como vosotros...

Bueno, piensa que aquí todos aprendemos un montón. Todos planteamos dudas, además tambien se aprende intentando resolver problemas que otros usuarios plantean.
De todas maneras, siempre es un gustazo ver que el esfuerzo le ha servido a alguien
__________________
E pur si muove
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


La franja horaria es GMT +2. Ahora son las 06:38:47.


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