19 octobre 2009

INFOPATH : FormState

Lors de l'utilisation du code managé dans InfoPath 2007, vous pouvez être amené à déclarer une variable globale afin de simplifier votre code.

Seulement, en infopath, cela nécessite de passer par l'utilisation d'un FormState (sous peine d'avoir un joli message d'erreur à la publication).
Il existe d'ailleurs un exemple prédéfini et commenté dans chaque formcode d'InfoPath.


La syntaxe à suivre est la suivante:
public partial class FormCode
{
       //Variable globales
       private string _strConnectionString
       {
             get {return (string)FormState["_strConnectionString"];}
             set {FormState["_strConnectionString"] = value;}
       }
       ...
}


Cela permet de déclarer le formState grâce à un get,set.
Ensuite , cette variable s'utilise simplement de la manière suivante:
  • Affectation : FormState["_strConnectionString"] = "test";
  • Lecture: string strConnectionString = FormState["_strConnectionString"].ToString();

Avec ceci, les variables globales InfoPath n'ont plus aucun secret pour vous.

12 octobre 2009

SHAREPOINT : Eviter IISRESET

Problématique:
Réaliser un ISSRESET sur un environnement de prodution est très fortement déconseillé... Malheureusement dans la plupart des cas, le déploiements de certaines fonctionnalités utilise cette commande. L'interruption de service est globale à tous les sites présents sur le gestionnaire IIS. Ainsi quelqu'un travaillant sur la web application X est bloqué à cause du déploiement d'une fonctionnalité sur l'application Y...

Résolution:
Au lieu d'effectuer un iisreset, il est préférable de "recycler le pool d'application" lié à votre web application.
Ceci fait le même effet que le iisreset mais correspond à une frappe chirurgicale! Ceci permet d'éviter de perturber les autres applications hébergées par IIS sur d'autres pools d'applications (cela induit donc de disposer de pools différent pour chaque web application afin d'être propre).
La commande permettant de redémarrer un pool d'application précis pour éviter le iisreset est la suivante:
          cscript c:\windows\system32\iisapp.vbs /a "NomduPool" /r
En environnement de développement, il est possible de rajouter cette commande lors de la compilation du projet VS. Ainsi un petit F5 sur le projet et tout est déployé!

Autant dire qu'il vaut mieux privilégier le recyclage d'un pool ciblé plutôt que d'utiliser un ISSRESET qui est beaucoup plus lent et qui interrompt le service sur tous les sites hébergés...

10 octobre 2009

OFFICE 2010: Gamme complète

En naviguant un peu sur le net, je suis tombé sur ce petit tableau récapitulatif des diverses éditions et gammes d'Office 2010 (cliquer sur l'image pour l'agrandir):




Par contre aucune information de prix ne filtre pour l'instant.
Il n'y a que Outlook qui est à présent placé dès la version "Home and Business".
A noter aussi que sur les nouveaux PC, le fameux "Works" (qui était installé par défaut) sera remplacé par des versions bridées de Word et d'excel (il était temps). Ce pack sera nommé Office Starter 2010.

Par contre la version "Professional Plus" d'Ofice 2010 comprendra:
  • le logiciel "SharePoint Workspace" (digne successeur de groove)
  • Notre logiciel bien-aimé "InfoPath". Par contre, nous avions déja vu qu'InfoPath était à présent scindé en 2 logiciels : le Editor et le Designer...
Petit bemol : j'espère que ce tableau est incomplet puisqu'il parait troublant que le InfoPath Editor (qui permet uniquement de remplir un formulaire InfoPath, genre "filler") ne soit disponible que dans la version ultime "Professional Plus"!

Affaire à suivre...

8 octobre 2009

SHAREPOINT : Convertir LookupField en SPUser

Lors des traitements SharePoint, il est souvent utile de récupérer les informations d'un utilisateur.

Cela peut se faire très facilement en recherchant les utilisateurs dans les groupes applicatifs SharePoint.
L'objet SPUser du modèle SharePoint regroupe toutes les informations nécessaires concernant un utilisateur (login, preferredname, mail).

Mais de nombreuses personnes remontent sur les forums la difficulté de convertir un utilisateur placé dans un champ "Personne ou groupe" d'une liste en cet objet SPUser.
Le besoin peut apparaitre par exemple si vous souhaitez envoyer un mail à toutes les personnes placées sur une liste de paramètrage.
Pour cela, il faut récupérer leur mail et donc l'objet SPUser.

Le code C# suivant permet de reconstruire un SPUser à partir de la valeur présente dans le champ "Personne" de la liste.
   SPFieldUserValue fieldValue = field.GetFieldValue(listItem["NomColonne"].ToString()) as SPFieldUserValue;
   if (fieldValue != null)
   {
        SPUser UserResponsable = fieldValue.User;
   }

Il suffit seulement de remplacer "NomColonne" par le nom de votre colonne de type "Personne" et vous récupérez ainsi les données de l'utilisateur.

Bon dév.

INFOPATH : Nom de la pièce jointe

Aujourd'hui, voici une petite astuce sympathique permettant de récupérer le nom d'une pièce jointe d'infopath.

Problématique:
Au première abord on pourrait croire cette tache très simple à réaliser...Et on aurait bien tort.
Comme chacun sait, les pièces jointes infopath sont encodées et stockées dans le xml en binary64 afin d'optimiser les performances et le traitement du xml...
Donc vous imaginez bien qu'obtenir le nom de la pièce jointe dans une chaine encodée n'est pas une action qui se fait toute seule...

Résolution:
Il suffit en fait de mettre en place le code suivant:

BinaryReader theReader = null;
using (MemoryStream ms = new MemoryStream(byte_PJ))
{
      theReader = new BinaryReader(ms);
      byte[] headerData = new byte[16];
      headerData = theReader.ReadBytes(headerData.Length);
      int fileSize = (int)theReader.ReadUInt32();
      int attachmentNameLength = (int)theReader.ReadUInt32() * 2;
      byte[] fileNameBytes = theReader.ReadBytes(attachmentNameLength);
      Encoding enc = Encoding.Unicode;
      attachmentName = enc.GetString(fileNameBytes, 0, attachmentNameLength - 2);
}
 
ou "bytePJ" correspond au tableau de byte de votre pièce jointe. Il es tobtenu en appliquant la fonction Convert.FromBase64String(strPiecejointe).

SHAREPOINT : Fonctions valeurs calculées

Pour tout ceux qui doivent utiliser des colonnes calculées sur SharePoint, voici une page qui pourra vous être fort utile: 

Elle détaille la liste des fonctions pouvant être utilisées pour ces colonnes.
Attention toutefois, en version Française, les séparateurs entre les arguments de ces fonctions ne sont pas, comme il est dit dans la page, des ","  mais plutôt des ";".

Bonne lecture.