Bonjour à tous,
Je rencontre des problèmes en souhaitant créer des services web qui renvoient des objets (et tableaux d'objets) créés avec Windev.
Je ne suis pas un développeur pro... je vous explique donc mon raisonnement par étape...
Je souhaite que mon service web renvoie une liste d'objets "DetailFinancier". Cet objet (pour les besoins de ce post) est défini comme suit :
Avec un constructeur suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 DetailFinancier est une Classe _NUM_DOSSIER est une chaîne _DAT_OPERATION est une Date _NATURE_OPERATION est une chaîne _DETAIL_OPERATION est une chaîne _MONTANT_OPERATION est un monétaire FIN
Je crée une méthode utilisée à des fins de test (pas utilisée dans un service web bien sûr) qui me permettent de voir si la construction de mon objet se passe bien:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Procedure Constructeur(NUM_DOSSIER est une chaîne = "", DAT_OPERATION est une Date = "20150909", NATURE_OPERATION est une chaîne = "", DETAIL_OPERATION est une chaîne = "", MONTANT_OPERATION est un monétaire = 0) _NUM_DOSSIER = NUM_DOSSIER _DAT_OPERATION = DAT_OPERATION _NATURE_OPERATION = NATURE_OPERATION _DETAIL_OPERATION = DETAIL_OPERATION _MONTANT_OPERATION = MONTANT_OPERATION
Je vais utiliser l'objet et appeler la méthode:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Procedure afficheOpération() Info(_NUM_DOSSIER,_DAT_OPERATION,_NATURE_OPERATION,_DETAIL_OPERATION,_MONTANT_OPERATION)
Et obtient le résultat suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Procedure testDetailFinancier() monDetail est un DetailFinancier("ABCD123456",DateSys(),"FAC","FACTURE 2015-42",200) monDetail.afficheOpération()
Jusque là, aucun problème...
Je modifie ma méthode de test pour renvoyer l'objet "DetailFinancier" :
Cela fonctionne (normal...). :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Procedure testDetailFinancier() monDetail est un DetailFinancier("ABCD123456",DateSys(),"FAC","FACTURE 2015-42",200) RENVOYER monDetail
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <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:Header> <WSID xmlns="urn:NomDuProjet" xsi:type="xsd:hexBinary" mustUnderstand="1">XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</WSID> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns1:testDetailFinancierResult xmlns:ns1="urn:eMed"> <_NUM_DOSSIER>ABCD123456</_NUM_DOSSIER> <_DAT_OPERATION>2015-09-09</_DAT_OPERATION> <_NATURE_OPERATION>FAC</_NATURE_OPERATION> <_DETAIL_OPERATION>FACTURE 2015-42</_DETAIL_OPERATION> <_MONTANT_OPERATION>200</_MONTANT_OPERATION> </ns1:testDetailFinancierResult> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Cela se corse lorsque je veux utiliser le constructeur de mon objet en parcourant un fichier de base de données. Le code suivant plante lamentablement
Le message d'erreur est le suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Procedure testDetailFinancier(ReferenceDossier est une chaîne) HExécuteRequête(MAREQUETE,hRequêteDéfaut, ReferenceDossier) HLitPremier(MAREQUETE) SI HTrouve(MAREQUETE) ALORS monDetailFinancier est un DetailFinancier(MAREQUETE.REFERENCE,MAREQUETE.DATEOPERATION,MAREQUETE.NATUREOPERATION,MAREQUETE.DETAILOPERATION,MAREQUETE.MONTANTOPERATION) monDetailFinancier.afficheOpération() FIN
Erreur à la ligne 5 du traitement Procédure globale testDetailFinancier.
Le passage du paramètre 2 a provoqué une erreur.
Dans le cas d'un passage de paramètre par adresse, un élément de type 'chaîne ANSI' ne peut pas être converti vers le type 'date'. Utilisez un paramètre local dans la procédure appelée ou passez un paramètre de type 'date'.
Il est à noter (cela me semble important) que mon deuxième élément (MAREQUETE.DATEOPERATION) est de type date dans la base de données.
Qu'à cela ne tienne, je peux envoyer cet élément par valeur au lieu d'adresse grâce aux parenthèses, pour que mon code fonctionne...
Ou encore (mieux ?) passer par une variable date qui récupère MAREQUETE.DATEOPERATION que j'envoie en paramètre à mon constructeur.
AfficheOperation() fonctionne correctement avec ces deux options, j'en déduit donc que mon objet fonctionne... Puisque la méthode est appelée et que mon Info() fonctionne... Jusque là, mon service web fonctionne aussi.
Bien sur, ce qui m'intéresse, c'est d'avoir tous les détails financiers d'un dossier... Je modifie donc mon code test pour parcourir tous les éléments de ma requête, et dans un premier temps, j'utilise AfficheOperation() pour voir si "tout fonctionne"...
Cela fonctionne toujours.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Procedure testDetailFinancier(ReferenceDossier est une chaîne) tabDetails est un tableau de DetailFinancier HExécuteRequête(MAREQUETE,hRequêteDéfaut, ReferenceDossier) POUR TOUT MAREQUETE maDate est une date = MAREQUETE.DATEOPERATION monDetailFinancier est un DetailFinancier(MAREQUETE.REFERENCE, maDate ,MAREQUETE.NATUREOPERATION,MAREQUETE.DETAILOPERATION,MAREQUETE.MONTANTOPERATION) monDetailFinancier.afficheOpération() TableauAjoute(tabDetails,monDetailFinancier) FIN
Si en valeur de retour de ma fonction, j'envoie mon tableau tabDetails, le service web ne fonctionne plus :
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <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:Header> <WSID xmlns="urn:NomApplication" xsi:type="xsd:hexBinary" mustUnderstand="1">XXXXXXXXXXXXXXXXXXX</WSID> </SOAP-ENV:Header> <SOAP-ENV:Body/> </SOAP-ENV:Envelope>
Alors que ça fonctionne très bien si j'abandonne toutes les variables de type NUMERIQUE, MONETAIRE ou DATE...
Plusieurs questions se posent...
Ne peut-on pas utiliser "à 100%" nos objets lorsqu'ils sont intégrés à des tableaux renvoyés par nos procédures service web ?
Il y a t'il des limitations "de type" lorsque nous utilisons des services web ?
Ou tout simplement, faut-il travailler "autrement" ? et comment ?
Merci à ceux qui m'aideront
A bientôt.
Partager