none
レポート定義ファイル(rdlc)内テキストボックスに、自作の関数を使った式を挿入できますか? RRS feed

  • 質問

  • 開発環境: Visual Studio 2008 , C#

    MicrosoftReportViewerの定義ファイル(rdlc)に設置したテキストボックスに関する質問です。

    <質問>
    rdlc内に配置したテキストボックスに、自作の関数を使った式を挿入できまますか。

    <現状>
    テキストボックス内の式に、自作した関数を使用すると、デバッグ時に、「テキスト ボックス 'textbox1' の Value 式にエラーが含まれています: [BC30451] 名前 'F_yyyyMMddToWareki' は宣言されていません」とエラーが出ます。関数はプロジェクトにコードファイル(CodeFile1.cs)を追加し、その中に記述しています。

    テキストボックス内の式は「=F_yyyyMMddToWareki(Fields!BirthDay.Value)」です。関数はデータソースから数字8桁の文字列を受け取り、和暦に変換するものです(ex. 19800102--->昭和55年1月2日)。下記サイトを参考にして作成しました。
    http://www.atmarkit.co.jp/fdotnet/dotnettips/203dateparse/dateparse.html
    http://www.atmarkit.co.jp/fdotnet/dotnettips/034wareki/wareki.html

    MSDN(http://msdn.microsoft.com/ja-jp/library/ms252112(v=VS.90).aspx)によると、「組み込み関数の他に、Visual Basic の関数を使用した式もレポートに含めることができます」とあります。また、Basic構文についても調べました。その結果、「rdlc内の式で自作の関数を呼び出すことが出来ない」のでは、と疑問が生じ、今回の質問をしました。

    <その他に試したこと>
    テキストボックスのCalendarプロパティを「Japanese」にすれば、式「=cdate(left(Fields!BirthDay.Value,4) & "/" & mid(Fields!BirthDay.Value),5,2) & "/" & right(Fields!BirthDay.Value),2))」が、時刻付で和暦に変換(ex. 19800102--->昭和55年1月2日 0:00:00)されます。しかし、今回例示している以外のテキストボックスで、文字列を&で連結している式があるので、関数の利用を検討しています。

    以上、回避策やコードの記述場所の誤り等ありましたら、宜しくお願い致します。

    using System;
    using System.Globalization;
    
    public class F_DateChange
    {
      public static string F_yyyyMMddToWareki(string d)
      {
        string f;
        DateTime dt;
    
        f = "yyyyMMdd";
        dt = DateTime.ParseExact(d, f, null);
    
        CultureInfo culture = new CultureInfo("ja-JP", true);
        culture.DateTimeFormat.Calendar = new JapaneseCalendar();
    
        string result = dt.ToString("ggyy年M月d日", culture);
        return result; 
      }
    }
    
    
    
    2010年9月17日 4:38

回答

  • この程度の関数なら、埋め込みコード を使うといいでしょう。

    レポートデザイナのレポートのプロパティでコードタブを選択すると、カスタムコードを記述できます。(VBコード)
    Public Shared Function F_yyyyMMddToWareki(ByVal d As String)
      Dim f As String
      Dim dt As DateTime
      f = "yyyyMMdd"
      dt = DateTime.ParseExact(d, f, Nothing)
    
      Dim culture As New System.Globalization.CultureInfo("ja-JP", True)
      culture.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar()
      Return dt.ToString("ggyy年M月d日", culture)
    End Function
    

    で、関数を使いたいところに、こんなふうに使います。
    この場合はテキストボックスのValueプロパティです。
    =Code.F_yyyyMMddToWareki("20010101")

    #カスタムコードやカスタムアセンブリは情報が少ない・・・
    2010年9月19日 16:07

すべての返信

  • この程度の関数なら、埋め込みコード を使うといいでしょう。

    レポートデザイナのレポートのプロパティでコードタブを選択すると、カスタムコードを記述できます。(VBコード)
    Public Shared Function F_yyyyMMddToWareki(ByVal d As String)
      Dim f As String
      Dim dt As DateTime
      f = "yyyyMMdd"
      dt = DateTime.ParseExact(d, f, Nothing)
    
      Dim culture As New System.Globalization.CultureInfo("ja-JP", True)
      culture.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar()
      Return dt.ToString("ggyy年M月d日", culture)
    End Function
    

    で、関数を使いたいところに、こんなふうに使います。
    この場合はテキストボックスのValueプロパティです。
    =Code.F_yyyyMMddToWareki("20010101")

    #カスタムコードやカスタムアセンブリは情報が少ない・・・
    2010年9月19日 16:07
  • gekkaさん

    返信ありがとうございます。

    コードを記述する場所と言語に問題があったと分かりました。ありがとうございました。

    紹介のあった「埋め込みコード 」を見ると、「レポートにカスタム関数を追加」できる、と記述されていました。VBを思い出しながら、明日試してみます。

    #「自作」ではなく、「カスタム」でMSDNを検索すれば、良かったのですが、語彙力が足りませんでした...

    gekkaさん(&多くのROMの方)、ありがとうございました。

    2010年9月20日 1:45