Bonjour à tous,
Je viens vers vous car je suis bloqué...
Le but (je vais parler d'outils, ce sont mes enregistrements):
- Sélection des outils dans la vue de liste de mon objet
- Clique sur un bouton qui me redirige vers une page visualforce où je vais sélectionner deux dates
- Clique sur un autre bouton, une fois que j'aurai sélectionné mes deux dates, qui va me rediriger vers une page visualforce (mon PDF) avec les informations choisies sur chaque outil (nom, référence, description etc.). Le but étant que ça boucle, pour chaque outil, tu m'affiches un tableau avec ces informations.
Le problème : je n'arrive pas à passer les Id de mes outils dans la deuxième page (le PDF).
Dans la première page, j'arrive à récupérer les Id des outils grâce à controller.getSelected(); mais ça ne fonctionne pas pour la deuxième page.
J'ai essayé de partir sur
Ou encore
Code : Sélectionner tout - Visualiser dans une fenêtre à part system.CurrentPageReference().getParameters().get('OutilId');
Je tiens à préciser que j'ai deux pages Visualforce et un seul controller pour les deux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part newPage.setRedirect(false);
J'espère que vous pourrez m'aider
Si besoin de plus d'informations, n'hésitez pas.
Bonne journée,
Dedex
Code de ma page visualforce 1 :
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 <apex:page standardController="Outillage_DOS__c" RecordSetVar="outils" extensions="CCE_PDF_Taux_Utilisation_Multiple" showHeader="false" sidebar="false" docType="html-5.0"> <!-- J'ai enlevé recordSetVar="Gestion_Outillage_DOS__c" dans la ligne <apex:page ......... > --> <link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" /> <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <!-- Script pour afficher et paramétrer le calendrier qui va permettre de choisir la période souhaitée --> <script> $(function() { $('.date-picker').datepicker( { //Format de la date dateFormat: "dd/mm/yy", //Nom des jours de la semaine, du Dimanche au Samedi (je n'ai pas réussi à faire du Lundi au Dimanche dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'], //Nom des jours au minimum dayNamesMin: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'], //Permet de choisir le mois dans le calendrier changeMonth: true, //Permet de choisir une année dans le calendrier changeYear: true, //Affiche les boutons du calendrier showButtonPanel: true, //maxDate: '-1m', onClose: function(dateText, inst) { function isDonePressed(){ return ($('#ui-datepicker-div').html().indexOf('ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all ui-state-hover') > -1); } if (isDonePressed()){ var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val(); var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val(); $(this).datepicker('setDate', new Date(year, month, 1)).trigger('change'); $('.date-picker').focusout()//Added to remove focus from datepicker input box on selecting date } }, beforeShow : function(input, inst) { inst.dpDiv.addClass('month_year_datepicker') if ((datestr = $(this).val()).length < 0) { year = datestr.substring(datestr.length-4, datestr.length); month = datestr.substring(0, 2); $(this).datepicker('option', 'defaultDate', new Date(year, month, 1)); $(this).datepicker('setDate', new Date(year, month, 1)); $(".ui-datepicker-calendar").hide(); } } }) var options = $.extend( {}, // empty object $.datepicker.regional["fr"], // Région France { dateFormat: "MM, yyyy" /*, ... */ }// Format de la date ); //Le calendrier doit prendre en compte nos options ci-dessus $.datepicker.setDefaults(options); }); </script> <!-- Variables pour les éléments qui ne passaient pas en Step 2 : erreur "SObject row was retrieved via SOQL without querying the requested field" --> <apex:variable var="Reference" value="{!Outillage_DOS__c.Reference__c}"/> <apex:variable var="NumSerie" value="{!Outillage_DOS__c.Numero_de_serie__c}"/> <apex:variable var="Description" value="{!Outillage_DOS__c.Description__c}"/> <apex:variable var="TypeOutillage" value="{!Outillage_DOS__c.Type_outillage__c}"/> <apex:variable var="Designation" value="{!Outillage_DOS__c.Name}"/> <apex:dataList var="liste" value="{!SelectedOutillage}"/> <!--<apex:variable var="Id" value="{!Outillage_DOS__c.Id}"/>--> <!-- Titre et sous-titre du Step 1 --> <apex:sectionHeader title="Taux d'occupation de l'outil" subtitle="{!Designation}" /> <!-- Message si jamais une date n'est pas choisie --> <apex:pageMessages id="msgs"/> <apex:form > <apex:pageBlock title="Indiquez la date de début d'analyse et la date de fin d'analyse :"> <apex:panelGrid columns="3"> <!-- Affichage du label pour le champs de la première date à choisir --> <apex:outputLabel value="Date de début" for="DateATraiter"/> <!-- Sélection de la date, par saisie ou par utilisation d'un mini calendrier. --> <!-- Utilise un composant copié sur le site suivant --> <!-- http://blog.enxoo.com/en/2013/03/native-datepicker-calendar-pop-up-for-inputtext-on-your-visualforce-page/ --> <apex:inputtext id="DateSelec1" value="{!DateSelec1}" styleClass="date-picker" /> </apex:panelGrid> <apex:panelGrid columns="3"> <!-- Affichage du label pour le champs de la deuxième date à choisir --> <apex:outputLabel value="Date de fin" for="DateATraiter"/> <!-- Sélection de la date, par saisie ou par utilisation d'un mini calendrier. --> <!-- Utilise un composant copié sur le site suivant --> <!-- http://blog.enxoo.com/en/2013/03/native-datepicker-calendar-pop-up-for-inputtext-on-your-visualforce-page/ --> <apex:inputtext id="DateSelec2" value="{!DateSelec2}" styleClass="date-picker" /> </apex:panelGrid> <br/> <!-- Bouton pour accéder à l'étape suivante : affichage des informations sur les outils sélectionnés --> <apex:commandButton action="{!step}" value="Taux d'occupation" styleClass="btn"> </apex:commandButton> <br/><br/> </apex:pageBlock> </apex:form> <!-- Sert de test afin d'afficher si mon controller récupère bien les Id des outils que j'ai sélectionnés. Pour l'instant, il me retourne soit : [] Attempt to de-reference a null object Là, je récupère bien l'Id de mon/mes Outil(s) sélectionné(s). Il faut les passer dans la Step 2 <apex:outputText value="{!SelectedOutillage}"></apex:outputText>--> </apex:page>
Code ma deuxième page Visualforce :
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 <apex:page standardController="Outillage_DOS__c" extensions="CCE_PDF_Taux_Utilisation_Multiple" showHeader="false" sidebar="false" renderAs="PDF"> <head> <!-- FEUILLE DE STYLE CSS --> <apex:stylesheet value="{!URLFOR($Resource.RS_CSS_PDF, 'CSS_PDF.css')}"/> <style type="text/css"> @page { <!--size: A4 landscape;--> @bottom-left { font-family: Arial,sans-serif; color:#404040; font-size: 0.75em; content: "<apex:outputText value="{!$Organization.Name} - {!$User.FirstName} {!$User.LastName} - {!NOW()}" />" } } </style> </head> <body> <!-- Pour chaque outil ???? --> <apex:repeat value="{!SelectedOutillage}" var="outils"> <!-- Titre au-dessus du tableau avec les informations souhaitées --> <h3 class="Grey"> <apex:outputText value="Taux d'occupation de l'outil {!Outillage_DOS__c.Name} du {!DateSelec1} au {!DateSelec2}" escape="false"/> </h3> <!-- Début du tableau avec les informations souhaitées : Référence, numéro de série, description, type d'outillage, Nombre de jours ouvrés dans la période choisie, nombre de jours d'utilisation ouvrés dans la période choisie, nombre d'utilisateurs différents, nombre d'emprunts différents et pour finir, le taux d'utilisation des outils en question--> <table border="3" cellpadding="7" cellspacing="2" width="100%"> <tr><th class="r30">Référence</th><td class="l70"><apex:outputText value="{!Outillage_DOS__c.Reference__c}"></apex:outputText></td></tr> <tr><th class="r30">Numéro de série</th><td class="l70"><apex:outputText value="{!Outillage_DOS__c.Numero_de_serie__c}"></apex:outputText></td></tr> <tr><th class="r30">Description</th><td class="l70"><apex:outputText value="{!Outillage_DOS__c.Description__c}"></apex:outputText></td></tr> <tr><th class="r30">Type d'outillage</th><td class="l70"><apex:outputText value="{!Outillage_DOS__c.Type_outillage__c}"></apex:outputText></td></tr> <tr><th class="r30">Nombre jours ouvrés</th><td class="l70"><apex:outputText value="{!CalculateWorkingDays}"></apex:outputText> <apex:outputText value="{0, number,###,###,##0}" ><apex:param value="{!NbJourTravailleOuvres}" /></apex:outputText></td></tr> <tr><th class="r30">Nombre jours utilisation ouvrés</th><td class="l70"><apex:outputText value="{!CalculateUseDays}"></apex:outputText> <apex:outputText value="{0, number,###,###,##0}" > <apex:param value="{!NbJourUtiliseOuvres}"/ > </apex:outputText></td></tr> <tr><th class="r30">Nombre d'utilisateurs différents</th><td class="l70"><apex:outputText value="{!NbUtilisateurs}"></apex:outputText></td></tr> <tr><th class="r30">Nombre d'emprunts différents</th><td class="l70"><apex:outputText value="{!NbEmprunts}"></apex:outputText></td></tr> <tr><th class="r30">Taux d'utilisation</th><td class="l70"><apex:outputText value="{0, number, 00.00}" > <apex:param value="{!TauxUtilisation}" /> </apex:outputText>%</td></tr> </table> </apex:repeat> </body> </apex:page>
Code de mon controller :
Code JAVA : 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230 public class CCE_PDF_Taux_Utilisation_Multiple { //Variables public Date DateSelec1 {get; set;} public Date DateSelec2 {get; set;} public Decimal NbJourTravailleOuvres {get;set;} public Integer NbWeekEnd {get;set;} public Integer NbVacances {get;set;} public Decimal NbJourUtiliseOuvres {get;set;} public Integer NbUtilisateurs {get;set;} public Integer NbEmprunts {get;set;} public Decimal TauxUtilisation {get;set;} public Set<Date> DateUse = new Set<Date>(); public Set<String> Utilisateurs = new Set<String>(); public Set<String> Emprunts = new Set<String>(); public List<String> ListeId = new List<String>(); public List<String> ListeI = new List<String>(); //Redirection vers la page du PDF public PageReference step() { //Si aucune date n'est choisie dans le calendrier, il y a un message d'erreur if(DateSelec1 == null) { ApexPages.Message Alerte = new ApexPages.Message(ApexPages.Severity.FATAL, 'Veuillez choisir un mois et une année'); ApexPages.addMessage(Alerte); return null; } //Si aucune date n'est choisie dans le calendrier, il y a un message d'erreur if(DateSelec2 == null) { ApexPages.Message Alerte = new ApexPages.Message(ApexPages.Severity.FATAL, 'Veuillez choisir un mois et une année'); ApexPages.addMessage(Alerte); return null; } //Récupère bien la liste des Id des outils sélectionnés //Mais les dates sont égales à NULL maintenant... //Comment rappeler cette liste des ID autre part ? (VFpage ou dans le controller) for(Outillage_DOS__c out : (Outillage_DOS__c[])StandardController.getSelected()) { system.debug('Outil ID ======================> ' + out.Id); ListeId.add(Out.Id); } PageReference newPage = Page.PV_PDF_Taux_Utilisation_Multiple2; newPage.setRedirect(false); return newPage; } // DEFINITION DU CONTROLEUR CCE_PDF_Taux_Utilisation private final Outillage_DOS__c Outillage; public CCE_PDF_Taux_Utilisation_Multiple(ApexPages.StandardController controller) { this.Outillage = (Outillage_DOS__c)controller.getRecord(); } //SetController pour pouvoir faire le :controller.getSelected() afin d'obtenir les Id du ou des Outil(s) private ApexPages.StandardSetController StandardController; public CCE_PDF_Taux_Utilisation_Multiple(ApexPages.StandardSetController StandardController) { this.StandardController = StandardController; } //Je ne l'utilise pas pour l'instant public Outillage_DOS__c[] getAllOutil() { Outillage_DOS__c[] AllOutil = [SELECT Id, Name, Reference__c, Description__c, Numero_de_serie__c, Type_outillage__c FROM Outillage_DOS__c ]; return AllOutil; } //Requête sur l'outillage public Outillage_DOS__c[] getSelectedOutillage() { //Le problème vient du :StandardController.getSelected() //Il ne retourne rien du tout //Il doit y avoir un problème avec les deux constructeurs de la classe... //J'arrive à retourner pour tous les objets mais pas pour ceux que je sélectionne. //Soit j'ai TOUT soit j'ai RIEN //IdSelectedOutil = system.CurrentPageReference().getParameters().get('OutilId'); //system.debug('StandardController avant SELECT =================================> ' + StandardController); Outillage_DOS__c[] SelectedOutillage = [SELECT Id, Name, Reference__c, Description__c, Numero_de_serie__c, Type_outillage__c FROM Outillage_DOS__c WHERE Id = :StandardController.getSelected() ]; system.debug('SelectedOutillage =============== ' + SelectedOutillage); return SelectedOutillage; } //Requête sur les emprunt de l'outillage //Pour l'instant, je ne l'utilise pas ! public Gestion_Outillage_DOS__c[] getGestionOutillage() { Gestion_Outillage_DOS__c[] GestionOutillage = [SELECT Id, Name, Date_emprunt__c, Date_restitution__c FROM Gestion_Outillage_DOS__c WHERE (Outillage_DOS__c = :StandardController.getSelected()) ]; return GestionOutillage; } //Calcul des Jours travaillés, Jours non travaillés, Jours de Vacances public void getCalculateWorkingDays() { Set<Date> holidaysSet = new Set<Date>(); Date dtStartDate= DateSelec1; Date dtDueDate = DateSelec2; NbJourTravailleOuvres= 0; NbVacances = 0; NbWeekEnd = 0; Integer JourTravaille = 0; Integer Vacances = 0; Integer WeekEnd = 0; for(Holiday currHoliday : [Select ActivityDate from holiday]) { holidaysSet.add(currHoliday.ActivityDate); } for(integer i=0; i <= dtStartDate.daysBetween(dtDueDate); i++) { Date dt = dtStartDate+ i; DateTime currDate = DateTime.newInstance(dt.year(), dt.month(), dt.day()); String todayDay = currDate.format('EEEE'); if(todayDay != 'Saturday' && todayDay !='Sunday' && (!holidaysSet.contains(dt))) { JourTravaille = JourTravaille + 1; } else if (holidaysSet.contains(dt)) { Vacances = Vacances +1; } else { WeekEnd = WeekEnd +1; } NbJourTravailleOuvres = JourTravaille; NbWeekEnd = WeekEnd; NbVacances = Vacances; } } //Calcul des jours d'utilisation de l'outil public void getCalculateUseDays() { Set<Date> holidaysSet = new Set<Date>(); for(Holiday currHoliday : [Select ActivityDate from holiday]) { holidaysSet.add(currHoliday.ActivityDate); } NbJourUtiliseOuvres = 0; NbUtilisateurs = 0; NbEmprunts = 0; TauxUtilisation = 0; Integer UseJour = 0; //Requête avec les champs sélectionnés //Clause AND Pour avoir toutes les dates comprises //entre la date de sélection 1 et date de sélection 2 for(Gestion_Outillage_DOS__c Outil : [SELECT Id, Name, Date_emprunt__c, Ressource_INEO__c, Date_restitution__c FROM Gestion_Outillage_DOS__c WHERE (Outillage_DOS__c = :StandardController.getSelected()) AND ((Date_emprunt__c <= :DateSelec1 AND Date_restitution__c >= :DateSelec2) OR ((Date_emprunt__c >= :DateSelec1 AND Date_emprunt__c <= :DateSelec2) OR (Date_restitution__c >= :DateSelec1 AND Date_restitution__c <= :DateSelec2) ) OR (Date_restitution__c = null AND Date_emprunt__c <= :DateSelec2) ) ]) { Date dtstartDate; Date dtDueDate; if(Outil.Date_restitution__c == null) { Outil.Date_restitution__c = Date.today(); } //Conversion Date_emprunt__c et Date_restitution__c en Date //Elles sont en Datetime par défaut Datetime startDate1 = Outil.Date_emprunt__c; Datetime endDate1 = Outil.Date_restitution__c; dtstartDate = Date.newInstance(startDate1.Year(), startDate1.Month(), startDate1.Day()); dtDueDate = Date.newInstance(endDate1.Year(), endDate1.Month(), endDate1.Day()); for(integer i=0; i <= dtStartDate.daysBetween(dtDueDate); i++) { Date dt = dtStartDate+ i; DateTime currDate = DateTime.newInstance(dt.year(), dt.month(), dt.day()); String todayDay = currDate.format('EEEE'); system.debug('AVANT IF ===============>' + (dtStartDate >= DateSelec1 && dtStartDate <= DateSelec2)); if(todayDay != 'Saturday' && todayDay !='Sunday' && (!holidaysSet.contains(dt)) && (dt >= DateSelec1 && dt <= DateSelec2)) { DateUse.add(dt); system.debug('DANS IF ===============>'); Utilisateurs.add(Outil.Ressource_INEO__c); Emprunts.add(Outil.Id); } } } NbJourUtiliseOuvres = DateUse.size(); NbUtilisateurs = Utilisateurs.size(); NbEmprunts = Emprunts.size(); TauxUtilisation = (NbJourUtiliseOuvres * 100) / NbJourTravailleOuvres; } }
Partager