Probleme Crystal Report C# Passage Parametre

Signaler
Messages postés
73
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
14 septembre 2007
-
Messages postés
73
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
14 septembre 2007
-
Bonjour à tous,

Je repose ma question car c'est urgent ! Désolé d'avance.


Je rencontre un soucis avec Crystal Report intégré à VS 2005
Je développe sous C# et je veux intégrer certains états Crystal ayant besoin de paramètres

Le
soucis est qu'au lancement du formulaire contenant le crystal viewer,
j'obtiens des messages d'erreurs liés à des fichiers temporaires .rpt
Je pense que mon code est bon vu qu'il fonctionne sur un autre projet C# mais sous VS 2003
Autres précisions :
            - L'application fonctionne sur une base Oracle
            - Les fichiers dll nécessaires à l'utilisation de Crystal Report fonctionnent avec le Framework 2.0
   
        - J'ai testé un état Crystal Report sans paramètre et j'obtiens
également une erreur : "erreur dans le moteur de recherche"

                                    Voici Mon Code
</italique></gras>

// Déclaration
        private ParameterFields        mParameterFields = new ParameterFields();
        private ParameterField          mParameterField  = new ParameterField();
        private ParameterDiscreteValue mDiscreteVal  = new ParameterDiscreteValue();
        private string                                                       m_sParametre = "";

// Code appelé
                mParameterField.ParameterFieldName = "discreteVal";       // Nom de la valeur discrete de l'état
                mDiscreteVal.Value                              = m_sParametre;    // Valeur string récupérée en paramètre

                mParameterField.CurrentValues.Add(mDiscreteVal);
                mParameterFields.Add(mParameterField);
               
                CR_11_Edition_Devis         crt             = new CR_11_Edition_Devis();

                #region Log de l'état
                crt.SetDataSource("BaseTest");
                crt.SetDatabaseLogon("test", "test");
                #endregion

                mCrViewer.ReportSource = crt;

Si quelqu'un à une idée, parce que la je n'ai plus beaucoup de temps, il me reste cette intégration à finir pour mon projet.

Merci d'avance

spike

1 réponse

Messages postés
73
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
14 septembre 2007

Mesdames et Messieurs,

J'ai trouvé la solution après maintes tentatives et recherches.
En fait, j'ai utilisé une classe spéciale en utilisant une classe nommé CachedReport

Je poste mon code pour ceux qui rencontre ou ont rencontré le probleme :

Classe CachedReport

using System;
using System.ComponentModel;
using System.Windows.Forms;

using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.ReportSource;
using CrystalDecisions.Shared;

namespace IHM
{
    public class CachedReport : Component, ICachedReport
    {
        protected ReportDocument Report = new ReportDocument();
        protected bool isCacheable;
        protected bool shareDBLogonInfo;
        protected string reportName;
        protected ParameterDiscreteValue parametre = new ParameterDiscreteValue();
        protected TimeSpan cacheTimeOut;

        public CachedReport(string s, ParameterDiscreteValue param)
        {
            reportName       = s;
            parametre        = param;
        }

        public virtual Boolean IsCacheable
        {
            get
            {
                return isCacheable;
            }
            set
            {
                isCacheable = value;
            }
        }

        public virtual Boolean ShareDBLogonInfo
        {
            get
            {
                return shareDBLogonInfo;
            }
            set
            {
                shareDBLogonInfo = value;
            }
        }

        public virtual TimeSpan CacheTimeOut
        {
            get
            {
                return cacheTimeOut;
            }
            set
            {
                cacheTimeOut = value;
            }
        }

        public virtual ReportDocument CreateReport()
        {
            try
            {
                Report.Load
                   (reportName, OpenReportMethod.OpenReportByTempCopy);
                Report.Site = this.Site;
                Report.SetParameterValue("discreteVal", parametre);
                Report.SetDatabaseLogon("getec", "getec");
            }
            catch(SystemException exp)
            {
                MessageBox.Show(exp.Message.ToString());
            }

            return Report;
        }

        public virtual String GetCustomizedCacheKey(RequestContext request)
        {
            String key = null;

            key = RequestContext.BuildCompleteCacheKey(
                request,
                reportName,
                this.GetType(),
                this.ShareDBLogonInfo);
            return key;
        }
    }
}

Code appelant la classe :

            try
            {
                mParameterField.ParameterFieldName = "discreteVal";   // Champ de parametre
                mDiscreteVal.Value                 = m_sParametre;             // Je récupère la valeur d'un string et je le met dans la valeur discrete
                mParameterField.CurrentValues.Add(mDiscreteVal);
                mParameterFields.Add(mParameterField);

                CachedReport cr = new CachedReport(@"C:\test\2007\CR_test.rpt", mDiscreteVal);
                mCrViewer.ParameterFieldInfo = mParameterFields;
                mCrViewer.ReportSource = cr;
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }

Et voila

spike