Récupérer des champs ramenés par code

Request description

Bonjour,

J’ai l’objet métier ci-dessous :
image

Dans le code, je crée un nouvel objet DdvFndPart et je set les 2 ID ddvFndpartPartId et ddvFndpartFndId. Le reste ne sont que des champs ramenés.

Le problème, c’est que ces champs, ne sont pas ramenés dans 95% des cas même avec le populate(true). Il y a que quelques exception ou ils sont ramenés (étrange).

Voici ce que j’obtiens :


Voici ce que je devrais obtenir :

Le nom et l’ID du fond sont correcte, donc je ne comprends pas pourquoi le nom de l’équipe et de la SGP ne sont pas ramenés.

Voici le code :

ObjectDB inv = g.getTmpObject("DdvFndPart");
BusinessObjectTool invOt = inv.getTool();
	
String fundId = getGrant().simpleQuery("SELECT row_id FROM ddv_fund WHERE ddv_fund_key = '" + rs.getString(1) + "'");
	
if(!fundId.equals("") && fundId != null){
	
	invOt.getForCreateOrUpdate(new JSONObject().put("ddvFndpartFndId", fundId).put("ddvFndpartPartId", o.getRowId()));
	
	inv.setFieldValue("ddvFndpartPartId", o.getRowId());
	inv.setFieldValue("ddvFndpartFndId", Integer.parseInt(fundId));
	
	inv.populate(true);
	
	invOt.validateAndSave();
}

Quelle peut être l’origine du problème selon vous ?

Technical information

Instance /health
[Platform]
Status=OK
Version=5.2.2
BuiltOn=2022-04-29 15:38
Git=5.2/a2c69b2ee78658770a248e617730e607252990ca
Encoding=UTF-8
EndpointIP=10.201.58.66
EndpointURL=http://siparex-simplicite-dev-777bcd4cfc-dqxdr:8080
TimeZone=Europe/Paris
SystemDate=2022-05-10 10:02:31
Simplicité logs
NA

Bonjour,

Cette capture d’écran correspond à un formulaire de mise à jour ?

Comment appelez-vous ce code ?

C’est une action en liste qui appel la méthode suivante :

public void synchronizePartFromCv(){
	Grant g = getGrant();
	
	JSONObject cfg = Grant.getSystemAdmin().getJSONObjectParameter("DSSiparex100");
	try {
		Class.forName(cfg.getString("driver"));
		Connection conn = DriverManager.getConnection("jdbc:" + cfg.getString("url"),cfg.getString("username"),cfg.getString("password"));
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("SELECT g.FundKey, g.ParticipationName, p.Street, p.City, p.postalCode, p.Country FROM capitalventure.CVFundParticipation_Situation g INNER JOIN capitalventure.CVParticipation p ON p.ParticipationKey = g.ParticipationKey WHERE g.CurrentInvestmentAmount <> 0");
		while(rs.next()){
			ObjectDB o = g.getTmpObject("DdvParticipation");
			BusinessObjectTool ot = o.getTool();
			
			if(!rs.getString(2).equals("") && rs.getString(2) != null){
				
				String adress = "";
				
				if(!rs.getString(3).equals("") && rs.getString(3) != null && !rs.getString(4).equals("") && rs.getString(4) != null && !rs.getString(5).equals("") && rs.getString(5) != null){
					adress = rs.getString(3) + ", " + rs.getString(5) + " " + rs.getString(4);
				}
				else {
					adress = "-------- ADRESSE INCOMPLETE SOUS CAPITAL VENTURE (RUE et/ou CODE POSTAL et/ou VILLE) --------";
				}
				
				ot.getForCreateOrUpdate(new JSONObject().put("ddvPartName", rs.getString(2)));
				
				o.setFieldValue("ddvPartName", rs.getString(2));
				o.setFieldValue("ddvPartAddress", adress);
				ot.validateAndSave();
				
				if(!rs.getString(1).equals("") && rs.getString(1) != null){
					ObjectDB inv = g.getTmpObject("DdvFndPart");
					BusinessObjectTool invOt = inv.getTool();
					
					String fundId = getGrant().simpleQuery("SELECT row_id FROM ddv_fund WHERE ddv_fund_key = '" + rs.getString(1) + "'");
					
					if(!fundId.equals("") && fundId != null){
						
						invOt.getForCreateOrUpdate(new JSONObject().put("ddvFndpartFndId", fundId).put("ddvFndpartPartId", o.getRowId()));
						
						String fundName = getGrant().simpleQuery("SELECT ddv_fnd_name FROM ddv_fund WHERE ddv_fund_key = '" + rs.getString(1) + "'");
						AppLog.info("==================== fund id : " + fundId, getGrant());
						AppLog.info("==================== fund name : " + fundName, getGrant());
						
						inv.setFieldValue("ddvFndpartPartId", o.getRowId());
						inv.setFieldValue("ddvFndpartFndId", Integer.parseInt(fundId));
						
						inv.populate(true);
						
						invOt.validateAndSave();
					}
				}
			}
		}
	} catch(Exception e){
		AppLog.error(e, g);
	}
}

Oui, c’est pour montré que après la création de mes objets via le code, les champs qui devraient être remontés ne le sont pas.
L’effet qui en découle c’est que même si le fonds est correcte, lorsque je clique sur la petite flèche à coté de la loupe pour me rendre vers le fonds en question (XAD 3 ici), je ne peux pas y accéder avec cette alerte :
image

Or il existe, et j’y ai bien accès manuellement :

Est-ce que vous avez implémenté des searchspec sur ces objets ?

Oui, comme je suis sur un compte DDV_SUPERADMIN, voici la searchspec de DdvParticipation et DdvFund (DdvFndPart n’a pas de searchspec) :


Et DdvTeam ?

Il semblerait qu’il ait un problème pour remonter l’id de l’équipe.

Tout à fait. Je tiens à préciser que 95% des cas de création de DdvFndPart ont ce problème. Mais il y en a quelque un qui fonctionnent sans trop savoir pourquoi.
Exemple de rare cas où ça fonctionne :

Si je crée manuellement DdvFndPart via le formulaire tout fonctionne, peut importe le fonds que je choisi. Tous les champs sont ramenés. C’est uniquement via le code que j’ai ce soucis.

Il semblerait que vous ayez un problème au niveau de vos données cf la capture d’écran : 2 lignes différentes avec la même clé ddv_fund_key. Je vous invite à faire le ménage et à retester.

J’ai rejoué une des requêtes sql faite par la plateforme lors de l’affichage d’un formulaire de l’objet “Investir” :

select t.row_id, t.ddv_fndpart_part_id, t_ddvFndpartPartId.ddv_part_name, t.ddv_fndpart_fnd_id, t_ddvFndpartFndId.ddv_fnd_name, t_ddvFndpartFndId.ddv_fnd_tm_id, t_ddvFndTmId.ddv_tm_name, t_ddvFndTmId.ddv_tm_sgp_id, t_ddvTmSgpId.ddv_sgp_name, t.created_dt, t.created_by, t.updated_dt, t.updated_by from ddv_fnd_part t left outer join ddv_participation t_ddvFndpartPartId on (t.ddv_fndpart_part_id=t_ddvFndpartPartId.row_id) left outer join ddv_fund t_ddvFndpartFndId on (t.ddv_fndpart_fnd_id=t_ddvFndpartFndId.row_id) left outer join ddv_team t_ddvFndTmId on (t_ddvFndpartFndId.ddv_fnd_tm_id=t_ddvFndTmId.row_id) left outer join ddv_sgp t_ddvTmSgpId on (t_ddvFndTmId.ddv_tm_sgp_id=t_ddvTmSgpId.row_id) where (t.row_id=15474) order by t.ddv_fndpart_fnd_id asc, t.row_id;

Merci beaucoup,

La ligne avec l’ID 754 est une ancienne ligne dans la BDD (on utilise plus ddv_fnd_team_id mais on utilise plutôt ddv_fnd_tm_id).

Comme je n’ai plus accès à cette ligne dans mon objet, est ce une bonne pratique de directement supprimer les lignes depuis l’accès BDD de Simplicité ?

DELETE FROM ddv_fund

Vous récupérez le row_id du Fond en faisant une recherche sur ddv_fund_key, cette requête va retourner la première ligne qu’il trouve, en l’occurence, le record auquel vous n’avez plus accès.

Oui vous pouvez faire un DELETE FROM ddv_fund

1 Like

Merci beaucoup, en supprimant toutes les lignes, le problème est réglé.

Comme le nom du champ de la FK concernant DdvTeam dans DdvFund a changé, je n’ai pas pensé à supprimer les enregistrements avant de faire la modification, et après cette modification comme les enregistrements n’apparaissaient plus dans l’objet, je ne savais plus qu’ils étaient toujours présents.

PS : je n’ai pas d’accès directe à notre BDD à part sous Simplicité

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.