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 16-06-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
Insert con ClientDataSet

Hola amigos, tengo un pequeño problema y no se como solucionarlo, tengo el siguiente codigo.

Código Delphi [-]
       datDatosRemoto.FIBClientDataSetTurnos.Open;
              datDatosRemoto.FIBClientDataSetTurnos.Insert;
              datDatosRemoto.FIBClientDataSetTurnos.FieldByName('tipo_turno').AsString:= txtTurno.Text;
              datDatosRemoto.FIBClientDataSetTurnos.FieldByName('horas').AsDateTime:= strtotime(txtHoras.Text);
              datDatosRemoto.FIBClientDataSetTurnos.Post;

Donde inserto registros, el problema es que al insertar y comprobar el DBGrid asociado me aparece en este, pero al salir de la aplicacion y volve a entrar ya no me aparece, y en la BD no queda grabado ningún registro. Lo mismo me ocurre al modificar datos.

¿Que estoy haciendo mal?..
Saludos
Responder Con Cita
  #2  
Antiguo 16-06-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Hola, Para grabarlo en la base de datos debes usar:

Código Delphi [-]
datDatosRemoto.FIBClientDataSetTurnos.ApplyUpdates(-1);

Eso va luego del post.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #3  
Antiguo 16-06-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
Tengo puesto en el evento AfterPost del CDS, ApplyUpdates(0), y como te digo me guarda los cambios si lo vuelvo a consultar en el momento, pero al salir y entrar en la aplicación ya no sale. Es como si lo mantuviera en memoria, o yo que se. Voy a probar como me dices, de todas formas.

Saludos.
Responder Con Cita
  #4  
Antiguo 16-06-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Cita:
Empezado por Rockin Ver Mensaje
Tengo puesto en el evento AfterPost del CDS, ApplyUpdates(0), y como te digo me guarda los cambios si lo vuelvo a consultar en el momento, pero al salir y entrar en la aplicación ya no sale. Es como si lo mantuviera en memoria, o yo que se. Voy a probar como me dices, de todas formas.

Saludos.
Lo que haces está bien, si el objetivo es que cada registro guardado se refleje de inmediato en la base de datos. Lo que puede estar sucediendo es que en ese momento tengas abierta una "transacción", la cual no es "cometida" (confirmada) antes de cerrar el programa y por lo tanto se esté "revirtiendo" (rollback).

Te sugiero revisar cómo estás manejando las transacciones en tu programa.

Saludos.

Al González.
Responder Con Cita
  #5  
Antiguo 16-06-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
He estado buscando y tengo entendido que el DataSetProvider en el Servidor de Capa Intermedia, es el encargado de activar las transacciones asociadas al DataSet. A lo mejor me estoy equivocando y tengo que llamarla yo, o confirmarla como me comentas.

Seguire con el tema a ver si doy con ello.
Responder Con Cita
  #6  
Antiguo 17-06-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola!

Cita:
Empezado por Rockin Ver Mensaje
...tengo entendido que el DataSetProvider en el Servidor de Capa Intermedia, es el encargado de activar las transacciones asociadas al DataSet...
En efecto, eso hace el componente TDataSetProvider cuando la conexión no tiene una transacción activa en ese momento. Es decir, si el programa no ha empezado una transacción explícitamente, el componente proveedor la establece y cierra cuando aplica las actualizaciones.

Esto fue lo que me llevó a pensar que tal vez tu programa sí está abriendo una transacción antes de la llamada a ApplyUpdates (probablemente es algo que haga de manera predeterminada alguno de los componentes de conexión que estás usando).

Aquí el código que ejecuta el proveedor en la capa intermedia (unidad Provider.pas):

Código Delphi [-]
function TDataSetProvider.InternalApplyUpdates(const Delta: OleVariant; MaxErrors: Integer;
  out ErrorCount: Integer): OleVariant;
begin
  CheckDataSet;
  FTransactionStarted := not IProviderSupport(DataSet).PSInTransaction;

  // Sólo si no hay ya transacción activa, el componente proveedor abrirá una
  if FTransactionStarted then
    IProviderSupport(DataSet).PSStartTransaction;
  try
    CheckResolver;
    Resolver.FUpdateTree.InitData(DataSet);
    try
      Result := inherited InternalApplyUpdates(Delta, MaxErrors, ErrorCount);
    finally
      Resolver.FUpdateTree.InitData(nil);
    end;
  finally
    if FTransactionStarted then
      IProviderSupport(DataSet).PSEndTransaction((ErrorCount <= MaxErrors) or (MaxErrors = -1));
  end;
end;

Espero te sea de utilidad, no dejes de retroalimentar el hilo.

Al González.
Responder Con Cita
  #7  
Antiguo 17-06-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
Gracias por tu interés pero estoy desesperado, he mirado en diez millones de foro, he probado de todas las maneras posible pero nada, en fin voy a probar con SQL Server, a ver si el problema es de los componentes de Firebird, por decir algo.
Responder Con Cita
  #8  
Antiguo 18-06-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
No se si tendré algo mal declarado en las propiedades del Provider, ClientDataSet o yo que se.

Saludos.
Responder Con Cita
  #9  
Antiguo 14-07-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
Sigo liado con el tema este, no tengo cojones de realizar cambios en la BD.Lo he intentado multitud de formas y nada.

Realizo el ApplyUpdate(0) despues del POST, y me guarda los cambios, ya que al realizar un consulta y mostrarlo en un DBGrid me sale modificado, pero al salir de la aplicación los cambios no se reflejan en la tabla de la BD.

¿Alguien puede ayudarme, please?
Responder Con Cita
  #10  
Antiguo 14-07-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Hola, debes realizar el commit al FIBConnection para que se grabe en la base de datos.

Código Delphi [-]
DatosRemotos.FConnection1.Commit;

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #11  
Antiguo 14-07-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
¿que componente es FIBConnection? No lo tengo declarado
Responder Con Cita
  #12  
Antiguo 14-07-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por Rockin Ver Mensaje
¿que componente es FIBConnection? No lo tengo declarado
perdón, realmente no sé como se llama el componente para conectar a la base de datos, en el caso de ADO sería ADOConnection, el de ZEOS ZConnection, no sé el de FIBPlus entonce asumí que se llamaría así.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #13  
Antiguo 14-07-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
NO tiene ningun componente tipo connection como el que comentas.

Gracias por tu ayuda
Responder Con Cita
  #14  
Antiguo 14-07-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por Rockin Ver Mensaje
NO tiene ningun componente tipo connection como el que comentas.

Gracias por tu ayuda
A ver, por que creo que sí lo tiene, ¿con qué componentes ligas la base de datos? (No la tabla, el .FDB), ¿tu base de datos no es Firebird?.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #15  
Antiguo 15-07-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
Para conectar con la BD uso el FIBDataBase.

¿Los campos persistentes hay que añadirlos siempre?

Saludos.

Última edición por Rockin fecha: 15-07-2008 a las 12:08:09.
Responder Con Cita
  #16  
Antiguo 15-07-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por Rockin Ver Mensaje
Para conectar con la BD uso el FIBDataBase.

¿Los campos persistentes hay que añadirlos siempre?

Saludos.
Pues eso, para grabar:

Código Delphi [-]
FIBDataBase.Commit;

para echar para atrás la transacción:

Código Delphi [-]
FIBDataBase.RollBack;

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #17  
Antiguo 15-07-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
Pero en la aplicación cliente no tengo el FIBDataBase, el componente está en el servidor de capa intermedia, con su Transacción correspondiente, la cual teoricamente la inicia y finaliza el DataSetProvider, pero no tengo cojones, y me estoy desesperando mucho.

Seguire buscando, gracias.

Saludos.
Responder Con Cita
  #18  
Antiguo 15-07-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por Rockin Ver Mensaje
Pero en la aplicación cliente no tengo el FIBDataBase, el componente está en el servidor de capa intermedia, con su Transacción correspondiente, la cual teoricamente la inicia y finaliza el DataSetProvider, pero no tengo cojones, y me estoy desesperando mucho.

Seguire buscando, gracias.

Saludos.
Bueno amigo, ¿y qué componentes usas en el cliente?, porque el cliente es el que tiene la transacción activa, así que el cliente debe hacer el commit no el servidor.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #19  
Antiguo 15-07-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
Esto es lo que uso:

Servidor Capa Intermedia

FIBDataBase + FIBDataSet + FIBTransaction + FIBDataSetProvider

Aplicación Cliente

FIBClientDataSet conectado a su Correspondiente FIBDataSetProvider a través de un SocketConnection.

Creo que el que se encarga de iniciar y finalizar la transaccion es el DataSetProvider del servidor de capa intermedia, no en el cliente.

Así es como lo tengo montado, las consultas perfectas y muy rapidas, pero la inserción, modificación e eliminación de registros, me lo hace en memoria pero no lo termina de actualizar a la BD, tengo puesto en el evento afterpost del ClientDataSet el ApplyUpdate(0) famoso.

Saludos.

Última edición por Rockin fecha: 15-07-2008 a las 16:01:06.
Responder Con Cita
  #20  
Antiguo 15-07-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Efectivamente amigo, es lo que trato decirle, el cliente debe realizar el commit al servidor a traves del socket como dices, solo asi los datos se quedarán grabados en la base.

Ejemplo:

Código Delphi [-]
//insercion de datos
try
....
FIBClientDataSet.ApplyUpdates(-1);
FIBDatabase.Commit;
except
//mensajes de error
FIBDatabase.rollback;
end;

sólo así te va a grabar los datos, tal vez me pueda equivocar , pero estoy seguro que ese es el problema.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
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
ClientDataSet y XML gsilvei Conexión con bases de datos 0 03-10-2007 22:59:18
Insert me cierra otro Insert motrildelphi Conexión con bases de datos 0 05-05-2005 12:20:27
Clientdataset+ galmacland Conexión con bases de datos 3 11-11-2004 15:17:37
ClientDataSet narvaez.om Conexión con bases de datos 2 19-05-2004 18:58:21


La franja horaria es GMT +2. Ahora son las 10:13:57.


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