Erreur lors de l'import CSV

Afin de ne pas perturber les tests en cours par d’autres personnes, et en attendant les instances de recette…, j’ai recréé mon module immo dans l’instance de Formation via le script XML.
Je retrouve bien tous mes objets (vides).

Je suis en train de les alimenter un par un en faisant un export de l’instance de Dev suivi d’un import dans l’instance de formation, en suivant bien sûr le bon ordre. J’en ai réussi 7 pour l’instant.

Question 1 : Il y aurait-t-il un moyen de faire en un seul coup un export de toutes les données de tous les objets de mon module ? Suivi d’un seul import ? Voir même sélectionner seulement quelques objets qu’on souhaite exporter ?

J’ai exporté en CSV l’objet « Personne morale » qui contient 10 lignes avec comme clé technique de PERM-00001 au PERM-00013, les PERM-00007, 00011 et 00012 ont été supprimés avant l’export.

A l’import dans un nouvel objet « Personne morale », qui est donc vide (ROWID démarre en 1), je retrouve bien mes 10 lignes mes avec une clé allant de PERM-00001 au PERM-00010.

Ensuite j’ai exporté en CSV l’objet « Société » qui est lié à l’objet « Personne morale ».
Lors de l’import de « Société » dans le nouvel objet « Société », j’ai l’erreur suivante :
2018-02-21 12:09:39,906 INFO [] Start import object ImmoCompany:
2018-02-21 12:09:39,906 INFO [] Found field companyId = [SOCI-00013]
2018-02-21 12:09:39,907 INFO [] Found field compImmoLegEntityId.legalEntityId = [PERM-00010]
2018-02-21 12:09:39,907 INFO [] Found field compImmoLegEntityId = []
2018-02-21 12:09:39,907 INFO [] Found field compImmoLegEntityId.LegEntityImmoAddressid = []
2018-02-21 12:09:39,907 INFO [] Found field compImmoLegEntityId.legEntImmoNatPersonId = []
2018-02-21 12:09:39,907 INFO [] New record key row_id
2018-02-21 12:09:39,907 INFO [] Action: INSERT
2018-02-21 12:09:39,907 ERROR [] Validation error: [ERR_REQUIRED:Personne morale#ERROR#compImmoLegEntityId]

Question 2 : Je suis conscient que le PERM-00010 n’est pas la bonne “Personne morale” qu’il faut associer à cette société, mais au mois, cette clé existe bien, Alors pourquoi j’ai eu cette erreur ? Ensuite, que dois-je faire pour éviter ce pb de mauvaise clé (qui est basée sur le Rowid) ?
Je ne sais pas si mes questions sont claires, dites moi s’il faut plus d’élément.
Merci d’avance.
Abed

Question 1: il y a l’export des données du module qui est fait pour exporter toutes les données de tous les objets d’un module donné (uniquement les objets qui ont un ordre d’export non vide et > 0, attention à bien réfléchir à l’ordre d’export = ordre d’import)

Je ne sais pas comment vous calculez votre clé fonctionnelle à partir du row ID mais si c’est via une valeur par défaut l’import ne devrait pas écraser la valeur entrante via un import (une expression de valeur par défaut n’est exécutée que si la valeur est vide)

Cela dit baser le calcul d’un champ sur le row ID sur une donnée que vous voulez exporter/importer entre différents environnements n’est sans doute pas un bonne approche.

Sinon, indépendamment de ces considérations sur l’import/export de données, une approche beaucoup plus pratique pour cloner un environnement de dev sans en passer par un export/import du paramétrage et de données serait d’utiliser les fonctionnalités du SIM (Simplicité Instance Manager), en effet une de ses fonctions très pratique est justement de cloner à l’identique des instances en 1 commande/clic. Cf. https://www.simplicite.io/resources/documentation/90-operation/manager.md

J’ai trouvé le bouton pour faire l’export et je l’ai testé sur 7 objets.
Pourriez-vous me dire svp comment lancer l’import du fichier xml générer dans une nouvelle instance ?
Merci

L’import de fichiers XML se fait via le raccourci Import XML

Toutes nos clés fonctionnelles sont valorisées dans leurs "Expression calculée " via la formula :
[EXPR:Tool.format(“BIEN-%05d”, Long.valueOf([ROWID]))] (pour l’objet ImmoProperty par exemple).

Du coup, j’ai l’impression que l’import en génère des nouvelles et ne tient pas compte de ce qu’il y a dans l’export.

Quand au SIM, est-ce qu’il y a une interface graphique que permet de gérer cela ? sinon, les lignes de commandes sont à écrire où (ex. : sim get ) ? Il y a moyen de me donner un exemple simple pour cloner une instance A en B ?

Encore merci.

Oui, si c’est écrit comme ça, forcément ça recalcule à chaque enregistrement.

Dans votre cas il faut utiliser une expression de valeur par défaut, celle ci ne s’exécutera qu’à la création du record (et uniquement si le champ en question est vide)

Pour le SIM 80% des commandes en ligne de commande dont accessibles via sa UI web, c’est le cas de la commande clone.

La commande équivalent en ligne de commande c’est: sim cp instanceA instanceB

Par contre sur le serveur où est votre instance je ne peux pas vous donner accès au SIM, il faudrait que vous ayez un serveur SIM dédié

Donc si j’ai bien compris, il faut que je déplace la formule depuis "Expression calculée " vers “Valeur par défaut” pour tous nos objets.

Est-ce que ce changement va causer des pb pour les lignes existantes et qui ont leur clé dans d’autres objets (Clé étrangère) ?

D’accord, donc en attendant le serveur dédié, je continuerai avec les export/import csv.

Ponctuellement je peux faire un clone sur le serveur de demo mais il faudrait vraiment que vous passiez rapidement dans un mode nominal sur un serveur adapté avec le SIM à votre main

Pas besoin de créer un clone puisque le module évolue beaucoup en ce moment et j’aurai besoin de refaire ce clone plusieurs fois. On va essayer de passer rapidement sur un serveur dédié.

Concernant le déplacement de la formule vers la zone “Valeur par défaut”, je rencontre un problème :
Quand je vais créer une nouvelle ligne, il me propose toujours la dernière clé qui a été créée.

[EXPR:Tool.format(“BIEN-%05d”, Long.valueOf([ROWID]))]

formule

alors que le BIEN-00009 existe déjà (et c’est le dernier).
Comment puis-je incrémenter de 1 la valeur de Rowid généré par Long.valueOf([ROWID]) ?
Merci

Oui le pb d’affichage sur formulaire de création sur la UI responsive est connu et logué dans les anomalies mineures en cours de traitement.

C’est, en effet, pas grave car c’est juste un pb d’affichage initial. Quand on enregistre la valeur utilise bien le du row ID créé.

Pour information sur la UI legacy il n’y a pas ce pb. Dans votre cas ça doit bien afficher BIEN -00000 (ce qui est logique car tant que le record n’est pas créé le row ID vaut 0)

Pour ne pas que ça perturbe les utilisateurs je vous suggère de mettre une aide courte sur le champ pour indiquer que c’est une valeur attribuée à la création

J’ai déplacé la formule dans la zone “Valeur par défaut”. Malheureusement cela n’a pas réglé le problème d’écrasement de la clé PERM-XXXXX. Lors de l’import la valeur de cette clé est toujours générée, sans tenir compte du contenue se trouvant dans le csv (Ex. : PERM-00013 est passé en PERM-00010).

En plus du Pb d’affichage de la clé lors de la création dans un formulaire, et qui est encore plus bizarre quand c’est la première ligne :


maintenant je dois ajouter toujours un contrôle :
this.getField(“buildingId”).getValue() != ‘IMM-00000’)
pour vérifier qu’une zone est non null et ceci dans tous les contrôles Non null.

Je vais faire des tests et je vous tiens au courant

On parle, en fait, de 2 sujets distincts qui sont tous les deux liés au valeurs par défaut

  1. Sur la UI responsive je constate effectivement l’affichage de l’expression dans le champ lorsque c’est le tout premier record, ensuite la valeur affichée au lieu de correspondre au row ID 0 semble correspondre à un row ID plus ou moins “aléatoire”. Sur la UI legacy, par contre, tout marche bien comme il faut, ce sont donc des bugs de la UI responsive uniquement

  2. Lors d’un import XML (et j’imagine qu’en CSV c’est pareil) une valeur non nulle dans ce champ avec valeur par défaut est effectivement écrasée alors qu’elle devrait être préservée

On va investiguer ces 2 points et on vous tient au courant

PS: En attendant pour ne pas être bloqué il y a 2 options:

  1. retirez l’expression de valeur par défaut et saisissez ce champ à la main car il n’y a pas d’autre approche possible (ni expression de champ calculé, ni code de hook) pour valoriser un champ en utilisant le row ID

  2. valorisez le champ avec autre chose que le row ID (une date à la ms, un hash unique, …)

Le point 2 est normalement réglé

Sur le point 1 j’ai dit une bêtise, il est aussi possible d’utiliser [ROWID] dans les expressions des champs calculés (avec la même logique que pour la valeur par défaut, la différence étant qu’un champ calculé sera recalculé à chaque enregistrement, la valeur par défaut n’étant calculée qu’à la création)

Le point 1 est réglé (celui là était un peu subtil)
Ce sera à our demain sur votre instance