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)
-   -   RefreshRecord (https://www.clubdelphi.com/foros/showthread.php?t=93199)

ArtPortEsp 13-06-2018 19:16:04

RefreshRecord
 
Buen dia compañeros....

a ver si alguno de ustedes les ha pasado esto...

tengo un TQuery en una forma, que tiene asignada la siguiente sentencia:
Código:

Select sl_aseg as asegurado,
cl_telc,cl_telo,cl_telo2,cl_celu,cl_expe,cl_email,cl_email2,cl_indica,
CAST((CASE When p.sl_edo = 'V' then 'VIGENTE'
When p.sl_edo = 'X' then 'REEXPEDIDA'
When p.sl_edo = 'V' and CURDATE() > p.sl_vig2 then 'VENCIDA'
When p.sl_edo = 'C' and (SL_RENOV is null or SL_RENOV='') then 'CANCELADA'
when p.sl_edo = 'C' and (SL_RENOV is not null) then 'RENOVADA' End) as char) as estado,
CAST((CASE When p.sl_fpa = 2 THEN 'SEMESTRAL'
When p.sl_fpa = 3 THEN 'TRIMESTRAL'
When p.sl_fpa = 4 THEN 'MENSUAL'
When p.sl_fpa = 5 THEN 'CUATRIMESTRAL'
When p.sl_fpa = 6 THEN 'QUINCENAL'
When p.sl_fpa = 7 THEN 'CATORCENAL'
When p.sl_fpa = 8 THEN 'ESP. 10 RECIBOS'
When p.sl_fpa = 1 THEN 'CONTADO' END) AS CHAR) as formapag,
CAST((CASE when p.sl_vpag='E' then 'ELECTRONICA'
when p.sl_vpag='A'  then 'AGENTE'
when p.sl_vpag='VA' then 'VALE'
when p.sl_vpag='M'  then 'MIXTA' end) as char) as viapago,
sl_pol as re_pol,sl_sol,
sl_pri,sl_descto,sl_derp,sl_pfra,sl_iva,sl_cia,sl_vig1,sl_vig2,sl_obs1,sl_vpag,
((sl_pri-sl_descto)+sl_iva+sl_derp+sl_pfra) as totpol,
po_nom as ramdesc,po_tipo as ramtipo,'' as cobdesc,nom as ciadesc, nom,
garantiapag,garanemision,garanaplicacion
from polizas p
inner join compania on sl_cia=cia
inner join clientes on cl_num=sl_num
inner join ramos on po_cve=sl_tipo

Todo en orden cuando ejecuto el query, sin embargo, cuando en tiempo de ejecucion, actualizo uno de esos registros me dice que el campo "estado" no existe en la lista de campos

El codigo que utilizo para actualizar la informacion del registro es:

Código Delphi [-]
     Qpolizas.DisableControls;
     If Evale.Text <> '' then
     begin
          Dm.Qactualiza.SQL.text := 'update polizas set garantiapag='+quotedstr(Evale.text)+
                                    ',garanemision='+quotedstr(formatdatetime('yyyy-mm-dd',Efechaval.date))+
                                    ',garanaplicacion='+quotedstr(formatdatetime('yyyy-mm-dd',date))+
                                    ' where sl_pol='+quotedstr(Qpolizas.fieldbyname('re_pol').asstring)+
                                    ' and sl_cia='+quotedstr(Qpolizas.fieldbyname('sl_cia').asstring);
     end
     else
     begin
          Dm.Qactualiza.SQL.text := 'update polizas set garantiapag='+quotedstr('')+
                                    ',garanemision=:nulfecha,garanaplicacion=:nulfecha'+
                                    ' where sl_pol='+quotedstr(Qpolizas.fieldbyname('re_pol').asstring)+
                                    ' and sl_cia='+quotedstr(Qpolizas.fieldbyname('sl_cia').asstring);
          Dm.Qactualiza.ParamByName('nulfecha').Clear;
     end;
     Qpolizas.EnableControls;
     Qpolizas.RefreshRecord;

Alguna idea?

ArtPortEsp 13-06-2018 19:29:33

Por cierto, en el segundo codigo me falto la linea : DM.Qactualiza.Execute;

En el codigo que estoy probando si esta... perdon por la omision

Casimiro Notevi 13-06-2018 19:58:32

Los pasos a seguir son:
Código Delphi [-]
query.close;
query.selectsql.text:='select ...';
query.open;

ArtPortEsp 13-06-2018 20:13:50

Cita:

Empezado por Casimiro Notevi (Mensaje 527091)
Los pasos a seguir son:
Código Delphi [-]
query.close;
query.selectsql.text:='select ...';
query.open;

Pero... he usado RefreshRecord con anterioridad sin problema, no entiendo por que no funciona esta vez; mi sospecha es que es un campo "calculado" y no directo.

Y aun asi, no entiendo por que; es mas, creo que he usado refreshrecord ya con ese tipo de campos pero no puedo encontrar el ejemplo

Casimiro Notevi 13-06-2018 20:32:46

Bien, es que no sé qué componentes estás usando, ni el contexto de esas instrucciones.

ArtPortEsp 13-06-2018 21:15:59

Cita:

Empezado por Casimiro Notevi (Mensaje 527093)
Bien, es que no sé qué componentes estás usando, ni el contexto de esas instrucciones.

Tienes toda la razon...

Estoy usando TMyQuery de DEVART (MyDac).. conectados a una BD MySQL 5.6

El desarrollo esta en Delphi 7...

La verdad es mas frustrante que indispensable, igual puedo hacer lo que indicas, pero creo que es mas lento que el RefreshRecord, no se.

ecfisa 13-06-2018 23:01:29

Hola.
Cita:

Empezado por ArtPortEsp (Mensaje 527094)
..., pero creo que es mas lento que el RefreshRecord, no se.

No puedo aseverarlo en los componentes de DEVART, pero en todos los componentes que conozco, el método Refresh retiene la posición actual del cursor en la tabla luego la cierra, la abre y restaura la posición; por ese motivo no creo que tengas diferencia en los tiempos al usar un modo u otro.

Pero si lo que deseas es no perder la posición de antes de cerrar/abrir, podes hacer:
Código Delphi [-]
var
  BM: Pointer;
begin
  Qpolizas.DisableControls;
  try
    BM := Qpolizas.GetBookmark; // guardar posición
    try
      if Evale.Text <> '' then
      begin
        // acciones que mueven la posición en la tabla
        // ...
      end;
      Qpolizas.Close;
      Qpolizas.Open;
      Qpolizas.GotoBookmark(BM); // volver a posición guardada
    finally
      Qpolizas.FreeBookmark(BM); // liberar el puntero
    end;
  finally
    Qpolizas.EnableControls;
  end;
  Qpolizas.RefreshRecord;
end;

Saludos :)


La franja horaria es GMT +2. Ahora son las 03:38:22.

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