【062】为指定用户和报表批量设置默认的查询方案
侧边栏壁纸
  • 累计撰写 70 篇文章
  • 累计收到 2 条评论

【062】为指定用户和报表批量设置默认的查询方案

竹秋廿九
2025-08-26 / 0 评论 / 55 阅读 / 正在检测是否收录...

脚本 - 以序时账为例

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

image.png

080d978a-91ed-4606-942e-b1ba2d5ea9ec.png

0

评论

博主关闭了当前页面的评论