S>А у нас все отчёты на хранимых процедурах. А датасеты впадлу калякать, самый простой способ — настроить все отчёты на конкретную машину и в производстве потребовать, чтобы машина называлась также как и при тестировании (разработке).
Читать здесь
http://www.gotdotnet.ru/LearnDotNet/NETFramework/85842.aspx
Сам сейчас над этим парюсь... но вроде нашёл как с ним бороться
Вот пример страницы, которая отображает репорт:
using System;
using System.Web.UI;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using CrystalDecisions.Web;
using QuantumArt.ICDStats.CoreLibrary;
using QuantumArt.ICDStats.Web.MasterPages;
namespace QuantumArt.ICDStats.Web.Reports.protx
{
public class salesDailyDetails : Page
{
#region properties
protected Content headerregion;
protected Content leftregion;
protected Content centerregion;
protected Content footerregion;
protected ContentContainer Contentcontainer1;
protected CrystalReportViewer CrystalReportViewer1;
#endregion properties
#region Web Form Designer generated code
protected override void OnInit( EventArgs e )
{
InitializeComponent();
base.OnInit( e );
}
private void InitializeComponent()
{
this.PreRender += new EventHandler(salesDailyDetails_PreRender);
this.Load += new EventHandler( Page_Load );
}
#endregion
#region methods
private void BindReport()
{
string reportLocation = Server.MapPath( "./ProtxDailyDetails.rpt" );
if ( this.CrystalReportViewer1.ReportSource == null )
{
ReportDocument rdoc = new ReportDocument();
rdoc.Load( reportLocation );
this.CrystalReportViewer1.ReportSource = rdoc;
ReportManager.ApplyLogOnInfo( rdoc );
ReportManager.ApplyTimeSpan( CrystalReportViewer1 );
}
// order type
ParameterField type = new ParameterField();
type = this.CrystalReportViewer1.ParameterFieldInfo[ "@order_type" ];
ParameterDiscreteValue dvType = new ParameterDiscreteValue();
dvType.Value = Request.Params[ "type" ];
type.CurrentValues.Clear();
type.CurrentValues.Add( dvType );
this.CrystalReportViewer1.DataBind();
}
#endregion methods
#region event handlers
private void salesDailyDetails_PreRender(object sender, EventArgs e)
{
BindReport();
}
private void Page_Load(object sender, EventArgs e)
{
BindReport();
}
#endregion event handlers
}
}
Здесь я биндю репорт в PreRender, т.к. у меня такие требования: начальная и конечная даты от которых зависит репорт хранятся в сесии, и могут изменяться при постбеках... А если не делать DataBind на PageLoad, то не работает экспорт и печать... вот и приходится извращаться...
Шаманские методы... но работают вроде... В Кристале по другому не возможно IMHO- везде нужно с бубном прыгать, прежде чем что-то получишь в итоге
А вот и сам ReportManager:
using System;
using System.Web;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using CrystalDecisions.Web;
using QuantumArt.ICDStats.ApplicationConfiguration;
namespace QuantumArt.ICDStats.CoreLibrary
{
public class ReportManager
{
#region properties
public static DateTime FromDate
{
get
{
DateTime fromDate = DateTime.Now.AddYears( -2 );
try
{
fromDate = DateTime.Parse( (string)HttpContext.Current.Session[ "FromDate" ] );
}
catch
{}
return fromDate;
}
}
public static DateTime ToDate
{
get
{
DateTime toDate = DateTime.Now.AddDays( -1 );
try
{
toDate = DateTime.Parse( (string)HttpContext.Current.Session[ "ToDate" ] );
}
catch
{}
return toDate;
}
}
#endregion properties
#region methods
public static void ApplyLogOnInfo( ReportDocument rdoc )
{
TableLogOnInfo logonInfo = new TableLogOnInfo();
ConnectionInfo connectionInfo = new ConnectionInfo();
connectionInfo.ServerName = Globals.DBServer;
connectionInfo.DatabaseName = Globals.DBDatabase;
connectionInfo.UserID = Globals.DBLogin;
connectionInfo.Password = Globals.DBPassword;
logonInfo.ConnectionInfo = connectionInfo;
Tables tables = rdoc.Database.Tables;
foreach ( Table table in tables )
{
logonInfo = table.LogOnInfo;
logonInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo( logonInfo );
}
}
public static void ApplyTimeSpan( CrystalReportViewer viewer )
{
// start
ParameterField paramFromDate = new ParameterField();
paramFromDate = viewer.ParameterFieldInfo[ "@start_date" ];
ParameterDiscreteValue dvStartDate = new ParameterDiscreteValue();
dvStartDate.Value = ReportManager.FromDate;
paramFromDate.CurrentValues.Clear();
paramFromDate.CurrentValues.Add( dvStartDate );
// end
ParameterField paramEndDate = new ParameterField();
paramEndDate = viewer.ParameterFieldInfo[ "@end_date" ];
ParameterDiscreteValue dvEndDate = new ParameterDiscreteValue();
dvEndDate.Value = ReportManager.ToDate;
paramEndDate.CurrentValues.Clear();
paramEndDate.CurrentValues.Add( dvEndDate );
}
#endregion methods
}
}
Вроде как работает... с хранимыми процедурами...
На отчёты на базе датасетов сразу лучше забить, т.к. слишком много гемороя там...
Замудохаешься потом делать изменения с ними, допустим если добавилась какая-либо колонка в таблице...