![]() |
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; 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 |
Hola Virginia
Cita:
Cita:
Cita:
|
Hola,
Cita:
Si, están vinculadas las tablas mediante relaciones maestro detalle. Cita:
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:
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 |
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 :confused: 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 :rolleyes: |
Hola,
Cita:
Código:
CREATE PROCEDURE PROECONOPAGO Cita:
Cita:
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 |
Cita:
Cita:
Cita:
|
Cita:
Cita:
Cita:
GRacias, Virginia |
Hola,
1) [QUOTE = cadetill]..de una buena definición de índices..[/quote] Creo que esto lo estoy haciendo bien, pero, ¿podría alguien darme unas ideas generales de lo que se considera "una buena definición de índices", para asegurarme que no esté aquí el problema? 2) [QUOTE = cadetill]..Prueba a quitar ambas cosas a ver que resultado optienes ..[/quote] He quitado disable controls, y bookmark, y parece que se refresca. Aunque la prueba de fuego es cuando lo pruebe en el otro centro, que como no está en la red local del servidor, si da problemas .... 3) He puesto el procedimiento almacenado, en un TIBDataSet. No le he podido definir código para el deleteSQL ni modificar, pero bueno. el selectSQL es : Cita:
Cita:
y el insertSQL: Código:
insert into ECONO La cosa es que, como ya comenté anteriormente en este mismo hilo, desde que estoy utilizando el procedimiento almacenado, tarda más en abrirse el programa, aunque, por suerte, los procedures del delphi que utilizan ese procedimiento almacenado, van más rápido que antes. Problema, desde que utilizo este procedimiento almacenado, (en vez de una simple consulta), no sólo va más lento al abrirse, sino que me ha relentizado la busqueda de alumnos, (hay que tener en cuenta que todas las demás tablas dependen de la de alumnos). He hecho un "Trace into", para ver que es lo que daba problemas, y he descubierto que son los campos calculados de las tablas que dependen de mi tabla principal de alumnos, especialmente el tibdataset de mi procedimiento almacenado. La cuestión es, si por un lado percibo que usando SP me mejora el tiempo de un procedimiento, pero por otro lado, ese tiempo que gano lo estoy perdiendo cada vez que cambio el alumno seleccionado de la tabla principal... (lo cual es algo muy habitual), no hay ninguna forma de mejorar el tiempo de "apertura" o "respuesta" de estos SP cuando se usan en el delphi?, ¿no hay ningún otro objeto que pueda usar más apropiado que el TIBDataSet? Gracias por la ayuda de antemano, Virginia |
Cita:
Cita:
Cita:
Espero te sirva |
Hola,
Cita:
Lo peor de todo es que desde que está instalada la primera versión de esta aplicación que utiliza interbase 7 y delphi 6, algunas veces los usuarios del programa, se quejan de que determinados campos de la aplicación, (los campos calculados que tengo que mostrar en ella), directamente no muestran nada, como si no lo calculase, entonces cierran la aplicación, y al abrirla, normalmente, vuelven a tener esos campos con su valor correspondiente. Esto lo comento, pues, una de las cosas que estaba planteandome, por lo mismo, era crear procedimientos, con los campos ya calculados, y trabajar a partir de estos, para evitar ese problema, pero claro, si en estos no pueden guardar datos... Por cierto, los parámetros ptInputOutput del ibstoredPro, ¿para que sirven exactamente? Muchas gracias por todo, Virginia |
Cita:
Utilizaría TIBDatasets pero sin ningún SP. Eso sí, super bien filtrados mediante la cláusula where!! Aunque este filtro haga que retorne 1 solo registro (tendría que ser prácticamente instantaneo esto). Por otro lado... ¿de cuantos campos calculados estamos hablando? ¿de 3, 4, 5? Si son poquitos los calcularía en el OnCalcField del TIBDataset lanzando SQLs sobre la base de datos (que tendrían que ser también instantáneos ya que sólo han de devolver 1 registro o ninguno). Resumiendo: filtrar el TIBDataset para que retorne el número de registros lo más pequeño posible (si puede ser 1 sólo registro) y calcular los campos calculados mediante SQLs. Otra opción que se me acaba de ocurrir :p Puedes usar una tabla de trabajo en la que tengas TODOS los campos que necesitas y mediante triggers actualizar las tablas maestras. Con esto te ahorras el tema de los campos calculados, pero no la de un buen filtro en el Where, ok? |
Cita:
Cita:
Lo malo es que son estos campos calculados los que te comenté antes, algunas veces directamente les desaparecen la información a los usuarios. Voy a ver si después de quitar lo famosos bookmark, disable controls, y reduciendo codigo para estos campos, si consigo solucionarlo. Cita:
Muchas Gracias por todo, Virginia |
Cita:
Cita:
Otra opción que tienes usando tablas temporales es: 1.-Tienes la tabla temporal sin datos 2.-Con un SP la rellenas con los datos que quieres (las condiciones del filtro se lo pasas al SP) 3.-Lanzar una Query directamente y sin filtrar sobre la tabla temporal La verdad no se si esta opción será rápida (no lo creo) pero bueno, por alternativas que no queden |
La franja horaria es GMT +2. Ahora son las 11:20:58. |
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