Erreur : Unable to get row ID

Bonjour,

J’ai créé un nouvel objet “ImmoStrategyInvestor”.
Quand j’essaie d’enregistrer, j’obtiens l’erreur suivante :

La clé est alimentée avec la valeur par défaut :

[EXPR:Tool.format("STRA-%05d", Long.valueOf([ROWID]))]

C’est le même style de formule qui est utilisée dans tous nos objets.
Même si je vire la formule, l’erreur est la même.

Pourriez-vous m’aider svp ?
Merci d’avance.
Abed.

Y a-t-il du code et/ou des champs avec des valeurs par défaut ou des expressions calculées ?

Complement => je veux dire sur d’autre champs que celui que vous utilisez comme clé fonctionnelle ?

Merci de nous exporter le paramétrage complet de votre objet

Non, il n’y a pas de code.
La clé est alimentée avec la valeur par défaut :


[EXPR:Tool.format("STRA-%05d", Long.valueOf([ROWID]))]

C’est le même style de formule qui est utilisée dans tous nos objets.
Même si je vire la formule, l’erreur est la même.

Pas d’autre champs avec expressions ? Pas de contraintes ?

Mettez nous le paramétrage complet de votre objet (export XML Simplicite)

Non, pas de champ avec expression ni de contrainte.
Voici le xml de l’objet :

<?xml version="1.0" encoding="UTF-8"?>
<simplicite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.simplicite.fr/base" xsi:schemaLocation="http://www.simplicite.fr/base http://www.simplicite.fr/schemas/base.xsd">
<object>
	<name>ObjectInternal</name>
	<action>upsert</action>
	<data>
		<obo_name>ImmoStrategyInvestor</obo_name>
		<obo_dbtable>immo_strategy_investor</obo_dbtable>
		<obo_class/>
		<obo_script_id/>
		<obo_usets>1</obo_usets>
		<obo_nosearch>1</obo_nosearch>
		<obo_comment/>
		<obo_type>O</obo_type>
		<obo_searchspec/>
		<obo_delspec/>
		<obo_exportorder>370</obo_exportorder>
		<obo_distinct>0</obo_distinct>
		<obo_indexable>0</obo_indexable>
		<obo_dfltref/>
		<obo_template_id.tpl_name>ImmoStrategyInvestor</obo_template_id.tpl_name>
		<obo_cache>D</obo_cache>
		<obo_copy>1</obo_copy>
		<obo_export>1</obo_export>
		<obo_pagine>1</obo_pagine>
		<obo_srh_predef>1</obo_srh_predef>
		<obo_selrow>1</obo_selrow>
		<obo_updall>1</obo_updall>
		<obo_delall>1</obo_delall>
		<obo_listsearch>1</obo_listsearch>
		<obo_list_edit>N;L;E</obo_list_edit>
		<obo_useform>1</obo_useform>
		<obo_title/>
		<obo_icon/>
		<obo_refcount>0</obo_refcount>
		<obo_tree>0</obo_tree>
		<obo_viewmode>T</obo_viewmode>
		<obo_historic>0</obo_historic>
		<obo_printable>1</obo_printable>
		<obo_followlink>1</obo_followlink>
		<obo_mergeable>0</obo_mergeable>
		<obo_social>1</obo_social>
		<obo_rowid_id.fld_name/>
		<obo_extend_id.obj_name/>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
		<obo_btn_reload>P</obo_btn_reload>
		<obo_btn_prefs>P</obo_btn_prefs>
		<obo_btn_del>P</obo_btn_del>
		<obo_btn_copy>P</obo_btn_copy>
		<obo_btn_export>P</obo_btn_export>
		<obo_btn_listadd>1</obo_btn_listadd>
		<obo_btn_listedit>1</obo_btn_listedit>
		<obo_btn_updall>P</obo_btn_updall>
		<obo_btn_delall>P</obo_btn_delall>
		<obo_btn_merge>P</obo_btn_merge>
		<obo_btn_save>1</obo_btn_save>
		<obo_btn_saveclose>1</obo_btn_saveclose>
		<obo_btn_close>1</obo_btn_close>
	</data>
</object>
<object>
	<name>Function</name>
	<action>upsert</action>
	<data>
		<fct_name>ImmoStrategyInvestor-C</fct_name>
		<fct_object_id.obj_name>ImmoStrategyInvestor</fct_object_id.obj_name>
		<fct_function>C</fct_function>
		<fct_action_id.act_name/>
		<fct_view_id.viw_name/>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>Grant</name>
	<action>upsert</action>
	<data>
		<grt_group_id.grp_name>IMMO_INVESTISSEUR</grt_group_id.grp_name>
		<grt_function_id.fct_name>ImmoStrategyInvestor-C</grt_function_id.fct_name>
		<fct_object_id.obj_type>O</fct_object_id.obj_type>
		<fct_object_id.obj_name>ImmoStrategyInvestor</fct_object_id.obj_name>
		<fct_action_id.act_name/>
		<grt_function_id.fct_function>C</grt_function_id.fct_function>
		<grt_activ>1</grt_activ>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>Function</name>
	<action>upsert</action>
	<data>
		<fct_name>ImmoStrategyInvestor-CU</fct_name>
		<fct_object_id.obj_name>ImmoStrategyInvestor</fct_object_id.obj_name>
		<fct_function>CM</fct_function>
		<fct_action_id.act_name/>
		<fct_view_id.viw_name/>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>Grant</name>
	<action>upsert</action>
	<data>
		<grt_group_id.grp_name>IMMO_UTILISATEURS</grt_group_id.grp_name>
		<grt_function_id.fct_name>ImmoStrategyInvestor-CU</grt_function_id.fct_name>
		<fct_object_id.obj_type>O</fct_object_id.obj_type>
		<fct_object_id.obj_name>ImmoStrategyInvestor</fct_object_id.obj_name>
		<fct_action_id.act_name/>
		<grt_function_id.fct_function>CM</grt_function_id.fct_function>
		<grt_activ>1</grt_activ>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>Function</name>
	<action>upsert</action>
	<data>
		<fct_name>ImmoStrategyInvestor-CUD</fct_name>
		<fct_object_id.obj_name>ImmoStrategyInvestor</fct_object_id.obj_name>
		<fct_function>CMS</fct_function>
		<fct_action_id.act_name/>
		<fct_view_id.viw_name/>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>Grant</name>
	<action>upsert</action>
	<data>
		<grt_group_id.grp_name>IMMO_ADMIN</grt_group_id.grp_name>
		<grt_function_id.fct_name>ImmoStrategyInvestor-CUD</grt_function_id.fct_name>
		<fct_object_id.obj_type>O</fct_object_id.obj_type>
		<fct_object_id.obj_name>ImmoStrategyInvestor</fct_object_id.obj_name>
		<fct_action_id.act_name/>
		<grt_function_id.fct_function>CMS</grt_function_id.fct_function>
		<grt_activ>1</grt_activ>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>Function</name>
	<action>upsert</action>
	<data>
		<fct_name>ImmoStrategyInvestor-R</fct_name>
		<fct_object_id.obj_name>ImmoStrategyInvestor</fct_object_id.obj_name>
		<fct_function>L</fct_function>
		<fct_action_id.act_name/>
		<fct_view_id.viw_name/>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>Grant</name>
	<action>upsert</action>
	<data>
		<grt_group_id.grp_name>IMMO_LOCATAIRE</grt_group_id.grp_name>
		<grt_function_id.fct_name>ImmoStrategyInvestor-R</grt_function_id.fct_name>
		<fct_object_id.obj_type>O</fct_object_id.obj_type>
		<fct_object_id.obj_name>ImmoStrategyInvestor</fct_object_id.obj_name>
		<fct_action_id.act_name/>
		<grt_function_id.fct_function>L</grt_function_id.fct_function>
		<grt_activ>1</grt_activ>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>TranslateObject</name>
	<action>upsert</action>
	<data>
		<tsl_typeObject>O</tsl_typeObject>
		<tsl_id.obo_name>ImmoStrategyInvestor</tsl_id.obo_name>
		<tsl_lang>ENU</tsl_lang>
		<tsl_value>Immo strategy investor</tsl_value>
		<tsl_help/>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>TranslateObject</name>
	<action>upsert</action>
	<data>
		<tsl_typeObject>O</tsl_typeObject>
		<tsl_id.obo_name>ImmoStrategyInvestor</tsl_id.obo_name>
		<tsl_lang>FRA</tsl_lang>
		<tsl_value>Stratégie investisseur</tsl_value>
		<tsl_help/>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvId</obf_field_id.fld_name>
		<obf_field_id.fld_type>3</obf_field_id.fld_type>
		<obf_order>10</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault><![CDATA[[EXPR:Tool.format("STRA-%05d", Long.valueOf([ROWID]))]]]></obf_field_id.fld_dfault>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvHorizon</obf_field_id.fld_name>
		<obf_field_id.fld_type>7</obf_field_id.fld_type>
		<obf_order>20</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault><![CDATA[LT]]></obf_field_id.fld_dfault>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvGeoArea</obf_field_id.fld_name>
		<obf_field_id.fld_type>7</obf_field_id.fld_type>
		<obf_order>30</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault><![CDATA[10]]></obf_field_id.fld_dfault>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvTypeAsset</obf_field_id.fld_name>
		<obf_field_id.fld_type>7</obf_field_id.fld_type>
		<obf_order>40</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvContribuI</obf_field_id.fld_name>
		<obf_field_id.fld_type>2</obf_field_id.fld_type>
		<obf_order>50</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvContribuU</obf_field_id.fld_name>
		<obf_field_id.fld_type>2</obf_field_id.fld_type>
		<obf_order>60</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvContribuPerI</obf_field_id.fld_name>
		<obf_field_id.fld_type>2</obf_field_id.fld_type>
		<obf_order>70</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvContribuPerU</obf_field_id.fld_name>
		<obf_field_id.fld_type>2</obf_field_id.fld_type>
		<obf_order>80</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvCoinvest</obf_field_id.fld_name>
		<obf_field_id.fld_type>8</obf_field_id.fld_type>
		<obf_order>90</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvStrippingUp</obf_field_id.fld_name>
		<obf_field_id.fld_type>8</obf_field_id.fld_type>
		<obf_order>100</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvTaxReduction</obf_field_id.fld_name>
		<obf_field_id.fld_type>8</obf_field_id.fld_type>
		<obf_order>110</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvTargetCapitalI</obf_field_id.fld_name>
		<obf_field_id.fld_type>2</obf_field_id.fld_type>
		<obf_order>120</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvTargetCapitalA</obf_field_id.fld_name>
		<obf_field_id.fld_type>2</obf_field_id.fld_type>
		<obf_order>125</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvExpectIncomeI</obf_field_id.fld_name>
		<obf_field_id.fld_type>2</obf_field_id.fld_type>
		<obf_order>130</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvExpectIncomeA</obf_field_id.fld_name>
		<obf_field_id.fld_type>2</obf_field_id.fld_type>
		<obf_order>135</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvNbrOperationI</obf_field_id.fld_name>
		<obf_field_id.fld_type>1</obf_field_id.fld_type>
		<obf_order>140</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>ObjectFieldSystem</name>
	<action>upsert</action>
	<data>
		<obf_object_id.obo_name>ImmoStrategyInvestor</obf_object_id.obo_name>
		<obf_field_id.fld_name>strategInvNbrOperationA</obf_field_id.fld_name>
		<obf_field_id.fld_type>1</obf_field_id.fld_type>
		<obf_order>145</obf_order>
		<obf_dfault_order/>
		<obf_input/>
		<obf_ref_field_id.fld_name/>
		<obf_ref_object_id.obo_name/>
		<obf_cascad/>
		<obf_card/>
		<obf_visible/>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy/>
		<obf_ref_order/>
		<obf_fld_visible/>
		<obf_fld_required/>
		<obf_fld_updatable/>
		<obf_fld_research/>
		<obf_fld_more/>
		<obf_fld_listmore/>
		<obf_fld_researchreq/>
		<obf_fld_dfault/>
		<obf_field_id.fld_dfault/>
		<obf_area_id.ofa_name>ImmoStrategyInvestor-1</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>1</obf_area_id.ofa_position>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
	</data>
</object>
<object>
	<name>Link</name>
	<action>upsert</action>
	<data>
		<obf_ref_object_id.obo_name>ImmoStrategyInvestor</obf_ref_object_id.obo_name>
		<obf_order>500</obf_order>
		<obf_ref_order/>
		<obf_object_id.obj_name>ImmoInvestor</obf_object_id.obj_name>
		<obf_field_id.fld_name>invImmoStrategyInvestorId</obf_field_id.fld_name>
		<obf_field_id.fld_updatable>1</obf_field_id.fld_updatable>
		<obf_field_id.fld_required>1</obf_field_id.fld_required>
		<obf_field_id.fld_fonctid>0</obf_field_id.fld_fonctid>
		<obf_cascad>R</obf_cascad>
		<obf_card>1,1</obf_card>
		<obf_visible>1</obf_visible>
		<obf_ref_export>1</obf_ref_export>
		<obf_copy>0</obf_copy>
		<obf_query/>
		<obf_associate/>
		<obf_field_id.fld_dbname>inv_immostrategy_investor_id</obf_field_id.fld_dbname>
		<obf_inline>0</obf_inline>
		<row_module_id.mdl_name>Immo</row_module_id.mdl_name>
		<obf_area_id.ofa_name>ImmoInvestor-12</obf_area_id.ofa_name>
		<obf_area_id.ofa_position>12</obf_area_id.ofa_position>
	</data>
</object>
</simplicite>

OK on va regarder dans le detail et on vous tient au courant.

Cela dit, suite à nos différents échanges sur le sujet, je m’interroge sur votre usage fréquent de champs unique clé fonctionnelle calculés à partir le row ID…

Dans la plupart des cas un objet métier contient déjà une combinaison de données métier qui constituent sa clé fonctionnelle, les cas où il est nécessaire de créer un champ supplémentaire pour porter une clé fonctionnelle unique “technique” est normalement assez rare. Je ne dis pas que c’est un anti-pattern mais disons que ce n’est pas la philosophie de Simplicité concernant la clé fonctionnelle

Dans les logs serveur completes je vois cette erreur de ce matin 11h28:

2018-03-02 11:28:38,588 ERROR [com.simplicite.util.ObjectDirect] SIMPLICITE|https://demo.simplicite.io:13513||ECORED0001|system|com.simplicite.util.ObjectDirect|save||Erreur ImmoStrategyInvestor
java.sql.SQLSyntaxErrorException: duplicate update of column: STRATEG_INV_TARGET_CAPITAL_I in statement [insert into immo_strategy_investor (row_id,created_dt,updated_dt,created_by,updated_by,strateg_inv_id,strateg_inv_horizon,strateg_inv_geo_area,strateg_inv_type_asset,strateg_inv_contribu_i,strateg_inv_contribu_u,strateg_invcontribu_per_i,strateg_invcontribu_per_u,strateg_inv_coinvest,strateg_inv_stripping_up,strateg_inv_tax_reduction,strateg_inv_target_capital_i,strateg_inv_target_capital_a,strateg_inv_target_capital_i,strateg_inv_expect_income_a,strateg_inv_nbr_operation_i,strateg_inv_nbr_operation_a) values (?,?,?,?,?,?,?,?,null,null,null,null,null,?,?,?,null,null,null,null,null,null)]

Bref vérifiez votre paramétrage pour voir si vous n’avez pas 2 attributs avec le même nom physique associés à votre objet ou si vous n’avez pas associé 2 fois un même attribut à votre objet

NB: les noms physiques (table et colonne) sont case insensitive avec la plupart des bases de données, notamment avec la base embedded HSQLDB des instances de demo

Merci @david, c’était bien un mauvais copier/coller du nom physique d’un attribut qui faisait doublon avec un autre attribut. Ceci donc posait problème à l’enregistrement mais apparemment pas à la création de l’attribut, le contrôle se fait uniquement sur le nom logique.
La prochaine fois je regarderai la log système avant de poster :wink:
Pb résolu.

Ok on va reproduire ce cas de doublon et voir si on peut améliorer la remontée d’erreur car le message affiché dans la UI n’est qu’un symptôme indirect pas très explicite d’un pb qui s’est produit plus bas dans le moteur.

Indépendamment de ce sujet avez vous lu ma remarque sur les clés fonctionnelles ?

Concernant les clés fonctionnelles, nos objets en générale n’ont pas de clé fonctionnelle “simple” (sur une ou deux colonnes), du coup, et suivant vos conseils du 12/01/2018 au début de notre projet, nous avons opté pour cette formule et ceci pour presque tous nos objets (38 objets jusqu’à maintenant !).

Ceci se passait très bien jusqu’au moment où on a commencé à aborder les export/import que les pb commençaient à apparaître (Formule à mettre dans “Expression calculée” ou “Valeur par défaut”, pas de clé générée automatiquement lors d’un import d’un csv,…).

Peut-être qu’il faudra revoir ce principe, mais pour cela, on va en parler entre nous et aussi échanger avec vous pour voir les possibilités sans qu’on ait besoin de tout casser.

OK le fait d’avoir une clé fonctionnelle sur N attributs n’est pas un souci, mais si vous avez choisi ce pattern de clé fonctionnelle mono-champ unique pour de bonnes raisons ne changez rien.

Mais, par construction, un pattern de valorisation de cet attribut avec le row ID sera forcement pas idéal dans un contexte d’export/import entre instances (car le row ID est un champ technique interne qui, pour un record métier donné, ne sera pas nécessairement le même d’un environnement à l’autre). C’est donc, selon moi, un pattern à réserver aux données qui ne sont pas destinées à être exportées/importées entre instances.

Il y a d’autre patterns de valorisation (ex: à base de paramètre système faisant office de séquence ou par calcul d’un hash unique à partir d’une combinaison des autres champs métier constituant un N-uple unique) qui eux seraient compatibles avec les imports/exports entre instances.

Bref, je ne sais pas si ces export/import entre instances sont un besoin métier (auquel cas il faudra revoir le principe de valorisation) ou si c’est un besoin ponctuel de DEV (auquel cas une approche à base d’export/import de données entre instance n’est pas la bonne approche, il vaudrait mieux, comme déjà évoqué, fonctionner avec du clonage d’instance via le SIM)

Bonjour @david,

Je reviens vers vous pour demander conseil concernant la façon à faire pour avoir une PK non basée sur le RowId.

J’ai un objet A lié aux objets B et C, mais avec un seul à la fois, c’est-à-dire qu’un seul Id des deux est renseigné (B_Id ou C_Id).

Si je mets une clé fonctionnelle sur ces deux Id, étant donné qu’un est vide, la clé ne fonctionne pas.

J’ai essayé de les concaténer dans l’expression calculée d’un nouvel attribut (A_Pk) pour en faire une PK (puisque dans ce champs j’aurai ou B_Id ou C_Id), ça ne marche pas. @nathalie me propose de contrôler dans le postValidate de A si ce A_Pk existe déjà (donc erreur) ou non. Ce qui impliquera beaucoup de code dans tous les objets où je m‘apparaître à modifier leur PK pour ne plus utiliser le RowId.

D’où mon intérêt de ce que vous aviez proposé :

par calcul d’un hash unique à partir d’une combinaison des autres champs métier constituant un N-uple unique

Pourriez-vous me dire svp comment mettre cela en place ? comment on calcul un hash ? où il sera stocké (un attribut dans l’objet) ?

Merci d’avance pour votre aide.
Abed.

Ce n’est pas du tout la bonne approche.

  • Dans Simplicité on peut créer un attribut de type “Objet” avec en objets possibles A ou B
    le champ contiendra A:rowid ou B:rowid
    Ex l’objet Resource de Simplicité qui pointe vers un objet, une disposition…

  • autre possibilité si A et B sont homogènes type héritage du genre objet Personne => qui hérite dans Morale ou Physique
    Il faut faire une FK vers la Personne + cardinalité du lien à 0,1 + hook getTargetObject pour rediriger en fonction du type de Personne vers Morale ou Physique + même table physique pour les 3 objets (pour merger les row_id des 2 types)

Le bon pattern pour référencer depuis un record d’un objet A des objets B ou C est plutôt d’utiliser les “meta” relations avec un attribut de type “objet” (comme par exemple ce que vous avez au niveau du socle pour les post sociaux : attribut pstObject de l’objet SocialPost).

Sinon il est toujours possible d’avoir des attributs non obligatoires faisant partie de la clé fonctionnelle.

Quant au pattern de valorisation d’un attribut “code” utilisé comme clé fonctionnelle unique valorisés à partir du row ID c’est, comme je l’ai déjà dit, un pattern qui n’a de sens que dans certains cas et, en particulier dans des cas où il n’est pas envisagé d’exporter/importer des données entre instance.

J’ai l’impression depuis le début que vous confondez la notion de “clé technique” (= la primary key au sens du SGBD = le row ID dont vous ne devriez jamais avoir à vous soucier de sa valeur) avec la notion de “clé fonctionnelle” métier.

Ex: une personne, peut, par exemple, être identifiée de manière unique avec la combinaison de sa civilité, de son nom, de son prénom et de sa date et ville de naissance, dans un cas comme celui là ajouter un “code personne” unique - a fortiori basé sur le row ID - qui 'a aucune fonction ou signification métier (contrairement, par exemple, à un code métier unique avec une signification métier comme le No de sécurité sociale) est, selon moi, un contre sens ou en tout cas une confusion entre les concepts de clé technique et de clé fonctionnelle.

Bref, je pense qu’avant de vous lancer dans l’exploration d’ “astuces” techniques pour générer des codes uniques (hash, séquence, …) pour vos clés fonctionnelles (ce pattern étant à réserver à des cas particulier qui le justifient comme par exemple un No séquentiel strict de facture) vous devriez commencer par regarder si vous n’avez pas déjà sur vos objets metier des combinaisons de champs auto-suffisants pour constituer une clé métier unique

Nous avons certains objets metier qui ont effectivement des combinaisons de champs auto-suffisants pour constituer une clé métier unique (Exemple IBAN pour compte bancaire, RCS pour une Personne morale…)

Le souci qu’on a concerne par exemple les objets Locataire, Investisseur, Prestataire… qui eux peuvent correspondre à une PP ou PM, d’où le besoin de leur générer une clé unique.

Pour info, PP et PM ne sont pas du tout homogène, PP : Nom, prénom, date de naissance… et PM : Capital, RCS, SIRET…

OK personnellement j’opterai pour une approche à base de séquence en paramètre système plutôt qu’une approche à base de row ID cf. https://www.simplicite.io/resources/documentation/01-core/businessobject-code-hooks.md (au § “Pre and post creation, update, deletion hooks”)

L’objet de ma demande aujourd’hui était justement de trouver une solution pour ne plus utiliser le RowId pour les clés de ces objets.

Par contre, c’était aussi de garantir l’unicité :
1 - Un investisseur est lié à une PP ou PM
2- Une PP peut être liée à maximum un Investisseur
3- Une PM peut être liée à maximum un investisseur,

D’où mon essaie de concaténer les clés de PP (PP_ID = PERP-XXXXX) et PM (PM_Id = PERM-XXXXX) pour en faire une nouvelle clé pour Investisseur INV_Id.

Et comme on a toujours une des deux qui est vide , dans cette nouvelle clé INV_Id je retrouve :
PERP-00001
PERP-00002
PERM-00001

Mais je ne dois pas avoir deux fois PERP-00001

Comment est-ce qu’en ajoutant une séquence je peux avoir cette unicité ?

Je n’ai pas trop compris votre modèle ni votre approche mais si vous utilisez une séquence (je veux bien dire une par objet) pour votre code investisseur, personne morale ou personne physique il n’y aura aucun risque de doublon sur le code.

NB: Pour éviter la confusion avec les row IDs techniques (et donc les attributs référence) vous devriez vraiment utiliser le terme “Code” plutôt qu’ “Id” pour vos codifications métier clé fonctionnelles.

Je le redis aussi pour gérer des liens polymorphes exclusifs le bon pattern c’est plutôt d’utiliser des “meta” références (attributs de type objet), pas ces attributs référence mutuellement exclusifs qui vous compliquent la vie.

Merci @nathalie, le pb d’unicité d’une PP ou PM dans investisseur a été réglé simplement en mettant la cardinalité à 0,1 au lieu de 0,n initialement (à tort !).