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).
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 :
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;
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é ?
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.
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é