📄 main.pas
字号:
showErrMsg('数据库读写错误!');
end;
end;
//根据权限字符Pur读出相应的不包含权限列表到数据集ADODS中
procedure TFrmMain.ReadPurExStr(var ADODS:TADODataSet;PurStr:string);
var
IncIDs: array of Integer;
SQLStr: string;
i: Integer;
begin
if length(PurStr) = 0 then
begin
//权限字符串是空字符串,则读出所有的功能
SQLStr := 'select gn_i,gn_mc,gn_ms from PMgsgn ';
end
else
begin
SetLength(IncIDs,length(PurStr) * 6 );
MenuIDs(PurStr , IncIDs);//将Purstr指定的功能转化到整型数组中
SQLStr := 'select gn_i,gn_mc,gn_ms from PMgsgn where not (gn_i = -1';
for i := 1 to length(IncIDs) - 1 do
begin
if IncIDs[i] > 0 then
begin
SQLStr := SQLStr + ' or gn_i = ' + IntToStr(i);
end;
end;
SQLStr := SQLStr + ')';
end; //if length(PurStr) = 0
try
ExecQuery(ADODS, SQLStr);
except
showErrMsg('数据库读写错误!');
end;
end;
//权限字符PurStr对应的权限映射到数组IncIds中
procedure TFrmMain.MenuIDs(PurStr: string; var IncIDs: array of Integer);
var
i,No:Integer;
j,k,count:Shortint ;
begin
for i := 1 to length(PurStr) do //循环读出权限字符串中每一字符进行处理
begin
k := ord(Purstr[i]);//字符转化为整数
j := 1;
for count := 1 to 6 do //循环判断字符的低六位的值
begin
if (k and j) <> 0 then // k的第count位为1
begin
//设置权限数组的相应元素大于0
No := i* 6 + count - 6;
IncIDs[No]:= IncIDs[No] + 1;
end;
j := j * 2 ;
end;
end;
end;
//在PurStr字符串指定的权限功能组中加入MenuID指明的功能
procedure TFrmMain.AddPur(var PurStr: string; MenuID: Integer);
var
StrCN, Offset,i: Integer;
begin
//首先计算MenuId对应的字符和在字符中的偏移位置
StrCN := MenuID div 6 + 1 ;
Offset := MenuID mod 6;
if Offset = 0 then
begin
StrCN := StrCN -1 ;
Offset := 6;
end;
//如果权限字符串长度小于strCN,则在后面添加 chr($40)补足
for i := length(PurStr) to strCN do
PurStr := PurStr + chr($40);
//将权限字符串中相应位置设为1,并保证最高两位为01
PurStr[strCn] := chr((Ord(PurStr[strCn]) or
( 1 shl (Offset-1) )) and $7F);
end;
//从PurStr字符串指定的权限功能组中删除MenuID指明的功能
procedure TFrmMain.DeductPur(var PurStr: string; MenuID: Integer);
var
StrCN, Offset,i: Integer;
begin
//首先计算MenuId对应的字符和在字符中的偏移位置
StrCN := MenuID div 6 + 1;
Offset := MenuID mod 6;
if Offset = 0 then
begin
StrCN := StrCN -1 ;
Offset := 6;
end;
//如果权限字符串长度小于strCN,则在后面添加 chr($40)补足
for i := length(PurStr) to strCN do
PurStr := PurStr + chr($40);
//将权限字符串中相应位置设为0,并保证最高两位为01
PurStr[strCn] := chr((Ord(PurStr[strCn]) and
not ( 1 shl (Offset-1) )) and $7F);
end;
//加入新的角色
procedure TFrmMain.AddNewPost;
begin
try
FrmDPurNewPost := TFrmDPurNewPost.Create(nil);
FrmDPurNewPost.TypeOfNewPost := tnpNew ;
FrmDPurNewPost.PostMc := '';
FrmDPurNewPost.PostMs := '';
//显示新建角色窗体
if FrmDPurNewPost.ShowModal = mrOK then
begin
ReadPostInfo;
DM.DSetPost.Last;
end;
finally
FrmDPurNewPost.Free;
end;
end;
//更新角色名称和描述
procedure TFrmMain.UpdatePost;
var
recNo:integer;
begin
try
FrmDPurNewPost := TFrmDPurNewPost.Create(nil);
FrmDPurNewPost.TypeOfNewPost := tnpModify ;
FrmDPurNewPost.PostMc := DM.DSetPost.fieldByName('js_mc').AsString ;
FrmDPurNewPost.PostMs := DM.DSetPost.fieldByName('js_ms').AsString ;
FrmDPurNewPost.PostID := DM.DSetPost.fieldByName('js_i').AsInteger;
//显示新建功能组窗体
// FrmDPurNewPost.ShowModal;
if FrmDPurNewPost.ShowModal = mrOK then //用户选择确定
begin
RecNo := DM.DSetPost.RecNo;
ReadPostInfo ;
DM.DSetPost.RecNo := RecNo;
end;
finally
FrmDPurNewPost.Free;
end;
end;
procedure TFrmMain.DelPost;
var
sSQL: string;
Posti,recNo: Integer;
ArrayOfSQL:TStrings;
begin
ArrayOfSQL := nil;
if DM.DSetPost.RecordCount > 0 then
begin
if showConfirmDlg('删除角色吗?') then
begin
recNo := DM.DSetPost.RecNo ;
Posti := DM.DSetPost.FieldByName('js_i').AsInteger;
try
ArrayOfSQL := TStringList.Create ;
//删除岗位
sSQL := 'delete from PMjs where js_i = ' + IntToStr(Posti);
ArrayOfSQL.Add(sSQL);
//删除“公司人员与岗位关系表”中的岗位
sSQL := 'delete from PMryjs where ryjs_jsi = ' + IntToStr(Posti);
ArrayOfSQL.Add(sSQL);
//删除“岗位与权限组关系表”中的岗位
sSQL := 'delete from PMjsgn where jsgn_jsi = ' + IntToStr(Posti);
ArrayOfSQL.Add(sSQL);
try
BatchSQL(ArrayOfSQL);
except
showErrMsg('数据库读写错误!');
end;
ReadPostInfo ;
if not DM.DSetPost.IsEmpty then
begin
if RecNo > DM.DSetPost.RecordCount then
RecNo := DM.DSetPost.RecordCount;
DM.DSetPost.RecNo := RecNo;
end;
ShowPostIncPur;
ShowUserIncPost;
ShowUserExPost;
ShowUserIncPur ;
finally
ArrayOfSQL.Free ;
end;
end;
end;
end;
//从数据库中读取所有角色信息
procedure TFrmMain.ReadPostInfo;
var
SQLStr: string;
begin
try
SQLStr := 'select * from PMjs order by js_i';
ExecQuery( DM.DSetPost, SQLStr );
except
showErrMsg('数据库读写错误!');
end;
end;
//显示角色包含的权限组
procedure TFrmMain.ShowPostIncGroup;
begin
if DM.DSetPost.Active and ( DM.DSetPost.RecordCount > 0) then
begin
ReadGroupInPost(DM.DSetPostIncGroup,
DM.DSetPost.fieldbyname('js_i').AsInteger);
end
else
begin
DM.DSetPostIncGroup.Active := False ;
end;
end;
//显示角色不包含的权限组
procedure TFrmMain.ShowPostExGroup;
begin
if DM.DSetPost.Active and ( DM.DSetPost.RecordCount > 0 ) then
begin
ReadGroupExPost(DM.DSetPostExGroup,DM.DSetPost.
fieldbyname('js_i').AsInteger);
end
else
begin
DM.DSetPostExGroup.Active := False ;
end;
end;
//显示角色包含的所有权限
procedure TFrmMain.ShowPostIncPur;
var
PurStr,tempStr:string;
i,j:integer;
begin
PurStr := '';
with DM.DSetPostIncGroup do
begin
if Active and (RecordCount > 0) then
begin
First;
while not Eof do
begin
tempStr := fieldByName('gnz_gn').AsString ;
j := min(length(PurStr),length(tempStr));
for i := 1 to j do
begin
PurStr[i] := chr(ord(PurStr[i]) or ord(tempStr[i]));
end;
if j<Length(tempStr) then
begin
Purstr := PurStr + copy(tempStr,j+1,length(tempStr)-j);
end;
Next;
end;
end
else
begin
DM.DSetPostIncPur.Active := False ;
end;
end;
ReadPurInStr(DM.DSetPostIncPur,PurStr);
end;
//向角色中增加权限组
procedure TFrmMain.PostAddGroup;
var
sSQL: string;
i,RecNo: Integer;
ArrayOfSQL : TStrings ;
begin
RecNo := DM.DSetPostExGroup.RecNo ;
ArrayOfSQL := nil;
if DBGridPostExGroup.Focused and (DM.DSetPostExGroup.RecordCount > 0)
then
begin
if DBGridPostExGroup.SelectedRows.Count > 1 then
begin
try
ArrayOfSQL := TStringList.Create ;
for i := 0 to DBGridPostExGroup.SelectedRows.Count - 1 do
begin
DBGridPostExGroup.DataSource.DataSet.
GotoBookmark(pointer(DBGridPostExGroup.SelectedRows.Items[i]));
sSQL := 'insert into PMjsgn(jsgn_jsi,jsgn_gni) values(';
sSQL := sSQL + DM.DSetPost.FieldByName('js_i').AsString + ',';
sSQL := sSQL + DM.DSetPostExGroup.FieldByName('gnz_i').AsString
+ ')';
ArrayOfSQL.Add(sSQL);
end;
try
BatchSQL(ArrayOfSQL);
except
showErrMsg('数据库读写错误!');
end;
finally
ArrayOfSQL.Free ;
end;
end
else
begin
sSQL := 'insert into PMJsgn(jsgn_jsi,jsgn_gni) values(';
sSQL := sSQL + DM.DSetPost.FieldByName('js_i').AsString + ',';
sSQL := sSQL + DM.DSetPostExGroup.FieldByName('gnz_i').AsString + ')';
try
ExecQuery2(sSQL);
except
showErrMsg('数据库读写错误!');
end;
end;
ShowPostIncGroup;
ShowPostExGroup;
ShowPostIncPur;
ShowUserIncPur ;
if RecNo > DM.DSetPostExGroup.RecordCount then dec(recNo);
if not DM.DSetPostExGroup.IsEmpty then
DM.DSetPostExGroup.RecNo := RecNo ;
end;
end;
//删除角色中的权限组
procedure TFrmMain.PostDelGroup;
var
sSQL: string;
i,RecNo: Integer;
ArrayOfSQL : TStrings;
begin
RecNo := DM.DSetPostIncGroup.RecNo ;
ArrayOfSQL := nil;
if DBGridPostIncGroup.Focused and (DM.DSetPostIncGroup.RecordCount > 0)
then
begin
if DBGridPostIncGroup.SelectedRows.Count > 1 then
begin
try
ArrayOfSQL := TStringList.Create;
for i := 0 to DBGridPostIncGroup.SelectedRows.Count - 1 do
begin
DBGridPostIncGroup.DataSource.DataSet.GotoBookmark
(pointer(DBGridPostIncGroup.SelectedRows.Items[i]));
sSQL := 'delete from PMjsgn where jsgn_jsi = ';
sSQL := sSQL + DM.DSetPost.FieldByName('js_i').AsString
+ ' and jsgn_gni = ';
sSQL := sSQL + DM.DSetPostIncGroup.FieldByName('gnz_i').AsString;
ArrayOfSQL.Add(sSQL);
end;
try
BatchSQL(ArrayOfSQL);
except
showErrMsg('数据库读写错误!');
end;
finally
ArrayOfSQL.Free ;
end;
end
else
begin
sSQL := 'delete from PMJsgn where jsgn_jsi = ';
sSQL := sSQL + DM.DSetPost.FieldByName('js_i').AsString
+ ' and jsgn_gni = ';
sSQL := sSQL + DM.DSetPostIncGroup.FieldByName('gnz_i').AsString;
try
ExecQuery2(sSQL);
except
showErrMsg('数据库读写错误!');
end;
end;
ShowPostIncGroup;
ShowPostExGroup;
ShowPostIncPur;
ShowUserIncPur ;
if RecNo > DM.DSetPostIncGroup.RecordCount then dec(recNo);
if not DM.DSetPostIncGroup.IsEmpty then
DM.DSetPostIncGroup.RecNo := RecNo ;
end;
end;
//根据角色ID读出相应的权限组列表到数据集ADODS中
procedure TFrmMain.ReadGroupInPost(var ADODS:TADODataSet;PostID:integer);
var
sSQL: string;
begin
try
sSQL := 'select a.* from PMgnz a,PMjsgn b '
+ 'where b.jsgn_jsi = ' + IntToStr(PostID) + ' and '
+ 'b.jsgn_gni = a.gnz_i '
+ 'order by a.gnz_mc';
ExecQuery(ADODS, sSQL);
except
showErrMsg('数据库读写错误!');
end;
end;
//根据角色ID读出相应的不包含权限组列表到数据集ADODS中
procedure TFrmMain.ReadGroupExPost(var ADODS:TADODataSet;PostID:integer);
var
sSQL: string;
begin
try
sSQL := 'select * from PMgnz where gnz_i not'
+ ' in (select jsgn_gni from PMjsgn '
+ 'where jsgn_jsi = ' + IntToStr(PostID)
+ ' ) order by gnz_mc';
ExecQuery(ADODS, sSQL);
except
showerrMsg('数据库读写错误!');
end;
end;
procedure TFrmMain.AddNewUser;
begin
try
FrmDPurNewUser := TFrmDPurNewUser.Create(nil);
FrmDPurNewUser.TypeOfNewUser := tnuNew;
// FrmDPurNewUser.ShowModal;
if FrmDPurNewUser.ShowModal = mrOK then
begin
ReadUserInfo ;
DM.DSetUser.Last;
end;
finally
FrmDPurNewUser.Free;
end;
end;
procedure TFrmMain.UpdateUser;
begin
try
FrmDPurNewUser := TFrmDPurNewUser.Create(nil);
FrmDPurNewUser.TypeOfNewUser := tnuModify;
FrmDPurNewUser.UserID := DM.DSetUser.FieldByName('Per_i').AsInteger;
FrmDPurNewUser.ShowModal;
finally
FrmDPurNewUser.Free;
end;
end;
procedure TFrmMain.DelUser;
var
sSQL: string;
ArrayOfSQL: TStrings;
Useri,recNo: Integer;
begin
ArrayOfSQL := nil;
if DM.DSetUser.RecordCount > 0 then
begin
if showConfirmDlg('删除用户吗?') then
begin
recNo := DM.DSetUser.RecNo ;
Useri := DM.DSetUser.FieldByName('Per_i').AsInteger;
try
//删除用户
ArrayOfSQL := TStringList.Create ;
sSQL := 'update PMPerson set Per_dlmz ='''' , Per_dlmm = '''' where ' +
' Per_i = ' + IntToStr(Useri);
ArrayOfSQL.Add (sSQL);
//删除“公司人员与岗位关系表”中的用户
sSQL := 'delete from PMryjs where ryjs_ryi = ' + trim(IntToStr(Useri));
ArrayOfSQL.Add (sSQL);
try
BatchSQL(ArrayOfSQL);
except
showErrMsg('数据库读写错误!');
end;
finally
ArrayOfSQL.Free;
end;
ReadUserInfo ;
if not DM.DSetUser.IsEmpty then
begin
if RecNo > DM.DSetUser.RecordCount then
RecNo := DM.DSetUser.RecordCount;
DM.DSetGroup.RecNo := RecNo;
end;
ShowUserIncPost ;
ShowUserExPost ;
ShowUserIncPur ;
end;
end;
end;
//从数据库中读取所有已经分配权限的用户信息
procedure TFrmMain.ReadUserInfo;
var
SQLStr: string;
begin
try
// SQLStr := 'select Per_i,Per_Name,Per_dlmz,Per_dlmm,Per_mzms from PMPerson ';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -