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 09-10-2024
silman silman is offline
Registrado
 
Registrado: oct 2024
Posts: 3
Poder: 0
silman Va por buen camino
Angry Firebird, Firedac, no se graban los datos en la tabla

Espero explicarme correctamente.
Estoy haciendo un programa estadístico en cual manejo dos tablas una maestra y la otra detalle, la base de datos está en firebird y utilizo firedac para conectarme a la base de datos.
Para actualizar la tabla maestra con las incidencias recorro la tabla de detalle extraigo datos de esta y luego actualizo la tabla maestra.
Al terminar se ven los cambios reflejados en un dbgrid pero no quedan permanentes pues al salir del programa y volver a entrar las actualizaciones no han quedado grabadas en la tabla.

El código que utilizo es el siguiente:

Código Delphi [-]
procedure TFTodo.Btn_ActualizaClick(Sender: TObject);
var
  Avance, Guarda : integer;
  Top : integer;
  N0,N1,N2,N3,N4,N5, Cl : integer;
  Clasi, DeLa3,Total,Ultim,Penul,AnteP : integer;
begin

  if not DM.FDC.Connected then DM.FDC.Connected := True;
  if not DM.FDTTCombi.Active then DM.FDTTCombi.Active := True;
  if not DM.FDTTCombi.CachedUpdates then DM.FDTTCombi.CachedUpdates := True;

  if not DM.FDTTSort.Active then DM.FDTTSort.Active := True;

  Top := DM.FDTTSort.RecordCount;

  Avance := 0;
  Guarda := 0;

  PBar.Min :=0;
  PBar.Max := Top;
  PBar.Visible := True;

  Lbl_2.Visible := True;
  Lbl_3.Visible := True;

  DBNCombi.Visible := False;

  Lbl_RPro.Visible := True;
  Lbl_RPro.Caption := '0';
  Lbl_RMax.Visible := True;
  Lbl_RMax.Caption := formatFloat('###,###,###',Top);

  DM.DSCombi.Enabled := False;

  DM.FDTTSort.First;

  while not DM.FDTTSort.Eof do
  Begin
    inc(Avance);
    Lbl_RPro.Caption := formatFloat('###,###,###',Avance);
    PBar.Position := Avance;
    Application.ProcessMessages;

    N0 := DM.FDTTSortEVENT.AsInteger;
     N1 := DM.FDTTSortN1.AsInteger;
      N2 := DM.FDTTSortN2.AsInteger;
       N3 := DM.FDTTSortN3.AsInteger;
        N4 := DM.FDTTSortN4.AsInteger;
         N5 := DM.FDTTSortN5.AsInteger;
          Cl := DM.FDTTSortCLASE.AsInteger;

    if not DM.FDTTCombi.FindKey([N1,N2,N3,N4,N5]) then
    Begin
      ShowMessage(' !!! ERROR no existe ¡¡¡');
      DM.FDTTSort.Last;
      Exit;
    End
    Else
    Begin

      Clasi := DM.FDTTCombiCLASI.AsInteger;
       DeLa3 := DM.FDTTCombiDELA3.AsInteger;
        Total := DM.FDTTCombiTOTAL.AsInteger;
         Ultim := DM.FDTTCombiULTIM.AsInteger;
          Penul := DM.FDTTCombiPENUL.AsInteger;
           AnteP := DM.FDTTCombiANTEP.AsInteger;

      if Cl = 1 then inc(Clasi);
      if Cl = 3 then inc(DeLa3);

      Total := Clasi + DeLa3;

      AnteP := Penul;
       Penul := Ultim;
        Ultim := N0;

      DM.FDTTCombi.Edit;

      DM.FDTTCombiCLASI.AsInteger := Clasi;
       DM.FDTTCombiDELA3.AsInteger := DeLa3;
        DM.FDTTCombiTOTAL.AsInteger := Total;
         DM.FDTTCombiULTIM.AsInteger := Ultim;
          DM.FDTTCombiPENUL.AsInteger := Penul;
           DM.FDTTCombiANTEP.AsInteger := AnteP;

      DM.FDTTCombi.Post;
      inc(Guarda);

      if Guarda >= 50 then
      Begin
        DM.FDTTCombi.ApplyUpdates();
        DM.FDTTCombi.CommitUpdates;

        Guarda := 0;
      End;
    End; // Fin de FindKey

    DM.FDTTSort.Next;
  End; // FIn de While

  DM.FDTTCombi.ApplyUpdates();
  DM.FDTTCombi.CommitUpdates;

  Lbl_2.Visible := False;
  Lbl_3.Visible := False;
  Pbar.Position := 0;
  PBar.Visible := False;
  DBNCombi.Visible := True;

  DM.DSCombi.Enabled := True;

  DM.FDTTCombi.First;
end;

Última edición por Neftali [Germán.Estévez] fecha: 10-10-2024 a las 08:42:58. Razón: Añadir el TAGs al código
Responder Con Cita
  #2  
Antiguo 10-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
has probado a desactivar las CachedUpdates y eliminar el ApplyUpdates() y el CommitUpdates a ver si lo guarda?? por si van por ahi los tiros y es algo referente a eso

haciendo el Edit-Post con las cached updates = false

comprueba tambien que la tabla no este como ReadOnly = true

Última edición por navbuoy fecha: 10-10-2024 a las 01:52:10.
Responder Con Cita
  #3  
Antiguo 10-10-2024
silman silman is offline
Registrado
 
Registrado: oct 2024
Posts: 3
Poder: 0
silman Va por buen camino
Si, de hecho ya probé sin cacheupdate habilitando fastupdates lo curioso que en un principio utilizaba disablecontrols y cuando lo cambié por DM.DSCOMBI.Enable := False funcionó, pero al querer hacerlo con otros módulos dejo de funcionar, se me pasó mencionar que estoy usando delphi 11.2.


E buscado en la red pero no encuentro ningún tutorial que haga lo que pretendo.
Responder Con Cita
  #4  
Antiguo 10-10-2024
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.874
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
Bienvenido a los foros, veo que eres nuevo.
Por favor, añade TAG's a tus mensajes cuando escribas código.
Y ya que eres "novato" te recomiendo que leas nuestra guía de estilo.

En cuanto a tu pregunta, yo revisaría tema relacionado con transacciones. Sólo pones un trozo de código y no veo Begin..commit, al menos no todos ellos, sólo un CommitUpdates.
__________________
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
  #5  
Antiguo 10-10-2024
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 318
Poder: 3
pgranados Va por buen camino
Estas editando o grabando? en tu codigo veo un EDIT pero no un APPEND o INSERT

Pon un stop (puntito rojo) antes de llegar a POST para revisar que pasa después de entrar.
Responder Con Cita
  #6  
Antiguo 12-10-2024
silman silman is offline
Registrado
 
Registrado: oct 2024
Posts: 3
Poder: 0
silman Va por buen camino
Se trata de una aplicación local, no debe correr en la red por eso no e manejado transacciones, la pregunta es de por que no se graban los datos en la tabla, de hecho si edito el DBGrid sucede lo mismo cuando salgo del programa y vuelvo a entrar los datos no quedaron de forma permanente, no se si me falte configurar algo pero le e buscado tanto en la configuración de la tabla como en el dataset e incluso en el DBGrid y no encuentro el problema.


De echo si analizas el código es en realidad algo muy simple se entra en ciclo while y se lee de forma secuencial el archivo de eventos, se localiza el correspondiente registro en el maestro se toman los datos a modificar y luego pongo la tabla del maestro en modo de edición asigno los valores y mando post, después tengo un ciclo para guardar de forma permanente cada 50 registros aplicando update y commit, al finalizaar el while vuelvo a aplicar update y comit para no dejar ningún registro sin procesar.
gracias por el aviso ya estoy viendo como dar formato a mis mensajes
Responder Con Cita
  #7  
Antiguo 12-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
Problema: Los cambios realizados en un DBGrid no se graban en la tabla.

El problema de que los cambios realizados en un DBGrid no se guarden en la tabla puede deberse a varios factores. Aquí te dejo algunos puntos clave para revisar y posibles soluciones:

1. Dataset no está en modo edición

Asegúrate de que el Dataset (por ejemplo, TQuery, TTable, TClientDataset, etc.) esté en modo de edición cuando realizas cambios a través del DBGrid. Si no lo está, los cambios no se reflejarán en la base de datos.

Para poner el Dataset en modo edición, usa algo como:

Código:
if (!DataSource1->DataSet->Active) return;  // Asegúrate de que el DataSet esté activo
DataSource1->DataSet->Edit();  // Pone el dataset en modo de edición
2. Llamar a Post para aplicar cambios

Cuando terminas de editar una fila en el DBGrid, necesitas aplicar los cambios al dataset. Esto generalmente se hace llamando a Post:

Código:
DataSource1->DataSet->Post();
Asegúrate de que esto ocurra después de la edición. A veces, el DBGrid lo hace automáticamente cuando te desplazas a otra fila, pero si no está sucediendo, puedes forzar la llamada a Post manualmente.

3. Verifica el modo de conexión

Si estás usando una conexión a una base de datos a través de TQuery o TTable, asegúrate de que el dataset esté configurado para permitir ediciones. Revisa la propiedad ReadOnly de tu DataSet (asegúrate de que esté en false), y que la consulta SQL permita actualizaciones. Para tablas o consultas, asegúrate de que la consulta SQL sea modificable (por ejemplo, evita usar combinaciones JOIN que hagan la tabla de solo lectura).

4. Propiedad AutoEdit del DataSource
Si la propiedad AutoEdit de tu DataSource está en false, el DBGrid no pondrá el dataset en modo de edición automáticamente cuando comiences a editar una celda.

Asegúrate de que la propiedad AutoEdit de tu DataSource esté en true:

Código:
DataSource1->AutoEdit = true;
5. Faltan permisos en la base de datos

Asegúrate de que el usuario que está accediendo a la base de datos tenga permisos para realizar operaciones de escritura (insertar/actualizar/eliminar).

6. Transacciones pendientes

Si estás usando transacciones, asegúrate de que la transacción se haya confirmado (Commit) después de la edición. De lo contrario, los cambios no se reflejarán en la base de datos:

Código:
DataSource1->DataSet->Post();  // Aplica los cambios
Database1->Commit();           // Confirma la transacción
7. Eventos de validación o cancelación

Revisa los eventos del DBGrid o del DataSet (BeforePost, OnPostError, etc.) para asegurarte de que no haya código que cancele el guardado o que no esté aplicando los cambios.

Resumen:
- Asegúrate de que el Dataset esté en modo de edición.
- Usa Post para guardar los cambios.
- Verifica que AutoEdit esté habilitado.
- Revisa permisos de escritura y transacciones pendientes.
- Verifica que no haya validaciones o cancelaciones que interfieran.
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
Chequear y hacer Cambios en Base de Datos Firedac + Firebird 3 amadis Conexión con bases de datos 12 22-11-2022 19:30:51
Grabar datos desde ListView a Tabla Firebird. Camilo OOP 4 21-06-2019 19:36:32
Firedac y tabla temporal Mysql lbidi Conexión con bases de datos 3 21-02-2018 19:47:54
actualizar datos desde otra tabla firebird 2.1 shaymon325 Firebird e Interbase 5 08-05-2012 04:43:12
Como actualizo datos en una tabla Firebird jafera Firebird e Interbase 3 16-01-2012 17:45:08


La franja horaria es GMT +2. Ahora son las 23:18:46.


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
Copyright 1996-2007 Club Delphi