【问题标题】:Define a full method for a parameter expression为参数表达式定义完整方法
【发布时间】:2015-09-11 13:42:56
【问题描述】:

我正在为报表服务器创建报表,并且鉴于它缺少代码编辑器*来定义完整的方法,任何用于设置属性的复杂表达式都会很快变得非常混乱,因为它们必须是单个语句.通常这意味着多层嵌套的Iif(...) 炸弹以六个右括号结尾。任意虚构示例:

=Iif(Fields!myField.Value == "Cancelled", 
    "It's been cancelled", 
    Iif(Fields!anotherField.Value < 15, 
        "Less than 15 things", 
        Iif(Fields!anotherField.Value >= 15 And Fields!anotherField.Value < 30, 
            "Between 15 and 30 things", 
            Iif(Fields!anotherField.Value >=30, 
                "Over 30 things", 
                "")))) 'keep hitting that close bracket key until things stop getting red squiggles

我可以做些什么来在我的表达式编辑器中获得一个漂亮的完整方法体吗?我知道在 C# 中至少有一些方法采用现有方法的名称,或者只是让您直接在其中编写方法,但我不知道那叫什么。这似乎是我想要的那种东西——一个带有“内部”方法体的单一表达式。我希望能够编写如下表达式:(为我狡猾的 VB.Net 语法道歉)

= SomeMagic({
      If (Fields!myField.Value == "Cancelled") Then
          Return "It's been cancelled"
      End If

      If (Fields!anotherField.Value < 15) Then
          Return "Less than 15 things"
      End If

      If (Fields!anotherField.Value >= 15
      And Fields!anotherField.Value < 30) Then
          Return "Between 15 and 30 things"
      End If

      If (Fields!anotherField.Value ?= 45) Then
          Return "Over 30 things"
      End If
  })

如果可行但仅在 C# 中可行,并且可以将报告使用的语言更改为 C#,我愿意接受 - 与 VB.Net 相比,我更熟悉 C#。如果有一种方法可以将 competent* 代码编辑器与 Report Server 一起使用,并在其中定义可以在表达式编辑器中调用(并被它识别)的方法,那么这也是一个可接受的解决方案。

*从技术上讲,一个代码编辑器。这是一个对话框。是明文。它没有编译时错误检查。表达式编辑器无法识别其中定义的方法。几乎没用。

【问题讨论】:

  • 我可能弄错了 Report Server / Reporting Services 的名称。我的意思是你用来实际创建报告的编辑器,它存在于 Sql Server 附带的 Visual Studio Shell 2012 (Integrated) 中。

标签: vb.net reporting-services


【解决方案1】:

您可以在 SQLSSRS

中处理它

SSRS 方式:使用switch STATEMENT。

= Switch(
      Fields!myField.Value = "Cancelled", "It's been cancelled",
      Fields!anotherField.Value < 15, "Less than 15 things",
      Fields!anotherField.Value >= 15 And Fields!anotherField.Value < 30, "Between 15 and 30 things",
      Fields!anotherField.Value>= 30, "Over 30 things"
      1=1, "Unknown"
  )

IN SWITCH else 使用 1=1 条件处理。如果你不想要其他的,你可以离开那部分。

OR 在您的 SQL 查询 中处理它,这样更易​​于维护和调试。

  SELECT  Col1, Col2, ...
         CASE 
              WHEN myField = 'Cancelled' THEN 'It''s been cancelled'
              WHEN anotherField < 15 THEN 'Less than 15 things'
              WHEN anotherField BETWEEN 15 AND 30 THEN 'Between 15 and 30 things' --It includes both 15 and 30
              WHEN anotherField > 30 THEN 'Over 30 things'
              ELSE 'Unknown'
         END AS newColumn        
  FROM ...
  WHERE ....

【讨论】:

  • SQL 方式在维护方面肯定会更好,但是当我将这些用于报告中的多个属性时,执行该 SQL 感觉非常错误-边。这意味着我的报告程序有 15 个以上的附加输出列,称为“DeptBackgroundColor”、“DeptFontColor”等,并且可能会引入维护难题,其中一些更简单的表达式在 RS 中完成,而其他表达式在 SQL 中完成。感觉很恶心。虽然不知道 Switch 函数,但它肯定比我的 Iif 巢更好。
  • 是的,我同意,如果您有那么多计算列,那么在报告中处理可能比在查询中处理更好。
  • 这是一个很好的答案。 VS 中的“自定义代码”编辑器很可笑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多