代码之家  ›  专栏  ›  技术社区  ›  Skizz

将XML数据集用于Crystal报表

  •  1
  • Skizz  · 技术社区  · 16 年前

    我们有以下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>
    

    其中,报告的每一行都是一个日志条目。显示的日志条目在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实现吗?如果可以的话,一些关于如何做的信息会很有帮助。

    干杯

    斯基兹

    2 回复  |  直到 16 年前
        1
  •  2
  •   Dusty    16 年前

    我同意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更适合你们。只是把它扔出去。:)

        2
  •  1
  •   dotjoe    16 年前

    是的,Crystal可以轻松处理xml数据源。但是,您必须意识到数据将表示为一个表。只需将数据源设置为xml文档,并将所有字段放在details部分,就可以了解我的意思。我猜会有一个日志条目、参数和参数表。

    要将参数合并到一行中,可以使用共享的stringvar,如。。。

    按LogEntry_Id字段分组,然后创建这3个公式对象。。。

    shared stringvar params;
    
    whileprintingrecords;
    
    params := '';
    

    康卡特乌瓦酒店

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

    shared stringvar params;
    
    whileprintingrecords;
    
    params;
    

    将reset_var拖动到组标题(抑制组标题)。这将重置每个日志项上的var。将concat_var拖动到详细信息部分(抑制详细信息部分)。这将生成param字符串。然后将show_var拖动到组页脚以显示参数。