【019】U9报表反编译记录
侧边栏壁纸
  • 累计撰写 60 篇文章
  • 累计收到 2 条评论

【019】U9报表反编译记录

秋驰雪隙
2025-04-08 / 0 评论 / 10 阅读 / 正在检测是否收录...

报表页面

在\yonyou\U9V60\Portal\UILib\UFIDA.U9.Report.IndividualRptUI.WebPart.dll,是所有报表的通用界面
不知道能不能写UI插件

报表策略

在\yonyou\UBFV60\U9.VOB.Product.UBF\UBFStudio\Runtime\UFIDA.UBF.Report.App.UI.dll中的UFIDA.UBF.Report.App.UI.ProcessStrategy是策略基类,UFIDA.UBF.Report.App.UI下的大多数是帮助类

自定义报表策略继承的就是这个类,重写里面的VerifyParameters方法可以定义自己的行分组列分组最大限制
public override string VerifyParameters(Case usercase, CaseDefine caseDefine)
{
    //return base.VerifyParameters(usercase, caseDefine); // 不调用父类的检验规则
    string text = this.ValidateFixedColumnCount(usercase); // 父类的
    if (text.Length > 0) return text;
    text = base.VerifyBaseInfo(usercase, caseDefine); // 父类的
    if (text.Length > 0) return text;
    //text = base.VerifyGroupNumbers(usercase); // 父类的矩阵行分组12个,列分组6个的检验,干掉
    //if (text.Length > 0) return text;
    // 使用自己的行分组检验规则,也可以不写自己的行分组检验规则,那就是无限制(不推荐)
    text = this.VerifyGroupNumbers(usercase);
    if (text.Length > 0) return text;
    return null;
}

private new string VerifyGroupNumbers(Case usercase)
{
    int num = 0;
    int num2 = 0;
    foreach (Group item in usercase.Groups)
    {
        if (item.Type == GroupType.Column) num2++;
        else if (item.Type == GroupType.Row) num++;
    }
    // 这里的限制可以自由发挥,做成可配置项,U9定义的是50,6,12
    if (num > 100) return "表行分组不能超过100个!";
    if (num2 > 12) return "矩阵列分组不能超过12个!";
    if (num2 > 0 && num > 24) return "矩阵行分组不能超过24个!";
    return string.Empty;
}

/// <summary>
/// 校验固定列数条件(copy的父类,因为父类是私有方法无法调用,骚气的你也可以不copy。反射去调用父类的私有方法)
/// </summary>
/// <returns></returns>
private string ValidateFixedColumnCount(Case usercase)
{
    string empty = string.Empty;
    FilterValue val = usercase.FilterValues.GetObjectByName("Para_TableColumnsFixedCount");
    if (val != null)
    {
        empty = val.GetValue();
        if (!int.TryParse(empty, out int num))
        {
            return ReportApplicationUIRes.FixedColumnCountMustBeNumber;
        }
        if (num < 0)
        {
            return ReportApplicationUIRes.FixedColumnCountLessThanZero;
        }
        CommonFormatProcess commonFormatProcess = new CommonFormatProcess();
        int groupCountNotHead = commonFormatProcess.GetGroupCountNotHead(usercase.Groups);
        int num2 = 0;
        if (usercase.Columns != null)
        {
            num2 = usercase.Columns.Count + groupCountNotHead;
        }
        if (num > num2)
        {
            return ReportApplicationUIRes.FixedColumnCountGreatThanTotalColunms;
        }
    }
    return string.Empty;
}

查询方案

在\yonyou\U9V60\Portal\UILib\UFIDA.U9.Report.ReportCaseUI.WebPart.dll的UFIDA.U9.Report.ReportCaseUIModel的ReportCaseMainUIFormWebPart是查询方案页面

不知道能不能写UI插件(能写,但是没什么用,只能注入一下JS而且还只能通过定时器的方式运行)

报表数据加载

在\yonyou\UBFV60\U9.VOB.Product.UBF\UBFStudio\Runtime\Microsoft.ReportViewer.WebForms.dll的Microsoft.Reporting.WebForms.ReportViewer类RenderReport方法

最后生成了一个URL
http://desktop-egvqeh7/ReportServer?&rs:SessionID=tq1miizeyg4xvwzfo4ml5455&rs:command=Render&rs:Format=RPL&rc:StartPage=1&rc:EndPage=1&rc:ToggleItems=False&rc:MeasureItems=False&rc:SecondaryStreams=Server&rc:StreamNames=True&rc:StreamRoot=%2FU9%2FReserved.ReportViewerWebControl.axd%3FReportSession%3Dtq1miizeyg4xvwzfo4ml5455%26Culture%3D2052%26CultureOverrides%3DTrue%26UICulture%3D2052%26UICultureOverrides%3DTrue%26ReportStack%3D1%26ControlID%3D54ef74293e7c4759838a0dbeda2c188f%26OpType%3DReportImage%26IterationId%3Dd89432aae9be42c994f5dfe4e9f5fa2f%26StreamID%3D&rc:RPLVersion=10.6&rc:ImageConsolidation=True&rc:Toolbar=false&rs:ErrorResponseAsXml=true&rs:AllowNewSessions=false&rs%3APageCountMode=Actual
使用this.ServerUrlRequest方法跳转
0

评论 (0)

取消