Détecter changement de valeur d'un champs

Bonjour à tous,

J’ai un petit problème de logique et de raisonnement à vous soumettre. Je ne trouve pas la bonne façon de faire.

J’ai écrit une méthode qui me génère des fichiers XML avec tout un tas d’infos dedans. Ce fichier XML est alimenté par un boucle sur une table où sont contenues mes infos. Pour le moment ma méthode créée un seul “gros” fichier. Et jusque là tout va bien.

Sauf qu’il faudrait que je puisse détecter le changement d’une valeur d’un champs pour ne plus alimenter le premier fichier mais en créer un nouveau. Et ainsi de suite à chaque changement de la valeur de ce champs.

J’ai essayé avec “Repeter / Jusque” mais je dois mal m’y prendre. Ça ne fonctionne pas du tout. Je ne vois pas comment lui faire comprendre qu’il faut créer un autre fichier.

Ça doit être tout bête, enfin… Peut-être.

Toute aide sera très fortement appréciée. Merci.

comment le champ est-il modifié ? par qui, par quoi ?

Bonjour,
ce “changement de la valeur de ce champ” dont tu parles, ça veut bien dire que la sélection de la table est triée sur ce champ ?

Bonjour et merci pour votre intérêt.

En fait oui, avant de boucler je fais effectivement un tri croissant sur ce champs.
C’est un champs de table qui fait 7 caractères en alphanumérique.

Il n’est pas “modifié”, il prend simplement une autre valeur.

Concrètement ce champs est un code de société et au lieu de créer un seul fichier avec toutes les sociétés, il faudrait que je créé un fichier par société.

Pour la rupture du tri dans la boucle, ça pourrait donner un truc de ce genre :

$societeCourante:=[laTable]codeSociete
$docXMLsortie:=creer document($societeCourante)
While(not(end selection([laTable]))
if($societeCourante#[laTable]codeSociete)
close document($docXMLsortie)
$docXMLsortie:=creer document($societeCourante)
$societeCourante:=[laTable]codeSociete
end if
//génération du XML
//envoi dans $docXMLsortie
next record([laTable])
end while

Tu utilises PROCESS 4D TAGS, pour générer le XML ?

Non je n’utilises pas PROCESS 4D TAGS, je ne connaissais même pas à vrai dire.

Ta solution me plaît bien, j’ai essayé de la mettre en oeuvre sans succès pour le moment, mais je vais continuer mes efforts.

Je crois que je dois être plus précis dans mes explications.
En fait j’ai deux tables : Table1 et Table2
Table1 contient ces fameux codes, se sont les infos de sociétés. Leurs fiches d’identité.
Table2 contient deux champs contenant ces codes sociétés, ça nous permet d’identifier quelle société échange des infos avec l’autre. Un pour l’expéditeur et le second pour le réceptionnaire.

Schématiquement cela donnerai à peu près ceci :

  • Je cherche dans Table1 les codes sociétés
  • Je cherche pour chacun de ces codes dans Table2 là où elles sont réceptionnaires. Je tri en ordre croissant le champs expéditeur à ce moment là.
  • Mais ! Et c’est là que je coince, je dois faire attention au champs expéditeur de Table2. Car c’est celui-ci qui doit me faire générer un nouveau fichier. S’il ne change pas je reste dans le même fichier et continue à l’alimenter.

Bonjour,
pour avancer, une copie écran de la structure de ces 2 tables et de leurs relations serait pas mal.

Bonjour voici une capture des deux tables et des liaisons entre les deux.
Avec la propriété d’une de ces liaisons.

Table Société => Table1 dans mes explications et Table Fret => Table2

C’est Code_Remettant de la table Fret que je dois “surveiller”.

Bin ça donne la même boucle, j’ai simplement remplacé les noms de champs :

$societeCourante:=[Fret]Code_Remettant
$docXMLsortie:=creer document($societeCourante)
While(not(end selection([Fret]))
  if($societeCourante#[Fret]Code_Remettant)
    close document($docXMLsortie)
    $docXMLsortie:=creer document($societeCourante)
    $societeCourante:=[Fret]Code_Remettant
  end if
    //génération du XML
    //envoi dans $docXMLsortie
  next record([Fret])
end while

ou alors j’ai rien compris ?

Bonjour,
Si vous cherchez à détecter le texte en cours de saisie dans un objet type champ de formulaire, le commande Get edited text peut faire ça facilement:

If (Form event=On Before Keystroke) | (Form event=On After Keystroke) | (Form event=On Getting Focus) | (Form event=On Losing Focus) | (Form event=On Data Change)
$T_Edit:=Get edited text
end if

Cordialement,

Bonjour, non ce n’est pas ça. Il ne s’agit pas d’une saisie mais simplement d’un champs qui peut avoir plusieurs valeurs et lors du parcours de cette table je dois détecter si ce champs a changé de valeur ou pas.

Je suis d’accord, c’est pour cela que ta solution me plaisait bien. Je vais continuer d’essayer de la mettre en oeuvre car je n’ai juste pas réussi pour le moment.

Bonjour bonjour,

Merci Arnaud pour m’avoir fourni la solution, j’ai eu du mal à la mettre en place mais cela fonctionne tip top maintenant.
Je mets ton post en solution.

Merci bcp.