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

WinDev Discussion :

Récupérer résultats requête SQL par un webservice


Sujet :

WinDev

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 498
    Points : 461
    Points
    461
    Par défaut Récupérer résultats requête SQL par un webservice
    Bonjour à tous,

    J'avance dans la réalisation de mon (mes) webservice(s) (merci tatayo!!). Avant de continuer, j'aimerais savoir comment je peux récupérer un résultat par un webservice. Je m'explique : j'aimerai passer à une procédure une chaine représentant une requête SQL et j'aimerai que le webservice me renvoie le résultat dans un tableau(?) ou autre.
    2ème interrogation, je prévois une connexion-déconnexion autour de chaque requête, ce qui veut dire que lorsque je souhaiterai faire une transaction SQL, il faudra faire une procédure spécial dans le webservice... comment avez-vous appréhendé cela?
    Enfin 3ème question, peut-on comparer l'exécution du webservice à un thread? C'est à dire qu'un webservice lancé simultanément par plusieurs instances vont se "parallèliser" (j'aime ce terme!! ).
    merci d'avance pour vos réponses!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Bonjour,
    Dans mes WebServices, je transforme le résultat de ma requête en chaine (séparateur de colonne TAB et le ligne RC), et j'envoie le tout. Bref une sérialisation à la main, mais mes WebServices ont été écrit en version 10 et la sérialisation ne fonctionnait pas très bien (ou en tout cas je n'avais pas réussi à la faire fonctionner ).
    Peut-être qu'avec la version 15 ça fonctionne correctement.

    Tu peux aussi créer une chaine XML, et la parser à l'arriver.
    Ou alors utiliser un tableau de structure, qui semble aussi fonctionner correctement depuis la 15 (peut-être aussi la 14, en tout cas en 12 ça ne fonctionnait pas très bien).

    Bref tu as quelques pistes à explorer

    Tatayo.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 498
    Points : 461
    Points
    461
    Par défaut
    Bon alors, j'ai décidé de remplir un tableau dynamique de chaines et de le sérialiser à l'aide de la fonction Serialise() avec le type psdXML. Hors Webservice, ma procédure fonctionne mais à travers le webservice nada.
    En local le résultat de ma fonction est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0"?>
    <DOCUMENT xmlns:SOAP_ENC="http://schemas.xmlsoap.org/soap/encoding/">
    	<tab_Res SOAP_ENC:arrayType="tab_Res[2,2]">
    		<item>Code1</item>
    		<item>Libelle1</item>
    		<item>Code2</item>
    		<item>Libelle2</item>
    	</tab_Res>
    </DOCUMENT>
    et par le webservice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="ISO-8859-1"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ><soap:Body><DonneRenseignementArticleResponse xmlns="TPWebServiceServeur"><DonneRenseignementArticleResult xmlns:ns2="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:string"></DonneRenseignementArticleResult></DonneRenseignementArticleResponse></soap:Body></soap:Envelope>
    autrement dit pas de résultat. Si je renvoie une chaine, pas de soucis (ce qui met ma liaison SQL hors de cause) mais un tableau de chaines à 2 dimensions... argh

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 498
    Points : 461
    Points
    461
    Par défaut
    Bon alors avec une chaine de caractères séparée par des TAB et des RC côté serveur et un ChaineVersTableau() côté client pas de soucis mais je pense qu'il y a sans doute mieux à faire...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Je suis tout à fait d'accord, et ce d'autant plus que dans un projet, j'ai importé le WebService de l'application Magento, et celui-ci me renvoie des tableaux de structures imbriqués (une structure qui contient un tableau de structure, qui contient un tableau de structure, etc...). Et ça fonctionne parfaitement, sans aucune sérialisation/désérialisation.
    Peut-être que tu peux regarder de ce côté ci, plutôt que de renvoyer directement un tableau, tu renvoies une structure qui contient ton tableau.

    Tatayo.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 498
    Points : 461
    Points
    461
    Par défaut
    J'ai essayé de créer une classer avec un membre tableau dynamique dans mon webservice. J'ai une méthode qui affecte le tableau de résultats au tableau de la classe et je renvoie ma classe.
    Côté client, je définit une classe identique et je l'affecte au retour de mon webservice mais je m'y attendais :
    Erreur : On ne peut pas affecter à un objet autre chose qu'un objet de la même classe.

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Merci de donner les morceaux de code intéressants en plus de l'erreur.

    Sans vouloir être tatillon, on manipule des objets et non une classe. Une bonne terminologie est importante.

    Et enfin, le webservice n'est pas capable de renvoyer des objets directement, une serialisation est nécessaire. Est ce que vous utilisez ce mécanisme ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 498
    Points : 461
    Points
    461
    Par défaut
    Ok donc voici les parties de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    PROCEDURE RésultatsRequetes(sRequeteTemp, nbchamps)
    clResul est un CRésultats
    nb est un entier = nbchamps
    i, j sont des entiers = 0
     
    ResSQL est un booléen
    tab_Res est un tableau dynamique de 1 par nbchamps chaînes
     
    sChaineRes est une chaîne = ""
    ResSQL = SQLExec(sRequeteTemp, "REQ1")
    SI ResSQL ALORS
    	tab_Res[1][1] = "0"
    	TANTQUE SQLAvance("REQ1") = 0 // Il y a encore une ligne à lire
    		// Récupérer les données
    		i++
    		SI i > 1 ALORS
    			AjouteLigne(tab_Res)
    		FIN
    		POUR j=1 A nb
    			tab_Res[i][j] = SQLLitCol("REQ1", j)
    		FIN
    	FIN
    SINON
    	SQLInfoGene()
    	tab_Res[1][1] = "-1"
    	Erreur("La requête a échouée."+RC+...
    	"Code erreur : " + SQL.Erreur +RC+...
    	SQL.MesErreur)
    FIN
    SQLFerme("REQ1")
    clResul.Affecter(tab_Res)
    // Sérialisation
    //bufXML est un Buffer 
    //Sérialise(tab_Res, bufXML, psdXML)
    RENVOYER clResul
    ça c'est la procédure appelée dans le webservice.
    La définition de ma classe et la méthode affecter()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CRésultats est une classe
    	tab_Res est un tableau dynamique
    FIN
    PROCEDURE Affecter(Res)
    :tab_Res = allouer un tableau de 0 chaîne
    :tab_Res = Res
    Voilà mon webservice côté serveur.
    Côté client, je re-déclare ma classe CRésultats et l'affecte au résultat de ma procédure RésultatsRequetes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    clRes est un CRésultats
    clRes = clTest.RésultatsRequetes(sRequeteTemp, 2)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 498
    Points : 461
    Points
    461
    Par défaut
    En consultant l'aide, je me suis aperçu que :
    Les types simples (booléen, entier, ...) utilisés dans le service Web XML sont automatiquement convertis au format WinDev/WebDev (et inversement) lors de l'importation du service dans un projet WinDev/WebDev. Les types Tableaux sont également gérés.
    Je repars donc sur mon projet de tableau. Avant de retourner le tableau je le sérialise de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    buf est une chaîne 
    Sérialise(tab_Res, buf, psdBinaire)
    RENVOYER buf
    Côté client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gsChaineTestXML est une chaîne
    tabRes est un tableau de 0 par 2 chaînes 
    gsChaineTestXML = clTest.RésultatsRequetes(sRequeteTemp, 2)
    Désérialise(tabRes, gsChaineTestXML, psdBinaire)
    Et là, erreur d'exécution :
    vous avez appelé la fonction Désérialise.
    Format des informations binaires incorrect
    (...)
    Code erreur : 2605

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    D'après ce que je comprends de l'aide, vu que les tableaux sont gérés, il n'y a pas besoin de sérialiser/désérialiser ceux-ci. Sinon pourquoi annoncer qu'ils sont gérés automatiquement, si tout est manuel ?

    Tatayo.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 498
    Points : 461
    Points
    461
    Par défaut
    Oui moi aussi!! Malheureusement que je sérialise ou non, je ne retourne aucun résultat et le service web ne détecte pas de tableau mais une chaine de caractères!

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Juste une question: est-ce que tu as tenté de renvoyer une structure qui contient un tableau ? C'est ce que me renvoient les Webservices de l'application Magento, et Windev (côté client) le gère parfaitement depuis la version 14*. Et en fouillant dans le code généré lors de l'import du WebService, il n'y a aucune trace de désérialisation. Par contre le "conteneur" renvoyé est toujours une structure.
    Si par exemple je demande une liste de commande, je n'ai pas un tableau contenant les commandes, mais une structure qui contient un tableau, qui lui contient les commandes (sous forme d'une autre structure).

    Tatayo.

    *: en fait ça fonctionne parfaitement si on l'intègre sous forme de collection de procédure. En l'intégrant sous forme d'objet, le code généré est incomplet, buggué et ne compile même pas !

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    498
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 498
    Points : 461
    Points
    461
    Par défaut
    Une structure déclaré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    STResultats est une structure
    	ptabTab est un tableau dynamique
    FIN
    dans le webservice devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    STResultats est une classe
    ptabTab est chaîne
    FIN
    à l'importation dans le client
    je tourne en rond...

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/10/2012, 22h34
  2. [MySQL] Affichage résultat requête SQL dans page HTML comme un tableau
    Par joxbl dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 14/03/2011, 14h26
  3. Récupérer valeur requête SQL
    Par joquetino dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 10/08/2006, 15h23
  4. Réponses: 2
    Dernier message: 03/05/2006, 08h22
  5. [D5][BDE][Multibase] Récupérer les requêtes SQL d'une TTable
    Par Escandil dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/01/2006, 14h29

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