Merger des objets par code

Request description

Bonjour,

Pour mettre en place une mécanique de Rollback, j’essaie de merger deux instances par code Java, mais je tombe sur l’erreur ACCESS_DENIED.
Auriez-vous des exemples d’utilisation de cette méthode ?

Merci !
Emmanuelle

	public void restore()
	{
		AppLog.info(getClass(), "EFE ", "Restore", getGrant());
		
		this.setFieldValue("rciAppIsBackup", false);
		this.setFieldValue("rciAppOriginAppId", null);
		this.save();
		
		List<String> appToRollback = new ArrayList<String>();
		appToRollback.add(this.getFieldValue("rciAppOriginAppId"));
		
		List<String> msg = this.merge(appToRollback, null);
		if (msg != null)
			AppLog.info(getClass(), "EFE2 Restore ", msg.get(0), getGrant());
		

	}

Bonjour,

Voici la condition d’accès au merge :

  • Liste d’ids à fusionner non vide
  • Droit de mise à jour et de suppression sur l’objet (pour modifier l’objet et détruire les autres après fusion)
  • Objet “mergeable” : en cochant l’option sur l’objet ou par code via setMergeable(true)

Merci de ta réponse rapide, j’ai bien tout ça :frowning: mais quand même le ACCESS_DENIED.
Quand je fais le merge manuellement, ça fonctionne.

Voici l’extrait qui retourne ACCESS_DENIED :

// Mergeable ?
if (Tool.isEmpty(ids) || !obj.isMergeable() || !g.accessUpdate(name) || !g.accessDelete(name)) {
	msg.raiseError("ACCESS_DENIED");
	return msg;
}

Teste chaque condition dans ton code avant d’appeler le merge.

Autres pistes :

  • il faut que les lignes soient sélectionnables sinon setMergeable(true) ne fera rien
    Que vaut canSelectRow ? sinon force un setSelectRow(true)

  • As-tu codé le hook isMergeEnable ?

1 Like

Merci, le problème venait du fait que j’avais mis le bouton merge en hidden.
Par contre je n’ai plus l’erreur mais le merge ne fonctionne pas. Dans les ids, faut-il mettre aussi l’objet en cours ou seulement ceux à supprimer ? Est-ce que ça pose problème que j’aie null dans le 2ème paramètre ?

Normalement, il faut lister les Ids à merger avec le record courant, fait un select sur le row_id principal à garder avant.

Les paramètres indiquent quoi garder de quels objets par attributs (ex attributX=2 indique de garder la valeur du 2eme objet pour l’attributX, 0=objet principal) et par links. S’il est vide rien ne mergera.

Override la méthode pour voir ce que ça contient en passant par la UI.

/**
 * Merge all records and links
 * @param ids Row IDs to merge in the current object
 * @param map Id indexes per field (keep current value when absent) and per link (removed if absent, moved if present)
 * @param linkIds optional explicit IDs per link and index to preserve
 * @return Error codes or null
 */
public List<String> merge(List<String> ids, Map<String, List<Integer>> map, JSONObject linkIds) {
  AppLog.info("merge map=" + map, null);
  AppLog.info("linkIds=" + linkIds, null);
  //return super.merge(ids, map, linkIds);
  return null; // test params only
}

En 5.2.36 je n’ai pas les linkedIds dans la signature, mais en surchargeant avec les deux premiers paramètres je vois qu’avec l’UI le merge est appelé deux fois : une à l’affichage de l’écran de comparaison avec le map = null, et une ensuite avec le map renseigné pour tous les links.
En renseignant le map par code j’ai l’impression que le merge fonctionne aussi, je ferai plus de tests demain pour confirmer.
Merci pour ton aide !

  • Oui le 1er appel avec map = null est pour vérifier que les Ids sélectionnés sont mergeables par code / appel de isMergeEnable avec les Ids sélectionnés. Ca permet de ne pas autoriser de fusionner certaines lignes entre elles.
  • Enusite lorsque map est non null, c’est que l’utilisateur a coché les éléments à garder (attributs et relations)

linkIds est une évolution 5.3 qui permet de dire explicitement quelles liens/reférences on garde ou pas (par exemple que certaines adresses d’une personne). En 5.2, la map ne permet que de dire qu’on garde ou pas l’ensemble des relations d’un objet référencé donné d’un Id (toutes les adresses ou aucune pour chaque homonyme de la personne).

C’est tout bon, merci pour ton aide !

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