📄 basepower.pas
字号:
unit BasePower;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Basic, Menus, ActnList, ImgList, RzPanel, RzButton, ExtCtrls,
Grids, DBGridEh, StdCtrls, Mask, RzEdit, RzDBEdit, RzCmboBx, ppBands,
ppCache, ppClass, ppProd, ppReport, ppRelatv, ppDB, ppDBPipe, ppComm,
ppEndUsr;
type
TfrmBasePower = class(TfrmBasic)
dbgridList: TDBGridEh;
plInput: TRzPanel;
Splitter1: TSplitter;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label8: TLabel;
RzComboBox1: TRzComboBox;
RzComboBox2: TRzComboBox;
RzComboBox3: TRzComboBox;
RzComboBox4: TRzComboBox;
Label1: TLabel;
Label2: TLabel;
RzComboBox5: TRzComboBox;
btnAddFunction: TRzButton;
procedure FormCreate(Sender: TObject);
procedure plInputResize(Sender: TObject);
procedure btnAddFunctionClick(Sender: TObject);
private
{ Private declarations }
procedure doMyOpen(Sender: TObject; var _EventNote, _State: String); override;
procedure doNewData(Sender: TObject; var _EventNote, _State: String); override;
procedure doSave(Sender: TObject; var _EventNote, _State: String); override;
procedure doCancel(Sender: TObject; var _EventNote, _State: String); override;
procedure doDelete(Sender: TObject; var _EventNote, _State: String); override;
function GetListNum(_Val: String): Integer; //从字符串中取关键字
public
{ Public declarations }
end;
var
frmBasePower: TfrmBasePower;
implementation
uses main, MyPublic, dm32;
{$R *.dfm}
procedure TfrmBasePower.doCancel(Sender: TObject; var _EventNote, _State: String);
begin
ShowMess('提示','非常抱歉,该单元不提供该功能!可以用删除来代替!', MB_OK);
end;
procedure TfrmBasePower.doDelete(Sender: TObject; var _EventNote, _State: String);
var li_DJ: Integer;
ls_Num, ls_SQL, ls_Err: String;
begin
ls_Num := dm.qryPowerInfo.FieldByName('CODE').AsString;
li_DJ := dm.qryPowerInfo.FieldByName('DJ').AsInteger;
if not ShowMess('询问','确定要删除'+ IntToStr(li_DJ) +'级项['+ ls_Num+']吗?', MB_OKCANCEL) then Exit;
_EventNote := '删除系统'+ IntToStr(li_DJ) +'级权限资料[' +ls_Num+ ']';
_State := EV_OK;
Case li_DJ of
1: begin //删除一级功能:比如:直接删除所用10开头的
ls_Err := doSQL('DELETE FROM POWERINFO WHERE CODE LIKE ''' + ls_Num+'%''');
end;
2: begin //删除二级功能:比如:先删除10100开头的,再检查还有没有10开头的二级项目,没有的话,就删除主项
ls_Err := doSQL('DELETE FROM POWERINFO WHERE CODE LIKE ''' + ls_Num+'%''');
ls_Err := ls_Err +
doSQL('DELETE FROM POWERINFO WHERE CODE =''' + Copy(ls_Num, 1, 2) +''''+
' AND NOT EXISTS (SELECT * FROM POWERINFO WHERE DJ = 2'+
' AND CODE LIKE ''' + Copy(ls_Num, 1, 2) +'%'')');
end;
3: begin //删除三级功能:比如:先删除10100100,再检查有没有10100开头的,如果没有,就删除二级项目
// 删除二级项目后,再检查有没有10开头的二级项目,如果没有,就连主项一起删除
ls_Err := doSQL('DELETE FROM POWERINFO WHERE CODE = ''' +ls_Num+ '''');
ls_Err := ls_Err +
doSQL('DELETE FROM POWERINFO WHERE CODE = ''' +Copy(ls_Num, 1, 5) +''''+
' AND NOT EXISTS (SELECT * FROM POWERINFO WHERE DJ = 3'+
' AND CODE LIKE ''' + Copy(ls_Num, 1, 5) +'%'')');
ls_Err := ls_Err +
doSQL('DELETE FROM POWERINFO WHERE CODE = ''' +Copy(ls_Num, 1, 2) +''''+
' AND NOT EXISTS (SELECT * FROM POWERINFO WHERE DJ = 2'+
' AND CODE LIKE ''' + Copy(ls_Num, 1, 2) +'%'')');
end;
end;
if ls_Err <> '' then
begin
ShowMess('系统错误','删除系统权限资料时失败,具体为:'+ls_Err, MB_ICONERROR);
_State := EV_FAIL;
Exit;
end;
ShowMess('提示','成功将该功能从系统功能树上删除!', MB_OK);
actOpenExecute(nil);
end;
procedure TfrmBasePower.doMyOpen(Sender: TObject; var _EventNote, _State: String);
var ls_SQL, ls_Err: String;
begin
_EventNote := '打开系统权限资料';
_State := EV_OK;
ls_SQL := 'SELECT * FROM POWERINFO ORDER BY LEFT(CODE,2), LEFT(CODE,5), LEFT(CODE,8), DJ';
ls_Err := OpenDataSet(dm.qryPowerInfo, ls_SQL);
if ls_Err <> '' then
begin
ShowMess('系统错误','打开系统权限资料时失败,具体为:'+ls_Err, MB_ICONERROR);
_State := EV_FAIL;
Exit;
end;
end;
procedure TfrmBasePower.doNewData(Sender: TObject; var _EventNote, _State: String);
begin
RzComboBox1.SetFocus;
UseDataSet.Edit;
end;
procedure TfrmBasePower.doSave(Sender: TObject; var _EventNote, _State: String);
var ls_num, ls_Err: String;
SQLs: TStrings;
ls_tmp: String;
begin
//保存系统权限
_EventNote := '保存系统功能资料';
_State := EV_OK;
SQLs := TStringList.Create;
try
//1、先确认是否有菜单大类项,没有否添加
ls_num := IntToStr(GetListNum(RzComboBox1.Text));
if GetRC('POWERINFO', 'CODE='''+ ls_num +'''') = 0 then
SQLs.Add('INSERT INTO POWERINFO (DJ,CODE,NAME,WINNAME,ACTNAME) VALUES ( '+
'1,'+ //第一级
''''+ ls_num +''','+
''''+ GetKeyValue(RzComboBox1.Text,1) + ''','+
''''+ 'frmMain' + ''','+
''''+ GetKeyValue(RzComboBox1.Text) + ''')');
//2、使用大类序号,检查有无Action子项,没有则添加
if GetRC('POWERINFO', 'ACTNAME='''+ GetKeyValue(RzComboBox2.Text) +''' AND '+
'CODE LIKE '''+ ls_num + '%'' AND DJ=2') = 0 then
begin
ls_tmp := '';
ls_err := GetFieldVal('POWERINFO', 'MAX(CODE)', 'CODE LIKE '''+ ls_num + '%'' AND DJ = 2', ls_tmp);
if ls_err <> '' then Raise Exception.Create('取最大Action子项流水号出错:'+ls_Err);
if ls_tmp = '' then ls_num := ls_num + '100'
else ls_num := IntToStr(StrToInt(ls_tmp) + 1);
SQLs.Add('INSERT INTO POWERINFO (DJ,CODE,NAME,WINNAME,ACTNAME) VALUES ( '+
'2,'+ //第一级
''''+ ls_num +''','+
''''+ GetKeyValue(RzComboBox2.Text,1) + ''','+
''''+ 'frmMain' + ''','+
''''+ GetKeyValue(RzComboBox2.Text) + ''')');
end else
begin
//取已有项的流水号
ls_err := GetFieldVal('POWERINFO', 'CODE', 'ACTNAME='''+ GetKeyValue(RzComboBox2.Text) +''' AND '+
'CODE LIKE '''+ ls_num + '%'' AND DJ = 2', ls_tmp);
if ls_Err <> '' then Raise Exception.Create('取原有Action子项流水号失败:'+ls_Err);
ls_num := ls_tmp;
end;
//3、生成功能序号,写入子项功能。
if GetRC('POWERINFO','ACTNAME='''+ GetKeyValue(RzComboBox4.Text) +''' AND '+
'WINNAME='''+ GetKeyValue(RzComboBox3.Text) +''' AND '+
'CODE LIKE '''+ ls_num + '%'' AND DJ=1') = 0 then
begin
ls_tmp := '';
ls_err := GetFieldVal('POWERINFO', 'MAX(CODE)', 'CODE LIKE '''+ ls_num + '%'' AND DJ = 3', ls_tmp);
if ls_err <> '' then Raise Exception.Create('获取窗口子Action时失败:'+ls_Err);
if ls_tmp = '' then
ls_num := ls_num + '100'
else
ls_num := IntToStr(StrToInt(ls_tmp) + 1);
SQLs.Add('INSERT INTO POWERINFO (DJ,CODE,NAME,WINNAME,ACTNAME) VALUES ( '+
'3,'+ //第一级
''''+ ls_num +''','+
''''+ GetKeyValue(RzComboBox3.Text,1) + ''','+
''''+ GetKeyValue(RzComboBox4.Text) + RzComboBox5.Text + ''','+
''''+ GetKeyValue(RzComboBox3.Text) + ''')');
end;
//生成SQL语句完成,开始执行
if SQLs.Count > 0 then ls_Err := doBatchSQL(SQLs)
else ShowMess('提示','该项功能已经添过过了,不需要重复添加!', MB_OK);
if ls_Err <> '' then Raise Exception.Create(ls_Err);
//添加完毕,重载数据
_EventNote := '保存系统功能资料:'+ ls_num;
RzComboBox3.Text := '';
actOpenExecute(nil);
SQLs.Free;
except
On E: Exception do
begin
ShowMess('系统错误', '保存系统功能失败,具体为:'+ E.Message, MB_ICONERROR);
_State := EV_FAIL;
SQLs.Free;
end;
end;
end;
procedure TfrmBasePower.FormCreate(Sender: TObject);
var i: integer;
begin
inherited;
btnCheck.Visible := False;
btnUnCheck.Visible := False;
RzSpacer3.Visible := False;
//读取权限大类
GetGroupVal(RzComboBox1.Items,
'SELECT ''[''+ CODE +'']''+ NAME +'' = ''+ SECCODE AS LISTFIELD FROM CODER WHERE ISOK ='+ IntToStr(SHBZ_OK) +' AND FZLX=''BASE_POWERLX''');
//从主窗口读取权限小类
with frmMain.actlMain do
for i:=0 to ActionCount-1 do
RzComboBox2.Items.Add(TAction(Actions[i]).Caption + ' = ' + Actions[i].Name);
//读取窗口基本功能
with actlBase do
for i:=0 to ActionCount-1 do
RzComboBox3.Items.Add(TAction(Actions[i]).Caption + ' = ' + Actions[i].Name);
//读取所在窗口
GetGroupVal(RzComboBox4.Items,
'SELECT NAME +'' = ''+ SECCODE AS LISTFIELD FROM CODER WHERE ISOK ='+ IntToStr(SHBZ_OK) +' AND FZLX=''BASE_WINNAME''');
//读取附加参数
GetGroupVal(RzComboBox5.Items,
'SELECT FZLX FROM CODER GROUP BY FZLX');
UseDataSet := dm.qryPowerInfo;
UseDataSet.BeforeEdit := doBeforeEdit;
actOpenExecute(nil);
end;
function TfrmBasePower.GetListNum(_Val: String): Integer;
begin
Result := -1;
if Pos('[', _Val) = 0 then Exit;
if Pos(']', _Val) = 0 then Exit;
Result := StrToInt(Copy(_Val, Pos('[', _Val)+1,
Pos(']', _Val) - Pos('[', _Val)-1));
end;
procedure TfrmBasePower.plInputResize(Sender: TObject);
begin
RzComboBox1.Width := plInput.Width - 84;
RzComboBox2.Width := plInput.Width - 84;
RzComboBox3.Width := plInput.Width - 84;
RzComboBox4.Width := plInput.Width - 84;
RzComboBox5.Width := plInput.Width - 84;
end;
procedure TfrmBasePower.btnAddFunctionClick(Sender: TObject);
begin
RzComboBox3.Text := '新增 = actNew';
actNewExecute(nil); actSaveExecute(nil);
RzComboBox3.Text := '删除 = actDelete';
actNewExecute(nil); actSaveExecute(nil);
RzComboBox3.Text := '修改数据 = actEditData';
actNewExecute(nil); actSaveExecute(nil);
RzComboBox3.Text := '打印 = actPrint';
actNewExecute(nil); actSaveExecute(nil);
RzComboBox3.Text := '设计 = actDesign';
actNewExecute(nil); actSaveExecute(nil);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -