Crystal Reports runtime loading...
От: Аноним  
Дата: 16.03.05 07:24
Оценка: 3 (1)
Уважаемые мастера.
Не могли бы подсказать, как можно загрузив *.rpt файл отчёта из файла, задать ему базу данных, которая находится в памяти программы?
И где можно почитать о изменении данных отчётов перед показом пользователю?

Спасибо.

17.03.05 19:45: Перенесено модератором из '.NET' — AndrewVK
Re: Crystal Reports runtime loading...
От: Peter Fleischer Германия www.informtoools.de
Дата: 16.03.05 07:56
Оценка:
...
> Не могли бы подсказать, как можно загрузив *.rpt файл отчёта из файла, задать ему базу данных, которая находится в памяти программы?
> И где можно почитать о изменении данных отчётов перед показом пользователю?

Я это делаю так:

    Dim Rep As New myReport
    Rep.SetDataSource(myDataSet)
    With CrystalReportViewer1
      .ReportSource = Rep
      .ShowFirstPage()
    End With


Peter
Posted via RSDN NNTP Server 1.9
Re[2]: Crystal Reports runtime loading...
От: Spy13 Беларусь http://security.software-testing.ru
Дата: 16.03.05 09:01
Оценка:
PF> Rep.SetDataSource(myDataSet)

Т.е. это для каждого отчёта нужно создавать DataSets?
А если в отчёте есть подоотчёт, то ещё и для них?
А сам Кристал юзать только как Word — редактировать текст и печать?
Моя есть не любить Кристал.

По вот этой линке есть сэмл как программно настроить запуск отчётов с другого сервака для отчётов построенных на таблицах
http://support.businessobjects.com/communityCS/FilesAndUpdates/csharp_win_samples.exe

А вот если отчёты построены на хранимых процедурах, то ексепшен — не может падла найти таку таблицу (ясен пень — енто ж не таблица!).

А у нас все отчёты на хранимых процедурах. А датасеты впадлу калякать, самый простой способ — настроить все отчёты на конкретную машину и в производстве потребовать, чтобы машина называлась также как и при тестировании (разработке).
... I'm Sega Mega Spy! << RSDN@Home 1.1.4 beta 4 >>
--
http://software-testing.ru
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/
Re[4]: Crystal Reports runtime loading...
От: Spy13 Беларусь http://security.software-testing.ru
Дата: 16.03.05 10:12
Оценка:
V> public static void ApplyLogOnInfo( ReportDocument rdoc )
V> {
V> TableLogOnInfo logonInfo = new TableLogOnInfo();
V> ConnectionInfo connectionInfo = new ConnectionInfo();
V> connectionInfo.ServerName = Globals.DBServer;
V> connectionInfo.DatabaseName = Globals.DBDatabase;
V> connectionInfo.UserID = Globals.DBLogin;
V> connectionInfo.Password = Globals.DBPassword;
V> logonInfo.ConnectionInfo = connectionInfo;

V> Tables tables = rdoc.Database.Tables;

V> foreach ( Table table in tables )
V> {
V> logonInfo = table.LogOnInfo;
V> logonInfo.ConnectionInfo = connectionInfo;
V> table.ApplyLogOnInfo( logonInfo );
V> }
V> }

Что-то я не понял бубна в этом примере. Если это то, что написано в методе ApplyLogOnInfo (см. цитату выше), то в саппортовских семплах, что я приводил в предыдущем посте всё это было, даже более, они там пробегаются по всем сабрепортам и делают ApplyLogOnInfo и для них. Всё выглядит рульно, но у меня при вызове crTable.ApplyLogOnInfo(mycrTableLogOnInfo) для "таблицы" с
location "Proc(sp_ostbydate_int)" и именем "sp_ostbydate_int" (- собсна моя ХП), — я получаю exception "The table Proc(sp_ostbydate_int) cannot be found".

Хотел бы уточнить, у вас действительно table.ApplyLogOnInfo( logonInfo ); работает для случая, если table — ссылается на ХП? Если так, то может у меня грабли в другом месте? Просто я сделал вывод, что саппортовский семпл не фурчит с ХП...
... I'm Sega Mega Spy! << RSDN@Home 1.1.4 beta 4 >>
--
http://software-testing.ru
Re[5]: Crystal Reports runtime loading...
От: vguzev http://u.pereslavl.ru/~vadim/MCSharp/
Дата: 16.03.05 10:44
Оценка:
S>Что-то я не понял бубна в этом примере. Если это то, что написано в методе ApplyLogOnInfo (см. цитату выше), то в саппортовских семплах, что я приводил в предыдущем посте всё это было, даже более, они там пробегаются по всем сабрепортам и делают ApplyLogOnInfo и для них. Всё выглядит рульно, но у меня при вызове crTable.ApplyLogOnInfo(mycrTableLogOnInfo) для "таблицы" с
S>location "Proc(sp_ostbydate_int)" и именем "sp_ostbydate_int" (- собсна моя ХП), — я получаю exception "The table Proc(sp_ostbydate_int) cannot be found".

Бубен во-первых в том, что у них в примере только для первой таблицы делается ApplyLogonInfo, а надо как я понял для всех.
Второй бубен в том, что когда передаёшь параметры процедуре нужно обязательно делать Clear, иначе там могут остаться старые параметры (которые были до постбека, или дефолтные).
Третий бубен в том, что Кристал не хочет подхватывать параметры процедуры передаваемые из C#, если при создании репорта были указаны дефолтные данные для параметров...
Четвёртый бубен — не работает печать, если биндинг производится на PreRender'е...

Ещё бубнов?

S>Хотел бы уточнить, у вас действительно table.ApplyLogOnInfo( logonInfo ); работает для случая, если table — ссылается на ХП? Если так, то может у меня грабли в другом месте? Просто я сделал вывод, что саппортовский семпл не фурчит с ХП...


Да, работает. Тут скорее всего проблема в том, что Кристал может считать процедуру, начинающуюся с "sp_" как системную и по умолчанию её не видеть... Там где-то было в настройках, что нужно специально включать эту фичу, только где именно — не помню...
Вадим Б. Гузев
http://u.pereslavl.ru/~vadim/MCSharp/
Re[5]: Crystal Reports runtime loading...
От: FantomGood Украина  
Дата: 18.03.05 08:30
Оценка: 2 (1)
Здравствуйте, Spy13, Вы писали:

S>Хотел бы уточнить, у вас действительно table.ApplyLogOnInfo( logonInfo ); работает для случая, если table — ссылается на ХП? Если так, то может у меня грабли в другом месте? Просто я сделал вывод, что саппортовский семпл не фурчит с ХП...

самая большая проблема это хелп, с которым работятать очнеь тяжело, да и хитрая объектная модель.
По поводу выше описаннной проблемы, попробуйте указать для crTable.Location новое значение, как описано в примере.
foreach(Table crTable in crTables)
{
    crTableLogOnInfo = crTable.LogOnInfo;
    crTableLogOnInfo.ConnectionInfo = crConnectioninfo;
    crTable.ApplyLogOnInfo(crTableLogOnInfo);
    // Note that if you wish to change Database (catalog) name as well as
    // the server, you must set new crTable.Location property as follows:
    // crTable.Location = "<new_database_name>.<owner>." + crTable.Name;
}
Re[6]: Crystal Reports runtime loading...
От: Spy13 Беларусь http://security.software-testing.ru
Дата: 18.03.05 10:27
Оценка:
V>Бубен во-первых в том, что...
V>Ещё бубнов?

Да, бубнов будь здоров, да ещё и трефы и черви

S>>Хотел бы уточнить, у вас действительно table.ApplyLogOnInfo( logonInfo ); работает для случая, если table — ссылается на ХП?


V>Да, работает. Тут скорее всего проблема в том, что Кристал может считать процедуру, начинающуюся с "sp_" как системную


Не трабла была не в этом. Я подозреваю, что трабл был в том, что у меня на машине стоит Windows Server 2003, а вот спробнул на Windows Professional XP SP2 и там всё рулит. Хотя, возможно, была ещё какая трабла с асемблями, версиями кристала — у меня на машине их целый зоопарк.

Фишка в том, что у меня на машине Location для случая, когда Table ссылается на ХП имеет вид Proc(<proc_name>), а на WinXPsp2 — просто dbo.<name_db>.<proc_name> — вот такая вот бодяга.

Однако осталися такие траблы, может всезнающий all поможет?
1. Если существуют оба сервера и тот на который нацелен отчёт и тот на с которого я программно требую отчёту брать инфу, то отчёт всё равно берёт инфу с первого. А вот если прибить первый, то тогда берёт инфу с последнего. Как кильнуть LogOnInfo для первого сервера?
2. Если прибить первый сервак, то отчёт таки находит второй сервер, но тратит на поиски (скорей всего таймаут на поиск первого сервера) около 30 сек., что юзерам не в сласть. Может где есть какой метод, чтобы изменить этот таймаут?

Спасибо.





P.S. Далее следует набор ключевых слов, чтобы страждующие могли найти этот топик. Знали бы вы как я сам в своё время искал! Да поможет вам великий Google.

Crystal Reports, Microsoft, MS, SQL Server, Stored Procedure, SP, change database name, run-time, runtime, хранимая процедура, хп, изменить сменить поменять программно имя базы данных, сервера, .NET, C#
... I'm Sega Mega Spy! << RSDN@Home 1.1.4 beta 4 >>
--
http://software-testing.ru
Re[6]: Crystal Reports runtime loading...
От: Spy13 Беларусь http://security.software-testing.ru
Дата: 18.03.05 15:55
Оценка:
FG>По поводу выше описаннной проблемы, попробуйте указать для crTable.Location новое значение, как описано в примере.

Похоже проблема была действительно в способе понимания Кристалом crTable.Location. Разница возникла на нескольких машинах, отличающихся как минимум ОСами, а также установленным ПО. Чем имеено она вызвана до конца не понятно, предположительно Кристал не фурычит с Windows Server 2003.

Более подробно я описал ситуэйшн в сообщении http://gzip.rsdn.ru/forum/Message.aspx?mid=1078439&amp;only=1
Автор: Spy13
Дата: 18.03.05

Там же описаны и новые траблы: тормаза с открытием отчёта и т.д.

Спасибо за совет.
... I'm Sega Mega Spy! << RSDN@Home 1.1.4 beta 4 >>
--
http://software-testing.ru
Re[7]: Crystal Reports runtime loading...
От: vguzev http://u.pereslavl.ru/~vadim/MCSharp/
Дата: 20.03.05 15:08
Оценка:
S>Не трабла была не в этом. Я подозреваю, что трабл был в том, что у меня на машине стоит Windows Server 2003, а вот спробнул на Windows Professional XP SP2 и там всё рулит. Хотя, возможно, была ещё какая трабла с асемблями, версиями кристала — у меня на машине их целый зоопарк.

Врядли дело в Windows 2003... потому как у меня тоже 2003-й сервер и там кристал работает нормально.
Насчёт зоопарка — такая же ерунда у меня Стоит сразу и Advanced Developer и Enterprise и ещё куча всего... Половина так и непонятно зачем нужна...
Вадим Б. Гузев
http://u.pereslavl.ru/~vadim/MCSharp/
Re[8]: Crystal Reports runtime loading...
От: Spy13 Беларусь http://security.software-testing.ru
Дата: 21.03.05 14:50
Оценка:
Здравствуйте, vguzev, Вы писали:

А у вас есть задержка на открытие отчётов с другого сервера (около 30 сек)? Как вы с ней боретесь, побороли?

А ещё трабл с двумя живыми серверами (тот на который заточен отчёт и тот с которого требуется брать инфу) — у меня всё равно берётся с первого....
... I'm Sega Mega Spy! << RSDN@Home 1.1.4 beta 4 >>
--
http://software-testing.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.