Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > InfoPath

InfoPath Forum d'entraide sur InfoPath (concevoir des formulaires basés sur XML)

Réponse
 
Outils de la discussion
Vieux 16/05/2008, 14h34   #1 (permalink)
Invité régulier
 
Date d'inscription: mars 2008
Messages: 12
Par défaut Webservice OK, infopath renvoi vide

Bonjour à tous,

J'ai cree un webservice qui me renvoi des données d'une table sql server par un SELECT et qui test si le dataset est vide.

S'il est vide il fait un SÉLECT particulier qui me renvoi obligatoirement des valeurs par défaut ajouter dans ma table Sql.

Il y a donc un if dans mon web service qui me renvoie Ds2 si Ds est vide, sinon il me renvoi Ds.

Dans infopath, ces résultats s'affichent dans un menu déroulant.

Mon web service demande 3 valeurs (nfacture, codeproduit, AT)

En test par visual studio, il me renvoie exactement ce que je veux.
Le web service fonctionne parfaitement.

Dans infopath, je crée la connection de donnée et en fonction des échantillons que je met il me renvoie soit ce qu'il faut, soit rien.

Par contre, pour tester j'ai lié le résultat de la requête a un tableau extensible.

Dans le cas ou ca ne fonctionne pas, ce tableau m'affiche pourtant le bon nombre de ligne qu'il est supposé trouver mais vide.

Cela vient-il des échantillons que je lui indique ?

J'ai également tester en les précisant moi même dans des champs les valeurs envoyé à mon web service. mes liaisons à la connection de donnée sont donc correct.

Je suis dans l'impasse.
Haziel est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/05/2008, 15h12   #2 (permalink)
Membre du Club
 
Avatar de cocosql
 
Date d'inscription: avril 2008
Âge: 19
Messages: 83
Par défaut

J'ai eu un peu le même souci que toi.

Précise un petit peu stp :

-Le type de tes paramètres.
Citation:
Dans le cas ou ca ne fonctionne pas, ce tableau m'affiche pourtant le bon nombre de ligne qu'il est supposé trouver mais vide.

Cela vient-il des échantillons que je lui indique ?
pas compris ca ^^
cocosql est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/05/2008, 15h31   #3 (permalink)
Invité régulier
 
Date d'inscription: mars 2008
Messages: 12
Par défaut

Pas facile a expliquer sans mettre 40 screenshots et 50 lignes de codes
En faite, normalement je veux que le resultat s'affiche dans un menu deroulant.

Celui-ci est vide qd la valeur d'echantillon que je precise a la connection de donnée ne renvoie pas le meme dataset.(if ds vide alors afficher Ds2 sinon afficher Ds)

Si ma valeur d'echantillon entre dans le "alors" les resultats qui viennent du "sinon" me renvoie vide. et inversement.

Pour revenir au tableau.
Voyant que mon menu déroulant restait vide dans certain cas, j'ai lié le Data du web service a un tableau extensible.

Pour 2 cas données :
Le 1er me renvoie 4 lignes.
Comme c'est le meme cas que mon échantillon, mon tableau affiche bien les 4 lignes et les valeurs correspondantes.

Le 2eme cas ne correspond pas a l'échantillon, mon tableau s'étend à 5 lignes (ce qui correspond à ce que j obtiens par mon web service en test local) mais ces lignes sont vide.

Mon tableau s'étend correctement au nombre de ligne qu'il doit recevoir mais soit elles sont vides, soit elles sont correctement remplis.

Infopath sait donc qu'il y a n résultat mais les affiche pas forcement.

J'espère avoir était clair
Haziel est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/05/2008, 15h45   #4 (permalink)
Membre du Club
 
Avatar de cocosql
 
Date d'inscription: avril 2008
Âge: 19
Messages: 83
Par défaut

Ton web service est programmé en quel langage ?

Si c'est en c# j'ai ptet une astuce
cocosql est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/05/2008, 16h13   #5 (permalink)
Membre du Club
 
Avatar de cocosql
 
Date d'inscription: avril 2008
Âge: 19
Messages: 83
Par défaut

Si tu code en C#, je te conseille d'envoyer un ArrayList a Infopath plutot qu'un Dataset, j'avais eu quelques problèmes avec l'utilisation des dataset.
Tu renvoie simplement un arraylist contenant tes valeurs. Ensuite dans Infopath tu fais la manipulation suivante :

-Clic droit sur ta listbox, propriétés
-Dans "Entrées de la zone de liste, tu coches "Rechercher des valeurs dans une connexion de données ..."
-Tu ajoute ton webservice, sans passer de valeurs échantillons.
-Dans Entrées, tu cliques sur la petite icône à gauche et la tu selectionne Data Field, tu prends la derniere entrée, normalement c'est LeNomDeTaConnexion:Result

Et normalement, ca récupere le ArrayList et ca le copie dans la listbox
cocosql est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/05/2008, 17h13   #6 (permalink)
Invité régulier
 
Date d'inscription: mars 2008
Messages: 12
Par défaut

Tout d'abord merci de ton aide.

Il est justement codé en C#

Tu as deja rencontré le cas ?

Voila ma Webmethod

Code :
[WebMethod]
        public DataSet GetProcess(string nfacture, string codeproduit, string at)
        {
            SqlConnection cn = new SqlConnection("server=serveurdev;uid=***;pwd=***;Trusted_Connection=Yes;database=***");
 
            string QueryProcess = "SELECT action,destinataire,suivi FROM conditions WHERE marque IN (" +
 
                "SELECT marque FROM produits WHERE codeproduit LIKE '%" + codeproduit + "%' )" +
 
                "AND [gm] IN (" +
 
                "SELECT [gm] FROM [Boulanger].[dbo].[produits] WHERE [codeproduit] LIKE '%" + codeproduit + "%' )" +
 
                "AND [at] LIKE '%" + at + "%' " +
 
                "AND (DATEDIFF(day, (" +
 
                "SELECT [date_achat] FROM [Boulanger].[dbo].[factures] WHERE [nfacture] LIKE '%" + nfacture + "%'), GETDATE()) >= [jmin]) " +
 
                "AND (DATEDIFF(day, (" +
 
                "SELECT [date_achat] FROM [Boulanger].[dbo].[factures] WHERE [nfacture] LIKE '%" + nfacture + "%'), GETDATE()) <= [jmax])";
               
 
 
            string QueryProcess2 = "SELECT Action FROM conditions WHERE marque = 'AUTRE'";
            
            
            SqlDataAdapter Process = new SqlDataAdapter(QueryProcess, cn);
            SqlDataAdapter Process2 = new SqlDataAdapter(QueryProcess2, cn);
 
            
            DataSet Ds = new DataSet();
            DataSet Ds2 = new DataSet();
 
            cn.Open();
 
            Process.Fill(Ds, "Process");
            Process2.Fill(Ds2, "Process");
 
            if (Ds.Tables[0].Rows.Count == 0)
            {
                cn.Close();
                cn = null;
                Process = null;
                Process2 = null;
 
                return Ds2;
            }
            else
            {
                cn.Close();
                cn = null;
                Process = null;
                Process2 = null;
 
                return Ds;
            }
Haziel est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/05/2008, 18h23   #7 (permalink)
Membre du Club
 
Avatar de cocosql
 
Date d'inscription: avril 2008
Âge: 19
Messages: 83
Par défaut

Bon je t'ai modifié le code pour que ca renvoie un Arraylist et j'ai au passage corrigé les paramètres car moi j'avais eu plusieurs problèmes (à cause des paramètres et aussi à cause du dataset)

Ceci est ma structure de webservice, elle fonctionne chez moi, y'a pas de raison que ca marche pas pour toi

Code :
[WebMethod]
    public ArrayList GetProcess(string nfacture, string codeproduit, string at)
    {
        SqlConnection cn = new SqlConnection("server=serveurdev;uid=***;pwd=***;Trusted_Connection=Yes;database=***");
 
        string QueryProcess = "SELECT action,destinataire,suivi FROM conditions WHERE marque IN (" +
 
            "SELECT marque FROM produits WHERE codeproduit LIKE '%@CodeProduit%' )" +
 
            "AND [gm] IN (" +
 
            "SELECT [gm] FROM [Boulanger].[dbo].[produits] WHERE [codeproduit] LIKE '%@CodeProduit%' )" +
 
            "AND [at] LIKE '%@at%' " +
 
            "AND (DATEDIFF(day, (" +
 
            "SELECT [date_achat] FROM [Boulanger].[dbo].[factures] WHERE [nfacture] LIKE '%@nfacture%'), GETDATE()) >= [jmin]) " +
 
            "AND (DATEDIFF(day, (" +
 
            "SELECT [date_achat] FROM [Boulanger].[dbo].[factures] WHERE [nfacture] LIKE '%@nfacture%'), GETDATE()) <= [jmax])";
 
        string QueryProcess2 = "SELECT Action FROM conditions WHERE marque = 'AUTRE'";
 
        cn.Open();
        SqlCommand maCommande = cn.CreateCommand();
        maCommande.CommandType = CommandType.Text;
        maCommande.CommandText = QueryProcess;
        qlCommand maCommande2 = cn.CreateCommand();
        maCommande2.CommandType = CommandType.Text;
        maCommande2.CommandText = QueryProcess2;
 
        SqlParameter param = maCommande.CreateParameter();
        param.ParameterName = "@nfacture";
        param.DbType = DbType.String;
        param.Value = nfacture;
 
        SqlParameter param2 = maCommande.CreateParameter();
        param2.ParameterName = "@CodeProduit";
        param2.DbType = DbType.String;
        param2.Value = CodeProduit;
 
        SqlParameter param3 = maCommande.CreateParameter();
        param.ParameterName = "@at";
        param.DbType = DbType.String;
        param.Value = at;
 
        SqlDataReader monCurseur = maCommande.ExecuteReader();
        ArrayList TabResult = new ArrayList();
        while (monCurseur.Read())
        {
            TabResult.Add(monCurseur.GetValue(0) + "*" + monCurseur.GetValue(1) + "*" + monCurseur.GetValue(2));
        }
 
        if (TabResult.Count == 0)
        {
            SqlDataReader monCurseur2 = maCommande2.ExecuteReader();
            ArrayList TabNoResult = new ArrayList();
            while (monCurseur2.Read())
            {
                TabNoResult.Add(monCurseur2.GetValue(0));
            }
            cn.Close();
            return TabNoResult;
        }
        cn.Close();
        return TabResult;
    }
dis moi si y'a un souci
cocosql est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/05/2008, 16h22   #8 (permalink)
Invité régulier
 
Date d'inscription: mars 2008
Messages: 12
Par défaut

Je n'en demandais pas tant
Un énorme merci à toi.

Mais il m'indique une erreur quand je le test.

Çà m'indique que le datareader est déjà ouvert et qu'il faut le fermer avant
en me désignant cette ligne :

Code :
SqlDataReader monCurseur = maCommande.ExecuteReader();
Pourtant il n'est pas déclaré avant.
Haziel est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/05/2008, 17h25   #9 (permalink)
Membre du Club
 
Avatar de cocosql
 
Date d'inscription: avril 2008
Âge: 19
Messages: 83
Par défaut

De rien, on m'a beaucoup aidé sur ce fofo, c'est normal que j'aide à mon tour ^^

Sinon pour l'erreur, vérifie cette ligne :

Code :
qlCommand maCommande2 = cn.CreateCommand();
j'ai oublié le S de SqlCommand, c'est ptet ca, je ne sais pas ^^

EDIT : oups, j'ai aussi oublié d'ajouter les paramètres à la commande, excuse moi je modifie le fichier code plus haut, ce qui donne :
Code :
[WebMethod]
    public ArrayList GetProcess(string nfacture, string codeproduit, string at)
    {
        SqlConnection cn = new SqlConnection("server=serveurdev;uid=***;pwd=***;Trusted_Connection=Yes;database=***");
 
        string QueryProcess = "SELECT action,destinataire,suivi FROM conditions WHERE marque IN (" +
 
            "SELECT marque FROM produits WHERE codeproduit LIKE '%@CodeProduit%' )" +
 
            "AND [gm] IN (" +
 
            "SELECT [gm] FROM [Boulanger].[dbo].[produits] WHERE [codeproduit] LIKE '%@CodeProduit%' )" +
 
            "AND [at] LIKE '%@at%' " +
 
            "AND (DATEDIFF(day, (" +
 
            "SELECT [date_achat] FROM [Boulanger].[dbo].[factures] WHERE [nfacture] LIKE '%@nfacture%'), GETDATE()) >= [jmin]) " +
 
            "AND (DATEDIFF(day, (" +
 
            "SELECT [date_achat] FROM [Boulanger].[dbo].[factures] WHERE [nfacture] LIKE '%@nfacture%'), GETDATE()) <= [jmax])";
 
        string QueryProcess2 = "SELECT Action FROM conditions WHERE marque = 'AUTRE'";
 
        cn.Open();
        SqlCommand maCommande = cn.CreateCommand();
        maCommande.CommandType = CommandType.Text;
        maCommande.CommandText = QueryProcess;
        SqlCommand maCommande2 = cn.CreateCommand();
        maCommande2.CommandType = CommandType.Text;
        maCommande2.CommandText = QueryProcess2;
 
        SqlParameter param = maCommande.CreateParameter();
        param.ParameterName = "@nfacture";
        param.DbType = DbType.String;
        param.Value = nfacture;
        maCommande.Parameters.Add(param);
 
        SqlParameter param2 = maCommande.CreateParameter();
        param2.ParameterName = "@CodeProduit";
        param2.DbType = DbType.String;
        param2.Value = CodeProduit;
        maCommande.Parameters.Add(param2);
 
        SqlParameter param3 = maCommande.CreateParameter();
        param.ParameterName = "@at";
        param.DbType = DbType.String;
        param.Value = at;
        maCommande.Parameters.Add(param3);
 
 
        SqlDataReader monCurseur = maCommande.ExecuteReader();
        ArrayList TabResult = new ArrayList();
        while (monCurseur.Read())
        {
            TabResult.Add(monCurseur.GetValue(0) + "*" + monCurseur.GetValue(1) + "*" + monCurseur.GetValue(2));
        }
 
        if (TabResult.Count == 0)
        {
            SqlDataReader monCurseur2 = maCommande2.ExecuteReader();
            ArrayList TabNoResult = new ArrayList();
            while (monCurseur2.Read())
            {
                TabNoResult.Add(monCurseur2.GetValue(0));
            }
            cn.Close();
            return TabNoResult;
        }
        cn.Close();
        return TabResult;
    }

Dernière modification par cocosql ; 17/05/2008 à 17h38
cocosql est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/05/2008, 10h28   #10 (permalink)
Invité régulier
 
Date d'inscription: mars 2008
Messages: 12
Par défaut

J'ai remodifier quelques lignes, il manquait je pense les parametres pour maCommande2.
Code :
 
SqlParameter param = maCommande.CreateParameter();
        param.ParameterName = "@nfacture";
        param.DbType = DbType.String;
        param.Value = nfacture;
        maCommande.Parameters.Add(param);
 
        SqlParameter param2 = maCommande.CreateParameter();
        param2.ParameterName = "@CodeProduit";
        param2.DbType = DbType.String;
        param2.Value = CodeProduit;
        maCommande.Parameters.Add(param2);
 
        SqlParameter param3 = maCommande.CreateParameter();
        param.ParameterName = "@at";
        param.DbType = DbType.String;
        param.Value = at;
        maCommande.Parameters.Add(param3);
 
        SqlParameter param4 = maCommande2.CreateParameter();
        param4.ParameterName = "@at";
        param4.DbType = DbType.String;
        param4.Value = at;
        maCommande2.Parameters.Add(param4);
 
        SqlParameter param5 = maCommande2.CreateParameter();
        param5.ParameterName = "@at";
        param5.DbType = DbType.String;
        param5.Value = at;
        maCommande2.Parameters.Add(param5);
 
        SqlParameter param6 = maCommande2.CreateParameter();
        param6.ParameterName = "@at";
        param6.DbType = DbType.String;
        param6.Value = at;
        maCommande2.Parameters.Add(param6);
 
Maintenant je n'ai plus le message d'erreur concernant le datareader non fermé de maCommande mais je l'ai pour maCommande2...

De plus qd je met en commentaire le If et je met un cas qui ne renvoie pas vide, le fichier Xml est vide.

Je n'ai jamais utiliser de arrayList :'( je suis perdu
Haziel est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/05/2008, 11h25   #11 (permalink)
Membre du Club
 
Avatar de cocosql
 
Date d'inscription: avril 2008
Âge: 19
Messages: 83
Par défaut

Il n'y a pas de paramètres pour maCommande2 vu qu'elle fait appel à la requête QueryProcess2 qui ne fait pas appel elle-même à des paramètres.

Essaye de compiler après avoir supprimé ces lignes.

En fait les ArrayList sont comme des vector en c++, ce sont des tableaux qui sont gérés de manières dynamiques (s'agrandissent en fonction du besoin par exemple) et ce que je fais ici, c'est créér un SqlDataReader qui va lire le résultat de ta requête et à chaque ligne trouvé, il l'insere dans l'ArrayList, et tu peux insérer un ArrayList dans une ListBox sur InfoPath.
J'avais essayé avec les DataSet mais j'avais eu des problèmes de compatibilité avec InfoPath.

EDIT : n'oublie pas d'inclure System.Collections aussi ^^ (on sait jamais)
cocosql est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/05/2008, 12h44   #12 (permalink)
Invité régulier
 
Date d'inscription: mars 2008
Messages: 12
Par défaut

J'ai supprimé les lignes, mis en commentaire les ligne du "if" pour tester uniquement le tableau dans les cas ou il ne renvoit pas vide et j'obtiens ca
qd je le test par visual studio.

Code :
<?xml version="1.0" encoding="utf-8" ?> 
  <ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/" />
Aucune donnée n'apparait dans le Xml
Haziel est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/05/2008, 14h16   #13 (permalink)
Membre du Club
 
Avatar de cocosql
 
Date d'inscription: avril 2008
Âge: 19
Messages: 83
Par défaut

Teste juste la requête avec les paramètres comme ceci, pour voir si c'est pas une erreur de passage de paramètres

sinon j'ai trouvé une autre erreur, ca doit être ca :

Code :
param2.Value = CodeProduit;
alors que ca doit être

Code :
param2.Value = codeproduit;

cocosql est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/05/2008, 14h36   #14 (permalink)
Invité régulier
 
Date d'inscription: mars 2008
Messages: 12
Par défaut

Oui j'avais deja corrigé.

Je ne vois pas ce que tu veux dire ?

la j'execute la webmethod uniquement avec maCommande.

Je vais tester avec maCommande2 voir ce que ca donne.
Haziel est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/05/2008, 17h21   #15 (permalink)
Membre du Club
 
Avatar de cocosql
 
Date d'inscription: avril 2008
Âge: 19
Messages: 83
Par défaut

Oki, j'ai testé chez moi, le problème semble venir du like.

Il doit y avoir un conflit avec ' , @ et %

Je ne sais pas trop mais j'ai simplement remplacer mes clauses
WHERE X = @monparametre par WHERE X LIKE '%@monparametre%'
et ca ne fonctionne plus.
Le souci est le suivant : on doit passer un paramètre nommé @CodeProduit donc la valeur que contient ce paramètre. Or on passe '@CodeProduit', il doit donc prendre le string @CodeProduit comme paramètre, c'est la ou est donc l'erreur.

Essaye plutot ca :

Code :
[WebMethod]
    public ArrayList GetProcess(string nfacture, string codeproduit, string at)
    {
        SqlConnection cn = new SqlConnection("server=serveurdev;uid=***;pwd=***;Trusted_Connection=Yes;database=***");
 
        string QueryProcess = "SELECT action,destinataire,suivi FROM conditions WHERE marque IN (" +
 
            "SELECT marque FROM produits WHERE codeproduit = @CodeProduit )" +
 
            "AND [gm] IN (" +
 
            "SELECT [gm] FROM [Boulanger].[dbo].[produits] WHERE [codeproduit] = @CodeProduit )" +
 
            "AND [at] = @at " +
 
            "AND (DATEDIFF(day, (" +
 
            "SELECT [date_achat] FROM [Boulanger].[dbo].[factures] WHERE [nfacture] = @nfacture), GETDATE()) >= [jmin]) " +
 
            "AND (DATEDIFF(day, (" +
 
            "SELECT [date_achat] FROM [Boulanger].[dbo].[factures] WHERE [nfacture] = @nfacture), GETDATE()) <= [jmax])";
 
        string QueryProcess2 = "SELECT Action FROM conditions WHERE marque = 'AUTRE'";
 
        cn.Open();
        SqlCommand maCommande = cn.CreateCommand();
        maCommande.CommandType = CommandType.Text;
        maCommande.CommandText = QueryProcess;
        SqlCommand maCommande2 = cn.CreateCommand();
        maCommande2.CommandType = CommandType.Text;
        maCommande2.CommandText = QueryProcess2;
 
               
        maCommande.Parameters.AddWithValue ("@nfacture", "%" + nfacture + "%");
        maCommande.Parameters.AddWithValue ("@CodeProduit", "%" + codeproduit + "%");
        maCommande.Parameters.AddWithValue ("@at", "%" + at + "%");
        
 
        SqlDataReader monCurseur = maCommande.ExecuteReader();
        ArrayList TabResult = new ArrayList();
        while (monCurseur.Read())
        {
            TabResult.Add(monCurseur.GetValue(0) + "*" + monCurseur.GetValue(1) + "*" + monCurseur.GetValue(2));
        }
 
        if (TabResult.Count == 0)
        {
            SqlDataReader monCurseur2 = maCommande2.ExecuteReader();
            ArrayList TabNoResult = new ArrayList();
            while (monCurseur2.Read())
            {
                TabNoResult.Add(monCurseur2.GetValue(0));
            }
            cn.Close();
            return TabNoResult;
        }
        cn.Close();
        return TabResult;
    }

J'ai changé la manière de passer les paramètres
cocosql est déconnecté   Envoyer un message privé Réponse avec citation
NEWS MS-OFFICEFAQs OFFICETUTORIELS OFFICELIVRES OFFICESOURCES VBAACCESS

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > InfoPath



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide