PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Problème de récupération de données d'un Webservice dans un tableau
Problème de récupération de données d'un Webservice dans un tableau
Débuté par Philippe, 29 sep. 2014 16:15 - 30 réponses
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 29 septembre 2014 - 16:15
Bonjour à tous,

Je n'arrive pas à récupérer les données de mon tableau renvoyé par un Webservice, je dois avoir un problème de syntaxe quelque part mais je ne trouve pas :

// Procédure Webservice créée dans WinDev
SI HExécuteRequêteSQL(REQ_Serveur_Cours, sCodeSql) ALORS
POUR TOUT REQ_Serveur_Cours
FichierVersMémoire(UnCours,REQ_Serveur_Cours)
TableauAjoute(TabListeCours,UnCours)
FIN
SINON
//RENVOYER "Erreur"
FIN
RENVOYER TabListeCours

Quand je teste cette procédure :
Si je fais un info(TabListeCours..occurence) --> j'obtiens bien le nombre d'enregistrement attendus
Dans le test de la procédure, je visualise bien tous les enregistrements dans le tableau et, pour chaque enregistrement, chaque rubrique est bien renseignée
TabListeCours
[1] <ST_Cours>
ID_COURS 912
Cours_Date 20141128
Cours_Heure_Début 090000000
Cours_Heure_Fin 123000000
Cours Fusions
Cours_Catégorie CM
Professeur DURAND FREDERIQUE
Couleur_Fond 14983801
Salle 302
...

// Appel du Webservice à partir de WinDev Mobile
TabListeCoursLu est un Chargement_Nouveaux_CoursResponse
TabListeCoursLu = WS_Studant.Chargement_Nouveaux_Cours(Paramètres....)

Je tente de lire le résultat de 2 manières différentes, mais le tableau semble vide ou ce ne sont pas les bonnes méthodes :

// Exemple de la doc PC Soft
POUR i = 1 _A_ TabListeCoursLu.Chargement_Nouveaux_CoursResult..Occurrence
Info("tab : " + TabListeCoursLu.Chargement_Nouveaux_CoursResult[i].Cours)
FIN

// Exemple de l'aide
POUR TOUT UnCoursLu DE TabListeCoursLu.Chargement_Nouveaux_CoursResult
Info("Cours : " + UnCoursLu.Cours_Date + " " + uncourslu.Cours + " " + TabListeCoursLu.Chargement_Nouveaux_CoursResult.Cours)
FIN

Autre test:
// Appel du Webservice à partir du simulateur de WinDev Mobile

Erreur "la valeur "" ne respecte pas le schéma XSD" sur la ligne TabListeCoursLu = WS_Studant.Chargement_Nouveaux_Cours(Paramètres....)
Code erreur : 40070

Pourtant je n'ai aucune valeur vide ??

Si quelqu'un a une idée d'où cela peut venir, je suis preneur

Merci d'avance,

Philippe
Posté le 29 septembre 2014 - 17:11
Bonjour Philippe

ca pourrait être le problème classique unicode/ansi, comme expliqué à de
nombreuses reprises sur ce forum

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

NOUVEAU: WXReplication, votre système de réplication open source est
disponible sur mon site web !!!
WXShowroom.com : Montrez vos projets !
Plus d'information sur http://fabriceharari.com


On 9/29/2014 8:15 AM, Philippe wrote:
Bonjour à tous,

Je n'arrive pas à récupérer les données de mon tableau renvoyé par un
Webservice, je dois avoir un problème de syntaxe quelque part mais je ne
trouve pas :

// Procédure Webservice créée dans WinDev SI
HExécuteRequêteSQL(REQ_Serveur_Cours, sCodeSql) ALORS
POUR TOUT REQ_Serveur_Cours
FichierVersMémoire(UnCours,REQ_Serveur_Cours)
TableauAjoute(TabListeCours,UnCours)
FIN
SINON
//RENVOYER "Erreur"
FIN
RENVOYER TabListeCours

Quand je teste cette procédure :
Si je fais un info(TabListeCours..occurence) --> j'obtiens bien le
nombre d'enregistrement attendus
Dans le test de la procédure, je visualise bien tous les
enregistrements dans le tableau et, pour chaque enregistrement, chaque
rubrique est bien renseignée TabListeCours
[1] <ST_Cours>
ID_COURS 912
Cours_Date 20141128
Cours_Heure_Début 090000000
Cours_Heure_Fin 123000000
Cours Fusions
Cours_Catégorie CM
Professeur DURAND FREDERIQUE
Couleur_Fond 14983801
Salle 302
...

// Appel du Webservice à partir de WinDev Mobile
TabListeCoursLu est un Chargement_Nouveaux_CoursResponse
TabListeCoursLu = WS_Studant.Chargement_Nouveaux_Cours(Paramètres....)

Je tente de lire le résultat de 2 manières différentes, mais le tableau
semble vide ou ce ne sont pas les bonnes méthodes :

// Exemple de la doc PC Soft
POUR i = 1 _A_
TabListeCoursLu.Chargement_Nouveaux_CoursResult..Occurrence
Info("tab : " +
TabListeCoursLu.Chargement_Nouveaux_CoursResult[i].Cours)
FIN

// Exemple de l'aide
POUR TOUT UnCoursLu DE TabListeCoursLu.Chargement_Nouveaux_CoursResult
Info("Cours : " + UnCoursLu.Cours_Date + " " + uncourslu.Cours + "
" + TabListeCoursLu.Chargement_Nouveaux_CoursResult.Cours)
FIN

Autre test: // Appel du Webservice à partir du simulateur de WinDev Mobile

Erreur "la valeur "" ne respecte pas le schéma XSD" sur la ligne
TabListeCoursLu = WS_Studant.Chargement_Nouveaux_Cours(Paramètres....)
Code erreur : 40070

Pourtant je n'ai aucune valeur vide ??

Si quelqu'un a une idée d'où cela peut venir, je suis preneur

Merci d'avance,

Philippe
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 30 septembre 2014 - 00:06
Bonsoir Fabrice et merci de ta réponse,

j'avais effectivement mon projet WM en Unicode et le projet WD en ANSI

J'ai passé le projet WinDev en Unicode (re-généré le WS et réimporté le WS dans WM)

Mais j'ai toujours le même problème, il doit y avoir encore un autre problème

mes syntaxes sont-elles bonnes ?

merci d'avance

Philippe
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 17 octobre 2014 - 11:20
Bonjour Philippe,

une première idée serait de déclarer explicitement le type renvoyé par le webservice par la syntaxe :<type> en fin de prototype de la procédure.

On ne voit pas cette déclaration dans votre code, voici comment il faudrait déclarer (je ne connais pas les paramètres d'entrée, j'ai "inventé" un paramètre entier nommé nParam1) :
Procedure Chargement_Nouveaux_Cours(LOCAL nParam1 est un entier):Chargement_Nouveaux_CoursResponse


Si cela ne résout pas votre problème j'ai une solution plus radicale mais très efficace qui fonctionne avec les plateformes Windows desktop, Windows mobile, Windows CE, Android, iOS et Linux (ubuntu) : sérialiser l'objet à renvoyer, le mettre dans un buffer renvoyer le buffer via le webservice et déserialiser son contenu après réception.

Voici le détail :
On déclare un retour de type buffer (EXTREMEMENT IMPORTANT CAR PEUT PLANTER DANS CERTAINS CAS).
À la fin de la procédure du webservice on sérialise la variable :
Procedure Chargement_Nouveaux_Cours(LOCAL nParam1 est un entier):Chargement_Nouveaux_CoursResponse
...
bufTabListeCours est un buffer = SerialiseObj(TabListeCours)
RENVOYER bufTabListeCours

La procédure SerialiseObj est faite comme ceci :
Procedure SérialiseObj(obj):Buffer
bufObj est un Buffer
Sérialise(obj,bufObj,psdXML)
RENVOYER bufObj


Ensuite lors de l'appel du webservice on fait l'inverse, c'est-à-dire que l'on déserialise le buffer reçu :
// Appel du Webservice à partir de WinDev Mobile
TabListeCoursLu est un Chargement_Nouveaux_CoursResponse
bufTabListeCoursLu est un buffer = WS_Studant.Chargement_Nouveaux_Cours(Paramètres....)
Désérialise(TabListeCoursLu ,psdXML)
//On on peut maintenant utiliser TabListeCoursLu "normalement"


En espérant que ça résolve votre problème!
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 17 octobre 2014 - 17:42
Bonsoir Jérôme,

Tout d'abord, merci de te pencher sur mon problème.

J'ai 2 erreurs de compilation quand j'ajoute :Chargement_Nouveaux_CoursResponse à la fin de ma ligne PRECEDURE créée dans WinDev comme ci-dessous :

PROCEDURE Chargement_Nouveaux_Cours(Base_Etablissement est une chaîne, Param_Filière est un entier, Param_Site est un entier, Param_Niveau est un entier, Param_Cursus est un entier, Param_Groupe est un entier, Param_Dernier_Cours est un entier) :Chargement_Nouveaux_CoursResponse

--> Type de valeur de retour interdit
--> Le type Chargement_Nouveaux_CoursResponse est inconnu

As-tu une idée ?

Merci d'avance

Philippe
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 20 octobre 2014 - 08:38
Bonjour Philippe,

j'ai pris le type Chargement_Nouveaux_CoursResponse car je ne connais pas le type réel de la variable TabListeCours du premier message (le code est incomplet).
Il faut donc remplacer le type Chargement_Nouveaux_CoursResponse par le véritable type de la variable TabListeCours.

Ensuite il faut décocher l'option de structures intermédiaires (compatibilité 18), comme illustré par cette capture d'écran lors de la génération et déploiement du webservice :





(Il faut redéployer le webservice, puis le mettre à jour dans WinDev Mobile car sa structure aura changé).

Cela va résoudre les erreurs de compilation et devrait également être fonctionnel en exécution.
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 20 octobre 2014 - 12:07
Bonjour Jérôme,

TablisteCours est un tableau et ce type n'est pas permis ?

PROCEDURE Chargement_Nouveaux_Cours(Base_Etablissement est une chaîne, Param_Filière est un entier, Param_Site est un entier, Param_Niveau est un entier, Param_Cursus est un entier, Param_Groupe est un entier, Param_Dernier_Cours est un entier):

UnCours est un ST_Cours
TabListeCours est un tableau de ST_Cours

Par contre Est-ce qu'il faut vraiment décocher l'option de structures intermédiaires (compatibilité 18), car j'ai été obligé de le mettre pour les notifications via Webservice ?

Cordialement,

Philippe
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 22 octobre 2014 - 08:12
Oui il faut impérativement décocher cette option (du moins je fais comme cela avec tous mes webservice depuis la version 19 et ça fonctionne bien).

Ensuite il ne faut pas déclarer le type de retour à l'intérieur de la procédure, mais en global (moi je le mettrais dans une collection de procédure, dans la déclaration globale et je partage cette collection de procédure entre le projet webservice et windev mobile via le GDS).

Voici un exemple complet fonctionnel (je l'ai testé) :

Tout d'abord déclarer le type ST_Cours dans une procédure globale partagée entre les deux projets (webservice et windev mobile) via le GDS :
Sous "déclaration de COL_ProcéduresGlobales_partagées" (ou le nom que vous aurez donné à ces procédure globales)
ST_cours est une structure
sCours est une chaîne
dDate est une Date
FIN


Ensuite la procédure du webservice (à adapter à votre besoin, là c'est uniquement pour montrer le "transport" des informations entre la procédure et le terminal mobile) :
Procedure Chargement_Nouveaux_Cours() : Buffer
tabSTCours est un tableau de ST_cours
stCours est un ST_cours
InitHasard()
POUR i=1 _A_ 100
stCours:dDate = EntierVersDate(Hasard(DateVersEntier(AnnéeEnCours+"0101"),DateVersEntier(DateSys())))
stCours:sCours = DonneGUID(guidFormaté)
TableauAjoute(tabSTCours,stCours)
FIN
bufTabSTCours est un Buffer = SérialiseObj(tabSTCours)
RENVOYER bufTabSTCours


La procédure SérialiseObj utilisée ci-dessus :
Procedure SérialiseObj(obj):Buffer
bufObj est un Buffer
Sérialise(obj,bufObj,psdXML)
RENVOYER bufObj


Ensuite dans le projet Windev mobile pour récupérer le tableau de ST_Cours :
tabSTCours est un tableau de ST_cours
bufTabStCours est un Buffer = Chargement_Nouveaux_Cours()
Désérialise(tabSTCours,bufTabStCours,psdXML)
POUR i=1 _A_ tabSTCours..Occurrence
Trace(tabSTCours[i].dDate+" - "+tabSTCours[i].sCours)
FIN


Et voilà! ;)
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 23 octobre 2014 - 16:15
Bonjour Jérôme et merci de ta réponse détaillée.

J'ai tenté de mettre en application ton code et j'ai une erreur :

"Vous avez appelé la fonction Désérialise. Format de sérialisation incorrect"

As-tu une idée ?

Merci d'avance

Philippe

------------------------------------------------------------------------------------
Voici mon code de la procédure Chargement_Nouveaux_Cours sur windev :
------------------------------------------------------------------------------------
PROCEDURE Chargement_Nouveaux_Cours(Base_Etablissement est une chaîne, Param_Filière est un entier, Param_Site est un entier, Param_Niveau est un entier, Param_Cursus est un entier, Param_Groupe est un entier, Param_Dernier_Cours est un entier) : Buffer

TabListeCours est un tableau de ST_Cours
UnCours est un ST_Cours

// Connexion
Maconnexion_WS..BaseDeDonnées = Base_Etablissement
HOuvreConnexion(Maconnexion_WS)
HChangeConnexion(T_UTILISATEURS,Maconnexion_WS)
HChangeRep(T_UTILISATEURS,".")

// Ouverture de la connexion à la base de l'établissement sur le serveur
SI HOuvreConnexion(Maconnexion_WS) ALORS
// Connexion ouverte
SINON
//RENVOYER "Erreur" //RETOUR
FIN
// Création alias logique nommé Serveur_COURS
HAlias(T_COURS,Serveur_COURS)
// Change connexion pour accéder au fichier sur le serveur
SI PAS HChangeConnexion(Serveur_COURS,Maconnexion_WS) ALORS
//RENVOYER "Erreur"
FIN
HChangeRep(Serveur_COURS,".")
HChangeNom (Serveur_COURS, "T_COURS")
// Changement connexion T_COURS_AFFECTATION pour accéder au fichier sur le serveur
SI PAS HChangeConnexion(T_COURS_AFFECTATION,Maconnexion_WS) ALORS
//RENVOYER "Erreur"
FIN
HChangeRep(T_COURS_AFFECTATION,".")
//Construction de la requête
REQ_Serveur_Cours est une Source de Données // REQ_Serveur_Cours n'existe pas c'est juste une déclaration
sCodeSql est chaîne = [
SELECT * FROM Serveur_COURS
INNER JOIN T_COURS_AFFECTATION
ON Serveur_COURS.ID_COURS = T_COURS_AFFECTATION.ID_COURS
WHERE T_COURS_AFFECTATION.ID_Filière = %1
AND (T_COURS_AFFECTATION.ID_Site = %2 OR T_COURS_AFFECTATION.ID_Site = 0)
AND T_COURS_AFFECTATION.Id_Niveau = %3
AND (T_COURS_AFFECTATION.ID_Cursus = %4 OR T_COURS_AFFECTATION.ID_Cursus = 0)
AND (T_COURS_AFFECTATION.ID_Groupe = %5 OR T_COURS_AFFECTATION.ID_Groupe = 0)
AND Serveur_COURS.ID_Cours > %6
ORDER BY Serveur_COURS.ID_COURS ASC
]
sCodeSql = ChaîneConstruit(sCodeSql, Param_Filière, Param_Site, Param_Niveau, Param_Cursus, Param_Groupe, Param_Dernier_Cours)
// Copie des enregistrements dans le tableau
SI HExécuteRequêteSQL(REQ_Serveur_Cours, sCodeSql) ALORS
POUR TOUT REQ_Serveur_Cours
FichierVersMémoire(UnCours,REQ_Serveur_Cours)
TableauAjoute(TabListeCours,UnCours)
FIN
SINON
//RENVOYER "Erreur"
FIN
// Ajout manuel de 2 lignes dans tableau pour test
UnCours:Cours = "Cours de test"
UnCours:Cours_Date = "19/09/2014"
UnCours:ID_COURS = 2305
TableauAjoute(TabListeCours,UnCours)
TableauAjoute(TabListeCours,UnCours)

// Annulation de l'alias Serveur_COURS
HAnnuleAlias(Serveur_COURS)
// fermeture connexion serveur
HFermeConnexion(Maconnexion_WS)
// Fin Ajout des cours
TitreSuivant("")
Sablier(Faux)

bufTabListeCours est un Buffer = SérialiseObj(TabListeCours)

//FIN
RENVOYER bufTabListeCours

-------------------------------------------------------------
Voici le code de la procédure SérialiseObj sur WinDev :
-------------------------------------------------------------
PROCEDURE SérialiseObj(obj) : Buffer
bufObj est un Buffer
Sérialise(obj,bufObj, psdXML)
RENVOYER bufObj

J'ai généré le Webservice, puis importé dans le projet WinDev Mobile.

--------------------------------------------------------------
Code dans WinDev Mobile pour appeler le Webservice :
--------------------------------------------------------------
// Webservice
tabSTCours est un tableau de ST_Cours
bufTabSTCours est un Buffer = WS_Studant.Chargement_Nouveaux_Cours(Gl_Base_Etablissement, Gl_Filière, Gl_Site, Gl_Niveau, Gl_Cursus, GL_Groupe, Dernier_Cours)
Désérialise(tabSTCours,bufTabSTCours,psdXML)
POUR i=1 _A_ tabSTCours..Occurrence
Trace(tabSTCours[i].ID_COURS + " " + tabSTCours[i].Cours_Date + " " + tabSTCours[i].Cours)
FIN
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 23 octobre 2014 - 17:59
Ah oui j'ai plus qu'une idée : ;)

Les fonctions suivantes n'ont rien à faire dans un webservice :
TitreSuivant("")
Sablier(Faux)


J'ai testé et ça fait planter l'exécution du webservice. Du coup le retour est vide et donc impossible de déserialiser un buffer vide.
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 23 octobre 2014 - 18:30
J'ai supprimé les 2 lignes et j'ai toujours la même erreur

quand je test la procédure dans WinDev la valeur de retour me donne des hiéroglyphes (mais ce doit être normal)

Par contre comment tu fais pour tester le webservice et avoir éventuellement une erreur car c'est ça mon problème je ne connais pas comment fonctionnent les webservices et je n'ai pas de retour d'erreur pour m'aider à trouver la solution.

Encore merci
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 23 octobre 2014 - 18:40
Comment savoir ce que renvoie le serveur ? car si le buffer est vide tu dis que cela fait planter désérialise

Quand je teste ma requête je récupère bien des enregistrements

J'ai même ajouté 2 lignes manuellement pour être sûr
// Ajout manuel de 2 lignes dans tableau pour test
UnCours:Cours = "Cours de test"
UnCours:Cours_Date = "19/09/2014"
UnCours:ID_COURS = 2305
TableauAjoute(TabListeCours,UnCours)
TableauAjoute(TabListeCours,UnCours)

Est-ce que je n'ai pas un problème de droits sur le serveur ovh qui bloquerait le retour ?
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 23 octobre 2014 - 19:03
J'ai ajouté :
SI bufTabSTCours <> "" ALORS
Info(bufTabSTCours)
Désérialise(tabSTCours,bufTabSTCours,psdXML)
SINON
Info("bufTabSTCours vide")
FIN

Info(bufTabSTCours) m'affiche du "chinois" par contre Désérialise plante ?
Posté le 23 octobre 2014 - 21:58
Bonjour Philippe

pas de info ou autre affichage dans un webservice, il n'y a pas de
fenêtr/UI pour l'afficher et ca fera tout planter

A la place, utilise la syntaxe de TRACE qui écrit dans un fichier texte,
et ensuite, en lisant le log correspondant, tu verras ce qui se passe

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

NOUVEAU: WXReplication, votre système de réplication open source est
disponible sur mon site web !!!
WXShowroom.com : Montrez vos projets !
Plus d'information sur http://fabriceharari.com


On 10/23/2014 11:03 AM, Philippe wrote:
J'ai ajouté :
SI bufTabSTCours <> "" ALORS
Info(bufTabSTCours)
Désérialise(tabSTCours,bufTabSTCours,psdXML)
SINON
Info("bufTabSTCours vide")
FIN

Info(bufTabSTCours) m'affiche du "chinois" par contre Désérialise plante ?
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 24 octobre 2014 - 07:23
Bonjour Fabrice,

l'info n'est pas dans le Webservice il est dans l'appli WM juste après l'appel au Webservice :

bufTabSTCours est un Buffer = WS_Studant.Chargement_Nouveaux_Cours(Gl_Base_Etablissement, Gl_Filière, Gl_Site, Gl_Niveau, Gl_Cursus, GL_Groupe, Dernier_Cours)
SI bufTabSTCours <> "" ALORS
Info(bufTabSTCours)
Désérialise(tabSTCours,bufTabSTCours,psdXML)
SINON
Info("bufTabSTCours vide")
FIN

Est-ce que cela pose problème ?

merci
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 24 octobre 2014 - 08:37
Tu parles de serveur OVH, cela signifie que c'est un serveur dédié sur lequel tu déploies ton webservice ?

Fais un essai très simple sur l'hébergement de test de pcsoft (très simple = sans accès base de données, tu construits ton tableau "en dur" pour voir si les données sont bien envoyées).
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 24 octobre 2014 - 08:57
Apparemment j'ai bien un retour quand je fais Info(bufTabSTCours) dans WM juste après l'appel au webservice.

Est-ce que le fait que les 2 projets sont en UNICOE peut poser problème ?
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 24 octobre 2014 - 11:00
Oui je pense que ça peut poser problème.

J'ai la configuration suivante :
- Projet WinDev qui génère le webservice : chaînes ANSI en exécution. Le webservice est ensuite déployé sur une machine Windows.
- Projet WinDev Mobile : chaîne UNICODE en exécution.

Qu'est-ce qu'as donné le test de déploiement sur l'hébergement de test de PC Soft ?
Posté le 24 octobre 2014 - 12:25
Bonjour Philippe


On 10/24/2014 12:57 AM, Philippe wrote:
Apparemment j'ai bien un retour quand je fais Info(bufTabSTCours) dans
WM juste après l'appel au webservice.

Est-ce que le fait que les 2 projets sont en UNICOE peut poser problème ?


Non, au contraire... Si tu as un projet en ANSI et l'autre en unicode il
faudra convertir les chaines entre les deux à un moment donné. Si tu
travailles partout en unicode, pas besoin de conversion supplémentaire.
Par contre, il faut être SUR de bien TOUT avoir en unicode

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

NOUVEAU: WXReplication, votre système de réplication open source est
disponible sur mon site web !!!
WXShowroom.com : Montrez vos projets !
Plus d'information sur http://fabriceharari.com
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 24 octobre 2014 - 15:47
Bonjour Fabrice,

Oui j'ai :
Dans WinDev "Utiliser des chaînes UNICODE en exécution"
Dans WinDev Mobile "Mode UNICODE en mode test et sur l'appareil mobile"

Cordialement,

Philippe
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 24 octobre 2014 - 15:58
Bonjour Jérôme,

J'ai refais un Webservice selon ton exemple et j'ai toujours le même message d'erreur :

Vous avez appelé la fonction Désérialise. Format de sérialisation incorect.

J'ai également la même erreur après de déploiement sur le serveur PC Soft :
http://STUDANT.webdev-test.com/WS_STUDANT_WEB/awws/WS_Studant.awws…

Nouveau Code pour ce nouveau test :

Dans WinDev :
-----------------
STCours2 est une Structure
sCours est une chaîne
dDate est une Date
FIN

PROCEDURE Chargement_Cours2() : Buffer
tabSTCours est un tableau de STCours2
StCours est une STCours2
InitHasard()
POUR i = 1 _A_ 10
StCours:dDate = EntierVersDate(Hasard(DateVersEntier(AnnéeEnCours + "0101"),DateVersEntier(DateSys())))
StCours:sCours = "Cours " + DonneGUID(guidFormaté)
TableauAjoute(tabSTCours,StCours)
FIN
bufTabStCours est un Buffer = SérialiseObj(tabSTCours)
RENVOYER bufTabStCours

Dans WinDev Mobile :
-------------------------

tabSTCours est un tableau de STCours2
bufTabSTCours est un Buffer = WS_Studant.Chargement_Cours2()
Désérialise(tabSTCours,bufTabSTCours,psdXML)
POUR i=1 _A_ tabSTCours..Occurrence
Trace(tabSTCours[i].sCours + " " + tabSTCours[i].dDate)

Test effectué sur 2 portables Samsung en version 2.3.3 et 4.4.2

Merci encore pour le temps que vous passez à m'assister

Philippe
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 24 octobre 2014 - 17:57
Alors le problème est facile à diagnostiquer ici car tu m'as fourni l'URL du webservice.

Le problème est que les types STCours et STCours2 sont déclarés dans le webservice alors qu'il ne faut pas les "partager" comme cela.

Il faut les partager via le GDS!

Pour faire simple : il ne faut pas les voir une fois le webservice importé :



Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 27 octobre 2014 - 09:25
Bonjour Jérôme,

On est obligé de partager via le GDS ? car je n'ai jamais utilisé le GDS et j'ai suivi les indications de l'aide mais j'ai des messages d'erreur ?

J'ai partagé dans WinDev Mobile ma collection de procédures (qui contient mes descriptions de structure) mais j'ai le message <nom_projet.WPP> n'existe pas dans <GDS:\Projets Windev Mobile\nom_projet_Windev_Mobile>

et Côté WinDev quand je fais importer depuis le GDS puis Partager : j'ai le message <nom_projet.WDP> n'existe pas dans <GDS:\Projets Windev\nom_projet_Windev>

Philippe
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 27 octobre 2014 - 18:02
Bonjour Philippe,

non pas obligé de partager la collection de procédures via le GDS, seulement ça va être difficile de maintenir les éléments "identiques" lors d'un développement. Mais un copier-coller et/ou un import de la collection de procédures suffit.

Pense aussi à séparer les collections de procédure "webservice" et "interne" (j'ai vu que la procédure SérialiseObj et disponible via le webservice et ça c'est mauvais).
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 27 octobre 2014 - 22:06
Bonsoir Jérôme,

Tout d'abord je te remercie encore une fois pour le temps que tu passes.

Suite à ta réponse :
non pas obligé de partager la collection de procédures via le GDS, seulement ça va être difficile de maintenir les éléments "identiques" lors d'un développement. Mais un copier-coller et/ou un import de la collection de procédures suffit.
---> ce n'est pas grave car quand cela fonctionnera, il n'y aura pratiquement jamais d'évolution

Pense aussi à séparer les collections de procédure "webservice" et "interne" (j'ai vu que la procédure SérialiseObj et disponible via le webservice et ça c'est mauvais).

--> Donc j'ai séparé les collections dans le projet Windev





La procédure Chargement_Cours2() ne change pas :
PROCEDURE Chargement_Cours2() : Buffer
tabSTCours est un tableau de STCours2
StCours est une STCours2
InitHasard()
POUR i = 1 _A_ 10
StCours:dDate = EntierVersDate(Hasard(DateVersEntier(AnnéeEnCours + "0101"),DateVersEntier(DateSys())))
StCours:sCours = "Cours " + DonneGUID(guidFormaté)
TableauAjoute(tabSTCours,StCours)
FIN
bufTabStCours est un Buffer = SérialiseObj(tabSTCours)
RENVOYER bufTabStCours

Et l'appel du Webservice non plus :
tabSTCours est un tableau de STCours2
bufTabSTCours est un Buffer = WS_Studant.Chargement_Cours2()
Désérialise(tabSTCours,bufTabSTCours,psdXML)
POUR i=1 _A_ tabSTCours..Occurrence
Trace(tabSTCours[i].sCours + " " + tabSTCours[i].dDate)
FIN

J'ai déployé le Webservice sur le site de test de Pc Soft
http://STUDANT.webdev-test.com/WS_STUDANT_WEB/awws/WS_Studant.awws…

Et je l'ai réimporté dans WinDev Mobile

----> Toujours la même erreur : "Vous avez appelé la fonction Désérialise. Format de sérialisation incorrect"

Merci

Philippe
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 28 octobre 2014 - 08:21
C'est au niveau du webservice que ça coince.

Il n'y a pas d'erreur de compilation ?

Si je vais ici : http://studant.webdev-test.com/WS_STUDANT_WEB/awws/index.htm

Que je clique sur "Chargement_Cours2" puis sur le bouton "test", j'obtiens cette erreur :
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>
Erreur à l'initialisation de la variable 'tabSTCours'. L'élément 'COL_ProcéduresGlobales' n'a pas été trouvé.
</faultstring>
<detail>
Appel WL : Traitement de 'Procédure globale Chargement_Cours2' (Webservices), ligne 1, thread 0 Fonction 'ExécuteTraitement', syntaxe 0 Que s'est-il passé ? Erreur à l'initialisation de la variable 'tabSTCours'. L'élément 'COL_ProcéduresGlobales' n'a pas été trouvé. Code erreur : 1025 Niveau : erreur fatale (EL_FATAL) Dump de l'erreur du module 'wd190vm.dll' (19.0.176.4). Identifiant des informations détaillées (.err) : 1025 Informations de débogage : Chargement de la partie execution d'un objet Nom logique : COL_ProcéduresGlobales Type cherche : 0 Fonction (0,0) Informations supplémentaires : EIT_XINFO : <4>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Apparemment la collection de procédure "COL_ProcéduresGlobales" n'est pas dans la configuration du webservice.

Il faut déjà tester "manuellement" le wenservice de cette manière sinon c'est clair qu'il ne va pas envoyer un résultat qui pourra être interprété.

Bonne chance!
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 28 octobre 2014 - 10:20
Bonjour Jérôme,

C'est parce que je n'avais pas coché "COL_ProcéduresGlobales dans les éléments à intégrer dans le Webservice




Si je coche "COL_ProcéduresGlobales dans les éléments à intégrer,




Et que je le décoche dans éléments accessibles (pour ne pas le retrouver dans le Webservice dans WinDev Mobile




je n'ai plus d'erreur dans le test
http://studant.webdev-test.com/WS_STUDANT_WEB/awws/index.htm





Mais j'ai toujours le même message d'erreur, il y a encore quelque chose qui ne va pas...
Membre enregistré
179 messages
Popularité : +17 (17 votes)
Posté le 28 octobre 2014 - 14:25
Effectivement si je teste avec ton webservice j'ai la même erreur.

Je suis reparti de zéro et j'ai testé avec mon projet que j'ai déployé ici : http://test21.webdev-test.com/WS_TEST_STUDANT_WEB/awws/WS_test_studant.awws…

Là ça fonctionne correctement.

Pour que tu puisses voir ce qui est différent, le projet Webservice est ici : http://progx.ch/windev/WS_test_studant.zip
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 28 octobre 2014 - 14:32
Merci Jérôme,

Je regarde cela demain après-midi et je te tiens au courant

Cordialement,

Philippe
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 29 octobre 2014 - 08:05
Bonjour Jérôme,

j'ai eu le temps de comparer les 2 projets ce matin.

La seule différence est que dans mon projet la procédure SérialiseObj apparaît sous COL_ProcéduresGlobales alors que dans ton projet c'est à part




J'ai supprimé COL_ProcéduresGlobales du projet et je l'ai supprimé du disque (sinon à l'importation du tien cela reprenait le mien ?) j'ai importé le tien et je n'ai plus l'erreur.

Par contre cela ne me renvoi rien.
Trace(tabSTCours[i].sCours + " " + tabSTCours[i].dDate) ne devrait pas s'afficher sur le portable ?

dans l'aide, il est indiqué :




Ou puis-je trouver ce fichier log ?

Merci
Membre enregistré
91 messages
Popularité : +1 (1 vote)
Posté le 30 octobre 2014 - 07:41
Bonjour Jérôme,

J'ai remplacé Trace par info et j'ai enfin un retour sur le portable ---> CA MARCHE

je vais maintenant adapter cela avec mes requêtes et l'accès à la base de données.

Encore un grand merci pour ton aide.

Philippe