【问题标题】:SSRS Reporting Expression to Split Full Name FieldSSRS 报告表达式拆分全名字段
【发布时间】:2016-08-18 15:26:57
【问题描述】:

我一直试图让它表现得没有运气。

数据库基础字段只有全名字段,在某些情况下包括中间名首字母,在其他情况下没有中间名首字母。

我一直在尝试通过使用下面的 ssrs 表达式来显示 LastName, FirstName:虽然这适用于字段中没有中间首字母或姓名的名称....对于那些包含中间首字母/名称的名称,我们遇到了显示问题。

=Right(Fields!agent_name.Value,Len(Fields!agent_name.Value)-Instr(Fields!agent_name.Value," ")) & ", " & (Left(Fields!agent_name.Value,Instr(Fields!agent_name.Value," ")))

但它包括首先显示的中间首字母。例如:

如果全名字段是 John S Doe,上面的表达式显示为:

S Doe, John

我需要显示的是:

Doe, John

如何设置我的表达式以摆脱要显示的中间名首字母/名称?

我已经进行了大量研究并尝试了许多差异表达但没有运气..提前致谢。

【问题讨论】:

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


    【解决方案1】:

    虽然效率稍低,但这是实现结果的一种简洁方式:

    =Split(Fields!agent_name.Value," ")(Split(Fields!agent_name.Value," ").Length-1) + ", " + Split(Fields!agent_name.Value," ")(0)
    

    编辑:以上内容确实不适用于后缀。下面的表达式将删除中间首字母,如果它是第二个名称并且长度为 1,您可以在计算字段中使用它。但是名字“Ann Marie”会失败,第一个/最后一个交换需要单独处理。

    =IIF(Split(Fields!agent_name.Value," ")(1).Length=1,Replace(Fields!agent_name.Value, " " + Split(Fields!agent_name.Value," ")(1) + " "," "),Fields!agent_name.Value)
    

    简而言之,最好用代码来处理这个问题。但即便如此,如果您的全名字段包含空格,超出了您想要分隔的内容,则可能会出现模棱两可的情况,例如无后缀和首字母的“Ann Marie van Der Beek”。

    【讨论】:

    • 谢谢,这很好用,但是对于带有后缀的名称来说,这是一个小问题。例如,小罗伯特·K·唐尼 (Robert K. Downey)。如果我使用它,它会显示为 JR., Robert
    • 啊,后缀。这些期望的输出是什么?您可以将“,”的字符串替换为“,”。但是,如果您的姓名数据库中有像“James Michael D Van Der Beek, Jr”这样的人,那么在处理这些案件时,简单的表达方式将会变得非常复杂。特别是如果它是实时的并被添加到。
    • 后缀的期望输出是“Downney, JR., Robert” 感谢这个人。我真的很感激!
    【解决方案2】:

    尝试使用这个表达式:

    =RIGHT(
    Fields!agent_name.Value,LEN(Fields!agent_name.Value)-InStrRev(Fields!agent_name.Value," "))
     & ", " & LEFT(
     Fields!agent_name.Value,
     InStr(Fields!agent_name.Value," ")-1
    )
    

    这是一个原生 SSRS 解决方案,但我建议使用自定义代码来获得可维护的解决方案。

    更新:正则表达式解决方案:

    =System.Text.RegularExpressions.Regex.Replace(
      Fields!agent_name.Value,
      "(\w+)\s+(\w+\.*\s)?(\w+)",
      "$3, $1"
     )
    

    如果这有帮助,请告诉我。

    【讨论】:

    • 次要注意:看起来这个表达式有一个 OBOB,它会从名字中剪掉最后一个字符。
    • @bitnine,感谢您的检查。当我测试表达式时,它适用于仅包含第一个中间名(如果有)字母的名称。 IE。 John S Doe,Allan F Alsop。你是怎么测试的?
    • 我使用了一个带有单个静态行“SELECT 'Joeseph A Bank' AS agent_name;”的数据集。然后我将表达式粘贴到一个简单的 Tablix 中以进行快速检查。我看到的结果是“Bank, Joesep”。
    • @bitnine,是的,你是对的,错误是由表达式中不必要的减法引起的。感谢您的时间测试。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多