Yo lo hago por medio de esta función en el datamodulo a la que le envío como parametro el form
Código Delphi
[-]
procedure TDM.Guardar(frmForma: TForm);
var
i: integer;
iTamanioArreglo: Integer;
dsArreglo: array of TDataSource;
begin
iTamanioArreglo := 0;
for i:= 0 to Pred(frmForma.ComponentCount) do
if frmForma.Components[i] is TDataSource then
begin
Inc(iTamanioArreglo);
SetLength(dsArreglo, iTamanioArreglo);
dsArreglo[Pred(iTamanioArreglo)] := TDataSource(frmForma.Components[i]);
end;
with TransaccionEscritura do
try
if not InTransaction then
StartTransaction;
for i := 0 to High(dsArreglo) do
dsArreglo[i].DataSet.Post;
CommitRetaining;
except
RollbackRetaining;
raise
end;
end;
En mi form al momento de llamar el action que guarda ejecuto
Código Delphi
[-]
procedure TfrmModulo.actGuardarExecute(Sender: TObject);
begin
DM.Guardar(Self)
end;