IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Imprimer les donnée d'une base de donnée avec RapportView


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2024
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2024
    Messages : 16
    Par défaut Imprimer les donnée d'une base de donnée avec RapportView
    Bonjour chers coachs et experts de langage c#. J'ai une petite préoccupation et j'ai vraiment besoin de votre aide. Je travail sur un projet de la Gestion des écoles. et je souhaite imprimer l'emploi du temps
    des cours en fonction du programme de chaque classe. J'ai crée mon rapport avec les paramètres à visualiser mais le code ne marche pas. Je reçois l'erreur : "La référence d'objet n'est pas définie à une instance d'objet."
    Donc l'erreur se trouve au niveau du traitement du rapport local. Svp je veux votre aide. Je suis débutant et c'est mon deuxième projet avec c#. Merci beaucoup d'avance

    Voici le code source :

    private void BtnImprimer_Click(object sender, EventArgs e)
    {
    try
    {
    db = new DbGestionEcoleContext();
    Entete PR = new Entete();
    int idemploi = (int)DataEmploi.CurrentRow.Cells[0].Value;
    var emploi = db.EmploiDuTemps.Single(s => s.ID_Emploi == idemploi);
    var listdetail = db.Detail_EmploiDuTemps.Where(s => s.ID_Emploi == idemploi).ToList();

    PR = db.Entetes.SingleOrDefault(s => s.ID_AnneeScolaire == emploi.ID_AnneeScolaire);
    if (PR != null && listdetail.Any())
    {
    RAP.FML_AFFICHER frmrap = new RAP.FML_AFFICHER();
    var Classe = db.Classes.Single(s => s.ID_Classe == emploi.ID_Classe);
    var Annee = db.AnneeScolaires.Single(s => s.ID_AnneeScolaire == emploi.ID_AnneeScolaire);
    var Entete = db.Entetes.Single(s => s.ID_AnneeScolaire == emploi.ID_AnneeScolaire);

    frmrap.RAPAfficher.LocalReport.ReportEmbeddedResource = "GESTION ECOLE/RAP/Rapport_EmploiDuTemps.rdlc";
    frmrap.RAPAfficher.LocalReport.DataSources.Add(new ReportDataSource("DataEmploiDuTemps", listdetail));

    ReportParameter classe = new ReportParameter("Classe", Classe.Classe1);
    ReportParameter anneeScolaire = new ReportParameter("AnneeScolaire", Annee.AnneeScolaire1);
    ReportParameter republique = new ReportParameter("Republique", Entete.Republique);
    ReportParameter ministere = new ReportParameter("Ministere", Entete.MinisterePrimaire);
    string ImagePays = Convert.ToBase64String(PR.LogoPays);
    string ImageEcole = Convert.ToBase64String(PR.LogoEcole);
    ReportParameter PImage = new ReportParameter("ImagePays", ImagePays);
    ReportParameter EImage = new ReportParameter("ImageEcole", ImageEcole);
    ReportParameter date = new ReportParameter("Date", DateTime.Now.ToString());//Date du système

    frmrap.RAPAfficher.LocalReport.SetParameters(new ReportParameter[] { classe,anneeScolaire,republique,ministere,PImage,EImage,date });
    frmrap.RAPAfficher.RefreshReport();
    frmrap.ShowDialog();

    }
    else
    {
    MessageBox.Show("Aucune donnée à imprimer.");
    }
    }
    catch (Exception ex)
    {
    MessageBox.Show($"Une erreur s'est produite : {ex.Message}\n{ex.StackTrace}");
    }
    }

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 540
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 540
    Par défaut
    ça serait bien de savoir où se trouve l'erreur, donc dans un 1er temps désactiver le try/catch pour voir quelle ligne donne l'erreur. Ensuite, on pourra investiguer

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2024
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2024
    Messages : 16
    Par défaut
    L'erreur se trouve à ce niveau : frmrap.RAPAfficher.LocalReport.DataSources.Add(new ReportDataSource("DataEmploiDuTemps", listdetail));

    frmrap.RAPAfficher.LocalReport.SetParameters(new ReportParameter[] { classe,anneeScolaire,republique,ministere,PImage,EImage,date });

    les lignes pour l'affichage des données

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 540
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 540
    Par défaut
    Tu as vérifié si tes variables étaient correctes ? (classe,anneeScolaire,republique,ministere,PImage,EImage,date contiennent des éléments)

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2024
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2024
    Messages : 16
    Par défaut
    Bien sûr que oui 😭

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 540
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 540
    Par défaut
    tu as vérifié listdetail, vu qu'en fait l'erreur se situerait sur la ligne frmrap.RAPAfficher.LocalReport.DataSources.Add(new ReportDataSource("DataEmploiDuTemps", listdetail));


    Sinon regarde LocalReport ou DataSources aussi

  7. #7
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Quand tu postes du code, tu peux utiliser la balise CODE (ou C inclure un bout de code dans le texte ; bouton # dans l'éditeur), afin de le mettre en valeur.

    Ton erreur est une NullReferenceException, ça signifie que dans ta chaîne d'appel l'un des objets n'est pas instancié.

    Pour la lisibilité de ton code, tu as sûrement intérêt a redécouper en fonction plus petites. Ici tu as tout en vrac dans le gestionnaire d'événement, il est difficile de voir ce qu'il se passe, dans fonction avec un nommage approprié permettrait de mieux saisir l'intention de chaque action.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    private void BtnImprimer_Click(object sender, EventArgs e)
    {
        try
        {
            db = new DbGestionEcoleContext();
            int idEmploi = (int)DataEmploi.CurrentRow.Cells[0].Value;
     
            var (emploi, details, entete) = ExtractDetails(db, idEmploi);
     
            if (entete != null && details.Any())
            {
                RAP.FML_AFFICHER frmrap = new RAP.FML_AFFICHER();
                var report = frmrap.RAPAfficher.LocalReport;
     
                LoadReport(report, emploi, details, entete, db);
     
                frmrap.RAPAfficher.RefreshReport();
                frmrap.ShowDialog();
            }
            else
            {
                MessageBox.Show("Aucune donnée à imprimer.");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Une erreur s'est produite : {ex.Message}\n{ex.StackTrace}");
        }
    }
     
    private static (EmploiDuTemps, List<Detail_EmploiDuTemps>, Entete) ExtractDetails(DbGestionEcoleContext db, int idEmploi)
    {
        var emploi = db.EmploiDuTemps.Single(s => s.ID_Emploi == idEmploi);
        var details = db.Detail_EmploiDuTemps.Where(s => s.ID_Emploi == idEmploi).ToList();
        Entete entete = db.Entetes.SingleOrDefault(s => s.ID_AnneeScolaire == emploi.ID_AnneeScolaire);
        return (entete, emploi, details)
    }
     
    private static void LoadReport(
        Report report,
        EmploiDuTemps emploi, List<Detail_EmploiDuTemps> listDetails, Entete entete,
        DbGestionEcoleContext db)
    {
        var classe = db.Classes.Single(s => s.ID_Classe == emploi.ID_Classe);
        var annee = db.AnneeScolaires.Single(s => s.ID_AnneeScolaire == emploi.ID_AnneeScolaire);
     
        report.ReportEmbeddedResource = "GESTION ECOLE/RAP/Rapport_EmploiDuTemps.rdlc";
        report.DataSources.Add(new ReportDataSource("DataEmploiDuTemps", listdetail));
     
        var parameters = CreateParameters(
            classe.Classe1, annee.AnneeScolaire1,
            entete.Republique, entete.MinisterePrimaire, PR.LogoPays, PR.LogoEcole,
            DateTime.Now.ToString());//Date du système
     
        report.SetParameters(parameters);
    }
     
    private static ReportParameter[] CreateParameters(
        string classe, string anneeScolaire,
        string enteteRepublique, string enteteMinisterePrimaire, object logoPays, object logoEcole,
        string date)
    {
        ReportParameter classe = new ReportParameter("Classe", classe);
        ReportParameter anneeScolaire = new ReportParameter("AnneeScolaire", anneeScolaire);
     
        ReportParameter republique = new ReportParameter("Republique", enteteRepublique);
        ReportParameter ministere = new ReportParameter("Ministere", enteteMinisterePrimaire);
     
        string imagePays = Convert.ToBase64String(logoPays);
        string imageEcole = Convert.ToBase64String(logoEcole);
        ReportParameter PImage = new ReportParameter("ImagePays", imagePays);
        ReportParameter EImage = new ReportParameter("ImageEcole", imageEcole);
     
        ReportParameter date = new ReportParameter("Date", DateTime.Now.ToString());
     
        return new ReportParameter[] { classe, anneeScolaire, republique, ministere, PImage, EImage, date };
    }
    Edit: lorsque l'on a un traitement qui peut être long, il vaut mieux l'effectuer dans un gestionnaire asynchrone afin de ne pas bloquer le thread de l'UI (mais chaque chose en son temps).

  8. #8
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Finalement j'ai quand même écrit une version asynchrone du code en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    private void BtnAnnuler_Click(object sender, EventArgs e) => _cancellationTokenSource?.Cancel();
     
    private async void BtnImprimer_Click(object sender, EventArgs e)
    {
        try
        {
            _cancellationTokenSource = new CancellationTokenSource();
            BtnImprimer.Enabled = false;
            BtnAnnuler.Enabled = true;
     
            int idEmploi = (int)DataEmploi.CurrentRow.Cells[0].Value;
            var frmrap = await PrintReportAsync(idEmploi, _cancellationTokenSource.Token);
     
            if (frmrap is null)
                MessageBox.Show("Aucune donnée à imprimer.");
            else
                frmrap.ShowDialog();
        }
        catch (OperationCanceledException cancelled)
        {
            MessageBox.Show("Opération annulée");
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Une erreur s'est produite : {ex.Message}\n{ex.StackTrace}");
        }
        finally
        {
            _cancellationTokenSource = null;
            BtnImprimer.Enabled = true;
            BtnAnnuler.Enabled = false;
        }
    }
     
    private static async Task<RAP.FML_AFFICHER> PrintReportAsync(int idEmploi, CancellationToken cancellationToken)
    {
        db = new DbGestionEcoleContext();
     
        var (emploi, details, entete) = await ExtractDetailsAsync(idEmploi, db, cancellationToken);
     
        cancellationToken.ThrowIfCancellationRequested();
     
        if (entete is null || details.Count ==0) return null;
     
        RAP.FML_AFFICHER frmrap = new RAP.FML_AFFICHER();
        var report = frmrap.RAPAfficher.LocalReport;
        cancellationToken.ThrowIfCancellationRequested();
     
        await LoadReportAsync(
            report,
            emploi, details, entete,
            db, cancellationToken);
     
        cancellationToken.ThrowIfCancellationRequested();
     
        frmrap.RAPAfficher.RefreshReport();
     
        return frmrap;
    }
     
     
    private static async Task<(EmploiDuTemps, List<Detail_EmploiDuTemps>, Entete)> ExtractDetailsAsync(
        int idEmploi,
        DbGestionEcoleContext db, CancellationToken cancellationToken)
    {
        var emploi = db.EmploiDuTemps.SingleAsync(s => s.ID_Emploi == idEmploi, cancellationToken);
        cancellationToken.ThrowIfCancellationRequested();
     
        var details = db.Detail_EmploiDuTemps.Where(s => s.ID_Emploi == idEmploi).ToListAsync(cancellationToken);
        cancellationToken.ThrowIfCancellationRequested();
     
        Entete entete = db.Entetes.SingleOrDefaultAsync(s => s.ID_AnneeScolaire == emploi.ID_AnneeScolaire, cancellationToken);
        cancellationToken.ThrowIfCancellationRequested();
     
        return (entete, emploi, details)
    }
     
    private static async Task LoadReportAsync(
        Report report,
        EmploiDuTemps emploi, List<Detail_EmploiDuTemps> listDetails, Entete entete,
        DbGestionEcoleContext db, CancellationToken cancellationToken)
    {
        var classe = db.Classes.SingleAsync(s => s.ID_Classe == emploi.ID_Classe);
        cancellationToken.ThrowIfCancellationRequested();
     
        var annee = db.AnneeScolaires.SingleAsync(s => s.ID_AnneeScolaire == emploi.ID_AnneeScolaire);
        cancellationToken.ThrowIfCancellationRequested();
     
        report.ReportEmbeddedResource = "GESTION ECOLE/RAP/Rapport_EmploiDuTemps.rdlc";
        report.DataSources.Add(new ReportDataSource("DataEmploiDuTemps", listdetail));
     
        var parameters = CreateParameters(
            classe.Classe1, annee.AnneeScolaire1,
            entete.Republique entete.MinisterePrimaire, PR.LogoPays, PR.LogoEcole,
            DateTime.Now.ToString()); //Date du système
     
        report.SetParameters(parameters);
    }
     
    private static ReportParameter[] CreateParameters(
        string classe, string anneeScolaire,
        string enteteRepublique, string enteteMinisterePrimaire, object logoPays, object logoEcole,
        string date)
    {
        ReportParameter classe = new ReportParameter("Classe", classe);
        ReportParameter anneeScolaire = new ReportParameter("AnneeScolaire", anneeScolaire);
     
        ReportParameter republique = new ReportParameter("Republique", enteteRepublique);
        ReportParameter ministere = new ReportParameter("Ministere", enteteMinisterePrimaire);
     
        string imagePays = Convert.ToBase64String(logoPays);
        string imageEcole = Convert.ToBase64String(logoEcole);
        ReportParameter PImage = new ReportParameter("ImagePays", imagePays);
        ReportParameter EImage = new ReportParameter("ImageEcole", imageEcole);
     
        ReportParameter date = new ReportParameter("Date", date);
     
        return new ReportParameter[] { classe, anneeScolaire, republique, ministere, PImage, EImage, date };
    }
    Ce code présume l'existence d'une variable CancellationTokenSource? _cancellationTokenSource dans la Form et d'un bouton BtnAnnuler qui premettrait d'annuler l'action en cours.

Discussions similaires

  1. [PDO] Suppression de toutes les tables d'une base de données avec PDO
    Par Invité dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/07/2019, 22h05
  2. Réponses: 0
    Dernier message: 12/06/2019, 11h22
  3. Réponses: 2
    Dernier message: 10/03/2017, 10h54
  4. [VI-2010] Imprimer les propriétés d'une base
    Par webrider dans le forum Visio
    Réponses: 0
    Dernier message: 18/10/2012, 16h44
  5. Réponses: 3
    Dernier message: 15/10/2012, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo