📄 wsvouchereditsy.pas
字号:
{******************************************
模块:单据编辑基类
更新日期:2002年11月7日
作者:Qiuliang
更新者:胡建平
******************************************}
unit WSVoucherEditSY;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ExtCtrls, DBCtrls, StdCtrls, Mask, Grids, DBGrids,
QLDBGrid, ActnList, ToolWin, ComCtrls, ADODB, QLRptBld, QLDBFlt, Menus,
QRExtra, QuickRpt, WSEdit, QLDBLkp;
type
{1 TWSVoucherEditSYForm 是所有工资资产类业务单据编辑窗体的基础类 }
{{
}
TWSVoucherEditSYForm = class(TWSEditForm)
A1: TMenuItem;
A2: TMenuItem;
A3: TMenuItem;
ActionList: TActionList;
C1: TMenuItem;
CloseAction: TAction;
D1: TMenuItem;
D2: TMenuItem;
DateDBEdit: TDBEdit;
DBGrid: TQLDBGrid;
DeleteAction: TAction;
DeleteDetailAction: TAction;
DetailDataSource: TDataSource;
EditMenuItem: TMenuItem;
F1: TMenuItem;
FileMenuItem: TMenuItem;
FiltrateAction: TAction;
FindAction: TAction;
ImportAction: TAction;
L1: TMenuItem;
MainMenu: TMainMenu;
MasterDataSource: TDataSource;
N1: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
NewAction: TAction;
NewDetailAction: TAction;
NextAction: TAction;
O1: TMenuItem;
P1: TMenuItem;
P2: TMenuItem;
PageOptionsAction: TAction;
PrintAction: TAction;
PrintPreviewAction: TAction;
PriorAction: TAction;
RemarkDBEdit: TDBEdit;
RemarkLabel: TLabel;
S1: TMenuItem;
SaveAction: TAction;
SaveAsAction: TAction;
SendAsMailAction: TAction;
SubmitAction: TAction;
ToolBar: TToolBar;
ToolButton1: TToolButton;
ToolButton10: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
ToolButton9: TToolButton;
TopPanel: TPanel;
U1: TMenuItem;
V1: TMenuItem;
ViewMenuItem: TMenuItem;
VocherNoDBEdit: TDBEdit;
VoucherDateLabel: TLabel;
VoucherNoLabel: TLabel;
StatusBar1: TStatusBar;
DetailsPopupMenu: TPopupMenu;
AddNewDetailItem: TMenuItem;
DeleteDetailItem: TMenuItem;
WriteOffAction: TAction;
N33: TMenuItem;
VourcherEditSYExportAction: TAction;
VourcherEditSYExportButton: TToolButton;
procedure CloseActionExecute(Sender: TObject);
procedure DeleteActionExecute(Sender: TObject);
procedure DeleteDetailActionExecute(Sender: TObject);
procedure DeleteDetailActionUpdate(Sender: TObject);
procedure FiltrateActionExecute(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure NewActionExecute(Sender: TObject);
procedure NewDetailActionExecute(Sender: TObject);
procedure NextActionExecute(Sender: TObject);
procedure PrintActionExecute(Sender: TObject);
procedure PrintPreviewActionExecute(Sender: TObject);
procedure PriorActionExecute(Sender: TObject);
procedure SaveActionExecute(Sender: TObject);
procedure SendAsMailActionExecute(Sender: TObject);
procedure SubmitActionExecute(Sender: TObject);
procedure GoodsLookupButtonClick(Sender: TObject;
Button: TLookupWindowBtn);
procedure SaveAsActionExecute(Sender: TObject);
procedure GoodsLookupCloseUp(Sender: TObject);
procedure ImportActionExecute(Sender: TObject);
procedure DBGridEnter(Sender: TObject);
procedure WriteOffActionExecute(Sender: TObject);
procedure VourcherEditSYExportActionExecute(Sender: TObject);
private
FFilterDialog: TQLDBFilterDialog;
FOldDetailDataSetOnNewRecord: TDataSetNotifyEvent;
FOldMasterDataSetAfterPost: TDataSetNotifyEvent; //胡建平 2002-11-07
FVoucherTableName: string;
function CreateQRBuilder: TQRBuilder;
procedure DetailDataSetNewRecord(DataSet: TDataSet);
procedure MasterDataSetAfterPost(DataSet: TDataSet);//胡建平 2002-11-07
function GetNextVoucherID: Integer;
function GetPriorVoucherID: Integer;
function GetMailBody: string;
procedure UpdateGrid;
protected
function CreateReport: TQuickRep; virtual;
function GetDetailDataSet: TADODataSet; virtual;
function GetMasterDataSet: TADODataSet; virtual;
function GetModified: Boolean; virtual;
{1 返回单据的 ID 字段对象 }
{{
GetVoucherIDField 是 VoucherIDField 属性 read 的实现。
可以覆盖 GetVoucherIDField 来返回不同的 ID 字段。默认情况下,该方法返回
MasterDataSet 的第 0 个字段。
}
function GetVoucherIDField: TField; virtual;
procedure InitReport(Report: TQuickRep); virtual;
{1 实现取消所作更改的功能 }
{{
覆盖 InternalCancel 方法来实现取消对当前单据所作的更改。
要取消更改请调用 Cancel 而不要直接调用 InternalCancel 方法,Cancel
方法会调用InternalCancel 来实现真正的取消功能。
}
procedure InternalCancel; virtual;
{1 实现保存单据的功能 }
{{
覆盖 InternalSave 方法来实现保存功能。
Save 方法会启动一个事务,并在该事务中调用 InternalSave
来保存数据。InternalSave 方法中的所有更改都可作为一个事务提交或回滚。
要保存更改请调用 Save 而不要直接调用 InternalSave 方法,Save
方法会调用InternalSave 来实现真正的保存功能。
}
procedure InternalSave; virtual;
procedure Print(Preview: Boolean); virtual;
function PromptSave: Boolean;
public
constructor Create(AOwner: TComponent); override;
procedure Cancel;
function Connection: TADOConnection;
procedure Delete;
function Edit(const Params: Variant): Boolean; override;
function Enter: Boolean; override;
{{
调用 New 建立一张新的业务单据
}
procedure New; virtual;
procedure Open(VoucherID: Integer); virtual;
procedure Save;
property DetailDataSet: TADODataSet read GetDetailDataSet;
property MasterDataSet: TADODataSet read GetMasterDataSet;
{1 判断当前单据是否已被更改 }
property Modified: Boolean read GetModified;
{1 获得当前单据的 ID 字段对象 }
{{
读 VoucherIDField 属性来获取当前单据的 ID 字段对象。该属性只读。
}
property VoucherIDField: TField read GetVoucherIDField;
{1 指定单据在数据库中的表名 }
{{
设置 VoucherTableName
属性来指定当前所编辑的单据在数据库中的表名。注意,该表名不包含 Master
后缀,如采购订单表在数据库中是 SLOrderMaster, SLOrderDetail,则
VoucherTableName 应为 SLOrder。
}
property VoucherTableName: string read FVoucherTableName write
FVoucherTableName;
end;
implementation
uses WSVoucherRpt, WSConsts, ADOInt, CommonDM, QRExport,
WSUtils, TypInfo, ShellAPI ,WSVoucherImport,VoucherImport;
{$R *.dfm}
{ TWSVoucherEditForm }
{1 }
{{
}
{1 指定单据在数据库中的表名 }
{{
}
{
****************************** TWSVoucherEditForm ******************************
}
constructor TWSVoucherEditSYForm.Create(AOwner: TComponent);
begin
inherited;
end;
procedure TWSVoucherEditSYForm.Cancel;
begin
InternalCancel;
end;
procedure TWSVoucherEditSYForm.CloseActionExecute(Sender: TObject);
begin
inherited;
Close;
end;
function TWSVoucherEditSYForm.Connection: TADOConnection;
begin
Result := MasterDataSet.Connection;
end;
function TWSVoucherEditSYForm.CreateQRBuilder: TQRBuilder;
var
I: Integer;
begin
Result := TQLDBGridReportBuilder.Create(Self);
with TQLDBGridReportBuilder(Result) do
begin
DBGrid := Self.DBGrid;
AutoWidth := True;
Report := CreateReport;
AutoOrientation := False;
Report.ReportTitle := Self.Caption;
with Self.DBGrid do
for I := 0 to Columns.Count - 1 do
begin
case Columns[I].Footer.ValueType of
fvtSum: SummaryFields.Add(Format('%s=SUM([%s])', [Columns[I].FieldName, Columns[I].FieldName]));
fvtCount: SummaryFields.Add(Format('%s=COUNT([%s])', [Columns[I].FieldName, Columns[I].FieldName]));
end;
end;
end;
end;
function TWSVoucherEditSYForm.CreateReport: TQuickRep;
begin
Result := TVoucherReport.Create(Self);
TVoucherReport(Result).SetMasterDataSet(MasterDataSet);
end;
procedure TWSVoucherEditSYForm.Delete;
begin
// with DetailDataSet do
// begin
// DisableControls;
// try
// First;
// while not Eof do Delete;
// finally
// EnableControls;
// end;
// end;
with MasterDataSet do
begin
if State = dsInsert then Cancel
else begin
Edit;
FieldByName('RecordState').AsString := '删除';
Post;
Save;
end;
end;
Close;
// MasterDataSet.Delete;
end;
procedure TWSVoucherEditSYForm.DeleteActionExecute(Sender: TObject);
begin
if MasterDataSet.FieldByName('RecordState').AsString ='提交'
then showmessage('单据已经提交,不能删除!')
else
begin
if Application.MessageBox(PChar(SConfirmDeleteVoucher), PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDYES then
begin
Delete;
Close;
end;
end;
end;
procedure TWSVoucherEditSYForm.DeleteDetailActionExecute(Sender: TObject);
begin
inherited;
DetailDataSet.Delete;
end;
procedure TWSVoucherEditSYForm.DeleteDetailActionUpdate(Sender: TObject);
begin
inherited;
TAction(Sender).Enabled := not DetailDataSet.IsEmpty;
end;
procedure TWSVoucherEditSYForm.DetailDataSetNewRecord(DataSet: TDataSet);
begin
if not VoucherIDField.IsNull then
DataSet.FieldByName('MasterID').Value := VoucherIDField.Value;
end;
procedure TWSVoucherEditSYForm.MasterDataSetAfterPost(DataSet: TDataSet);
//胡建平 2002-11-07
var
ID: Integer;
Bm, OldIndexFieldNames: string;
begin
ID := DataSet.FieldByName('ID').AsInteger;
with DetailDataSet do
begin
if State in dsEditModes then Post;
DisableControls;
try
Bm := Bookmark;
OldIndexFieldNames := IndexFieldNames;
IndexFieldNames := '';
First;
while not Eof do
begin
if FieldByName('MasterID').IsNull then
begin
Edit;
FieldByName('MasterID').AsInteger := ID;
Post;
end;
Next;
end;
IndexFieldNames := OldIndexFieldNames;
Bookmark := Bm;
finally
EnableControls;
end;
end;
end;
function TWSVoucherEditSYForm.Edit(const Params: Variant): Boolean;
begin
Open(Params);
Result := ShowModal = mrOK;
end;
function TWSVoucherEditSYForm.Enter: Boolean;
begin
New;
Result := ShowModal = mrOK;
end;
procedure TWSVoucherEditSYForm.FiltrateActionExecute(Sender: TObject);
var
S: string;
I: Integer;
begin
if not Assigned(FFilterDialog) then
begin
FFilterDialog := TQLDBFilterDialog.Create(Self);
FFilterDialog.DataSet := DetailDataSet;
if FFilterDialog.DataSet <> nil then
with FFilterDialog.DataSet do
for I := 0 to DBGrid.Columns.Count - 1 do
if DBGrid.Columns[I].Visible then S := S + DBGrid.Columns[I].Field.FieldName + ';';
FFilterDialog.FilterFields := S;
end;
FFilterDialog.Execute;
end;
procedure TWSVoucherEditSYForm.FormCloseQuery(Sender: TObject; var CanClose:
Boolean);
begin
inherited;
CanClose := PromptSave;
end;
function TWSVoucherEditSYForm.GetDetailDataSet: TADODataSet;
begin
Result := TADODataSet(DetailDataSource.DataSet);
end;
function TWSVoucherEditSYForm.GetMasterDataSet: TADODataSet;
begin
Result := TADODataSet(MasterDataSource.DataSet);
end;
function TWSVoucherEditSYForm.GetModified: Boolean;
begin
Result := (Assigned(MasterDataSet) and (MasterDataSet.State in dsEditModes)) or
(Assigned(DetailDataSet) and (DetailDataSet.State in dsEditModes));
if not Result and Assigned(DetailDataSet) then
with DetailDataSet.Recordset do
begin
Filter := AdFilterPendingRecords;
try
Result := RecordCount > 0;
finally
Filter := AdFilterNone;
end;
end;
end;
function TWSVoucherEditSYForm.GetNextVoucherID: Integer;
begin
with TADOCommand.Create(nil) do
try
Connection := Self.Connection;
CommandText := Format('SELECT :VoucherID = MIN(%s) FROM %sMaster WHERE %0:s > %2:d AND RecordState <> ''删除''',
[VoucherIDField.FieldName, VoucherTableName, VoucherIDField.AsInteger]);
with Parameters[0] do
begin
Direction := pdOutput;
DataType := ftInteger;
end;
// showmessage(CommandText);
Execute;
if VarIsNull(Parameters[0].Value) then Result := -1
else Result := Parameters[0].Value;
finally
Free;
end;
end;
function TWSVoucherEditSYForm.GetPriorVoucherID: Integer;
begin
with TADOCommand.Create(nil) do
try
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -