FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
actualizacion al instante en procedure
Hola que tal de nuevo.
tengo un problema que tratare de explicar paso a paso de lo que estoy haciendo y lo que deseo obtener, para ver si alquien tiene alguna solucion se lo agradeceria mucho. Bien Tengo una aplicacion con delphi 5 e interbase 6.0 corriendo en red windows y esta misma aplicacion se publicara con citrix. se estan usando los componentes ibx. Se tiene actualmente el siguiente problema - dado que la mayoria de las tablas estan relacionadas entre si haciendo relaciones maestro-detalle y a veces sub_detalle, lo cual puede provocar que no se reflejen algunos datos completos, ya que puede no existir un registro padre que se este agregando en otro equipo de la red. Este problema esta solucionado a medias por medio de botones para que el usuario refresque los datos y se cierren y abran los dataset, pero ya saben que los usuarios no son nada ordenados y no lo hacen y esto a provocado varios errores de informacion. - Se desea que al hacer una modificacion(agregar, modificar, o deletear) registros de alguna tabla se reflejen en los usuarios que estan conectados y los cuales podran estar en modulos distintos ya sea editando o consultando por medio de un grid. (este es el objetivo principal) --Se hicieron las siguientes modificaciones 1- se agrego un componente ibevents para registrar los eventos de Insert, Update o Delete que ocurrieran en algunas tablas importantes, y al notificarlos a la aplicacion esta se encarga de cerrar y abrir los dataset afectados, y asi poder mantener actualizados los usuarios que esten en ese momento en linea, ya que automaticamente se les refrescan los datos. 2 - en un modulo se tiene un select con varias tablas y logico es solo de lectura, pero al ocurrir un evento en alguna de ellas se tiene que actualizar tambien para reflejar los cambios hechos. - los cambios hechos se hacen por medio de un store procedure, el cual se llama desde la aplicacion, y funciona correctamente, el problema es que no hace el commit de los cambios inmediatamente ya que la aplicacion no refresca los datos hasta que recibe la notificacion del evento ocurrido, esto provoca que la aplicacion se vea un poco lenta en esta parte. ya se vio que los store procedure y los triggers no adminten commit's dentro de ellos. ya se hizo el commit inmediatamente despues de llamar el procedimiento por medio de la aplicacion y el problema siguio, se hizo un siguimento de donde se estaba qudando atorado, y se localizo que es en el evento ONEVENTALERT del componente IBEVENTS, el cual se dispara tiempo despues de haberse ejecutado el store procedure. Alguien sabe como hacer que los cambios hechos en un store procedure se hagan al instante? o que podra estar pasando que se tarda en hacer el commit de dichos cambios y pasarlos a la aplicacion? les agradeceria si alguien tiene algo que puede corregir esta situacion. Muchas Gracias desde Mexico |
#2
|
||||
|
||||
Yo he leido que no se deberían registrar mas de 20 eventos en una aplicación...
En una aplicación de pruebas, registra solo el evento que te interesa (update de la tabla en cuestión) y fíjate si la velocidad de respuesta aumenta. También he de decir algo sobre el commit en servidores Windows: He visto algunas veces, con mi aplicación corriendo en varios ordenadores, que un ordenador hace un update de varias tablas y su correspondiente commit, pero en los demás ordenadores no se refleja el cambio hasta después de unos 10 segundos. A pesar de que el ordenador que hizo los cambios los ve inmediatamente. Esto no me ha sucedido nunca con servidores Linux. Nunca supe a qué era debido esto. Por lo tanto: - Mira si la aplicación que ejecuto el stored procedure ve los cambios inmediatamente. - Si es un stored procedure pesado, mira si después del commit, el servidor sigue cargado (CPU al 99%) aunque la aplicación ya tenga el control. Puede que esté enviando el evento a los ordenadores. MIRA ESTO PRIMERO: Otra cosa que se me ocurre ahora: - Supón que pones el evento OnUpdate en una tabla detalle. - Supon que tienes una cabecera con 20 detalles - Haces un update de la cabecera y esta a su vez, a traves de triggers hace update de detalle. - Haces commit. Mientras se están haciendo los updates de los 20 detalles no recibirás ningún evento. Recién cuando hagas el commit, recibirás 20 eventos. Si tu Stored Procedure genera muchos eventos, puede que esté tardando porque tiene que enviarle muchos eventos a muchos ordenadores. |
#3
|
|||
|
|||
Gracias duilioisola.
- Te comento que los eventos registrados en la aplicacion son 9 - el Stored procedure es muy simple y corto ya que solo actualiza una tabla que se podria decir que es la principal en este modulo de la aplicacion, ya que se relaciona con varias tablas, y el stored hace varios select's a las tablas que van a actualizar a la principal, y solo genera un evento. - al estar haciendo esta prueba se hace solo con un equipo usando la aplicacion y la base de datos. - he notado que al hacer el primer refresh de los datos lo hace de inmediato, pero despues del segundo y el tercero se tarda de 5 a 10 segundos. CODIGO PARA LLAMAR EL PROCEDIMIENTO With DmDatos.SPCotizar do begin params[0].Value := DmDatos.PPtosCVE_PPTO.Value; params[1].Value := DmDatos.Oper_PptoCVE_OPER.Value; params[2].Value := RGTipoDano.ItemIndex; params[3].Value := DmDatos.PPtosCVE_TAB.Value; params[4].Value := 1; params[5].Value := 1; ExecProc; end; CODIGO EN EL EVENTO ONEVENTALERT(solo te envio el de la tabla en mencion) if EventName = 'PPTOS_DET' then begin Datos := DmDatos.Pptos_DetDs.DataSet; RecargaSet(Datos); Datos := DmDatos.Oper_PptoDs.DataSet; end; RecargaSet(Datos); CUERPO DEL STORED PROCEDURE (aclarando que es solo de prueba, ya que faltan algunos calculos que iran en el insert) BEGIN /* Procedure body */ Importe_Hora = Null; hrs_cotizar = 0; Select Importe_Hora From Tabulador_Det Where Cve_Tab = :Tabula and Segmento = :Segmento And Clave_Clase = :Cve_Clase Into :Importe_Hora; if (Importe_Hora is null) then begin Exception sin_Tabulador; suspend; end Select Cve_Actividad, Descripcion, Requerido, Horas_Dano_Chico, Horas_Dano_Medio, Horas_Dano_Grande From Operaciones Where Cve_Oper = per Into :Cve_ACtividad, escripcion, :Requerido, Hrs_Chico, Hrs_Medio, Hrs_Grande; if (Tipo_Dano = 0) then Hrs_Cotizar = Hrs_Chico; if (Tipo_Dano = 1) then Hrs_Cotizar = Hrs_Medio; if (Tipo_Dano = 2) then Hrs_Cotizar = Hrs_Grande; Select Descripcion From Actividades Where Cve_Actividad = :Cve_Actividad Into Actividad; /* Agrega al Detalle del Presupuesto */ Insert Into Pptos_Det (Cve_PPto, Secuencia, Cve_Oper, Tipo_Dano, Costo, Descripcion, CVe_Mo_Ref, CostoRef) Values (:PPto, 0, :Oper, :Tipo_Dano, 111, :Actividad || ' ' || escripcion, 1,222); SUSPEND; END las constantes en los valores del insert son calculos que se haran despues de saber que esta pasando. Notan algo raro en esto? Gracias |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
llamar a procedure desde otra procedure | anubis | Varios | 23 | 04-03-2010 18:44:37 |
Procedure | ozegarra | Firebird e Interbase | 5 | 07-12-2007 23:04:33 |
Procedure | MarioATamborini | Firebird e Interbase | 5 | 11-08-2005 18:46:07 |
¿procedure? | Giniromero | Firebird e Interbase | 18 | 26-02-2004 15:52:08 |
Actualizacion en ADO | Luis Castillo | Conexión con bases de datos | 2 | 08-11-2003 17:42:03 |
|