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 11-12-2007
FelipeDiaz FelipeDiaz is offline
Miembro
 
Registrado: may 2007
Posts: 75
Poder: 18
FelipeDiaz Va por buen camino
Formularios que Capturan Datos

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
__________________
El Calentamiento Global acabara con la tierra. No mas Barreras, No mas Guerras, No mas discrimiancion, No mas violencia, No mas indiferencia, No mas terrorismo, No mas secuestros. !Valoremos la vida!

Última edición por FelipeDiaz fecha: 11-12-2007 a las 13:59:10.
Responder Con Cita
  #2  
Antiguo 11-12-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.307
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por FelipeDiaz Ver Mensaje
...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...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 11-12-2007
FelipeDiaz FelipeDiaz is offline
Miembro
 
Registrado: may 2007
Posts: 75
Poder: 18
FelipeDiaz Va por buen camino
Hola Neftali

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.



__________________
El Calentamiento Global acabara con la tierra. No mas Barreras, No mas Guerras, No mas discrimiancion, No mas violencia, No mas indiferencia, No mas terrorismo, No mas secuestros. !Valoremos la vida!
Responder Con Cita
  #4  
Antiguo 11-12-2007
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Cita:
Empezado por FelipeDiaz Ver Mensaje
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

Cita:
Empezado por FelipeDiaz Ver Mensaje
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);
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #5  
Antiguo 11-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
... 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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 11-12-2007
FelipeDiaz FelipeDiaz is offline
Miembro
 
Registrado: may 2007
Posts: 75
Poder: 18
FelipeDiaz Va por buen camino
Smile Hola

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,
__________________
El Calentamiento Global acabara con la tierra. No mas Barreras, No mas Guerras, No mas discrimiancion, No mas violencia, No mas indiferencia, No mas terrorismo, No mas secuestros. !Valoremos la vida!
Responder Con Cita
  #7  
Antiguo 11-12-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.307
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por FelipeDiaz Ver Mensaje
Aqui esta el codigo para el boton "NUEVO/GRABAR", la operacion se alterna.
Por favor utiliza los TAG's, no hay quien entienda este código...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 11-12-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.307
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Revisando un poco el código veo que el StartTransaction lo tienes en el IF y el Commit lo tienes en el ELSE.
No puedes dejar un StartTransaction "Colgado" o hacer un Commit sin haber realizado previamente el StartTransaction.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 11-12-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.307
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por jzginez Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 11-12-2007
FelipeDiaz FelipeDiaz is offline
Miembro
 
Registrado: may 2007
Posts: 75
Poder: 18
FelipeDiaz Va por buen camino
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...
__________________
El Calentamiento Global acabara con la tierra. No mas Barreras, No mas Guerras, No mas discrimiancion, No mas violencia, No mas indiferencia, No mas terrorismo, No mas secuestros. !Valoremos la vida!
Responder Con Cita
  #11  
Antiguo 11-12-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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...
Responder Con Cita
  #12  
Antiguo 12-12-2007
FelipeDiaz FelipeDiaz is offline
Miembro
 
Registrado: may 2007
Posts: 75
Poder: 18
FelipeDiaz Va por buen camino
Lightbulb Commit en lugar de CommitRetaining

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.
__________________
El Calentamiento Global acabara con la tierra. No mas Barreras, No mas Guerras, No mas discrimiancion, No mas violencia, No mas indiferencia, No mas terrorismo, No mas secuestros. !Valoremos la vida!
Responder Con Cita
  #13  
Antiguo 12-12-2007
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
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.

espero estar bien en mi recomendación sino ya tendré que ponerme a investigar mas
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #14  
Antiguo 12-12-2007
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Cita:
Empezado por FelipeDiaz Ver Mensaje
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
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México

Última edición por jzginez fecha: 12-12-2007 a las 00:46:07.
Responder Con Cita
  #15  
Antiguo 12-12-2007
FelipeDiaz FelipeDiaz is offline
Miembro
 
Registrado: may 2007
Posts: 75
Poder: 18
FelipeDiaz Va por buen camino
Smile Solucion

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
__________________
El Calentamiento Global acabara con la tierra. No mas Barreras, No mas Guerras, No mas discrimiancion, No mas violencia, No mas indiferencia, No mas terrorismo, No mas secuestros. !Valoremos la vida!
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
base de Datos y Formularios Remotos solovaer Conexión con bases de datos 1 21-07-2006 19:30:35
Pasar datos entre formularios davitcito OOP 1 29-06-2005 09:48:03
problema traspaso de datos entre formularios hijos VRO OOP 6 30-03-2005 13:35:53
formularios seduerey API de Windows 0 05-07-2004 20:34:26


La franja horaria es GMT +2. Ahora son las 01:56:31.


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