将Crystal数据集用于Crystal报表

时间:2009-06-15 16:13:46

标签: crystal-reports .net-2.0

我们有这个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

2 个答案:

答案 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拖到组页脚以显示参数。