Pergunta

Eu tenho um projeto para atualizar todos os relatórios sobre uma instância SSRS e pensei que eu iria obter uma lista de todos os relatórios para o Excel para que eu possa assinalar-los fora como eu atualizar cada um. Fácil pensei. Eu não usá-lo muitas vezes (em tudo), mas XML parecia se presta a isso. Eu teria algo como:

<Server>
  <ReportFolder>
    <ReportFolder>
      <Report>
      </Report>
      <Report>
      </Report>
    </ReportFolder>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>
  </ReportFolder>
  <ReportFolder>
  </ReportFolder>
</Server>

A tabela Catalog foi minha fonte de dados, tem ItemID e ParentID para que eu possa identificar objetos e sua hierarquia, mas não posso obter o servidor completo em forma de XML, eu posso obter o conteúdo de uma pasta, se eu especificar a pasta (nome ou ItemID), mas não todo o servidor. Uma vez que eu tirar o ONDE ItemID = 1234 linha que eu obter algo como:

<Server>
  <ReportFolder>
  </ReportFolder>
  <ReportFolder>
  </ReportFolder>
  <ReportFolder>
  </ReportFolder>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>  
</Server>

Eu tentei de CTE XML AUTO, XML EXPLICIT e agora estou começando a sentir a minha dissociação até agora com XML é justificado!

Existe uma maneira de obter os completos (até 4 níveis) de hierarquia em formato XML?

Isto é algo que apenas relevantes para XML is not e eu ter tomado um rumo errado em um beco sem saída?

Foi útil?

Solução

Assim, a notícia boa e uma má notícia. Aqui é a boa notícia.

CREATE FUNCTION [dbo].[GetReportTree](@ItemId uniqueidentifier)
RETURNS XML
BEGIN RETURN 
  (SELECT   ca.ItemId AS '@ItemId',
            ca.Name AS '@Name',
            ca.Type AS '@Type',
            dbo.GetReportTree(ca.ItemId)
   FROM dbo.Catalog ca
   WHERE (@ItemId IS NULL AND ParentId IS NULL) OR ParentID=@ItemId
   FOR XML PATH('CatalogItem'), TYPE)
END

SELECT dbo.[GetReportTree](NULL)   

Produz uma hierarquia assim:

<CatalogItem Name="" Type="1">
  <CatalogItem Name="ScrumTest" Type="1">
    <CatalogItem Name="(Hidden) Delta Report Small" Type="2" />
    <CatalogItem Name="(Hidden) Product Burndown Chart Small" Type="2" />
    <CatalogItem Name="(Hidden) Product Cumulative Flow Small" Type="2" />
    <CatalogItem Name="(Hidden) Sprint Burndown Chart Small" Type="2" />
    <CatalogItem Name="All Product Backlog Items" Type="2" />
    <CatalogItem Name="All Sprint Backlog Items" Type="2" />
    <CatalogItem Name="All Sprints" Type="2" />
    <CatalogItem Name="Current Sprint Status" Type="2" />
    <CatalogItem Name="Delta Report" Type="2" />
    <CatalogItem Name="Engineering Reports" Type="1">
      <CatalogItem Name="(Hidden) Bug History Chart Small" Type="2" />
      <CatalogItem Name="Bug Count" Type="2" />
      <CatalogItem Name="Bug History Chart" Type="2" />
      <CatalogItem Name="Bug Priority Chart" Type="2" />
    </CatalogItem>
    <CatalogItem Name="Impediment Report" Type="2" />
    <CatalogItem Name="Product Backlog Composition" Type="2" />
    <CatalogItem Name="Product Burndown Chart" Type="2" />
    <CatalogItem Name="Product Cumulative Flow" Type="2" />
    <CatalogItem Name="Retrospective Report" Type="2" />

A má notícia, é que eu não tenho certeza se você pode fazê-lo sem adicionar a função "ReportTree" em seu ReportServer. Então, isso depende do seu acesso a esse servidor. Você pode ser capaz de obter a função para trabalhar em bancos de dados, eu não tentar isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top