Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Los cambios hechos por una 2da forma no se actualizan inmediatamente (https://www.clubdelphi.com/foros/showthread.php?t=42180)

joal 05-04-2007 22:19:30

Los cambios hechos por una 2da forma no se actualizan inmediatamente
 
Una nueva duda. Igualmente estoy usando Firebird y componentes Interbase (ibTransaction, ibQuery, ibDatabase).

Tengo una forma (frm_HistoriaClinica) que muestra los datos relacionados a un paciente, como son sus relaciones heredofamiliares. Si el usuario quiere dar de alta una nueva relación heredofamiliar, se llama a una nueva forma para tal propósito (frm_Hdofamiliares), se indican los campos ID, el usuario ingresa los datos respectivos, se actualiza la BD y regresa a la forma anterior.

Coloqué separadamente el proceso de popular la lista de heredofamiliares (TListBox) ya que así la puedo llamar tanto al abrir la forma principal, como cuando se hace alguna operación sobre dicha tabla.

Código Delphi [-]
procedure Tfrm_HistoriaClinica.btn_NuevoHdofamiliarClick(Sender: TObject);
  begin
    frm_Hdofamiliares:= Tfrm_Hdofamiliares.Create(Self);
    frm_Hdofamiliares.str_pacienteID:= str_pacienteID;
    frm_Hdofamiliares.str_hdofamiliarID:= str_heredofamiliarID;
    try frm_Hdofamiliares.ShowModal;
    finally frm_Hdofamiliares.Free; end;
    PopulaHeredofamiliares;
 end;

procedure Tfrm_HistoriaClinica.PopulaHeredofamiliares;
begin
  lb_Heredofamiliares.Items.Clear;
  with dm_Heredofamiliares.ibq_IBQuery do
    begin
    Close;
    SQL.Clear;
    SQL.Append('SELECT hdofamiliar_ID, heredorelacion_nombre FROM heredorelaciones, hdofamiliares ' +
       ' WHERE (heredorelaciones.heredorelacion_ID = hdofamiliares.heredorelacion_ID) ' +
       '   AND (hdofamiliares.paciente_ID = ' + QuotedStr(str_pacienteID) + ')' );
    Open;
     while not Eof do
      begin
 lb_Heredofamiliares.Items.Add(FieldByName('heredorelacion_nombre').AsString);
      Next;
      end;
    end;
end;

Ok. El problema surge al momento de actualizar los datos en la forma de Heredofamiliares (frm_Hdofamiliares) y regresar a la forma principal (frm_HistoriaClinica); aún cuando se supone que al regresar, la nueva relación ya está dada de alta en la BD y se vuelve a leer esta, la nueva relación no aparece. Es necesario cerrar la forma de Historia Clinica y volverla a abrir para poder ver la nueva relacion heredofamiliar que se dio de alta.

Si se supone que estoy liberando la instancia de la forma secundaria (frm_Hdofamiliares) se supone que lo hace y acaba las transacciones que hayan quedado; y si posterioremente abro y cierro la BD para volver a leer las relaciones heredofamiliares, se supone que va a leer la recién ingresada, no?

Que estoy haciendo mal? O no debo hacerlo a nivel query y tengo que hacerlo por otro método?

Gracias de antemano por la ayuda

joal 06-04-2007 19:18:49

Ok. Ya me respondi yo solo.
 
Después de haber leído algunos posteos como los de hacer Refresh sobre el datasource, el que a veces no funciona como comenta vtdeleon y algunos otros comentarios, empece a usar el método heurístico (lease pruebayerror + aversipega) a fin de tratar de resolver esto.

La solución la encontré validando si había una transacción activa en la forma padre y de ser afirmativo, decir que la terminara. El código quedó como sigue.

Código Delphi [-]
procedure Tfrm_HistoriaClinica.PopulaHeredofamiliares;
begin
  lb_Heredofamiliares.Items.Clear;
  // esto no deberia ir en la forma invocada?
  if dm_Heredofamiliares.ibt_IBTransaction.Active then
    dm_Heredofamiliares.ibt_IBTransaction.Commit;
  with dm_Heredofamiliares.ibq_IBQuery do
    begin
    Close;
    ... etc.

lo que me pareció extraño es que tengo que hacer referencia a la transacción de la forma padre (HistoriaClinica) en lugar de la transaccion de la forma hija (Heredofamiliar) ya que fue con los recursos de esta última con lo que realice la operación sobre la BD e hice la transacción. No se si es que al refererirse a la misma tabla, el problema con el commit sea a nivel sesión de BD y no a nivel de forma.

enfin, lo dejo por si a alguien más le es de utilidad. gracias


La franja horaria es GMT +2. Ahora son las 21:31:43.

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