⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wsvoucheredit.~pas

📁 企业ERP管理系统
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
{******************************************
模块:单据编辑基类
更新日期: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 + -