我希望ssrs报告中的DDMMYYYY格式的日期时间参数

时间:2015-04-21 14:29:51

标签: reporting-services ssrs-2008 ssrs-2008-r2 ssrs-grouping

我想将Datetime参数更改为 DDMMYYYY 格式。默认值为MMddYYYY。当用户从日期选择器中选择日期时,日期应以ddmmyyyy格式显示。     我尝试了所有表达式

=Format(Parameters!DateFrom.Value, "dd/MM/yy")
=cdate(format(DateAdd("d", -61, now),"dd/MM/yyyy"))
=cdate(format(DateAdd("d", -61, now),"dd/MM/yyyy"))

但都没有用。

4 个答案:

答案 0 :(得分:3)

Necromancing。
是的,你可以 - 那种。
首先,请注意SSRS采用浏览器中指定的语言的日期格式。

所以你可以改变浏览器的语言。 显然,你不想告诉你的用户这样做。

因此,您将其他参数传递到报告中:
我称之为in_sprache(Sprache意为德语,有可能的价值和#34; DE," FR"," IT"," EN")。

现在您需要通过覆盖虚拟方法" InitializeCulture"来更改本地化过程。在ReportViewer.aspx中。

您可以在

中找到ReportViewer
C:\Program Files\Microsoft SQL Server\MSRS<Version>.MSSQLSERVER
C:\Program Files\Microsoft SQL Server\MSRS<Version>.<Instance>

e.g。

C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER

你添加(在/ReportServer/Pages/ReportViewer.aspx的源代码中):

<script type="text/C#" runat="server">

protected override void InitializeCulture()
{
    string sprache = System.Web.HttpContext.Current.Request.QueryString["in_sprache"];

    if(string.IsNullOrEmpty(sprache))
        sprache = "";

    switch(sprache.ToLowerInvariant())
    {
        case "de":
            sprache = "de-CH";
            break;
        case "fr":
            sprache = "fr-CH";
            break;
        case "it":
            sprache = "it-CH";
            break;
        case "en":
            sprache = "en-US";
            break;
        default:
            sprache = "";
            break;
    }

    // System.Web.HttpContext.Current.Response.Write(sprache);
    if(!String.IsNullOrEmpty(sprache))
    {
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(sprache);
        System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(sprache);
    }

    base.InitializeCulture();
}

</script>

这将使用url-parameter in_sprache中指定的浏览器用户语言覆盖浏览器用户语言(in_sprache必须是报告的参数)。

现在,您还必须覆盖context.request.userLanguages以使datepicker正常工作...您只能通过将HTTP模块(libRequestLanguageChanger.dll)添加到ReportServer的web.config中来实现此目的

  <system.web>
    [...]
    <httpModules>
      [...]
      <add name="RequestLanguageChanger" type="libRequestLanguageChanger.RequestLanguageChanger, libRequestLanguageChanger" />

    </httpModules>
    [...]
  </system.web>

。 (需要将信任级别从rosetta更改为&#34; Full&#34;,除非您可以弄清楚如何更改rosetta-policy以允许此http模块。)

由于我们也可以覆盖HTTP模块中的InitializeCulture,因此您不必添加runat =&#34;服务器&#34; ReportViewer.aspx的脚本。

namespace libRequestLanguageChanger
{


    public class RequestLanguageChanger : System.Web.IHttpModule
    {


        void System.Web.IHttpModule.Dispose()
        {
            // throw new NotImplementedException();
        }


        void System.Web.IHttpModule.Init(System.Web.HttpApplication context)
        {
            // https://stackoverflow.com/questions/441421/httpmodule-event-execution-order
            context.BeginRequest += new System.EventHandler(context_BeginRequest);
        }


        void context_BeginRequest(object sender, System.EventArgs e)
        {
            System.Web.HttpApplication application = sender as System.Web.HttpApplication;
            System.Web.HttpContext context = application.Context;

            if (context.Request != null)
            {
                // string language = context.Request.Headers["Accept-Language"];
                string language = null;
                // string url = context.Request.RawUrl;
                // string referrer = null;


                if (context.Request.UrlReferrer != null)
                {
                    // referrer = context.Request.UrlReferrer.OriginalString;

                    string queryString = context.Request.UrlReferrer.Query;
                    System.Collections.Specialized.NameValueCollection queryStrings = System.Web.HttpUtility.ParseQueryString(queryString);
                    language = queryStrings["in_sprache"];
                }

                if(context.Request.QueryString["in_sprache"] != null)
                    language = context.Request.QueryString["in_sprache"];

                if (!string.IsNullOrEmpty(language))
                {
                    language = language.ToLowerInvariant();

                    switch (language)
                    {
                        case "de":
                            language = "de-CH";
                            break;
                        case "fr":
                            language = "fr-CH";
                            break;
                        case "it":
                            language = "it-CH";
                            break;
                        case "en":
                            language = "en-US";
                            break;
                        default:
                            language = "";
                            break;
                    }

                } // End if (!string.IsNullOrEmpty(sprache)) 

                // SQL.Log(url, referrer, sprache);


                // Simulate Browser-Language = in_sprache 
                if (!string.IsNullOrEmpty(language))
                {
                    // context.Request.Headers["Accept-Language"] = language;

                    System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(language);
                    System.Threading.Thread.CurrentThread.CurrentCulture = culture;
                    System.Threading.Thread.CurrentThread.CurrentUICulture = culture;

                    if (context.Request.UserLanguages != null)
                    {

                        // System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(context.Request.UserLanguages[0]); 
                        for (int i = 0; i < context.Request.UserLanguages.Length; ++i)
                        {
                            // context.Request.UserLanguages[i] = "en-US";
                            context.Request.UserLanguages[i] = language;
                        } // Next i 

                    } // End if (context.Request.UserLanguages != null)

                } // End if (!string.IsNullOrEmpty(language)) 

            } // End if (context.Request != null) 


        } // End Sub context_BeginRequest 


    } // End Class 


} // End Namespace 

而且,您可以使用&#34;自定义&#34; -culture日期格式,而不必告诉用户更改浏览器语言。

答案 1 :(得分:1)

你做不到。我能想到的最接近的是将报表的语言属性上的表达式设置为=User!Language,这至少会以用户系统日期格式显示。

enter image description here

答案 2 :(得分:0)

您甚至不需要将语言设置为用户!语言。 SSRS将从本地用户区域设置中选择DateFormat。

enter image description here


但显然你没有很多控制权,如果你的客户对这种格式感到尖叫,他们的PC可能没有设置这些设置吗?

祝你好运!

下面的报告'语言设置为en-au(dd / mm / yyyy) This reports language is set to en-au (dd/mm/yyyy)

答案 3 :(得分:0)

根据Trubs的建议,我在浏览器(这次是Chrome)中设置了语言,并正确格式化了值。我将语言从使用mm / dd / yy格式的英语(美国)更改为使用dd / mm / yy格式的英语(澳大利亚)。当然,我们不能让每个用户都更改其浏览器设置,但是DevOps可以并且应该将其组织中所有浏览器的语言都设置为适合其国家/地区的正确语言,我想-您是否同意Stefan?