2

レポートで非常に頻繁に必要とするいくつかの式をレポート関数にカプセル化しようとしています。これにより、一度コードを記述して、レポートのどこでも使用できるようになります。しかし、私は本当に Pascal / C# プログラマであり、VB(A) 構文に苦労しています.....

しかし、この小さな日付書式設定機能でさえ、どういうわけか機能しません...

Public Function DateFmt (ByVal dt As DateTime) As String
    Return IIF(IsNothing(dt), "", FormatDateTime(dt, 2))
End Function

基本的に、DateTimeフィールドがNULLデータベースにある場合は空の文字列 (空のセル) を表示したいのですが、それ以外の場合は「短い日付」の書式設定オプションを使用します。

セルでは、これをセル式として追加しようとしていますが、次のように式を入力し始めると:

=Code.

インテリセンスが起動しますが、私の関数がそのリストに表示されません.....うーん....何が欠けていますか?

更新:=Code.DateFmt(.....)インテリセンスが機能しない場合でも、セルに式を入力できることに気付きましたが、残念ながら機能しません。

式を直接追加するNULLと表示される日付が適切に抑制されますが、この共有関数を使用するとレポートNULLに日付が01.01.0001再び表示されます。なぜ?

また、選択肢のリストに応じて値を返す関数、つまりSWITCH基本的にステートメントが必要です。このコードは正しいですか?

Public Function GetGrp(ByVal grp As String)
    Select Case grp
      Case "Region"
          Return fields!RegionId.Value
      Case "Somedate"
          Return YEAR(Fields!Somedate.Value)
    End Select
End Function

この関数により、実際にはコンパイルが失敗し、次のエラー メッセージが表示されます。

ユーザー定義コードの 7 行目のエラー: [BC30469] 非パブリック メンバーへの参照にはオブジェクト インスタンスが必要です

?!?!?!?!? ここでSSRSが私に伝えようとしているのは正確には何ですか?

更新 #2:
OK、これを理解しました -Fieldsコレクションはカスタム コードでは使用できません (理由は明らかではありません - とにかく....)。

したがって、この関数を次のように変更する必要がありました。

Public Function GetGrp(ByVal grp As String, ByVal fields As Fields)

そして今、その部分が機能します

4

2 に答える 2

2

関数から値を返すVBAの方法は、その関数名に値を割り当てることです。returnキーワードはないと思います。

これが、関数がインテリセンスリストに表示されない理由でもある可能性があります。

次のような関数を定義してみてください。

Public Function DateFmt (ByVal dt As DateTime) As String
    DateFmt = IIF(IsNothing(dt), "", FormatDateTime(dt, 2))
End Function

Public Function GetGrp(ByVal grp As String)
    Select Case grp
      Case "Region"
          GetGrp = fields!RegionId.Value
      Case "Somedate"
          GetGrp = YEAR(Fields!Somedate.Value)
    End Select
End Function

アップデート:

また、SSRSのVBAコードは、静的関数のコレクションに似ています。つまり、レポートの状態(パラメーター/フィールドなど)にアクセスできません。

fields!*2つの値をbyvalパラメーターとして関数に渡してみGetGrpます。


注:このコードをテストするためのSSRSまたはOfficeがないため、問題が発生した場合はお知らせください。

于 2013-02-01T08:22:37.330 に答える
1

IsNothing vbscript式は、カスタムVBコードではうまく機能しないようです。カスタムコードをこれに変更すると、機能する場合があります。

Public Function DateFmt (ByVal dt As DateTime) As String
    Return IIF(dt = Nothing, "", FormatDateTime(dt, 2))
End Function

この関連する質問から抽出されたソリューション。

于 2013-02-01T10:44:36.333 に答える