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)
-   -   Problemas modificando una tabla (https://www.clubdelphi.com/foros/showthread.php?t=61979)

dakar08 28-11-2008 21:30:36

Problemas modificando una tabla
 
Hola,
Mi nombre es Jordi, vivo cerca de Valencia, y llevo casi 10 años programando en Delphi.
Saludos a tod@s!!!
Llevo el programa de gestión de un centro médico, el cual empecé el año 99 en Delphi5, y sigo con esa versión por miedo a incompatibilidades.
Uso una BBDD en Interbase. Empecé con v5.5, ahora uso la versión 8.1 (2007).
Nunca he tenido problemas con el programa, pero ahora me ocurre una cosa que no llego a comprender, por eso os pido ayuda:

Una factura incluye varias visitas. Las visitas facturadas las marco Facturado=Si.
Cuando editamos una factura que ya existe, se permite modificar las fechas de facturación
Si se cambian, es necesario desmarcar Facturado=Si de las visitas de la factura original y marcar las nuevas, de la siguiente forma:
-desmarcar: MarcarVisitesFacturades( True );
-marcar: MarcarVisitesFacturades( False );
Las funciones se llaman una detrás de otra, modificando las fechas (Data0 y Data1) antes de la segunda llamada.

Código Delphi [-]

procedure TGenFact.MarcarVisitesFacturades( bDesmarcar: Boolean );

begin

  with DBmodule.Query do

  begin

    Close;

    try

      SQL.Clear;

      SQL.Add( 'UPDATE Visita' );

      SQL.Add( 'set Facturat = :Fac' );

      SQL.Add( 'where Mutua = :CodMut' );

      SQL.Add( 'and Tipo = :TipMut' );

      SQL.Add( 'and DataFact >= :Data0 and DataFact <= :Data1' );

 

      if bDesmarcar then

        ParamByName('Fac').AsString := 'N'

      else

        ParamByName('Fac').AsString := 'S';

      ParamByName('CodMut').AsString := CodMut.Text;

      ParamByName('TipMut').AsString := TipMut.Text;

      ParamByName('Data0').AsDate := Data0.Date;

      ParamByName('Data1').AsDate := Data1.Date;

    finally

      ExecSql;

    end;

  end;

end;

Por alguna razón que desconozco, la querie de MarcarVisitesFacturades( False ) no actualiza la base de datos al momento. Es necesario cerrar el programa totalmente y volver a entrar para ver que las visitas están facturadas… ¿Por qué pasa esto?
Únicamente cerrando y abriendo el form de facturación no se actualizan.

En el FormClose hago DBModule.Query.Close;

Esta es la llamada al form de facturación, ¿quizás el “Free” no es correcto? Con “Release” el problema sigue…

Código Delphi [-]

with TGenFact.Create(Application) do

try

  Tag := 1;   // Nova factura

  TipMut.Text := aTipMut[ cbMutues.ItemIndex ];

  CodMut.Text := IntToStr( aMutues[ cbMutues.ItemIndex ] );

  NomMut.Text := cbMutues.Text;

 

  ShowModal;

finally

  Free;

end;

Agradezco de antemano cualquier ayuda o pista para llegar a solucionar este problema.

Saludos cordiales,
Jordi

Caral 28-11-2008 21:42:28

Hola
No entiendo donde se hace referencia a verdadero o falso aqui?.
Código Delphi [-]
      if bDesmarcar then
Tampoco la necesidad del try, finally, sin excepción?
Saludos

Caral 28-11-2008 21:57:24

Hola
No se, esencialmente deberia funcinar.
Quizas asi:
Código Delphi [-]
procedure TGenFact.MarcarVisitesFacturades( bDesmarcar: Boolean );
begin
  with DBmodule.Query do
  begin
      try
      Close;      
      SQL.Clear;
      SQL.Add( 'UPDATE Visita' );
      SQL.Add( 'set Facturat = :Fac' );
      SQL.Add( 'where Mutua = :CodMut' );
      SQL.Add( 'and Tipo = :TipMut' );
      SQL.Add( 'and DataFact >= :data0 and DataFact <= :data1' );
       if bDesmarcar then
       begin
       ParamByName('Fac').AsString := 'N';
       end
       else
       ParamByName('Fac').AsString := 'S';
       ParamByName('CodMut').AsString := CodMut.Text;
       ParamByName('TipMut').AsString := TipMut.Text;
       ParamByName('Data0').AsDate := Data0.Date;
       ParamByName('Data1').AsDate := Data1.Date;
       finally
       ExecSql;
    end;
end;

end;
seguro que sabes mas que yo de esto, solo trato de dar ideas.
Saludos

maeyanes 28-11-2008 22:09:04

Hola...

Cita:

Empezado por Caral (Mensaje 328666)
Hola
No entiendo donde se hace referencia a verdadero o falso aqui?.
Código Delphi [-]
      if bDesmarcar then

Cuando evaluas una variable de tipo Boolean, puedes usar sin problemas la forma mostrada en el código. Lo que estás haciendo ahí es que si el valor de la variable es True haga tal cosa. Si quieres preguntar por el valor falso de la variable solamente haces if not bDesmarcar then.

Cita:

Tampoco la necesidad del try, finally, sin excepción?
Saludos
En cuanto al try..finally este no se usa para el manejo de excepciones, para eso es el try..except. El uso del try..finally es más bien para asegurarnos de que lo que está dentro de finally..end se ejecute aun así ocurra una excepción.

Código Delphi [-]
// Ejemplo más común del uso del try..finally
Form1 := TForm1.Create(nil);
try
  // Mostramos la forma
  Form1.ShowModal
finally
  // Nos aseguramos que la forma se destruya aun así ocurra un error 
  // dentro de Form1.ShowModal
  Form1.Free
end;


Saludos...

maeyanes 28-11-2008 22:17:31

Hola...

No le veo caso al uso del try..finally que esás usando, así que lo quité.

Código Delphi [-]
procedure TGenFact.MarcarVisitesFacturades(bDesmarcar: Boolean);
begin
  with DBmodule.Query do
  begin
    Close;      
    SQL.Clear;
    SQL.Add('UPDATE Visita');
    SQL.Add('set Facturat = :Fac');
    SQL.Add('where Mutua = :CodMut');
    SQL.Add('and Tipo = :TipMut');
    SQL.Add('and DataFact >= :Data0 and DataFact <= :Data1');
    if bDesmarcar then
      ParamByName('Fac').AsString := 'N'
    else
      ParamByName('Fac').AsString := 'S';
    ParamByName('CodMut').AsString := CodMut.Text;
    ParamByName('TipMut').AsString := TipMut.Text;
    ParamByName('Data0').AsDate := Data0.Date;
    ParamByName('Data1').AsDate := Data1.Date;
    ExecSql
  end
end;

Me imagino que estás usando los componentes IBX, si es así, ¿usas el componente TIBTransaction en tu aplicación?



Saludos...

Caral 28-11-2008 22:26:31

Hola
La edad y la vista no perdonan.
Saludos

coso 28-11-2008 23:08:56

Hola, se me ocurre que pueda pasarte por dos cosas:
- que te dejes la query cerrada, y no releas los cambios con un nuevo 'select' y query.Open despues de modificarlos.
- que tarde o espere en actualizarse la base de datos. No conozco interbase, pero en otros componentes de base de datos existe, por ejemplo, updatemode, donde se puede escoger UpdateMode := upWhereChanged, etc.. De todas maneras quiza te funcione mediante query.ApplyUpdates o query.Refresh

dakar08 03-12-2008 16:39:57

Gracias a todas por las repuestas! :)

coso, voy a profundizar en las pistas que me das... :eek:


La franja horaria es GMT +2. Ahora son las 02:39:23.

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