PDA

Ver la Versión Completa : RefreshRecord


ArtPortEsp
13-06-2018, 18:16:04
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:
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:

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, 18: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, 18:58:32
Los pasos a seguir son:
query.close;
query.selectsql.text:='select ...';
query.open;

ArtPortEsp
13-06-2018, 19:13:50
Los pasos a seguir son:
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, 19:32:46
Bien, es que no sé qué componentes estás usando, ni el contexto de esas instrucciones.

ArtPortEsp
13-06-2018, 20:15:59
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, 22:01:29
Hola.

..., 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:

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 :)