您现在的位置:动易网络>> 帮助文档>> PowerBuilder>>正文内容

菜单遍历的实现及使用

----在使用PB开发信息系统中,我们经常需要对用户的操作进行权限控制,结合数据库功能,对用户从菜单一级进行限制是一种切实可行的方法,本文为了说明方便设计三个表:用户表userdata,用户组表groupdata和菜单数据表menudata(在实际使用时,相应数据可直接与对系统表取得),其表结构和数据如下:
userdata:
nochar(2)      //用户号
namename(10)   //用户名
passwdname(8)  //口令
groupnochar(2) //组号
groupdata:
nochar(2)      //组号
namename(10)   //组名
示例数据:
01 数据库管理员
02 数据管理员
03 高级查询用户
04 中查询用户
05 初级查询用户
menudata:
group_nochar(2)      //组号
menu_idvarchar(10)   //菜单号
menu_namevarchar(30) //菜单名
statuschar(1)        //权限T:可操作F:不可操作

----设计菜单遍历函数uf_menu_all,作用:将菜单数据根据用户组表groupdata的内容写入菜单数据表menudata中,此函数在w_main_mdi的open事件中调用,方法为:
IfinitflagThen/*initflag初始化标记*/
Deletefrommenudata;
/*删除menudata的原有数据*/
uf_menu_all(This.MenuID,"")
EndIf
函数uf_menu_all的Script如下:
IntegernMenuTitle,nTotalTitles,nPos
Stringmenuitem_id,menuitem_
name,menuitem_help,l_groupno
nTotalTitles=UpperBound(menu_item.item)
FornMenuTitle=1TonTotalTitles
IfnMenuTitle<10Then
menuitem_id=menu_id+'0'+String(nMenuTitle)
Else
menuitem_id=menu_id+String(nMenuTitle)
EndIf
menuitem_name=menu_item.Item[nMenutitle].Text
Ifmatch(menuitem_name," ")Then
nPos=pos(menuitem_name," ",1)
menuitem_name=left(menuitem_name,nPos-1)
EndIf
menuitem_help=menu_item.Item[nMenutitle].Microhelp
Ifmenuitem_name<>'-'Then
Declarecursor1CursorFor
SelectnoFromgroupdataOrderByno;
Opencursor1;
label1:
Fetchcursor1Into:l_groupno;
Ifsqlca.sqlcode=0Then
IfUpperBound(menu_item.
Item[nMenutitle].Item)>0Then
InsertIntomenudata
(group_no,menu_id,menu_name,menu_help,status)
values(:l_groupno,:menuitem_id+'00'
,:menuitem_name,:menuitem_help,'T');
Else
InsertIntomenudata(group_no,menu_
id,menu_name,menu_help,status)
values(:l_groupno,:menuitem_id,:
menuitem_name,:menuitem_help,'T');
EndIf
Gotolabel1
Endif
Closecursor1;
EndIf
IfUpperBound(menu_item.Item
[nMenutitle].Item)>0Then
uf_menu_all(menu_item.Item[
nMenutitle],menuitem_id)
EndIf
Next

----设计菜单动态授权函数uf_menu_enabled,作用:根据用户登录所在的用户组生成相应的权限菜单,此函数在w_main_mdi的open事件中调用,方法为:
IFg_user<>'dba'THEN/*g_user是用户登录名,
为全局变量,dba为数据库的超级用户,
根据用户所连接的后台数据库进行修改*/
uf_menu_enabled(This.MenuID,"",'F')
ELSE
uf_menu_enabled(This.MenuID,"",'T')
ENDIF
函数uf_menu_enanabled的Script如下:
IntegernMenuTitle,nTotalTitles,nPos
Stringmenuitem_id,menuitem
_name,menuitem_help,ls_status,ls_no
nTotalTitles=UpperBound(menu_item.item)
Selectgroup_noInto:ls_no
FromuserdataWhereno=:g_user;
FornMenuTitle=1TonTotalTitles
IfnMenuTitle<10Then
menuitem_id=menu_id+'0'+String(nMenuTitle)
Else
menuitem_id=menu_id+String(nMenuTitle)
EndIf
menuitem_name=menu_item.Item[nMenutitle].Text
Ifmatch(menuitem_name," ")Then
nPos=pos(menuitem_name," ",1)
menuitem_name=left(menuitem_name,nPos-1)
EndIf
menuitem_help=menu_
item.Item[nMenutitle].Microhelp
Ifmenuitem_name<>'-'Then
Ifflag='F'Then
SelectstatusInto:ls_status
FrommenudataWheregroup_no=:ls_no
andmenu_id=:menuitem_id;
Iftrim(ls_status)='F'Then
Disable(menu_item.Item[nMenutitle])
ELSE
Enable(menu_item.Item[nMenutitle])
EndIf
Else
Enable(menu_item.Item[nMenutitle])
EndIf
EndIf
IfUpperBound(menu_item.
Item[nMenutitle].Item)>0Then
uf_menu_enabled(menu_item.
Item[nMenutitle],menuitem_id,flag)
EndIf
Next


感动 同情 无聊 愤怒 搞笑 难过 高兴 路过
【字体: 】【收藏】【打印文章】【查看评论

相关文章

    没有相关内容