const nImageIndexI=44; nImageIndexO=45; nSubImageIndex=2; nAppendMode=0; nClearMode=1; Var frm_Subject: Tfrm_Subject;
implementation uses untcMdi,Gs_Class,Gs_Function;
{$R *.dfm}
//----------------------树显示执行模块------------------------------// Function tFrm_Subject.ShowTrees(oTree:tFcTreeView;oData:tAdoQuery;sFilter:string;nMode:Integer):Boolean; var oRootNode,oNode,oNode2,oNode3:tFcTreeNode; sID,sName,sText:string; i,j,nWay,nLevel,nLevelOld:Integer; Begin Try oData.Filter:=sFilter; oData.Filtered:=True; except application.MessageBox(pChar('设置过滤条件失败!'+#13+sFilter),'条件过滤',32); Exit; End; if nMode=nClearMode then oTree.Items.Clear; With oData do Begin i:=0; nLevel:=0; nLevelold:=0; //oRootNode:=oTree.Items.Add(Nil,'根节点'); oData.first; //首节点 While Not eof do Begin nLevel:=FieldByName('nLevel').AsInteger; nWay:=FieldByName('nWay').AsInteger; sID:=FieldByName('sID').asString; sName:=FieldByName('sName').AsString; sText:=sID+ DupeString(' ',8)+Trim(sName); If nLevel=0 then begin oNode:=oTree.Items.Add(Nil,sText); oNode.ImageIndex:=iif(nWay=1,nImageIndexI,nImageIndexO); end Else Begin if nLevelOld<>0 then begin if nLevel<nLevelOld then for j:=nLevel to nLevelOld-1 do begin oNode:=oNode.Parent; //获得上级节点:倒退n-1 end; if nLevel>nLevelOld then oNode:=oNode2; //获得上级节点:当前节点 end; oNode2:=oTree.Items.AddChild(oNode,sText); oNode2.ImageIndex:=iif(nWay=1,nImageIndexI,nImageIndexO); End; i:=i+1; nLevelOld:=nLevel; oData.Next; End; End; End; //-----------------树显示的主调度程序----------------------// Function tFrm_Subject.ShowAllTrees:Boolean; Begin With Query_M do begin SQL.Clear; Sql.Add('Select * from Subject Where left(sID,1)=:sIDSign Order By sID'); //设置列表显示 1 Close; Parameters.ParamValues['sIDSign']:='1'; Open; ShowTrees(Tree1,Query_M,',0); //列2 Close; Parameters.ParamValues['sIDSign']:='2'; Open; ShowTrees(Tree2,Query_M,',0); //列3 Close; Parameters.ParamValues['sIDSign']:='3'; Open; ShowTrees(Tree3,Query_M,',0); //列4 Close; Parameters.ParamValues['sIDSign']:='4'; Open; ShowTrees(Tree4,Query_M,',0); //列5 Close; Parameters.ParamValues['sIDSign']:='5'; Open; ShowTrees(Tree5,Query_M,',0); //列6 Close; Parameters.ParamValues['sIDSign']:='6'; Open; ShowTrees(Tree6,Query_M,',0); //恢复所有数据 Close; Filter:='; Filtered:=False; SQL.Clear; SQL.Add('Select * from Subject'); Open; End; End; //----返回选定的树-----------------// Function tFrm_Subject.GetSelectedTree(const lNeedInfo:Boolean=False):tFcTreeView; Begin Result:=nil; case PageControl_Main.ActivePageIndex of 0:Result:=Tree1; 1:Result:=Tree2; 2:Result:=Tree3; 3:Result:=Tree4; 4:Result:=Tree5; 5:Result:=Tree6; end; if not Assigned(Result) then begin Result:=nil; if lNeedInfo then messagebox(handle,'没有选择树项目!','选择树',0); exit; end; End; //------------返回当前选定的项目Node----------------// Function tFrm_Subject.GetSelectedNode(const lNeedInfo:boolean=False):tFcTreeNode; var oNood:tFcTreeNode; Begin Result:=nil; case PageControl_Main.ActivePageIndex of 0:oNood:=Tree1.selected; 1:oNood:=Tree2.Selected; 2:oNood:=Tree3.Selected; 3:oNood:=Tree4.Selected; 4:oNood:=Tree5.Selected; 5:oNood:=Tree6.Selected; end; if not Assigned(oNood) then begin if lNeedInfo then messagebox(handle,'没有选择项目!','选择科目先',0); exit; end; Result:=oNood; End; //-------查找当前选定的科目记录,并返回其编号----------------// Function tFrm_Subject.GetSelectedItem(const lNeedInfo:Boolean=True):String; var oNood:tFcTreeNode; s:string; Begin Result:='; if Query_M.IsEmpty then begin if lNeedInfo then application.MessageBox('没有数据可以处理!','没有数据',0); exit; end; oNood:=GetSelectedNode(); if on_ood=nil then begin if lNeedInfo then application.MessageBox('没有选择科目项目!','没有选择科目',0); exit; end; s:=Trim(oNood.Text); if StrToIntDef(s,0)<1000 then s:=Trim( leftStr(s,Pos(dupeString(' ',6),s)) ); if s=' then begin if lNeedInfo then messagebox(handle,'请先选择科目项目!','选择科目先',0); exit; end; Query_M.Locate('sID',s,[loCaseInsensitive]); if Query_M.Eof then begin if lNeedInfo then application.MessageBox(pChar('查找编号失败!'+s),'编号',32); exit; end; Result:=s; End;
procedure Tfrm_Subject.FormClose(Sender: TObject; var Action: TCloseAction); begin action:=caFree; end;
procedure Tfrm_Subject.cmd_ReturnClick(Sender: TObject); begin close; end;
procedure Tfrm_Subject.FormCreate(Sender: TObject); begin ShowAllTrees; PageControl_Main.ActivePageIndex:=0;
end;
procedure Tfrm_Subject.cmd_EditClick(Sender: TObject); var frm_EditSubject:tFrm_EditSubject; s,sname:string; begin s:=GetSelectedItem; if s=' then exit; frm_EditSubject:=tFrm_EditSubject.Create(self); with frm_EditSubject do begin sSubjectID:=s; nRunMode:=0; //运行模式:0=修改,1=添加 nrLevel:=Query_M.FieldValues['nLevel']; edt_sID.ReadOnly:=true; edt_sID.Text:=Query_M.FieldValues['sID']; edt_sName.Text:=Query_M.FieldValues['sName']; edt_sShort.Text:=Query_M.FieldValues['sShort']; edt_sComment.Text:=Query_M.FieldValues['sComment']; rdb_nWayI.Checked:=(Query_M.FieldByName('nWay').AsInteger=1); rdb_nWayO.Checked:=not rdb_nWayi.Checked; chk_lcMoney.Checked:=Query_M.FieldByName('lcMoney').AsBoolean; cbx_sCompany.LookupValue:=Query_M.FieldValues['sCompany'];
ShowModal; if ModalResult<>mrOK then exit; end; Try Query_M.Close; Query_M.Open; sName:=Query_M.Lookup('sID',s,'sName'); if sName<>' then With GetSelectedNode Do begin Text:=s+DupeString(' ',8)+sName ; End; Except End; end;
procedure Tfrm_Subject.Tree1DblClick(TreeView: TfcCustomTreeView; Node: TfcTreeNode; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var sID:string; begin sID:=GetSelectedItem(False); if sID=' then exit; if nRunMode=0 then cmd_Edit.Click; //修改模式,正常模式
end;
procedure Tfrm_Subject.cmd_DeleteClick(Sender: TObject); var v:variant; s:string; b:Boolean; nim,nom,nf,ne:Real; begin s:=GetSelectedItem; if s=' then exit; with Query_M do begin v:=LookUp('sID',s,'lSystem;niMoney;noMoney;nEnd;nFirst'); if (VarType(v) in [VarNull]) then begin application.MessageBox('找不到该项目!','项目',0); exit; End; b:=iif(v[0]=Null,True,v[0]); nim:=iif(v[1]=Null,0,v[1]); nom:=iif(v[2]=Null,0,v[2]); nf:=iif(v[4]=Null,0,v[4]); ne:=iif(v[3]=Null,0,v[3]); if b then begin application.MessageBox('系统创建的项目不能删除!!','系统项目',0); exit; End; if (nim<>0) or (noM<>0) or (nf<>0) or (ne<>0) then begin application.MessageBox('该项目已经有发生额,不允许删除!!','发生额',32); exit; end; //判断是否有下级子科目 Try Query_R.SQL.Text:='Select Count(*) as nCount from Subject '+ 'Where Left(sID,'+inttostr(length(s))+')=''+s+'' And '+ 'nLevel>(Select top 1 nLevel from Subject Where sID=''+s+'' Order By nLevel Desc)'; Query_R.Open; if not Query_R.IsEmpty then if Query_R.Fields[0].AsInteger>0 then begin Messagebox(handle,'该科目包含子项目,不能删除!!','子科目',32); Exit; End; Query_R.Close; Except messagebox(handle,'系统检查该科目是否包含子科目失败,请手工检查之,若包含子科目请勿删除!','自动检查子科目',32); End;
if application.MessageBox('确认要删除吗?','删除确认',32+4+256)<>6 then exit;
With Query_R do Try close; SQL.Clear; SQL.Add('Delete From Subject Where sID=''+s+'');
procedure Tfrm_Subject.cmd_AddThisClick(Sender: TObject); var s,sCurID,sValue:string; nLevel,nLen:Integer; nMax:Double; lMax:boolean; vInfo:variant; oNood:tFcTreeNode; begin s:=GetSelectedItem(False); oNood:=GetSelectedNode; sCurID:=s; //保存当前编号 if (s=') and (nAddMode=1) then begin nAddMode:=0; messagebox(handle,'请选择子科目的上级科目!','选择上级科目',0); Exit; End; //确定选择信息 vInfo:=NULL; if s=' then //没有选择项目,在增加下级科目时不出现 begin s:=IntToStr(PageControl_Main.ActivePageIndex+1); nLevel:=nAddMode; //默认级别,是1级则一级,否则0级 nLen:=1; lMax:=False; end Else //选择了级别的,取前边的数字 begin vInfo:=Query_M.Lookup('sID',sCurID,'nLevel;sName;nWay;lcMoney'); If (VarType(vInfo) in [VarNull]) then //找不到数据 nLevel:=0+nAddMode Else begin nLevel:=iif(vInfo[0]=NULL,0,vInfo[0])+nAddMode; //找到了,同级则同级,下级则加1 lMax:=True; End; // nLen:=iif(nAddMode=1,length(s), // Length(s)-(nLevel+ iif(nLevel=0,1,0))*3); //同级长度减3X,下级不变 nLen:=Length(s)-iif(nAddMode=1,0,1)*3; s:=iif(nAddMode=1,s,leftstr(s,nLen)); //同级编号取减,下级不变 End; //执行选择,获取当前最大编号 Query_R.Close; Query_R.SQL.Text:='Select Top 1 sID from Subject '+ 'Where nLevel='+IntToStr(nLevel)+' And '+ 'Left(sID,'+IntToStr(nLen)+')=''+s+'' Order By sID Desc'; Try Query_R.Open; lMax:=not Query_R.IsEmpty; //如果找到项目了,则可以取最大,不允许修改,否则允许修改 if Query_R.IsEmpty then sValue:=' Else if Query_R.Fields[0].AsString=NULL then sValue:=' else sValue:=Query_R.Fields[0].AsString; Query_R.Close; Except Application.MessageBox('自动获取最大编号失败!请手工填写!','手工填写',32); lMax:=False; End; if sValue=' then begin nMax:=StrToFloatDef(s+DupeString('0',(1+nAddMode+iif(nAddMode=0,0,-1))*3), //nLevel+1-nAddMode (PageControl_Main.ActivePageIndex+1)*1000); sValue:=FloattoStr(nMax); End; nMax:=strtoFloatDef(sValue, (PageControl_Main.ActivePageIndex+1)*1000)+1; if nMax>=9999999999999999 then begin application.MessageBox('长度超过16位后系统将难以控制,添加终止。','长度超长',0); Exit; End; sValue:=StepNumToStr(nMax); //自动增加,并且调用显示界面 frm_EditSubject:=tFrm_EditSubject.Create(self); With frm_EditSubject do begin nRunMode:=1; //添加模式 nrLevel:=nLevel; //级别 edt_sID.text:=sValue; //新增加编号 edt_sID.Readonly:=lMax; //是否允许修改 edt_sName.text:=DupeString(' ',nLevel*3)+ '新增科目['+edt_sID.text+']'; edt_sShort.Text:='; edt_sComment.Text:='; cbx_sCompany.LookupValue:='; if ( VarType(vInfo) in [VarNull,VarEmpty]) then //当没有找到当前科目记录 Begin chk_lcMoney.Checked:=False; rdb_nWayI.Checked:=True; end Else Begin chk_lcMoney.Checked:=iif(vInfo[3]=NULL,False,vInfo[3]); rdb_nWayI.Checked:=( iif(vInfo[2]=NULL,1,vInfo[2])=1 ); End; if ShowModal<>mrOK then begin nAddMode:=0; exit; end; //用户取消了 End; //重新打开数据表 Try Query_M.Close; Query_M.SQL.Text:='Select * From Subject'; Query_M.Open; Except Messagebox(handle,'打开数据库出错,您可以关闭之后重试!','数据库',0); End; //设置该项目的显示 With Query_R do begin Close; SQL.Text:='Select * From Subject Where sID=''+sAddedID+''; Try Open; if isEmpty then begin application.MessageBox(pChar('查找新增加的科目信息出错,您可以在重新打开本窗口时看到该科目。编号='+sAddedID),'科目找不到',32); Exit; End; sValue:=iif(FieldValues['sID']=Null,'未知编号',Trim(fieldvalues['sID']))+DupeString(' ',8); sValue:=sValue+iif(FieldValues['sName']=Null,'未知名称',trim(fieldvalues['sName'])); nLevel:=iif(FieldValues['nLevel']=Null,0,FieldValues['nLevel']); Except application.MessageBox(pChar('查找新增加的科目信息出错,您可以在重新打开本窗口时看到该科目。编号='+sAddedID),'科目找不到',32); Exit; End; if nAddMode=0 then //增加同级科目 begin if not Assigned(oNood) then oNood:=GetSelectedTree.Items.Add(nil,sValue) else begin if nLevel=0 then GetSelectedTree.Items.Add(nil,sValue) else GetSelectedTree.items.AddChild(oNood.Parent,sValue); end; End else //增加下级科目 begin if not Assigned(oNood) then oNood:=GetSelectedTree.Items.AddChild(nil,sValue) else Begin if nLevel=0 then GetSelectedTree.Items.Add(nil,sValue) else GetSelectedTree.Items.AddChild(oNood,sValue); end; end; End;
self.nAddMode:=0; //恢复默认值:添加同级科目=0 end;
procedure Tfrm_Subject.cmd_AddLowClick(Sender: TObject); begin nAddMode:=1; cmd_AddThis.Click; end;
//关联数据库的结构表 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[subject]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[subject] GO