Merci Gabrielly,
jusqu'à maintenant c'est bon.
J'ai aucun problème.
j'attends la suite :).
Cordialement
Version imprimable
Merci Gabrielly,
jusqu'à maintenant c'est bon.
J'ai aucun problème.
j'attends la suite :).
Cordialement
3aychoucha, on dirait que tu ne m'as pas bien compris. :?Citation:
Envoyé par 3aychoucha
Les Datasets ne sont pas crées dans un projet MFC mais plutôt dans un projet CLR C++/CLI ou un projet C# ou VB.NET. (Voir la première étape)
Le monde MFC n'a que faire avec les datasets.
L'intérêt ici des MFC est de pouvoir afficher les report rdlc (qui contiennent des datasets générées à partir d'un projet pur .NET comme un projet CLR ou C# ou VB.NET).
Suis les étapes que j'ai donnée si au final tu veux que ton application MFC affiche des report rdlc.
Cela ne veut pas dire que tu abondonnes ton projet winforms (en vc++) car la question que je te pose est que si ton exe est une MFC alors ces explications sont pour toi et donc je comprends que tes winforms sont au fait des winforms control library (je veux dire une dll que ton exe MFC peut appeler).
Je ne sais pas si tu me comprends :roll:
Bonjour Gabrielly,
J'ai oublié de vous dire que j'ai commenté cette ligneMon problème est que j'ai pas pu ajouter mes données à partir du boite de dialogue du projet MFC d'une part.Code:reportViewer1->SetDisplayMode(DisplayMode::PrintLayout);
De plus dans le View j'ai que le reportViewer. le report.rdlc ne s'affiche pas.
J'ai pas compris si c'est un problème dans mon code ou on n a pas arriver jusqu'a la stade d'afficher le report.rdlc
Merci Gabrielly pour l'explication :)
En fait, mon projet, je doit le faire avec les winforms et non pas avec les MFC
Donc j'avais pas le chois:?
le problème que j'ai est que je n'arrive pas à associer mon .rdlc au reportViewer et j'ai ce message affiché dans le reportviewer après l'execution
j'ai essayé de suivre les étapes précédentes mais avec les MFC je me sens un peu perdueCitation:
une erreur s'est produite lors du traitement du rapport local.
La définition du rapport .rdlc n'est pas spécifiée
merci pour votre aide
Voici le code qui permet d'alimenter notre report en données.
Il faudra l'adapté à vos données à vous et à vos classes "DataSet"
Ensuite on référence les assemblies dans le projet MFC et on prépare une petite méthode de lancement de l'affichage du report.rdlc et c'est la fin.Code:
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 void CMfcReportView::OnInitialUpdate() { CWaitCursor wait; try { MyReportDesign::MyReportDesignControl^ pUserControl = safe_cast<MyReportDesign::MyReportDesignControl^>(this->GetControl()); CMfcReportDoc* pDoc = GetDocument(); if( pDoc->GetPathName().IsEmpty() ) return; pUserControl->ReportPath = gcnew System::String(pDoc->GetPathName()); // Je construit mon DataSet manuellement car mes données ne viennent pas d'une BD. // Mon DataSet est construit sur base de ma classe CClientDataSet de mon projet CLR // Je construit un System::Data::DataSet System::Data::DataSet^ dsReportData = gcnew System::Data::DataSet(); // Je construit une table DataTable System::Data::DataTable^ newTable = gcnew System::Data::DataTable("table"); newTable->Columns->Add("ID", int::typeid); newTable->Columns->Add("ClientName", System::String::typeid); newTable->Columns->Add("Responsible", System::String::typeid); newTable->Columns->Add("Address", System::String::typeid); newTable->Columns->Add("Street", System::String::typeid); newTable->Columns->Add("StreetNumber", System::String::typeid); newTable->Columns->Add("Phone", System::String::typeid); newTable->Columns->Add("Email", System::String::typeid); newTable->Columns->Add("WebPage", System::String::typeid); newTable->Columns->Add("PostalBox", System::String::typeid); newTable->Columns->Add("PostalCode", System::String::typeid); newTable->Columns->Add("Town", System::String::typeid); newTable->Columns->Add("Country", System::String::typeid); newTable->Columns->Add("Description", System::String::typeid); // Je m'apprête à fournir les données à ma DataTable* // en ajoutant une nouvelle ligne dans la table System::Data::DataRow^ newRow = newTable->NewRow(); // Je fournis mes données ici newRow["ID"] = 1; newRow["ClientName"] = "Aksanti Systems"; newRow["Responsible"] = "Gabriel Litsani"; newRow["Address"] = "157, Avenue Kindinga, Selembao"; newRow["Street"] = "Avenue Kindinga"; newRow["StreetNumber"] = "157"; newRow["Phone"] = "(+243) 99 94 15 395"; newRow["Email"] = "gabriellitsani@hotmail.com"; newRow["WebPage"] = "www.developpez.com"; newRow["PostalBox"] = "243"; newRow["PostalCode"] = "243"; newRow["Town"] = "Kinshasa"; newRow["Country"] = "République Démocratique du Congo"; newRow["Description"] = "Application Developper"; // J'ajoute ma nouvelle ligne à ma table newTable->Rows->Add(newRow); // et j'ajoute la table à mon datset dsReportData->Tables->Add(newTable); // ClientDS est le nom du dataset du report qui mappe avec ma classe CClientDataSet // donc je fournis le System::Data::DataSet à mon User Control pUserControl->AddReportDataSource("ClientDS", dsReportData); CWinFormsView::OnInitialUpdate(); // } catch(Microsoft::Reporting::WinForms::LocalProcessingException^ ex) { CString strMessage(ex->Message); ::AfxMessageBox(strMessage, MB_OK); } }
Bonjour Gabrielly,
SVP j'ai trouvé un autre problème et j'ai pas compris la source de ce pb.
Lorsque j'exécute mon projet MFC l'erreur suivante m'apparait:
Qu'est ce qu'il me faut faire pour dépasser ce pb.Citation:
Une erreur s'est produite lors du traitement du rapport local.
La définition du rapport "Report1.rdlc" n'est pas spécifié
Merci
C'est bon j'ai trouvé la solution:
Il suffit de modifier la ligne suivante
par cette ligneCitation:
this->reportViewer1->LocalReport->ReportEmbeddedResource = L"Report1.rdlc";
Citation:
this->reportViewer1->LocalReport->ReportPath = L".\\Report3.rdlc";
Est-ce que tu as suivis la dernière étape du OnInitialUpdate()?
Pour lancer l'affichage du report,
j'ai crée un petit menu Report tel que lorsque je clique dessus il m'ouvre une boite de dialogue d'ouverture de fichier et où je sélectionne mon fichier report1.rdlc.
Le gestionnaire de commande de menu est pris en charge par la main frame
(je suppose que l'application est une MFC MDI)
Je récupère le doc template de mon application et je lui passe le Report Path
Pour les assemblies à référencer au projet MFC nous avonsCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 void CMainFrame::OnReportRdlc() { POSITION pos = theApp.GetFirstDocTemplatePosition(); ATLASSERT(pos); CDocTemplate* pDocT = theApp.GetNextDocTemplate(pos); TCHAR szFilters[]= _T("My Report Files (*.rdlc)|*.rdlc|All Files (*.*)|*.*||"); CFileDialog fileDlg(TRUE, _T("rdlc"), _T("*.rdlc"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters); if(fileDlg.DoModal() == IDOK) { CString pathName = fileDlg.GetPathName(); CString fileName = fileDlg.GetFileTitle(); CString strReportPath = pathName; pDocT->OpenDocumentFile(strReportPath); } }
1. Microsoft.ReportViewer.WinForms
2. System
3. System.Data
4. System.Windows.Forms
J'ai pas tout a fait terminer l'ajout des datasets .
EN faite lorsque j'ai pris tout le code de la discussion 25 (oninitialUpdate)
Le rapport ne sera pas affiché. Seulement le reportviewer est affiché.
Lorsque j'ai commenté les deux lignes suivantes
alors le message suivant s'affiche:Code:
1
2 if( pDoc->GetPathName().IsEmpty() ) return;
Lorsque j'ai commenté la ligne suivante:Citation:
le traitement du rapport a été annulé
alors l'erreur suivante s'afficheCode:pUserControl->ReportPath = gcnew System::String(pDoc->GetPathName());
.Citation:
Une erreur s'est produite lors du traitement du rapport local.
Une source d'instance des données manque pour la source de données MyReportDesignSetDataSet
Lorsque j'ai fait Actualiser dans le rapport l'erreur suivante apparait
.Citation:
Une source d'instance de données manque pour la source de données
Est ce qu'il y a quelqu'un qui peut m'aider pour résoudre ce pb
Et Voici le résultat
http://img4.hostingpics.net/pics/787019MFCReport.jpg
Bonjour,
Avec mon projet winforms (en vc++)j'ai pu récupérer mon report et l'afficher dans le reportviewer mais je trouve du mal à ajouter la source de données
je trouve pas le bon code pour le faire :cry:
Merci d'avoir m'aider
Est ce que cette erreur est due à mon doc car lorsque j'ai fait le débogage,
Il sort de cette return.(Il ne termine pas le reste du code)
Citation:
if( pDoc->GetPathName().IsEmpty() )
return;
Bonjour à toutes les deux.
Si vous suivez exactement ce que je vous dis vous aurez le même résultat avec vos données et vos datasets. A moins que vous ayez des problèmes de langage de programmation ou de technologie MFC ou CLR.
moooona ne met rien en commentaire suis les étapes car la solution est complète.
Montre moi plutôt ta classe à toi CClientDataSet et la liste de tes données
Au fait tu dois faire un truc comme celui là
Code:
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 // Je construit un System::Data::DataSet System::Data::DataSet^ dsReportData = gcnew System::Data::DataSet(); // Je construit une table DataTable System::Data::DataTable^ newTable = gcnew System::Data::DataTable("table"); newTable->Columns->Add("ID", int::typeid); newTable->Columns->Add("ClientName", System::String::typeid); newTable->Columns->Add("Responsible", System::String::typeid); newTable->Columns->Add("Address", System::String::typeid); newTable->Columns->Add("Street", System::String::typeid); newTable->Columns->Add("StreetNumber", System::String::typeid); newTable->Columns->Add("Phone", System::String::typeid); newTable->Columns->Add("Email", System::String::typeid); newTable->Columns->Add("WebPage", System::String::typeid); newTable->Columns->Add("PostalBox", System::String::typeid); newTable->Columns->Add("PostalCode", System::String::typeid); newTable->Columns->Add("Town", System::String::typeid); newTable->Columns->Add("Country", System::String::typeid); newTable->Columns->Add("Description", System::String::typeid); // Je m'apprête à fournir les données à ma DataTable* // en ajoutant une nouvelle ligne dans la table System::Data::DataRow^ newRow = newTable->NewRow(); // Je fournis mes données ici newRow["ID"] = 1; newRow["ClientName"] = "Aksanti Systems"; newRow["Responsible"] = "Gabriel Litsani"; newRow["Address"] = "157, Avenue Kindinga, Selembao"; newRow["Street"] = "Avenue Kindinga"; newRow["StreetNumber"] = "157"; newRow["Phone"] = "(+243) 99 94 15 395"; newRow["Email"] = "gabriellitsani@hotmail.com"; newRow["WebPage"] = "www.developpez.com"; newRow["PostalBox"] = "243"; newRow["PostalCode"] = "243"; newRow["Town"] = "Kinshasa"; newRow["Country"] = "République Démocratique du Congo"; newRow["Description"] = "Application Developper"; // J'ajoute ma nouvelle ligne à ma table newTable->Rows->Add(newRow); // et j'ajoute la table à mon datset dsReportData->Tables->Add(newTable);
Si cette source de données manquent et que tu ne l'utilises pas alors tu le supprime du panneau de ton Report Data. (Je crois que tu avais dans ce cas deux datasources dont l'un n'est pas utilisé).Citation:
Envoyé par moooona
Et puis exploite la dernière fonction void CMainFrame::OnReportRdlc() pour lancer ton report. Connecte cette fonction à un évènement de ton choix.
Si ton exe est une application MFC alors montre moi ton usercontrol de ton reportviewer.Citation:
Envoyé par 3aychoucha
Bonjour,
c'est ce que je suis entrain de dire depuis longtemps, mon application n'a rien avoir avec les MFC
Poue cette raison je trouve que le code n'est pas convenable
par exemple j'ai pas CDocument, pas de user control,etc
j'affiche directement le rapport dans le reportviewer affiché dans un form
Mon projet est un projet CLR pure
Merci d'avance
Une image vaut parfois milles mots.
http://img4.hostingpics.net/pics/190...portDesign.jpg
Est ce que je dois refaire les mêmes étapes avec les winforms?? créer un dll et l'utiliser???
C'est un projet MFC celui là ou Winforms???
Merci d'avance
Bon 3aychoucha,
Il faut qu'on discute sur un autre forum, je crois de C++/CLI car ton problème n'a rien avoir avec les MFC.
Ouvre une discution et montre moi ton code de ton winforms (dans le forum C++/CLI)
3aychoucha, c'est un projet CLR en tant Windows Forms Control Library c'est à dire une dll mais qui est consommée par une application MFC (exe)
J'ai essayé de faire la meme chose mais avec un seul champs:
voila mon fichier datasource.h
Pour ma fonction OnInitialUpdateCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #pragma once // Fichier DataSources.h // J'insère toutes mes classes <<DataSet>> ici using namespace System; namespace MyReportDesign { public ref class CClientDataSet { public: property System::String^ ClientName; }; }
j'ai mis ces deux lignes de la méthode oninitialUpdate en commentaire car si je les laisse alors il sort à partir de cet return.Code:
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 void CMfcReportView::OnInitialUpdate() { CWaitCursor wait; try { ReportViewer::ReportViewerControl^ pUserControl = safe_cast<ReportViewer::ReportViewerControl^>(this->GetControl()); CMfcReportDoc* pDoc = GetDocument(); CString str=pDoc->GetPathName(); if( pDoc->GetPathName().IsEmpty() ) return; pUserControl->ReportPath =L".\\Report3.rdlc" ;//gcnew System::String(pDoc->GetPathName()); // // Je construit mon DataSet manuellement car mes données ne viennent pas d'une BD. // Mon DataSet est construit sur base de ma classe CClientDataSet de mon projet CLR // Je construit un System::Data::DataSet System::Data::DataSet^ dsReportData = gcnew System::Data::DataSet(); // Je construit une table DataTable System::Data::DataTable^ newTable = gcnew System::Data::DataTable("table"); newTable->Columns->Add("ClientName", System::String::typeid); // Je m'apprête à fournir les données à ma DataTable* // en ajoutant une nouvelle ligne dans la table System::Data::DataRow^ newRow = newTable->NewRow(); // Je fournis mes données ici newRow["ClientName"] = "Aksanti Systems"; // J'ajoute ma nouvelle ligne à ma table newTable->Rows->Add(newRow); // et j'ajoute la table à mon datset dsReportData->Tables->Add(newTable); // ClientDS est le nom du dataset du report qui mappe avec ma classe CClientDataSet // donc je fournis le System::Data::DataSet à mon User Control pUserControl->AddReportDataSource("CClientDataSet", dsReportData); pUserControl->Refresh(); CWinFormsView::OnInitialUpdate(); // } catch(Microsoft::Reporting::WinForms::LocalProcessingException^ ex) { CString strMessage(ex->Message); ::AfxMessageBox(strMessage, MB_OK); } }
Pour cette raison je l'ai mis en commentaire
Bon, s'il sort au niveau du return tu n'as pas utiliser la fonction OnReportRdlc().
Faisons autrement enlève la condition et ,
met le chemin complet (non relatif de ton report path)
Regarde un peu ton codeCode:
1
2pUserControl->ReportPath =L"C:\\Le chemin complet du repertoire\\Report3.rdlc" ;
ton "CClientDataSet" doit être le nom du DataSet qui s'affiche dans le Report Data regarde la dernière image. Ce n'est pas forcément le nom de la classe CClientDataSet.Code:
1
2
3 pUserControl->AddReportDataSource("CClientDataSet", dsReportData); pUserControl->Refresh();
Et puis tu n'as pas besoin d'appeler pUserControl->Refresh(); car le OnUpdate() de la vue le fais déjà.
Merci Gabrielly,
je l'ai déja fait la discution sous le forum visual studio mais aucune réponse
Merci comme même:)