PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Comparer les membres de deux structures identiques
Comparer les membres de deux structures identiques
Débuté par nomail, 17 oct. 2014 15:53 - 2 réponses
Posté le 17 octobre 2014 - 15:53
Bonjour,

Je débute à programmer avec les structures et souhaite réaliser un traitement.

J'ai deux structures identiques à comparer pour savoir, entre les deux, quels sont les valeurs qui ont changé.

Ex. :

FicheClient1 est un Client
FicheClient2 est un Client

Je veux par exemple repérer (trace...) que FicheClient1.Nom est différent de FicheClient2.Nom... et donc pouvoir identifier les valeurs qui bougent.

Je ne vois pas comment réaliser l'opération... Si vous pouvez m'éclairer sur le sujet.

Merci.
Membre enregistré
179 messages
Posté le 27 octobre 2014 - 09:48
Bonjour Clement,

voici comment je ferai :

La structure STClient :
STClient est une structure
sNom est une chaîne
sPrenom est une chaîne
sAdresse est une chaîne
dDateDeNaissance est une Date
FIN


Le code qui affiche les différences :
client1 est un STClient
client2 est un STClient

client1.sNom = "Dupond"
client1.sPrenom = "Stéphane"
client1.sAdresse = "Rue de la Gare 21"
client1.dDateDeNaissance = "19720229"

client2.sNom = "Dupont"
client2.sPrenom = "Stéphane"
client2.sAdresse = "Rue de la Gare 21"
client2.dDateDeNaissance = "19730301"

tabVariableDifferente est un tableau de chaîne
SI est_different(client1, client2,tabVariableDifferente) ALORS
SI tabVariableDifferente..Occurrence = 0 ALORS
Trace("Pas de différence, les deux variables ont un contenu identique")
SINON
Trace("Différences : ")
POUR i=1 _A_ tabVariableDifferente..Occurrence
Trace(tabVariableDifferente[i])
FIN
FIN
FIN


Et enfin la fonction de comparaison :

Procedure est_different(LOCAL Client1 est un STClient,LOCAL Client2 est un STClient,tabVariableDifferente est un tableau de chaîne)
TableauSupprimeTout(tabVariableDifferente)
bEstDifferent est un booléen = Faux
SI Client1.sNom <> Client2.sNom ALORS
TableauAjoute(tabVariableDifferente,"Rubrique sNom différente : "+Client1.sNom+"/"+Client2.sNom)
bEstDifferent = Vrai
FIN
SI Client1.sPrenom <> Client2.sPrenom ALORS
TableauAjoute(tabVariableDifferente,"Rubrique sPrenomdifférente : "+Client1.sPrenom+"/"+Client2.sPrenom)
bEstDifferent = Vrai
FIN
SI Client1.dDateDeNaissance <> Client2.dDateDeNaissance ALORS
TableauAjoute(tabVariableDifferente,"Rubrique dDateDeNaissance différente : "+Client1.dDateDeNaissance+"/"+Client2.dDateDeNaissance)
bEstDifferent = Vrai
FIN
SI Client1.sAdresse <> Client2.sAdresse ALORS
TableauAjoute(tabVariableDifferente,"Rubrique sAdresse différente : "+Client1.sAdresse+"/"+Client2.sAdresse)
bEstDifferent = Vrai
FIN
RENVOYER bEstDifferent
Membre enregistré
108 messages
Posté le 15 janvier 2025 - 15:50
WinDEV ne permet pas de comparer des objets complexes comme des structures, si vous les comparez avec le symbole 'egal', cela va renvoyer FAUX car WinDEV compare les pointeurs mémoires, pas le contenu de la structure.

Voici une procédure equals qui utilise Serialize pour comparer le contenu de deux structures ou autre.

Procedure equals(LOCAL monObjetSource is Variant,LOCAL monObjetCible is Variant)

bResultat is boolean

buffSource is Buffer
buffCible is Buffer

Serialize(monObjetSource,buffSource,psdXML)
Serialize(monObjetCible,buffCible,psdXML)

IF buffSource = buffCible THEN
bResultat = True
ELSE
bResultat = False
END

RETURN bResultat