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-02-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
varias dudas sobre consultas y refresco de datos

Hola,

Estoy usando delphi 6 e interbase 7, uso consultas sobre
las tablas mediante tIBdataset.

Tengo varias dudas, respecto a optimización del código.

1)Si tengo una tabla X, (consulta sql en TIBDataSet), que
sólo me muestra un registro por vez, y del valor que hay
en uno de los campos de ese registro, (CampodeX),
dependen los registros que se muestran en otras tantas
tablas, (también consulta sql en TIBDataSet donde
campo=:CampodeX). ¿hay alguna manera de que se
actualicen los registros que se muestran en esta tablas que
dependen de X, sin tener que abrir y cerrarlas, cada vez
que cambiemos el registro de la tabla principal X?


2)Cuando en un código como el siguiente,


Código:
var str : String;
var dbpos: TBookMark;
begin
  TRY
    dbPos := TbEcono.GetBookmark;
    TbEcono.DisableControls;
    TbEcono.Close;
    TbEcono.SelectSQL.Clear;
    TbEcono.SelectSQL.Add(VEconoSQL);
      try
        TbEcono.Open;
       except
          on E: Exception do begin
          //guardamos en variable "str" el mensaje que
 queremos se muestre
            str := 'Error abriendo TbEcono con el mensaje : ' 
+ E.Message;
            Application.MessageBox(PChar(str), 'Atención', 
MB_OK);
          end;
       end;
  FINALLY
    TbEcono.GotoBookmark(dbpos);
    TbEcono.FreeBookmark(dbpos);
    TbEcono.EnableControls;
    FrmFxMain.SpeedSaldo.Click;

  END;
¿Es normal que, si esta tabla está mostrando sus datos en
un dbgrid o un campo dbedit, y al ejecutar este código, si
devuelve registros distintos a los que había inicialmente,
no se refresquen esos cambios en los dbgrid y los dbedit a
los que está conectado, poniendo los nuevos en vez de
mantener los viejos datos, a no ser que después cerremos
y abramos esta tabla?


3)¿Es normal que al añadir un procedimiento a mi
aplicación se relentice mucho la apertura del programa?

Gracias, de antemano, a tod@s por la ayuda.

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)

Última edición por Giniromero fecha: 26-02-2004 a las 10:43:18.
Responder Con Cita
  #2  
Antiguo 26-02-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Hola Virginia

Cita:
Empezado por Giniromero
1)...¿hay alguna manera de que se
actualicen los registros que se muestran en esta tablas que
dependen de X, sin tener que abrir y cerrarlas, cada vez
que cambiemos el registro de la tabla principal X?
haciendo relaciones de maestro/detalle??? No se si es esto a lo que te referias

Cita:
Empezado por Giniromero
2)....¿Es normal que, si esta tabla está mostrando sus datos en
un dbgrid o un campo dbedit, y al ejecutar este código, si
devuelve registros distintos a los que había inicialmente,
no se refresquen esos cambios en los dbgrid y los dbedit a
los que está conectado, poniendo los nuevos en vez de
mantener los viejos datos, a no ser que después cerremos
y abramos esta tabla?
No, debería de actualizar automáticamente. Lo que no entiendo es que, si cambias la sentencia SQL, para que quieres los BookMark??? Estos te servirían si no cambiaras la sentencia SQL, pero al cambiarla, la referencia de éste seguramente no será válida

Cita:
Empezado por Giniromero
3)¿Es normal que al añadir un procedimiento a mi
aplicación se relentice mucho la apertura del programa?
aquí si que no te he entendido
Responder Con Cita
  #3  
Antiguo 26-02-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
Hola,

Cita:
Empezado por cadetill

haciendo relaciones de maestro/detalle??? No se si es esto a lo que te referias


Si, están vinculadas las tablas mediante relaciones maestro detalle.

Cita:
Empezado por cadetill
Lo que no entiendo es que, si cambias la sentencia SQL, para que quieres los BookMark??? Estos te servirían si no cambiaras la sentencia SQL, pero al cambiarla, la referencia de éste seguramente no será válida
Es que, aunque cambie de código, no tienen que cambiar siempre los registros, y en caso de que no cambien, me interesaba que se mantuviese en el mismo registro.
Si quitase esto, ¿se me actualizarían automática todos los TIbDataSet, mostrandome los registros relacionados con el de mi tabla principal automáticamente, sin tener que pedirles que se cierren antes de que cambie el registro esa tabla principal, y se abran después?, por que si es así, me planteo el código de otra forma.


Cita:
Empezado por giniromero
3)¿Es normal que al añadir un procedimiento a mi
aplicación se relentice mucho la apertura del programa?
Tal vez me expliqué mal.

Quiero decir, que si es normal, que al hacer consulta SQL en la aplicación, usando en vez de a una tabla de mi base de datos, a un procedimiento de la misma, es normal que tarde tanto en abrirse la aplicación, o abrirse esa tabla.


Muchas gracias por todo,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)

Última edición por Giniromero fecha: 26-02-2004 a las 16:13:08.
Responder Con Cita
  #4  
Antiguo 26-02-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Hola de nuevo Virginia

1.- Pues si lo tienes en relación de maestro/detalle, deberían actualizarse los demas TIBDatasets son necesidad de un Close/Open

2.- Yo creo que la actualización o no de los componentes DataAware no tiene nada que ver con el BookMark, pero podrías pobarlo. No obstante, éstos deberían de actualizarse solitos al hacer el Open del TIBDataSet

3.- Bueno, todo depende de lo que haga ese procedimiento. Si ha de hacer muchas cosas, pues sí, pero si es algo sencillo, debería ir ligero
Responder Con Cita
  #5  
Antiguo 26-02-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 22
Giniromero Va por buen camino
Hola,


Cita:
Empezado por cadetill
3.- Bueno, todo depende de lo que haga ese procedimiento. Si ha de hacer muchas cosas, pues sí, pero si es algo sencillo, debería ir ligero
El procedimiento es el siguiente, el cual ya puse en otro hilo por otro tema:

Código:
CREATE PROCEDURE PROECONOPAGO 
RETURNS (
    CODIGO INTEGER,
    NUMALU SMALLINT,
    NUMGRUP SMALLINT,
    FECHA TIMESTAMP,
    ASIENTO INTEGER,
    CONCEPTO VARCHAR(50),
    IMPDEBE NUMERIC(15,2),
    IMPHABER NUMERIC(15,2),
    FORPAGO SMALLINT,
    RECIBO VARCHAR(10),
    FACTURA VARCHAR(10),
    USUARIO VARCHAR(10),
    TIPO VARCHAR(1),
    EMPRESATXT VARCHAR(1),
    CONTROL VARCHAR(1))
AS
DECLARE VARIABLE VCODIGO INTEGER;
DECLARE VARIABLE VNUMALU SMALLINT;
DECLARE VARIABLE VNUMGRUP SMALLINT;
DECLARE VARIABLE VFECHA TIMESTAMP;
DECLARE VARIABLE VASIENTO INTEGER;
DECLARE VARIABLE VCONCEPTO VARCHAR(50);
DECLARE VARIABLE VIMPDEBE NUMERIC(15,2);
DECLARE VARIABLE VIMPHABER NUMERIC(15,2);
DECLARE VARIABLE VFORPAGO SMALLINT;
DECLARE VARIABLE VRECIBO VARCHAR(10);
DECLARE VARIABLE VFACTURA VARCHAR(10);
DECLARE VARIABLE VUSUARIO VARCHAR(10);
DECLARE VARIABLE VTIPO VARCHAR(1);
DECLARE VARIABLE VPRODUCTOGRUP VARCHAR(2);
DECLARE VARIABLE VEMPRESAPRO VARCHAR(1);
DECLARE VARIABLE VCONTROL VARCHAR(1);
begin
for select CODIGO, NUMALU, NUMGRUP, FECHA, ASIENTO, CONCEPTO, IMPDEBE, 
IMPHABER, FORPAGO, RECIBO, FACTURA, USUARIO, TIPO

from ECONO

order by numalu
into
:VCODIGO,:VNUMALU,:VNUMGRUP,:VFECHA,:VASIENTO,:VCONCEPTO,:VIMPDEBE,
:VIMPHABER, :VFORPAGO,:VRECIBO,:VFACTURA,:VUSUARIO,:VTIPO  do
begin
select  PRODUCTO from grupos where NUMGRUP =:vnumgrup  into  :vproductogrup ;
select  EMPRESA from produ where PRODUCTO=:vproductogrup  into :vempresapro;

  If (:vasiento <2 AND :vimpdebe <> 0 ) Then Begin

    CODIGO = :VCODIGO;
    NUMALU = :VNUMALU;
    NUMGRUP = :VNUMGRUP;
    FECHA = :VFECHA;
    ASIENTO = :VASIENTO;
    CONCEPTO = :VCONCEPTO;
    IMPDEBE = :VIMPDEBE;
    IMPHABER = :VIMPHABER;
    FORPAGO = :VFORPAGO;
    RECIBO = :VRECIBO;
    FACTURA = :VFACTURA;
    USUARIO = :VUSUARIO;
    TIPO = :VTIPO;
    EMPRESATXT = :vempresapro;
    CONTROL = :vcontrol;
    suspend;
    end
end
end
¿Esto se un procedimiento muy complicado?

Cita:
Empezado por cadetill
1.- Pues si lo tienes en relación de maestro/detalle, deberían actualizarse los demas TIBDatasets sin necesidad de un Close/Open
Pues, por algún motivo que no termino de determinar, cuando cambio el registro principal, los registros que me tienen que mostrar el resto de las tablas, dependientes de esta, no se actualizan. Me siguen mostrando los registros para el valor anterior de la tabla principal.


Cita:
Empezado por cadetill
2.- Yo creo que la actualización o no de los componentes DataAware no tiene nada que ver con el BookMark, pero podrías pobarlo. No obstante, éstos deberían de actualizarse solitos al hacer el Open del TIBDataSet
¿Tal vez no tenga que ver tanto con los bookmark como con los disable control?

No sé, he tenido que poner código extra que sé me relentiza la aplicación para asegurarme de cerrar y abrir despues las tablas, pero necesito solucionar esto, para que no me de problemas de lentitud.

GRacias

virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)

Última edición por Giniromero fecha: 26-02-2004 a las 17:03:12.
Responder Con Cita
  #6  
Antiguo 26-02-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Empezado por Giniromero
¿Esto se un procedimiento muy complicado?
Pues no, no parece demasiado complicado. Ahora bien, todo depende del número de registros de las tablas, de una buena definición de índices y de la velocidad de acceso (que creo recordar era el problema del otro hilo)

Cita:
Empezado por Giniromero
Pues, por algún motivo que no termino de determinar, cuando cambio el registro principal, los registros que me tienen que mostrar el resto de las tablas, dependientes de esta, no se actualizan. Me siguen mostrando los registros para el valor anterior de la tabla principal.
Pues establecer una relación maestro/detalle con los TIBDataSet no es demasiado complejo (creo recordar que lo discutimos en su día), pero básicamente es establecer la propiedad DataSource del detalle apuntando al TDataSource del maestro y poner los parámetros en la sentencia SelectSQL del detalle

Cita:
Empezado por Giniromero
¿Tal vez no tenga que ver tanto con los bookmark como con los disable control?
Prueba a quitar ambas cosas a ver que resultado optienes
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 13:29:37.


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