Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-06-2008
fcobanda fcobanda is offline
Miembro
 
Registrado: jun 2003
Ubicación: Saltillo, Coah. Mexico
Posts: 19
Poder: 0
fcobanda Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 11-06-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #3  
Antiguo 11-06-2008
fcobanda fcobanda is offline
Miembro
 
Registrado: jun 2003
Ubicación: Saltillo, Coah. Mexico
Posts: 19
Poder: 0
fcobanda Va por buen camino
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
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
llamar a procedure desde otra procedure anubis Varios 23 04-03-2010 19:44:37
Procedure ozegarra Firebird e Interbase 5 08-12-2007 00:04:33
Procedure MarioATamborini Firebird e Interbase 5 11-08-2005 19:46:07
¿procedure? Giniromero Firebird e Interbase 18 26-02-2004 16:52:08
Actualizacion en ADO Luis Castillo Conexión con bases de datos 2 08-11-2003 18:42:03


La franja horaria es GMT +2. Ahora son las 22:01:41.


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