我们有这个XML架构:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Log">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="LogEntry" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="Time" type="xs:dateTime" />
<xs:element name="StringRef" type="xs:string" />
<xs:element name="Parameters" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="Parameter" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Value" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我们想要创建一个如下所示的Crysal报告:
<Time> <Parameter:Name == Text> <Parameter:Name == Param1> <Parameter:Name == Param2>
其中报告的每一行都是一个LogEntry。显示的LogEntry在StringRef参数上过滤。因此,给定以下XML:
<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 Reports完成吗?如果可以的话,一些关于如何做的信息会有所帮助。
注意 - 以上内容已被匿名化,所以我正在寻找如何做而不是特定的答案,尽管这将是一个有用的例子。我们已经被负责实施本报告的人告知上述情况是不可能的,但我觉得这应该是可能的。可以说这是不可能的,这对我来说意味着更多的工作: - (
干杯,
Skizz
答案 0 :(得分:2)
我同意dotjoe他的帖子中的方法应该有效(虽然我没有尝试过),但我想抛出另一个选项供你查看。
您可以考虑使用XSLT而不是使用Crystal。
如果您将以下代码添加到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更好的解决方案。把它扔出去。 :)
答案 1 :(得分:1)
是的,Crystal可以轻松处理xml数据源。但是,您必须意识到数据将表示为表格。只需将数据源设置为xml文档,并将所有字段放在详细信息部分中以查看我的意思。我猜有一个LogEntry,参数和参数表。
要将参数连接成一行,您可以使用共享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拖到详细信息部分(禁止显示详细信息部分)。这将构建param字符串。然后将show_var拖到组页脚以显示参数。