SQL Server Reporting Services类似日历的报告

时间:2013-07-11 19:55:09

标签: reporting-services calendar ssrs-tablix

我正在编写一份报告来代表给定客户的工作安排。该报告必须类似于日历,并显示跨越多天的工作订单作为类似于Outlook的生成栏。

我使用两个Tablix控件很快地制作了日历。我现在的问题,以及这个问题的原因,是代表跨越事件。

目前,我渲染(当然使用测试数据):http://i.imgur.com/KISNhsx.png

我在存储过程中确定了很多东西(给定事件跨越多少天,给定事件的哪一天)并操纵每个单元格的背景和边框以便它们出现将被合并。除了单元格文本之外,这个工作正常:如果事件的名称太长,它就会被切断。

我做了一些研究,看起来你无法以编程方式合并单元格。我认为我最大的希望可能是以某种方式允许事件的名称溢出(有点如何在Excel中看到单元格溢出)。

这可能吗?

作为参考,我们使用的是SQL Server 2012,但是我通过VS2008使用BIDS来编写报告。这是一份普通的RDL报告。我并不反对购买能够为我做这件事的控件。

谢谢!

1 个答案:

答案 0 :(得分:0)

我制定了另一个满足上级要求的解决方案。

缺点:我创建了一个用事件填充的简单HTML日历。然后我将页面渲染为图像(如屏幕截图)并使用SSRS中的图像控件加载它。 SSRS报告将其参数作为查询字符串传递给网页。

对于通过网络搜索找到这个问题的好奇者,这是我用来创建位图的方法:

private Bitmap CreateScreenshot(string url, int width, int height)
    {
        Bitmap screenshot = null;

        var thread = new Thread(() =>
            {
                using (var browser = new WebBrowser())
                {
                    browser.ScrollBarsEnabled = false;
                    browser.ScriptErrorsSuppressed = true;

                    browser.Width = width;
                    browser.Height = height;

                    browser.Navigate(url);

                    while (browser.ReadyState != WebBrowserReadyState.Complete)
                    {
                        Application.DoEvents();
                    }

                    screenshot = new Bitmap(width, height);
                    browser.DrawToBitmap(screenshot, new Rectangle(0, 0, width, height));
                }
            });

        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();

        return screenshot;
    }

我从控制器内部调用它:

public void Action()
    {
        var model = new ViewModel
            {
                StartDate = new DateTime(2013, 6, 30),
                EndDate = new DateTime(2013, 8, 10),
                OpsId = ####
            };


        var url = Url.Action("ActionThatCallsCalendar", "Controller", new { area = "Area", viewModel = new JavaScriptSerializer().Serialize(model) }, Request.Url.Scheme);


        Response.ContentType = "image/jpeg";
        Response.Clear();

        var screenshot = CreateScreenshot(url, 1400, 1050);
        screenshot.Save(Response.OutputStream, ImageFormat.Jpeg);

        Response.Flush();
    }