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

JSF Java Discussion :

Ajout programmatiquement d'un dataTable, Chart, panel à un dashboard, primeFaces 4.0 ?


Sujet :

JSF Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut Ajout programmatiquement d'un dataTable, Chart, panel à un dashboard, primeFaces 4.0 ?
    Bonjour,
    ça fait un certain temps que j'essaye de créer programmatiquement sans succès, un dashboard, y ajouter des panels contenant du texte simple, un composant Chart, et enfin un un composant dataTable.
    Avec le Backing Bean suivant, j'arrive bien à créer le dashboard ainsi que les panels simples, mais le dataTable ne s'affiche pas.
    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
    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
     
    import java.io.Serializable;
    import java.util.List;
     
    import javax.annotation.PostConstruct;
    import javax.el.ELContext;
    import javax.el.ExpressionFactory;
    import javax.el.ValueExpression;
    import javax.faces.application.Application;
    import javax.faces.application.FacesMessage;
    import javax.faces.component.UIOutput;
    import javax.faces.component.html.HtmlOutputText;
    import javax.faces.context.FacesContext;
    import javax.faces.model.ArrayDataModel;
    import javax.faces.view.ViewScoped;
    import javax.inject.Inject;
    import javax.inject.Named;
     
    import org.apache.log4j.Logger;
    import org.primefaces.component.column.Column;
    import org.primefaces.component.dashboard.Dashboard;
    import org.primefaces.component.datatable.DataTable;
    import org.primefaces.component.panel.Panel;
    import org.primefaces.event.DashboardReorderEvent;
    import org.primefaces.model.DashboardColumn;
    import org.primefaces.model.DefaultDashboardModel;
     
    import fr.edf.sei.aggregator.dashboard.ejb.DashboardEJB;
    import fr.edf.sei.aggregator.dashboard.entities.Abonnement;
    import fr.edf.sei.aggregator.dashboard.entities.User;
    import fr.edf.sei.aggregator.dashboard.entities.UserPreferences;
     
    @Named
    @ViewScoped
    public class DashboardBacker implements Serializable {
    	@Inject
        private DashboardModelView dashboardModelView;
    	@Inject
    	private DashboardEJB dashboardEJB;
    	private Dashboard dashboard;
     
    	public DashboardBacker() {
    	}
     
    	@PostConstruct
    	public void init() {
    		logger.info("Creating model");
    		//String userId = "myId";
    		FacesContext fc = FacesContext.getCurrentInstance();
            Application application = fc.getApplication();
            String componentType = "org.primefaces.component.Dashboard";
            String rendredDashboardType = "org.primefaces.component.DashboardRenderer";
            dashboard = (Dashboard) application.createComponent(fc, componentType, rendredDashboardType);
            dashboard.setId("dynamic_dashboard");
            dashboard.setModel(dashboardModelView.getModel());
            System.out.println("passage ds init(), du dashBacker : "+dashboardModelView.getModel().getColumnCount());
            addChildren();
    	}
    	public void addChildren() {
    		System.out.println("passage dans addChildren(), avant clear() : "+dashboardModelView.getModel().getColumnCount());
    		dashboard.getChildren().clear();
    		System.out.println("passage dans addChildren(), après clear(): "+dashboardModelView.getModel().getColumnCount());
    			FacesContext fc = FacesContext.getCurrentInstance();
    			Application application = fc.getApplication();
    			String panelType = "org.primefaces.component.Panel";
    			String rendredPanelType = "org.primefaces.component.PanelRenderer";
     
    			List<DashboardColumn> columns = (List<DashboardColumn>) dashboardModelView.getModel().getColumns();
    			int index = 0;
    			for (Abonnement abonnement : dashboardModelView.getAbonnements()) {
    				Panel panel = (Panel) application.createComponent(fc,
    						panelType, rendredPanelType);
    				//Pour le test de dataTable : a enlever 
    				if(index == 6){
    					abonnement.setTypeAffichage(2);
    				}
    				if(abonnement.getTypeAffichage()==null){
    					panel.setId(abonnement.getPanelId());
    					panel.setHeader(abonnement.getIndicator().getLibelle());
    					panel.setClosable(true);
    					panel.setToggleable(true);
    					dashboard.getChildren().add(panel);				
    					DashboardColumn columnI = columns.get(index % columns.size());
    					columnI.addWidget(abonnement.getPanelId());
    					HtmlOutputText text = new HtmlOutputText();
    					text.setId("item"
    							+ Long.toString(abonnement.getIndicator()
    									.getIndicatorId()));
    					text.setValue(abonnement.getIndicator().getValeur() + "");
    					panel.getChildren().add(text);
    				}else if(abonnement.getTypeAffichage()==1){
    					/* type d'affichage Chart */
    					//TODO : createChart();
    				}else if(abonnement.getTypeAffichage() == 2){
    					/* dataTable*/
    					System.out.println("create dataTable"+abonnement.getTypeAffichage());
    					createDataTable(panel);
    				}			
    				index++;
    			}
    			System.out.println("passage après bcle d'ajout de panels: "+dashboardModelView.getModel().getColumnCount());
    			User user = dashboardModelView.getUser() ;
    			UserPreferences prefUser = user.getUserPreferences();
    			prefUser.setSerializableModel((DefaultDashboardModel) dashboardModelView.getModel());
    			prefUser.setClassName(dashboardModelView.getModel().getClass().getName());
     
    			user.setUserPreferences(prefUser);
    			dashboardEJB.updateUser(user);
    		}
     
    	private void createDataTable(Panel panel) {
    		FacesContext fc = FacesContext.getCurrentInstance();
            Application application = fc.getApplication();
    		ExpressionFactory ef = application.getExpressionFactory();
            ELContext elc = fc.getELContext();
     
            //Model
            String[][] rows = new String[][]{ { "1", "Foo" }, { "2", "Bar" },  {"3", "Baz" } };
            ArrayDataModel<String[]> model = new ArrayDataModel<String[]>( rows );
     
            //Table
            DataTable table = (DataTable) application.createComponent(DataTable.COMPONENT_TYPE);
            table.setValue(model);
            table.setVar("item");
            UIOutput tableTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            tableTitle.setValue("Table Title");
            table.getFacets().put("header", tableTitle);
     
            //Index
            Column indexColumn = (Column) application.createComponent(Column.COMPONENT_TYPE);
            UIOutput indexColumnTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            indexColumnTitle.setValue("Index");
            indexColumn.getFacets().put("header", indexColumnTitle);
    //      table.getColumns().add(column);
            table.getChildren().add( indexColumn );
     
            ValueExpression indexValueExp = ef.createValueExpression(elc, "#{item[0]}", Object.class);
            HtmlOutputText indexOutput = (HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
            indexOutput.setValueExpression("value", indexValueExp);
            indexColumn.getChildren().add( indexOutput );  
     
            //Name Column
            Column nameColumn = (Column) application.createComponent(Column.COMPONENT_TYPE);
            UIOutput nameColumnTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            nameColumnTitle.setValue("Name");
            nameColumn.getFacets().put("header", nameColumnTitle);
            table.getChildren().add( nameColumn );
     
            ValueExpression nameValueExp = ef.createValueExpression(elc, "#{item[1]}", Object.class);
            HtmlOutputText nameOutput = (HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
            nameOutput.setValueExpression("value", nameValueExp);
            nameColumn.getChildren().add( nameOutput );    
     
            panel.getChildren().add(table);
     
    	}
    	private void addMessage(FacesMessage message) {
    		FacesContext.getCurrentInstance().addMessage(null, message);
    	}
     
    	public DashboardEJB getDashboardEJB() {
    		return dashboardEJB;
    	}
     
    	public void setDashboardEJB(DashboardEJB dashboardEJB) {
    		this.dashboardEJB = dashboardEJB;
    	}
     
     
    	public Dashboard getDashboard() {
    		//addChildren();
    		return dashboard;
    	}
     
    	public void setDashboard(Dashboard dashboard) {
    		this.dashboard = dashboard;
    	}
     
    	public DashboardModelView getDashboardModelView() {
    		return dashboardModelView;
    	}
     
    	public void setDashboardModelView(DashboardModelView dashboardModelView) {
    		this.dashboardModelView = dashboardModelView;
    	}
     
    	public DynamicDatatable getDynamicDatatable() {
    		return dynamicDatatable;
    	}
     
    	public void setDynamicDatatable(DynamicDatatable dynamicDatatable) {
    		this.dynamicDatatable = dynamicDatatable;
    	}
     
    }
    et voici la page xhtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <p:dashboard id="dynamic_dashboard"	binding="#{dashboardBacker.dashboard}"  />
    Les panels sont créés en fonction du résultat d'une requête qui ramène les abonnements d'un utilisateur, du coup les exemples de manuel d'utilisateur ne répondent pas à mon besoin, vu qu'ils supposent que le nombre de panels est fixé d'avance.
    Est-il possible de faire ce travail sans créer programmatiquement le dashboard, les panels, le dataTable, et le Chart ? Si oui pourriez vous m'expliquer comment ?

    JSF 2.2
    Primefaces 4.0
    Glassfish 4/ WLS 12c
    En vous remerciant d'avance.

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    La question est peut être idiote, mais pourquoi voulais tu faire ca par programmation ?
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    Citation Envoyé par Alkhan Voir le message
    bonjour,

    La question est peut être idiote, mais pourquoi voulais tu faire ca par programmation ?
    Salut,
    Le nombre de panels dans le dashboard dépends du nombre d'abonnements dont dispose l'utilisateur. Aussi le format de la présentation des données(dataTable, Chart, ou Panel simple) dépends des préférences utilisateur. pour l'instant ces préférences sont renseignées en dure dans le code mais à l'avenir l'utilisateur aura à choisir ses préférences dans une liste déroulante.
    Tous ces éléments me sont inconnus avant la connexion de l'utilisateur. Cette connexion va déclencher un processus ayant pour but de récupérer en base les abonnements ainsi que les préférences liés à cet utilisateur afin de peupler le dashboard selon les préférences de l'utilisateur en question.
    Je dois par la suite sauvegarder l'état du dashboard après chaque modification, et actuellement faute de trouver mieux je sérialize en base l'objet model du dashboard.

    J'ai passé énormément de temps à chercher une solution simple, hélas sans succès. J'ignore si mon besoin peut être réalisé autrement, et toutes les bonnes idées sont les bienvenues.

    Je vous remercie d'avance.

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    J'ai l'impression que tu prend le problème a l’envers !
    N'essaye pas de faire tout en même temps.
    moi je distingue deux choses :
    • Comment afficher les informations
    • Comment faire pour que l'utilisateur puisse personnaliser son affichage


    si tu essayes de faire les deux directement tu te créé des difficultés, la ou il n'y en a peut être pas !

    Quelles sont donc les premières infos a afficher ?
    Quelle est ta difficulté ?
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    J'ai l'impression que tu prend le problème a l’envers !
    C'est possible.

    N'essaye pas de faire tout en même temps.
    Dans un premier temps, je n'avais fait qu'afficher le dashboard de façon dynamique, et ça avait marché, en créant programmatiquement le dashboard ainsi que les panels simple contenant des simple String. Ensuite les choses se sont compliquées lorsque j'ai essayé de sauvegarder l'état du dashboard. J'ai fini par abandonner cette tache, trop compliqué !
    Dans un troisième temps, j'ai essayé d'afficher les données sous différentes formes(DataTAble, Charts...).

    si tu essayes de faire les deux directement tu te créé des difficultés, la ou il n'y en a peut être pas !
    T'as peut être raison, j'essaye de réaliser l'étape "Comment afficher les infos", d'une manière à ce que l'étape "Comment faire pour que l'utilisateur puisse personnaliser son affichage" soit réalisable.

    Quelles sont donc les premières infos a afficher ?
    Les premières infos à afficher sont des indicateurs, qui peuvent être affichés sous forme de :
    • Un échantillon(une seule valeur)
    • Un ensemble de valeur sur une plage (tableau de valeur)
    • Un ensemble de valeur avec des pourçentages (une Chart, des barres....)


    Quelle est ta difficulté ?
    Aujourd'hui j'arrive à faire ceci :
    • afficher un DataTable tout seul
    • une Valeur simple dans un Panel
    • afficher une Chart tout seul

    Par contre, ce que je n'arrive pas à faire c'est afficher dynamiquement dans le même dashboard les trois formes(Panel(s), DataTable, Chart(s) ) ?

    Merci pour ton aide précieux

  6. #6
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par kelkan Voir le message
    Par contre, ce que je n'arrive pas à faire c'est afficher dynamiquement dans le même dashboard les trois formes(Panel(s), DataTable, Chart(s) ) ?
    Que veux tu dire par dynamiquement ? Avec les Jsf on fait pratiquement que ca !

    Pour moi, il n'y a pas vraiment de difficulté. dans la JSF tu créé un dashboard et dans chaque panel tu définis les infos qui sont a affichées !
    Évidemment, tu ne fais pas tous cela dans ton bean. Ton bean ne doit servir qu'a alimenter tes structures.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    Que veux tu dire par dynamiquement ? Avec les Jsf on fait pratiquement que ca !
    Je veux dire par là que, je ne connais pas en avance la nature(Panel, ou DataTable ou Chart) ni le nombre d'éléments(panels..) qui vont être affiché sur le dashboard.
    C'est pour ça que je créé les éléments au niveau de mon bean après avoir récupéré les données depuis la base, données permettant de déterminer le nombre et la nature des éléments.

    Pour moi, il n'y a pas vraiment de difficulté. dans la JSF tu créé un dashboard et dans chaque panel tu définis les infos qui sont a affichées !
    Évidemment, tu ne fais pas tous cela dans ton bean. Ton bean ne doit servir qu'a alimenter tes structures.
    Ne sachant pas à l'avance le nombre de panels à afficher dans le dashboard, je ne peux pas créer de façon statique(dans la jsf) ces panels, si non je risque d'avoir des panels en plus ou en moins si le nombre d'éléments récupérés de la base est inférieur ou supérieur du nombre de panels créés statiquement dans la page jsf ?
    Ne sachant pas à l'avance si j'aurais un panel ou un DataTable ou une Chart, je ne peux pas non plus les créer dans la page jsf avant de connaitre le type d'éléments à afficher(panel, ou DataTable, ou Chart), sauf si tu me confirme que les DataTable et les Charts peuvent être affichés dans un Panel ?
    Une question peut être idiote, mais je lapose qd même , dois-je créer un bean pour chaque type d'élément ç-à-d, un DataTableBean, un PanelBean, un ChartBean et injecter les trois beans dans le bean principale DashboardBean du dashboard ? Si c'est le cas comment fusionner les Models(DataTableModel, PanelModel, et ChartModel) ?

    Merci encore pour tes retours.

  8. #8
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par kelkan Voir le message
    Je veux dire par là que, je ne connais pas en avance la nature(Panel, ou DataTable ou Chart) ni le nombre d'éléments(panels..) qui vont être affiché sur le dashboard.
    C'est pour ça que je créé les éléments au niveau de mon bean après avoir récupéré les données depuis la base, données permettant de déterminer le nombre et la nature des éléments.
    C'est la ou tu fais erreur, il n'est pas nécessaire de le faire dans le bean !
    il est possible de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <p:dashboard id="board" model="#{dashBean.model}">
    	<c:forEach items="#{dashBean.abonnements}" var="abo">
    Citation Envoyé par kelkan Voir le message
    Ne sachant pas à l'avance le nombre de panels à afficher dans le dashboard, je ne peux pas créer de façon statique(dans la jsf) ces panels, si non je risque d'avoir des panels en plus ou en moins si le nombre d'éléments récupérés de la base est inférieur ou supérieur du nombre de panels créés statiquement dans la page jsf ?
    Ne sachant pas à l'avance si j'aurais un panel ou un DataTable ou une Chart, je ne peux pas non plus les créer dans la page jsf avant de connaitre le type d'éléments à afficher
    Encore une fois c'est une erreur de penser cela !
    Utilise une structure conditionnel pour savoir ce qui est afficher dans un panel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <c:choose>
       <c:when test="${abo.typeAffichage == 1}">
          ...
       </c:when>
       <c:when test="${abo.typeAffichage == 2}">
          ....
       </c:when>
       <c:when test="${abo.typeAffichage == 3}">
          ...
       </c:when>
       <c:otherwise>
       </c:otherwise>
    </c:choose>
    Citation Envoyé par kelkan Voir le message
    sauf si tu me confirme que les DataTable et les Charts peuvent être affichés dans un Panel ?
    Bien sur que c'est possible

    Citation Envoyé par kelkan Voir le message
    Une question peut être idiote, mais je lapose qd même , dois-je créer un bean pour chaque type d'élément ç-à-d, un DataTableBean, un PanelBean, un ChartBean et injecter les trois beans dans le bean principale DashboardBean du dashboard ? Si c'est le cas comment fusionner les Models(DataTableModel, PanelModel, et ChartModel) ?
    Déja aucune question n'est idiote .... ce qui serait idiot c'est de ne pas en poser !
    Si j'ai bien tout compris, pour moi tes trois données :
    • Un échantillon(une seule valeur)
    • Un ensemble de valeur sur une plage (tableau de valeur)
    • Un ensemble de valeur avec des pourçentages (une Chart, des barres....)

    sont des informations d'un abonnement, non ?

    Si c'est le cas alors, ton bean ne fait que renvoyer une liste d'abonnement dont chaque élément correspond à un panel du dashboard.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    Je te remercie infiniment pour tes retours et tes conseils.
    Je vais essayer de mettre tout ça en place et je te tiendrais au courant du résultat.
    Merci Encore.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    Bonjour,
    me voilà de nouveau
    Je crois avoir mis en place tes recommendations et après déploiement j'obtiens une page qui contient le titre et rien en dessous, en gros le dashboard ne s'affiche pas, mais je n'ai aucun message d'erreur dans les logs! J'essaye Depuis hier de trouver le problème, mais sans succès malheureusement.
    Voici la page jsf :
    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" 
    	xmlns:p="http://primefaces.org/ui" xmlns:c="http://java.sun.com/jsp/jstl/core">	
    <h:head>
    	<title>Indicateurs :</title>
    </h:head>
    <h:body>
    	<h1>Tableau de bord : aggregateur d'indicateurs</h1>
    	<hr />
    	<h:form id="form">
    		<p:dashboard id="dynamic_dashboard" binding="#{dashboardBean.dashboard}">
    		<!-- <ui:repeat var="abo" value="#{dashboardBean.dashboardModelView.abonnements}"> -->
    			 <c:forEach items="#{dashboardBean.dashboardModelView.abonnements}" var="abo"> 
    				<c:choose>
    					<c:when test="${abo.typeAffichage == 1}">
    						<!-- DataTable-->
    						<p:dataTable id="#{abo.panelId}" var="indicator" value="#{dashboardBean.dashboardModelView.indicatorsForDataTable}" rendered="#{not empty dashboardBean.dashboardModelView.indicatorsForDataTable}">
    							<p:columns value="#{dashboardBean.dashboardModelView.columns}" var="column" columnIndexVar="colIndex">
    								<f:facet name="header">  
                    					#{column.header}  
                					</f:facet>  
                						#{indicator[column.property]}  
            					</p:columns>
    						</p:dataTable>
    					</c:when>
    					<c:when test="${abo.typeAffichage == 2}">
    						<!-- creer ici le composant Pie Chart -->
    					</c:when>
    					<c:when test="${abo.typeAffichage == 3}">
    						<!-- creer ici le composant Line Chart -->
    					</c:when>
    					<c:otherwise>
    						<!-- <p:panel id="${abo.panelId}" header="${abo.indicator.libelle}"> -->
    						<p:panel id="#{abo.panelId}" header="#{abo.indicator.libelle}"> 
    							<f:facet name="footer">
    								<h:outputText value="#{abo.indicator.valeur}" />
    							</f:facet>
    							<!-- //Child components here... -->
    						</p:panel>
    					</c:otherwise>
    				</c:choose>
    			</c:forEach>
    		</p:dashboard>
    	</h:form>
    </h:body>
    </html>
    QUESTION : lorsque la liste des abonnements est parcourue à l'aide de la boucle forEach, à chauqe fois que le typeAffichage est à 1 le <p:dataTable id="#{abo.panelId}" > est recrée. Que faut-il faire pour empêcher cette recréation ?

    et voici le modèle :
    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
    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
     
    @Named
    @ConversationScoped
    public class DashboardModelView implements Serializable {
    	private static final long serialVersionUID = 1L;
    	private final Logger logger = Logger.getLogger(getClass());
     
    	/* Nombre de colonne par defaut */
    	public static final int DEFAULT_COLUMN_COUNT = 3;
    	private DashboardModel model;
    	private Set<Abonnement> abonnements;
    	@Inject
    	private DashboardEJB dashboarEJB;
    	@Inject
    	private User user;
    	/* new */
    	private List<Indicator> indicatorsForDataTable = new ArrayList<Indicator>();	
    	private List<ColumnModel> columns = new ArrayList<ColumnModel>();
     
    	@PostConstruct
    	public void init() {
    		logger.info("Creating model");
    		if (model == null) {
    			String userId = "myId";
    			user = dashboarEJB.findUserById(userId);
    			abonnements = user.getAbonnements();
    			model = new DefaultDashboardModel();
    				for (int i = 0, n = DEFAULT_COLUMN_COUNT; i < n; i++) {
    					model.addColumn(new DefaultDashboardColumn());
    				}
    				/* pour le test  a supprimer*/
    				for(Abonnement abonnement : abonnements){
    					abonnement.setPanelId("p"+UUID.randomUUID().toString());
    				}
    		}
    		populateIndicatorsForDataTable(abonnements,4);		
    	     createDynamicColumns(); 
    	}
     
    /**
    * permet de creer dynamiquement les colonnes
    */
    	public void createDynamicColumns() {  
    		Set<String> columnKeys= new HashSet<String>();
    		for(Indicator indic : indicatorsForDataTable){
    			columnKeys.add(indic.getLibelle());
    		}
    		System.out.println("liste de titre : "+columnKeys.toString());
            columns.clear();             
            for(String columnKey : columnKeys) {  
               System.out.println("columnKey en majuscule : "+columnKey.toUpperCase()+" ck : "+columnKey);
                    columns.add(new ColumnModel(columnKey.toUpperCase(), columnKey));  
            }  
        } 
    	/**
             * methode permettant de peupler la liste de indicateurs du tableau
             */
    	 private void populateIndicatorsForDataTable(Set<Abonnement> abonnements, int size) { 
    		 Date premierJour = getJourDuMois(0);
    		 Date deuxiemeJour = getJourDuMois(1);
    		 Date troisiemeJour = getJourDuMois(2);
    		 Date quatriemeJour = getJourDuMois(3);
    		 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-dd-MM");
    	        for(Abonnement abnmt : abonnements)  {
    	        	Indicator indic = abnmt.getIndicator();
    	        	if(dateFormat.format(indic.getDateSortie()).equals(dateFormat.format(premierJour))){
    	        		indic.setDayOfMonth("1er Jour du mois");	        		
    	        		indicatorsForDataTable.add(indic);
    	        	}else if(dateFormat.format(indic.getDateSortie()).equals(dateFormat.format(deuxiemeJour))){
    	        		indic.setDayOfMonth("2eme Jour du mois");
    	        		indicatorsForDataTable.add(indic);
    	        	}else if(dateFormat.format(indic.getDateSortie()).equals(dateFormat.format(troisiemeJour))){
    	        		indic.setDayOfMonth("3eme Jour du mois");
    	        		indicatorsForDataTable.add(indic);
    	        	}else if(dateFormat.format(indic.getDateSortie()).equals(dateFormat.format(quatriemeJour))){
    	        		indic.setDayOfMonth("4eme Jour du mois");
    	        		indicatorsForDataTable.add(indic);
    	        	}
    	        }	
    	    }  
     
    	 /**
              * recuperer le 1er, 2nd, 3eme, 4eme jour du mois
              */
    	 public Date getJourDuMois(int day){
    		 Calendar c = Calendar.getInstance();
    		 c.setTime(new Date());
    		 c.set(Calendar.DAY_OF_MONTH, c.getActualMinimum(Calendar.DAY_OF_MONTH));
    		 c.add(Calendar.DAY_OF_MONTH, +day);
     
    		 return c.getTime();		
    	 }
     
    	public DashboardModel getModel() {
    		return model;
    	}
     
    	public void setModel(DashboardModel model) {
    		this.model = model;
    	}
     
    	public User getUser() {
    		return user;
    	}
     
    	public void setUser(User user) {
    		this.user = user;
    	}
     
    	public Set<Abonnement> getAbonnements() {
    		return abonnements;
    	}
     
    	public void setAbonnements(Set<Abonnement> abonnements) {
    		this.abonnements = abonnements;
    	}
    	public List<Indicator> getIndicatorsForDataTable() {
    		return indicatorsForDataTable;
    	}
     
    	public void setIndicatorsForDataTable(List<Indicator> indicatorsForDataTable) {
    		this.indicatorsForDataTable = indicatorsForDataTable;
    	}
    	public List<ColumnModel> getColumns() {
    		return columns;
    	}
     
    	public void setColumns(List<ColumnModel> columns) {
    		this.columns = columns;
    	}
     
    	/**
             * class permettant de creer des modeles de colonne
             */
    	static public class ColumnModel implements Serializable {  
      		private static final long serialVersionUID = 1L;
    		private String header;  
            private String property;  
     
            public ColumnModel(String header, String property) {  
                this.header = header;  
                this.property = property;  
            }  
            public String getHeader() {  
                return header;  
            }  
     
            public String getProperty() {  
                return property;  
            }  
        }  
    }
    et enfin voici le bean :
    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
     
    @Named
    @ViewScoped
    public class DashboardBean implements Serializable {
     
    	private static final long serialVersionUID = 1L;
    	private final Logger logger = Logger.getLogger(getClass());
     
    	@Inject
        private DashboardModelView dashboardModelView;
    	private Dashboard dashboard;
     
    	public DashboardBean() {
    	}
     
    	@PostConstruct
    	public void init() {
    		logger.info("Creating model");
    		FacesContext fc = FacesContext.getCurrentInstance();
            Application application = fc.getApplication();
            String componentType = "org.primefaces.component.Dashboard";
            String rendredDashboardType = "org.primefaces.component.DashboardRenderer";
            dashboard = (Dashboard) application.createComponent(fc, componentType, rendredDashboardType);
            dashboard.setId("dynamic_dashboard");
            dashboard.setModel(dashboardModelView.getModel());
    	}
     
    	public Dashboard getDashboard() {
    		return dashboard;
    	}
     
    	public void setDashboard(Dashboard dashboard) {
    		this.dashboard = dashboard;
    	}
     
    	public DashboardModelView getDashboardModelView() {
    		return dashboardModelView;
    	}
     
    	public void setDashboardModelView(DashboardModelView dashboardModelView) {
    		this.dashboardModelView = dashboardModelView;
    	}	
    }
    Merci d'avance.

  11. #11
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par kelkan Voir le message
    Je crois avoir mis en place tes recommendations et après déploiement j'obtiens une page qui contient le titre et rien en dessous, en gros le dashboard ne s'affiche pas
    C'est normal tu as raté quelques petites choses :
    * le dashboard est un ensemble de panel et tu dois donc mettre ton contenu dans un panel. Tu la fait dans le otherwise mais pas pour le type affichage 1.
    Met plutôt le choose dans le panel :
    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
     
    <c:forEach items="#{dashboardBean.dashboardModelView.abonnements}" var="abo">
         <p:panel id="#{abo.panelId}" header="#{abo.indicator.libelle}">
              <c:choose>
                   <c:when test="${abo.typeAffichage == 1}">
                   ...
                   </c:when>
                   <c:when test="${abo.typeAffichage == 2}">
                   ....
                   </c:when>
                    <c:when test="${abo.typeAffichage == 3}">
                   ...
                   </c:when>
                   <c:otherwise>
                   </c:otherwise>
              </c:choose>
    ......
    * tu ne fait qu'ajouter les colonnes dans le modèle, et tu as oublié d'ajouter les widgets dans tes colonnes. Exemple si tu as 1 colonne (a toi de voir pour le répartir sur 3) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DashboardColumn column1 = new DefaultDashboardColumn();
     
    for (Abonnement abo : this.abonnements) {
    	column1.addWidget(abo.getPanelId());
    }
    this.model.addColumn(column1);
    Pour finir, pourquoi utilises tu "binding" ? affect directement le modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:dashboard id="dynamic_dashboard" model="#{dashboardBean.dashboardModelView.model}">
    Citation Envoyé par kelkan Voir le message
    QUESTION : lorsque la liste des abonnements est parcourue à l'aide de la boucle forEach, à chauqe fois que le typeAffichage est à 1 le <p:dataTable id="#{abo.panelId}" > est recrée. Que faut-il faire pour empêcher cette recréation ?
    Cela me parait normal .... pour chaque abonnement tu as des contenus différent ! ou alors j'ai pas bien compris ce que tu souhaites faire.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    Merci pour ton retour rapide.
    Je vais mettre tout ça en forme, re-tester et te communiquer le résultat.
    Cela me parait normal .... pour chaque abonnement tu as des contenus différent ! ou alors j'ai pas bien compris ce que tu souhaites faire.
    T'as raison, je me suis encore mélangé les pinceaux je dois revoir mon modèle de données.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    Bonjour,
    Pour réaliser le test, j'ai fini par créer manuellement les liste dans le bean. malheureusement après avoir intégré les modifications que tu m'avais suggeré, le dashboard ne s'affiche tjrs pas !
    tjrs pas d'erreur dans les logs, juste le titre de la page et vide en dessous.

    ci-dessous la page jsf,
    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
    	xmlns:h="http://java.sun.com/jsf/html"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:p="http://primefaces.org/ui"
    	xmlns:c="http://java.sun.com/jsp/jstl/core">
     
    <h:head>
    	<title>Indicateurs :</title>
    </h:head>
    <h:body>
    	<h1>Tableau de bord : aggregateur d'indicateurs</h1>
    	<hr />
    	<h:form id="form">
    		<p:dashboard id="dynamic_dashboard" model="#{dashboardBean.model}">
    			<c:forEach items="#{dashboardBean.associations}" var="assoc">
    				<p:panel id="#{assoc.panelId}" header="#{assoc.indicator.libelle}">
    					<c:choose>
    						<c:when test="${assoc.typeAffichage == 1}">
    							<!-- DataTable-->
    							<p:dataTable id="#{assoc.indicator.type}" var="indicator"
    								value="#{assoc.indicators}"
    								rendered="#{not empty assoc.indicators}">
    								<p:columns value="#{dashboardBean.columns}"
    									var="column" columnIndexVar="colIndex">
    									<f:facet name="header">  
                    					#{column.header}  
                					</f:facet>  
                						#{column.property}  
            					</p:columns>
    							</p:dataTable>
    						</c:when>
    						<c:when test="${abo.typeAffichage == 2}">
    							<!-- creer ici le composant Pie Chart -->
    						</c:when>
    						<c:when test="${abo.typeAffichage == 3}">
    							<!-- creer ici le composant Line Chart -->
    						</c:when>
    						<c:otherwise>
    							<!-- <p:panel id="#{abo.panelId}" header="#{abo.indicator.libelle}"> -->
    							<f:facet name="footer">
    								<h:outputText value="#{abo.indicator.valeur}" />
    							</f:facet>
    							<!-- //Child components here... -->
    							<!-- </p:panel> -->
    				</c:otherwise>
    				</c:choose>
    				</p:panel>
    			</c:forEach>
    		</p:dashboard>
    	</h:form>
    </h:body>
    </html>
    et voici le bean,
    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
    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
     
    @Named
    @ViewScoped
    public class DashboardBean implements Serializable {
     
    	private static final long serialVersionUID = 1L;
    	private final Logger logger = Logger.getLogger(getClass());
     
    	public static final int DEFAULT_COLUMN_COUNT = 3;
    	private DashboardModel model;
    	private Collection<Association> associations = new ArrayList<Association>();
    	@Inject
    	private DashboardEJB dashboarEJB;
    	@Inject
    	private User user;
    	private List<ColumnModel> columns = new ArrayList<ColumnModel>();
     
    	public DashboardBean() {
    	}
     
    	@PostConstruct
    	public void init() {
    		if (model == null) {
    			String userId = "MO0F487N";
    			user = dashboarEJB.findUserById(userId);
    			//pour le test
    			peupleurAssocPourTester(associations, 3);
     
    //			associations = dashboarEJB.peuplerListeIndicateurs(user
    //					.getAssociations());
    			System.out.println("assoc size : " + associations.size());
    			model = new DefaultDashboardModel();
    			for (int i = 0, n = DEFAULT_COLUMN_COUNT; i < n; i++) {
    				model.addColumn(new DefaultDashboardColumn());
    			}
    			createDynamicColumns();
     
    			int index = 0;
    			for (Association assoc : this.associations) {
    				DashboardColumn columnI = model.getColumns().get(
    						index % columns.size());
    				if (assoc.getPanelId() != null) {
    					columnI.addWidget(assoc.getPanelId());
    				} else {
    					String panelId = "p" + UUID.randomUUID().toString();
    					assoc.setPanelId(panelId);
    				}
    				System.out
    						.println("passage apres  : populateIndicatorsForDataTable :"
    								+ assoc.getIndicators().size());
    				index++;
    			}
    		}
    	}
     
    	public void createDynamicColumns() {
    		Map<String,String> columnKeys = new HashMap<String,String>();
    		for (Association assoc : associations) {
    			List<Indicator> indicatorsForDataTable = assoc.getIndicators();
    			for (Indicator indic : indicatorsForDataTable) {
    				columnKeys.put(indic.getLibelle(), indic.getValeur());
    			}
    		}
    		System.out.println("liste de titre : " + columnKeys.toString());
    		columns.clear();
     
    		for (Map.Entry<String, String> columnKey : columnKeys.entrySet()){
    		    System.out.println(columnKey.getKey() + " : " + columnKey.getValue());
    		    columns.add(new ColumnModel(columnKey.getKey().toUpperCase(), columnKey.getValue()));
    		}
    	}
     
    	public void peupleurAssocPourTester(Collection<Association> list, int size){
    		for (int i=0; i<size; i++){
    			Association assoc1 = new Association();
    			if(size!=1){
    				assoc1.setTypeAffichage(null);
    			}else{
    				assoc1.setTypeAffichage(i);
    			}			
    			assoc1.setUser(user);
    			//indic1
    			Indicator indic1 = new Indicator();
    			indic1.setIndicatorId((long) i);
    			indic1.setDayOfMonth("premier jour du mois");
    			indic1.setLibelle("Taux de télérélève");
    			indic1.setValeur("89%");
    			indic1.setType("p_"+size);
    			assoc1.setIndicator(indic1);
    			//indic2
    			Indicator indic2 = new Indicator();
    			indic2.setIndicatorId((long) i);
    			indic2.setDayOfMonth("deuxieme jour du mois");
    			indic2.setLibelle("Taux de télérélève");
    			indic2.setValeur("93 %");
    			indic2.setType("p_"+size);
    			assoc1.setIndicator(indic2);
    			//indic2
    			Indicator indic3 = new Indicator();
    			indic3.setIndicatorId((long) i);
    			indic3.setDayOfMonth("troisieme jour du mois");
    			indic3.setLibelle("Taux de télérélève");
    			indic3.setValeur("94 %");
    			indic3.setType("p_"+size);
    			assoc1.setIndicator(indic3);
    			List<Indicator> indicators = new ArrayList<Indicator>();
    			indicators.add(indic1);
    			indicators.add(indic2);
    			indicators.add(indic3);
    			assoc1.setIndicators(indicators);
    			list.add(assoc1);
    		}
     
    	}
     
    	public DashboardModel getModel() {
    		return model;
    	}
     
    	public Collection<Association> getAssociations() {
    		return associations;
    	}
     
    	public void setAssociations(Collection<Association> associations) {
    		this.associations = associations;
    	}
     
    	public DashboardEJB getDashboarEJB() {
    		return dashboarEJB;
    	}
     
    	public User getUser() {
    		return user;
    	}
     
    	public void setUser(User user) {
    		this.user = user;
    	}
     
    	public List<ColumnModel> getColumns() {
    		return columns;
    	}
     
    	public void setColumns(List<ColumnModel> columns) {
    		this.columns = columns;
    	}
     
    	public Logger getLogger() {
    		return logger;
    	}
     
    	static public class ColumnModel implements Serializable {
    		private static final long serialVersionUID = 1L;
    		private String header;
    		private String property;
     
    		public ColumnModel(String header, String property) {
    			this.header = header;
    			this.property = property;
    		}
     
    		public String getHeader() {
    			return header;
    		}
     
    		public String getProperty() {
    			return property;
    		}
    	}
    }
    Merci d'avance.

  14. #14
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,
    Citation Envoyé par kelkan Voir le message
    C'est tout simple en fait, Il s'agit d'un utilisateur pouvant s'abonner à 1 ou plusieurs indicateurs, et inversement un indicateur peut être lié à 1 ou plusieurs utilisateurs, ce qui reviens à une relations manyToMany entre l'utilisateur et l'indicateur, ce que j'ai traduit par une table d'association "abonnement".
    Maintenant je vois mieux ce que tu veux faire
    Citation Envoyé par kelkan Voir le message
    Et comme je pensais à "Comment faire pour que l'utilisateur puisse personnaliser son affichage et la sauvegarde de cette personnalisation", j'avais ajouté des informations liées à l'affichage tel que "panelId" et "typeAffichage" dans la table "abonnement".
    Ca pour moi c'est très bien ! une association porteuse de données pour indiquer les éléments de personnalisation de l'utilisateur !

    Citation Envoyé par kelkan Voir le message
    Par conséquence, je vais garder la table d'association et la renommer User_Indic, y retirer les infos supplémentaires puis créer une nouvelle table abonnement qui serait uniquement liée à l'utilisateur via une relation oneToMany, et qui contiendrait type_affichage et panelId.
    en revanche, cette solution est moins intéressante !

    Pour ce qui est du dernier code fournis, j'avoue ne plus être sur de comprendre ce que sont les indicateurs !
    Pour moi un indicateur pouvait être :
    • un valeur simple a afficher
    • un tableau de valeurs
    • des valeurs sous forme d'un graph


    mais quand je vois ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <p:dataTable id="#{assoc.indicator.type}" var="indicator"
    	value="#{assoc.indicators}"
    	rendered="#{not empty assoc.indicators}">
    	<p:columns value="#{dashboardBean.columns}"
    		var="column" columnIndexVar="colIndex">
    		<f:facet name="header">  
            		#{column.header}  
            	</f:facet>  
                		#{column.property}  
            </p:columns>
    </p:dataTable>
    Ici la table correspond à l'affichage de plusieurs indicateurs ????
    J'ai plutôt l'impression d'être a coté de la plaque
    Malgré tous tu as dis que "Il s'agit d'un utilisateur pouvant s'abonner à 1 ou plusieurs indicateurs". Conclusion je suis perdu

    J'ai donc monté un exemple (basé en partie sur ton code) qui fonctionne et te montre comment afficher les différents composant dans un dashboard.
    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
     
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
    	xmlns:h="http://java.sun.com/jsf/html"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:p="http://primefaces.org/ui"
    	xmlns:c="http://java.sun.com/jsp/jstl/core">
     
    <h:head>
    	<title>Indicateurs :</title>
    </h:head>
    <h:body>
    	<h1>Tableau de bord : aggregateur d'indicateurs</h1>
    	<hr />
    	<h:form id="form">
    		<p:dashboard id="dynamic_dashboard" model="#{dashboardBean.model}">
    			<c:forEach items="#{dashboardBean.indicators}" var="indic">
    				<p:panel id="#{indic.indicatorId}" header="#{indic.libelle}">
    					<c:choose>
    						<c:when test="${indic.typeAffichage == 1}">
    							<!-- DataTable-->
    							<p:dataTable var="data" value="#{indic.datas}" editable="false">
    								<p:column headerText="Index" style="width:50%">
    									<h:outputText value="#{data.index}" />
    								</p:column>
     
    								<p:column headerText="Name" style="width:50%">
    									<h:outputText value="#{data.name}" />
    								</p:column>
    							</p:dataTable>
    						</c:when>
    						<c:when test="${indic.typeAffichage == 2}">
    							<!-- le composant bar Chart -->
    							<p:barChart id="basic" value="#{indic.categoryModel}"
    								legendPosition="ne" title="Basic Bar Chart" min="0" max="200"
    								style="height:100px" />
    						</c:when>
    						<c:when test="${indic.typeAffichage == 3}">
    							<!-- creer ici le composant Line Chart -->
    						</c:when>
    						<c:otherwise>
    							<!-- <p:panel id="#{abo.panelId}" header="#{abo.indicator.libelle}"> -->
    							<f:facet name="footer">
    								<h:outputText value="#{indic.valeur}" />
    							</f:facet>
    							<!-- //Child components here... -->
    							<!-- </p:panel> -->
    				</c:otherwise>
    				</c:choose>
    				</p:panel>
    			</c:forEach>
    		</p:dashboard>
    	</h:form>
    </h:body>
    </html>
    Le bean :
    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
    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
     
    public class DashboardBean implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	public static final int DEFAULT_COLUMN_COUNT = 3;
    	private DashboardModel model;
    	private List<Indicator> indicators = new ArrayList<Indicator>();
    	private List<ColumnModel> columns = new ArrayList<ColumnModel>();
     
    	public DashboardBean() {
    	}
     
    	@PostConstruct
    	public void init() {
    		if (this.model == null) {
    			String userId = "MO0F487N";
    			// pour le test
    			peupleurAssocPourTester(this.indicators, 3);
     
    			// associations = dashboarEJB.peuplerListeIndicateurs(user
    			// .getAssociations());
    			System.out.println("assoc size : " + this.indicators.size());
    			this.model = new DefaultDashboardModel();
    			for (int i = 0, n = DEFAULT_COLUMN_COUNT; i < n; i++) {
    				this.model.addColumn(new DefaultDashboardColumn());
    			}
     
    			int index = 0;
    			for (Indicator assoc : this.indicators) {
    				DashboardColumn columnI = this.model.getColumns().get(index % this.columns.size());
    				if (assoc.getIndicatorId() != null) {
    					columnI.addWidget(assoc.getIndicatorId());
    				} else {
    					String panelId = "p" + UUID.randomUUID().toString();
    					assoc.setIndicatorId(panelId);
    				}
    				System.out.println("passage apres  : populateIndicatorsForDataTable :"
    						+ this.indicators.size());
    				index++;
    			}
    		}
    	}
     
    	public void peupleurAssocPourTester(Collection<Indicator> list, int size) {
    		// indic1
    		Indicator indic = new Indicator();
    		indic.setIndicatorId("pan1");
    		indic.setLibelle("Exemple de tableau");
    		indic.setTypeAffichage(1);
    		List<Indicator.TableData> datas = new ArrayList<Indicator.TableData>();
    		datas.add(new TableData(1, getRandomValeur()));
    		datas.add(new TableData(2, getRandomValeur()));
    		datas.add(new TableData(3, getRandomValeur()));
    		indic.setDatas(datas);
    		this.indicators.add(indic);
     
    		// indic2
    		indic = new Indicator();
    		indic.setIndicatorId("pan2");
    		indic.setLibelle("Exemple de graphique");
    		indic.setTypeAffichage(2);
    		CartesianChartModel categoryModel = new CartesianChartModel();
     
    		ChartSeries s1 = new ChartSeries();
    		s1.setLabel("Serie1");
     
    		s1.set("2010", getRandomChart());
    		s1.set("2011", getRandomChart());
    		s1.set("2012", getRandomChart());
    		s1.set("2013", getRandomChart());
    		s1.set("2014", getRandomChart());
     
    		ChartSeries s2 = new ChartSeries();
    		s2.setLabel("Serie2");
     
    		s2.set("2010", getRandomChart());
    		s2.set("2011", getRandomChart());
    		s2.set("2012", getRandomChart());
    		s2.set("2013", getRandomChart());
    		s2.set("2014", getRandomChart());
    		categoryModel.addSeries(s1);
    		categoryModel.addSeries(s2);
    		indic.setCategoryModel(categoryModel);
    		this.indicators.add(indic);
     
    		// indic3
    		indic = new Indicator();
    		indic.setIndicatorId("pan3");
    		indic.setLibelle("Exemple de valeur");
    		indic.setValeur(getPercent() + "%");
    		indic.setTypeAffichage(4);
    		this.indicators.add(indic);
     
    	}
     
    	private String getRandomValeur() {
    		return String.valueOf(Math.random() * 50 + 1960);
    	}
     
    	private int getRandomChart() {
    		Random rn = new Random();
    		return rn.nextInt(150 - 40 + 1) + 40;
    	}
     
    	private int getPercent() {
    		Random rn = new Random();
    		return rn.nextInt(95 - 50 + 1) + 50;
    	}
     
    	public DashboardModel getModel() {
    		return this.model;
    	}
     
    	public Collection<Indicator> getIndicators() {
    		return this.indicators;
    	}
     
    	public void setIndicators(List<Indicator> indicators) {
    		this.indicators = indicators;
    	}
     
    	public List<ColumnModel> getColumns() {
    		return this.columns;
    	}
     
    	public void setColumns(List<ColumnModel> columns) {
    		this.columns = columns;
    	}
     
    	static public class ColumnModel implements Serializable {
    		private static final long serialVersionUID = 1L;
    		private final String header;
    		private final String property;
     
    		public ColumnModel(String header, String property) {
    			this.header = header;
    			this.property = property;
    		}
     
    		public String getHeader() {
    			return this.header;
    		}
     
    		public String getProperty() {
    			return this.property;
    		}
    	}
    }
    et la classe indicator :
    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
     
    public class Indicator {
     
    	private String indicatorId;
    	private String libelle;
    	private String dayOfMonth;
    	private String valeur;
    	private String type;
    	private int typeAffichage;
    	private CartesianChartModel categoryModel;
    	private List<TableData> datas = new ArrayList<TableData>();
     
    	public Indicator() {
    	}
     
    	public String getLibelle() {
    		return this.libelle;
    	}
     
    	public void setLibelle(String libelle) {
    		this.libelle = libelle;
    	}
     
    	public String getDayOfMonth() {
    		return this.dayOfMonth;
    	}
     
    	public void setDayOfMonth(String dayOfMonth) {
    		this.dayOfMonth = dayOfMonth;
    	}
     
    	public String getValeur() {
    		return this.valeur;
    	}
     
    	public void setValeur(String valeur) {
    		this.valeur = valeur;
    	}
     
    	public String getIndicatorId() {
    		return this.indicatorId;
    	}
     
     
    	public void setIndicatorId(String indicatorId) {
    		this.indicatorId = indicatorId;
    	}
     
    	public String getType() {
    		return this.type;
    	}
     
     
    	public void setType(String type) {
    		this.type = type;
    	}
     
     
    	public int getTypeAffichage() {
    		return this.typeAffichage;
    	}
     
    	public void setTypeAffichage(int typeAffichage) {
    		this.typeAffichage = typeAffichage;
    	}
     
    	public CartesianChartModel getCategoryModel() {
    		return this.categoryModel;
    	}
     
    	public void setCategoryModel(CartesianChartModel categoryModel) {
    		this.categoryModel = categoryModel;
    	}
     
    	public List<TableData> getDatas() {
    		return this.datas;
    	}
     
    	public void setDatas(List<TableData> datas) {
    		this.datas = datas;
    	}
     
    	public static class TableData {
    		private int index;
    		private String name;
     
    		public TableData(int index, String name) {
    			this.index = index;
    			this.name = name;
    		}
     
    		public int getIndex() {
    			return this.index;
    		}
     
     
    		public void setIndex(int index) {
    			this.index = index;
    		}
     
    		public String getName() {
    			return this.name;
    		}
     
     
    		public void setName(String name) {
    			this.name = name;
    		}
    	}
     
    }
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    Salut,
    D'abord un grand merci pour ce retour claire et précis.
    en revanche, cette solution est moins intéressante !
    Pour ce qui est du dernier code fournis, j'avoue ne plus être sur de comprendre ce que sont les indicateurs !
    Effectivement après avoir essayer de mettre en place cette solution, je me suis rendu compte que c'était pas bon du tout et c'est la raison pour laquelle je l'ai supprimé de mon précédent poste.
    Pour moi un indicateur pouvait être :
    • un valeur simple a afficher
    • un tableau de valeurs
    • des valeurs sous forme d'un graph
    Effectivement t'as raison, c'est cette configuration qui convient.
    Malgré tous tu as dis que "Il s'agit d'un utilisateur pouvant s'abonner à 1 ou plusieurs indicateurs". Conclusion je suis perdu
    Je suis désolé, ton sentiment d'être perdu est parfaitement logique, en fait j'avais raté un truc il fallait sortir les infos(valeur, date_valeur) de la table indicateur et le mettre dans une autre table Valeur(id, valeur, date_valeur, id_indic), qui serait liée à l'indicateur via la relation oneToMany unidirectionnelle.
    J'ai donc monté un exemple (basé en partie sur ton code) qui fonctionne et te montre comment afficher les différents composant dans un dashboard.
    J'ai repris ton code et effectivement ça marche nickel, et je t'en remercie.

    Je vais abuser un peu de ta générosité pour aller jusqu'au bout
    T'avais scindé ma problématique en deux parties,
    • La première : comment afficher les données --> c'est OK pour moi.
    • La deuxième : Comment faire pour que l'utilisateur puisse personnaliser son affichage ?

    Pour faire cette deuxième étape, j'ai vu dans les docs de référence qu'il était possible de mettre en place des appels Ajax. Je n'ai pas très bien compris ce qu'il fallait faire pour sauvegarder l'état du dashboard, quelles données mettre à jour en base ? J'avais vu aussi que le composant Dashboard était stateful du coup j'ai décidé de serializer l'Objet DefaultDashbaordModel, en créant une table preference_utilisateur(id_pref, class_name, DefaultDashboardModel) qui est lié à la classe User et le mettre à jour à chaque fois que l'utilisateur ajoute, supprime ou déplace un widget.
    Deux questions :
    • Saurais-tu stp me donner un exemple pour expliquer comment réaliser cette fonctionnalité avec Ajax?
    • Je pense que la méthode de sérialization du DefaultDashboardModel est déconseillé malgré le fait qu'elle n'a pas marché ? comment faire autrement alors ?


    Merci d'avance.

  16. #16
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par kelkan Voir le message
    J'ai repris ton code et effectivement ça marche nickel, et je t'en remercie.

    Je vais abuser un peu de ta générosité pour aller jusqu'au bout
    Aucun problème le forum est justement la pour ça !
    Après si c'est pas moi qui répond d'autres le feront a ma place


    Citation Envoyé par kelkan Voir le message
    Je n'ai pas très bien compris ce qu'il fallait faire pour sauvegarder l'état du dashboard, quelles données mettre à jour en base ?
    Et bien c'est justement a toi de le déterminer, cela dépend du niveau de personnalisation de l'utilisateur.
    Pour le moment, moi je vois au moins deux choses (mais peut être que tu en as d'autres) :
    • Le positionnement des panels : c'est géré au niveau du dashboard avec l'event "reorder".
    • désabonnement aux indicateurs : c'est géré au niveau du panel avec l'event "close"


    pour les données de la base, c'est simple tu dois :
    • pour le positionnement : pour chaque indicateur tu dois sauvegarder les indexes des positions des panels (colonne et ligne)
    • pour le désabonnement: il suffit de supprimer l'abonnement a l'indicateur


    pour l'exemple de l’événement ajax sur le dashboard il y a ce qu'il faut dans le Primefaces - showcase
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    Merci encore pour ton retour.
    En fait je me suis déjà basé sur le showcase pour faire la sauvegarde des positions des widgets,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void handleReorder(DashboardReorderEvent event) {
    	String panelId = event.getWidgetId();
    	int itemIndex = event.getItemIndex();
    	int columnIndex = event.getColumnIndex();
    	int senderIndex = event.getSenderColumnIndex();
    	}
    mais, lorsqu'on déplace un indicateur(widget) les autres widgets se déplacent également, et l'événement "reorder" ne nous permet de récupérer que les indexes de position du widget déplacé. alors dois-je à chaque déplacement, parcourir l'ensemble de widgets, et mettre à jour leurs indexes de positions en base ? ou on peut faire autrement ?
    Pour la restitution des widgets dans leurs positions lors de la connexion d'un utilisateur, j'imagine qu'il suffit juste de vérifier si l'utilisateur dispose d'abonnements et boucler sur les abonnements afin de les afficher dans les positions stocké en base comme par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DashboardModel model = new DefaultDashboardModel() 
    for (int i = 0, n = DEFAULT_COLUMN_COUNT; i < n; i++) {
    	model.addColumn(new DefaultDashboardColumn());
    }
    if(user.getAbonnements()!=null && user.getAbonnements().size()!=0){
    for (Abonnement abnmt : user.getAbonnements()){
          DashboardColumn columnI = model.getColumns().get(columnIndex);
          columnI.addWidget(abnmt.getIndicator().getIndexWidget, abnmt.getPanelId());
    }
    }
    Mais ceci suppose que nous avons stocké au préalable les indexes du widget dans la table indicateur. Il me semblait que les données métiers ne doivent jamais être mélangé avec celles d'affichage, car le jour ou la technologie d'affichage change nous serons amené à modifier l'ensemble de la base de données. Dois-je créer une table à part et la lier à l'indicateur ? cela suffit-il pour séparer les données métiers de celles d'affichage ?

    Merci d'avance.

  18. #18
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par kelkan Voir le message
    mais, lorsqu'on déplace un indicateur(widget) les autres widgets se déplacent également, et l'événement "reorder" ne nous permet de récupérer que les indexes de position du widget déplacé. alors dois-je à chaque déplacement, parcourir l'ensemble de widgets, et mettre à jour leurs indexes de positions en base ? ou on peut faire autrement ?
    En effet, il faudra mettre a jour les indexes sinon tu ne pourra pas retrouver l'ordre de tes panels.

    Citation Envoyé par kelkan Voir le message
    Mais ceci suppose que nous avons stocké au préalable les indexes du widget dans la table indicateur.
    Non pas dans la table indicateur !
    Un indicateur peut être partagé par plusieurs utilisateurs, c'est justement pour cela que tu as une table association !
    Soit tu met ces informations dans la table association, soit tu les met dans une autre table !
    Évidement si tu avais une interface super paramétrable avec une présentation complexe ce serait une autre histoire, mais j'imagine que la c'est pas ton cas.
    A toi de voir
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    Évidement si tu avais une interface super paramétrable avec une présentation complexe ce serait une autre histoire, mais j'imagine que la c'est pas ton cas.
    T'as parfaitement raison.
    Je vais mettre tout ça en place et je te tiendrais au courant.
    Merci infiniment pour ton accompagnement et tes retours bien précis et concis.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ajouter un enregistrement à un datatable
    Par amen_1919 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 25/02/2009, 09h02
  2. Ajouter dynamiquement un composant dans un panel ou une popup
    Par ludogoal dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 21/04/2008, 16h08
  3. Ajout d'un graphique dans un panel ?
    Par denfer06 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/11/2007, 16h41
  4. Ajouter a la suite dans un panel contenu dans un scrollpane
    Par Darkcristal dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 16/08/2007, 17h14
  5. Ajouter un curseur personnalisé à un Control Panel
    Par nkd dans le forum Composants VCL
    Réponses: 2
    Dernier message: 18/10/2005, 23h25

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