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