RDL 보고서 파일이 있는데 어떻게 든 보고서를 실행하고 보고서를 채우는 데 사용할 데이터 집합을 가져오고 싶습니다. 내가하려는 것은 사용자에게 실제로 보고서를 표시하지 않고 보고서를 채우는 데 사용할 데이터에서 원시 데이터 추출을 얻는 것입니다. 이것이 가능한가?RDL 파일에서 데이터 집합을 채우려면 어떻게해야합니까?
답변
나는 당신이하고 싶은 것을 이해한다면, 가능하다. 그러나 그것은 고통 스럽다. 보고서 작성기 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(@*) > 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(@*) > 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>
그것은 흥미로운 문제입니다 :
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 파서를 작성했다. 그것은 매우 간단합니다. 그러나 문장에 많은 매개 변수가있는 경우 더 복잡해집니다. 그러나 매개 변수 정보는 파일에서도 사용할 수 있으므로 일반 솔루션을 코딩 할 수 있어야합니다 (물론 매개 변수 값을 제공해야합니다).
Sarah Vessels가 이미 그녀의 대답에서 언급 한대로 데이터를 렌더링하기 위해 보고서 서버를 밀어 넣을 수 있습니다. 많은 형식의 , 아마도 Excel은 보고서 선택의 복잡성에 달려 있습니다. I asked similar qestion 그리고 많은 쟁반이 끝나면 #TempTaples이 Mssql으로 끝나고 보고서가 렌더링되기 전에 나에게 보고서 서버가 작업 처리의 마지막 인스턴스이고 모든 데이터와 저장소가 보고서 렌더링의 백 엔드에서 수행되어야합니다.
보고서 작성기 2.0 또는 3.0 RDL 파일입니까? –