2016-08-18 59 views
1

我一直试图让这个行为没有运气。SSRS报告表达式拆分全名字段

数据库基本字段只包含FULL NAME字段,其中包含某些情况下的中间名首字母,某些其他情况下不包含中间名首字母。

我一直在试图通过使用下面的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," "))) 

但它包括中东声母第一显示..作为一个例子:

如果全名字段是约翰小号DOE,上面的表达式显示为:

S Doe, John 

需要什么要显示的是:

Doe, John 

如何设置我的表达式以摆脱Middle初始名称到di张开?

我做了大量的研究,并尝试了很多差异表达式,但没有运气..在此先感谢。

回答

1

尝试使用此表达式:

=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的解决方案,但是我建议使用自定义代码来获得一个维护的解决方案。

UPDATE:正则表达式的解决方案:

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

让我知道,如果这有助于。

+0

小调:看起来像这个表达式有一个OBOB,它将最后一个字符剪掉名字。 – bitnine

+0

@bitnine,谢谢检查。当我测试表达式时,它适用于只包含第一个中间名(如果有)字母的名称。即。 'John S Doe','Allan F Alsop'。你是如何测试它的? –

+0

我使用了一个数据集的单一静态行“SELECT'Joeseph A Bank'AS agent_name;”。然后,我将表情粘贴到一个裸露的Tablix上以做一个快速检查。我看到的结果是“Bank,Joesep”。 – bitnine

2

虽然效率会低一点,这是实现结果的清洁方式:

=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”。

+0

感谢这个效果很好,但对于带有后缀名称的这个小问题。例如,Robert K. Downey,JR。如果我使用这个,它显示为JR。,罗伯特 – user3571153

+0

啊,后缀。那些期望的输出是什么?你可以放入一个字符串替换“,”到“,”。但是如果你的名字数据库中有“James Michael D Van Der Beek,Jr”这样的人,那么简单的表达式就会变得非常复杂,试图处理这些情况。特别是如果它的生活和被添加到。 – bitnine

+0

期望的后缀输出将是“唐尼,JR。,罗伯特” 谢谢你这个人。对此,我真的非常感激! – user3571153