Pergunta

Como posso definir um parâmetro de um sub-relatório?Eu tenho sucesso viciado-me a SubreportProcessing evento, posso encontrar o correto sub-relatório através de email.ReportPath, e eu posso adicionar fontes de dados através de mensagens.Fontes de dados.Adicione.Mas eu não encontrar nenhuma maneira de adicionar parâmetros de relatório??

Tenho encontrado pessoas sugerir para adicioná-los ao relatório mestre, mas eu realmente não quero fazer isso, pois o mestre de relatório não deve ser ligado ao sub-relatório em tudo, outros, que é envolver o sub-relatório.

Eu estou usando um relatório, como um modelo de mestre, a impressão do nome do relatório, números de página, etc.E o sub-relatório é que vai ser o próprio relatório.E se eu pudesse apenas encontrar uma maneira de definir os parâmetros de relatório do sub-relatório que seria bom para ir...

Esclarecimento: Criação/Definição dos parâmetros não é o problema.O problema é definir seus valores.Eu pensei que a coisa natural a se fazer era fazê-lo no SubreportProcessing evento.E o SubreportProcessingEventArgs têm de fato uma propriedade de Parâmetros.Mas é só ler!Assim como você usa o que?Como posso definir o seu valor?

Foi útil?

Solução 6

Depois de procurar e procurar, cheguei à conclusão de que a definição dos parâmetros de um sub-relato, no código, não é possível. A menos que você faça algo chique, como comece a editar o XML da definição do relatório antes de carregá -lo ou algo assim.

(Mas se alguém deve saber que estou errado, por favor, responda, porque ainda estou muito curioso para saber!)

Outras dicas

Ela não funciona, mas com certeza é persnickety.

Primeira coisa que eu recomendo é desenvolver os seus relatórios .rdl.Muito mais fácil para testar os relatórios desta forma.Você também pode obter o sub-conjunto de parâmetros e testadas como rdl, certificando-se de cada parâmetro do sub-relatório é definida também como um parâmetro de relatório pai.Uma vez que você obter os relatórios, incluindo os sub-relatórios - trabalho de que maneira você pode mudar o nome do .rdl para rdlc e adicione o rdlc arquivos para o seu ReportViewer Projeto.Não há mais necessidade de alterações.Usar os nomes dos rdl fontes de dados como os nomes de fonte de dados no seu código para fornecer dados para o relatório no SubreportProcessing manipulador de eventos.

Você não atribuir valores para o parâmetro passado.O sub-relatório irá utilizá-los como está.(Soa como o passo que falta é a adição de parâmetros para o relatório principal, bem como o sub-relatório como mencionado acima.) Você pode avaliar os parâmetros e usá-los como parâmetros de consulta para obter a fonte de dados que você irá adicionar.Você tem que pensar sobre a fonte de dados, como a sua em uma dimensão desconhecida, para um sub-relatório.Você vai ter que fuçar durante a depuração no manipulador de eventos para ver o que eu quero dizer.Alguns dos valores na sua aplicação será prontamente disponíveis, e outros que você usar facilmente em outro lugar vai jogar o objeto não encontrado exceções.Por exemplo, criar um conjunto de dados em uma instância de uma classe criada no meu aplicações de formulário principal.Eu uso o conjunto de dados ao longo da minha aplicação.No SubreportProcessing manipulador de eventos não é possível utilizar o conjunto de dados comum, por isso deve criar uma nova instância da tabela que eu preciso para o relatório e preenchê-lo.No relatório principal, eu seria capaz de acessar o conjunto de dados comum.Existem outras limitações como este.Só tem que percorrer o seu caminho através de.

Aqui é o SubreportProcessing manipulador de eventos a partir de um trabalho VB.NET ReportViewer aplicação.Mostra algumas maneiras diferentes para obter a fonte de dados para um sub-relatório.subreport1 cria uma linha de datatable a partir de aplicação de objetos de negócios, subreport2, fornece dados de relatório requer sem um parâmetro, subreport3 é mentira subreport2, mas avalia um dos parâmetros passados para o sub-relatório para uso em valor de data necessárias para a consulta que cria o ReportDataSource.

    Public Sub SubreportProcessingEventHandler(ByVal sender As Object, _
                                               ByVal e As SubreportProcessingEventArgs)
    Select Case e.ReportPath
        Case "subreport1"
            Dim tbl As DataTable = New DataTable("TableName")
            Dim Status As DataColumn = New DataColumn
            Status.DataType = System.Type.GetType("System.String")
            Status.ColumnName = "Status"
            tbl.Columns.Add(Status)
            Dim Account As DataColumn = New DataColumn
            Account.DataType = System.Type.GetType("System.String")
            Account.ColumnName = "Account"
            tbl.Columns.Add(Account)
            Dim rw As DataRow = tbl.NewRow()
            rw("Status") = core.GetStatus
            rw("Account") = core.Account
            tbl.Rows.Add(rw)
            e.DataSources.Add(New ReportDataSource("ReportDatasourceName", tbl))
        Case "subreport2"
            core.DAL.cnStr = My.Settings.cnStr
            core.DAL.LoadSchedule()
            e.DataSources.Add(New ReportDataSource("ScheduledTasks", _
                                                   My.Forms.Mother.DAL.dsSQLCfg.tSchedule))
        Case "subreport3"
            core.DAL.cnStr = My.Settings.cnStr
            Dim dt As DataTable = core.DAL.GetNodesForDateRange(DateAdd("d", _
                                                                          -1 * CInt(e.Parameters("NumberOfDays").Values(0)), _
                                                                          Today), _
                                                                  Now)
            e.DataSources.Add(New ReportDataSource("Summary", dt))
    End Select
End Sub

Recentemente, tive o mesmo problema e, com toda a pesquisa, não encontrei nada útil, mas finalmente cheguei a uma solução para isso.

Eu criei uma classe com todos os parâmetros no sub -relato, pois suas propriedades (podemos chamá -lo de DTO)

public class MyDto
{
    public string EmployeeFirstName{get; set;}
    public string EmployeeLastName{get; set;}
    // and so on
}

Em seguida, usei uma lista desse tipo como outra fonte de dados no relatório principal e, em seguida, nas 'Propriedades do Subreto', adicionou um parâmetro para cada parâmetro no sub -relato real e escolheu os campos correspondentes da fonte de dados como seus valores.

adding Subreport parameters

Então, ao carregar o relatório, converte a entrada (lista de funcionários) em uma lista do MyDTO e o defina como o DataSource do relatório:

private void LoadReport(List<Employee> employees)
{
    reportviewerMain.ProcessingMode = ProcessingMode.Local;
    reportviewerMain.LocalReport.ReportPath = Application.StartupPath + "\\Reports\\PayChecksReport.rdlc";

    List<MyDto> employeesDataSource = employees.ConvertAll<MyDto>(emp => new MyDto { EmployeeFirstName = emp.FirstName, EmployeeLastName = emp.LastName}).ToList();
    reportviewerMain.LocalReport.DataSources.Add(new ReportDataSource("EmployeesDataSet", employeesDataSource));

    Organization myOrganization = new OranizationFacade().GetOrganizationInfo();
    reportviewerMain.LocalReport.SetParameters(new ReportParameter("OrganizationName", myOrganization.Name));

    this.reportviewerMain.RefreshReport();
}

E...

Isso fez o truque para mim :) Espero que ajude alguém.

Sei que essa é uma pergunta antiga que foi marcada como respondida, mas como eu estava apenas procurando por isso hoje e vi que ela havia sido comentada nos últimos meses, pensei em dar uma resposta de acompanhamento.

Para renderizar o sub -relato no contexto de cada registro no relatório principal, você precisa declarar um SubreportProcessingEventHandler e, em seguida, dentro desse manipulador, carregue o conjunto de dados para cada instância do sub -relato à medida que ocorre. SubreportProcessingEventArgs Possui uma coleção de parâmetros que é passada do relatório dos pais quando o evento dispara.

Portanto, se você configurou os parâmetros de sub -relato no relatório principal com parâmetros nomeados vinculados aos campos no relatório principal, os valores são acessíveis à medida que o sub -relato é renderizado.

Aqui é uma redação muito boa que explica muito mais claramente.

Eu tive um problema semelhante, pois precisava passar por uma propriedade. Para fazer isso, tive que definir uma propriedade no relatório principal e usar essa propriedade para definir a segunda propriedade no sub -relato. Definir a propriedade principal, por sua vez, define a propriedade Subreport. Você pode definir a propriedade principal no código da seguinte forma:

Suponha que você tenha um nome de relatórios RV, então codificaríamos:

var rp = new ReportParameter("MainReportParamName", Properties.Settings....);
rv.LocalReport.SetParameters(new ReportParameters[] { rp });

Você pode adicioná -los através da definição XML. Eu uso o XML para criar um relatório inteiro com base em sub-relatórios selecionados e outras opções. Eu posso colar algum código aqui na segunda -feira se você quiser ver isso como uma solução possível.

EDIT: Você pode definir valores no sub-relato no XML antes de implantar o relatório. Isso não é muito flexível e estou assumindo que, se você deseja solicitar esses valores, provavelmente precisará deles no relatório dos pais.

Se você quiser ver como é o XML, adicione um sub-relato, insira valores para ele nas propriedades do sub-relato> Parâmetros e faça um código de exibição.

<Subreport Name="subreport1">
    <Parameters>
      <Parameter Name="StartDate">
        <Value>=Parameters!StartDate.Value</Value>
      </Parameter>
      <Parameter Name="EndDate">
        <Value>1/1/2009</Value>
      </Parameter>

Em vez de usar os = parâmetros! StartDate.value, acho que você gostaria de colocar um valor real como no final.

Svish - não tenho certeza de que lado do encanamento você está tendo problemas.

Para adicionar parâmetros ao relatório dos pais, abra -o e clique com o botão direito do mouse no sub -relato e selecione Propriedades> Parâmetros.

Você pode definir nomes de parâmetros e atribuir um valor, por exemplo,

Parameter Name | Parameter Value
---------------+---------------------
MyParameter    | =Fields!Params.Value

Portanto, deste lado do encanamento, os parâmetros obtêm seu valor da fonte de dados do relatório pai.

Para adicionar parâmetros a um sub -relato, abra o sub -relato e da barra de ferramentas Selecionar relatório> Parâmetros de relatório

Aqui você define um parâmetro para receber o parâmetro do relatório dos pais, por exemplo,

Name      | myParameter
----------+---------------------
Data Type | String

Pois o que parece que você quer fazer, você não pode acabar com um sub -relato e apenas tem o único relatório? As informações que você está tentando envolver o relatório parece ideal para incluir apenas os cabeçalhos e rodapés do relatório.

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