|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
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 :
TabListeCoursLu est un Chargement_Nouveaux_CoursResponse bufTabListeCoursLu est un buffer = WS_Studant.Chargement_Nouveaux_Cours(Paramètres... Désérialise(TabListeCoursLu ,psdXML)
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 |
| |
| |
| | | |
|
| | |
| |
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 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|