Re[3]: Crystal Reports runtime loading...
От: vguzev http://u.pereslavl.ru/~vadim/MCSharp/
Дата: 16.03.05 09:26
Оценка: 2 (1)
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
    }
}


Вроде как работает... с хранимыми процедурами...
На отчёты на базе датасетов сразу лучше забить, т.к. слишком много гемороя там...
Замудохаешься потом делать изменения с ними, допустим если добавилась какая-либо колонка в таблице...
Вадим Б. Гузев
http://u.pereslavl.ru/~vadim/MCSharp/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.