unit unYearOpen; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ADODB, DB, StdCtrls, ExtCtrls, Grids, DBGrids, wdbreg, DBClient, Provider; type TForm1 = class(TForm) Conn: TADOConnection; QBPAA: TADODataSet; DSBPAA: TDataSource; InsertBPAA: TADOCommand; WDBGRID1: WDBGRID; Panel1: TPanel; Label1: TLabel; eYY: TEdit; btnYYOk: TButton; Panel2: TPanel; btnOpenYear: TButton; InsertBPAB: TADOCommand; InsertBPJA: TADOCommand; InsertBPJB: TADOCommand; InsertRASN: TADOCommand; EndOldRASN: TADOCommand; DSPBPAA: TDataSetProvider; CDSBPAA: TClientDataSet; Memo1: TMemo; QBPAACHECKED: TStringField; QBPAABPPNM: TWideStringField; QBPAABPYER: TIntegerField; QBPAABPPYN: TWideStringField; QBPAABPPYM: TWideStringField; QBPAABPPME: TWideStringField; QBPAANEW_BPPNM: TStringField; spl1: TSplitter; Label2: TLabel; eNewYY: TEdit; cbInsertBPAA: TCheckBox; cbInsertBPJA: TCheckBox; cbInsertBPJB: TCheckBox; cbInsertRASN: TCheckBox; cbInsertBPAB: TCheckBox; cbClearFirst: TCheckBox; DeleteBPAA: TADOCommand; DeleteBPAB: TADOCommand; DeleteBPJA: TADOCommand; DeleteBPJB: TADOCommand; DeleteRASN: TADOCommand; procedure btnYYOkClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure btnOpenYearClick(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private declarations } oldYY, newYY: integer; procedure DoOpenYear; public { Public declarations } end; var Form1: TForm1; implementation uses WGUARD1; {$R *.dfm} procedure TForm1.btnYYOkClick(Sender: TObject); begin oldYY := StrToIntDef(eYY.Text, -1); if (oldYY < 0) then begin Application.MessageBox('年度不合理,請重新輸入', '錯誤', MB_ICONERROR); eYY.SetFocus; exit; end; CDSBPAA.Close; CDSBPAA.Params.ParamValues['BPYER'] := oldYY; CDSBPAA.Open; CDSBPAA.FieldByName('CHECKED').ReadOnly := False; CDSBPAA.FieldByName('NEW_BPPNM').ReadOnly := False; end; procedure TForm1.DoOpenYear; var newBPPYN, oldBPPYN, newBPPYM: string; begin CDSBPAA.First; CDSBPAA.DisableControls; while not CDSBPAA.Eof do begin if CDSBPAA.FieldByName('CHECKED').Value = 'N' then begin CDSBPAA.MoveBy(1); continue; end; newBPPYN := FormatFloat('000', newYY) + CDSBPAA.FieldByName('NEW_BPPNM').AsString; oldBPPYN := CDSBPAA.FieldByName('BPPYN').AsString; newBPPYM := WNTSA(newYY, '', '2') + '年' + CDSBPAA.FieldByName('BPPME').AsString; Conn.BeginTrans; try if cbInsertBPAA.Checked then begin if cbClearFirst.Checked then begin DeleteBPAA.Parameters.ParamValues['BPPYN'] := newBPPYN; DeleteBPAA.Execute; end; InsertBPAA.Parameters.ParamValues['BPPNM'] := CDSBPAA.FieldByName('NEW_BPPNM').AsString; InsertBPAA.Parameters.ParamValues['BPYER'] := newYY; InsertBPAA.Parameters.ParamValues['BPPYN'] := newBPPYN; InsertBPAA.Parameters.ParamValues['BPPYM'] := newBPPYM; InsertBPAA.Parameters.ParamValues['TRDAT'] := Date; InsertBPAA.Parameters.ParamValues['OLD_BPPYN'] := oldBPPYN; InsertBPAA.Execute; end; if cbInsertBPAB.Checked then begin if cbClearFirst.Checked then begin DeleteBPAB.Parameters.ParamValues['BPPYN'] := newBPPYN; DeleteBPAB.Execute; end; InsertBPAB.Parameters.ParamValues['BPPYN'] := newBPPYN; InsertBPAB.Parameters.ParamValues['TRDAT'] := Date; InsertBPAB.Parameters.ParamValues['OLD_BPPYN'] := oldBPPYN; InsertBPAB.Execute; end; if cbInsertBPJA.Checked then begin if cbClearFirst.Checked then begin DeleteBPJA.Parameters.ParamValues['BPPYN'] := newBPPYN; DeleteBPJA.Execute; end; InsertBPJA.Parameters.ParamValues['BPPYN'] := newBPPYN; InsertBPJA.Parameters.ParamValues['TRDAT'] := Date; InsertBPJA.Parameters.ParamValues['OLD_BPPYN'] := oldBPPYN; InsertBPJA.Execute; end; if cbInsertBPJB.Checked then begin if cbClearFirst.Checked then begin DeleteBPJB.Parameters.ParamValues['BPPYN'] := newBPPYN; DeleteBPJB.Execute; end; InsertBPJB.Parameters.ParamValues['BPPYN'] := newBPPYN; InsertBPJB.Parameters.ParamValues['TRDAT'] := Date; InsertBPJB.Parameters.ParamValues['OLD_BPPYN'] := oldBPPYN; InsertBPJB.Execute; end; if cbInsertRASN.Checked then begin if cbClearFirst.Checked then begin DeleteRASN.Parameters.ParamValues['BPPYN'] := newBPPYN; DeleteRASN.Execute; end; InsertRASN.Parameters.ParamValues['BPPYN'] := newBPPYN; InsertRASN.Parameters.ParamValues['RASDT'] := EncodeDate(newYY + 1911, 1, 1); InsertRASN.Parameters.ParamValues['TRDAT'] := Date; InsertRASN.Parameters.ParamValues['OLD_BPPYN'] := oldBPPYN; InsertRASN.Execute; EndOldRASN.Parameters.ParamValues['RAEDT'] := EncodeDate(oldYY + 1911, 12, 31); EndOldRASN.Parameters.ParamValues['OLD_RAPYN'] := oldBPPYN; EndOldRASN.Execute; end; Conn.CommitTrans; Memo1.Lines.Add(newBPPYN + '年度開帳成功'); except on E: Exception do begin Conn.RollbackTrans; Memo1.Lines.Add(newBPPYN + '年度開帳失敗!原因為:'#10 + E.Message); end; end; CDSBPAA.MoveBy(1); end; CDSBPAA.EnableControls; end; procedure TForm1.btnOpenYearClick(Sender: TObject); var valid: Boolean; selected: Boolean; begin if CDSBPAA.IsEmpty then begin Application.MessageBox('請先查詢要複製的年度專案資料後再處理', '錯誤', MB_ICONERROR); eNewYY.SetFocus; exit; end; valid := True; selected := False; CDSBPAA.First; CDSBPAA.DisableControls; while not CDSBPAA.Eof do begin if CDSBPAA.FieldByName('CHECKED').Value = 'Y' then begin selected := True; valid := valid and (CDSBPAA.FieldByName('NEW_BPPNM').AsString <> ''); end; CDSBPAA.MoveBy(1); end; CDSBPAA.First; CDSBPAA.EnableControls; if not selected then begin Application.MessageBox('請選擇要開帳的計畫', '錯誤', MB_ICONERROR); exit; end; if not valid then begin Application.MessageBox('新計畫代號未輸入,請重新輸入', '錯誤', MB_ICONERROR); exit; end; newYY := StrToIntDef(eNewYY.Text, -1); if (newYY < 0) then begin Application.MessageBox('新年度不合理,請重新輸入', '錯誤', MB_ICONERROR); eNewYY.SetFocus; exit; end; if (newYY < oldYY) then begin Application.MessageBox('新年度不可小於原年度,請重新輸入', '錯誤', MB_ICONERROR); eNewYY.SetFocus; exit; end; DoOpenYear; end; procedure TForm1.FormActivate(Sender: TObject); begin eYY.SetFocus; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin CDSBPAA.Close; Conn.Connected := False; end; procedure TForm1.FormCreate(Sender: TObject); begin Conn.Connected := False; Conn.ConnectionString := Format('FILE NAME=%sYearOpen.udl;', [ExtractFilepath(Application.ExeName)]); Conn.Connected := True; CDSBPAA.CommandText := ' SELECT ''N'' AS CHECKED, A.BPPNM, A.BPYER, A.BPPYN, A.BPPYM, B.BPPME, A.BPPNM AS NEW_BPPNM ' + ' FROM BPAA A INNER JOIN BPRJ B ON A.BPPNM=B.BPPNM ' + ' WHERE A.BPYER=:BPYER AND A.BPPNM<>''000001'' '; CDSBPAA.Params.ParamByName('BPYER').DataType := ftInteger; end; end.