脚本 - 以序时账为例
UBF_MD_ASRPT_UserCase表是查询方案
UBF_MD_ASRPT_UserCaseInfo表是默认查询方案
@OrgCode参数设置后,只改变设置组织的默认查询方案
-- =================================================================================
-- 脚本说明:为指定用户和报表,批量设置默认的查询方案。
-- =================================================================================
SET NOCOUNT ON; -- 关闭返回受影响行数的消息,提升性能
BEGIN TRANSACTION; -- 开始事务
BEGIN TRY
-- =============================================================================
-- 参数配置区域
-- =============================================================================
DECLARE @UserCode nvarchar(50) = 'demo'; -- 要设置默认查询方案的【用户编码】
DECLARE @ReportID nvarchar(50) = '1c76c192-36bc-4d1f-9efb-5d8081987b5e'; -- UBF登录后,在报表搜索功能中右键报表详情可看到【报表ID】
-- select ID from UBF_MD_ASRPT_Category where cName='明细账' -- 通过语句可以查询出@ReportID,但是明细账这种会有两个,就只能是看UBF报表了
DECLARE @CName nvarchar(50) = N'序时账-存档-BIP采集'; -- 要设置为默认的【查询方案名称】
-- 【组织编码】设置 (关键参数)
-- 1. 设置为 '101,888' 这样用逗号分隔的字符串,则只处理指定的组织。
-- 2. 设置为 NULL 或 '',则处理该用户有权限的【所有】组织。
DECLARE @OrgCode nvarchar(max)-- = '101,888';
-- =============================================================================
-- 内部变量声明与赋值
-- =============================================================================
DECLARE @User bigint;
DECLARE @UserCase uniqueidentifier;
-- 根据用户编码获取用户ID
SELECT @User = ID FROM Base_User WHERE Code = @UserCode;
IF @User IS NULL
BEGIN
THROW 50001, N'指定的用户编码不存在,请检查 @UserCode 参数。', 1;
END
-- 根据方案名称和报表ID获取方案ID
SELECT @UserCase = ID FROM UBF_MD_ASRPT_UserCase WHERE uReportID = @ReportID AND cName = @CName;
IF @UserCase IS NULL
BEGIN
THROW 50002, N'指定的查询方案名称不存在,请检查 @CName 和 @ReportID 参数。', 1;
END
-- =============================================================================
-- 脚本核心逻辑
-- =============================================================================
-- 创建临时表,用于存放本次需要处理的组织
IF OBJECT_ID('tempdb..#userOrg') IS NOT NULL DROP TABLE #userOrg;
CREATE TABLE #userOrg(Org BIGINT);
-- 根据 @OrgCode 的值,决定是加载所有组织还是指定组织
IF @OrgCode IS NOT NULL AND LTRIM(RTRIM(@OrgCode)) <> ''
BEGIN
-- 【场景1】@OrgCode 有值,加载指定的组织 (兼容低版本SQL Server的XML拆分方法)
DECLARE @OrgCodeXml XML;
-- 将逗号分隔的字符串转换为XML格式,例如 '101,888' -> <o>101</o><o>888</o>
SET @OrgCodeXml = CAST(('<o>' + REPLACE(@OrgCode, ',', '</o><o>') + '</o>') AS XML);
INSERT INTO #userOrg(Org)
SELECT A.Org
FROM Base_UserOrg A
INNER JOIN Base_Organization A1 ON A1.ID = A.Org
WHERE A.[User] = @User AND A1.Code IN (
-- 使用XQuery从XML中提取每个节点的值,实现字符串到行的转换
SELECT T.c.value('.', 'NVARCHAR(100)')
FROM @OrgCodeXml.nodes('/o') T(c)
);
END
ELSE
BEGIN
-- 【场景2】@OrgCode 为空,加载用户有权限的所有组织
INSERT INTO #userOrg(Org)
SELECT Org FROM Base_UserOrg WHERE [User] = @User;
END
-- 创建临时表,查询该用户在此报表下,目前已有的所有默认查询方案设置
IF OBJECT_ID('tempdb..#userCaseDef') IS NOT NULL DROP TABLE #userCaseDef;
SELECT
A.ID AS UserCase,
A.cName,
A1.ID AS UserCaseInfo,
A2.ID AS Org,
A2.Code AS OrgCode
INTO #userCaseDef
FROM UBF_MD_ASRPT_UserCase A
LEFT JOIN UBF_MD_ASRPT_UserCaseInfo A1 ON A.ID = A1.uReportCaseID
LEFT JOIN Base_Organization A2 ON A2.ID = A1.lOrgID
WHERE A.uReportID = @ReportID AND A1.lUserID = @User;
-- 从待处理的组织列表(#userOrg)中,移除已经将【目标方案】设为默认的组织,避免重复插入
DELETE FROM #userOrg WHERE Org IN (SELECT Org FROM #userCaseDef WHERE cName = @CName);
-- 对于待处理组织中,如果它们之前设置了【其他方案】为默认,则先删除这些旧的设置
DELETE FROM UBF_MD_ASRPT_UserCaseInfo
WHERE ID IN (
SELECT ud.UserCaseInfo
FROM #userCaseDef ud
INNER JOIN #userOrg uo ON ud.Org = uo.Org
WHERE ud.cName != @CName
);
-- 为剩余的待处理组织,批量插入新的默认查询方案设置
INSERT INTO UBF_MD_ASRPT_UserCaseInfo(uReportCaseID, iUserCaseType, lUserID, lOrgID, cCreateBy, dCreateDate, cModifyBy, dModifyDate)
SELECT
@UserCase,
6, -- iUserCaseType=6 查看U9系统插入的就是6
@User,
org.Org,
'System', -- 创建人
GETDATE(), -- 创建日期
'System', -- 修改人
GETDATE() -- 修改日期
FROM #userOrg AS org;
-- 清理临时表
DROP TABLE #userOrg;
DROP TABLE #userCaseDef;
COMMIT TRANSACTION; -- 所有操作成功,提交事务
PRINT '默认查询方案设置成功!';
END TRY
BEGIN CATCH
-- 如果 TRY 块中发生任何错误,则执行此处的代码
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION; -- 回滚所有未提交的更改
-- 打印并重新抛出错误信息,以便调用者或用户能够看到详细的错误原因
PRINT N'发生错误,操作已取消,所有更改均已回滚。';
THROW;
END CATCH
SET NOCOUNT OFF;
报表ID查看 - 以序时账为例
登录UBF报表,搜索序时账
选中要查看的报表,右键弹出菜单后,点击详情
详情弹出的窗口总,标识符(ID)下面的文本框内就是报表ID


评论