462 lines
13 KiB
ObjectPascal
462 lines
13 KiB
ObjectPascal
unit U_BizCateSel;
|
||
|
||
interface
|
||
|
||
uses
|
||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||
Dialogs, ComCtrls, ToolWin, cxStyles, cxCustomData, cxGraphics, cxFilter,
|
||
cxData, cxDataStorage, cxEdit, DB, cxDBData, cxGridLevel, cxClasses,
|
||
cxControls, cxGridCustomView, cxGridCustomTableView, cxGridTableView,
|
||
cxGridDBTableView, cxGrid, ADODB, DBClient, ExtCtrls, cxTextEdit,
|
||
cxLookAndFeels, cxLookAndFeelPainters, cxNavigator, dxBarBuiltInMenu,
|
||
dxDateRanges, dxScrollbarAnnotations, cxContainer, dxSkinsCore,
|
||
dxSkinsDefaultPainters, dxSkinWXI, StdCtrls;
|
||
|
||
const
|
||
CBizCateType = 'FinBizCate'; //KH_ZDY中业务大类的Type标识
|
||
CBizItemType = 'FinBizItem'; //KH_ZDY中明细项的Type标识
|
||
|
||
type
|
||
TfrmBizCateSel = class(TForm)
|
||
ToolBar1: TToolBar;
|
||
TBAdd: TToolButton;
|
||
TBDel: TToolButton;
|
||
TBEdit: TToolButton;
|
||
TBOK: TToolButton;
|
||
TBClose: TToolButton;
|
||
cxGrid1: TcxGrid;
|
||
Tv1: TcxGridDBTableView;
|
||
Tv1BizCate: TcxGridDBColumn;
|
||
Tv1BizItem: TcxGridDBColumn;
|
||
Tv1CateNo: TcxGridDBColumn;
|
||
Tv1ItemNo: TcxGridDBColumn;
|
||
cxGridLevel1: TcxGridLevel;
|
||
DS_1: TDataSource;
|
||
CDS_1: TClientDataSet;
|
||
ADOQueryTmp: TADOQuery;
|
||
ADOQueryCmd: TADOQuery;
|
||
procedure FormShow(Sender: TObject);
|
||
procedure FormDestroy(Sender: TObject);
|
||
procedure TBAddClick(Sender: TObject);
|
||
procedure TBDelClick(Sender: TObject);
|
||
procedure TBEditClick(Sender: TObject);
|
||
procedure TBOKClick(Sender: TObject);
|
||
procedure TBCloseClick(Sender: TObject);
|
||
procedure Tv1CellDblClick(Sender: TcxCustomGridTableView;
|
||
ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
|
||
AShift: TShiftState; var AHandled: Boolean);
|
||
procedure Tv1BizCatePropertiesEditValueChanged(Sender: TObject);
|
||
procedure Tv1BizItemPropertiesEditValueChanged(Sender: TObject);
|
||
private
|
||
procedure InitGrid();
|
||
procedure SetEditMode(AEdit: Boolean);
|
||
function FindCateNoByName(const ACateName: string; var ACateNo: string): Boolean;
|
||
function ItemNameExists(const ACateNo, AItemName, AExcludeItemNo: string): Boolean;
|
||
{ Private declarations }
|
||
public
|
||
SelCateName, SelItemName: string;
|
||
{ Public declarations }
|
||
end;
|
||
|
||
var
|
||
frmBizCateSel: TfrmBizCateSel;
|
||
|
||
implementation
|
||
|
||
uses
|
||
U_DataLink, U_RTFun;
|
||
|
||
{$R *.dfm}
|
||
|
||
{一行=一条明细项(BizItem)+其所属业务大类(BizCate);
|
||
KH_ZDY存储:大类 Type=FinBizCate,明细 Type=FinBizItem、MainType=大类ZDYNo;
|
||
未点修改前表格锁定,点修改后单元格改动即自动保存。}
|
||
|
||
procedure TfrmBizCateSel.InitGrid();
|
||
begin
|
||
with ADOQueryTmp do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('select C.ZDYName as BizCate, I.ZDYName as BizItem');
|
||
SQL.Add(',C.ZDYNo as CateNo, I.ZDYNo as ItemNo');
|
||
SQL.Add('from KH_ZDY C join KH_ZDY I');
|
||
SQL.Add(' on I.Type=''' + CBizItemType + ''' and I.MainType=C.ZDYNo and isnull(I.valid,''Y'')=''Y''');
|
||
SQL.Add('where C.Type=''' + CBizCateType + ''' and isnull(C.valid,''Y'')=''Y''');
|
||
SQL.Add('order by C.ZDYNo, I.ZDYNo');
|
||
Open;
|
||
end;
|
||
SCreateCDS(ADOQueryTmp, CDS_1);
|
||
SInitCDSData(ADOQueryTmp, CDS_1);
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.SetEditMode(AEdit: Boolean);
|
||
begin
|
||
Tv1.OptionsData.Editing := AEdit;
|
||
Tv1.OptionsSelection.CellSelect := AEdit;
|
||
if AEdit then
|
||
TBEdit.Caption := #32467#26463#20462#25913 //结束修改
|
||
else
|
||
TBEdit.Caption := #20462#25913; //修改
|
||
end;
|
||
|
||
function TfrmBizCateSel.FindCateNoByName(const ACateName: string;
|
||
var ACateNo: string): Boolean;
|
||
begin
|
||
Result := False;
|
||
ACateNo := '';
|
||
with ADOQueryTmp do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('select ZDYNo from KH_ZDY where Type=''' + CBizCateType + '''');
|
||
SQL.Add(' and isnull(valid,''Y'')=''Y'' and ZDYName=' + QuotedStr(Trim(ACateName)));
|
||
Open;
|
||
if not IsEmpty then
|
||
begin
|
||
Result := True;
|
||
ACateNo := Trim(FieldByName('ZDYNo').AsString);
|
||
end;
|
||
Close;
|
||
end;
|
||
end;
|
||
|
||
function TfrmBizCateSel.ItemNameExists(const ACateNo, AItemName,
|
||
AExcludeItemNo: string): Boolean;
|
||
begin
|
||
Result := False;
|
||
with ADOQueryTmp do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('select ZDYNo from KH_ZDY where Type=''' + CBizItemType + '''');
|
||
SQL.Add(' and MainType=' + QuotedStr(Trim(ACateNo)));
|
||
SQL.Add(' and ZDYName=' + QuotedStr(Trim(AItemName)));
|
||
Open;
|
||
while not Eof do
|
||
begin
|
||
if Trim(FieldByName('ZDYNo').AsString) <> Trim(AExcludeItemNo) then
|
||
begin
|
||
Result := True;
|
||
Break;
|
||
end;
|
||
Next;
|
||
end;
|
||
Close;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.FormShow(Sender: TObject);
|
||
begin
|
||
InitGrid();
|
||
SetEditMode(False);
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.FormDestroy(Sender: TObject);
|
||
begin
|
||
frmBizCateSel := nil;
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.TBAddClick(Sender: TObject);
|
||
begin
|
||
SetEditMode(True);
|
||
CDS_1.Append;
|
||
CDS_1.Post;
|
||
Tv1.Controller.FocusRecord(CDS_1.RecNo - 1, True);
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.TBDelClick(Sender: TObject);
|
||
var
|
||
mCateNo, mItemNo: string;
|
||
mLast: Boolean;
|
||
begin
|
||
if CDS_1.IsEmpty then
|
||
Exit;
|
||
mCateNo := Trim(CDS_1.FieldByName('CateNo').AsString);
|
||
mItemNo := Trim(CDS_1.FieldByName('ItemNo').AsString);
|
||
if mItemNo = '' then
|
||
begin
|
||
CDS_1.Delete; //未落库的新行
|
||
Exit;
|
||
end;
|
||
|
||
mLast := False;
|
||
with ADOQueryTmp do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('select count(*) as Cnt from KH_ZDY where Type=''' + CBizItemType + '''');
|
||
SQL.Add(' and MainType=' + QuotedStr(mCateNo) + ' and isnull(valid,''Y'')=''Y''');
|
||
Open;
|
||
if FieldByName('Cnt').AsInteger <= 1 then
|
||
mLast := True;
|
||
Close;
|
||
end;
|
||
|
||
if mLast then
|
||
begin
|
||
if Application.MessageBox('该明细项是其业务大类下最后一条,删除后将同时删除该业务大类,确定删除吗?',
|
||
'提示信息', 1) = 2 then
|
||
Exit;
|
||
end
|
||
else
|
||
begin
|
||
if Application.MessageBox('确定要删除该明细项吗?', '提示信息', 1) = 2 then
|
||
Exit;
|
||
end;
|
||
|
||
ADOQueryCmd.Connection.BeginTrans;
|
||
try
|
||
with ADOQueryCmd do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('delete KH_ZDY where Type=''' + CBizItemType + ''' and ZDYNo=' + QuotedStr(mItemNo));
|
||
ExecSQL;
|
||
if mLast then
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('delete KH_ZDY where Type=''' + CBizCateType + ''' and ZDYNo=' + QuotedStr(mCateNo));
|
||
ExecSQL;
|
||
end;
|
||
end;
|
||
ADOQueryCmd.Connection.CommitTrans;
|
||
except
|
||
ADOQueryCmd.Connection.RollbackTrans;
|
||
Application.MessageBox('删除失败!', '提示信息', 0);
|
||
Exit;
|
||
end;
|
||
CDS_1.Delete;
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.TBEditClick(Sender: TObject);
|
||
begin
|
||
SetEditMode(not Tv1.OptionsData.Editing);
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.Tv1BizCatePropertiesEditValueChanged(Sender: TObject);
|
||
var
|
||
mvalue, mCateNo, mItemNo, mFoundNo, mNewCateNo, maxno: string;
|
||
mFound: Boolean;
|
||
begin
|
||
mvalue := Trim(TcxTextEdit(Sender).EditingText);
|
||
if mvalue = '' then
|
||
Exit;
|
||
if (not CDS_1.Active) or CDS_1.IsEmpty then
|
||
Exit;
|
||
mCateNo := Trim(CDS_1.FieldByName('CateNo').AsString);
|
||
mItemNo := Trim(CDS_1.FieldByName('ItemNo').AsString);
|
||
|
||
CDS_1.Edit;
|
||
CDS_1.FieldByName('BizCate').Value := mvalue;
|
||
CDS_1.Post;
|
||
|
||
if mCateNo = '' then
|
||
Exit; //新行:只记录大类名称,待明细项录入时统一创建大类+明细
|
||
|
||
if mItemNo = '' then
|
||
Exit;
|
||
|
||
//已有行:只调整当前这条明细的所属大类。
|
||
//输入已有大类名=移动过去;全新名称=新建该名称的大类再移动过去(不做全大类重命名)
|
||
mFound := FindCateNoByName(mvalue, mFoundNo);
|
||
if mFound and (mFoundNo = mCateNo) then
|
||
Exit; //大类未变化
|
||
|
||
ADOQueryCmd.Connection.BeginTrans;
|
||
try
|
||
if not mFound then
|
||
begin
|
||
if GetLSNo(ADOQueryTmp, maxno, 'SY', 'KH_ZDY', 3, 1) = False then
|
||
begin
|
||
ADOQueryCmd.Connection.RollbackTrans;
|
||
Exit;
|
||
end;
|
||
with ADOQueryCmd do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('insert into KH_ZDY(ZDYNo,ZDYName,Type,valid) values(');
|
||
SQL.Add(QuotedStr(Trim(maxno)) + ',' + QuotedStr(mvalue));
|
||
SQL.Add(',''' + CBizCateType + ''',''Y'')');
|
||
ExecSQL;
|
||
end;
|
||
mNewCateNo := Trim(maxno);
|
||
end
|
||
else
|
||
mNewCateNo := mFoundNo;
|
||
|
||
with ADOQueryCmd do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('update KH_ZDY set MainType=' + QuotedStr(mNewCateNo));
|
||
SQL.Add(' where ZDYNo=' + QuotedStr(mItemNo) + ' and Type=''' + CBizItemType + '''');
|
||
ExecSQL;
|
||
end;
|
||
|
||
//原大类被移空时一并删除,避免留下界面上看不到的空大类
|
||
with ADOQueryTmp do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('select count(*) as Cnt from KH_ZDY where Type=''' + CBizItemType + '''');
|
||
SQL.Add(' and MainType=' + QuotedStr(mCateNo) + ' and isnull(valid,''Y'')=''Y''');
|
||
Open;
|
||
if FieldByName('Cnt').AsInteger = 0 then
|
||
begin
|
||
with ADOQueryCmd do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('delete KH_ZDY where Type=''' + CBizCateType + ''' and ZDYNo=' + QuotedStr(mCateNo));
|
||
ExecSQL;
|
||
end;
|
||
end;
|
||
Close;
|
||
end;
|
||
|
||
ADOQueryCmd.Connection.CommitTrans;
|
||
except
|
||
ADOQueryCmd.Connection.RollbackTrans;
|
||
Application.MessageBox('保存业务大类调整失败!', '提示信息', 0);
|
||
Exit;
|
||
end;
|
||
|
||
CDS_1.Edit;
|
||
CDS_1.FieldByName('CateNo').Value := mNewCateNo;
|
||
CDS_1.Post;
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.Tv1BizItemPropertiesEditValueChanged(Sender: TObject);
|
||
var
|
||
mvalue, mCateNo, mItemNo, mCateName, mFoundNo, mNewCateNo, mNewItemNo, maxno: string;
|
||
begin
|
||
mvalue := Trim(TcxTextEdit(Sender).EditingText);
|
||
if mvalue = '' then
|
||
Exit;
|
||
if (not CDS_1.Active) or CDS_1.IsEmpty then
|
||
Exit;
|
||
mCateNo := Trim(CDS_1.FieldByName('CateNo').AsString);
|
||
mItemNo := Trim(CDS_1.FieldByName('ItemNo').AsString);
|
||
mCateName := Trim(CDS_1.FieldByName('BizCate').AsString);
|
||
|
||
if mItemNo = '' then
|
||
begin
|
||
//新行录入明细项:大类存在则挂靠,不存在则先建大类,再建明细项
|
||
if mCateName = '' then
|
||
begin
|
||
Application.MessageBox('请先输入业务大类!', '提示信息', 0);
|
||
Exit;
|
||
end;
|
||
|
||
ADOQueryCmd.Connection.BeginTrans;
|
||
try
|
||
mNewCateNo := mCateNo;
|
||
if (mNewCateNo = '') and (not FindCateNoByName(mCateName, mFoundNo)) then
|
||
begin
|
||
if GetLSNo(ADOQueryTmp, maxno, 'SY', 'KH_ZDY', 3, 1) = False then
|
||
begin
|
||
ADOQueryCmd.Connection.RollbackTrans;
|
||
Exit;
|
||
end;
|
||
with ADOQueryCmd do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('insert into KH_ZDY(ZDYNo,ZDYName,Type,valid) values(');
|
||
SQL.Add(QuotedStr(Trim(maxno)) + ',' + QuotedStr(mCateName));
|
||
SQL.Add(',''' + CBizCateType + ''',''Y'')');
|
||
ExecSQL;
|
||
end;
|
||
mNewCateNo := Trim(maxno);
|
||
end
|
||
else if mNewCateNo = '' then
|
||
mNewCateNo := mFoundNo;
|
||
|
||
if ItemNameExists(mNewCateNo, mvalue, '') then
|
||
begin
|
||
ADOQueryCmd.Connection.RollbackTrans;
|
||
Application.MessageBox('该业务大类下已存在同名明细项!', '提示信息', 0);
|
||
Exit;
|
||
end;
|
||
|
||
if GetLSNo(ADOQueryTmp, maxno, 'SY', 'KH_ZDY', 3, 1) = False then
|
||
begin
|
||
ADOQueryCmd.Connection.RollbackTrans;
|
||
Exit;
|
||
end;
|
||
mNewItemNo := Trim(maxno);
|
||
with ADOQueryCmd do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('insert into KH_ZDY(ZDYNo,ZDYName,Type,MainType,valid) values(');
|
||
SQL.Add(QuotedStr(mNewItemNo) + ',' + QuotedStr(mvalue));
|
||
SQL.Add(',''' + CBizItemType + ''',' + QuotedStr(mNewCateNo) + ',''Y'')');
|
||
ExecSQL;
|
||
end;
|
||
ADOQueryCmd.Connection.CommitTrans;
|
||
|
||
CDS_1.Edit;
|
||
CDS_1.FieldByName('BizItem').Value := mvalue;
|
||
CDS_1.FieldByName('CateNo').Value := mNewCateNo;
|
||
CDS_1.FieldByName('ItemNo').Value := mNewItemNo;
|
||
CDS_1.Post;
|
||
except
|
||
ADOQueryCmd.Connection.RollbackTrans;
|
||
Application.MessageBox('保存明细项失败!', '提示信息', 0);
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
//重命名明细项
|
||
if ItemNameExists(mCateNo, mvalue, mItemNo) then
|
||
begin
|
||
Application.MessageBox('该业务大类下已存在同名明细项!', '提示信息', 0);
|
||
Exit;
|
||
end;
|
||
CDS_1.Edit;
|
||
CDS_1.FieldByName('BizItem').Value := mvalue;
|
||
CDS_1.Post;
|
||
with ADOQueryCmd do
|
||
begin
|
||
Close;
|
||
SQL.Clear;
|
||
SQL.Add('update KH_ZDY set ZDYName=' + QuotedStr(mvalue));
|
||
SQL.Add(' where ZDYNo=' + QuotedStr(mItemNo) + ' and Type=''' + CBizItemType + '''');
|
||
ExecSQL;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.TBOKClick(Sender: TObject);
|
||
begin
|
||
if CDS_1.IsEmpty or (Trim(CDS_1.FieldByName('BizCate').AsString) = '')
|
||
or (Trim(CDS_1.FieldByName('BizItem').AsString) = '') then
|
||
begin
|
||
Application.MessageBox('请先选择业务大类和明细项!', '提示信息', 0);
|
||
Exit;
|
||
end;
|
||
SelCateName := Trim(CDS_1.FieldByName('BizCate').AsString);
|
||
SelItemName := Trim(CDS_1.FieldByName('BizItem').AsString);
|
||
ModalResult := 1;
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.Tv1CellDblClick(Sender: TcxCustomGridTableView;
|
||
ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
|
||
AShift: TShiftState; var AHandled: Boolean);
|
||
begin
|
||
if Tv1.OptionsData.Editing = False then
|
||
TBOKClick(Sender);
|
||
end;
|
||
|
||
procedure TfrmBizCateSel.TBCloseClick(Sender: TObject);
|
||
begin
|
||
ModalResult := 2;
|
||
Close;
|
||
end;
|
||
|
||
end.
|