Bug liens très problématique

v17.1 et testé en v17.2 (Windows)
J’essaie ce soir de tester dans une version encore + récente

Hier, j’ai créé une nouvelle table comme il m’arrive de faire régulièrement, avec les liens qui vont bien.
Sauf qu’en débuggant je m’aperçois qu’il ne construit pas mes liens, c’est la première que j’ai un problème pareil et extrêmement bloquant sachant que je ne peux plus faire de tables relationnelles…

Exemple tout simple. Imaginons une table technicien et compagnie.
Technicien
idTechnicien
code
idCompagnie (FK)

Compagnie
idCompagnie
nom

lien aller : compagnie
lien retour : techniciens

Bon ce n’est pas aussi simple puisque dans le cas présent je suis sur une table récursive mais ce n’est pas la première de ma BDD. J’ai essayé de nombreuses choses, supprimer la table, la recréer avec des noms de liens différents, j’ai fait le ménage dans le projet (dont suppression des méthodes orphelines, tables…) j’ai supprimé les fichiers d’index, etc.
Si vous avez des pistes avant que je publie le bug je suis preneuse, merci

Bonjour Manon,
que veux-tu dire par “il ne construit pas mes liens” : ils sont tracés en structure mais non utilisables avec ORDA ?
Sinon version 17.2, la 17.4, ce serait mieux…

Bonjour Arnaud, merci de ton retour.
Mes liens allers se ne créés pas :
https://zupimages.net/viewer.php?id=20/09/lx8p.png>
Dans cet exemple il manque mon “Lien_69” et “Lien_70” aller présents dans ma structure au niveau de Form.Lien_70_retour.01

Bonjour Manon,

Dans le cadre de l’utilisation d’ORDA, il est souhaitable de nommer correctement ses liens et de ne pas conserver Lien_XX_aller et lien_XX_retour comme nom. En effet, ceux-ci ne sont pas tokensisés. Cela veut dire que le jour où tu souhaites les nommes, il te faudra les renommer partout dans la base de données.
C’est une activité importante qu’il ne faut pas négliger.

Une fois cela effectué, il te faut absolument redémarrer ta base de données de manière à ce que le moteur 4D puisse prendre encore compte les noms des liens.

Maintenant, il semble que seuls tes liens retours sont intégrés dans ton objet Form. Peux-être est-ce la manière dont tu assignes la valeur de tes liens que cela pêche ? Peux-tu mettre le code que tu utilises ?

Patrick

Bonsoir Patrick, merci pour ton retour.
Ma capture écran est un exemple, tous mes liens sont explicitement nommés.
Je codais avant dans des langages objets, je connais l’importance du nommage, notamment pour les autres développeurs et le maintient de l’appli…
Pour ce qui est de la prise en compte des liens, j’ai bien redémarré la base (et pas qu’une seule fois) sinon je n’aurais de toute façon pas eu mes liens retour.
Ce bug reste un mystère pour le moment, je suis en train de télécharger la v17.4 en espérant que cela résolve le problème.

[EDIT] Après avoir testé en V17.4 c’est encore pire puisque maintenant, en plus des liens aller, les liens retour ne fonctionnent plus, sur aucune des tables récursives.
Nous avons donc fait un projet test et pu reproduire les bugs. Je ferai un ticket 4D.

Bonjour Manon,
je ne pige pas : pourquoi regarder les liens depuis Form ? C’est un objet construit, tu peux t’être plantée quelque part. Si je veux la vérité toute nue, je tape ds.MA_TABLE dans le débogueur et je déplie, ainsi je vois ce que voit orda. Ou bien j’utilise https://forums.4d.com/Post/FR/24944477/2/31249766#29666349ce composant> qui dresse la liste des liens.

Bonjour Arnaud,

[]34124827;""[/]

Voici mes tables, on voit bien que j’ai les liens ‘retour’ dans ProductConfModel vers PCM. Et que dans PCM, je n’ai pas les liens ‘aller’ qui correspondent.

Bonjour Manon,

C’est une base récente ou une base ancienne qui a été convertie ?

Je crois avoir eu un soucis sur des recherche sur des tables liées dans l’éditeur de recherche à cause d’une option de compatibilité non cochée…

HTH

Bonjour Bruno,
c’est une base récente, je n’ai pas changé de version depuis un moment. Puis comme je le disais en testant sur des versions + récentes le problème est encore plus conséquent.
En créant un nouveau projet avec une table récursive je retrouve le même bug, j’attends le retour du technicien 4D.
Bonne journée

Bonjour Manon,
ça commence à sentir le bug…
Tu peux passer une copie écran de ce que tu appelles un table récursive ?

Attention tout de même, juste au cas où.

Tous les objets de structure, tables, champs ou liens, ne sont disponibles pour ORDA qu’après redémarrage de la base.

Une autre piste serait que les liens auraient été créés en SQL.
Il ne sont pas dessinés comme les liens “natif” dans la structure.

Ah ok merci pour la piste. Mais comme c’est moi qui ai conçu la base dans 4D, pas de liens créés en SQL, ils ont été construits dans la structure comme toutes les autres tables. et puis j’ai pu reproduire le bug dans un autre projet donc ça sent pas bon…
Mieux qu’une copie écran voici un exemple sommaire du bug en PJ (Table récursive => table qui fait référence à elle-même)
https://forums.4d.com/4DBB_Main/x_User/23843637/files/34151343.zip

Bonjour Manon,

si tu ajoutes un champ avec une clé primaire dans ta seconde table, cela fonctionne parfaitement

Patrick

Il y a déjà une clé primaire composite.

c’est donc cela ton problème.
Je te renvoi à la discussion suivante : https://forums.4d.com/Post/FR/33511264/1/33515067#33515067

Patrick

Bonjour,

Les dataClasses (tables) ayant une primary key composite (ou pas de primary key du tout) ne sont pas exposées dans le datastore.

Super merci de votre retour, c’est donc ça…
Ça ne m’a pas traversé l’esprit puisque sur mes autres tables récursives avec clé composite je n’avais pas rencontré de problème jusque là, et surtout c’est assez hallucinant que cela ne soit pas géré en orda ! (simple avis…)
Donc va falloir que je revois la structure de mes tables récursives, supprimer les clés composites, ajouter une clé primaire avec incrément auto et que je revois le code pour ne pas autoriser de doublon au niveau des enregistrements. A moins que je puisse rendre mes anciens champs (qui composés ma clé) uniques, je teste.

Il existe des commandes ORDA qui permettent de récupérer la clé primaire d’une entité et de récupérer une entité avec sa clé primaire. J’imagine que ce serait assez compliqué à faire avec une clé composite.

De ce que je comprend, il n’y a pas forcément besoin de supprimer les index composites.
Il faut juste que la clé primaire ne soit pas basée dessus.
C’est peut-être le bon moment de passer aux UUID automatiques. Ça simplifie pas mal de choses.

: Manon CHAUVIN

c’est assez hallucinant que cela ne soit pas géré en orda ! (simple
avis…)
Oui et non : orda n’est pas SQL et le SQL de 4D n’est qu’une surcouche assez tardive (v11), plus ou moins bien implémentée. Je n’ai par exemple jamais été fichu de piger comment marchent (à quoi servent…) les liens SQL dont Vincent parle plus haut, tout comme la possibilité d’avoir la valeur Null dans un champ donne des résultats inattendus dans les recherches “classiques” (peut être aussi dans orda, je n’ai pas testé).
Du moins ton problème est résolu, c’est cool :wink: