2010-04-12 2 views
4

RDL 보고서 파일이 있는데 어떻게 든 보고서를 실행하고 보고서를 채우는 데 사용할 데이터 집합을 가져오고 싶습니다. 내가하려는 것은 사용자에게 실제로 보고서를 표시하지 않고 보고서를 채우는 데 사용할 데이터에서 원시 데이터 추출을 얻는 것입니다. 이것이 가능한가?RDL 파일에서 데이터 집합을 채우려면 어떻게해야합니까?

+0

보고서 작성기 2.0 또는 3.0 RDL 파일입니까? –

답변

3

나는 당신이하고 싶은 것을 이해한다면, 가능하다. 그러나 그것은 고통 스럽다. 보고서 작성기 2.0 보고서의 다양한 스냅 샷 (보고서 관리자에서 찍은대로)을 위해이 작업을 수행했습니다.

보고서 서버의 기본 제공 웹 서비스를 사용하면 프로그래밍 방식으로 보고서를 생성 할 수 있습니다. 일부 샘플 코드는 ReportExecutionService.Render Method을 참조하십시오 (SQL Server 2008에서도 ReportExecution2005 웹 서비스를 사용함에 유의하십시오). 보고서를 XML, MHTML 또는 PDF와 같은 다양한 형식으로 렌더링 한 다음 데이터를 추출하려고 시도 할 수 있습니다. 관심있는 데이터 테이블을 보고서에 추가하고 Visibility를 Hide로 변경하여 테이블을 숨기고 DataElementOutput 속성을 Output으로 설정하여 보고서가 렌더링 될 때마다 테이블이 포함되도록해야합니다. 표에 몇 가지 고유 한 이름을 지정합니다 (예 : 'Tablix1'을 'FlatData'로 대체). 그런 다음 보고서를 XML 형식으로 렌더링하고 XSLT를 사용하여 해당 테이블 내의 행만 추출 할 수 있습니다. 여기에 내가 렌더링 된 보고서 작성기 2.0 보고서에서 데이터를 추출하기 전에 사용했던 일부 XSLT는이 XSLT는 보고서에서 데이터의 숨겨진 테이블을 이름에 따라 달라집니다

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" encoding="utf-8"/> 
    <xsl:variable name="reportID" select="*[local-name()='Report']/@Name"/> 

    <!-- Uppercase and lowercase alphabets for case-insensitive string comparisons --> 
    <xsl:variable name="up" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
    <xsl:variable name="lo" select="'abcdefghijklmnopqrstuvwxyz'"/> 

    <xsl:template match="/"> 
    <xsl:element name="ContainerElementOfMyData"> 
     <xsl:attribute name="ReportID"> 
     <xsl:value-of select="$reportID"/> 
     </xsl:attribute> 

     <xsl:for-each select="*[local-name()='Report']/*[local-name()='FlatData']"> 
     <!-- If the FlatData node has attributes on its tag, insert all of those 
      attributes in a single node --> 
     <xsl:if test="count(@*) &gt; 0"> 
      <MyNode> 
      <xsl:for-each select="@*"> 
       <xsl:variable name="parentAttrName" select="name(.)"/> 
       <xsl:element name="{$parentAttrName}"> 
       <xsl:value-of select="."/> 
       </xsl:element> 
      </xsl:for-each> 
      </MyNode> 
     </xsl:if> 

     <!-- Go through each tag in FlatData that starts with 'Details' --> 
     <xsl:for-each select="//*[substring(local-name(), 1, 7)='Details']"> 
      <xsl:if test="count(@*) &gt; 0"> 
      <MyNode> 
       <!-- For each attribute of the Details tag: --> 
       <xsl:for-each select="@*"> 
       <xsl:variable name="attrName" select="name(.)"/> 
       <xsl:variable name="lowerAttrName" select="translate($attrName,$up,$lo)"/> 
       <xsl:variable name="attrValue" select="."/> 

       <!-- Write the attribute name as its own tag --> 
       <xsl:element name="{$attrName}"> 
        <xsl:choose> 
        <xsl:when test="$attrValue = ''"> 
         <!-- Do nothing because no value to output and we don't want empty CDATA tags --> 
        </xsl:when> 

        <!-- When field might have HTML tags, we want to wrap it in CDATA tags: --> 
        <xsl:when test="$lowerAttrName = 'my_first_text_field' or $lowerAttrName = 'my_other_text_field'"> 
         <xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[]]></xsl:text> 
         <xsl:value-of select="$attrValue"/> 
         <xsl:text disable-output-escaping="yes">]]</xsl:text> 
         <xsl:text disable-output-escaping="yes">></xsl:text> 
        </xsl:when> 

        <!-- When field will not have HTML tags, just output its value as normal --> 
        <xsl:otherwise> 
         <xsl:value-of select="$attrValue"/> 
        </xsl:otherwise> 
        </xsl:choose> 
       </xsl:element> 
       </xsl:for-each> 
      </MyNode> 
      </xsl:if> 
     </xsl:for-each> 
     </xsl:for-each> 
    </xsl:element><!--End of ContainerElementOfMyData--> 
    </xsl:template> 
</xsl:stylesheet> 

주 'FlatData'이 될 수 있습니다. 보고서에있는 일부 데이터가 HTML 태그 또는 두 개의 XML 태그 사이에 배치되는 경우 유효한 XML이 아닌 다른 것들을 포함하는 경우 해당 데이터를 CDATA 태그로 래핑하도록 위의 XSLT를 변경하십시오 (예 : my_first_text_field을 필드로 대체하십시오 값에 CDATA 태그가 필요한 이름).

이 XSLT를 보고서의 렌더링 된 XML 버전에 적용하면 더 많은 XML이 생성됩니다. 이번에는 관심있는 보고서의 데이터 만 포함됩니다. 보고서의 렌더링 된 XML 버전을 사용하는 데 따른 문제점은 모든 차트, 모양 정보 등이 포함되어 있으며 사용자 데이터가 아니라는 것입니다. 보고서 중 하나를 XML 형식으로 렌더링하고 소스를 살펴보십시오. 그것은 당신이 원하지 않는 온갖 종류의 광기를 가지고 있습니다.

XML에 XSLT 변환을 적용하는 명령 줄 도구는 xalan을 권장합니다. 다음은 사용 예는 다음과 같습니다

<?xml version="1.0" encoding="utf-8"?> 
<ContainerElementOfMyData ReportID="MyReportName"> 
<MyNode> 
<Key1>Value 1</Key1> 
<Key2>Second value of your data</Key2> 
</MyNode> 
</ContainerElementOfMyData> 
0

그것은 흥미로운 문제입니다 :

PS C:\Program Files\xalan-j_2_7_0> java org.apache.xalan.xslt.Process -IN rdl_rendered_to_xml.xml -XSL xsl_shown_above.xsl -OUT transformed.xml 

결과 transformed.xml는 다음과 같은 형식을 갖습니다. 내가 그것을 (rdl 파일의 단위 테스트를 위해) 풀어야 할 때, 나는 rdl 파일에서 sql 문을 추출하고 그것을 실행할 간단한 xml 파서를 작성했다. 그것은 매우 간단합니다. 그러나 문장에 많은 매개 변수가있는 경우 더 복잡해집니다. 그러나 매개 변수 정보는 파일에서도 사용할 수 있으므로 일반 솔루션을 코딩 할 수 있어야합니다 (물론 매개 변수 값을 제공해야합니다).

1

Sarah Vessels가 이미 그녀의 대답에서 언급 한대로 데이터를 렌더링하기 위해 보고서 서버를 밀어 넣을 수 있습니다. 많은 형식의 , 아마도 Excel은 보고서 선택의 복잡성에 달려 있습니다. I asked similar qestion 그리고 많은 쟁반이 끝나면 #TempTaples이 Mssql으로 끝나고 보고서가 렌더링되기 전에 나에게 보고서 서버가 작업 처리의 마지막 인스턴스이고 모든 데이터와 저장소가 보고서 렌더링의 백 엔드에서 수행되어야합니다.