28 juillet 2009

InfoPath : Le retour de l'attribut nil

Tôt ou tard, en réalisant du code managé sur infopath, vous allez être confronté à l'erreur qui tue "schema validation found non-data type"...

Cette erreur provient dans 99% des cas de l'attribut nil sur les champs de type "DateTime, Time, Date, Boolean, Whole Number et Decimal".
Si vous rendez un de ces champs null, vous aurez l'erreur précédente car le vide est considéré comme une chaine vide et donc le formatage des données n'est pas respecté...

La méthode de contournement est simple, encore faut-il la connaitre!
Il suffit d'utiliser ces 2 procédures codées en C# qui prennent en paramètre un XPathNavigator du noeud concerné.

La procédure "DeleteNil" permet d'enlever l'attribut nil du noeud s'il existe de manière à insérer une valeur dans le champ sans avoir d'erreur.

public void DeleteNil(XPathNavigator node)
{
if (node.MoveToAttribute("nil",
http://www.w3.org/2001/XMLSchema-instance))
node.DeleteSelf();
}


La procédure "InsertNil", quand à elle, permet de supprimer la valeur d'un champ qui n'est pas de type texte.Pour cela il faut supprimer la valeur et remettre l'attribur nil:

public static void InsertNil(XPathNavigator node)
{
if(!node.MoveToAttribute("nil", "
http://www.w3.org/2001/XMLSchema-instance"))
{
string result = string.Empty;
int endIndex = node.OuterXml.IndexOf(">");
result = node.OuterXml.Substring(0, endIndex) + " xsi:nil=\"true\" />";
node.OuterXml = result;
}
}


Et voila, vous voila débarassé du cauchemar du "schema validation found non-data type".
Il suffit à présent d'appeler la bonne prodédure.

InfoPath : Insertion d'une image dans un template

Bonjour,

L'insertion d'une image de fond dans infopath 2007 peut se faire par le menu "Format/Couleur d'arrière plan".

Mais dans les cas suivants, cette méthode n'est pas satisfaisante:
- insertion de la même imafe dans plusieurs vues (les images sont dupliquées et le fichier ".xsn" est alourdi pour rien).
- Postionnement spécifique de l'image de fond dans la page.
- Rajout de plusieurs images dans chaque vue d'un formulaire.

Pour remédier à ces différents cas de figure, il vaut mieux reprendre manuellement ce qu'infopath réalise automatiquement.
Voici la solution à suivre dans le cas d'un formulaire n'étant pas intégré dans une solution managée:

- Aller dans Outils puis insérer l'image en fichier de resources.
- Enregistrer le formulaire sur votre PC.
- Le template ".xsn" d'infopath n'est autre qu'un fichier cab comprenant les fichiers de la solution.
Il faut donc les extraire en faisant "Fichier/Enregistrer en tant que fichiers source".
- Si vous vous déplacez dans ce dossier, vous apercevez l'image que vous avez rajouté précédemment.
- Utiliser un éditeur de texte et éditez la vue "xsl" afin d'y placer l'image en image de fond par exemple.
Se déplacer dans le bloc et rajouter l'attribut suivant : style="background-image:url('Logo.jpg')"
- Ouvrir le fichier manifest.xsf en sélectionnant le mode conception sur le clic droit pour enregistrer de nouveau le formulaire.

Cette méthode est donc à utiliser se vous souhaitez ne pas obtenir de template trop lourds au niveau du poids.