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

GWT et Vaadin Java Discussion :

Initialisation liste de valeurs d'une DataSourceTextField


Sujet :

GWT et Vaadin Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Par défaut Initialisation liste de valeurs d'une DataSourceTextField
    Allo la gang !

    Depuis hier je me bats avec un truc qui me semble pourtant tout con. J'ai une ListGrid qui est tout simplement l'affichage d'une table de ma base et qui est construite dans une DataSource. Tout ce que je veux faire c'est que pour certains des champs lors d'une saisie, au lieux d'avoir un champs texte simple il y ait un dropdown avec plusieurs valeurs par défaut (en utilisant la méthode setValueMap() sur mes différents champs).

    J'ai fait quelques tests avec des valeurs en dur, ça marchait mais maintenant je vais récupérer les valeurs en live dans une autre table de la base. Pour ça j'ai fait un service qui me retourne une Map avec en clé le nom de la colonne/du champs et en valeur une List de String. Ce service marche bien, en tout cas il trouve bien les bonnes choses et popule bien ma Map.

    J'ai essayé plusieurs choses. Tout d'abord j'avais simplement fait un appel au service puis fait l'init de tous mes champs et autres, mais là la map était toujours remplie _après_ la création de la Grid (vive les asymchronous calls...). C'était un truc du genre :

    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
     
    public KpiClassDS(String id) {
            setID(id);
     
            final Map<String, List<String>> defaultValues = new HashMap<String, List<String>>();
     
            // We get default values for some of the columns in the parameter table
            GetInputValuesServiceAsync service = GWT.create(GetInputValuesService.class);
    		service.getValues("kpi_class", new AsyncCallback<ReturnMemento>() {
     
    			public void onSuccess(ReturnMemento result) {
    				if (result.getCode() == ReturnMemento.CODE_SUCCESS) {
    					defaultValues.putAll(result.getResults());
     
    				}
    				else {
    					SC.say("Error while retrieving values : " + result.getMessage());
    					if(logger.isLoggable(Level.INFO)) {
    			        	logger.info("Error while retrieving values : " + result.getMessage());
    					}
    				}
    			}
     
    			public void onFailure (Throwable caught) {
    				if (caught instanceof ServiceSecurityException) {
    					SC.say("You do not have enough privilege to carry out the operation!");
    					if(logger.isLoggable(Level.INFO)) {
    			        	logger.info("You do not have enough privilege to carry out the operation!");
    					}
    				}
    				else {
    					SC.say("An exception occured on server side :"+caught.getMessage());
    					if(logger.isLoggable(Level.INFO)) {
    			        	logger.info("An exception occured on server side :"+caught.getMessage());
    					}
    				}
    			}
    		});
     
     
     
    		// We define all the columns
    		DataSourceTextField metric_type_id = new DataSourceTextField("metric_type_id", "Metric Type id", 50, true);
    		DataSourceTextField version = new DataSourceTextField("version", "Version", 50, true);
    		DataSourceTextField external_metric_type_id = new DataSourceTextField("external_metric_type_id", "External Metric Type id", 50, true);
    		DataSourceTextField kpi_class_nm_fr = new DataSourceTextField("kpi_class_nm_fr", "Kpi Class Name Fr", 50, true);
    		DataSourceTextField kpi_class_nm_en = new DataSourceTextField("kpi_class_nm_en", "Kpi Class Name En", 50, true);
    		DataSourceTextField kpi_class_desc_fr = new DataSourceTextField("kpi_class_desc_fr", "Kpi Class Desc Fr", 50, true);
    		DataSourceTextField kpi_class_desc_en = new DataSourceTextField("kpi_class_desc_en", "Kpi Class Desc En", 50, true);
    		................
    		................
    		................
     
    		// We add the fields
    	        setFields(metric_type_id, version, external_metric_type_id, kpi_class_nm_fr, kpi_class_nm_en, kpi_class_desc_fr, kpi_class_desc_en,
            		kpi_class_tech_desc_fr,	kpi_class_tech_desc_en, sort_order, kpi_pattern_cd, tolerance_type_cd, unit_cd, unit_display_ind, 
            		decimal_places, actuals_rollup_type_cd, target_rollup_type_cd, tolerance_rollup_type_cd, udc1_object_id, udc2_object_id, udc3_object_id, 
            		udc4_object_id, udc5_object_id, level_id, udc1_rollup_type_cd, udc2_rollup_type_cd, udc3_rollup_type_cd, udc4_rollup_type_cd, 
            		udc5_rollup_type_cd, owner_id, maximum_value, maximum_value_udc1, maximum_value_udc2, maximum_value_udc3, maximum_value_udc4,
            		maximum_value_udc5, scale, 	axe, axe_caisse, axe_cfe, axe_acadie, axe_dcu, axe_rang, formule_rang, formule_tableau_haut_comp,
            		formule_croissance, code_bddig);
     
    		// Then we check for each column if it's got default values in the map
    		for(String col : getFieldNames()) {
    		      	if(defaultValues.keySet().contains(col)) {
    				getField(col).setValueMap((String[]) defaultValues.get(col).toArray());
    			}
    	        }
    	        setClientOnly(true);          
    	}
    Puis j'ai tout mis dans le callback, un truc du genre :

    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
     
    public KpiClassDS(String id) {
            setID(id);
     
            final Map<String, List<String>> defaultValues = new HashMap<String, List<String>>();
     
            // We get default values for some of the columns in the parameter table
            GetInputValuesServiceAsync service = GWT.create(GetInputValuesService.class);
    		service.getValues("kpi_class", new AsyncCallback<ReturnMemento>() {
     
    			public void onSuccess(ReturnMemento result) {
    				if (result.getCode() == ReturnMemento.CODE_SUCCESS) {
    					defaultValues.putAll(result.getResults());
     
    					// We define all the columns
    				        DataSourceTextField metric_type_id = new DataSourceTextField("metric_type_id", "Metric Type id", 50, true);
    					DataSourceTextField version = new DataSourceTextField("version", "Version", 50, true);
    					DataSourceTextField external_metric_type_id = new DataSourceTextField("external_metric_type_id", "External Metric Type id", 50, true);
    					DataSourceTextField kpi_class_nm_fr = new DataSourceTextField("kpi_class_nm_fr", "Kpi Class Name Fr", 50, true);
    					........................
    					........................
    					........................
    					DataSourceTextField formule_croissance = new DataSourceTextField("formule_croissance", "Formule Croissance", 50, true);
    					DataSourceTextField code_bddig = new DataSourceTextField("code_bddig", "Code Bddig", 50, true);
     
    					// We add the fields
    				        setFields(metric_type_id, version, external_metric_type_id, kpi_class_nm_fr, kpi_class_nm_en, kpi_class_desc_fr, kpi_class_desc_en,
    			        		kpi_class_tech_desc_fr,	kpi_class_tech_desc_en, sort_order, kpi_pattern_cd, tolerance_type_cd, unit_cd, unit_display_ind, 
    			        		decimal_places, actuals_rollup_type_cd, target_rollup_type_cd, tolerance_rollup_type_cd, udc1_object_id, udc2_object_id, udc3_object_id, 
    			        		udc4_object_id, udc5_object_id, level_id, udc1_rollup_type_cd, udc2_rollup_type_cd, udc3_rollup_type_cd, udc4_rollup_type_cd, 
    			        		udc5_rollup_type_cd, owner_id, maximum_value, maximum_value_udc1, maximum_value_udc2, maximum_value_udc3, maximum_value_udc4,
    			        		maximum_value_udc5, scale, 	axe, axe_caisse, axe_cfe, axe_acadie, axe_dcu, axe_rang, formule_rang, formule_tableau_haut_comp,
    			        		formule_croissance, code_bddig);
     
    				        // Then we check for each column if it's got default values in the map
    				        for(String col : getFieldNames()) {
    				        	if(defaultValues.keySet().contains(col)) {
    							getField(col).setValueMap((String[]) defaultValues.get(col).toArray());
    			        		}
    			        	}
    			        	setClientOnly(true);          
    				}
    				else {
    					SC.say("Error while retrieving values : " + result.getMessage());
    				}
    			}
     
    			public void onFailure (Throwable caught) {
    				if (caught instanceof ServiceSecurityException) {
    					SC.say("You do not have enough privilege to carry out the operation!");
    				}
    				else {
    					SC.say("An exception occured on server side :"+caught.getMessage());
    				}
    			}
    		});
     
    	}
    Mais là c'est étrange car si tout se passe bien à l'écran (comprend l'Affichage de la table se fait bien), les méthodes setFields() et surtout getFieldNames() se comportent bizarement. setFields() semble donc marcher très bien mais le get lui me retourne jamais rien. En même temps je me demande bien comment cela peut marcher vu que ça se trouve à l'intérieur d'une classe interne d'un callback à un service... Certes dans la classe de l'objet à créer mais quand même j'ai du mal à comprendre. Enfin, le get marche pas lui en tout cas, ce qui a tendence à me "rassurer"

    Troisième méthode testée : l'écriture d'une méthode init. Je crée ma DataSource juste avec un ID puis j'appelle une méthode init en passant en paramètre ma DataSource mais ça n'a pas eu plus de succès.

    Alors voila, j'ai vraiment l'impression de m'y prendre de travers et que en fait ça doit être super simple, mais je trouve pas alors si quelqu'un passe par là et à déjà fait ce genre de choses, je suis preneur d'infos

  2. #2
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Par défaut
    Personne n'a jamais fait ça ? J'y crois pas

  3. #3
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    Je n'utilise pas smartGwt, désolé

  4. #4
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Par défaut
    Ok, après avoir bien cherché et tenté pas mal tout, j'ai trouvé une solution. Tout d'abord, il faut savoir que ce que je veux faire (utiliser le setValueMap) est buggé dans la version courrante de smartGWT ( http://forums.smartclient.com/showthread.php?t=15010 ).

    Partant de là, j'ai tout tenté : les modifications dans le callback, après, avant, pendant... J'en était réduis à écouter Fatal Bazooka en boucle, ça a été un dur moment de ma vie

    Au final, la seule chose qui a marché c'est de faire en sorte que mes valeurs par défaut soient récupérées bien avant. Donc deux possibilités :
    1 - mettre ça dans un cache global de l'application chargé au démarrage de celle-ci. Comme ça on est sûr, en tout temps on a accès aux valeurs. Il faut juste gérer la modifications de celles-ci pour être sûr d'être toujours up to date.

    2 - ce que j'ai choisi de faire : appeler mon service qui récupère mes valeurs dans le onModuleLoad() direct, et dans le callback du service j'initialise ma vue si tout s'est bien passé (sinon, message d'erreur).

    Voila, je trouve pas ça super propre mais c'est la seule solution que j'ai trouvé et ça marche

Discussions similaires

  1. Recuperer une liste (List) de valeur depuis une autre classe
    Par PasBoueno dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 22/07/2008, 14h53
  2. [POO] Récupération liste clef valeur depuis une applet
    Par Phoxtrot dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/04/2008, 12h59
  3. [BO 6.5] : Liste de valeurs dans une invite
    Par norel77 dans le forum Débuter
    Réponses: 17
    Dernier message: 10/12/2007, 15h54
  4. [Debutant]Remplacer une liste de valeur par une liste de val
    Par Sebbo dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 31/03/2006, 12h15
  5. [MySQL] Problème d'initialisation de la valeur dans une table
    Par priazu dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 27/02/2006, 02h00

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