[AX2012 R3]关于Named user license report

Named user license报表是用来统计各种授权类型用户数的,这里来看看报表数据具体是如何来的。这是一个SSRS的报表,最主要的数据源是来自于类SysUserLicenseCountReport定义的RDP,在SysUserLicenseCountReport的方法processReport中使用SysUserLicenseMiner::fillUserLicenseCountTmpTbl()填充一个临时表,最核心的部分就是这个方法:

public static void fillUserLicenseCountTmpTbl(SysUserLicenseCountTmp _userLicCountTblTmp, date _reportStateDate)
{
    SysUserLicenseCount sulcTbl;
    SysUserLicenseList sullTbl;
    SecurityUserRole surTbl;
    SecurityRole rTbl;
    SysRoleLicenseType userRoleLicense;
    delete_from _userLicCountTblTmp;

    ttsbegin;

    while select validTimeState(_reportStateDate, _reportStateDate) * from sulcTbl
        outer join sullTbl
        outer join User, SecurityRole from surTbl
        join SecurityRole, UserLicenseType from userRoleLicense
        join RecId, Name from rTbl
        order by sulcTbl.UserLicenseType desc
        where (sulcTbl.RecId == sullTbl.SysUserLicenseCount
                && sullTbl.UserName == surTbl.User
                && userRoleLicense.SecurityRole ==surTbl.SecurityRole
                && rTbl.RecId == surTbl.SecurityRole)
    {
        _userLicCountTblTmp.UserLicenseType = sulcTbl.UserLicenseType;
        _userLicCountTblTmp.LicensedCount = sulcTbl.LicensedCount;
        _userLicCountTblTmp.ActualCount = sulcTbl.ActualCount;
        _userLicCountTblTmp.ValidFor = sulcTbl.ValidFrom;
        _userLicCountTblTmp.NetworkDomain =sullTbl.NetworkDomain;
        _userLicCountTblTmp.NetworkAlias =sullTbl.NetworkAlias;
        _userLicCountTblTmp.Username =sullTbl.UserName;
        _userLicCountTblTmp.SecurityRole = rTbl.Name;
        _userLicCountTblTmp.SecurityRoleLicenseType = userRoleLicense.UserLicenseType;
        _userLicCountTblTmp.insert();
    }

    ttscommit;
}

这里用到好几个表,SysUserLicenseCount保存的是四种用户授权类型(枚举UserLicenseType:Enterprise,Functional,Task,Self serve)相应的用户数;SysUserLicenseList保存的是每个用户的授权记录,其SysUserLicenseCount记录的是表SysUserLicenseCount的recId;SecurityUserRole表不在AOT中,查看数据库得知保存的是每个用户对应的Role,如果一个用户被指定了多个Role,每个Role在这表中对应一条记录,列SecurityRole保存的是具体Role的ID;SecurityRole既不在AOT,连SQL数据库中也没有这个表,好在上面的代码中可以推测是AOT中所有Security roles的列表,这里用到的只是Role的名称;SysRoleLicenseType也不在AOT,但是在SQL数据库中,重要的是SecurityRole和UserlicenseType两个字段,前者记录的是每种Role的ID,后者则是这个Role相应的用户授权类型,每个Role只有一种用户授权类型。

因此上面的代码完成的就是构建一个临时表来记录每个用户的名称、网络别名、对应的每个角色、角色对应的用户授权类型、用户授权类型的授权用户数、用户授权类型的当前使用数。需要注意的是角色“System administrator”和“System user”在表SysRoleLicenseType是没有记录的,如果一个用户只有这两种角色,这个用户不会出现在报表中,但是System administrator仍然会占用一个Enterprise授权,仅仅是System user是不会影响到授权数的。

运行报表总是得到空白的结果,仔细查看发现上面的代码中有一行是有问题的(R3 CU8的系统),“&& sullTbl.UserName == surTbl.User”,查看数据库表SecurityUserRole,User一列实际上保存的是用户的网络别名,更改为“&& sullTbl.NetworkAlias == surTbl.User”后运行报表得到结果,类似:

还需要注意必须切换到DAT公司下才会有数据,用到的表SysUserLicenseCount等等是不保存公司信息的,按照我的理解应该不管在哪个公司下都应该得到相同的结果,可实际上只有切换到DAT公司报表才有数据。

接下来的问题相关表中的数据又是哪里来的呢?在部署系统的时候系统会自动为我们创建一个名为“Named user license count reports processing”的批处理任务,由它更新数据到这些表中,默认一周运行一次。这个批处理任务具体执行的是SysUserLicenseMiner类,run方法调用SysUserLicenseMiner::GenerateUserLicenseCountReportInfo(),我们直接调用这个方法也是可以更新授权数数据的。如果你在批处理列表中找不到这个job,可以调用SysUserLicenseMiner::createBatchJob()为你创建一个。而具体是如何更新的呢?答案自然也是在 SysUserLicenseMiner中,这里就不翻代码了,就别的地方看到的总结一下。AOT中打开一个Menu item,有两个属性是和授权相关的,ViewUserLicense和MaintainUserLicense,前者是查看需要的授权,后者是维护数据需要的授权,它们的值都是前面提到的枚举UserLicenseType。SysUserLicenseMiner的工作就是遍历所有Menu item,找出相应的用户授权,接着遍历用户用户角色,找出每个用户角色对应的用户授权类型,最后遍历每个用户,找出用户的最高用户授权类型(Enterprise最高)。所以问题的核心在于菜单项的用户授权类型,如果我们新建一个自己的菜单项会怎样?默认ViewUserLicense和MaintainUserLicense都是NONE,是不影响授权数的,当然你可以闲着没事修改这两个属性成其他数值。我们可以duplicate系统自带的菜单项,然后修改这两个属性为NONE,后面就不细说了。

最后要说的是这个报表的格式,无论我是否选中“show list of users per access license type ”结果都是一样,Report的design也只有上面图中的一个,有知道原因的朋友请告诉我为什么...

时间: 2024-10-13 22:58:29

[AX2012 R3]关于Named user license report的相关文章

AX2012 R3升级CU8的一些错误

AX2012 R3安装升级包CU8后进入系统,系统会提示打开软件升级清单“Software update checklist”,清单列出了升级要做的一系列动作. 在进行到编译应用时“Compile application”出现很多错误: Severity Path Line Col Error message Error \Classes\PayrollCalculatePayStatementBenefits\classDeclaration 12 5 Syntax error. Error

[AX2012 R3]在SSRS报表中使用QR二维码

AX2012是自带生成QR二维码的类,可以很方便的用在SSRS报表中,下面演示如何在RDP的报表中使用二维码,首先从定义临时表开始: 字段URL是要用于二维码的字符串,QrCode是container类型,保存最终生成的二维码图形二进制数据. DP类: class TestQrCodeDp extends SRSReportDataProviderBase { TestQrCodeTmp qrCodeTmp; } [ SRSReportDataSetAttribute(tableStr(Test

[AX2012 R3]关于Alerts

AX2012提供两种类型的Alert,Change-based alert和Due-date-based alert,前者用于在对新建记录.删除记录.记录的某个指定字段被改变的时候发出提醒,后者则是用于监视记录日期类型的某个字段,在超期指定的日期后发出提醒.在记录的编辑form或者list page上右键菜单中我们能找到“Create alert rule”菜单项,通过它打开alert规则创建窗口.规则创建窗口里我们可以选择alert要发给谁,只能是一个特定的用户,不能是一个用户组,如果通知需要

AX2012 R3 CU8升级,安装 VS2013 开发组件

AX2012R3 CU8版本,安装VS2013开发组件的方法,有在安装过程中遇到问题的,或者更加便捷的方法,可以一起沟通下.         步骤如下:         1.在安装CU8补丁的时候(如何安装CU8,不赘述了),不要选VS2013组件(如果选择了,后面也不能用,还要卸载). 2.解压AX2012R3的安装包,原始文件为ISO镜像文件,解压为文件夹模式. 3.先打开解压软件,比如WinRAR,然后拖放CU8的补丁包Package.axupdate文件,到解压软件,(因为这个文件不是标

Maven Build Life Cycle--reference

What is Build Lifecycle? A Build Lifecycle is a well defined sequence of phases which define the order in which the goals are to be executed. Here phase represents a stage in life cycle. As an example, a typical Maven Build Lifecycle is consists of f

R语言文本挖掘+词云显示(jiebaR包+wordcloud2包)

利用2018年政府工作报告的例子向大家展示一下R语言如何进行文本挖掘的~用到的包有jiebaR和wordcloud2. 1.安装并加载jiebaR install.packages("jiebaR") library(jiebaR) 2.以2018年政府工作报告为文本,进行分词 (1)首先要将2018年政府工作报告以txt的形式下载到R语言的工作路径中 读取文本: text<-readLines("E:/R-3.4.4/bin/workdirection/report.

Maven 构建生命周期

构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列.这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准备资源 资源复制 资源复制可以进行定制 编译 执行编译 源代码编译在此阶段完成 包装 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包 安装 安装 这一阶段在本地/远程Maven仓库安装程序包 可用于注册必须执行一个特定的阶段之前或之后的目标,有之前处理和之后阶段.当 Maven 开始建立一个项目,它通过定义序列

[AX2012]Report data provider调试

运行使用RDP作为数据源的报表时,RDP类被编译成.NET的服务调用,RDP是X++的代码,它的调试是在MorphX调试器中完成.要在MorphX调试器中调试RDP的X++代码需要以下配置: 添加AOS服务账号到本地Microsoft Dynamics AX Debugging Users用户组 在Dynamics AX Server Configuration中启用调试:打开Dynamics AX server配置工具,创建一个新的配置,在应用程序对象服务器(Application Objec

Workflow License invalid!!

2019/08/23-17:02:16 >> INFO >> main >> org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:300) >> Mapping class: com.neusoft.lab.xumuju_lab.sample.entity.LabBizSampleBackup -> LAB_BIZ_SAMPLE_BACKUP201