git-svn-id: https://192.168.0.254/svn/Proyectos.EstudioCarnicero_ProGestion/trunk@4 1b8572a8-2d6b-b84e-8c90-20ed86fa4eca
371 lines
11 KiB
ObjectPascal
371 lines
11 KiB
ObjectPascal
unit uEditorDBBase;
|
||
|
||
interface
|
||
|
||
uses
|
||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||
Dialogs, uEditorItem, ImgList, PngImageList, StdActns, ActnList, TBX,
|
||
TB2Item, TB2Dock, TB2Toolbar, ComCtrls, JvExControls, JvComponent,
|
||
JvNavigationPane, DB, uDADataTable, uEditorBase, JvFormAutoSize,
|
||
uDAScriptingProvider, uDACDSDataTable, AppEvnts, uCustomView, uViewBase,
|
||
JvAppStorage, JvAppRegistryStorage, JvFormPlacement,
|
||
pngimage, ExtCtrls, dxLayoutLookAndFeels, JvComponentBase;
|
||
|
||
type
|
||
IEditorDBBase = interface(IEditorBase)
|
||
['{497AE4CE-D061-4F75-A29A-320F8565FF54}']
|
||
end;
|
||
|
||
TfEditorDBBase = class(TfEditorBase, IEditorDBBase)
|
||
dsDataTable: TDADataSource;
|
||
procedure actRefrescarExecute(Sender: TObject);
|
||
procedure actAnteriorExecute(Sender: TObject);
|
||
procedure actSiguienteExecute(Sender: TObject);
|
||
procedure actAnteriorUpdate(Sender: TObject);
|
||
procedure actSiguienteUpdate(Sender: TObject);
|
||
procedure actRefrescarUpdate(Sender: TObject);
|
||
procedure actCancelarCambiosExecute(Sender: TObject);
|
||
procedure actGuardarExecute(Sender: TObject);
|
||
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); virtual;
|
||
procedure actEliminarExecute(Sender: TObject);
|
||
procedure actEliminarUpdate(Sender: TObject);
|
||
procedure actModificarUpdate(Sender: TObject);
|
||
procedure actPrevisualizarUpdate(Sender: TObject);
|
||
procedure actImprimirUpdate(Sender: TObject);
|
||
protected
|
||
FApplyUpdates: Boolean;
|
||
function GetModified: Boolean; override;
|
||
published
|
||
constructor Create(AOwner: TComponent); override;
|
||
end;
|
||
|
||
var
|
||
fEditorDBBase: TfEditorDBBase;
|
||
|
||
implementation
|
||
|
||
uses uExceptions, uDataTableUtils, uBizInformesBase,
|
||
uDAInterfaces, uBizImportesDetalleBase;
|
||
|
||
{$R *.dfm}
|
||
|
||
procedure TfEditorDBBase.actRefrescarExecute(Sender: TObject);
|
||
var
|
||
ACursor: TCursor;
|
||
ABookmark : TBookmark;
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
begin
|
||
if (dsDataTable.DataTable.IsEmpty) or (not ModifiedQuery) then
|
||
Exit; // No continuar con el refresco
|
||
|
||
ABookmark := dsDataTable.DataTable.GetBookMark;
|
||
// dsDataTable.DataTable.DisableControls; <- No descomentar
|
||
|
||
ACursor := Screen.Cursor;
|
||
Screen.Cursor := crHourGlass;
|
||
try
|
||
dsDataTable.DataTable.Refresh;
|
||
|
||
if dsDataTable.DataTable.Dataset.BookmarkValid(ABookmark) then
|
||
dsDataTable.DataTable.GotoBookmark(ABookmark);
|
||
finally
|
||
dsDataTable.DataTable.FreeBookmark(ABookmark);
|
||
// dsDataTable.DataTable.EnableControls; <- No descomentar
|
||
Screen.Cursor := ACursor;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actAnteriorExecute(Sender: TObject);
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
begin
|
||
if (not ModifiedQuery) then
|
||
Exit;
|
||
|
||
dsDataTable.DataTable.Prior;
|
||
end;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actSiguienteExecute(Sender: TObject);
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
begin
|
||
if (not ModifiedQuery) then
|
||
Exit;
|
||
|
||
dsDataTable.DataTable.Next;
|
||
end;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actAnteriorUpdate(Sender: TObject);
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
(Sender as TAction).Enabled := not dsDataTable.DataTable.BOF
|
||
else
|
||
(Sender as TAction).Enabled := False;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actSiguienteUpdate(Sender: TObject);
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
(Sender as TAction).Enabled := not dsDataTable.DataTable.EOF
|
||
else
|
||
(Sender as TAction).Enabled := False;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actRefrescarUpdate(Sender: TObject);
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) and
|
||
(not (dsDataTable.DataTable.State = dsInsert)) then
|
||
(Sender as TAction).Enabled := not (dsDataTable.DataTable.Fetching or
|
||
dsDataTable.DataTable.Opening or
|
||
dsDataTable.DataTable.Closing)
|
||
else
|
||
(Sender as TAction).Enabled := False;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actCancelarCambiosExecute(Sender: TObject);
|
||
var
|
||
dtDetails : TList;
|
||
i : integer;
|
||
ABookmark : TBookmark;
|
||
ACursor : TCursor;
|
||
AParche : IParche;
|
||
begin
|
||
inherited;
|
||
|
||
AParche := NIL;
|
||
|
||
if Assigned(dsDataTable.DataTable) then
|
||
begin
|
||
ABookmark := dsDataTable.DataTable.GetBookMark;
|
||
dsDataTable.DataTable.DisableControls;
|
||
// dsDataTable.DataTable.DisableEventHandlers; <- No descomentar
|
||
|
||
ACursor := Screen.Cursor;
|
||
Screen.Cursor := crHourGlass;
|
||
|
||
{ No lo pongo en try..finally para ver posibles errores }
|
||
//try
|
||
dsDataTable.DataTable.Cancel;
|
||
|
||
dtDetails := dsDataTable.DataTable.GetDetailDataTables;
|
||
for i := 0 to dtDetails.Count - 1 do
|
||
begin
|
||
(TDADataTable(dtDetails.Items[i])).Cancel;
|
||
|
||
{ PARCHE **********************************
|
||
OJO: Est<73> pensado para que s<>lo una de las tablas detalle
|
||
soporte el interfaz de IParche }
|
||
if not Assigned(AParche) and
|
||
Supports((TDADataTable(dtDetails.Items[i])), IParche, AParche) then
|
||
AParche.DesactivarEventos;
|
||
end;
|
||
|
||
dsDataTable.DataTable.CancelUpdates;
|
||
|
||
{ Comprobar si el bookmark no es v<>lido cuando estamos cancelando la
|
||
inserci<63>n de una fila nueva.
|
||
CUIDADO!! Si no es v<>lido salta una excepci<63>n. NO devuelve false!!!}
|
||
try
|
||
if (Assigned(ABookmark)) and
|
||
(dsDataTable.DataTable.Dataset.BookmarkValid(ABookmark)) then
|
||
dsDataTable.DataTable.GotoBookmark(ABookmark);
|
||
except
|
||
end;
|
||
|
||
{ PARCHE ********************************** }
|
||
if Assigned(AParche) then
|
||
begin
|
||
AParche.ActivarEventos;
|
||
AParche.Refrescar;
|
||
AParche := NIL;
|
||
end;
|
||
|
||
//finally
|
||
dsDataTable.DataTable.EnableControls;
|
||
dsDataTable.DataTable.FreeBookmark(ABookmark);
|
||
// dsDataTable.DataTable.EnableEventHandlers; <- No descomentar
|
||
Screen.Cursor := ACursor;
|
||
//end;
|
||
end;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actGuardarExecute(Sender: TObject);
|
||
var
|
||
dtDetails : TList;
|
||
i : integer;
|
||
|
||
ABookmark : TBookmark;
|
||
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
begin
|
||
if dsDataTable.DataTable.Editing then
|
||
dsDataTable.DataTable.Post;
|
||
|
||
dtDetails := dsDataTable.DataTable.GetDetailDataTables;
|
||
for i := 0 to dtDetails.Count - 1 do
|
||
if (TDADataTable(dtDetails.Items[i])).Editing then
|
||
(TDADataTable(dtDetails.Items[i])).Post;
|
||
|
||
//Esta parte se quitar<61> cuando cambien los detalles de facturas, se tiene que
|
||
//volver a hacer el post de la tabla maestro porque los eventos de calculo de
|
||
//importe total de los detalles cambian el campo base imponible entre otros de
|
||
//la cabecera y luego no se hace post esto provoca que se queden deltas perdidos
|
||
//y un pete que te cagas al dar a guardar sin salir del campo importe.
|
||
if dsDataTable.DataTable.Editing then
|
||
dsDataTable.DataTable.Post;
|
||
|
||
if FApplyUpdates then
|
||
begin
|
||
// ABookmark := dsDataTable.DataTable.GetBookMark;
|
||
try
|
||
dsDataTable.DataTable.ApplyUpdates;
|
||
// if dsDataTable.DataTable.Dataset.BookmarkValid(ABookmark) then
|
||
// dsDataTable.DataTable.GotoBookmark(ABookmark);
|
||
finally
|
||
// dsDataTable.DataTable.FreeBookmark(ABookmark);
|
||
end;
|
||
end;
|
||
|
||
Modified := False;
|
||
end;
|
||
end;
|
||
|
||
function TfEditorDBBase.GetModified: Boolean;
|
||
var
|
||
dtDetails : TList;
|
||
i : integer;
|
||
bCambiado : Boolean;
|
||
begin
|
||
bCambiado := False;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
begin
|
||
bCambiado := (dsDataTable.DataTable.State = dsEdit);
|
||
|
||
if FApplyUpdates then
|
||
if (not bCambiado) then
|
||
bCambiado := DeltaValuesAreDifferent(dsDataTable.DataTable.Delta);
|
||
|
||
if (not bCambiado) then
|
||
begin
|
||
dtDetails := dsDataTable.DataTable.GetDetailDataTables;
|
||
for i := 0 to dtDetails.Count - 1 do
|
||
begin
|
||
bCambiado := bCambiado or ((TDADataTable(dtDetails.Items[i])).State = dsEdit);
|
||
|
||
if FApplyUpdates then
|
||
if (not bCambiado) then
|
||
bCambiado := bCambiado or (DeltaValuesAreDifferent((TDADataTable(dtDetails.Items[i])).Delta));
|
||
|
||
if bCambiado then
|
||
Break;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
if (not bCambiado) then
|
||
bCambiado := inherited GetModified;
|
||
|
||
Result := bCambiado;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.FormCloseQuery(Sender: TObject;
|
||
var CanClose: Boolean);
|
||
begin
|
||
{ Para resetear el estado de la tabla en el caso de hacer un insert
|
||
sin meter ning<6E>n dato. }
|
||
if Assigned(dsDataTable.DataTable) and (not Modified) then
|
||
dsDataTable.DataTable.Cancel;
|
||
inherited;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actEliminarExecute(Sender: TObject);
|
||
var
|
||
aObj : IApplyUpdateFailedException;
|
||
ACursor: TCursor;
|
||
begin
|
||
inherited;
|
||
ACursor := Screen.Cursor;
|
||
Screen.Cursor := crHourGlass;
|
||
try
|
||
if dsDataTable.DataTable.State in dsEditModes then
|
||
dsDataTable.DataTable.Cancel;
|
||
dsDataTable.DataTable.Delete;
|
||
try
|
||
|
||
if FApplyUpdates then
|
||
dsDataTable.DataTable.ApplyUpdates;
|
||
|
||
Modified := False;
|
||
except
|
||
on E: EDAApplyUpdateFailed do
|
||
begin
|
||
dsDataTable.DataTable.CancelUpdates;
|
||
actRefrescar.Execute;
|
||
if Supports(dsDataTable.DataTable, IApplyUpdateFailedException, aObj) then
|
||
aObj.ShowApplyUpdateFailed(E);
|
||
end
|
||
else
|
||
raise; // Generic exception
|
||
end;
|
||
finally
|
||
Screen.Cursor := ACursor;
|
||
end;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actEliminarUpdate(Sender: TObject);
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
(Sender as TAction).Enabled := (not dsDataTable.DataTable.IsEmpty)
|
||
and not (dsDataTable.DataTable.State = dsInsert)
|
||
else
|
||
(Sender as TAction).Enabled := False;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actModificarUpdate(Sender: TObject);
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
(Sender as TAction).Enabled := (not dsDataTable.DataTable.IsEmpty)
|
||
else
|
||
(Sender as TAction).Enabled := False;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actPrevisualizarUpdate(Sender: TObject);
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
(Sender as TAction).Enabled := (not dsDataTable.DataTable.IsEmpty)
|
||
else
|
||
(Sender as TAction).Enabled := False;
|
||
end;
|
||
|
||
procedure TfEditorDBBase.actImprimirUpdate(Sender: TObject);
|
||
begin
|
||
inherited;
|
||
if Assigned(dsDataTable.DataTable) then
|
||
(Sender as TAction).Enabled := (not dsDataTable.DataTable.IsEmpty)
|
||
else
|
||
(Sender as TAction).Enabled := False;
|
||
end;
|
||
|
||
constructor TfEditorDBBase.Create(AOwner: TComponent);
|
||
begin
|
||
inherited;
|
||
FApplyUpdates := True;
|
||
end;
|
||
|
||
end.
|