SQL:关于SQL账表如何传递参数_CurrentUserOrgIds_给存储过程的应用原创
金蝶云社区-imY
imY
46人赞赏了该文章 404次浏览 未经作者许可,禁止转载编辑于2022年8月5日 12:09:36

一、业务背景

        在使用BOS平台编写SQL账表时,我们会有一些权限控制的需求,比如说根据当前用户、当前组织或者当前用户所拥有权限的组织来过滤数据,比如说你做了一个采购报表,要求每一个采购员看报表时只能看到自己创建的采购订单等等。BOS平台的SQL账表中预置了三个关键字参数,就是为了解决这个需求的,如下图。

image.png


二、遇到的问题

        由于我们是多组织的企业,所以我们开发了一支报表,要求查看报表的人员,只能看到这个人员对应的组织的数据。举个例子,张三只有A组织的权限,那他在查看报表时,就只能看到A组织的数据。而李四有A组织、C组织的权限,所以李四就能看到这两个组织的数据,那这时候就可以使用_CurrentUserOrgIds_参数传递给SQL报表的数据源,在SQL语句或者存储过程里面根据_CurrentUserOrgIds_来设置条件。

        SQL账表的数据源一般有SQL和存储过程两种,如上图,我是用的就是SQLSERVER的存储过程。

        如果SQL账表数据源是SQL语句的话,使用这个_CurrentUserOrgIds_是没有问题的。但是如果SQL账表数据源是存储过程的时候,打开报表就会有报错,提示“一旦使用了'@name=value'形式之后,所有后续的参数就必须以'@name=value'的形式传递

        根本原因就是因为当查询报表的用户有多个组织时,BOS平台传递的_CurrentUserOrgIds_的值是‘1,100005,100006,100007’这种格式,那数据库引擎就会以为有多个存储过程参数(因为存储过程的参数也是用“,”来分隔的,看上图就知道了),所以就报错了!


三、解决方案

        解决方案如下:使用CHARINDEX函数进行处理一下就好了,具体代码看下面第130行即可!


image.png


        最后,感谢@王文亮 大佬提供的协助

    

46