O programa a seguir descreve como gerar um Date to Date report do Crystal Reports em C # :criando dois parametros (dateFrom e dateTo). Date From :Date To :Aqui temos tres tabelas selecionadas para o relatorio (ordermaster, OrderDetails e product) e estamos fazendo a formula como, selecione todos os registros das tabelas cuja data do pedido esta entre parametro e fromDate paramater ToDate. Para fazer isso voce tem que selecionar a partir da data como Ordermaster.orderdate, ate a data como Ordermaster.orderdate, operadores de comparacao, operador booleano (AND) e campos de data e parametros fromdate,todate da lista de selecao de Formula Editor e fazer a formula.A figura a seguir mostra como selecionar os campos de editor de formulas e fazer a formula. Duplo clique em cada campo, em seguida, ele sera automaticamente selecionado.Copie e cole o seguinte codigo-fonte :using System;using System.Windows.Forms;using CrystalDecisions.CrystalReports.Engine;using CrystalDecisions.Shared;namespace WindowsApplication1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { ReportDocument cryRpt = new ReportDocument(); cryRpt.Load("PUT CRYSTAL REPORT PATH HERE\CrystalReport1.rpt"); TableLogOnInfos crtableLogoninfos = new TableLogOnInfos(); TableLogOnInfo crtableLogoninfo = new TableLogOnInfo(); ConnectionInfo crConnectionInfo = new ConnectionInfo(); Tables CrTables; ParameterFieldDefinitions crParameterFieldDefinitions ; ParameterFieldDefinition crParameterFieldDefinition ; ParameterValues crParameterValues = new ParameterValues(); ParameterDiscreteValue crParameterDiscreteValue = new ParameterDiscreteValue(); crParameterDiscreteValue.Value = textBox1.Text; crParameterFieldDefinitions = cryRpt.DataDefinition.ParameterFields; crParameterFieldDefinition = crParameterFieldDefinitions["fromDate"]; crParameterValues = crParameterFieldDefinition.CurrentValues; crParameterValues.Clear(); crParameterValues.Add(crParameterDiscreteValue); crParameterFieldDefinition.ApplyCurrentValues(crParameterValues); crParameterDiscreteValue.Value = textBox2.Text; crParameterFieldDefinitions = cryRpt.DataDefinition.ParameterFields; crParameterFieldDefinition = crParameterFieldDefinitions["toDate"]; crParameterValues = crParameterFieldDefinition.CurrentValues; crParameterValues.Add(crParameterDiscreteValue); crParameterFieldDefinition.ApplyCurrentValues(crParameterValues); crConnectionInfo.ServerName = "YOUR SERVERNAME"; crConnectionInfo.DatabaseName = "DATABASE NAME"; crConnectionInfo.UserID = "USERID"; crConnectionInfo.Password = "PASSWORD"; CrTables = cryRpt.Database.Tables; foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables) { crtableLogoninfo = CrTable.LogOnInfo; crtableLogoninfo.ConnectionInfo = crConnectionInfo; CrTable.ApplyLogOnInfo(crtableLogoninfo); } crystalReportViewer1.ReportSource = cryRpt; crystalReportViewer1.Refresh(); } }} Resumo: Os Sub-relatorios pode matar o desempenho de um relatorio, mas quando usado com um pouco de imaginacao pode ser uma ferramenta util na expansao de funcionalidades do Crystal Reports em uma maneira que nao pode ser realizado por qualquer outro metodo.Eu odeio sub-relatorios e sempre considero-os o ultimo recurso em qualquer solucao de relatorios. Nove em cada dez vezes requisitos de informacao podem ser atendidas utilizando um pouco de premeditacao e planejamento (e um solido conhecimento de formulas).Dito isto, ha algumas novas maneiras de usar sub-relatorios que nao vai afetar o desempenho e realmente sera uma vantagem para o desenvolvedor1. Cabecalho do RelatorioQualquer informacao, graficos, logotipos ou campos especiais, que aparecera em todos os relatorios podem ser construidos em um sub-relatorio que e entao adicionado ao relatorio principal.O impacto no desempenho e minimo,Mas o beneficio real vem quando a empresa decide atualizar seu logotipo ou a cor corporativa, Enquanto o sub-relatorio e definido como "Re-import ao abrir" , apenas um sub-relatorio de precisa ser alterado para impacto em toda a biblioteca relatorio inteiro.2. Conciliar grupos em conflitoMuitas vezes, ha uma exigencia para mostrar a mesma informacao resumida por grupos logicamente conflitantes. Por exemplo: mostrando o total de vendas para cada semana dentro de um mes e totais de vendas por equipe em um mes.Um relatorio tipico sub pode ser usado para carregar os dados novamente, em seguida, grupo pelo segundo valor, e esta e a maneira tipica de usar um