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

📄 main.pas

📁 ODAC+SDAC源代码
💻 PAS
字号:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBCtrls, ExtCtrls, Db, Grids, DBGrids, MemDS,  StdCtrls, ToolWin,
  ComCtrls, Buttons,  DBAccess, MSAccess, SdacVcl;

type
  TfmMain = class(TForm)
    MSConnection: TMSConnection;
    DBGrid: TDBGrid;
    DataSource: TDataSource;
    ToolBar: TPanel;
    btOpen: TButton;
    DBNavigator: TDBNavigator;
    btClose: TButton;
    MSConnectDialog: TMSConnectDialog;
    MSQuery: TMSQuery;
    btApply: TBitBtn;
    btCancel: TBitBtn;
    btStartTrans: TBitBtn;
    btCommitTrans: TBitBtn;
    btRollbackTrans: TBitBtn;
    StatusBar: TStatusBar;
    cbCachedUpdates: TCheckBox;
    btCommit: TBitBtn;
    cbDebug: TCheckBox;
    cbUnmodified: TCheckBox;
    Label1: TLabel;
    cbModified: TCheckBox;
    cbInserted: TCheckBox;
    cbDeleted: TCheckBox;
    btRevertRecord: TBitBtn;
    RefreshRecord: TButton;
    cbCustomUpdate: TCheckBox;
    procedure btOpenClick(Sender: TObject);
    procedure btCloseClick(Sender: TObject);
    procedure btApplyClick(Sender: TObject);
    procedure btCancelClick(Sender: TObject);
    procedure btStartTransClick(Sender: TObject);
    procedure btCommitTransClick(Sender: TObject);
    procedure btRollbackTransClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure cbCachedUpdatesClick(Sender: TObject);
    procedure MSQueryUpdateError(DataSet: TDataSet; E: EDatabaseError;
      UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
    procedure MSQueryUpdateRecord(DataSet: TDataSet;
      UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
    procedure cbCustomUpdateClick(Sender: TObject);
    procedure MSQueryCalcFields(DataSet: TDataSet);
    procedure btCommitClick(Sender: TObject);
    procedure cbDebugClick(Sender: TObject);
    procedure cbUnmodifiedClick(Sender: TObject);
    procedure cbModifiedClick(Sender: TObject);
    procedure cbInsertedClick(Sender: TObject);
    procedure cbDeletedClick(Sender: TObject);
    procedure DataSourceDataChange(Sender: TObject; Field: TField);
    procedure DataSourceStateChange(Sender: TObject);
    procedure DBGridDrawDataCell(Sender: TObject; const Rect: TRect;
      Field: TField; State: TGridDrawState);
    procedure btRevertRecordClick(Sender: TObject);
    procedure RefreshRecordClick(Sender: TObject);
  private
    { Private declarations }
    procedure ShowTrans;
    procedure ShowPending;
    procedure ShowUpdateRecordTypes;    
  public
    { Public declarations }
  end;

var
  fmMain: TfmMain;

implementation

uses
  UpdateAction;

{$R *.nfm}

procedure TfmMain.ShowTrans;
begin
  if MSConnection.InTransaction then
    StatusBar.Panels[1].Text:= 'In Transaction'
  else
    StatusBar.Panels[1].Text:= '';
end;

procedure TfmMain.ShowPending;
begin
  if MSQuery.UpdatesPending then
    StatusBar.Panels[0].Text:= 'Updates Pending'
  else
    StatusBar.Panels[0].Text:= '';
end;

procedure TfmMain.ShowUpdateRecordTypes;
begin
  if MSQuery.CachedUpdates then begin
    cbUnmodified.Checked:= rtUnmodified in MSQuery.UpdateRecordTypes;
    cbModified.Checked:= rtModified in MSQuery.UpdateRecordTypes;
    cbInserted.Checked:= rtInserted in MSQuery.UpdateRecordTypes;
    cbDeleted.Checked:= rtDeleted in MSQuery.UpdateRecordTypes;
  end;
end;

procedure TfmMain.btOpenClick(Sender: TObject);
begin
  MSQuery.Open;
end;

procedure TfmMain.btCloseClick(Sender: TObject);
begin
  MSQuery.Close;
end;

procedure TfmMain.btApplyClick(Sender: TObject);
begin
  MSQuery.ApplyUpdates;
  ShowPending;
end;

procedure TfmMain.btCommitClick(Sender: TObject);
begin
  MSQuery.CommitUpdates;
  ShowPending;
end;

procedure TfmMain.btCancelClick(Sender: TObject);
begin
  MSQuery.CancelUpdates;
  ShowPending;
end;

procedure TfmMain.btStartTransClick(Sender: TObject);
begin
  MSConnection.StartTransaction;
  ShowTrans;
end;

procedure TfmMain.btCommitTransClick(Sender: TObject);
begin
  MSConnection.Commit;
  ShowTrans;
end;

procedure TfmMain.btRollbackTransClick(Sender: TObject);
begin
  MSConnection.Rollback;
  ShowTrans;
end;

procedure TfmMain.FormShow(Sender: TObject);
begin
  cbCachedUpdates.Checked:= MSQuery.CachedUpdates;
  cbDebug.Checked:= MSQuery.Debug;
  ShowUpdateRecordTypes;
end;

procedure TfmMain.cbCachedUpdatesClick(Sender: TObject);
begin
  MSQuery.CachedUpdates:= cbCachedUpdates.Checked;
  ShowUpdateRecordTypes;
end;

procedure TfmMain.MSQueryUpdateError(DataSet: TDataSet; E: EDatabaseError;
  UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
  fmUpdateAction.rgAction.ItemIndex:= Ord(UpdateAction);
  fmUpdateAction.rgKind.ItemIndex:= Ord(UpdateKind);
  fmUpdateAction.lbField.Caption:= String(DataSet.Fields[0].Value);
  fmUpdateAction.lbMessage.Caption:= E.Message;
  fmUpdateAction.ShowModal;
  UpdateAction:= TUpdateAction(fmUpdateAction.rgAction.ItemIndex);
end;

procedure TfmMain.MSQueryUpdateRecord(DataSet: TDataSet;
  UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
  fmUpdateAction.rgAction.ItemIndex:= Ord(UpdateAction);
  fmUpdateAction.rgKind.ItemIndex:= Ord(UpdateKind);
  fmUpdateAction.lbField.Caption:= String(DataSet.Fields[0].NewValue);
  fmUpdateAction.lbMessage.Caption:= '';
  fmUpdateAction.ShowModal;
  UpdateAction:= TUpdateAction(fmUpdateAction.rgAction.ItemIndex);
end;

procedure TfmMain.cbCustomUpdateClick(Sender: TObject);
begin
  if cbCustomUpdate.Checked then
    MSQuery.OnUpdateRecord:= MSQueryUpdateRecord
  else
    MSQuery.OnUpdateRecord:= nil;
end;

procedure TfmMain.MSQueryCalcFields(DataSet: TDataSet);
var
  St:string;
begin
  case Ord(TCustomMSDataSet(DataSet).UpdateStatus) of
    0: St:= 'Unmodified';
    1: St:= 'Modified';
    2: St:= 'Inserted';
    3: St:= 'Deleted';
  end;
  DataSet.FieldByName('Status').AsString:= St;

{  case Ord(TMSDataSet(DataSet).UpdateResult) of
    0: St:= 'Fail';
    1: St:= 'Abort';
    2: St:= 'Skip';
    3: St:= 'Applied';
  end;
  DataSet.FieldByName('Result').AsString:= St;}
end;

procedure TfmMain.cbDebugClick(Sender: TObject);
begin
  MSQuery.Debug:= cbDebug.Checked;
end;

procedure TfmMain.cbUnmodifiedClick(Sender: TObject);
begin
  if cbUnmodified.Checked then
    MSQuery.UpdateRecordTypes:= MSQuery.UpdateRecordTypes + [rtUnmodified]
  else
    MSQuery.UpdateRecordTypes:= MSQuery.UpdateRecordTypes - [rtUnmodified];
end;

procedure TfmMain.cbModifiedClick(Sender: TObject);
begin
  if cbModified.Checked then
    MSQuery.UpdateRecordTypes:= MSQuery.UpdateRecordTypes + [rtModified]
  else
    MSQuery.UpdateRecordTypes:= MSQuery.UpdateRecordTypes - [rtModified];
end;

procedure TfmMain.cbInsertedClick(Sender: TObject);
begin
  if cbInserted.Checked then
    MSQuery.UpdateRecordTypes:= MSQuery.UpdateRecordTypes + [rtInserted]
  else
    MSQuery.UpdateRecordTypes:= MSQuery.UpdateRecordTypes - [rtInserted];
end;

procedure TfmMain.cbDeletedClick(Sender: TObject);
begin
  if cbDeleted.Checked then
    MSQuery.UpdateRecordTypes:= MSQuery.UpdateRecordTypes + [rtDeleted]
  else
    MSQuery.UpdateRecordTypes:= MSQuery.UpdateRecordTypes - [rtDeleted];
end;

procedure TfmMain.DataSourceStateChange(Sender: TObject);
begin
  ShowPending;
  StatusBar.Panels[2].Text:= 'RecordCount:' + IntToStr(MSQuery.RecordCount);
  StatusBar.Panels[3].Text:= 'RecordNo:' + IntToStr(MSQuery.RecNo);
end;

procedure TfmMain.DataSourceDataChange(Sender: TObject; Field: TField);
begin
  DataSourceStateChange(nil);
end;

procedure TfmMain.DBGridDrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
  if MSQuery.UpdateResult in [uaFail,uaSkip] then
    TDBGrid(Sender).Canvas.Brush.Color:= clRed
  else
    if MSQuery.UpdateStatus <> usUnmodified then
      TDBGrid(Sender).Canvas.Brush.Color:= clYellow;

  TDBGrid(Sender).DefaultDrawDataCell(Rect, Field, State);
end;

procedure TfmMain.btRevertRecordClick(Sender: TObject);
begin
  MSQuery.RevertRecord;
  ShowPending;
end;

procedure TfmMain.RefreshRecordClick(Sender: TObject);
begin
  MSQuery.RefreshRecord;
end;

end.


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -