U_Bmda.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:12k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit U_Bmda;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   ExtCtrls, ComCtrls, Buttons, Db, DBClient, ImgList, Menus, StdCtrls,
  6.   Mask, DBCtrls, Grids, DBGrids;
  7. type
  8.   TfrmBmda = class(TForm)
  9.     Panel1: TPanel;
  10.     TreeView: TTreeView;
  11.     Splitter1: TSplitter;
  12.     StatusBar: TStatusBar;
  13.     pmOperate: TPopupMenu;
  14.     N_insert: TMenuItem;
  15.     N_delete: TMenuItem;
  16.     N_edit: TMenuItem;
  17.     N_cancel: TMenuItem;
  18.     N_save: TMenuItem;
  19.     N7: TMenuItem;
  20.     N_refresh: TMenuItem;
  21.     ImageList1: TImageList;
  22.     DataSource: TDataSource;
  23.     Panel2: TPanel;
  24.     PageControl1: TPageControl;
  25.     TabSheet1: TTabSheet;
  26.     TabSheet2: TTabSheet;
  27.     Panel3: TPanel;
  28.     Label3: TLabel;
  29.     Label1: TLabel;
  30.     Label2: TLabel;
  31.     Label4: TLabel;
  32.     Label5: TLabel;
  33.     Label6: TLabel;
  34.     Label7: TLabel;
  35.     Label8: TLabel;
  36.     DBEdt_Bmbm: TDBEdit;
  37.     DBEdt_Bmmc: TDBEdit;
  38.     DBEdt_Fzrxm: TDBEdit;
  39.     DBEdt_Bmsx: TDBEdit;
  40.     DBEdt_Lxdh: TDBEdit;
  41.     DBEdt_DZ: TDBEdit;
  42.     DBEdt_BZ: TDBEdit;
  43.     DBGrid: TDBGrid;
  44.     ImageList2: TImageList;
  45.     pmOther: TPopupMenu;
  46.     N_Order: TMenuItem;
  47.     N_Print: TMenuItem;
  48.     procedure FormShow(Sender: TObject);
  49.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  50.     procedure N_insertClick(Sender: TObject);
  51.     procedure N_saveClick(Sender: TObject);
  52.     procedure N_refreshClick(Sender: TObject);
  53.     procedure N_editClick(Sender: TObject);
  54.     procedure N_cancelClick(Sender: TObject);
  55.     procedure N_deleteClick(Sender: TObject);
  56.     procedure TreeViewClick(Sender: TObject);
  57.     procedure N_OrderClick(Sender: TObject);
  58.     procedure N_PrintClick(Sender: TObject);
  59.     procedure DBGridTitleClick(Column: TColumn);
  60.   private
  61.     Node_Parent: TTreeNode; //存储父节点
  62.     Node_Child: TTreeNode; //存储当前节点
  63.     b_pd: bool; //用于判断点击的是添加还是编辑
  64.     //在添加、编辑和浏览状态互置按钮的有效性
  65.     procedure button_valid;
  66.     //RefreshTree方法用于将部门档案的部门编码分层次以树型目录的形式显示出来
  67.     procedure refreshTree;
  68.     { Private declarations }
  69.   public
  70.     { Public declarations }
  71.   end;
  72. var
  73.   frmBmda: TfrmBmda;
  74. implementation
  75. uses U_mainform, U_szcx, U_general_print, u_public, WzglDB;
  76. {$R *.DFM}
  77. //在添加、编辑和浏览状态互置组件的有效性
  78. procedure TfrmBmda.button_valid;
  79. begin
  80.   DBEdt_Bmbm.enabled := not DBEdt_Bmbm.enabled;
  81.   DBEdt_Bmmc.enabled := not DBEdt_Bmmc.enabled;
  82.   DBEdt_Fzrxm.enabled := not DBEdt_Fzrxm.enabled;
  83.   DBEdt_Bmsx.enabled := not DBEdt_Bmsx.enabled;
  84.   DBEdt_Lxdh.enabled := not DBEdt_Lxdh.enabled;
  85.   DBEdt_DZ.enabled := not DBEdt_DZ.enabled;
  86.   DBEdt_BZ.enabled := not DBEdt_BZ.enabled;
  87.   n_insert.enabled := not n_insert.enabled;
  88.   n_delete.enabled := not n_delete.enabled;
  89.   n_edit.enabled := not n_edit.enabled;
  90.   n_cancel.enabled := not n_cancel.enabled;
  91.   n_save.enabled := not n_save.enabled;
  92.   n_refresh.enabled := not n_refresh.enabled;
  93.   Treeview.enabled := not Treeview.Enabled;
  94. end;
  95. //RefreshTree方法用于将部门档案的部门编码分层次以树型目录的形式显示出来
  96. procedure TfrmBmda.refreshTree;
  97. var
  98.   mynode_1, mynode_2, mynode_3: Ttreenode;
  99.   s_bm_1: string;
  100.   s_mc_1: string;
  101. begin
  102.   statusbar.panels[0].text := '正在进行数据处理...';
  103.   statusbar.refresh;
  104.   treeview.Items.clear;
  105.   //添加根目录名
  106.   mynode_1 := Treeview.Items.Add(Treeview.topitem, '部门档案');
  107.   mynode_1.imageindex := 0;
  108.   mynode_1.stateindex := -1;
  109.   mynode_1.selectedindex := 1;
  110.   //指定部门表记录顺序
  111.   DM.CDS_BMDA.indexfieldnames := '部门编码';
  112.   DM.CDS_BMDA.First;
  113.   while not DM.CDS_BMDA.Eof do
  114.   begin
  115.     s_bm_1 := DM.CDS_BMDA.fieldbyname('部门编码').asstring;
  116.     s_mc_1 := DM.CDS_BMDA.fieldbyname('部门名称').asstring;
  117.     //添加第一级部门名
  118.     if length(trim(s_bm_1)) = 2 then
  119.     begin
  120.       mynode_2 := Treeview.items.addchild(mynode_1, '(' + s_bm_1 + ') ' + s_mc_1);
  121.       mynode_2.imageindex := 0;
  122.       mynode_2.stateindex := -1;
  123.       mynode_2.selectedindex := 1;
  124.     end;
  125.     //添加第二级部门名
  126.     if length(trim(s_bm_1)) = 5 then
  127.     begin
  128.       mynode_3 := Treeview.items.addchild(mynode_2, '(' + s_bm_1 + ') ' + s_mc_1);
  129.       mynode_3.imageindex := 0;
  130.       mynode_3.stateindex := -1;
  131.       mynode_3.selectedindex := 1;
  132.     end;
  133.     DM.CDS_BMDA.next;
  134.   end;
  135.   statusbar.panels[0].text := '';
  136.   statusbar.refresh;
  137. end;
  138. procedure TfrmBmda.FormShow(Sender: TObject);
  139. begin
  140.   with DM do
  141.   begin
  142.     CDS_BMDA.Active := True;
  143.     CDS_BMDA_Index.Active := True;
  144.   end;
  145.   refreshTree; //调用RefreshTree方法将部门档案的部门编码分层次以树型目录的形式显示出来
  146.   Treeview.topitem.Selected := true;
  147. end;
  148. procedure TfrmBmda.FormClose(Sender: TObject; var Action: TCloseAction);
  149. begin
  150.   action := cafree;
  151.   frmBmda := nil;
  152. end;
  153. //添加
  154. procedure TfrmBmda.N_insertClick(Sender: TObject);
  155. var
  156.   gs_global: string; //存储添加的父节点标题;
  157. begin
  158.   b_pd := true;
  159.   Node_Parent := Treeview.selected;
  160.   if Node_Parent.level = 2 then
  161.   begin
  162.     Application.messagebox('最底层不能添加,请在上层添加', '物资管理系统', mb_iconinformation + mb_defbutton1);
  163.     exit;
  164.   end;
  165.   //设置按扭的有效性
  166.   button_valid;
  167.   if Node_Parent.level = 0 then
  168.   begin
  169.     DM.CDS_BMDA.Insert;
  170.     DM.CDS_BMDA.FieldByName('部门编码').editmask := '99;1;_';
  171.     pagecontrol1.ActivePageIndex := 0;
  172.     DBEdt_Bmbm.setfocus;
  173.   end;
  174.   if Node_Parent.level = 1 then
  175.   begin
  176.     gs_global := copy(Node_Parent.text, 2, 2);
  177.     DM.CDS_BMDA.insert;
  178.     DM.CDS_BMDA.FieldByName('部门编码').editmask := '99-99;1;_';
  179.     pagecontrol1.ActivePageIndex := 0;
  180.     DBEdt_Bmbm.setfocus;
  181.     DBEdt_Bmbm.text := gs_global;
  182.   end;
  183. end;
  184. procedure TfrmBmda.N_editClick(Sender: TObject);
  185. begin
  186.   b_pd := false;
  187.   Node_Child := Treeview.selected;
  188.   if Node_Child.level = 0 then
  189.   begin
  190.     Application.messagebox('最顶层不能编辑,请在下层编辑', '物资管理系统', mb_iconinformation + mb_defbutton1);
  191.     exit;
  192.   end;
  193.   //设置按扭有效性
  194.   button_valid;
  195.   Node_Parent := Node_Child.parent;
  196.   if Node_Parent.level = 0 then
  197.   begin
  198.     DM.CDS_BMDA.edit;
  199.     DM.CDS_BMDA.FieldByName('部门编码').editmask := '99;1;_';
  200.     pagecontrol1.ActivePageIndex := 0;
  201.     DBEdt_Bmbm.setfocus;
  202.   end;
  203.   if Node_Parent.level = 1 then
  204.   begin
  205.     DM.CDS_BMDA.edit;
  206.     DM.CDS_BMDA.FieldByName('部门编码').editmask := '99-99;1;_';
  207.     pagecontrol1.ActivePageIndex := 0;
  208.     DBEdt_Bmbm.setfocus;
  209.   end;
  210. end;
  211. //删除
  212. procedure TfrmBmda.N_deleteClick(Sender: TObject);
  213. var
  214.   mynode: Ttreenode;
  215. begin
  216.   mynode := Treeview.selected;
  217.   //根目录不须删除
  218.   if mynode.level = 0 then
  219.     exit;
  220.   //如果删除的是第二级目录  
  221.   if mynode.level = 2 then
  222.   begin
  223.     if DM.CDS_BMDA.recordcount <> 0 then
  224.     begin
  225.       if Application.messagebox('请确认是否要删除,并且子目录也将被删除', '物资管理系统', mb_iconinformation + mb_yesno) = idyes then
  226.       begin
  227.         DM.CDS_BMDA.Delete;
  228.         DM.CDS_BMDA.applyupdates(0);
  229.         Treeview.Items.delete(mynode);
  230.       end;
  231.     end
  232.     else
  233.     begin
  234.       Application.messagebox('已无记录可删除', '物资管理系统', mb_iconinformation + mb_defbutton1);
  235.       exit;
  236.     end;
  237.     EXIT;
  238.   end;
  239.   //如果删除是第一级目录,还得删除第二级目录
  240.   if mynode.level = 1 then
  241.   begin
  242.     DM.CDS_BMDA.filter := 'substring(部门编码,1,2)=' + '''' + copy(mynode.text, 2, 2) + '''';
  243.     DM.CDS_BMDA.filtered := true;
  244.     DM.CDS_BMDA.first;
  245.     if DM.CDS_BMDA.recordcount <> 0 then
  246.     begin
  247.       if Application.messagebox('请确认是否要删除,并且子目录也将被删除', '物资管理系统', mb_iconinformation + mb_yesno) = idyes then
  248.       begin
  249.         while not DM.CDS_BMDA.eof do
  250.         begin
  251.           DM.CDS_BMDA.Delete;
  252.         end;
  253.         DM.CDS_BMDA.applyupdates(0);
  254.         Treeview.Items.delete(mynode);
  255.       end;
  256.     end
  257.     else
  258.     begin
  259.       Application.messagebox('已无记录可删除', '物资管理系统', mb_iconinformation + mb_defbutton1);
  260.       exit;
  261.     end;
  262.     DM.CDS_BMDA.filtered := false;
  263.   end;
  264. end;
  265. //恢复
  266. procedure TfrmBmda.N_cancelClick(Sender: TObject);
  267. begin
  268.   DM.CDS_BMDA.cancel;
  269.   //设置组件的有效性
  270.   button_valid;
  271. end;
  272. //保存
  273. procedure TfrmBmda.N_saveClick(Sender: TObject);
  274. var
  275.   s_bm, s_mc: string;
  276. begin
  277.   if Node_Parent.level = 0 then
  278.   begin
  279.     if length(trim(DBEdt_Bmbm.text)) <> 2 then
  280.     begin
  281.       Application.messagebox('编码应为两位', '物资管理系统', mb_iconinformation + mb_defbutton1);
  282.       exit;
  283.     end;
  284.   end;
  285.   if Node_Parent.level = 1 then
  286.   begin
  287.     if copy(DBEdt_Bmbm.text, 1, 2) <> copy(Node_Parent.text, 2, 2) then
  288.     begin
  289.       Application.messagebox('前面两位不能变,请确认!', '物资管理系统', mb_iconinformation + mb_defbutton1);
  290.       DBEdt_Bmbm.text := copy(Node_Parent.text, 2, 2);
  291.       exit;
  292.     end;
  293.     if length(trim(DBEdt_Bmbm.text)) <> 5 then
  294.     begin
  295.       Application.messagebox('编码应为五位', '物资管理系统', mb_iconinformation + mb_defbutton1);
  296.       exit;
  297.     end;
  298.   end;
  299.   s_bm := DBEdt_Bmbm.text;
  300.   s_mc := DBEdt_Bmmc.text;
  301.   //查找重复编号
  302.   DM.CDS_BMDA_INDEX.IndexFieldNames := '部门编码';
  303.   DM.CDS_BMDA_INDEX.Refresh;
  304.   if DM.CDS_BMDA.state = dsinsert then
  305.   begin
  306.     if DM.CDS_BMDA_INDEX.FindKey([s_bm]) then
  307.     begin
  308.       application.MessageBox('部门编码已重复', '物资管理系统', mb_iconinformation + mb_defbutton1);
  309.       pagecontrol1.ActivePageIndex := 0;
  310.       DBEdt_Bmbm.SetFocus;
  311.       exit;
  312.     end;
  313.   end;
  314.   //判断是添加数据的保存还是编辑数据保存
  315.   if b_pd = true then
  316.     Treeview.items.addchild(Node_Parent, '(' + s_bm + ') ' + s_mc)
  317.   else
  318.     Node_Child.Text := '(' + s_bm + ') ' + s_mc;
  319.   DM.CDS_BMDA.post;
  320.   DM.CDS_BMDA.applyupdates(0);
  321.   DM.CDS_BMDA.Refresh;
  322.   //设置按扭的有效性
  323.   button_valid;
  324. end;
  325. //刷新
  326. procedure TfrmBmda.N_refreshClick(Sender: TObject);
  327. begin
  328.   refreshTree;
  329.   Treeview.TopItem.selected := true;
  330. end;
  331. //TreeViewClick根据部门编码来定位数据集,从而实现数据的联动
  332. procedure TfrmBmda.TreeViewClick(Sender: TObject);
  333. var
  334.   mynode: Ttreenode;
  335.   s_value_1: string;
  336. begin
  337.   if Treeview.Items.Count = 0 then
  338.     exit;
  339.   mynode := Treeview.selected;
  340.   //如果是在目录树的第一级,代表是第一级部门,它的部门编码只有两位
  341.   if mynode.Level = 1 then
  342.   begin
  343.     //从目录树的节点标题中,提取部门编码
  344.     s_value_1 := copy(mynode.text, 2, 2);
  345.     DM.CDS_BMDA.IndexFieldNames := '部门编码';
  346.     DM.CDS_BMDA.findkey([s_value_1]);
  347.     DM.CDS_BMDA.FieldByName('部门编码').editmask := '99;1;_';
  348.   end;
  349.  //如果是在目录树的第二级,代表是第二级部门,它的部门编码有五位
  350.   if mynode.Level = 2 then
  351.   begin
  352.     //从目录树的节点标题中,提取部门编码
  353.     s_value_1 := copy(mynode.text, 2, 5);
  354.     DM.CDS_BMDA.IndexFieldNames := '部门编码';
  355.     DM.CDS_BMDA.FindKey([s_value_1]);
  356.     DM.CDS_BMDA.FieldByName('部门编码').editmask := '99-999;1;_';
  357.   end;
  358. end;
  359. //排序
  360. procedure TfrmBmda.N_OrderClick(Sender: TObject);
  361. var
  362.   vs_value: string;
  363.   vi, i: integer;
  364. begin
  365.   application.createform(TfrmSzcx, frmSzcx);
  366.   frmSzcx.srclist.items.add('部门编码');
  367.   frmSzcx.srclist.items.add('部门名称');
  368.   frmSzcx.srclist.items.add('负责人姓名');
  369.   frmSzcx.srclist.items.add('部门属性');
  370.   frmSzcx.srclist.items.add('联系电话');
  371.   frmSzcx.srclist.items.add('地址');
  372.   try
  373.     frmSzcx.showmodal;
  374.   finally
  375.     if Ordered then
  376.     begin
  377.       vi := frmSzcx.DstList.Items.Count;
  378.       if vi > 0 then
  379.       begin
  380.         vs_value := frmSzcx.dstlist.items[0];
  381.       end;
  382.       for i := 2 to vi do
  383.       begin
  384.         vs_value := vs_value + ';' + frmSzcx.dstlist.items[i - 1];
  385.       end;
  386.       DM.CDS_BMDA.IndexFieldNames := vs_value;
  387.     end;
  388.     frmSzcx.free;
  389.   end;
  390. end;
  391. //打印
  392. procedure TfrmBmda.N_PrintClick(Sender: TObject);
  393. begin
  394.   //打开通用报表窗体
  395.   application.createform(TfrmPrint, frmPrint);
  396.   with frmPrint do
  397.   begin
  398.     //添加打印的字段头
  399.     srclist.items.add('部门编码');
  400.     srclist.items.add('部门名称');
  401.     srclist.items.add('负责人姓名');
  402.     srclist.items.add('部门属性');
  403.     srclist.items.add('联系电话');
  404.     srclist.items.add('地址');
  405.     srclist.items.add('备注');
  406.     //设置表名
  407.     vps_tablename := 'WZ_BMDA';
  408.     //设置过滤条件
  409.     vps_filter := DM.CDS_BMDA.Filter;
  410.     //设置排序索引
  411.     vps_index := DM.CDS_BMDA.IndexFieldNames;
  412.     edtPrintTitle.Text := '部门列表';
  413.     try
  414.       showmodal;
  415.     finally
  416.       free;
  417.     end;
  418.   end;
  419. end;
  420. procedure TfrmBmda.DBGridTitleClick(Column: TColumn);
  421. begin
  422.   //调用u_public单元的DBGridSort按表格的列字段排序
  423.   DBGridSort(dbgrid, column);
  424. end;
  425. end.