none
Imprimer un Etat paramétré (De Crystal report) sous visual studio 2010 RRS feed

  • Question

  • Bonjour à tous,

     

    j'ai un soucis avec la conception de mes états (rapports) avec crystal report sous VS 2010.

    j'aimerais créer des états qui représenteront les tris effectués dans les tables de ma base de données.

    afin de mieux trier mes résultas, j'ai créer des requêtes qui vont chercher dans des vues.

    Mon idée de départ était d'utiliser Linq To Sql pour relier les résultats au rapport, mais malgré tous mes essais, je suis bloqué car les rapports sous Crystal report sont basés sur une feuille Report sur laquelle je n'arrive pas à intégrer la prise en compte de mes paramètres quand je veux utiliser une source de données de type objet (DataContext).

     

    Merci,


    Petit à petit l'oiseau construit son nid
    mercredi 10 novembre 2010 17:21

Réponses

  • Bonjour,

    Voici la solution que j'ai trouvé et appliqué à mon problème.

    Rappel: je prendrais l'exemple d'un formulaire divisé en deux parties et qui contient dans la première, des zones de texte et un bouton (Valider), et dans l'autre partie, un crystalReportViewer (qui présentera les textes saisis sous une forme plus ou moins conviviale à imprimer avec logo, entete ... ).

    - Dans la déclaration de la class de mon formulaire "Etat",

    public partial class Etat : Form
    /// <Ajout pour le raport>
    string report_file="";
    ReportDocument ReportDoc = new ReportDocument();
    ///</Ajout pour le raport>
    

    - Après l'initialisation de mon formulaire,

    <pre>private void makeReport(string ReportFile)
    {
      reportDoc.Load(ReportFile);
      crystalReportViewer.ReportSource=ReportDoc;
    }
    
    private ParameterValues AddDiscretValue(string paramValue, ParameterValues paramValues)
    {
     ParameterDiscreteValue paramDiscreteValue=new ParameterDiscreteValue;
     paramDiscreteValue.Value= paramValues.Add(paramDiscreteValue);
    }
    
    Private void SetParamValue(string paramName, string  paramValue)
    {
     for (int i=0; i< ReportDoc.DataDefinition.FormulaFields.Count; i++)
     if (reportDoc.DataDefinition.FormulaFields[i].FormulaName=="{" + paramName + "}")
     ReportDoc.DataDefinition.FormulaFields[i].Text="\"" + paramValue + "\"";
    }
    
    private string GetParamValue (string paramName)
    {
     string tmpvalue ="";
     for (int i=0; i<ReportDoc.DataDefinition.FormulaFileds.Count; i++)
    {
     if (ReportDoc.DataDefinition.FormulaFields[i].FormulaName=="{" + paramName + "}")
     tmpvalue=ReportDoc.DataDefinition.FormulaFields[i].Text;
    } 
    return tmpvalue;
    }
    
    
    // Charger l'événement load du formulaire
    
    private void Etat_load(object sender, EventArgs e)
    {
     OpenFileDialog file = new OpenFileDialog();
     file.Filter="Report Files (*.rpt)|*.rpt";
    if (file.ShowDialog()==DialogResult.OK)
    {
     report_file=(string)file.FileName;
    }
     ReportDoc.Load(report_file);
    crystalreportViewer.ReportSource=ReportDoc;
    }
    
    //Derrière le bouton valider
    // avec texte1, texte2 et texte3 comme éléments à imprimer 
    Private void ValiderBtn_Click(object sender, EventArgs e)
    {
     makeReport(report_file);
     SetParamValue("@texte1", texte1Tbx.Text.ToString());
     SetParamValue("@texte2", texte2Tbx.Text.ToString());
     SetParamValue("@texte3", texte3Tbx.Text.ToString());
    
    crystalReportViewer.ReportSource=reportDoc;
    }
    

    De même, créer un rapport crystal report (*.rpt) sur lequel j'ai configurer les trois paramètres (text1, text2 et text3). et j'ai juste lié mon raport à mon crystalReportViewer.

    Tout est cool,

    Je prendrais le temps pour mieux étudier ce extrait de code et voir comment l'améliorer et avoir une solution plus simple et adaptée, mais pour l'instant ça me dépanne assez bien.

     

    Bonne journée


    Petit à petit l'oiseau construit son nid
    • Marqué comme réponse NOUBISSI vendredi 3 décembre 2010 10:11
    vendredi 3 décembre 2010 10:08

Toutes les réponses

  • Bonjour,

    Le plus simple et le plus propre est de baser votre état suivant des entités Linq To SQL (et non une requête). Ensuite avant d'exécuter le rapport, faites votre requête (en fonction des différents critères), récupérer les entités et stockez les dans un tableau. Injectez ce tableau directement dans votre rapport...

    Cordialement


    Gilles TOURREAU - MVP C# - MCPD Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5 - MCTS ADO .NET 3.5 / SQL Server 2008 Developper - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    dimanche 14 novembre 2010 23:04
    Modérateur
  • Bonjour,

     

    Noubissi, est-ce que vous avez réussi d’implémenter la solution de M. Tourreau ?

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    mercredi 17 novembre 2010 10:01
  • Bonjour,

    Actuellement cette méthode me parait encore floue.

    J'ai essayé cette solution toute cette nuit, mais sans succes.

    peut être nous n'utilisons pas les mêmes outils ou méthodes ?

    moi j'ai essayé par la méthode suivante:

    ==>Click droit sur le projet ==>Ajouter ==>Nouvel élément ==>rapport.

     et dans la fenêtre qui s'ouvre (pour un test) j'insère une matrice de données et je configure sa source de données vers un objet DataContext que j'ai préalablement crée, et c'est à ce niveau que tout devient flou car je ne connais aucun moyen de faire mes tris avec Linq to Sql. (Pourtant je suis près du but) .

    Aussi, j'ai pensé à effectuer mes tris derrière un Formulaire qui les chargera sur ma feuille d'états avant de l'appeler, mais là encore le problème est de passer  ces données sur cet état.

     

    Merci votre soutien


    Petit à petit l'oiseau construit son nid
    mercredi 17 novembre 2010 15:17
  • Bonjour,

    Lorsque vous créez un rapport, vous devez le baser sur un objet correspondant au type de votre entité et non à votre contexte de données.

    Cordialement


    Gilles TOURREAU - MVP C# - MCPD Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5 - MCTS ADO .NET 3.5 / SQL Server 2008 Developper - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 17 novembre 2010 21:51
    Modérateur
  • Bonjour,

    Noubissi, est-ce que votre projet fonctionne maintenant?

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    vendredi 19 novembre 2010 10:36
  • Bonjour à tous,

    Désolé de vous décevoir, mais après plusieurs nuits éveillé, je ne m'en sort toujours pas.

    dans mes derniers exercices,

    A partir d'un test Basic

    1. je suis partis d'un nouveau projet vide de type "Application Rapports"
    • L'assistant m'a orienté vers la connexion à ma source de données (j'ai choisis Base de données)
    • après DataSet jusqu'au choix d'une de mes tables, pour ensuite terminer l'assistant avec la série de "suivant"

    A ce point tout va et le débogage me donne un résultat correct.

    Maintenant en voulant trier mes données à afficher

    • J'ai crée un fichier dbml  (BRINK.dbml)
    • derrière mon Formulaire (Form1) j'ai rédigé la petite requete Linq Suivante

     

    var dc = new BRINKDataContext();
    var AB = from a in dc.Agences
           from b in dc.Banques
    where a.AgenceId == b.AgenceId
    select new
    {
      b.Agences.AgenceNom,
      b.Banque,
      b.PremierAgent,
      b.SecondAgent,
      b.QuatriemeAgent,
      b.TroisiemeAgent
    };
    // Une alternative de placer le résultat dans un tableau
    object[] result = AB.ToArray();
    // Utilisation du tableau
    this.BanqueBindingSource.DataSource = result.ToList();
    //plusieurs fois j'ai relié les données directement à la bindingSource et le résultat était aussi bon
    // this.BanqueBindingSource.DataSource = AB.ToList();
    
    

    Une fois la BindingSource configurée,

    • je rentre sur la partie Design de mon formulaire et sur le ReportView, je vérifie que ma source de données est toujours BanqueBindingSource.

    Et malgrès ceci aucun résultat positif. Peut être la configuration du "TableAdapter.fill" que je n'ai pas pu configurer?.

    Au secour j'aimerais faire un grand pas ce week-end.

    Merci


    Petit à petit l'oiseau construit son nid
    vendredi 19 novembre 2010 10:55
  • Bonjour et bon debut de semaine à tous. Ce week-end, j'ai fait une grande avancée avec mes états. J'ai constaté que le problème était dû au fait que Crystal report pour Visual studio 2010 n'était pas complètement installé, j'avais plutot installé Crystal report pour .net framework 4. Donc après avoir corrigé, j'ai fait quelques tests avec des états paramétrés(paramètres -string- entrés à travers un formulaire) et tout était cool. Donc aujourd'hui, je vais passer des paramètres tirés d'une requete Linq et je reviendrais partager le code. Une fois de plus merci
    Petit à petit l'oiseau construit son nid
    lundi 22 novembre 2010 07:41
  • Bonjour à tous,

    aujourd'hui pour charger mon raport, j'ai utilisé le code ci-dessous:

    int x = dateTimePicker1.Value.Month;
          int y = dateTimePicker2.Value.Month;
         
          var dc = new BrinksDataContext();
          CrystalReport1 cr = new CrystalReport1();
          cr.SetDataSource(
          
            from a in dc.Agences
            from p in dc.PreAlertes
            where a.AgenceId == p.AgenceId
            where p.DateArriveePreAlerte.Month >= x
            where p.DateArriveePreAlerte.Month <= y
            where p.Agences.AgenceNom == AgencesLbx.SelectedValue.ToString()
            orderby p.DateArriveePreAlerte
            select new
            {
              Agence=p.Agences.AgenceNom,
              Banque= p.Banques.Banque,
              Numero_Lta= p.NumeroLta,
              Date_PreAlerte=p.DateArriveePreAlerte,
              Date_Operation= p.DatePrevueOperation,
              Nombre_colis= p.NombreColis,
              Poids= p.Poids,
              Valeur= p.Valeur
            });
          crystalReportViewer1.ReportSource = cr;
    

    Et dans dans mon fichier crystalReport.rpt, j'ai entré comme champs de formule Agence, Banque, Numero_Lta, Date_PreAlerte, Date_Operation, Nombre_colis, Poids, Valeur.

    Mais lors du débogage, l'erreur suivante s'affiche : Le raport ne contient aucune table.

    Merci


    Petit à petit l'oiseau construit son nid
    mardi 23 novembre 2010 09:54
  • Bonjour,

    Voici la solution que j'ai trouvé et appliqué à mon problème.

    Rappel: je prendrais l'exemple d'un formulaire divisé en deux parties et qui contient dans la première, des zones de texte et un bouton (Valider), et dans l'autre partie, un crystalReportViewer (qui présentera les textes saisis sous une forme plus ou moins conviviale à imprimer avec logo, entete ... ).

    - Dans la déclaration de la class de mon formulaire "Etat",

    public partial class Etat : Form
    /// <Ajout pour le raport>
    string report_file="";
    ReportDocument ReportDoc = new ReportDocument();
    ///</Ajout pour le raport>
    

    - Après l'initialisation de mon formulaire,

    <pre>private void makeReport(string ReportFile)
    {
      reportDoc.Load(ReportFile);
      crystalReportViewer.ReportSource=ReportDoc;
    }
    
    private ParameterValues AddDiscretValue(string paramValue, ParameterValues paramValues)
    {
     ParameterDiscreteValue paramDiscreteValue=new ParameterDiscreteValue;
     paramDiscreteValue.Value= paramValues.Add(paramDiscreteValue);
    }
    
    Private void SetParamValue(string paramName, string  paramValue)
    {
     for (int i=0; i< ReportDoc.DataDefinition.FormulaFields.Count; i++)
     if (reportDoc.DataDefinition.FormulaFields[i].FormulaName=="{" + paramName + "}")
     ReportDoc.DataDefinition.FormulaFields[i].Text="\"" + paramValue + "\"";
    }
    
    private string GetParamValue (string paramName)
    {
     string tmpvalue ="";
     for (int i=0; i<ReportDoc.DataDefinition.FormulaFileds.Count; i++)
    {
     if (ReportDoc.DataDefinition.FormulaFields[i].FormulaName=="{" + paramName + "}")
     tmpvalue=ReportDoc.DataDefinition.FormulaFields[i].Text;
    } 
    return tmpvalue;
    }
    
    
    // Charger l'événement load du formulaire
    
    private void Etat_load(object sender, EventArgs e)
    {
     OpenFileDialog file = new OpenFileDialog();
     file.Filter="Report Files (*.rpt)|*.rpt";
    if (file.ShowDialog()==DialogResult.OK)
    {
     report_file=(string)file.FileName;
    }
     ReportDoc.Load(report_file);
    crystalreportViewer.ReportSource=ReportDoc;
    }
    
    //Derrière le bouton valider
    // avec texte1, texte2 et texte3 comme éléments à imprimer 
    Private void ValiderBtn_Click(object sender, EventArgs e)
    {
     makeReport(report_file);
     SetParamValue("@texte1", texte1Tbx.Text.ToString());
     SetParamValue("@texte2", texte2Tbx.Text.ToString());
     SetParamValue("@texte3", texte3Tbx.Text.ToString());
    
    crystalReportViewer.ReportSource=reportDoc;
    }
    

    De même, créer un rapport crystal report (*.rpt) sur lequel j'ai configurer les trois paramètres (text1, text2 et text3). et j'ai juste lié mon raport à mon crystalReportViewer.

    Tout est cool,

    Je prendrais le temps pour mieux étudier ce extrait de code et voir comment l'améliorer et avoir une solution plus simple et adaptée, mais pour l'instant ça me dépanne assez bien.

     

    Bonne journée


    Petit à petit l'oiseau construit son nid
    • Marqué comme réponse NOUBISSI vendredi 3 décembre 2010 10:11
    vendredi 3 décembre 2010 10:08
  • Salut 

    J'ai le meme probleme que vous.

    j'espere que vous avez trouvé une solustion pour ça.si c'est le cas j'aimerais bien que vous m'aidiez

    Merci

    samedi 10 août 2013 10:09