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

InfoPath .NET Discussion :

recopie Source secondaire dans principale


Sujet :

InfoPath .NET

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut recopie Source secondaire dans principale
    Bonjour à tous et toutes,

    Je cherche à recopier en une seule fois une arborescence issue d'une source secondaire dans la source principale en vbscript. Je ne veux pas mettre à jour les données une à une car elles sont trop nombreuses.

    J'ai bien veillé à ce que les noeuds soient nommés de la même façon mais je bloque dans la partie finale au moment du replaceChild car les namespaces sont différents entre source principale et secondaire. J'ai essayé de modifier les noeuds sélectionnés de la source secondaire avec un setproperty mais ça ne marche pas.

    Comment faire ????

    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Salut et bienvenue,

    Si tu commencais par poster ton code ainsi que mettre tes deux fichiers XML en pièce jointe on vera surement ou se situe ton problème.

    ++

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Informations demandées
    Rebonjour,

    Voici le code vbscript :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    XDocument.DOM.setProperty "SelectionNamespaces", "xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:my=""http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-01-08T08:23:27"" xmlns:xd=""http://schemas.microsoft.com/office/infopath/2003"""
    '</namespacesDefinition>
     
    Public noeudImport
    Public noeudExport
    '=======
    Sub CTRL_IMPORT_OnClick(eventObj)
    '
    	Dim tableauNoeudSelectionnes
    	Dim noeudSelectionne
    	Dim noeudARemplacer
    	Dim qryImport
    	Dim noeudTemp
    '	
    ' recherche de la ligne courante de la source principale dans le tableau 
    '		
    	set tableauNoeudSelectionnes = XDocument.View.GetContextNodes()
    	set noeudSelectionne = tableauNoeudSelectionnes(0)
    '
    ' Recherche dans la source secondaire
    '
    	qryImport = noeudSelectionne.selectSingleNode("../my:cleImport").text
     
    	chercheImport(qryImport)
    '
    	set noeudARemplacer = noeudSelectionne.selectSingleNode("./my:enreg")
    	set noeudImport = XDocument.DOM.importNode(noeudExport,true)
    	msgbox(noeudImport.xml)
    	set noeudTemp = noeudSelectionne.replaceChild(noeudImport,noeudARemplacer)
    '	
    End Sub
    '---------------------------------------------------------------------------------------
    ' On recherche dans la source secondaire le noeud correspondant au résultat de la liste de valeurs
    '
    sub chercheImport(qryImport)
     
    	dim importTableau
    	dim importCourant
     
    	set importTableau = XDocument.DataObjects("import").DOM.selectNodes("grpImport/enreg")
     
    	trouve = 0
    	for each importCourant in importTableau
    		if importCourant.selectSingleNode("./cle").text = qryImport then
    			set noeudExport = importCourant
    			trouve = 1
    			exit for
    		end if
    	next
    	if trouve = 0 then 
    		msgbox("Import inconnu pour : " & qryImport)
    	end if
     
    end sub
    Ca plante au niveau du replacechild du fait je pense d'une difference de namespace. Voici les sources xml :

    Source principale :
    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
    <?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.8" productVersion="11.0.8034" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\garciaj\Bureau\importNode\importNode.xsn" name="urn:schemas-microsoft-com:office:infopath:importNode:-myXSD-2008-01-08T08-23-27" ?><?mso-application progid="InfoPath.Document"?><my:employe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-01-08T08:23:27" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="fr">
    	<my:employeListe>
    		<my:nom>dupont</my:nom>
    		<my:prenom>gérard</my:prenom>
    		<my:enreg>
    			<my:cle></my:cle>
    			<my:texte1></my:texte1>
    			<my:texte2></my:texte2>
    			<my:valeur1></my:valeur1>
    			<my:valeur2></my:valeur2>
    		</my:enreg>
    	</my:employeListe>
    	<my:cleImport></my:cleImport>
    </my:employe>

    Source secondaire :
    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <grpImport>
    	<enreg>
    		<cle>111</cle>
    		<texte1>AAAAAA</texte1>
    		<texte2>BBBBBB</texte2>
    		<Valeur1>10.00</Valeur1>
    		<valeur2>20.00</valeur2>
    	</enreg>
    	<enreg>
    		<cle>222</cle>
    		<texte1>AAAAAA</texte1>
    		<texte2>BBBBBB</texte2>
    		<Valeur1>10.00</Valeur1>
    		<valeur2>20.00</valeur2>
    	</enreg>
    	<enreg>
    		<cle>333</cle>
    		<texte1>AAAAAA</texte1>
    		<texte2>BBBBBB</texte2>
    		<Valeur1>10.00</Valeur1>
    		<valeur2>20.00</valeur2>
    	</enreg>
    </grpImport>

    Bien entendu, dans ce cas simple, on pourrait mettre à jour individuellement chaque valeur, mais mon cas réel est bien plus riche. Mon but est de renseigner de manière globale le noeud enreg de la source principale à partir du noeud enreg de la source secondaire sans mettre à jour chaque noeud.

  4. #4
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Salut,

    C'est bien ce que je pensais...

    tes namespaces ne sont pas les même donc 2 possibilités s'offre a toi:

    La première et la moins perfomante c'est de faire un XSLT qui va t'ajouter tout le namespace my: dans ton XML et après tu pourras remplacé.
    La seconde et la plus saine est d'enlever ton namespace my de ta source primaire (l'édition de ton schéma se fera via un éditeur XML et non plus dans l'UI d'infopath). Pour ca il te suffit de recréer ton schéma dans un éditeur XML sans le préfix my.
    Dans Infopath sous le menu outils-> Convertir la source de données principale. Puis dans l'assistant séléctionne ton schéma que tu viens de créer.

    Il te suffira de répéter la dernière explication pour mettre a jour ton schéma si d'aventure tu voulais le mettre à jour.
    Et maintenant ton replacechild fonctionnera.

    Attention n'oublie pas de faire une sauvegarde de ton formulaire avant cette manip car si tu oublie quelquechose tu sera bien content si tu peux revenir en arrière.

    ++

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Message d'erreur sur conversion
    Merci de ta réponse,

    J'ai fait un test de conversion sur un nouveau formulaire dans lequel j'ai créé trois champ avec infopath.

    Après avoir extrait les fichiers du formulaire, j'ai mis à jour le fichier myschema.xsd pour enlever le namespace my. Voila le résultat le fichier xsd :
    (j'ai enlevé : xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-01-24T14:35:50")


    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
    15
    16
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <xsd:schema targetNamespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-01-24T14:35:50" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    	<xsd:element name="testChangeNs">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element ref="my:cle" minOccurs="0"/>
    				<xsd:element ref="my:libelle" minOccurs="0"/>
    				<xsd:element ref="my:libelle2" minOccurs="0"/>
    			</xsd:sequence>
    			<xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
    		</xsd:complexType>
    	</xsd:element>
    	<xsd:element name="cle" type="xsd:string"/>
    	<xsd:element name="libelle" type="xsd:string"/>
    	<xsd:element name="libelle2" type="xsd:string"/>
    </xsd:schema>

    Lorsque j'utilise conversion de la source de données principale avec ce fichier, j'ai le message d'erreur suivant :
    Le schéma XML du formulaire n'est pas valide ou contient une structure non prise en charge par infopath
    myschema.xsd#/schema/element[1][@name = 'testChangeNs']/complexType[1]/sequence[1]/element[1]Référence à un préfixe d'espace de noms non déclaré : 'my'.

  6. #6
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Je pensais que tu allais me répondre tout de suite et je t'aurais directement données plus de précisions sur ton choix...

    En faite il faut aussi retirer le my: présent dans tous le xsd ainsi que l'attribut targetschema dans le noeud xsd:schema (targetNamespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-01-24T14:35:50").

    voici dans ton cas le résultat (tu peux aussi très bien remplacer le xsd directement dans le repertoire au lieu d'utiliser l'assistant):

    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
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="testChangeNs">
    	<xsd:complexType>
    		<xsd:sequence>
    			<xsd:element ref="cle" minOccurs="0"/>
    			<xsd:element ref="libelle" minOccurs="0"/>
    			<xsd:element ref="libelle2" minOccurs="0"/>
    		</xsd:sequence>
    		<xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
    	</xsd:complexType>
    </xsd:element>
    <xsd:element name="cle" type="xsd:string"/>
    <xsd:element name="libelle" type="xsd:string"/>
    <xsd:element name="libelle2" type="xsd:string"/>
    </xsd:schema>
    ++

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Préfixe my: dans source secondaire
    Je te remercie de nouveau de ta réponse. En l'attendant, j'étais parti sur une piste semblable consistant à placer le préfixe my dans la source secondaire. J'ai un peu cafouillé car je ne suis pas spécialiste xml (notamment pour l'instruction setProperty "SelectionNamespaces" sur la source secondaire) et ça fonctionne ^^.

    J'ai ajouté ces deux lignes à mon script dans la routine chercheImport et préfixé les objets concernés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    XDocument.DataObjects("import").DOM.setProperty "SelectionNamespaces", "xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:my=""http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-01-08T08:23:27"" xmlns:xd=""http://schemas.microsoft.com/office/infopath/2003"""
     
    	set importTableau = XDocument.DataObjects("import").DOM.selectNodes("my:grpImport/my:enreg")
    J'ai aussi bien entendu modifié le xml de la source secondaire :
    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?xml version="1.0" encoding="UTF-8"?>
    <?mso-infoPathSolution solutionVersion="1.0.0.8" productVersion="11.0.8034" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\garciaj\Bureau\importNode\importNode.xsn" name="urn:schemas-microsoft-com:office:infopath:importNode:-myXSD-2008-01-08T08-23-27" ?>
    <?mso-application progid="InfoPath.Document"?>
    <my:grpImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-01-08T08:23:27" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="fr">
    	<my:enreg>
    		<my:cle>111</my:cle>
    		<my:texte1>AAAAAA</my:texte1>
    		<my:texte2>BBBBBB</my:texte2>
    		<my:valeur1>10.00</my:valeur1>
    		<my:valeur2>20.00</my:valeur2>
    	</my:enreg>
    	<my:enreg>
    		<my:cle>222</my:cle>
    		<my:texte1>AAAAAA</my:texte1>
    		<my:texte2>BBBBBB</my:texte2>
    		<my:valeur1>10.00</my:valeur1>
    		<my:valeur2>20.00</my:valeur2>
    	</my:enreg>
    	<my:enreg>
    		<my:cle>333</my:cle>
    		<my:texte1>AAAAAA</my:texte1>
    		<my:texte2>BBBBBB</my:texte2>
    		<my:valeur1>10.00</my:valeur1>
    		<my:valeur2>20.00</my:valeur2>
    	</my:enreg>
    </my:grpImport>

    Du coup, le replaceChild fonctionne. Merci encore de tes conseils.

  8. #8
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Ok pas de souci ca marche aussi bien comme ca.

    En addition à ton problème voici un article qui t'intéressera peut-être:

    http://www.infopathdev.com/blogs/gre...ce-Prefix.aspx

    ++

    Thierry

    P.s. clique sur si tu n'as plus de problème Merci
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/04/2014, 17h46
  2. Réponses: 2
    Dernier message: 20/06/2006, 10h42
  3. recopier une valeur dans plusieurs enregistrements
    Par moicats dans le forum Access
    Réponses: 2
    Dernier message: 28/04/2006, 17h02
  4. [Avancé] Recopie une session dans un autre client
    Par gregoun dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 29/06/2004, 12h11
  5. Réponses: 2
    Dernier message: 17/09/2003, 09h36

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