# Dotnet > Gnral Dotnet > Dveloppement Office System > InfoPath >  update repeteting table

## padawanette

ReBonjour a tous, 

J'ai bien progresse depuis mon dernier probleme, et je vous remercie pour votre aide. Mais, la, je me trouve face a un autre probleme.

Pour resumer, j'ai cree un formulaire infopath avec une connection a un webservice afin de creer un select. J'insere donc ma repeting table pour afficher mes donnees. Tout fonctionne bien jusque la !

Ensuite, je suis passee a la phase SUBMIT. J'ai donc cree mes requetes UPDATE sur mon webservice et cela fonctionne bien !

Le probleme est que lorsque j'ai plusieurs blocks avec les memes champs qui se repetent dans ma repeting table, il me renvoie les champs du premier block seulement.
Or je voudrais qu'il me renvoie soit les champs du 1er block, soit les champs du 2nd a l'aide d'un bouton. Il ne peut y avoir un changement que dans un block a la fois. 

Auriez vous une idee de comment submitter les informations d'un repeting table, svp ?

----------


## virgul

Salut,

Je pense que tu fais ton appel de webservice directement depuis Infopath non?

Essaye plutot de le faire via du code et comme ca il te suffit de slctionn le noeud rptitif que tu veux et de faire ta requte sur le webservices.

Tu code en quoi?

Perso je n'utilise pas le submit dans Infopath car tu n'as aucun controle dessus s'il y a une erreur tu ne peux rien faire alors qu'avec du code tu fait ce que tu veux de ton retour.

++

Thierry

----------


## padawanette

merci, bien je vais tester avec les noeuds. Je vais trouver des tuto, car je ne connais pas, j'ai juste lu en diagonal quelques tuto !

Merci

----------


## virgul

Si tu dcris mieux ton problme et ton but je veux bien t'aider?

Mais dis-moi quelle version de Infopath tu utilise et surtout en quoi tu code?

++

----------


## padawanette

Excuse moi, je n'avais pas vu ta reponse. J'utilise InfoPath 2007 et mon webservice est developpe en C#.

Actuellement pour mettre a jour ma base de donnees, j'ai cree une web methods dans mon webservice avec en parametre tous les champs de mon formulaire infopath. Ainsi, quand, j'autorise le submit, j'ai plus qu'a dire a quelle variable appartient le champs infopath, comme sur l'image :





Le probleme c'est que les champs d'infopath sont dans une repeting table. Il y a donc plusieurs block repetant le meme champs avec des valeurs differentes. Chaque a par exemple un id, une cle unique comme le numero de commande, ce qui veut dire que chaque block est different en soit.

Et donc mon probleme, c'est que je n'arrive a enregistrer les donnees seulement du block un. Les autres, il n'y a pas moyen de les sauvegarder.

Alors, je suis en ce moment en train de regarder pour renvoyer un fichier XML a mon webservice et que ensuite ce soit mon webservice ui fasse le travail.

Merci pour ton aide

----------


## virgul

Salut,

Dsol mais ton image ne se charge pas.

Dans ton code il suffit de faire:
1. Ajouter une webreference sur ton Webservice. (clic droit sur rference dans l'explorateur de solution)
2. de lui donner un Nom (ex: Save)
3.de copier et de complter le code suivant:


```

```


Conseil: N'envoie pas plus de donnes qu'il n'en faut au webservice car ca ralentit le form (plus tu envoie de donnes au webservice plus ca prend du temps).

++

Thierry

----------


## padawanette

Je suis desolee pour l'image, je ne comprends pas pourquoi ca ne fonctionne pas, c'est la premiere fois. Je l'ai supprimee plusieurs fois, mais rien n'y change.
Je ne vais pas m'attarder la dessus. 

Sinon, merci pour ton coup de main, mais je ne pige pas trop le code. Peut-etre vais-je te paraitre un peu nulle !

Ma current line est le path du dossier de ma web reference stockee dans mon webservice.

et je dois creer autant de lineToSave que de parametre dans mon formInfopath ? car je ne comprends pas pourquoi il ya un param2. ou alors je dois mettre ici tous mes parametres de ma function. (je pense aue c'est la derniere)

MainDataSource c'est la connexion a ma base de donnees ?


Excuse moi, c'est un peu confu dans ma tete, dsl

----------


## virgul

Il s'agit d'un exemple c'est toi qui choisi les param que tu veux donner a ton webservices si tu n'as besoin que d'un paramtre tu n'utilise qu'un param.

CurrentLine = je sais pas comment tu sais quelle ligne tu dois envoyer (tu dois surment avoir un identifiant quelquepart) a toi de slctionner la bonne en fonction de ce que tu as fais.

Mon exemple est vraiment gnral.

Pour ton image upload-la sur ce site.

----------


## padawanette

voila, dans ma currente line, j'ai mis de Xpath de mon ID comme j'ai pu voir sur certain site.

Si je declare pas  "MainDataSource" en XPathNavigator avant, il m'indique un erreur comme koi "MainDataSource" n'existe pas. Sur tous les sites, que j'ai pu rencontrer, je vois des "MainDataSource", mais a quoi correspond-t-elle vraiment ? Ne dois-je pas mettre ma dataSource qui permet d'afficher mon select a la place dans Infopath !

Et enfin, je ne comprends pas pourquoi, tu as mis "/Root/RepeatNode[@id='" + CurrentLine + "']/Adr").CreateNavigator();"
car je n'ai vu nul par ca et que je suis un peu perdue. J'ai surttout vu 
MainDataSource.CreateNavigator().SelectSingleNode(xpath, NamespaceManager); comme sur la ligne commentee.




```

```

Merci pour ton aide

----------


## virgul

Salut,

en faite je ne comprends pas comment tu sais quelle noeud da ta section rptitive tu vas envoyer ? certe tu as un ID mais comment connais tu celui que tu vas envoy?

quelle est le xpath pour atteindre le noeud que tu veux envoy? C'est ca?  "/dfs:myFields/dfs:dataFields/tns ::D: escription_customerResponse/tns ::D: escription_customerResult/BLOCKTOTAL/Description"


maindatasource est l'objet qui te permet t'atteindre et de naviguer dans les noeud de ta base primaire (pour les source de donnes secondaire c'est diffrent). il est dclarer au dmarrage du formulaire donc pas besoin de le redclarer comme tu le fait ici:


```
XPathNavigator MainDataSource;
```

++

Thierry

----------


## padawanette

Mon Xpath est : /dfs:myFields/dfs:dataFields/tns ::D: escription_customerResponse/tns ::D: escription_customerResult/BLOCKTOTAL/Description/@id. Pour le mettre dans mon code, j'ai simplement copier le xpath puis coller dans le code.

Regarde sur la photo tu verras comment est construit ma data source "Description_customer". Cette dataSource est celle qui me permet d'afficher mes donnees et c'est une source secondaire.



D'accord, je comprends mieux le MainDataSource mais cet objet est declarer automatiquement ? Dans infopath, ma connection primaire s'appelle "Main", mais il n'y a rien d'important dedans.

----------


## virgul

Donc tu prends cette id pour savoir quelle section rptitive de ta soucre primaire ?

donc puis-je avoir maintenant avoir le XPath qui permet d'obtenir la section a envoy?

Auter chose: 

tout en haut dans ton code tu as lequel de deux qui est dclar? 

Celui-ci:
using Microsoft.Office.InfoPath;
ou celui la:
using Microsoft.Office.Interop.InfoPath.SemiTrust;

Si Maindatasource ne marche pas essaye this.Maindatasource.
On est d'accord tu code bien en C# dans ton form Infopath?

----------


## virgul

Attends je crois qu'il y a un mal entendu quand tu dis:



> Le probleme est que lorsque j'ai plusieurs blocks avec les memes champs qui se repetent dans ma repeting table, il me renvoie les champs du premier block seulement.
> Or je voudrais qu'il me renvoie soit les champs du 1er block, soit les champs du 2nd a l'aide d'un bouton. Il ne peut y avoir un changement que dans un block a la fois.


c'est ca que je ne comprend pas? tu veux quoi au final? Il est la le malentendu

Comment fait tu pour savoir si tu envoie le 1er, le 2me ou tous les block? Mon currentline est cens reprsent ce choix

----------


## padawanette

> Donc tu prends cette id pour savoir quelle section rptitive de ta soucre primaire ?


Ce n'est pas source primaire mais secondaire. Et j'utilise l'id pour savoir la section repetitive.




> donc puis-je avoir maintenant avoir le XPath qui permet d'obtenir la section a envoy?


le Xpath de mon id est "/dfs:myFields/dfs:dataFields/tns ::D: escription_customerResponse/tns ::D: escription_customerResult/BLOCKTOTAL/Description/@id"
et le xpath de la section a envoyer est "/dfs:myFields/dfs:dataFields/tns ::D: escription_customerResponse/tns ::D: escription_customerResult/BLOCKTOTAL/Description" (c'est le bloc repetitif - Description")





> tout en haut dans ton code tu as lequel de deux qui est dclar? 
> 
> Celui-ci:
> using Microsoft.Office.InfoPath;
> ou celui la:
> using Microsoft.Office.Interop.InfoPath.SemiTrust;


Il n'y a aucun des 2 dans mon webservice en C#. J'ai un Microsoft.Office.InfoPath; dans le code de mon formulaire Infopath en VB (car je n'ai pas d'autres choix). Mais, je ne peux utiliser ce code car il n'est pas suporter car les appareils mobiles tels que les PDA.


C'est bien sur le webservice que je dois ajouter ce code ?

----------


## virgul

> Ce n'est pas source primaire mais secondaire. Et j'utilise l'id pour savoir la section repetitive.


Ok je comprends maintenant.




> C'est bien sur le webservice que je dois ajouter ce code ?


Non, Moi j'ai dit:



> Je pense que tu fais ton appel de webservice directement depuis Infopath non?
> 
> Essaye plutot de le faire via du code et comme ca il te suffit de slctionn le noeud rptitif que tu veux et de faire ta requte sur le webservices.


et je reviens sur ca: 



> Le probleme est que lorsque j'ai plusieurs blocks avec les memes champs qui se repetent dans ma repeting table, il me renvoie les champs du premier block seulement.
> Or je voudrais qu'il me renvoie soit les champs du 1er block, soit les champs du 2nd a l'aide d'un bouton. Il ne peut y avoir un changement que dans un block a la fois.


Explique mieux ca!




> J'ai un Microsoft.Office.InfoPath; dans le code de mon formulaire Infopath en VB (car je n'ai pas d'autres choix). Mais, je ne peux utiliser ce code car il n'est pas suporter car les appareils mobiles tels que les PDA.


Mais alors tu utilise Infopath en mode web si tu peux les visionner sur un PDA?

++

Thierry

----------


## padawanette

Je suis sous infopath 2007 utilisant le enable browser pour les appareils mobiles. J'ai donc pas le choix pour le code de mon form infopath. il est en VB directement meme si je change les parametres de choix de langages. Deplus,j'ai active l'option "Design a form Template that can be open in a browser". Et cette option entraine une imcopatibilite dans l'onglet "programmation" dans les options du formulaire. Il me dit "Script and deprecated objects models are not supported in browser-enabled form templates". et C'est pour cette raison, que je pense que le code n'est pas lu et execute sur les appareils mobiles.

Pour t'expliquer ce que je veux voici une image

----------


## padawanette

Je commence a comprendre tout doucement comment ca fonctionne, j'ai tout traduit en Vb et je l'ai mis dans le code de mon formulaire infopath.

J'ai changer la connection principale par ma connection secondaire :
Me.DataSources("Description_customer").CreateNavigator().....

J'ai cree autant de variable string que j'avais de parametre et j'y ai mis leur Xpath respectif.

Mais il me reste un pb avec ma fonction a executer dans mon webservice. 

lignetoSave est de type XPathNavigator et que si j'execute ma function comme suit UPDATE_Description_customer(lignetoSave, param1, param2...). ca ne fonctionne pas car mon premier param est de type int. Je l'ai change en XPathNavigator dans mon webservice, mais il me toujours une erreur de converstion !
De ce fait, dans le code de mon form, j'ai simple fait "lignetoSave.ValueAsInt".et ca fonctionne

Par contre quand j'execute mon code a l'aide d'un bouton, il me mets une erreur sur ma connection a dataSources. J'ai verifier, elle est ecrite sans faute. Precisement, je ne peux pas dire ce que c'est comme erreur. Je cherche en ce moment meme.

++

----------


## virgul

Pour info tout ce qui est jscript et vbscript ne fonctionne pas avec form service mais les langage manag fonctionne trs bien (C# et VB.Net) 

Moi perso je te conseil de tout coder la mme chose donc si ton ws est en C# met le code en C# aussi dans ton form. Ca t'vitera d'apprendre deux langages. Et pour la maintenance ca sera plus facile.




> lignetoSave est de type XPathNavigator et que si j'execute ma function comme suit UPDATE_Description_customer(lignetoSave, param1, param2...). ca ne fonctionne pas car mon premier param est de type int. Je l'ai change en XPathNavigator dans mon webservice, mais il me toujours une erreur de converstion !
> De ce fait, dans le code de mon form, j'ai simple fait "lignetoSave.ValueAsInt".et ca fonctionne


Je comprend pas trop c'est toi qui dcide dans la mthode du service web quelle paramtre tu veux en entre non? si tu veux un int ok. Mais ca me parait bizzare....





> J'ai cree autant de variable string que j'avais de parametre et j'y ai mis leur Xpath respectif.


t'es pas oblig tu peux directement crire ton xpath dans le selectsinglenode a condition de la mettre entre " ".

Pour info: avec les webservices on parle de mthode et non de fonction mais c'est du blabla...

----------


## padawanette

Cote programming de mon formulaire infopath, j'ai cree ca en VB. Je n'arrive pas a le mettre en C# lol ! Donc, je vais rester en VB.net !

J'exceute mon cote lorsque j'appuie sur un bouton.


```

```

Il me pose une erreur sur toutes les variables de type XPathNavigator. en me disant "Request Failed". Donc je regarde d'ou vient ce pb. 

Voici mon entete de ma methode de mon webservice que j'appelle :




> public void UPDATE_Description_customer(int id, string Area, string Model, string Country, string Customer, string ALineActual, string PoffPlanned, string ALineExpected)


Il y a des int et des string et c'est pour raison que je veux retourner ces types afin d'executer ma requete SQL UPDATE.

----------


## virgul

Pour changer la langue de prog cest: outils->option du formulaire ->programmation et la tu peux choisir mais tu dois d'abord effacer le code avant de pouvoir choisir. 

Moi si je serais toi je ferais plutot comme ca (j'ai pas tout recris mais je pense que tu comprendras): 


```

```

Mais dans l'absolu je ne mettrais qu'un param dans le ws un xpathnavigator et je sortirai les info dans le webservice comme sa si tes donnes changent tu n'est pas bloqu dans infopath mais tu n'as cas corrig le webservices. Mais c'est a toi de dcider.

----------


## padawanette

Attends, je suis plus la.

CurrentLine retourne mon id sont forme de string. Donc ca sera une valeur genre : 1, 2 ou 3 etc. Donc ca change rien ce que je suis en train de faire. 

si j'ai la valeur de l'iD comment retrouver mes informations d'un ID donnees car par defaut il me prend les elements du premier block ? il faudrait que je retourne un fichier XMLDocument a mon webservice ? c'est plus compliker en plus, je pense !

----------


## virgul

Laisse tomber mon ide de un param...

Pour trouver une ligne en fonction de ton id:



```

```

----------


## padawanette

OK, je comprends mieux avec cet exemple plus concret.

Mais a l'execution de mon SelectSingleNode, il me dit que la demande a echouee et le programme se block. 

je pense qu'il ne trouve pas mon Xpath meme sans id ca ne fonctionne pas !

De quoi perdre la tete mais je ne desespere pas



```

```

Je ne sais pas si c'est parce que dans BLOCKTOTAL ya aussi un identifiant.
On voit bien la structure avec cette image

----------


## virgul

Si tu vas en debug il se block sur quelle ligne?

Aprs quand tu as la ligne essaye de faire tout en une fois:



```

```

----------


## padawanette

bonjour, 

Bonne nouvelle, ca fonctionne, il s'agissait d'un probleme de securite.

J'ai eu qqmodification a faire dans mon formulaire Infopath et sur les Frameworks.

Je mets les liens des pages qui m'ont aide si d'autres personnes ont les meme soucis que moi :

http://office.microsoft.com/en-us/in...009571033.aspx
http://office.microsoft.com/fr-fr/in...534981036.aspx
http://blogs.microsoft.co.il/blogs/i...ity-issue.aspx
http://www.codeguru.com/forum/showthread.php?t=320177

merci a toi virgul pour tes conseils car sans toi, je ne serais pas arrivee a ce resultat alors un grand merci a toi !!! Merci

----------

