PDA

Ver la Versión Completa : Actualizar un campo de un registro


alcides
22-05-2007, 15:18:33
Hola a todos,

uitlizo delphi 7 y mis tablas estan en access.

tengo dos tablas con muchos registros, Tbl_Encabezado y Tbl_Encabezado_Giros tienen un campo igual que es el numero_transacion, la tabla Tbl_Encabezado_Giros tiene un campo llamado Tasa_Giros que tiene valor y la tabla Tbl_Encabezado tiene un campo que se llama Tasa que no tiene valor. Lo que quiero es ir actualizando el campo Tasa con el campo Tasa_Giros siempre que el campo numero_transacion de las tablas sean iguales.

de ante mano gracias mil por la ayuda que me puedan brindar.


Gracias mil


Alcides
Rep.Dom.

alcides
22-05-2007, 20:28:53
/// esto es lo que tengo y no he podido conseguir el resultado ////


qry_Encabezado_giros_dolares.Close;
qry_Encabezado_giros_dolares.Parameters.ParamByName('pfecha_inicial').Value := strtodate(fecha_inicial.Text);
qry_Encabezado_giros_dolares.Parameters.ParamByName('pfecha_final').Value := strtodate(fecha_final.Text);
qry_Encabezado_giros_dolares.Open;
While not qry_Encabezado_giros_dolares.eof do begin


ls_numero := qry_encabezado_giros_dolaresnumero_giros_dolares.Value;
ls_fecha := qry_encabezado_giros_dolaresfecha_giros_dolares.Value;
end;
////////////////////
qry_Encabezado.Close;
with qry_Encabezado do begin
with sql do begin
clear;
add ('select * from Encabezado');
add ('where numero_transacion ='+IntToStr(ls_numero));
open;

Tbl_Encabezado.Edit;
Tbl_Encabezado.FieldByName('ccdebito').Value := qry_encabezado_giros_dolarestasa_cambio_giros_dolares.Value;
Tbl_Encabezado.Post;
end;
end;
Tbl_Encabezado.Close;
Tbl_Encabezado.Open;
qry_Encabezado_giros_dolares.next

end;

Lepe
22-05-2007, 20:46:28
Una pequeña mejoría:

with qry_Encabezado.sql do
begin
clear;
add ('Update Encabezado ');
add ('set ccdebito = :debito');
add ('where numero_transacion = :numTran');
end;
qry_Encabezado.Prepare;

qry_Encabezado_giros_dolares.Close;
qry_Encabezado_giros_dolares.Parameters.ParamByName('pfecha_inicial').Value := strtodate(fecha_inicial.Text);
qry_Encabezado_giros_dolares.Parameters.ParamByName('pfecha_final').Value := strtodate(fecha_final.Text);

qry_Encabezado_giros_dolares.Open;
While not qry_Encabezado_giros_dolares.eof do
begin
ls_numero := qry_encabezado_giros_dolaresnumero_giros_dolares.Value;
ls_fecha := qry_encabezado_giros_dolaresfecha_giros_dolares.Value;

with qry_Encabezado.Parameters do
begin
Parambyname('numTran').Value := IntToStr(ls_numero);
Parambyname('debito').Value := qry_encabezado_giros_dolarestasa_cambio_giros_dolares.Value;
end;
qry_Encabezado.ExecSql;
qry_Encabezado_giros_dolares.next
end;


Edito: Quizás sabiendo el select de qry_Encabezado_giros_dolares (jarabe para el nombrecito :D) se puede optimizar y hacer en una sola consulta update... no sé.

Saludos

alcides
22-05-2007, 20:59:18
wao, Lepe, perfecto.


gracias mil,

Alcides
Rep.Dom.

Gaby123
22-05-2007, 21:08:31
Hola
Primero tienes el end del while que recorre qry_Encabezado_giros_dolares en un lugar equivocado puesto que lo unico que hace es cambiar los valores a las 2 variables.

While not qry_Encabezado_giros_dolares.eof do begin
ls_numero := qry_encabezado_giros_dolaresnumero_giros_dolares.Value;
ls_fecha := qry_encabezado_giros_dolaresfecha_giros_dolares.Value;
end;

Segundo, la tabla Tbl_Encabezado no la recorres, solo la abres y la cierras, por lo que siempre editaras el primer registro.

Si tratas de hacerlo mas o menos asi pueda que te sirva
While not qry_Encabezado_giros_dolares.eof do
begin
ls_numero := qry_encabezado_giros_dolaresnumero_giros_dolares.Value;
ls_fecha := qry_encabezado_giros_dolaresfecha_giros_dolares.Value;
qry_Encabezado.Close;
with qry_Encabezado do
sql.clear;
sql.add ('update Encabezado set Tasa= :nuevo_valor where numero_transacion =:numero_tran'); //cambiado por un update
qry_encabezado.parambyname('numero_tran').value:=IntToStr(ls_numero);
qry_encabezado.parambyname('nuevo_valor').value:=qry_encabezado_giros_dolarestasa_cambio_giros_dolar es.Value;
qry_encabezado.execsql;
end;
end;
qry_Encabezado_giros_dolares.next;
end; //while
Espero que te ayude de algo

alcides
22-05-2007, 21:19:33
Gracias mil, gaby123, por tus recomendaciones.

gracias



Alcides
Rep.Dom.

Lepe
23-05-2007, 10:20:31
Un detalle: La idea, es que la qry_Encabezado esté preparada (prepared) y su sql no se modifique durante el bucle principal, por eso la saqué fuera del bucle qry_Encabezados_giros. Al estar preparada, la consulta se compila en el servidor haciendo más rápida su ejecución .

Pero insisto, si se sabe la sql de selección de qry_Encabezados_giros, se puede construir una sola sql que se lance y que lo haga todo, sin bucles y será muchísimo más rápido que actualmente.

la consulta (adivinando los nombres de campos) sería algo así:

update Encabezado E INNER JOIN encabezado_giros EG on E.numero_transaccion = EG.numero_transaccion
set E.ccdebito = EG.tasa_cambio_giros_dolares
where fecha between :fini and :ffin

Ahora solo hace falta pasarle los parámetros y lanzarla con ExecSql.

Saludos