PDA

Ver la Versión Completa : Formularios que Capturan Datos


FelipeDiaz
11-12-2007, 13:35:37
Hola a todos nuevamente.

Hoy tengo un pequeño inconveninte que no se como tratar.

Estoy trabajando en una aplicación y me encuentro en la fase de construccion de las ventanas de captura de datos de productos.

Antes solo habia trabajado con paradox, ahora con Firebird (Uso componentes FIBPLUS). Cambiar de Bases de datos de Escritorio a bases de datos Cliente Servidor resultó algo interesante, pero hay ciertas cosas ques ecomportan diferente, como es el caso siguiente.

Tengo abierta la ventana PRODUCTOS, (ya existen productos grabados en la "TABLA PRODUCTOS") cuando agrego un producto nuevo, habiendo usado
startTransaction al comienzo y Comint al final, me sucede que los campos de la ventana quedan en Blanco.

Lo que tengo entendido es que el Datset se cierra. o que luego de ejecutar algunas consultas con INSERT o DELETE, la DATABASE se desconecta.

Yo lo que hago es que luegode cada accion aterior, dependiendo el caso... ABRO cada DATASET que se relacione con la ventana o CONECTO nuevamente la DATABASE.

Aparte de eso, no logro controlar, que al ingresar un nuevo Producto, la base de datos me quede abierta en ese ultimo registro que ingrese.

Lo mas curioso de todo, es que en la ventana PROVEEDORES, luego de ingresar un nuevo proveedor y de abrir los dataset, yo le digo que se posicione en el ultimo registro (suponiendo que el recien añadido se coloca de ultimo) y SI me funciona...todo bien. Pero al hacer lo mismo ...la misma metodología para los productos.... luego de agregar... la ventana se pocicisiona aveces en el ultimo, pero la mayor parte del tiempo en otro registro.

Mis preguntas son...

1. Es este comportamiento normal, que se cierren los dataset o la DATABASE?

2. Hay una forma mas recomendable de hacer frente a esta situacion?
Tal vez, desconozco algun atajo.



Se me olvidaba mencionar....
No uso DBnavigator, en su lugar hay un Boton para NUEVO, EDITAR, ELIMINAR, CANCELAR.

Resumiendo.... si el usuario hace click en NUEVO, entonces .....Dataset.Insert;
si el usuario hace click en GUARDAR, entonces .....Dataset.post;


Agradeciendo siempre la colaboracion,

Saludos


Felipe Diaz

Neftali [Germán.Estévez]
11-12-2007, 14:13:58
...cuando agrego un producto nuevo, habiendo usado startTransaction al comienzo y Comint al final, me sucede que los campos de la ventana quedan en Blanco.
Lo que tengo entendido es que el Datset se cierra. o que luego de ejecutar algunas consultas con INSERT o DELETE, la DATABASE se desconecta.
Mis preguntas son...
1. Es este comportamiento normal, que se cierren los dataset o la DATABASE?
2. Hay una forma mas recomendable de hacer frente a esta situacion?
Tal vez, desconozco algun atajo.


No tiene mucho sentido que se cierre el DataSet ni la Conexión a la Base de Datos.
Revisa el código que estás utilizando.
1.- NO
2.- Deberías poder trabajar igual que lo hacías con el BDE.

Revisa cómo tienes conectados los componentes y el tratamiento de las transacciones.
Revisa que no se estén produciendo excepciones que tengas capturadas/enmascaradas y que no se estén mostrando.
Tal vez ayudaría algo de código de las operaciones que estás haciendo...

FelipeDiaz
11-12-2007, 14:56:14
La idea es que los Controles DBEdit estan asociados al Dataset al inicio usaba DBNAvigator, pero quise reemplazarlos por codigo.

Aqui esta el codigo para el boton "NUEVO/GRABAR", la operacion se alterna.

-------------------------------------------------------------

procedure TFClientes.Button3Click(Sender: TObject);
begin

if Button3.Caption = 'Nuevo' then
begin
DesBloqueos(); // ---> Desbloquea los controles: REadOnly = False;
Button1.Enabled:=TRue; // ---> Boton que canecla la operacion
Button4.Enabled:=False;
Button2.Enabled:=False; // ---> Botones Editar, Buscar,Eliminar
Button5.Enabled:=False;
Panel2.Visible:=false; // ---> Contiene DBGrid con relaciones Detalle

Datamodule1.Database2.StartTransaction;
Datamodule1.CLIENTES.Insert; // ---> CLIENTES es el Dataset
Button3.Caption := 'Grabar';
DBedit1.SetFocus;
end

else // ---> Si el Boton tiene en Caption "GRABAR" entonces.....


begin
Aceptado:=True;
AsegurarCli(); // ---> Procedimiento verifica no hayan campos en blanco.
if Aceptado then

Begin
EstInicial(); // ---> Bloqueo campos: readOnly = true;
Panel2.Visible:=true;// ---> Muestro la relacion detalle;

Datamodule1.CLIENTES.Post;
Datamodule1.Database2.Commit;

Abertura(); // ---> Aqui me toca abrir los dataset uno a uno
// ---> de lo contrario muestra campos en blanco

Datamodule1.CLIENTES.Last; // ---> Supuestamente el que agregó.
end
else
begin
showmessage('Faltan datos por llenar');
DBEdit1.SetFocus;
end;
end;
end;
--------------------------------------------------------------------

No se si la forma en que traté de imitar el comportamiento del DBnavigator este bien, tengo botones: Nuevo, Editar, Eliminar. Pero con los botones del BDNAvigator, no se cierren los dataset.

Tengo entendido que en una Base de datos Cliente servidor, no se habla de Tablas ni de pocisiones de registros como se trabaja en Bases de datos de Escritotio, por ello considere que el comportamiento era algo normal.

jzginez
11-12-2007, 15:43:49
Datamodule1.CLIENTES.Post;
Datamodule1.Database2.Commit;

Aquí esta tu problema Commit cierra la conexión tienes que usar CommitRetaining o RollbackRetaining según sea el caso


Aparte de eso, no logro controlar, que al ingresar un nuevo Producto, la base de datos me quede abierta en ese ultimo registro que ingrese.


Esto lo he logrado controlar con pFIBDataSet.CloseOpen(True);

Lepe
11-12-2007, 15:50:27
... Pero no se recomienda abusar de CommitRetaining por ser más costoso mantener la transacción activa.

Sin duda, buenos manuales, que los hay, para entender lo que pasa.

Saludos

FelipeDiaz
11-12-2007, 16:16:40
Hola jzginez, hola Lepe

Gracias por al colaboracion, habia intentado con el commit retaining, pero tal ves lo use mal y conclui que tampoco me solucionaba, me dió la impresion que efectuaba la transaccion pero no me refrescaba los controles con la infromacion.

Ya lo puse en ejecucion.

Lo que no he podido entender es la otra intruccion: pFIBDataSet.CloseOpen(True); la coloque al final y aun sigue mostrandome otro registro no el ultimo.

en que parte debe estar, ya busque información y no encontre al respecto.

Saludos,

Neftali [Germán.Estévez]
11-12-2007, 16:27:13
Aqui esta el codigo para el boton "NUEVO/GRABAR", la operacion se alterna.

Por favor utiliza los TAG's (http://neftali.clubdelphi.com/images/ResaltarSintaxisDelphi.png), no hay quien entienda este código...

Neftali [Germán.Estévez]
11-12-2007, 16:32:01
Revisando un poco el código veo que el StartTransaction lo tienes en el IF y el Commit lo tienes en el ELSE. :confused::confused::confused:
No puedes dejar un StartTransaction "Colgado" o hacer un Commit sin haber realizado previamente el StartTransaction.

Neftali [Germán.Estévez]
11-12-2007, 16:36:06
Commit cierra la conexión tienes que usar CommitRetaining o RollbackRetaining según sea el caso

¿Estás seguro de eso?
No he trabajado mucho con IB/Fb, pero es la primera vez que oigo (en cualquier Base de Datos) que el Commit cierre la conexión. Es más, tal y como ha dicho Lepe, a mi entender el CommitRetaining no debería usarse más que en los casos estrictamente necesarios, ya que "dentro" de la transacción debes meter lo mínimo (de eso van las trasacciones), además de que en vistas a eficiencia el CommitRetaining es peor que el Commit (ya que estás obligando al servidor a hacer mucho más trabajo del normal).

Otra cosa que no debe ser muy buena es la mayor probabilidad de bloqueos que estás generando con CommitRetaining frente al Commit.

FelipeDiaz
11-12-2007, 16:37:23
Tienes razon Neftali,

Lo que sucede es que el boton NUEVO hace el StartTrantaction y el usuario solo tiene tres formas de responder:

1. Presionando el Boton GUARDAR que es el mismo "NUEVO"
2. Presionando el Boton CANCELAR
3. Presionando el Boton SALIR.

Cualquiera de las tres unicas formas de responder hace el RollBack.

Que pena..no sabia lo de los TAGs

Pero mi problema siguee...

maeyanes
11-12-2007, 18:52:11
El Commit cierra los DataSet's asociados a la transacción...

Esto al menos usando los componentes IBX... puede que los FIBPlus tengan el mismo comportamiento...

En dado caso, luego del Commit, puedes hacer un DataSet.Open...


Saludos...

FelipeDiaz
12-12-2007, 00:32:22
Bueno maeyanes confirma lo que me sucede ...yo uso los FIBPLUS. Como conclusion, entonces, los Dataset(s) se cierran, es normal este comportamiento.
Entonces....

1. Dejo como tenia al principio .... solo Commit. no CommitRetaining Y luego abro cada Dataset asociado a la ventana.

2. No tengo claro que hacer para que luego al abrir los dataset(s), el registro actual sea el ultimo ingresado.

No se que hacer!!

Gracias.

jzginez
12-12-2007, 00:40:23
Disculpen tal vez hable de mas, en alguna ocasión tuve el mismo problema y fue la explicación que obtuve aquí, esto era que al igual que FelipeDiaz después de hacer un commit mis tablas y base de datos se desactivaban, como al probar la solución que me dieron funciono bien la verdad es que ya no investigue mas.

Ahora bien con respecto al pFIBDataSet.CloseOpen(True) lo que entendí que tienes (y que yo también pongo) es una forma con un dbgrid en la cual muestras los datos y otra forma para capturarlos, el pFIBDataSet.CloseOpen(True) lo pongo antes de cerrar la ventana de captura y esto provoca que en el dbgrid se actualicen mis datos y quede seleccionado el registro que halla insertado o editado.

:D espero estar bien en mi recomendación sino ya tendré que ponerme a investigar mas

jzginez
12-12-2007, 00:43:44
2. No tengo claro que hacer para que luego al abrir los dataset(s), el registro actual sea el ultimo ingresado.

No se que hacer!!

Gracias.

Antes del commit guarda en una variable el ID (o el valor del campo principal) del registro que acabas de guardar y después de reabrir el dataset as un locate

p.d. voy a empezar a cambiar mis CommitRetaining o RollbackRetaining por Commit y RollBack

FelipeDiaz
12-12-2007, 00:53:27
Hola nuevamente jzginez,

Esa Solucion si funciona, habia intentado algo similar guardé el valor del campo principal, pero luego lo pretendía buscar con una consulta... Se me olvidaba el "Locate" y eso que anoche habia cambiado consultas por "Locate".

Bueno, esa solucion me parecia como muy larga y la descarte esta mañana cuando me hablaste del CommitRetaining, pero ahora veo que es lo mejor.

Me alegra saber que en cuanto a la secuancia no ando tan mal.
Pense que estaba dejandod e utilizar algo que me facilitara las cosas.

Nuevamente muchas gracias jzginez y a todos los que lograron aclarar nuestras dudas.

Saludos,


Felipe Diaz