使用 Crystal Report 的 XML 数据集
我们有这样的 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>
我们想要创建一个如下所示的 Crystal Report:
<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
We have this XML schema:
<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>
and we want to create a Crysal Report that looks like this:
<Time> <Parameter:Name == Text> <Parameter:Name == Param1> <Parameter:Name == Param2>
where each line of the report is one LogEntry. The LogEntry's that are displayed are filitered on the StringRef parameter. So, given the following 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>
and filtering on:
StringRef == Type1 or StringRef == Type3
would give a report like this:
2009-06-15T11:55:04 Message1 1 2
2009-06-15T11:55:06 Message3 1 2
My question is this: can this be done using Crystal Reports? If it can, some information on how to do it would be helpful.
Notes - the above has been anonymised somewhat so I'm looking for how to do it rather than a specific answer, although that will be useful as an example. We've been told by the person responsible for implementing this report that the above is not possible, however, I feel that this should be possible. It's OK to say it's impossible, it's just means more work for me :-(
Cheers,
Skizz
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我同意 dotjoe 的观点,他的帖子中的方法应该有效(尽管我没有尝试过),但我想抛出另一个选项供您查看。
您可以考虑做的另一件事是使用 XSLT 来代替 Crystal。
如果您将以下代码添加到您的 xml:
那么您应该能够使用如下所示的 xsl 文件(名为 test.xsl):
我知道这不是 Crystal Reports 的主题,但我只是想抛出另一个想法让您尝试一下,这可能最终会成为比 Crystal 更好的解决方案。 只是把它扔在那里。 :)
I agree with dotjoe that the method in his post should work (though I didn't try it), but I wanted to throw out another option for you to look at.
Another thing that you can look at doing instead of using Crystal is using XSLT.
If you added the following code to your xml:
then you should be able to use an xsl file (named test.xsl) like the following:
I understand that this is off topic for Crystal Reports, but I just wanted to throw out another idea for you to try that might end up being a better solution for you than Crystal. Just throwing it out there. :)
是的,Crystal 可以轻松处理 xml 数据源。 但是,您必须意识到数据将表示为表格。 只需将数据源设置为 xml 文档,并将所有字段放入详细信息部分即可明白我的意思。 我猜想会有一个 LogEntry、Parameter 和Parameters 表。
要将参数连接到一行,您可以使用共享 stringvar,如下所示...
按 LogEntry_Id 字段分组,然后创建这 3 个公式对象...
reset_var
concat_var
show_var
将 reset_var 拖动到组标题(抑制组标题)。 这将重置每个 LogEntry 上的 var。 将 concat_var 拖到详细信息部分(隐藏详细信息部分)。 这将构建参数字符串。 然后将 show_var 拖到组页脚以显示参数。
Yes, Crystal can easily handle an xml datasource. However, you have to realize that the data will be represented as a table. Just set the datasource to the xml doc and put all the fields in the details section to see what I mean. I'd guess there'd be a LogEntry, Parameter, and Parameters tables.
To concat the parameters into one line you can use a shared stringvar like so...
Group By the LogEntry_Id field then create these 3 formula objects...
reset_var
concat_var
show_var
Drag reset_var to the group header (suppress the group header). This will reset the var on each LogEntry. Drag concat_var to the details section(suppress the details section). This will build the param string. Then drag show_var to the group footer to display the params.