![]() |
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 :) |
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. |
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 !! |
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: 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. |
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í:
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 |
¡Otra vez te me adelantaste marto! :mad:
:D :D |
Cita:
Por cierto, yo tampoco soy partidario de hacerlo así, creo que es mejor que sea el usuario quien reintente la operación. |
Cita:
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 :) |
Cita:
Cita:
Tambien te recomiendo que le eches un vistazo a trucomanía, allí encontrarás un montón de "recetas" para tareas muy frecuentes. Cita:
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 ;) |
La franja horaria es GMT +2. Ahora son las 04:24:40. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi