Tecsitel_FactuGES2/Source/GUIBase/uEditorDBBase.pas

274 lines
7.8 KiB
ObjectPascal
Raw Permalink Blame History

unit uEditorDBBase;
interface
uses
Windows, SysUtils, Variants, Classes, Graphics, Controls, Forms,
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, TBXStatusBars,
JvExComCtrls, JvStatusBar, uDAInterfaces;
type
IEditorDBBase = interface(IEditorBase)
['{1F5B318F-F700-4C78-ABCE-E2329AD876B8}']
end;
TfEditorDBBase = class(TfEditorBase, IEditorDBBase)
dsDataTable: TDADataSource;
procedure actAnteriorExecute(Sender: TObject);
procedure actSiguienteExecute(Sender: TObject);
procedure actAnteriorUpdate(Sender: TObject);
procedure actSiguienteUpdate(Sender: TObject);
procedure actRefrescarUpdate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); virtual;
procedure actEliminarUpdate(Sender: TObject);
procedure actModificarUpdate(Sender: TObject);
procedure actPrevisualizarUpdate(Sender: TObject);
procedure actImprimirUpdate(Sender: TObject);
procedure actGuardarUpdate(Sender: TObject);
procedure actGuardarCerrarUpdate(Sender: TObject);
procedure dsDataTableDataChange(Sender: TObject; Field: TField);
protected
function HayDatos: Boolean;
function PuedoImprimir: Boolean; virtual;
function GetModified: Boolean; override;
procedure RefrescarInterno; override;
procedure CancelarCambiosInterno; override;
end;
implementation
uses
uDataTableUtils, cxControls, uCustomEditor;
{$R *.dfm}
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 HayDatos then
(Sender as TAction).Enabled := not dsDataTable.DataTable.BOF
else
(Sender as TAction).Enabled := False;
end;
procedure TfEditorDBBase.actSiguienteUpdate(Sender: TObject);
begin
inherited;
if HayDatos then
(Sender as TAction).Enabled := not dsDataTable.DataTable.EOF
else
(Sender as TAction).Enabled := False;
end;
procedure TfEditorDBBase.CancelarCambiosInterno;
var
dtDetails : TList;
i : integer;
ABookmark : TBookmark;
begin
inherited;
if Assigned(dsDataTable.DataTable) then
begin
ABookmark := dsDataTable.DataTable.GetBookMark;
dsDataTable.DataTable.DisableControls;
// dsDataTable.DataTable.DisableEventHandlers; <- No descomentar
ShowHourglassCursor;
{ 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;
end;
dsDataTable.DataTable.CancelUpdates;
//Forzamos el cancel update de los detalles porque falla si se lo dejamos por ser maestro-detalle
dtDetails := dsDataTable.DataTable.GetDetailDataTables;
for i := 0 to dtDetails.Count - 1 do
begin
(TDADataTable(dtDetails.Items[i])).CancelUpdates;
end;
{ 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;
//finally
dsDataTable.DataTable.EnableControls;
dsDataTable.DataTable.FreeBookmark(ABookmark);
// dsDataTable.DataTable.EnableEventHandlers; <- No descomentar
HideHourglassCursor
//end;
end;
end;
procedure TfEditorDBBase.dsDataTableDataChange(Sender: TObject; Field: TField);
begin
inherited;
if not (Sender as TDADataSource).DataTable.Opening and
not (Sender as TDADataSource).DataTable.Closing and
not (Sender as TDADataSource).DataTable.Fetching then
ActualizarEstadoEditor;
end;
procedure TfEditorDBBase.actRefrescarUpdate(Sender: TObject);
begin
inherited;
if HayDatos then
(Sender as TAction).Enabled := (not dsDataTable.DataTable.Fetching) and
(not dsDataTable.DataTable.Opening) and
(not dsDataTable.DataTable.Closing) and
(dsDataTable.DataTable.State <> dsInsert)
else
(Sender as TAction).Enabled := False;
//MODO CONSULTAR ITEM
if (Sender as TAction).Enabled
and Assigned(dsDataTable.DataTable) then
(Sender as TAction).Enabled := not dsDataTable.DataTable.ReadOnly;
end;
function TfEditorDBBase.GetModified: Boolean;
begin
if ReadOnly then
Result := False
else
Result := DataTableModified(dsDataTable.DataTable) or inherited GetModified;
end;
function TfEditorDBBase.HayDatos: Boolean;
begin
Result := Assigned(dsDataTable.DataTable) and (dsDataTable.DataTable.State <> dsInactive)
and (not dsDataTable.DataTable.IsEmpty);
end;
function TfEditorDBBase.PuedoImprimir: Boolean;
begin
Result := True;
end;
procedure TfEditorDBBase.RefrescarInterno;
var
AID: Integer;
begin
inherited;
if Assigned(dsDataTable.DataTable) then
begin
if (dsDataTable.DataTable.IsEmpty) or (not ModifiedQuery) then
Exit; // No continuar con el refresco
with dsDataTable.DataTable do
begin
AID := RecIDValue;
DisableControls; //<- No descomentar
dsDataTable.OnStateChange := NIL;
ShowHourglassCursor;
try
Refresh;
Locate(RecIDField.FieldName, AID, []);
finally
dsDataTable.OnDataChange := dsDataTableDataChange;
EnableControls; //<- No descomentar
HideHourglassCursor;
end;
end;
end;
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.actEliminarUpdate(Sender: TObject);
begin
inherited;
if (Sender as TAction).Enabled then
(Sender as TAction).Enabled := HayDatos and (dsDataTable.DataTable.State <> dsInsert)
end;
procedure TfEditorDBBase.actGuardarCerrarUpdate(Sender: TObject);
begin
inherited;
if (Sender as TAction).Enabled then
(Sender as TAction).Enabled := HayDatos;
end;
procedure TfEditorDBBase.actGuardarUpdate(Sender: TObject);
begin
inherited;
if (Sender as TAction).Enabled then
(Sender as TAction).Enabled := HayDatos;
end;
procedure TfEditorDBBase.actModificarUpdate(Sender: TObject);
begin
inherited;
if (Sender as TAction).Enabled then
(Sender as TAction).Enabled := HayDatos;
end;
procedure TfEditorDBBase.actPrevisualizarUpdate(Sender: TObject);
begin
inherited;
(Sender as TAction).Enabled := HayDatos and PuedoImprimir;
end;
procedure TfEditorDBBase.actImprimirUpdate(Sender: TObject);
begin
inherited;
(Sender as TAction).Enabled := HayDatos and PuedoImprimir;
end;
initialization
RegisterClass(TfEditorDBBase);
finalization
UnRegisterClass(TfEditorDBBase);
end.