FORM modifié

Bonsoir,

Dans le cadre de l’édition d’une entity, je passe par un dialogue qui charge le contenu de l’entity dans Form. Aussi, quel moyen utilisez-vous pour détecter que “l’objet” Form a été modifié ou pas (et donc, que je dois inciter fortement l’utilisateur à sauvegarder ses modifications) ?

  • ajout d’une propriété dans Form?
  • par commande, laquelle ?
  • autre …

Merci

Patrick

entity.touched( ) devrait faire l’affaire !

Voici un exemple

<code 4D>
If (Form.itemSelected.touched()) //if at least one of the attributes has been changed
Form.itemSelected.save()
End if // otherwise, no need to save the entity
</code 4D>

et la base de test

http://forums.4d.com/4DBB_Main/x_User/464/files/27469491.zip

Bonjour Maurice,

Merci beaucoup !
J’étais pas sur que .touched() fonctionne avec Form.

Patrick

Bonjour,

La méthode touched() s’applique sur une Entity et non sur l’objet Form directement.

Bonjour Marie-Sophie,

Donc, pas de moyen de détecter que Form ait été modifié par une commande ?

Patrick

Dans mon cas j’affecte à Form un datastore

<code 4D>
C_OBJECT($o)
$o:=New object
$o.items:=ds.myPict.all()

$refWin:=Open form window(“myForm”;Plain form window;Horizontally centered;Vertically centered)

DIALOG(“myForm”;$o)

CLOSE WINDOW

</code 4D>

Ce n’est malheureusement pas mon cas :wink:
Mais merci pour la piste et l’idée que je vais très certainement réutilisée.

Patrick

: Maurice INZIRILLO

Dans mon cas j’affecte à Form un datastore

Je n’ai pas suivi le raisonnement :oops:, en quoi cela répond à la question ? cela n’empêche en rien d’avoir des variables (en plus) dans Form qui peuvent être modifiées à part ? Et du coup on ne sait pas si ces variables ont été modifiées ou non…

Une autre idée c’est d’utiliser la member function collection.equal() pour ça

Vincent de La Chaux avait twitté un exemple permettant de comparé deux objects

<code 4D>
C_OBJECT($o_before)
C_OBJECT($o_after)

$o_before:=New object(“test”;123)
$o_after:=New object(“test”;123)

$result:=equal($o_before;$o_after)
</code 4D>

et equal

<code 4D>
C_BOOLEAN($0)
C_OBJECT($1)
C_OBJECT($2)

$0:=New collection($1).equal(New collection($2))
</code 4D>

Plus qu’à stocker dans tes deux objets les éléments voulus, avant et après un événement

Effectivement, mais le truc est que je passe dans le form mon entity :

Code :
$Data:=$_Entity.toObject()

que je balance ensuite dans mon dialogue plus loin

Code :
DIALOG($PtrTable->;$LeFormulaire;$data)

Donc du coup, je récupère les “propriétés” directement, ce qui me permet de les affecter directement dans mes variables du formulaire et de faire à la fin (sur validation), un truc du genre :

Code :
$PKiD:=Form.PK_UUID
$Data:=ds[$DataClass].get($PKiD)
$Data.fromObject(Form) // Réattribut les informations sur la base du formulaire et de la variable Form
$status:=$Data.save(dk auto merge) // Sauvegarde le nouveau membre même si des modifs ont été réalisées, tant que pas sur le même champ

Mais, sur mon bouton annuler, je n’arrive pas à détecter si Form a été modifié dans la durée de son existence liée au formulaire, d’où la question.

Bonjour Patrick,

Form est un objet, je pense que tu peux garder une copie de Form dans un objet local puis faire :

<code 4D>
$modified:=not(New collection(Form).equal(New collection($backup)))
</code 4D>

Non testé

Bonjour Vincent,

Oui, je vais essayer cela.

Merci à tous.

et sinon, je peux faire une feature ou c’est déjà dans les tuyaux :sunglasses: ?

Avant on avait les commandes Ancien et Modifie mais avec les nouvelles technos cela n’est plus trop d’actualité; un remplacement ne ferait pas de mal. Celui-ci devrait tenir compte des variables du formulaire également.

: Manuel PIQUET

Avant on avait les commandes Ancien et Modifie
à propos de Modifie :
Dans le cas de la saisie de données, un champ est considéré comme modifié à partir du moment où un utilisateur l’édite (et change ou non sa valeur originale)
ça peut servir (par exemple à forcer un re stockage), mais ça reste un peu bizarre, pour moi…

J’ai jamais dit que ces commandes étaient parfaites avant… :wink:

J’avoue que j’aimerai bien que ce soit Natif en tant qu’attribut ou en terme de commande car cela permettrait d’éviter de faire des comparaisons à la volée et donc, de conserver quelque part une copie de ce qui a été chargé dans Form.

Patrick

HS: j’ai eu un exemple récemment d’une particularité de plateforme dans les listes déroulantes qui sont utilisables via le clavier sur PC (sur Mac il faut activé une préférence pas activé d’origine)
la personne peut donc modifier la liste, mais l’id n’était pas sauvegardé car seul l’événement sur clic était pris en compte.

Tout cela pour dire qu’on doit parfois passer par des variables dans un formulaire pour éditer/modifier un enregistrement. :roll:

: Patrick EMANUEL

conserver quelque part une copie de ce qui a été chargé dans Form.
Tu as le hash, peut-être ; ça reste de la conserve, mais un peu plus facile à caser dans le placard.

oui, j’y pensais, mais ce qui me gène, c’est e prévoir systématiquement “une case” en tant que variable pour stocker cela.

: Patrick EMANUEL

Effectivement, mais le truc est que je passe dans le form mon entity
:

Code :
$Data:=$_Entity.toObject()

que je balance ensuite dans mon dialogue plus loin

Code :
DIALOG($PtrTable->;$LeFormulaire;$data)

Donc du coup, je récupère les “propriétés” directement, ce qui me
permet de les affecter directement dans mes variables du formulaire
et de faire à la fin (sur validation), un truc du genre :

Code :
$PKiD:=Form.PK_UUID
$Data:=ds[$DataClass].get($PKiD)
$Data.fromObject(Form) // Réattribut les informations sur la base du
formulaire et de la variable Form
$status:=$Data.save(dk auto merge) // Sauvegarde le nouveau membre
même si des modifs ont été réalisées, tant que pas sur le même champ

Mais, sur mon bouton annuler, je n’arrive pas à détecter si Form a
été modifié dans la durée de son existence liée au formulaire, d’où
la question.

Bonjour,

Pourquoi transformez-vous votre entity en object avec :
Code :
$Data:=$_Entity.toObject()
En faisant cela vous perdez la possibilité d’utilisé
Code :
$_Entity.touched()

Vous pouvez très bien affecter les attributs de votre entity dans les variables de votre formulaire sans devoir le transformer en object classique.

D’abord j’ai fait un test en passant mon entity directement dans Form. Le problème c’est qu’ensuite on est limité et on ne peut plus ajouter d’autres attributs dans Form, sans entrée en conflict avec les attributs de notre entity.

Ma solution, je pass dans Code :
Form.entity=monEntity
Grace a cela, je peut continuer a utiliser Form pour mettre d’autre valeurs si besoin est.

Ensuite il vous suffit de faire :

Code :
if(Form.entity.touched() = True)
ALERT(“Attention vous avez fait des modifications, la sauvegarde automatique va s’enclenché!”) // ou alors un CONFIRM pour laisser le choix.
$status:=Form.entity.save(dk auto merge)
end if