PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Tableau en sortie d'un WebService
Tableau en sortie d'un WebService
Débuté par LordK1, 03 mar. 2014 11:26 - 30 réponses
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 03 mars 2014 - 11:26
Bonjour à tous,

Nous avons récemment voulu mettre en place un webservice.

Rien de compliqué à la base, et tout fonctionne bien pour des choses assez basiques comme le renvoi du résultat unique d'une requête., et ce même dans une classe.

Là où ça se complique, c'est lorsque je souhaite faire renvoyer un tableau de résultats, comme une liste du personnel.
Lors des tests par l'interface html, je n'ai absolument rien dans le fichier xml de retour.

J'ai d'abord cru que le fait que mon tableau soit un tableau de structures posait problème, mais j'obtiens le même résultat quel que soit le type de contenu du tableau.

J'ai parcouru maints sujets, ici ou sur d'autres fora, testé pas mal de solutions, mais rien de concluant pour le moment.

Je vous livre mon code :

Déclaration globale de ma collection de procédures :

gclAgent_reponse est un Agent_atlas
gtabLeau_agents est un tableau de Agent_atlas


Une procédure qui fonctionne :

Procedure Agent_Atlas_par_matricule(matricule_atlas est un entier)

HExécuteRequête(REQ_agent_par_matricule,hRequêteDéfaut,matricule_atlas)

HLitPremier(REQ_agent_par_matricule)

gclAgent_reponse.m_nAgent_nom=REQ_agent_par_matricule.nom
gclAgent_reponse.m_nAgent_matricule=REQ_agent_par_matricule.matricule
gclAgent_reponse.m_dAgent_date_naissance=REQ_agent_par_matricule.date_naissance
gclAgent_reponse.m_sAgent_prenom=REQ_agent_par_matricule.prenom
gclAgent_reponse.m_sAgent_sexe=REQ_agent_par_matricule.sexe

RENVOYER gclAgent_reponse


La procédure qui ne renvoit rien :

Procedure Tous_les_agents()
SupprimeTout(gtabLeau_agents)

HExécuteRequête(REQ_tous_les_agents,hRequêteDéfaut)
HLitPremier(REQ_tous_les_agents)

TANTQUE PAS HEnDehors(REQ_tous_les_agents)

gclAgent_reponse.m_nAgent_nom=REQ_tous_les_agents.nom
gclAgent_reponse.m_nAgent_matricule=REQ_tous_les_agents.matricule
gclAgent_reponse.m_dAgent_date_naissance=REQ_tous_les_agents.date_naissance
gclAgent_reponse.m_sAgent_prenom=REQ_tous_les_agents.prenom
gclAgent_reponse.m_sAgent_sexe=REQ_tous_les_agents.sexe

TableauAjoute(gtabLeau_agents,gclAgent_reponse)

HLitSuivant(REQ_tous_les_agents)

FIN

RENVOYER gtabLeau_agents


En gros, renvoyer une structure concernant un agent fonctionne, mais renvoyer un tableau de ces structures non.
De même, renvoyer un tableau renvoyant une ligne par agent, sans passer par une structure, ne donne rien.

Je suis preneur de toute l'aide que vous pourrez m'apporter.
Posté le 03 mars 2014 - 14:57
bonjour,

Avez-vous essayé d'utiliser la fonction sérialise. Elle permet de transformer un tableau (entre autre) en XML.

http://doc.pcsoft.fr/fr-FR/index.awp?3013065

Bon développement
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 03 mars 2014 - 16:03
Bonjour, et merci pour la réponse.

Non, je n'ai pas testé cette fonction, puisque PCSoft annonce une gestion des structures et variables complexes dans les webservices sans avoir à l'utiliser depuis la version 18 de ses logiciels, si je ne m'abuse.

J'ai d'ailleurs continué mes tests depuis et constaté que je pouvais sans aucun soucis renvoyer un tableau classique de chaines ou d'entier, mais que plus rien n'est renvoyé si je passe à un tableau de classes ou à plusieurs dimensions.

En derniers recours, je tenterai d'utiliser la fonction serialise, mais si une autre solution existe, j'aimerais fortement la connaître.
Posté le 03 mars 2014 - 16:35
Bonjour,
voici mon code
vAgcode est un Variant
IF SansEspace(agcode)="" THEN
vAgcode=Null
ELSE
vAgcode=agcode

END

bOuvrebase est un booléen=Vrai
tabMontableau est un tableau de STCOL_REQ_FACTUREENLIGNES

IF bOuvrebase=Vrai THEN


//sfacture est une chaîne
//sfacture = Décrypte(lesfactures, "Yde2013+17=Douala2035-5", crypteSécurisé, Vrai)
REQ_FACTUREENLIGNES.pagence=vAgcode
REQ_FACTUREENLIGNES.Pdatedebut=datedeb
REQ_FACTUREENLIGNES.Pdatefin=datefin
SI PAS HExécuteRequête(REQ_FACTUREENLIGNES) ALORS
SI ErreurDétectée ALORS
ExceptionDéclenche(3,"Problème à l'initialisation de la requête "+HErreurInfo(hErrComplet))

FIN
FIN





FichierVersTableau(tabMontableau,REQ_FACTUREENLIGNES)
//sfacture=TableauVersCSV(tabMontableau)
HAnnuleDéclaration(REQ_FACTUREENLIGNES)
//sChaîneDécryptée est une chaîne
RENVOYER tabMontableau


Ca marche bien
Membre enregistré
6 messages
Posté le 04 mars 2014 - 08:14
Bonjour,

sauf erreur jusqu'à présent il n'est pas possible pour un webservice de retourner un tableau de structure. Par contre il est possible de retourner une structure qui contient un ou plusieurs tableau de structure.
J'ai ainsi adpater mes webservices :

ReponseListe est une structure
listeagents est un tableau de Agent_atlas
fin
.....
gRetour est un reponseListe

Remplissage de ton tableau de structure gtableau_agents
puis :

gretour:listeagent = gtableau_agent
renvoyer(gretour)

Pour l'utilisateur du webservice, il doit avoir la variable gretour et peut ainsi lire et exploiter le tableau de structure

Bon développement

Pascal BERNE
Posté le 04 mars 2014 - 09:33
Dans son message précédent, Pascal BERNE a écrit :
Bonjour,

sauf erreur jusqu'à présent il n'est pas possible pour un webservice de
retourner un tableau de structure. Par contre il est possible de retourner
une structure qui contient un ou plusieurs tableau de structure.
J'ai ainsi adpater mes webservices :

ReponseListe est une structure
listeagents est un tableau de Agent_atlas
fin
....
gRetour est un reponseListe

Remplissage de ton tableau de structure gtableau_agents
puis :

gretour:listeagent = gtableau_agent
renvoyer(gretour)

Pour l'utilisateur du webservice, il doit avoir la variable gretour et peut
ainsi lire et exploiter le tableau de structure

Bon développement

Pascal BERNE


J'ai plusieurs webservices qui renvoient des tableaux de structures et
ceci sans problèmes.
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 04 mars 2014 - 10:37
Ah, là c'est une piste que je n'avais pas exploré.
Depuis hier je tentais le sérialisation, qui ne donnait rien de plus, mais là j'ai du mieux avec une classe contenant mon tableau de classes.

Je récupère toujours pas mes données, mais je récupère au moins quelque chose. Reste plus qu'à trouver d'où vient cette erreur, mais je préfère ça.

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>L'opération u n'a pas été trouvée.</faultstring>
<detail>
Que s'est-il passé ? L'opération u n'a pas été trouvée. Code erreur : 620004 Niveau : erreur fatale (EL_FATAL) Dump de l'erreur du module 'wd190awws.dll' (19.0.5.0). Identifiant des informations détaillées (.err) : 620004
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 04 mars 2014 - 11:12
Philippe Lienart a écrit :

J'ai plusieurs webservices qui renvoient des tableaux de structures et
ceci sans problèmes.


Pourriez vous nous donner un exemple de code, ou nous dire ce qui, dans le mien, fait qu'aucune valeur n'est renvoyée ?

La structure contenant un tableau ne renvoi pour le moment qu'une erreur chez moi.
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 06 mars 2014 - 08:46
Bon, j'ai donc modifié mon code de diverses manières, afin de lui faire renvoyer une instance de classe, contenant un tableau d'une autre classe.

Ma déclaration de variables globales :
gclAgent_reponse est un Agent_atlas
gclListe_agents est une liste_atlas
gtabLeau_agents est un tableau de Agent_atlas


Mon code de procédure :
Procedure Tous_les_agents()


HExécuteRequête(REQ_tous_les_agents,hRequêteDéfaut)
HLitPremier(REQ_tous_les_agents)

TANTQUE PAS HEnDehors(REQ_tous_les_agents)

gclAgent_reponse.m_nAgent_nom=REQ_tous_les_agents.nom
gclAgent_reponse.m_nAgent_matricule=REQ_tous_les_agents.matricule
gclAgent_reponse.m_dAgent_date_naissance=REQ_tous_les_agents.date_naissance
gclAgent_reponse.m_sAgent_prenom=REQ_tous_les_agents.prenom
gclAgent_reponse.m_sAgent_sexe=REQ_tous_les_agents.sexe

TableauAjoute(gtabLeau_agents, gclAgent_reponse)

HLitSuivant(REQ_tous_les_agents)

FIN
gclListe_agents.tab_result = gtabLeau_agents
gclListe_agents.m_nUm_result=gtabLeau_agents..Occurrence
RENVOYER gclListe_agents


Et voici le code résultant d'un test :

<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body/>
</SOAP-ENV:Envelope>


Si je ne renvoie qu'un entier contenant gtabLeau_agents..Occurrence, je retrouve bien le nombre de listes de mon tableau. En revanche, dés que je renvoie mon instance de classe, je n'ai plus que le code ci-dessus. Ce qui est étrange étant donné que j'arrive à renvoyer une instance de ma classe agents.

Plusieurs jours que je tourne en rond à tester tout ce qui me passe par la tête sans résultat...
Je désespère.
Posté le 06 mars 2014 - 09:24
bONJOUR?
Remplaces la classe par un tableau de structure voir.
L'exemple que j'ai mis en ligne marche sans soucis. J'ai l'impression que c'est la différence entre toi et moi.
Posté le 06 mars 2014 - 10:42
LordK1 a pensé très fort :
Philippe Lienart a écrit :

J'ai plusieurs webservices qui renvoient des tableaux de structures et
ceci sans problèmes.

Pourriez vous nous donner un exemple de code, ou nous dire ce qui, dans le
mien, fait qu'aucune valeur n'est renvoyée ?

La structure contenant un tableau ne renvoi pour le moment qu'une erreur chez
moi.


Voici un exemple de code :

bufXML est un Buffer
i est un entier

ListeCategories est un tableau <agrandissement=1> de RefCategorie

i = 0
POUR TOUT dr_categories AVEC "IDCompetition = " +
NumériqueVersChaîne(IDConcours)
i++
ListeCategories[i]:Categorie = dr_categories.Category
ListeCategories[i]:Description = dr_categories.Description
FIN

Sérialise(ListeCategories,bufXML,psdXML)
RENVOYER bufXML
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 06 mars 2014 - 12:12
Bonjour et merci pour votre aide.

J'avais déjà essayé cette solution, qui me renvoyait une suite de caractères dans le buffer, mais je ne suis jamais parvenu à le déserialiser.
Dés lancement de la déserialisation, windev me retourne une laconique erreur "Format de sérialisation incorrect".

Sérialisation :

Procedure Tous_les_agents()

HExécuteRequête(REQ_tous_les_agents,hRequêteDéfaut)
HLitPremier(REQ_tous_les_agents)
bufXml est un Buffer
i est un entier = 1

TANTQUE PAS HEnDehors(REQ_tous_les_agents)

gtabLeau_agents[i]:m_nAgent_nom=REQ_tous_les_agents.nom
gtabLeau_agents[i]:m_nAgent_matricule=REQ_tous_les_agents.matricule
gtabLeau_agents[i]:m_dAgent_date_naissance=REQ_tous_les_agents.date_naissance
gtabLeau_agents[i]:m_sAgent_prenom=REQ_tous_les_agents.prenom
gtabLeau_agents[i]:m_sAgent_sexe=REQ_tous_les_agents.sexe

//TableauAjoute(gtabLeau_agents, gclAgent_reponse)

HLitSuivant(REQ_tous_les_agents)
i++

FIN
Sérialise(gtabLeau_agents, bufXml,psdXML)
RENVOYER bufXml


Désérialisation :

bufXml est un Buffer
tabLeau_agents est un tableau <agrandissement=1> de Agent_atlas

bufXml = Tous_les_agents()

//info(bufxml)
Désérialise(tabLeau_agents,bufXml,psdXML)

j est une entier = tabLeau_agents..Occurrence

POUR i = 1 A j
TableAjoute(TABLE_effectifs,tabLeau_agents[i]:m_nAgent_nom)
FIN


Je dois très certainement oublier un truc, mais je ne vois pas quoi.
En tout cas, grace à votre aide, j'ai l'impression de réellement avancer. Au bout de plusieurs jours de frustration, ça fait un bien fou.
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 06 mars 2014 - 15:20
Merci à tous les intervenants pour leur aide.
Le problème a été résolu par une lecture esprit reposé de l'aide, qui précise bien que pour un retour de tableau de structures, ces structures doivent être renseignées dans l'application de retour.

Un import de mes classes dans le projet utilisateur de mon webservice, et magie, la désérialisation fonctionne à merveille.

Rigueur, rigueur, rigueur :-)
Posté le 26 mars 2014 - 16:31
Salut LordK1,
Je suis buté au même blem. je dois moi aussi renvoyé une structure et dans une autre méthode, un table de structure. STP, pourrais-tu m'indiquer comment :
- tu as fait pour renvoyer une structure (démarche côté création du ws et côté consommation)
- tu as également fait pour renvoyer et récupérer un tableau de structures?
En tout cas, je galère depuis des jours.
Merci d'avance
Posté le 26 mars 2014 - 17:40
Bonjour,
Voici comment j'ai procédé pour renvoyer des structures et autre tableaux de
structure dans un WebService:
1. Dans le code de la collection de procédure, j'ai défini toutes les
structures utiles. Les tableaux sont systématiquement inclus dans une
structure.
Par exemple:
STVerifEncoursSku est une Structure
sSku est une chaîne
nQuantiteCommandee est un entier
FIN

STTabVerifEncoursSku est une Structure
tabListeVerif est un tableau dynamique de STVerifEncoursSku
FIN

STTabVerifEncoursSkuReponse est une Structure
sMessageGeneral est une chaîne
tabListeReponse est un tableau dynamique de STVerifEncoursSkuReponse
FIN

STVerifEncoursSkuReponse est une Structure
sSku est une chaîne
nQuantiteCommandable est un entier
sNotification est une chaîne
sAcceptOrDeny est une chaîne
FIN

2. Ensuite dans les procédures du WebService, j'utilise directement ces
structures:
PROCEDURE VerifEncoursSku(ParamSku est un STTabVerifEncoursSku)

Question est un STVerifEncoursSku
listeReponse est un STTabVerifEncoursSkuReponse

Reponse est un STVerifEncoursSkuReponse

POUR TOUT Question DE ParamSku:tabListeVerif
Reponse:nQuantiteCommandable = RecupEncours(Question:sSku)
Reponse:sAcceptOrDeny = ""
Reponse:sSku = Question:sSku
Reponse:sNotification = ""

TableauAjoute(listeReponse:tabListeReponse,Reponse)

FIN
listeReponse:sMessageGeneral = ""

RENVOYER listeReponse

Bref je ne renvoie jamais directement un tableau, je passe toujours par une
structure intermédiaire.
J'ai testé ce Webservice depuis une application Windev (en 18) et depuis un
site en PHP, et ça fonctionne parfaitement.
Pour la partie Windev il suffit d'importer le Webservice, de déclarer 2
variables, une de type STTabVerifEncoursSku à passer en paramètre, et une
autre de type STTabVerifEncoursSkuReponse pour récupérer le résultat, puis
d'appeler la méthode comme une procédure classique.

Frédéric.

"Christian Djo" a écrit dans le message de groupe de discussion :
201437247dc4859da2779e18842cf60427ec@news.pcsoft.fr...

Salut LordK1,
Je suis buté au même blem. je dois moi aussi renvoyé une structure et dans
une autre méthode, un table de structure. STP, pourrais-tu m'indiquer
comment :
- tu as fait pour renvoyer une structure (démarche côté création du ws et
côté consommation)
- tu as également fait pour renvoyer et récupérer un tableau de structures?
En tout cas, je galère depuis des jours.
Merci d'avance
Posté le 02 octobre 2015 - 16:12
Bonjour Frédéric,

Je réveille un ancien sujet car je n'arrive pas à me sortir de l'importation d'un tableau renvoyé par un Webservice

Dans ton dernier mail tu indiques :

"Pour la partie Windev il suffit d'importer le Webservice, de déclarer 2
variables, une de type STTabVerifEncoursSku à passer en paramètre, et une
autre de type STTabVerifEncoursSkuReponse pour récupérer le résultat, puis
d'appeler la méthode comme une procédure classique."

Pourrais-tu donner un exemple de code ?

Merci d'avance

Sam
Posté le 02 octobre 2015 - 16:36
Bonjour,
Comme je l'avais écrit, c'est tout simple.
Voici un exemple, avec un autre WebService (qui me sert sur un portail
mobile à afficher une liste d'application):
// Je passe sur la déclarations des diverses variables utilisées dans le
code, et d'une partie de l'initialisation
Appli est un ST_Application
gApplications = RecupApplications(gInfoEtb.stEtablissement.sCode)

// Création des groupes
POUR TOUT Groupe DE gApplications.tabListeGroupe
nNumAppli = 0
nIndice++
ONG_Groupe[nIndice + 1]..Libellé = Groupe.sNom
ONG_Groupe[nIndice + 1]..Visible = Vrai
// Ensuite je dois ajouter les applications dans la zone répétée
POUR TOUT Appli DE Groupe.tabListeApplication
nNumAppli++
ZoneRépétéeAjouteLigne("ZR_TabListeApplication" +
nIndice,Appli.sDescription,Appli.sCode,Appli.sNom,Appli.sFenetrePrincipale,Appli.sIcone)
FIN
FIN

Et la description des types de données dans le WebService:
ST_Rapport est une Structure
bOK est un booléen
nNiveau est un entier
sMessage est une chaîne
FIN

ST_Application est une Structure
sCode est une chaîne
sNom est une chaîne
sDescription est une chaîne
sIcone est une chaîne
sFenetrePrincipale est une chaîne
FIN

ST_Groupe est une Structure
sCode est une chaîne
sNom est une chaîne
tabListeApplication est un tableau de ST_Application
FIN

ST_RetourRecupApplications est une Structure
stRapport est un ST_Rapport
tabListeGroupe est un tableau de ST_Groupe
FIN

Je n'ai rien fait de bien sorcier ici... J'ai déclaré des structures dans le
Webservice, et à l'import de celui-ci dans un projet les structures sont
directement utilisables, y compris les tableaux.

C'est fait avec les versions 20 de Windev et Windev Mobile, mais je pense
que ça fonctionne aussi avec la version 19.

Frédéric.
"Sam" a écrit dans le message de groupe de discussion :
2015066322d7a5dc146197e7e52edc0f374a@news.pcsoft.fr...

Bonjour Frédéric,

Je réveille un ancien sujet car je n'arrive pas à me sortir de l'importation
d'un tableau renvoyé par un Webservice

Dans ton dernier mail tu indiques :

"Pour la partie Windev il suffit d'importer le Webservice, de déclarer 2
variables, une de type STTabVerifEncoursSku à passer en paramètre, et une
autre de type STTabVerifEncoursSkuReponse pour récupérer le résultat, puis
d'appeler la méthode comme une procédure classique."

Pourrais-tu donner un exemple de code ?

Merci d'avance

Sam
Posté le 02 octobre 2015 - 17:36
Merci Frédéric,

Donc tu ne crée plus les 2 variables dont tu parlais coté client ?
Posté le 02 octobre 2015 - 17:54
Si, c'est en première ligne du code:
Appli est un ST_Application
Mais effectivement j'en ai oublié une dans mon copier/coller:
Groupe est un ST_Groupe

Mais le principe est là:
Dans le projet WebService, tu déclares des structures qui seront utilisées
pour déclarer soit les paramètres des méthodes, soit leur retour.
Dans le projet "client", dans lequel tu importes le WebService, tu déclares
tes variables en utilisant ces structures, et tu peux appeler les méthodes
du WebServices comme si elles étaient déclarées dans une collection de
procédure.
Bref une fois le WebService importé, c'est complètement transparent.

Par contre j'ai toujours "encapsulé" mes tableaux dans des structures, pour
éviter les éventuelles problèmes, et surtout car je trouve ça plus propre.

Si vraiment tu n'y arrives pas, le mieux serait de nous montrer ton code, en
nous expliquant ce qui ne fonctionne pas.

Frédéric.
"Sam" a écrit dans le message de groupe de discussion :
2015ae9bcf7f54efdf6087fd151e08149ac9@news.pcsoft.fr...

Merci Frédéric,

Donc tu ne crée plus les 2 variables dont tu parlais coté client ?
Posté le 03 octobre 2015 - 09:06
Bonjour Frédéric,

J’ai un peu avancé mais je suis encore bloqué coté client.

Voici mon code

COTE WS

ST_informationsProduit est une Structure
designationCourte est une chaîne
designationLongue est une chaîne
grilleTailles est chaîne
imageProduit est Buffer
FIN

tab_infosProduitReponse est un tableau de ST_informationsProduit

st_infosProduitTemp est un ST_informationsProduit

PROCEDURE DE RECHERCHE

PROCEDURE AfficheInfosProduit(ReferenceProduit est chaîne)

HLitRecherche(Produits,ReferenceProduit,ReferenceProduit,hIdentique)

SI HTrouve(Produits) ALORS
st_infosProduitTemp.designationCourte = Produits.DesignationcourteProduit
st_infosProduitTemp.designationLongue = Produits.DesignationlongueProduit
st_infosProduitTemp.grilleTailles = Produits.Tailles

TableauAjoute(tab_infosProduitReponse,st_infosProduitTemp)

RENVOYER tab_infosProduitReponse
SINON
RENVOYER Faux
FIN

COTE CLIENT

// ici je déclare le tableau contenant la structure du WS
Tab_ReponseProduit est un tableau de ST_informationsProduit

Après, je ne sais plus trop comment récupérer le résultat

Si je fais
Tab_ReponseProduit = MonWebservices.AfficheInfosProduit(SAI_RechercheReference)

Je récupère l’erreur suivante
« Types incompatibles durant une affectation. »

Merci d’avance

Sam
Membre enregistré
64 messages
Popularité : +2 (2 votes)
Posté le 03 octobre 2015 - 09:26
Bonjour Frédéric,

J’ai un peu avancé mais je suis encore bloqué coté client.

Voici mon code

COTE WS

ST_informationsProduit est une Structure
designationCourte est une chaîne
designationLongue est une chaîne
grilleTailles est chaîne
imageProduit est Buffer
FIN

tab_infosProduitReponse est un tableau de ST_informationsProduit

st_infosProduitTemp est un ST_informationsProduit

PROCEDURE DE RECHERCHE

PROCEDURE AfficheInfosProduit(ReferenceProduit est chaîne)

HLitRecherche(Produits,ReferenceProduit,ReferenceProduit,hIdentique)

SI HTrouve(Produits) ALORS
st_infosProduitTemp.designationCourte = Produits.DesignationcourteProduit
st_infosProduitTemp.designationLongue = Produits.DesignationlongueProduit
st_infosProduitTemp.grilleTailles = Produits.Tailles

TableauAjoute(tab_infosProduitReponse,st_infosProduitTemp)

RENVOYER tab_infosProduitReponse
SINON
RENVOYER Faux
FIN

COTE CLIENT

// ici je déclare le tableau contenant la structure du WS
Tab_ReponseProduit est un tableau de ST_informationsProduit

Après, je ne sais plus trop comment récupérer le résultat

Si je fais

Tab_ReponseProduit = MonWebservices.AfficheInfosProduit(SAI_RechercheReference)

Je récupère l’erreur suivante

« Types incompatibles durant une affectation. »

Merci d’avance

Sam
Membre enregistré
135 messages
Popularité : +8 (8 votes)
Posté le 04 octobre 2015 - 07:31
Bonjour Sam,

Ta procédure retourne soit un booleen soit ton tableau. Ca peut expliquer ton problème. A la place, je retournerai systématiquement une structure qui contient ton tableau + un code d'erreur par exemple. De cette manière dans la partie 'client' tu récupères toujours une structure de ce type.

Exemple rapide :
MonTableau est une structure
tab_infosProduitReponse est un tableau de ST_informationsProduit
CodeErreur est un entier
FIN

Tu pourrais te contenter de retourner seulement le tableau vide en cas d'erreur mais la partie client n'aurai aucune info (ma requete retourne rien ou c'est une erreur ???)

--
Dominique DAUSSY
http://www.serviceinfo76.com
Membre enregistré
64 messages
Popularité : +2 (2 votes)
Posté le 04 octobre 2015 - 08:43
Bonjour Dominique,

Merci pour ta réponse.

Je me suis en effet rendu compte entre temps que le RENVOYER Faux n'avait pas de sens.

Mon code est donc devenu

HLitRecherche(Produits,ReferenceProduit,ReferenceProduit,hIdentique)

SI HTrouve(Produits) ALORS

st_infosProduitTemp.designationCourte = Produits.DesignationcourteProduit
st_infosProduitTemp.designationLongue = Produits.DesignationlongueProduit
st_infosProduitTemp.grilleTailles = Produits.Tailles

FIN

TableauAjoute(tab_infosProduitReponse,st_infosProduitTemp)

Malgré cela, j'ai toujours le message d'erreur « Types incompatibles durant une affectation. »

Cordialement

Sam
Membre enregistré
1 287 messages
Popularité : +20 (72 votes)
Posté le 04 octobre 2015 - 21:09
Attention,

En retour de Webservice, si le retour est un tableau seul, pour je ne sait quelle raison rien n'est renvoyer

J'ai donc l'habitude en renvoi de WS de toujours renvoyer une structure unique. qui contient au moins une variable

par exemple

STMesDonnes est une structure
madonnee1 est une chaîne
madonnee2 est une chaîne
madonnee3 est une chaîne
madonnee4 est une chaîne
FIN

STMonretour est une structure
Validation est un boleen
TabMesDonnees est un tableau de STMesDonnes
FIN


--
Bertin CARRIERE
Consultant & Formateur
bertin.carriere@gmail.com
http://www.zen-project.be http://www.linkedin.com/in/bertincarriere

Belgique +32(0)2/318.02.67
France +33(0)3/66.722.542
Espagne +34.5/12.702.266

Membre de http://www.be-dev.be
Membre enregistré
64 messages
Popularité : +2 (2 votes)
Posté le 05 octobre 2015 - 11:55
Bonjour et merci pour ces retours

Je récupère bien dans le client le tableau renvoyé par le WS mais je n'arrive pas à récupérer les infos de ce tableau

Sam
Membre enregistré
1 287 messages
Popularité : +20 (72 votes)
Posté le 05 octobre 2015 - 13:27
en parcourant la structure
pour i = 1 a TabMesDonnees..occurence

Trace (TabMesDonnees[i].madonnee1
Trace (TabMesDonnees[i].madonnee2
Trace (TabMesDonnees[i].madonnee3

FIN


--
Bertin CARRIERE
Consultant & Formateur
bertin.carriere@gmail.com
http://www.zen-project.be http://www.linkedin.com/in/bertincarriere

Belgique +32(0)2/318.02.67
France +33(0)3/66.722.542
Espagne +34.5/12.702.266

Membre de http://www.be-dev.be
Posté le 05 octobre 2015 - 14:29
Tu peux nous montrer ton code ?
Car dans celui que j'ai posté il y a bien un parcours du tableau récupéré
via mon WebService...

Frédéric.

"SAM" a écrit dans le message de groupe de discussion :
2015da4e013bb6f8802a6a0cda4be2f89a30@news.pcsoft.fr...

Bonjour et merci pour ces retours

Je récupère bien dans le client le tableau renvoyé par le WS mais je
n'arrive pas à récupérer les infos de ce tableau

Sam
Membre enregistré
64 messages
Popularité : +2 (2 votes)
Posté le 05 octobre 2015 - 16:27
C'est bon, j'ai réussi à m"en sortir.

Bizarrement, le type "response" du ws n'apparaissait pas sur le client.

Je m'explique.

Si coté WS on a une procédure qui s'appelle PROC_A et qu'on fait un RENVOYER TabResultat.

On est sensé (si j'ai bien tout compris) récupérer coté client un type qui se nomme PROC_Aresponse dans lequel on trouve PROC_Aresult. C'est précisément dans PROC_Aresult qu'on récupère le résultat du WS.

Et bien, ce type response n'apparaissait pas coté client.

Après plusieurs tests de passage des structures en déclarations globales et autres coté WS, le type response est apparu coté client après import du WS.

Je ne sais pas si c'est clair... en tout cas je récupère bien mon tableau de résultat coté client.

Merci en tout cas pour l'aide à ceux qui ont répondu à ma problématique

Bon devs

Sam
Posté le 05 octobre 2015 - 17:01
Non, rien ne dit qu'on récupère un PROC_AResponse. Si le type de TabResultat
s'appelle ST_TOTO, on va récupérer une une variable de type ST_TOTO.
Dans l'exemple que j'ai donné, je suis à l'origine des noms des structures
utilisés dans les échanges.
J'ai pris cette règle de nommage pour des raisons de lisibilité du code.

Il est clair que les définitions des structures sont déclarées dans l'init
du projet du WbeService, pour être utilisables dans les projets clients.

Frédéric.

"SAM" a écrit dans le message de groupe de discussion :
2015df71c305c4686010824fd017ec970398@news.pcsoft.fr...

C'est bon, j'ai réussi à m"en sortir.

Bizarrement, le type "response" du ws n'apparaissait pas sur le client.

Je m'explique.

Si coté WS on a une procédure qui s'appelle PROC_A et qu'on fait un RENVOYER
TabResultat.

On est sensé (si j'ai bien tout compris) récupérer coté client un type qui
se nomme PROC_Aresponse dans lequel on trouve PROC_Aresult. C'est
précisément dans PROC_Aresult qu'on récupère le résultat du WS.

Et bien, ce type response n'apparaissait pas coté client.

Après plusieurs tests de passage des structures en déclarations globales et
autres coté WS, le type response est apparu coté client après import du WS.

Je ne sais pas si c'est clair... en tout cas je récupère bien mon tableau de
résultat coté client.

Merci en tout cas pour l'aide à ceux qui ont répondu à ma problématique

Bon devs

Sam
Membre enregistré
64 messages
Popularité : +2 (2 votes)
Posté le 05 octobre 2015 - 17:25
Alors je ne comprends pas pourquoi je récupère coté client ces infos (copie écran ci-après) que je n'ai pas créé dans le projet ... En tout ca je peux bien les utiliser.
Si quelqu'un a une réponse ...




Posté le 21 juin 2017 - 18:21
:) Magnifique. Vous m'avez sauvé. Merci beaucoup