PDA

Ver la Versión Completa : Relación entre IBDataSet-Dbgrid que pasa realmente ?


sierraja
26-01-2006, 16:30:36
Primero, no estoy seguro si la pregunta está ubicada en el foro correspondiente, (moderador: por favor ubicarla y disculpa el error).

El escenario es el siguiente: tengo los siguientes componentes de conexión a una base de datos en fireBird 1.5.3 desde delphi 7.0 y utilizo los componentes ibx, es decir, en un datamodule tengo:

IBDataBase <> IBTransaction
IBDataSet > DataSource

En el evento DataChange del datasource le asigno a un TEdit lo siguiente:

LabeledEdit3.Text:=inttostr(dm.ibds_proveedores.RecNo)+'/'+inttostr(dm.ibds_proveedores.RecordCount);

En el formulario de consulta, cuando éste se activa tengo la instrucción:

dm.ibds_proveedores.first;

y lógicamente el labelededit3.text muestra: la posición (recno) y el numero de registro (recordcount);

También tengo un dbgrid conectado con el datasource, cuando el formulario se activa me muestra los primeros cinco registros de la tabla, ya que el dbgrid solo tiene esa dimensión, para este momento el labelededit3 me muestra registro 1 de 5 es decir: 1/5, cuando me movilizo hacia el siguiente registro me muestra 1/6, y así sucesivamente hasta el ultimo (No. 12). Esto lo hace la primera vez cuando entre al sistema, pero luego en el trasncurso de la aplicación se muestra la información labelededit3 normalmente, es decir, cuando se carga el formulario por segunda vez si me muestra el total de todos los registro: (1/12), que es lo que se debería mostrar al activar el formulario la primera vez.

En otras oportunidades (con los componentes DBExpreess y localmente) me muestra la información correcta: el número del registro actual +'/'+ el total de registros de la tabla. :confused:

Nota: La base de datos se encuentra en un servidor linux y la aplicación en una estación de trabajo con winxp.

Gracias por su atención....

sierraja
26-01-2006, 18:32:53
Otra cosa, cada vez que el formulario se activa tengo que ir al final y luego al principio de la tabla para que se pueda mostrar los registros en forma correcta. Por qué sucede esto, que se está haciendo mal ? :confused:

Fita
26-01-2006, 23:21:30
Hola...

Estoy en el foro por otro tema y he visto tu post.
Soy relativamente nuevo con Interbase pero hasta donde pude leer, Interbase nunca te enviará todos los registros de una tabla, el IBDataset pide solo los que se necesitan para mostrar en pantalla.
en tu caso, al abrir el dataset muestras 5 registros y a medida que avanzas aparece 1/6, 1/7 y asi.. creo que por ahi viene la cosa.
Tengo una aplicación que necesita mostrar la cantidad de registros de una tabla; para ello utilizo un stored procedure que hace un count(*) de la tabla en el servidor y solo me devuelve el total de registros...
En tu caso, creo que al ir al final de la tabla ahi obtienes el total de registros pero estos van y vienen por la red... con el stored procedure es más rápido

Espero te sirva de orientación
Saludos

sierraja
26-01-2006, 23:52:09
Hola Fita, me contenta que hayas entendido muy bien mi problema, pero con tu explicación me doy cuenta que no estaba muy lejos de entender lo que pasaba, solo faltaba que otra persona me lo ratificara. Ok, con tu recomendación de hacer el count sería lo mejor, el problema está que tendré que estudiar más acerca del tema ya que no conozco los stored procedure, a menos que con tu valiosa colaboración y ejemplos pueda enterlos :D

Gracias....

vtdeleon
27-01-2006, 00:04:38
Otra opcion es hacer FetchAll al dataset, aunque no recomendable, pues traera toda la informacion, ocupando un poco la red

Fita
29-01-2006, 02:39:41
Bueno, crear un Stored Procedure es fácil... aqui va el código

CREATE PROCEDURE TOT_FAMILY
RETURNS (
NTOTAL INTEGER)
AS

begin
SELECT COUNT(*) FROM FAM000 where marcabaja = 'A' INTO nTotal;
end

Este procedimiento devuelve el total de familias activas (marcabaja = 'A') que lo guarda en la variable nTotal
En tu form pegas un componente IBTransction y un Componente IBStoredProcedure. Enlazas este último a la transaccion.
En la propiedad StoredProcedureName pones eso, el nombre del procedimiento, en este ejemplo Tot_Family

Para ejecutar el Stored Procedure haces esto en algun ciclo de tu programa:

IBStoredProc1.ExecProc; // ejecutas el procedure en el servidor
nRows := IBStoredProc1.Params.Items[0].Value;

La variable nRows recibe el total de registros que conto el Stored Procedure.
Si el Stored Procedure tuviese mas variables las sentecias que traen los datos serian así:
nRows := IBStoredProc1.Params.Items[0].Value;
nRows2 := IBStoredProc1.Params.Items[1].Value;
nRows3 := IBStoredProc1.Params.Items[2].Value;

Para mantener la base de datos te recomiendo usar (si es que no utilizas) un administrador de bases de datos ya que la creacion de Procedures, Tablas, Vistas, es es visual. Hay muchos y muy buenos, a saber:

IBWorkbench, IBAdmin, EMS Interbase & Firebird Manager (son pagos) y una buena cantidad de uso libre y Open Source.

En mi caso uso el EMS que es muy completo y ademas soporta Firebird al que pienso migrar en el futuro.

Espero que te sirva como punto de partida.
Saludos

sierraja
30-01-2006, 18:58:49
Hola FITA, realmente para mi es un muy buen punto de partida, realmente muchísimas gracias.:)

sierraja
01-02-2006, 13:08:18
Buenos días, la verdad es que me ha costado bastante :( ya que es mi primera aplicacion de este tipo, lógicamente me tocó aprender primero el manejador IBExpert luego todos sus procesos principales y bastante SQL, hasta que por fin conseguí hacer la recomendación de FITA y funcionó perfectamente. FITA Muchas Gracias :D