2009-06-15 52 views
1

我们有这个XML模式使用XML数据集一个LogEntry。所显示的LogEntry的是filitered在StringRef参数。因此,考虑以下XML:对于Crystal报表

<Log> 
    <LogEntry> 
    <Time>2009-06-15T11:55:04</Time> 
    <StringRef>Type1</StringRef> 
    <Parameters> 
     <Parameter> 
     <Name>Text</Name> 
     <Value>Message1</Value> 
     </Parameter> 
     <Parameter> 
     <Name>Param1</Name> 
     <Value>1</Value> 
     </Parameter> 
     <Parameter> 
     <Name>Param2</Name> 
     <Value>2</Value> 
     </Parameter> 
    </Parameters> 
    </LogEntry> 
    <LogEntry> 
    <Time>2009-06-15T11:55:05</Time> 
    <StringRef>Type2</StringRef> 
    <Parameters> 
     <Parameter> 
     <Name>Text</Name> 
     <Value>Message2</Value> 
     </Parameter> 
     <Parameter> 
     <Name>Param1</Name> 
     <Value>1</Value> 
     </Parameter> 
     <Parameter> 
     <Name>Param2</Name> 
     <Value>2</Value> 
     </Parameter> 
    </Parameters> 
    </LogEntry> 
    <LogEntry> 
    <Time>2009-06-15T11:55:06</Time> 
    <StringRef>Type3</StringRef> 
    <Parameters> 
     <Parameter> 
     <Name>Text</Name> 
     <Value>Message3</Value> 
     </Parameter> 
     <Parameter> 
     <Name>Param1</Name> 
     <Value>1</Value> 
     </Parameter> 
     <Parameter> 
     <Name>Param2</Name> 
     <Value>2</Value> 
     </Parameter> 
    </Parameters> 
    </LogEntry> 
</Log> 

和过滤功能:

StringRef == Type1 or StringRef == Type3 

会给这样的报告:

2009-06-15T11:55:04 Message1 1 2 
2009-06-15T11:55:06 Message3 1 2 

我的问题是这样的:可以在此使用Crystal完成报告?如果可以的话,关于如何做的一些信息将会有所帮助。

注 - 上面已经有所匿名所以我在寻找如何做到这一点,而不是一个明确的答案,但是这将是作为一个例子很有用。我们一直在负责执行该报告,上面是不可能的人告诉记者,不过,我觉得这应该是可能的。这是确定的说这是不可能的,它只是意味着我:-(

干杯更多的工作,

Skizz

回答

1

是的,水晶可以轻松处理的XML数据源。然而,你必须认识到,数据将以表格的形式表示,只需将数据源设置为xml文档,并将所有字段放在详细信息部分即可了解我的意思,我猜可能会有LogEntry,Parameter和Parameters表格

要Concat的参数成一条线,你可以使用一个共享STRINGVAR是这样的...

组通过LogEntry_Id字段然后创建这些3式对象...

reset_var

shared stringvar params; 

whileprintingrecords; 

params := ''; 

concat_var

shared stringvar params; 

whileprintingrecords; 

params := params + iif(length(params) = 0, "", " ") + {Parameter.Value}; 

show_var

shared stringvar params; 

whileprintingrecords; 

params; 

拖动reset_var到组标题(禁止组标题)。这将重置每个LogEntry上的var。将concat_var拖到细节部分(取消细节部分)。这将构建参数字符串。然后将show_var拖到组页脚以显示参数。

+0

我只是补充说,你需要用上面的代码创建公式对象,然后将它们拖到报告的相应部分。 – Skizz 2009-06-16 16:02:44

2

我同意dotjoe在他的文章中的方法应该工作(虽然我没有尝试它),但我想抛出另一个选项让你看看。

另一件你可以看着做而不是使用Crystal的东西是使用XSLT。

如果下面的代码添加到您的xml:

<?xml-stylesheet type="text/xsl" href="test.xsl"?> 

,那么你应该能够使用XSL文件(名为test.xsl)像下面这样:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html> 
<body> 
<table border="1"> 
    <xsl:for-each select="Log/LogEntry[StringRef='Type1' or StringRef='Type3']"> 
    <tr> 
     <td><xsl:value-of select="Time"/></td> 
      <xsl:for-each select="Parameters/Parameter"> 
      <td><xsl:value-of select="Value"/></td> 
     </xsl:for-each> 
    </tr> 
    </xsl:for-each> 
</table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

我明白这是Crystal Reports的主题,但我只想抛出另一个想法,让你尝试这种方式,最终可能比Crystal更适合你。只是扔在那里。 :)

+0

这当然很有趣,但我还没有真正了解XSLT的任何内容,但这是大型系统的一部分,所以我被绑定到使用Crystal Reports - 这正是我正在使用的人员。 – Skizz 2009-06-16 20:07:37