📄 wsvoucheredit.~pas
字号:
{******************************************
模块:单据编辑基类
更新日期:2002年11月7日
作者:Qiuliang
更新者:胡建平
******************************************}
unit WSVoucherEdit;
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 TWSVoucherEditForm 是所有业务单据编辑窗体的基础类 }
{{
}
TWSVoucherEditForm = 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;
GoodsLookup: TQLDBLookupComboBox;
DetailsPopupMenu: TPopupMenu;
AddNewDetailItem: TMenuItem;
DeleteDetailItem: TMenuItem;
WriteOffAction: TAction;
VourcherExportAction: TAction;
VourcherExportBttn: TToolButton;
ToolButton11: TToolButton;
ToolButton12: 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 FormActivate(Sender: TObject);
procedure WriteOffActionExecute(Sender: TObject);
procedure PageOptionsActionExecute(Sender: TObject);
procedure VourcherExportActionExecute(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 ,WSSecurity,VoucherImport,
Registry;
//WSVoucherImport
{$R *.dfm}
{ TWSVoucherEditForm }
{1 }
{{
}
{1 指定单据在数据库中的表名 }
{{
}
{
****************************** TWSVoucherEditForm ******************************
}
constructor TWSVoucherEditForm.Create(AOwner: TComponent);
var
Field: TField;
GoodNameDataSet: TDataSet;
begin
inherited;
if Guarder.GoodsCodeToGoodsName<>'是' then exit;
GoodNameDataSet := TDataSet(FindComponent('GoodName'));
if GoodNameDataSet <> nil then
begin
Field := TStringField.Create(Self);
Field.FieldName := 'GoodsCode';
Field.Lookup := True;
Field.LookupDataSet := GoodNameDataSet;
Field.KeyFields := 'GoodsID';
Field.LookupKeyFields := 'ID';
Field.LookupResultField := 'Code';
Field.DataSet := DetailDataSet;
Field.Size := 20;
with DBGrid.Columns.Add do
begin
FieldName := 'GoodsCode';
Title.Caption := '商品编码';
Title.Alignment := taCenter;
Index := 0;
end;
end;
end;
procedure TWSVoucherEditForm.Cancel;
begin
InternalCancel;
end;
procedure TWSVoucherEditForm.CloseActionExecute(Sender: TObject);
begin
inherited;
Close;
end;
function TWSVoucherEditForm.Connection: TADOConnection;
begin
Result := MasterDataSet.Connection;
end;
function TWSVoucherEditForm.CreateQRBuilder: TQRBuilder;
var
I: Integer;
begin
Result := TQLDBGridReportBuilder.Create(Self);
with TQLDBGridReportBuilder(Result) do
begin
DBGrid := Self.DBGrid;
AutoWidth := True;
Report := CreateReport;
AutoOrientation := False;
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 TWSVoucherEditForm.CreateReport: TQuickRep;
begin
Result := TVoucherReport.Create(Self);
TVoucherReport(Result).SetMasterDataSet(MasterDataSet);
end;
procedure TWSVoucherEditForm.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 TWSVoucherEditForm.DeleteActionExecute(Sender: TObject);
begin
if MasterDataSet.FieldByName('RecordState').AsString ='提交'
then begin
showmessage('单据已经提交,不能删除!');
Exit;
end;
if Application.MessageBox(PChar(SConfirmDeleteVoucher), PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDYES then
begin
Delete;
Close;
end;
end;
procedure TWSVoucherEditForm.DeleteDetailActionExecute(Sender: TObject);
begin
inherited;
DetailDataSet.Delete;
end;
procedure TWSVoucherEditForm.DeleteDetailActionUpdate(Sender: TObject);
begin
inherited;
TAction(Sender).Enabled := not DetailDataSet.IsEmpty;
end;
procedure TWSVoucherEditForm.DetailDataSetNewRecord(DataSet: TDataSet);
begin
if not VoucherIDField.IsNull then
DataSet.FieldByName('MasterID').Value := VoucherIDField.Value;
end;
procedure TWSVoucherEditForm.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 TWSVoucherEditForm.Edit(const Params: Variant): Boolean;
begin
Open(Params);
Result := ShowModal = mrOK;
end;
function TWSVoucherEditForm.Enter: Boolean;
begin
New;
Result := ShowModal = mrOK;
end;
procedure TWSVoucherEditForm.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 TWSVoucherEditForm.FormCloseQuery(Sender: TObject; var CanClose:
Boolean);
begin
inherited;
CanClose := PromptSave;
end;
function TWSVoucherEditForm.GetDetailDataSet: TADODataSet;
begin
Result := TADODataSet(DetailDataSource.DataSet);
end;
function TWSVoucherEditForm.GetMasterDataSet: TADODataSet;
begin
Result := TADODataSet(MasterDataSource.DataSet);
end;
function TWSVoucherEditForm.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 TWSVoucherEditForm.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 TWSVoucherEditForm.GetPriorVoucherID: Integer;
begin
with TADOCommand.Create(nil) do
try
Connection := Self.Connection;
CommandText := Format('SELECT :VoucherID = MAX(%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 TWSVoucherEditForm.GetVoucherIDField: TField;
begin
Result := MasterDataSet.Fields[0];
end;
procedure TWSVoucherEditForm.InitReport(Report: TQuickRep);
begin
with TRegistry.Create do
try
OpenKey('Software\Nicesoft.NET\NiceERP\' + ClassName + '\PageOptions', True);
Report.ReportTitle := ReadString('Title');
finally
Free;
end;
if Report.ReportTitle = '' then
Report.ReportTitle := Self.Caption;
end;
procedure TWSVoucherEditForm.InternalCancel;
begin
if Assigned(MasterDataSet) then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -