Enregistrer enregistrement en ORDA

Bonjour à tous,

J’ai une listbox alimentée par
<code 4D>
MaListbox:=ds.MaTable.all()

</code 4D>
Lorsque je clique sur un enregistrement, j’affiche les champs de la table à droite de la listbox.
Si je modifie un enregistrement, puis que je sélectionne un autre, les modifications sont perdues.
Je tente donc un
<code 4D>
if(Form event = on selection change)
$status:=MaListbox.elementSelected.save()
</code 4D>
Ça sauve bien mais c’est le nouvellement sélectionné.

Comment faire ?
Le cas réel est un peu plus compliqué mais commençons par ce point.
Merci de votre aide.

OS : Mac OS X
Product :4D - 4D Server V17R6

Tu ne veux que ça enregistre la saisie systématiquement, sans bouton Valider, c’est ça ? Je ne vois pas mieux que l’événement formulaire “Sur quand le focus il a modifié des champs et il se met à faire autre chose”.

On pourrait le faire sur après saisie mais sauvegarder après chaque frappe de caractère serait, disons…, inapproprié !
On pourrait aussi le contourner en mémorisant l’état de l’enregistrement et en le mettant à jour a posteriori : pas mieux.

Je pensais à ça :

  • clic dans la LB -> Form.enregistrementEstModifie:=faux
  • sur données modifiées des champs de saisie -> Form.enregistrementEstModifie:=vrai
  • sur (perte focus zone de saisie enregistrement & Form.enregistrementModifie=vrai) -> enregistrer

Ce “est modifié” peut être géré de plusieurs façons, par exemple hash de l’enregistrement lorsque tu le charges, et quand la saisie perd le focus, tu compares hash ancien/nouveau. Mais je ne vois pas comment se passer de la détection de “perte focus”, et si tu ne souhaites pas requêter le serveur pour savoir si modification il y a eu, ça t’oblige à gérer ton propre “dirty flag”.

Bonjour,

N’oubliez pas qu’il y a une member method entity.touched( ) qui permet de détecter si l’entité éditée a été modifiée.

Bonjour Marie-Sophie,
j’avais vu mais supposé que cela demandait une requête. Comme en 1 seconde je peux tester touched 24000 fois : mauvaise supposition. :oops:

Remarque : ce serait bien https://forums.4d.com/Post/FR/19494369/0/0/si on avait ça>. Ça éviterait des tests comme celui que je viens de faire, et plus généralement de lire trop souvent des inepties comme “4d client est inutilisable en wan”.

Je progresse lentement sur ORDA…

J’ai modifié une base de démo HDI_EntitySelectionInListbox en rajoutant deux champs ‘Date’ et ‘Title’ avec l’expression Form.myEvent.Date et Form.myEvent.Title.
En analysant cette base, je m’aperçois d’une erreur commise dans ma propre base où je mettais quelque chose du genreForm.events[currentElementPosition-1].Date ; ça affichait quand même l’info mais je ne pouvais pas saisir.
Donc date et titre sont bien affichés et saisissables.

Si je modifie le titre par exemple en rajoutant …,
[]32895835;“Your comment here…”[/]
Si je clique dans la date, la modification apparaît dans la listbox.
[]32895849;“Your comment here…”[/]

Si je clique sur un autre enregistrement de la listbox, que je modifie le Titre, que je clique dans Date, la modification du premier en registrent disparaît de la listbox ; il n’a donc pas été enregistré.

Il me semble avoir lu qq part que l’enregistrement obtenu par un indice MyentitySelection[index] était une copie et qu’il fallait explicitement provoquer l’enregistrement : n’est-ce pas le cas ici aussi ?

J’ai appliqué l’idée d’Arnaud
<code 4D>
Case of
: (Form event=On Losing Focus)
Form.myEvent.save()
End case
</code 4D>
Et ça fonctionne ! Même si ce n’est pas optimal, car obligeant à sauvegarder chaque champ.

J’ai encore fouillé pour savoir si le clic dans la listbox déclenche un ‘on getting focus’ avant le ‘on selection change’, ce qui aurait résolu mon problème : pas de chance, il n’y a pas de ‘on getting focus’.
Merci pour votre aide.

Y a-t-il des développeurs utilisant ORDA et listbox en saisie ?
Il y a des bases exemples en affichage mais presque rien en saisie.

Salut Bernard,
juste une idée, si la partie qui sert à la saisie, à droite, est un sous formulaire, tu n’as plus qu’un objet à tester : quand ce sous form perd le focus, enregistrer si touched est à vrai.

Je suis toujours à la recherche de solutions génériques et il faut effectivement que je mette ça dans un sous-formulaire.
Il faut que je me plonge dans la communication entre formulaire et sous-formulaire…

Bonjour,

J’ai fait un test.

Pour éditer une entity en vue de la modifier et de la sauver, il ne faut pas faire entitySelection[indice] car c’est équivalent à un reload de l’entity depuis la base.
Un entitySelection[indice] .save() ne prend donc jamais en compte les modifications.

Il faut utiliser l’entity specifiée dans le Current Item de la listbox.

J’ai fait ce test:
ListBox en selection mode = Single
Current item = Form.selectedBook
Focusable = True

J’édite Form.selectedBook sur le même formulaire que la listbox.

Je n’utilise pas l’évènement On Selection Change mais On Getting Focus.
Cet évènement est déclenché après modificqtion du champ de saisie relatif à Form.selectedBook quand je re clicke sur une ligne de la listbox.

Ainsi je fais:
Case of
: (Form event code=On Getting Focus)

If (Form.selectedBook#Null)
If (Form.selectedBook.touched())
$status:=Form.selectedBook.save()
Form.books:=Form.books
End if
End if
End case

Bonjour Marie Sophie

Suite aux conseils que tu nous donnes pour modifier et sauver une ligne de Listbox ORDA pourrais tu mettre une petite base demo

cela me permettra de mieux comprendre

Un grand merci pour ta disponibilité

Bernard DORET

: Marie-Sophie LANDRIEU

: (Form event code=On Getting Focus)

Merci Marie-Sophie,
C’est plus adapté que le on losing focus, car cette action n’est faite qu’une fois par enregistrement.
De plus, je commence à comprendre la communication entre formulaire et sous-formulaire mais il reste du travail…

: Bernard ESCAICH

De plus, je commence à comprendre la communication entre formulaire
et sous-formulaire mais il reste du travail…
Regarde les réponses de Vincent https://forums.4d.com/Post/FR/28329208/1/28329209#28329209ici>, ça situe pas mal je trouve…

Bonjour,

Ci-joint un exemple.

https://forums.4d.com/4DBB_Main/x_User/21442460/files/32925021.zip

A bientôt.

Bernard (l’autre !),

J’ai fait une https://forums.4d.com/4DBB_Main/x_User/4018/files/32929014.zippetite base> plus complète qui illustre le fil de discussion avec la saisie dans des variables ou dans un sous-formulaire (table ou projet).

HTH

Merci à Marie Sophie et à Bernard (l’autre) pour leur base demo, je vais me pencher dessus pour comprendre comment résoudre mon problème

C’est super d’avoir ici des personnes compétentes mais aussi disponible, sympathique, avec de l’humour ( Arnaud surtout le vendredi) et qui surtout partage leurs connaissances et expériences

très cordialement

Bonjour Marie Sophie

Je reviens sur mon problème de champ booléen ‘pointage’

J’ai rajouté dans ta base demo un champ pointage et je ne peux pas le lire ni le modifier

J’ai pas tout compris

Merci encore pour ton aide

Très Cordialement

Bernard DORET

https://forums.4d.com/4DBB_Main/x_User/15009193/files/32953962.zip

Salut,

Tu colles une var booléen déclarée à la place de This.Pointage . vBool par exemple

et sur affichage corps tu colles vBool:=This.Pointage

Bonsoir Eric

Merci de t’occuper de mon petit problème, mais j’ai essayé ta solution et rien ne marche
je ne dois pas bien comprendre

Bonne soirée
Très Cordialement

Bernard DORET

Tiens Bernard, voici ta petite base adaptée.

https://forums.4d.com/4DBB_Main/x_User/3960/files/32970676.zip