0
votes

Évitez les modifications locales après la réplication

J'ai une application Notes qui est utilisée hors ligne sur une réplique locale la plupart du temps. Les utilisateurs peuvent créer et mettre à jour des documents. Sur le serveur, un agent traite tous les nouveaux documents.

L'idée est qu'une fois que l'agent a traité les documents, les utilisateurs ne sont plus autorisés à mettre à jour les documents.

En général, c'est assez simple à configurer en définissant l'accès auteur sur les documents traités par l'agent.

Mais, comme les utilisateurs travaillent sur la réplique locale et que l'agent s'exécute sur le serveur, ce scénario est possible:

  • l'utilisateur crée le document hors ligne
  • réplication de document (création de doc sur serveur)
  • l'agent s'exécute localement sur le serveur / l'utilisateur met à jour le document
  • réplication du document (mise à jour de l'accès auteur localement / mise à jour des modifications sur le serveur) ==> Provoque un conflit de sauvegarde ou des données incohérentes

Existe-t-il un moyen de s'assurer que l'utilisateur ne peut plus mettre à jour un document une fois qu'il est répliqué sur le serveur. Ou existe-t-il un moyen de forcer l'agent à s'exécuter lors de la réplication et à répliquer immédiatement la mise à jour d'accès?

Je pensais créer un bouton sur lequel l'utilisateur peut cliquer pour répliquer / mettre à jour tous les documents, mais pour éviter les utilisateurs qui oublient de cliquer sur le bouton, je préfère les paramètres de réplication par défaut pour m'assurer que tout est répliqué lorsque cela est possible.


0 commentaires

3 Réponses :


0
votes

Quand j'ai étudié il y a quelques années, la réplication fait un "pull", puis un "push", donc faire quelque chose sur le serveur ne fonctionnera pas. Il existe plusieurs options.

  1. Un document «indicateur» distinct dont le serveur traite les mises à jour, au lieu de mettre à jour le document réel. Cela permettrait des mises à jour entraînant une deuxième série de traitements.
  2. Stockez un document de configuration / une variable d'environnement avec la dernière date répliquée, et vérifiez-la dans les champs queryModeChange et queryOpen du formulaire (si editMode). Vous pouvez alors empêcher la modification si le document a été créé avant la dernière date de réplication.

2 commentaires

Je ne sais pas ce que vous voulez dire avec l'option 1. Comment puis-je récupérer la date de réplication? L'application est destinée à être utilisée via Nomad à l'avenir, les appels d'API win ne sont donc pas une option.


L'option 1 est que l'agent serveur met à jour autre chose que le document de l'utilisateur. Selon ce qui se passe, cela peut être possible ou non. La date de réplication peut être récupérée de plusieurs manières. L'un est un bouton / agent local pour appeler NotesDatabase.replicate, qui enregistre également localement l'heure à laquelle il a été exécuté. Un autre est un agent sur le serveur pour mettre à jour un document de minuterie, s'exécutant toutes les minutes (l'interface graphique pour les agents n'affiche que 5 minutes minimum et le défilement ne le permet, mais vous pouvez entrer "1" pour qu'il s'exécute toutes les minutes). J'ajouterais 1 minute à la valeur stockée - j'espère que vous devinerez pourquoi ;-)



0
votes

Au lieu d'utiliser les champs Auteur pour la "mauvaise" raison, j'ajouterais un champ Statut non modifiable, avec des valeurs telles que "Initial", "Prêt" et tout le reste dont vous pourriez avoir besoin. Ensuite, la réplication doit être configurée différemment, en utilisant une formule qui ne réplique que les documents avec Status! = "Initial". L'utilisateur peut avoir 2 boutons pour enregistrer un document: l'un enregistre simplement dans la base de données locale et l'autre change également le statut en Prêt. Une fois Status = "Ready", l'utilisateur ne peut plus modifier le document.

Au fait, avez-vous défini la réplication de documents sur "Fusionner les conflits"? Vous pourriez réduire considérablement le nombre de conflits.


2 commentaires

Cela peut fonctionner, mais échoue toujours si l'utilisateur oublie de cliquer sur le bouton «Prêt». Le "Fusionner les conflits" est défini, mais il permet toujours aux utilisateurs d'apporter des modifications qui ne seront pas traitées (ou traitées incorrectement) par l'agent.


Si l'utilisateur oublie de cliquer sur Enregistrer et transmettre, l'état ne changera pas et le document ne sera pas répliqué et donc pas traité par le serveur.



0
votes

Une alternative serait de configurer le formulaire de sorte que l'utilisateur n'enregistre jamais réellement le document localement. Au lieu de cela, le document est envoyé par courrier électronique au serveur où un agent déclenché par la distribution du courrier effectue la mise à jour réelle. Lorsque l'agent a terminé la mise à jour, il renvoie un e-mail à l'utilisateur lui indiquant que les mises à jour sont disponibles et lui demandant de se répliquer afin de les récupérer. Si le client Notes est réellement utilisé pour le courrier électronique, vous pouvez probablement même insérer un bouton dans le courrier électronique et dire "Cliquez ici pour répliquer et ouvrir votre document".


0 commentaires