Récupérer champ "code héritier de"

Bonjour,

Dans les objets métiers, il existe un champ récupérant un autre objet métier afin de la paramétrer en tant que classe mère
IHM
Le champ s’appelle “code héritier de” et a pour nom technique “obo_extend_id.obj_name”

Voici mon code:


Je créé un objet métier temporaire qui contiendra les informations de mon objet métier, tout cela pour essayer de récuperer le nom de cette classe mère

Mais dans les logs, on peut voir que:


Mon objet temporaire à bien les informations de mon objet, cependant il ne reconnait pas l’existance du champ “code héritier de”, existe-t-il une méthode qui permet de récupérer ce champ ou bien il faut passer par d’autres moyens ?

[Platform]
Status=OK
Version=4.0.P24
BuiltOn=2020-02-07 16:09 (revision ea94fc67a50c2ecd9e359d5199574f3458e2a7f6)
DBPatchLevel=P24;ea94fc67a50c2ecd9e359d5199574f3458e2a7f6

Cordialement,
KWu

Il y a confusion entre l’objet et les metadonnées de l’objet = les attributs de l’objet système ObjectInternal ne sont bien entendu pas accessible depuis votre objet BCSISubFinalityLov

Mais bon, de manière générale vous ne devriez jamais avoir à utiliser les objets système de la plateforme.

En fait je ne comprend pas le besoin qui se cache derrière votre demande…

Bonjour,

Mon intention était de récupérer le nom de l’objet père (ici ce qui est présent dans dans "obo_extend_id.obj_name) afin de pouvoir avoir les traductions que celui-ci possède et partage avec l’objet fils (ici BCSISubFinalityLov) en passant par les object field translate
Si il existe un autre moyen de faire celà, je suis tout ouïe

Cordialement,
KWu

Votre objet fils hérite de tout ce qui est paramétré au niveau de l’objet père (notamment les attributs et leurs traductions)

Il n’y a donc aucune raison d’aller fouiller dans les objets système pour ça.

Cela doit allumer un voyant “warning”=> si vous pensez devoir utiliser des objets système il y a 99% de chances pour que ça ne soit pas la bonne approche.

Bonjour,

Dans ce cas là, quel serait la bonne méthode dans la méthode fils afin de pouvoir récupérer la traduction d’attribut d’objet de l’objet père ?

Cordialement,
KWu

La bonne question est pourquoi auriez vous besoin de récupérer la traduction de l’objet père ?

Les utilisateurs ont la possibilité de changer la langue de certains objets présent dans le projet, ces traductions sont présentes dans la traduction d’attribut d’objet, cependant certains de ces objets ont des attributs venant d’un objet père que je n’ai pas pu récupérer

Cordialement,
KWu

Votre besoin est quelque chose auquel je n’ai jamais été confronté…

Pour être sûr de bien comprendre vous voulez, au sein d’une session utilisateur, pouvoir afficher les traductions d’un objet et de ses attributs dans une langue ou une autre à la demande, c’est ça ?

Comment avez vu envisagé la bascule entre langue, par une action avec paramètre ?

En tout état de cause pour y répondre il faut passer par les APIs Java “bas niveau” de Simplicité (CoreCache, etc), certainement pas en allant manipuler directement des objets système.

Exactement, un utilisateur a la possibilité de choisir une des langues disponible dans la liste de choix possible puis valider ce choix, puis en clquant sur le bouton de validation, l’objet se recharge avec la langue choisie

Pour le coup je me trompe peut-être en essayant d’aller vers les objets systemes mais du coup quelle serait la méthode adaptée afin de récupérer la traduction d’un attribut d’objet, que l’attribut soit dans l’objet père ou bien dans l’objet fils ?

Cordialement,
KWu

Ok la langue est un attribut de l’objet; en fonction de la valeur de cet attribut les libellés s’affichent dans la la,gue sélectionné c’est ça ?

J’essaie de bien comprendre le besoin pour voir quelle(s) APIs “bas niveau” il faudra utiliser. En effet au niveau du core cache Simplicité on a les traductions dans toutes les langues mais dans la session on ne récupère que les traductions dans la langue du user. En tout cas réinventer ce que fait déjà l’object loader en tapant sur les objets systèmes n’est clairement pas la bonne approche.

La langue n’est pas un attribut de l’objet, quand l’utilisateur entre dans un objet, il peut soit laisser la langue par défaut, soit choisir une langue dans une liste afin de l’appliquer sur l’objet où il travail
Les langues font parti de la liste de langue que l’on a créé pour les traductions
par exemple:


L’utilisateur a le droit d’alterner dans l’objet BCSIAppPerson, l’attribut usr_login en Français, en Anglais ou bien dans une langue qu’on appelle le BIM

Pour cela j’ai besoin de savoir comment avoir la traduction d’un attribut d’objet, que l’attribut soit dans l’objet actuel ou bien dans l’objet père, ou le cas échéant, récupérer juste le nom de l’objet père qui se trouve dans “code héritier de”

De ce que je vois la langue est bien un attribut de votre objet… Merci de clarifier.

Pour le reste ne restez pas bloqué sur votre approche où vous essayez de refaire - en moins bien - ce que fait déjà l’object loader. Ici la solution c’est, je pense, juste de recharger la définition de l’objet dans la langue du record sur lequel on se trouve. Je suis en train de regarder comment faire (mais je voudrais être sûr de la réponse à ma question sur le fait que la langue est bien, comme je le pense, un des attributs de votre objet)

De manière générale quand vous sollicitez notre support il vaut mieux nous exprimer votre besoin plutôt que poser une question fermée sur un point de détail d’une solution qui n’est peut être pas du tout la bonne approche.

Pour le coup, la langue est un champ que l’on avait pas créer nous même mais utiliser ce qui était existant dans Simplicité, si Simplicité considère ce champ comme un attribut d’objet, dans ce cas, oui c’est un attribut d’objet

Bon OK cet attribut est un des attributs de votre objet, peu importe que ça soit un attribut déjà existant ou paramétré spécifiquement pour votre objet, là n’est pas le débat…

Voici mon approche:

J’ai un objet avec un attribut langue:

Quand j’ouvre le record “aaa” les libellés sont en anglais:

Quand j’ouvre le record “bbb” les libellés sont en français:

Et voici le code de cet objet:

public class AppObject1 extends ObjectDB {
	private static final long serialVersionUID = 1L;
	
	private void reload(String lang) {
		Grant g = getGrant();
		String l = g.getLang(); // Keep user's language
		g.setLang(lang); // Force user's language to object record's language
		setData(null); // Flush object's data
		load(g); // Reload object's definition
		g.setLang(l); // Restore user's language
	}

	@Override
	public void initList(ObjectDB parent) {
		ObjectFieldSearch[] filters = getFilters(); // Keep filters
		reload(getGrant().getLang());
		setFilters(filters); // Restore filters
	}
	
	@Override
	public void initCreate() {
		reload(getGrant().getLang());	
	}
	
	@Override
	public void initCopy() {
		initCreate();
	}

	@Override
	public void initUpdate() {
		String lang = getFieldValue("appObj1Lang");
		if (Tool.isEmpty(lang))
			lang = getGrant().getLang();
		String rowId = getRowId(); // Keep current record's row ID
		reload(lang);	
		select(rowId); // Re-select record
	}
}

Ca vous convient ?

SI je comprend bien votre code, vous changez temporairement la langue de la session le temps d’afficher l’objet, n’existe-il pas une méthode plus simple qui permettrait de recupérer la traduction d’un attribut si on lui donne le nom de l’attribut et une langue en paramètre ?

Mon approche qui consiste à recharger la définition de l’objet dans la langue du record ouvert en update (et d’utiliser la langue du user dans les autres cas) est clairement la bonne approche.

Vous avez une vision beaucoup trop restrictive de votre besoin: les “traductions” c’est pas uniquement les libellés des attributs c’est aussi la traduction de l’objet, les traductions des zones d’attributs, les différentes aides (aide globale, contextuelles, aides d’attributs, tooltips, placeholders, etc.):


vs

Bien entendu il serait possible d’optimiser mon code pour ne recharger la définition que si la langue du record ouvert n’est pas la langue du record précédement ouvert. etc. Je peux améliorer mon code pour cela si vous ne voyez pas comment faire.

Voilà une version un peu optimisée du code:

public class AppObject1 extends ObjectDB {
	private static final long serialVersionUID = 1L;
	
	private String currentLang = null;
	
	private void reload(String lang) {
		if (lang.equals(currentLang))
			return; // Optimization
		Grant g = getGrant();
		synchronized (g) {
			AppLog.info(getClass(), "reload", "Reloading " + getName() + " definition for " + lang, g);
			String l = g.getLang(); // Keep user's language
			g.setLang(lang); // Force user's language to object record's language
			setData(null); // Flush object's data
			load(g); // Reload object's definition
			currentLang = lang; // Store current object definition's language for optimization
			g.setLang(l); // Restore user's language
		}
	}

	@Override
	public void postLoad() {
		if (currentLang == null)
			currentLang = getGrant().getLang();	// Default current language
	}
	
	@Override
	public void initList(ObjectDB parent) {
		ObjectFieldSearch[] filters = getFilters(); // Keep filters
		reload(getGrant().getLang());
		setFilters(filters); // Restore
	}
	
	@Override
	public void initCreate() {
		reload(getGrant().getLang());	
	}
	
	@Override
	public void initCopy() {
		initCreate();
	}

	@Override
	public void initUpdate() {
		String lang = getFieldValue("appObj1Lang");
		if (Tool.isEmpty(lang))
			lang = getGrant().getLang();
		String rowId = getRowId(); // Keep current record's row ID
		reload(lang);	
		select(rowId); // Re-select record
	}
}