Mejora de DataTableUtils, y insercion de BeginUpdate y EndUpdate en los tratamientos de los detalles de toda la aplicacion

git-svn-id: https://192.168.0.254/svn/Proyectos.Tecsitel_FactuGES2/trunk@386 0c75b7a4-871f-7646-8a2f-f78d34cc349f
This commit is contained in:
roberto 2008-05-26 16:59:17 +00:00
parent 4609fb7704
commit c0a81786db
15 changed files with 119 additions and 25 deletions

View File

@ -34,10 +34,10 @@ function CloneDataTable(const ASource : TDAMemDataTable;
procedure DuplicarRegistro(ASource : TDADataTable; ATarget : TDADataTable; procedure DuplicarRegistro(ASource : TDADataTable; ATarget : TDADataTable;
Const WithKey: Boolean = False); Const WithPKKey: Boolean = False; Const WithFKKey: Boolean = False);
procedure DuplicarRegistros(ASource : TDADataTable; ATarget : TDADataTable; procedure DuplicarRegistros(ASource : TDADataTable; ATarget : TDADataTable;
AModo : TModoDuplicarRegistros; APermitirRepetidos: Boolean = True; AModo : TModoDuplicarRegistros; APermitirRepetidos: Boolean = True;
Const WithDeltas: Boolean = True; Const WithKey: Boolean = False); Const WithDeltas: Boolean = True; Const WithPKKey: Boolean = False; Const WithFKKey: Boolean = False);
procedure DeleteAllTable(const ADataTable : TDADataTable); procedure DeleteAllTable(const ADataTable : TDADataTable);
@ -418,7 +418,7 @@ begin
end; end;
end; end;
procedure DuplicarRegistro(ASource : TDADataTable; ATarget : TDADataTable; Const WithKey: Boolean = False); procedure DuplicarRegistro(ASource : TDADataTable; ATarget : TDADataTable; Const WithPKKey: Boolean = False; Const WithFKKey: Boolean = False);
var var
i, j: Integer; i, j: Integer;
ATargetField: TDAField; ATargetField: TDAField;
@ -467,19 +467,40 @@ begin
// Los campos AutoInc no se rellenan y tampoco los campos que // Los campos AutoInc no se rellenan y tampoco los campos que
// formen parte de la relación maestro-detalle en el // formen parte de la relación maestro-detalle en el
// caso de que la tabla destino sea una tabla detalle. // caso de que la tabla destino sea una tabla detalle.
if not WithKey then if not WithPKKey then
begin begin
//Si no es campo clave //Si no es campo clave
if not (ATargetField.InPrimaryKey) and
//Si no es autoinc (podria desaparecer pero no lo quitamos por si acaso //Si no es autoinc (podria desaparecer pero no lo quitamos por si acaso
(ATargetField.DataType <> datAutoInc) and if not (ATargetField.InPrimaryKey) and
//Si no hay campos foreing key o los hay pero el campo a copiar no es uno de ellos (ATargetField.DataType <> datAutoInc) then
(not Assigned(ADetailFields) or not ADetailFields.Find(ATargetField.Name, j)) then begin
//Copiamos el campo //En el caso de no copiar las claves foraneas
ATargetField.Value := ASourceField.Value; //Si no hay campos foreing key o los hay pero el campo a copiar no es uno de ellos
if not WithFKKey then
begin
if (not Assigned(ADetailFields) or not ADetailFields.Find(ATargetField.Name, j)) then
//Copiamos el campo
ATargetField.Value := ASourceField.Value;
end
else
//Copiamos el campo
ATargetField.Value := ASourceField.Value;
end;
end end
else else
ATargetField.Value := ASourceField.Value; //En el caso de no copiar las claves foraneas
//Si no hay campos foreing key o los hay pero el campo a copiar no es uno de ellos
if not WithFKKey then
begin
//Si no hay campos foreing key o los hay pero el campo a copiar no es uno de ellos
if (not Assigned(ADetailFields) or not ADetailFields.Find(ATargetField.Name, j)) then
//Copiamos el campo
ATargetField.Value := ASourceField.Value;
end
else
//Copiamos el campo
ATargetField.Value := ASourceField.Value;
end; end;
end; end;
finally finally
@ -491,7 +512,7 @@ end;
procedure DuplicarRegistros(ASource : TDADataTable; ATarget : TDADataTable; procedure DuplicarRegistros(ASource : TDADataTable; ATarget : TDADataTable;
AModo : TModoDuplicarRegistros; APermitirRepetidos: Boolean = True; AModo : TModoDuplicarRegistros; APermitirRepetidos: Boolean = True;
Const WithDeltas: Boolean = True; Const WithKey: Boolean = False); Const WithDeltas: Boolean = True; Const WithPKKey: Boolean = False; Const WithFKKey: Boolean = False);
begin begin
if not ASource.Active then if not ASource.Active then
ASource.Open; ASource.Open;
@ -505,18 +526,18 @@ begin
DesconectarTabla(ATarget); DesconectarTabla(ATarget);
if AModo = mdrActual then if AModo = mdrActual then
DuplicarRegistro(ASource, ATarget, WithKey) //ATarget.CloneSelectedRecord(ASource, True) DuplicarRegistro(ASource, ATarget, WithPKKey, WithFKKey) //ATarget.CloneSelectedRecord(ASource, True)
else begin else begin
ASource.First; ASource.First;
while not ASource.EOF do while not ASource.EOF do
begin begin
if APermitirRepetidos then if APermitirRepetidos then
DuplicarRegistro(ASource, ATarget, WithKey) DuplicarRegistro(ASource, ATarget, WithPKKey, WithFKKey)
else else
begin begin
ATarget.First; ATarget.First;
if not ATarget.Locate('ID', ASource.FieldByName('ID').AsVariant, []) then if not ATarget.Locate('ID', ASource.FieldByName('ID').AsVariant, []) then
DuplicarRegistro(ASource, ATarget, WithKey); DuplicarRegistro(ASource, ATarget, WithPKKey, WithFKKey);
end; end;
ASource.Next; ASource.Next;

View File

@ -198,6 +198,11 @@ begin
ADetallesController := TDetallesAlbaranProveedorController.Create; ADetallesController := TDetallesAlbaranProveedorController.Create;
AArticulosController := TArticulosController.Create; AArticulosController := TArticulosController.Create;
try try
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADetalles);
AInventarioRecibido.DataTable.First; AInventarioRecibido.DataTable.First;
for i := 0 to AInventarioRecibido.DataTable.RecordCount - 1 do for i := 0 to AInventarioRecibido.DataTable.RecordCount - 1 do
begin begin
@ -228,8 +233,8 @@ begin
AInventarioRecibido.Next; AInventarioRecibido.Next;
end; end;
finally finally
ADetallesController.EndUpdate(ADetalles);
ADetallesController := NIL; ADetallesController := NIL;
AArticulosController := NIL; AArticulosController := NIL;
end; end;
@ -243,6 +248,11 @@ begin
ADetallesController := TDetallesAlbaranProveedorController.Create; ADetallesController := TDetallesAlbaranProveedorController.Create;
AArticulosController := TArticulosController.Create; AArticulosController := TArticulosController.Create;
try try
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADetalles);
APedido.Detalles.DataTable.First; APedido.Detalles.DataTable.First;
for i := 0 to APedido.Detalles.DataTable.RecordCount - 1 do for i := 0 to APedido.Detalles.DataTable.RecordCount - 1 do
begin begin
@ -265,11 +275,8 @@ begin
APedido.Detalles.Next; APedido.Detalles.Next;
end; end;
//Obligamos a actualizar los totales para que asi los importes totales de los artículos
//se recalculen y actualicen
ADetallesController.ActualizarTotales(ADetalles);
finally finally
ADetallesController.EndUpdate(ADetalles);
ADetallesController := NIL; ADetallesController := NIL;
AArticulosController := NIL; AArticulosController := NIL;
end; end;

View File

@ -3,7 +3,7 @@ unit schArticulosClient_Intf;
interface interface
uses uses
Classes, DB, SysUtils, uROClasses, uDADataTable, FmtBCD, uROXMLIntf; Classes, DB, schBase_Intf, SysUtils, uROClasses, uDADataTable, FmtBCD, uROXMLIntf;
const const
{ Data table rules ids { Data table rules ids
@ -254,7 +254,7 @@ type
end; end;
{ TArticulosDataTableRules } { TArticulosDataTableRules }
TArticulosDataTableRules = class(TDADataTableRules, IArticulos) TArticulosDataTableRules = class(TIntfObjectDADataTableRules, IArticulos)
private private
f_IMAGEN: IROStream; f_IMAGEN: IROStream;
procedure IMAGEN_OnChange(Sender: TObject); procedure IMAGEN_OnChange(Sender: TObject);
@ -544,7 +544,7 @@ type
end; end;
{ TArticulosParaClienteDataTableRules } { TArticulosParaClienteDataTableRules }
TArticulosParaClienteDataTableRules = class(TDADataTableRules, IArticulosParaCliente) TArticulosParaClienteDataTableRules = class(TIntfObjectDADataTableRules, IArticulosParaCliente)
private private
f_IMAGEN: IROStream; f_IMAGEN: IROStream;
procedure IMAGEN_OnChange(Sender: TObject); procedure IMAGEN_OnChange(Sender: TObject);

View File

@ -141,6 +141,11 @@ begin
ADetallesController := TDetallesFacturaClienteController.Create; ADetallesController := TDetallesFacturaClienteController.Create;
try try
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADestino);
AOrigen.DataTable.First; AOrigen.DataTable.First;
for i := 0 to AOrigen.DataTable.RecordCount - 1 do for i := 0 to AOrigen.DataTable.RecordCount - 1 do
begin begin
@ -161,6 +166,7 @@ begin
AOrigen.Next; AOrigen.Next;
end; end;
finally finally
ADetallesController.EndUpdate(ADestino);
ADetallesController := NIL; ADetallesController := NIL;
end; end;
end;} end;}
@ -186,6 +192,11 @@ begin
ADetallesController := TDetallesFacturaClienteController.Create; ADetallesController := TDetallesFacturaClienteController.Create;
try try
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADestino);
AOrigen.DataTable.First; AOrigen.DataTable.First;
for i := 0 to AOrigen.DataTable.RecordCount - 1 do for i := 0 to AOrigen.DataTable.RecordCount - 1 do
begin begin
@ -206,6 +217,7 @@ begin
AOrigen.Next; AOrigen.Next;
end; end;
finally finally
ADetallesController.EndUpdate(ADestino);
ADetallesController := NIL; ADetallesController := NIL;
end; end;
end; end;

View File

@ -141,6 +141,11 @@ begin
ADetallesController := TDetallesFacturaProveedorController.Create; ADetallesController := TDetallesFacturaProveedorController.Create;
try try
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADestino);
AOrigen.DataTable.First; AOrigen.DataTable.First;
for i := 0 to AOrigen.DataTable.RecordCount - 1 do for i := 0 to AOrigen.DataTable.RecordCount - 1 do
begin begin
@ -161,6 +166,7 @@ begin
AOrigen.Next; AOrigen.Next;
end; end;
finally finally
ADetallesController.EndUpdate(ADestino);
ADetallesController := NIL; ADetallesController := NIL;
end; end;
end; end;
@ -185,6 +191,11 @@ begin
ADetallesController := TDetallesFacturaProveedorController.Create; ADetallesController := TDetallesFacturaProveedorController.Create;
try try
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADestino);
AOrigen.DataTable.First; AOrigen.DataTable.First;
for i := 0 to AOrigen.DataTable.RecordCount - 1 do for i := 0 to AOrigen.DataTable.RecordCount - 1 do
begin begin
@ -205,6 +216,7 @@ begin
AOrigen.Next; AOrigen.Next;
end; end;
finally finally
ADetallesController.EndUpdate(ADestino);
ADetallesController := NIL; ADetallesController := NIL;
end; end;
end; end;

View File

@ -103,6 +103,11 @@ begin
AArticulosPendientes.DataTable.First; AArticulosPendientes.DataTable.First;
for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do
begin begin
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADetalles);
AAlbaran.Detalles.First; AAlbaran.Detalles.First;
if (AAlbaran.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then if (AAlbaran.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then
if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then
@ -124,6 +129,7 @@ begin
end; end;
end; end;
finally finally
ADetallesController.EndUpdate(ADetalles);
ADetallesController := NIL; ADetallesController := NIL;
end; end;
end; } end; }

View File

@ -103,6 +103,11 @@ begin
AArticulosPendientes.DataTable.First; AArticulosPendientes.DataTable.First;
for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do
begin begin
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADetalles);
AAlbaran.Detalles.First; AAlbaran.Detalles.First;
if (AAlbaran.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then if (AAlbaran.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then
if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then
@ -124,6 +129,7 @@ begin
end; end;
end; end;
finally finally
ADetallesController.EndUpdate(ADetalles);
ADetallesController := NIL; ADetallesController := NIL;
end; end;
end; } end; }

View File

@ -98,6 +98,11 @@ begin
AArticulosPendientes.DataTable.First; AArticulosPendientes.DataTable.First;
for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do
begin begin
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADetalles);
APedido.Detalles.First; APedido.Detalles.First;
if (APedido.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then if (APedido.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then
if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then
@ -120,6 +125,7 @@ begin
end; end;
end; end;
finally finally
ADetallesController.EndUpdate(ADetalles);
ADetallesController := NIL; ADetallesController := NIL;
end; end;
end; end;

View File

@ -122,6 +122,11 @@ begin
APedidoProv.ID_PEDIDO_CLIENTE := APedidoCli.ID; APedidoProv.ID_PEDIDO_CLIENTE := APedidoCli.ID;
end; end;
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(APedidoProv.Detalles);
ADetallesPedidosProvController.Add(APedidoProv.Detalles, TIPO_DETALLE_CONCEPTO); ADetallesPedidosProvController.Add(APedidoProv.Detalles, TIPO_DETALLE_CONCEPTO);
ADetallesPedidosProvController.AnadirArticulo(APedidoProv.Detalles, AArticulosPend.ID_ARTICULO); ADetallesPedidosProvController.AnadirArticulo(APedidoProv.Detalles, AArticulosPend.ID_ARTICULO);
with APedidoProv.Detalles do with APedidoProv.Detalles do
@ -130,6 +135,7 @@ begin
CANTIDAD := AArticulosPend.CANT_PENDIENTE_PEDIR; CANTIDAD := AArticulosPend.CANT_PENDIENTE_PEDIR;
Post; Post;
end; end;
ADetallesController.EndUpdate(APedidoProv.Detalles);
AArticulosPend.DataTable.Next; AArticulosPend.DataTable.Next;
end; end;

View File

@ -100,6 +100,11 @@ begin
AArticulosPendientes.DataTable.First; AArticulosPendientes.DataTable.First;
for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do
begin begin
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADetalles);
APedido.Detalles.First; APedido.Detalles.First;
if (APedido.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then if (APedido.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then
if (AArticulosPendientes.CANTIDAD > 0) then if (AArticulosPendientes.CANTIDAD > 0) then
@ -122,6 +127,7 @@ begin
end; end;
end; end;
finally finally
ADetallesController.EndUpdate(ADetalles);
ADetallesController := NIL; ADetallesController := NIL;
end; end;
end; end;

View File

@ -102,6 +102,11 @@ begin
AArticulosPendientes.DataTable.First; AArticulosPendientes.DataTable.First;
for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do
begin begin
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADetalles);
APedido.Detalles.First; APedido.Detalles.First;
if (APedido.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then if (APedido.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then
if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then
@ -123,6 +128,7 @@ begin
end; end;
end; end;
finally finally
ADetallesController.EndUpdate(ADetalles);
ADetallesController := NIL; ADetallesController := NIL;
end; end;
end; } end; }

View File

@ -102,6 +102,11 @@ begin
AArticulosPendientes.DataTable.First; AArticulosPendientes.DataTable.First;
for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do
begin begin
//OJO IMPORTANTE
//Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
//obligarle siempre a recalcular los detalles una sola vez
ADetallesController.BeginUpdate(ADetalles);
APedido.Detalles.First; APedido.Detalles.First;
if (APedido.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then if (APedido.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then
if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then
@ -123,6 +128,7 @@ begin
end; end;
end; end;
finally finally
ADetallesController.EndUpdate(ADetalles);
ADetallesController := NIL; ADetallesController := NIL;
end; end;
end; } end; }

Binary file not shown.

View File

@ -14,7 +14,7 @@ BEGIN
BEGIN BEGIN
VALUE "FileVersion", "1.0.4.0\0" VALUE "FileVersion", "1.0.4.0\0"
VALUE "ProductVersion", "1.0.4.0\0" VALUE "ProductVersion", "1.0.4.0\0"
VALUE "CompileDate", "martes, 20 de mayo de 2008 20:39\0" VALUE "CompileDate", "lunes, 26 de mayo de 2008 18:50\0"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"