PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Problème d'affichage chez le client
Problème d'affichage chez le client
Started by drusixtynine, May, 09 2020 10:43 PM - 23 replies
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 09 2020 - 10:43 PM
Bonjour à tous,
Je suis confronté à un problème incompréhensible et pour lequel je suis sans aucune solution
Pour info, je développe des applications windev depuis une dizaine d'année et je n'ai jamais rien vu de pareil...
J'ai cette application développée sous windev 22 avec une BD MySQL
Dans cette application, un état avec 2 ruptures affiche un regroupement des données différent sur mon ordinateur de développement et les ordinateurs chez le client.
Bien entendu, j'ai une copie identique des données du client sur mon ordinateur dev
L'état utilise deux ruptures : rupture 1 par Commercial et rupture 2 par Modalité de règlement
Je n'arrive pas à comprendre comment les états peuvent être différents entre les deux machines avec la même version du logiciel et les mêmes données.
J'ai même vérifié les paramètres régionaux sur les deux machines au cas où... rien je ne vois rien
Si vous avez ne serait-ce qu'une idée, n'hésitez surtout pas

--
Aziz T.
Tunis
Windev 12
Registered member
945 messages
Popularité : +102 (110 votes)
Posted on May, 10 2020 - 1:05 AM
Bonsoir,
avez vous vérifié que vous accedez aux même données ? Modifiez manuellement dans votre base de données de dev une information qui apparaît sur l'état et relancez votre code. Si la modification n'apparait pas c'est que vous ne pointez pas sur cette base. Dans la cas contraire c'est que ce n'est pas le même programme. Avez-vous un fichier de configuration (type .ini) qui pourrait modifier le comportement de vôtre exécutable ? Pouvez vous avec votre pc de dev pointer sur la base de votre client afin d'éliminer une différence de base ? De mon côté en plus de 30 années de dev j n'ai jamais eu ce cas. A toutes choses identiques le résultat est identique.

--
« L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 10 2020 - 4:07 PM
Bonjour Philippe et merci pour la réponse
En fait je suis encore en train de chercher l'origine du problème, il se trouve que j'ai aussi la même chose dans un champ table.
Le point commun entre les deux, c'est que la source est une source requête indépendante au champ table et configurée en accès direct.
Cette requête est une requête union entre deux requêtes et est triée sur deux colonnes
j'ai l'impression que c'est le tri qui n'est pas exécuté de la même façon
est ce que ça a plus de sens???

--
Aziz T.
Tunis
Windev 22
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 10 2020 - 4:27 PM
Voici plus de détails avec des captures d'écran, la première est prise sur mon PC et la seconde chez le client (àdistance) et j'ai effectué un filtre sur la zone commerciale et un tri sur la colonne "modalités de règlements".

Voici le code d'initialisation de la table

MaSource.ParamIDSociete = gnLaSociete
SI COMBO_Client<>"%" ALORS
MaSource.ParamNomClient = COMBO_Client..ValeurAffichée
FIN
MaSource.ParamZoneCommerciale = COMBO_ZoneCommerciale
MaSource.ParamModaliteReglement = COMBO_ModalitesReglement










Je n'ai pas répondu à la question posée précédemment, je ne peux accéder à la base du client à distance. Mais je suis sûr de la copie exacte, je fais un dump de la base que j'ai importé sur mon pc, personne ne travaille le dimanche, donc impossible qu'elles soient différentes. Par contre j'arrive à me connecter à distance à un PC chez le client (un serveur virtuel en fait) sur lequel la base est hébergée

--
Aziz T.
Tunis
Windev 22
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 10 2020 - 4:28 PM
Evidemment on voit dans les captures postées que le même tri ne donne pas le même résultat entre les deux ordis

--
Aziz T.
Tunis
Windev 22
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 10 2020 - 4:54 PM
J'ai encore un élément de réponse,
le problème disparaît dès que j'utilise comme source de la table, une requête (sur un certain nombre de fichiers) et non pas sur une union de deux requêtes... le problème c'est que j'ai besoin de faire une union, pour pouvoir afficher ici les factures clients et les avoirs clients, qui proviennent nécessairement de deux tables différentes...

--
Aziz T.
Tunis
Windev 22
Registered member
3,844 messages
Popularité : +227 (347 votes)
Posted on May, 10 2020 - 5:30 PM
Bonjour,
Pourquoi une requête UNION ?
Une requête du style :
SELECT
.......
Facture.MontantFacture,
Avoir.MontantAvoir,
.....
FROM
.....
Facture,
Avoir,
......
WHERE
.....
AND
Facture.FK_Client=Client.PK_Client
AND
Avoir.FK_Client=Client.PK_Client
......

devrait faire l'affaire

--
Il y a peut être plus simple, mais, ça tourne
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 11 2020 - 1:05 PM
Eh ben non, ça ne marcherait pas, j'ai pas de jointure entre les deux tables et puis surtout,
j'ai surtout besoin d'avoir les documents (factures et avoirs) sous forme de lignes du tableau...
Si je fais comme tu dis, je vais avoir les montants factures et avoirs sur la même ligne, ça n'a pas de sens pour moi

Bref, comme j'ai passé tout le week end sur ce problème, il se trouve que je n'arrive pas à avoir le même tri entre le pc dev et le pc client, par contre le problème disparait si je ne fais pas l'union entre les deux requêtes factures et avoirs. (du coup j'oblige le client à faire ça sous forme de deux états)

Donc pour ma part, les tris avec ruptures sur une requête union a un bug, au moins sur la version 22 de windev.
Le hic c'est que je ne saurais même pas reproduire le problème... }:(

--
Aziz T.
Tunis
Windev 22
Posted on May, 11 2020 - 2:28 PM
Les données semblent ne pas arriver dans le même ordre... Donc, voyons du coté de la source de données :

Même version de MySQL ?
Même version de dll cliente ?
32/64 bits identique ?
configuration interne de mysql identique (option de tris, curseurs, etc) ?
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 11 2020 - 3:53 PM
Merci pour la réponse
L'application est compilée en 32 bits parce que j'avais eu des problèmes avec la version 64 bits de MySQL au début et je n'ai jamais eu besoin de migrer en 64 bits
PC DEV
MySQL 5.7.21 64 bits

SERVEUR CLIENT
MySQL 5.7.27 32 bits
DLL MySQL a été distribuée par mes soins dans le package d'installation, donc elle est identique

Par contre, je n'ai jamais touché aux options de tris et curseurs de MySQL? comment je peux vérifier ça?

--
Aziz T.
Tunis
Windev 22
Posted on May, 11 2020 - 3:59 PM
la première chose à faire est d'installer l'EXACTE version du client sur une de tes machines et de tester avec...

Soit ca te donne la même erreur et tu connais la cause, soit tu te plonge dans google pour la configuration interne de mysql
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 11 2020 - 5:06 PM
Normalement c'est la configuration par défaut des serveurs, je ne touche à rien là dedans, je devrais peut-être
J'ai essayé de regarder les options de tris et je ne trouve rien qui y ressemble de près ou de loin, tu pourrais me dire ou chercher
Merci

--
Aziz T.
Tunis
Windev 22
Registered member
111 messages
Popularité : +13 (13 votes)
Posted on May, 12 2020 - 10:24 AM
Bonjour Aziz,

Tu parles de tri alors que le code d'initialisation de la table se contente d'appliquer un filtre.
Peut-on voir le code de la requête UNION ?

--
Erick
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 14 2020 - 1:42 AM
Salut,
Oui en fait c'est un code UNION généré par windev par l'éditeur de requêtes
Je n'ai donc ni écrit ni modifié le code

SELECT
FactureClient.IDSociete AS IDSociete,
FactureClient.CodeClient AS CodeClient,
Client.CompteComptable AS CompteComptable,
Client.NomClient AS NomClient,
FactureClient.IDFactureClient AS IDFactureClient,
FactureClient.NumeroFactureClient AS NumeroFactureClient,
FactureClient.DateFacture AS DateFacture,
FactureClient.TotalTTC AS TotalTTC,
FactureClient.MontantRestantAPayer AS MontantRestantAPayer,
FactureClient.Acquittee AS Acquittee,
ModalitesReglement.LibModaliteReglement AS LibModaliteReglement,
Commercial.PrenomNomCommercial AS PrenomNomCommercial,
ModalitesReglement.DelaiEnJours AS DelaiEnJours,
'Facture' AS Type,
FactureClient.NumeroBLTexte AS NumeroBLTexte,
FactureClient.CodeZoneCommerciale AS CodeZoneCommerciale
FROM
FactureClient,
Commercial,
ModalitesReglement,
Client
WHERE
Client.IDClient = FactureClient.IDClient
AND ModalitesReglement.IDModalitesReglement = FactureClient.IDModalitesReglement
AND FactureClient.IDCommercial = Commercial.IDCommercial
AND
(
FactureClient.IDSociete = {ParamIDSociete}
AND FactureClient.Acquittee = 0
AND FactureClient.CodeZoneCommerciale LIKE {ParamZoneCommerciale}
AND ModalitesReglement.LibModaliteReglement LIKE {ParamModaliteReglement}
AND Client.NomClient LIKE {ParamNomClient}
AND Client.CompteComptable LIKE {ParamCompteComptable}
)

UNION ALL

SELECT
AvoirClient.IDSociete AS IDSociete,
AvoirClient.CodeClient AS CodeClient,
Client.CompteComptable AS CompteComptable,
Client.NomClient AS NomClient,
AvoirClient.IDAvoir AS IDFactureClient,
AvoirClient.NumeroAvoir AS NumeroFactureClient,
AvoirClient.DateAvoir AS DateFacture,
-AvoirClient.TotalTTC AS TotalTTC,
-AvoirClient.TotalTTC AS MontantRestantAPayer,
AvoirClient.Lettre AS Acquittee,
'' AS LibModaliteReglement,
Commercial.PrenomNomCommercial AS PrenomNomCommercial,
0 AS DelaiEnJours,
'Avoir' AS Type,
'' AS NumeroBLTexte,
AvoirClient.CodeZoneCommerciale AS CodeZoneCommerciale
FROM
AvoirClient,
Commercial,
Client
WHERE
AvoirClient.IDClient = Client.IDClient
AND AvoirClient.IDCommercial = Commercial.IDCommercial
AND
(
AvoirClient.Lettre = 0
AND AvoirClient.IDSociete = {ParamIDSociete}
AND AvoirClient.CodeZoneCommerciale LIKE {ParamZoneCommerciale}
AND Client.NomClient LIKE {ParamNomClient}
AND Client.CompteComptable LIKE {ParamCompteComptable}
)

ORDER by
CodeZoneCommerciale Asc,
LibModaliteReglement DESC


--
Aziz T.
Tunis
Windev 22
Registered member
111 messages
Popularité : +13 (13 votes)
Posted on May, 14 2020 - 9:17 AM
Bonjour Aziz,

Quelques pistes à tester :
- Exécuter la requête avec hReqSansCorrection
- Créer une vue pour faire l'union et utiliser une requête simple sur la vue (possible avec HFSQL et SQL Server, mais je ne sais pas pour MySQL)

--
Erick
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 18 2020 - 7:30 PM
Salut Erick et merci pour ta réponse,
Le problème que j'ai toujours eu à créer des vues, comment créer une vue avec des paramètres sur un serveur BD comme SQL Server ou MySQL?

--
Aziz T.
Tunis
Windev 22
Registered member
111 messages
Popularité : +13 (13 votes)
Posted on May, 19 2020 - 10:43 AM
Bonjour Aziz,

Un peu de doc ici: https://apprendre-php.com/tutoriels/tutoriel-28-mysql-5-0-les-vues.html

En gros, tu utilise ta requête union pour pour créer une table virtuelle (la vue) dans la base MySQL.

CREATE VIEW FactureAvoirClient
AS
SELECT
FactureClient.IDSociete AS IDSociete,
FactureClient.CodeClient AS CodeClient,
Client.CompteComptable AS CompteComptable,
Client.NomClient AS NomClient,
FactureClient.IDFactureClient AS IDFactureClient,
FactureClient.NumeroFactureClient AS NumeroFactureClient,
FactureClient.DateFacture AS DateFacture,
FactureClient.TotalTTC AS TotalTTC,
FactureClient.MontantRestantAPayer AS MontantRestantAPayer,
FactureClient.Acquittee AS Acquittee,
ModalitesReglement.LibModaliteReglement AS LibModaliteReglement,
Commercial.PrenomNomCommercial AS PrenomNomCommercial,
ModalitesReglement.DelaiEnJours AS DelaiEnJours,
'Facture' AS Type,
FactureClient.NumeroBLTexte AS NumeroBLTexte,
FactureClient.CodeZoneCommerciale AS CodeZoneCommerciale
FROM
FactureClient,
Commercial,
ModalitesReglement,
Client
WHERE
Client.IDClient = FactureClient.IDClient
AND ModalitesReglement.IDModalitesReglement = FactureClient.IDModalitesReglement
AND FactureClient.IDCommercial = Commercial.IDCommercial

UNION ALL

SELECT
AvoirClient.IDSociete AS IDSociete,
AvoirClient.CodeClient AS CodeClient,
Client.CompteComptable AS CompteComptable,
Client.NomClient AS NomClient,
AvoirClient.IDAvoir AS IDFactureClient,
AvoirClient.NumeroAvoir AS NumeroFactureClient,
AvoirClient.DateAvoir AS DateFacture,
-AvoirClient.TotalTTC AS TotalTTC,
-AvoirClient.TotalTTC AS MontantRestantAPayer,
AvoirClient.Lettre AS Acquittee,
'' AS LibModaliteReglement,
Commercial.PrenomNomCommercial AS PrenomNomCommercial,
0 AS DelaiEnJours,
'Avoir' AS Type,
'' AS NumeroBLTexte,
AvoirClient.CodeZoneCommerciale AS CodeZoneCommerciale
FROM
AvoirClient,
Commercial,
Client
WHERE
AvoirClient.IDClient = Client.IDClient
AND AvoirClient.IDCommercial = Commercial.IDCommercial
END

Ensuite dans ton application, tu utilisera une requête pour interroger la vue.
MaRequete est Requete SQL = [
SELECT
FactureAvoirClient.IDSociete AS IDSociete,
FactureAvoirClient.CodeClient AS CodeClient,
FactureAvoirClient.CompteComptable AS CompteComptable,
FactureAvoirClient.NomClient AS NomClient,
FactureAvoirClient.IDFactureClient AS IDFactureClient,
FactureAvoirClient.NumeroFactureClient AS NumeroFactureClient,
FactureAvoirClient.DateFacture AS DateFacture,
FactureAvoirClient.TotalTTC AS TotalTTC,
FactureAvoirClient.MontantRestantAPayer AS MontantRestantAPayer,
FactureAvoirClient.Acquittee AS Acquittee,
FactureAvoirClient.LibModaliteReglement AS LibModaliteReglement,
FactureAvoirClient.PrenomNomCommercial AS PrenomNomCommercial,
FactureAvoirClient.DelaiEnJours AS DelaiEnJours,
FactureAvoirClient.Type AS Type,
FactureAvoirClient.NumeroBLTexte AS NumeroBLTexte,
FactureAvoirClient.CodeZoneCommerciale AS CodeZoneCommerciale
FROM
FactureAvoirClient
WHERE
FactureAvoirClient.IDSociete = {ParamIDSociete}
AND FactureAvoirClient.Acquittee = 0
AND FactureAvoirClient.CodeZoneCommerciale LIKE {ParamZoneCommerciale}
AND FactureAvoirClient.LibModaliteReglement LIKE {ParamModaliteReglement}
AND FactureAvoirClient.NomClient LIKE {ParamNomClient}
AND FactureAvoirClient.CompteComptable LIKE {ParamCompteComptable}
ORDER BY
FactureAvoirClient.CodeZoneCommerciale ASC,
FactureAvoirClient.LibModaliteReglement DESC
]

MaRequete.ExecuteRequete()
POUR TOUT MaRequete
...
FIN

--
Erick
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 19 2020 - 2:25 PM
Salut Erick,
J'ai du mal à comprendre ce que tu as mis, tu as enlevé les paramètres dans la première et pas dans la seconde requete de l'union, j'imagine que c'est une erreur...
Ensuite, le fait d'avoir créé cette vue, tu dois importer ces caractéristiques comme une table dans windev? et du coup tu peux faire une requête dessus en mettant les paramètres que tu veux??

--
Aziz T.
Tunis
Windev 22
Registered member
111 messages
Popularité : +13 (13 votes)
Posted on May, 19 2020 - 3:08 PM
C'est ça, la vue sera traitée comme une table dans l'analyse.

Je ne vois pas d'erreur dans la requête de création de la vue. Le code commence à "CREATE VIEW" et s'arrête à la ligne "END".
La suite est la requête sur la vue qui renverrait le résultat attendu mais aléatoire avec ta requête union.

--
Erick
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 19 2020 - 7:07 PM
Ah ça y est j'ai capté, j'avais pas vu le END au milieu :D
Du coup ce genre de solutions te permet d'avoir une partie des requêtes à l'extérieur de ton application compilée, ce qui te permet de changer des choses, voire corriger sans recompiler ... c'est ça ?


En attendant d'essayer cette nouvelle solution, je suis en train d'installer la même config que le client sur une machine virtuelle pour essayer de reconstituer le problème

--
Aziz T.
Tunis
Windev 22
Posted on May, 21 2020 - 11:16 AM
Bonjour,
peut-être rien à voir avec votre problème, mais lorsque je vous lis et
qu'on constate qu'un tri n'est pas appliqué de la même façon sur 2
machines je me demande si c'est pas le tri qui est en cause.
Je pensais idiotement aux paramètres régionaux que la BDD ou
l'application pourrait peut-être prendre en compte pour une raison ou
une autre.
Serait-il possible qu'une machine ait un OS installé en anglais et
l'autre en français par exemple ?
Je sais que c'est un peu idiot et bricollé, mais je serais assez tenté
par aller vérifier ces paramètres régionaux :-)

Le 09.05.2020 à 20:43, drusixtynine a écrit :
Bonjour à tous,
Je suis confronté à un problème incompréhensible et pour lequel je suis
sans aucune solution
Pour info, je développe des applications windev depuis une dizaine
d'année et je n'ai jamais rien vu de pareil...
J'ai cette application développée sous windev 22 avec une BD MySQL
Dans cette application, un état avec 2 ruptures affiche un regroupement
des données différent sur mon ordinateur de développement et les
ordinateurs chez le client.
Bien entendu, j'ai une copie identique des données du client sur mon
ordinateur dev
L'état utilise deux ruptures : rupture 1 par Commercial et rupture 2 par
Modalité de règlement
Je n'arrive pas à comprendre comment les états peuvent être différents
entre les deux machines avec la même version du logiciel et les mêmes
données. J'ai même vérifié les paramètres régionaux sur les deux
machines au cas où... rien je ne vois rien
Si vous avez ne serait-ce qu'une idée, n'hésitez surtout pas

--
Aziz T.
Tunis
Windev 12


--
Fabrice M.
-------------------------------------
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 22 2020 - 12:08 AM
Salut Fabrice,
Déjà vérifié les paramètres régionaux, je l'ai mis dans mon tout premier message 8)

--
Aziz T.
Tunis
Windev 22
Registered member
22 messages
Popularité : +0 (2 votes)
Posted on May, 24 2020 - 11:40 PM
Alors voilà les derniers news de ma recherche:
J'ai installé la même version de MySQL Server (32 bits) sur une machine virtuelle sur mon réseau, donc même config que le client.
Bien sûr j'ai importé la base du client sur le nouveau serveur
Quand j'installe l'application sur la fausse machine du client, j'arrive à reconstituer le problème, donc l'affichage de l'état incriminé est différent de celui depuis mon IDE..
Par contre, comme cette copie du serveur est sur mon réseau, j'arrive facilement à me connecter au serveur depuis mon IDE et là l'état en question n'est pas modifié. Tout fonctionne parfaitement.
Je compile le programme et lance l'exe depuis ma machine avec les données du serveur distant, là, le problème est le même.
Dernier test, je lance l'exe compilé avec les données sur ma machine maintenant et là aussi le problème existe.

Donc finalement, le problème existe seulement avec l'application compilée, sur mon PC, sur le faux serveur...

Donc je suis encore plus perdu qu'avant
Est ce que l'un de vous a une idée???

--
Aziz T.
Tunis
Windev 22
Registered member
384 messages
Popularité : +13 (13 votes)
Posted on May, 25 2020 - 10:01 AM
Bonjour,

Serait-il possible d'activer les logs globaux et de vérifier les requêtes qui sont lancées par les deux versions de l'exe ? On pourra retrouver ainsi la requête UNION réellement exécutée par le serveur MySQL, et vérifier qu'elles soient bien identiques en tout point de vue pour les deux versions du logiciel.

La procédure est la suivante :
-- Activer le log global sur MySQL
SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'table';

-- Ici, exécuter le cas de test sur les deux logiciels

-- Puis désactiver le log global
SET GLOBAL general_log = 'OFF';

-- Voir toutes les requêtes exécutées:
SELECT * FROM mysql.general_log;
-- Alternative: filtrer sur les UNION
SELECT * FROM mysql.general_log WHERE argument LIKE '%UNION%';


Il sera intéressant aussi de récupérer ces requêtes UNION et de les exécuter en dehors d'un exécutable WinDev, par exemple via MySQL Workbench ou HeidiSQL (pour n'en citer que deux), et voir quels résultats vous avez dans ce cas.