2009-06-15 9 views
1

Nous avons ce schéma XML:Utilisation des ensembles de données XML pour un rapport Crystal

<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> 

et nous voulons créer un rapport Crysal qui ressemble à ceci:

<Time> <Parameter:Name == Text> <Parameter:Name == Param1> <Parameter:Name == Param2> 

où chaque ligne du rapport est un LogEntry. Les LogEntry affichés sont filtrés sur le paramètre StringRef. Donc, étant donné le code XML suivant:

<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> 

et filtrage sur:

StringRef == Type1 or StringRef == Type3 

donnerait un rapport comme celui-ci:

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

Ma question est la suivante: cela peut être fait en utilisant cristal Rapports? Si c'est possible, certaines informations sur la façon de le faire seraient utiles. Notes - ce qui précède a été anonymisé quelque peu, donc je cherche comment le faire plutôt qu'une réponse spécifique, bien que ce sera utile à titre d'exemple. La personne responsable de la mise en œuvre de ce rapport nous a dit que ce qui précède n'est pas possible, mais je pense que cela devrait être possible. Il est correct de dire qu'il est impossible, il est signifie simplement plus de travail pour moi :-(

Cheers,

Skizz

Répondre

1

Oui, Crystal peut facilement gérer un xml source de données. Toutefois, il faut se rendre compte que la les données seront représentées sous la forme d'une table.Il suffit de définir la source de données dans le document xml et de mettre tous les champs dans la section détails pour voir ce que je veux dire.Il y aurait des tables LogEntry, Parameter et Parameters

Pour concaténer les paramètres en une seule ligne, vous pouvez utiliser un stringvar partagé comme ça ...

groupe par le champ LogEntry_Id puis créer ces 3 objets formule ...

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; 

Faites glisser reset_var au groupe en-tête (supprime l'en-tête du groupe). Cela réinitialisera le var sur chaque LogEntry. Faites glisser concat_var dans la section des détails (supprimez la section des détails). Cela va construire la chaîne de param. Faites ensuite glisser show_var sur le pied de groupe pour afficher les paramètres.

+0

Je voudrais simplement ajouter que vous devez créer des objets de formule avec le code ci-dessus et faites-les ensuite glisser dans la section appropriée du rapport. – Skizz

2

Je suis d'accord avec dotjoe que la méthode dans son message devrait fonctionner (même si je ne l'ai pas essayé), mais je voulais jeter une autre option pour vous de regarder.

Une autre chose que vous pouvez faire au lieu d'utiliser Crystal est l'utilisation de XSLT.

Si vous avez ajouté le code suivant à votre xml:

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

alors vous devriez être en mesure d'utiliser un fichier xsl (nommé Test.xsl) comme ce qui suit:

<?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> 

Je comprends que c'est hors sujet pour Crystal Reports, mais je voulais juste lancer une autre idée pour vous d'essayer qui pourrait finir par être une meilleure solution pour vous que Crystal. Je le jette juste là. :)

+0

C'est certainement intéressant, je n'ai pas encore vraiment appris quoi que ce soit à propos de XSLT, mais cela fait partie du grand système, donc je suis lié à l'utilisation de Crystal Reports - c'est exactement ce que les gens travaillent. – Skizz

+1

Eh bien, honnêtement, je n'en ai pas fait grand chose non plus, mais je savais que c'était disponible et je me suis dit que ça irait bien à cette spécification. Je comprends complètement d'être marié à Crystal Reports. :) – Dusty

Questions connexes