IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 32
    Points : 55
    Points
    55
    Par défaut Génération de services web défaillante avec tableau d'objet comportant des types DATE, NUMERIQUE et MONETAIRE
    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 :

    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
    Avec un constructeur suivant:

    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 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
     
    Procedure afficheOpération()
       Info(_NUM_DOSSIER,_DAT_OPERATION,_NATURE_OPERATION,_DETAIL_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
    4
     
    Procedure testDetailFinancier()
       monDetail est un DetailFinancier("ABCD123456",DateSys(),"FAC","FACTURE 2015-42",200)
       monDetail.afficheOpération()
    Et obtient le résultat suivant:

    Nom : 01.PNG
Affichages : 349
Taille : 3,6 Ko

    Jusque là, aucun problème...

    Je modifie ma méthode de test pour renvoyer l'objet "DetailFinancier" :

    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
    Cela fonctionne (normal...). :

    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

    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
    Le message d'erreur est le suivant:

    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.

    Nom : 02.PNG
Affichages : 307
Taille : 1,3 Ko

    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"...

    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
    Cela fonctionne toujours.

    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...

    Nom : 03.PNG
Affichages : 339
Taille : 76,6 Ko

    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.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bsoir,

    tu ne peux pas mieux tomber, je suis en plein dans les webservices (codés avec windev 20 et déployés sur un serveur Webdev)
    Je n'ai pas procédé comme ça; en fait mes méthodes dans le webservice jouent bien avec des objets mais elles renvoient toujours du xml (avec la fonction Serialise)
    De l'autre coté, l'appli qui recoit les données fait un Désérialise et récupère l'objet, du coup les types fonctionnent tous (entiers, chaines, dates, heure....) et les infos demandées sont bien récupérées.

    Je suis surpris par le fait qu'un Webservice puisse renvoyer un objet d'un certain type (monDossier par exemple qui serait un objet de type cDossier)
    Disons plutôt que je ne pensais pas que ça marche si bien c'est pourquoi tout ce qui circule sur le réseau c'est de l'XML, à mon sens l'interopérabilité voulue quand on utilise un webservice ne doit pas conduire à exposer des objets de façon directe. J'expose le XML qui servira à recréer l'objet mais pas l'objet lui même. Après, je n'utilise que du full windev donc il est normal qu'il se comprenne.

Discussions similaires

  1. Services Web annotés avec SAWSDL
    Par N.Reda dans le forum Services Web
    Réponses: 3
    Dernier message: 25/03/2013, 11h54
  2. Création de services web php avec Flash builder
    Par errog dans le forum EDI/Outils
    Réponses: 8
    Dernier message: 06/01/2011, 14h12
  3. génération des services web pour une classe composée
    Par kinfo2 dans le forum Services Web
    Réponses: 1
    Dernier message: 12/12/2010, 13h06
  4. services web xml avec vba excel
    Par naim8622 dans le forum VB.NET
    Réponses: 0
    Dernier message: 15/01/2009, 16h21
  5. Vidéo Tutorial Service Web C# avec Telnet
    Par irnbru dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 14/06/2007, 11h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo