Archives Catégorie: SharePoint

Comment faire pour résoudre les erreurs de SharePoint mystérieux.

Vue d'ensemble:

Le débogage est difficile lors de l'élaboration des fonctionnalités personnalisées pour Windows SharePoint Services 3.0 (WSS) ou Microsoft Office SharePoint Server (MOUSSE). Le principal coupable est que SharePoint apparaît normalement très peu d'informations diagnostique sur le navigateur web lorsqu'une erreur survient. Ce blog décrit comment localiser générées par le système diagnostique des informations supplémentaires qui peuvent souvent fournir ce supplément peu de détail que l'on a besoin afin d'identifier les causes profondes. Cela peut mener à résoudre le problème.

J'ai utilisé cette technique avec succès pour résoudre des erreurs sinon mystérieux.

Approche:

SharePoint enregistre un grand nombre d'informations dans un journal de diagnostic dans un fichier journal dans le 12 ruche.

La ruche 12"" est habituellement situé dans "C:\Program FilesCommon FilesMicrosoft SharedWeb Server Extensions12 ". (Je ne sais pas si c'est possible pour les 12 ruche à vivre n'importe où ailleurs, En fait).

L'idée est de localiser le fichier journal actuel, forcer l'erreur et puis ouvrir rapidement le fichier journal. Ces fichiers journaux sont caractérisées par:

  • Grandes quantités d'informations. SharePoint génère une grande quantité d'informations de diagnostic et l'écrit dans ce fichier journal très rapidement. Vous devez être rapide avec les doigts pour le capturer.
  • Multiplicité. SharePoint n'est pas écrire dans un fichier journal unique mais plutôt génère plusieurs fichiers journaux dans l'ordre.
  • Copiez et collez bien dans MS Excel.

Ma méthode préférée:

  1. Ouvrir un explorateur windows pointant vers le 12 hivelogs.
  2. Trier l'affichage pour afficher par date de modification (ordre antéchronologique).
  3. Mettez en surbrillance le fichier journal plus.
  4. Dans une fenêtre de navigateur web, forcer l'erreur de se produire.
  5. Rapidement, ouvrez le fichier journal actuel et copiez son contenu dans MS Excel.
  6. Accéder à la fin et d'analyser les entrées pertinentes.

Autres Notes:

Par défaut, le journal de diagnostic est situé dans le 12 Annuaire hiveLOGS.

MS Best practices (Selon Mike T. de Microsoft) État qui les fichiers journaux doivent être enregistrés dans un disque dur distinct. On fait cela via central admin. Votre administrateur système peut avoir fait cela, auquel cas vous devrez évidemment trouver le fichier de journal il au lieu de la valeur par défaut 12 emplacement de la ruche).

Cet article aborde les questions telles que:

  • Flux de travail SharePoint n'a pas pu démarrer en raison d'une erreur interne.
  • (plus à ajouter au fil du temps)
  • Cette entrée a été utile de diagnostiquer les erreurs de flux de travail (e.g. "Le flux de travail n'a pas pu démarrer en raison d'une erreur interne").

MOUSSE: Introduction efficace à une organisation

(Cette entrée croix postée entre http://paulgalvin.spaces.live.com/blog/ et http://blogs.conchango.com)

Les articles publiés sur ce site sont les miennes et ne représentent pas nécessairement les positions de Conchango, stratégies ou opinions.

Vue d'ensemble:

Cet article décrit certains renseignements de base sur une grande (3,000 utilisateurs) Microsoft Office SharePoint Server (MOUSSE) déploiement et que nous avons fait pour obtenir le projet de telle sorte que le client est heureux et fermement vers le bas d'un chemin de roulement qui se termine par l'adoption plénière de l'ensemble des fonctionnalités MOSS. La rédaction de l'entrée, Nous sommes environ 50% achever la première phase du projet. Comme les choses progressent, Je vais mettre à jour cet article et/ou écrire de nouvelles entrées.

Dans ce cas précis, la compagnie avait déjà installé SharePoint Portal Server 2003. Le groupe informatique installé le produit dans une sorte de « Voyons voir si quelqu'un se soucie" mode. Il a rapidement été adoptée par de nombreux utilisateurs de l'entreprise et est devenu très populaire dans l'entreprise dans son ensemble. Comme vous pouvez l'imaginer, ce n'était pas la meilleure stratégie de déploiement (laquelle le client admet d'emblée) et quand la mousse est arrivé sur la scène, le client a décidé de "faire les choses" et a retenu nos services pour les aider à.

Une des questions centrales que nous connaissons lorsque nous avons commencé la mise en œuvre de ce projet a été: Comment introduire MOSS à ce client? Étant donné que le client a déjà une expérience avec SharePoint, Nous nous sommes demandés — avons-nous besoin de faire "différentiel" formation ou ne que nous commençons par rapport au sol? Après concertation avec les utilisateurs clés, Nous avons déterminé que traiter cela comme un projet de terrain vert été plus logique.

Cette décision a donné un point de départ, mais nous a toujours laissé l'exigence majeure de trouver une bonne stratégie pour le déploiement MOSS à l'entreprise. MOSS est tel un gros animal … Il comprend la gestion de contenu, gestion de documents, recherche, sécurité, auditoire cible, gestion de projet, "fabuleux quarante" modèles, flux de travail, connecteur de données d'entreprise, etc.. Ajoutez à cela le fait que c'est une grande organisation qui peut vraiment faire usage de pratiquement chaque MOSS majeur caractéristique et vous avez l'étoffe d'un grand projet avec une portée de l'entreprise et beaucoup de bonnes choses qui se passe.

Nous sommes confrontés à cette question maintes et maintes fois … MOSS a une entreprise à atteindre avec son ensemble de fonctionnalités d'entreprise, encore un peu sophistiqués clients ont un moment difficile mentalement absorbant ces caractéristiques, laisser seul incorporant une fraction appréciable d'entre eux dans leur routine quotidienne.

Je n'ai pas une solution magique au problème. Je m'adresse à la place seulement les premières étapes que nous avons prise avec le client pour les conduire dans la voie à l'adoption réussie de longue durée.

Champ d'application:

Autant que je voulais l'équipe à élaborer un plan de projet qui comportait ces jalons comme « PoepleSoft intégration via BDC Completed », « Nouveau produit interministérielle lancement Workflow complet" et « De la haute direction KPI acceptée », J'ai dû se contenter de quelque chose de moins. Cela ne veut ne pas dire que moins »" est mauvais. En fait, les moins »" que nous avons décidé pour le déploiement initial était milles d'avance sur où elles étaient avant le début du. Dans notre cas, les moins »" transformé en:

  • Gestion de document simple à l'aide de bibliothèques de documents, types de contenu et de contrôle de version.
  • Recherche efficace basé sur les types de contenu et personnalisé de recherche avance (par l'intermédiaire de propriétés gérées, XSLT pour produire des résultats assez, etc.).

En plus des caractéristiques ci-dessus d'échelle de l'entreprise (ce qui signifie qu'ils devaient être étendu à tous les ministères et les utilisateurs), Nous avons ajouté les singleton dans la portée mini-projets suivants:

  • Preuve de concept intégration de BDC.
  • Processus de workflow multi-étapes et multi-branches créé via SPD.
  • Complexe formulaire InfoPath.
  • Surfaçage de KPI pour certains processus d'affaires (probablement HR d'acquisition de talents dans notre cas, Bien que cela peut changer).

La portée ici n'est pas 100% précis, mais représentatif de notre approche et suffisant pour mon but ici, qui est d'expliquer ce que je considère pour être une "puissance apparente" introduction de mousse qui fixera le client fermement dans la voie dorée à l'adoption plénière de MOSS.

Je ne vous écris bien plus encore sur le singleton dans cette entrée. Je ne veux pas dire qu'ils font partie de notre stratégie globale. L'idée est de mettre en œuvre les fonctionnalités principales document management et de la recherche à tous les utilisateurs encore fournir très fonctionnel, hautes exemples visibles et très représentatives des autres fonctionnalités MOSS principales qui sont tout simplement au-delà de la capacité de la plupart des utilisateurs d'absorber à ce stade précoce. Cependant, ils seront "out there" et on peut espérer qu'autres divisions ne connais ou apprendront eux et veulent ces fonctionnalités pour eux-mêmes, conduisant à une plus grande adoption. Ces histoires de réussite de singleton servent aussi à fournir à notre équipe de vente de munitions"" pour avoir remporté avec succès deuxième, projets de troisième et de la phase de n.

Ce qui nous a fait introduire et pourquoi?

S'étant établi sur la gestion de documents et de la recherche comme une exigence de base-l'échelle de l'entreprise, Nous avions besoin de commencer à rassembler des détails. Dans la pratique, Cela tournait autour de comprendre leurs documents et qui en fin de compte mappé à la compréhension des types de contenu.

J'ai trouvé qu'il est difficile d'expliquer les types de contenu sans aides visuelles. Folk plus technique peut se désengager une discussion au sujet des types de contenu lors CT est décrits en termes de base de données. « A CT est semblable à une table de base de données, Il comporte les colonnes et les colonnes sont définies en termes de types de données, mais les types de données de CT sont plus de simple entier/date, mais aussi « choix" et "ERRLOOK-Recherche" et ainsi de suite." Nous pouvons parler de "s'étendant" types de contenu, tout comme on peut hériter des fonctionnalités d'une classe de base dans les langages orientés objet. Cependant ce n'est évidemment pas utile pour la personne d'admin de ministère de transport qui n'a aucune formation technique. C'est-à-dire, presque tout le monde qui compte dans un déploiement MOSS.

À l'aide d'un tableau blanc est incertain. Je vous ai présenté l'idée d'un type de contenu et la brillante dessiné (ou alors, ils semblent) photos de types de contenu et ce qu'ils font pour vous en termes de recherche et comment ils peuvent être développés, etc.. En fin de compte, Il se sent comme des lampes à incandescence ont allumé, mais l'image résultante de tableau blanc est un gâchis.

Ceci nous conduit à notre lieu d'atterrissage actuels et donc beaucoup plus efficace: un site de bac à sable MOSS configuré pour afficher ces fonctionnalités.

L'utilisation du site de bac à sable, Nous démontrons:

  • Types de contenu:
    • Création d'un CT avec plusieurs types de données (texte, Date, choix, Boolean, recherche, etc.).
    • Étendre une CT en créant une nouvelle CT issu d'un parent.
    • Recherche de documents à l'aide de métadonnées CT.
  • Bibliothèques de documents:
    • Comment associer une seule CT une bibliothèque.
    • Que se passe-t-il lorsque nous télécharger un document vers cette bibliothèque?
    • Associant de multiples CT avec une bibliothèque de doc.
    • Que se passe-t-il lorsque nous télécharger un document vers cette bibliothèque?
    • Filtrage et le tri via les en-têtes de colonne dans une lib de doc.
    • Document bibliothèque vues:
      • Tri
      • Groupement
      • « L'entrée rapide" (vue de feuille de données)
      • « Données non balisées" (pour aider à la migration de MOSS provenant d'autres sources de contenu; plus à ce sujet ci-dessous).

Le Site de bac à sable:

Nous avons conçu notre site de bac à sable comme une caractéristique permanente dans l'environnement de développement pour être utilisé à des fins de formation longs après que nous aurons terminé le projet et inclus plusieurs artefacts comme décrit:

Types de contenu:

Nous avons défini les types de contenu suivants: Facture, Bon de commande, Facture de services.

Nous avons choisi d'ordre d'achat et facture parce qu'ils sont plus ou moins universellement sous
entités se tint. Tout le monde dans l'entreprise comprend qu'une facture est une demande de paiement d'une client pour une montant délivré sur un certain Date à payer selon certains conditions de paiement. Cela conduit à une définition naturelle d'un CT que nous avons appelé « facture de formation" (pour le distinguer de tout autre type de facture). Le bon de commande est définie de la même façon facilement. Nous avons également créé une facture de Services de formation"" en créant une nouvelle CT basée sur la facture de formation"" CT et ajouté à une colonne, « services rendus ».

Avec ce qui précède, Nous pouvons maintenant démontrer quelques caractéristiques principales de CT sans s'enliser à essayer d'expliquer un concept abstrait d'abord; déjà, tout le monde comprend ce que nous entendons par « facture" "bon de commande et" et peuvent au contraire se concentrer sur la mécanique de la CT lui-même.

Listes personnalisées:

CT avec des colonnes de type "ERRLOOK-Recherche" pointent vers une bibliothèque de documents ou de la liste personnalisée. Nous utilisons cette abondamment et pour le bac à sable, Nous avons créé une liste personnalisée qui contient des clients de soutenir. Nous avons choisi des clients parce que c'est un concept facile à comprendre et facile à démontrer. La facture CT a une colonne, « client" qui est défini de type "ERRLOOK-Recherche" qui pointe sur cette liste.

Nous avons créé une liste similaire personnalisée pour gérer les fournisseurs"" pour le bon de commande"" CT.

Bibliothèques de documents:

Nous avons créé deux bibliothèques de documents: « Factures" et « Des Documents mixtes ».

Nous avons configuré la bibliothèque de documents de factures pour gérer uniquement des documents de type CT « Facture ».

Nous avons configuré les Documents mixtes"" bibliothèque pour gérer tous les trois CT.

Créer plusieurs vues qui montrent le tri, filtrage, regroupement et fiche technique.

Recherche:

Nous avons défini deux nouvelles propriétés gérées et eux mappé à numéro de facture et client.

Nous avons créé un nouveau site de recherche de personnalisé avance et modifié pour permettre aux utilisateurs de rechercher des "factures" à l'aide de ces deux propriétés mappées.

Modifier le XSLT pour que le numéro de facture et client, lorsqu'il est présent, s'affichent dans un tableau HTML dans une couleur vive. L'objectif ici est de démontrer qu'il est possible de cette mise en forme.

Reconstituer les:

Nous organisons pour les principaux utilisateurs de participer à une démo.

Nous suivons ce script simple:

  1. Décrire le sens et le but d'une MÉ, à l'aide de factures et bons de commande comme exemples.
  2. Afficher la définition de CT facture tout en leur assurant en même temps qu'ils n'ont pas besoin d'utiliser ces écrans eux-mêmes, Il suffit de choisir les concepts.
  3. Aller à la bibliothèque de documents de factures.
  4. Télécharger un document.
  5. Démontrer que le client vers le bas est vraiment provenant d'une liste personnalisée.
  6. Ajouter un nouveau client à la liste des clients et puis mettre à jour les métadonnées de la facture récemment téléchargé avec le client nouvellement créé.
  7. Placez-vous dans les « documents mixtes" Bibliothèque et télécharger un document. Expliquer comment le système invite pour un type de document.
  8. Aller retour à la bibliothèque de documents de factures et de montrer comment change d'en cliquant sur un nom de la colonne ordre de tri.
  9. Démontrer que le filtrage au niveau des colonnes.
  10. Afficher différentes vues qui démontrent plusieurs niveaux de tri, filtrage et de regroupement.
  11. Afficher la vue de feuille de données.
  12. Expliquer le but de "documents non balisés" point de vue.
  13. Basculer vers la recherche avancée sur mesure.
  14. Maintenant, le document récemment téléchargé devrait ont été analysé et indexé, effectuer une recherche qui illustre la capacité de localiser cette facture par l'intermédiaire de la propriété mappée.
  15. Nous démontrer la différence entre la recherche par l'intermédiaire de propriétés mappées vs. juste une recherche de texte.

À ce point, Nous sommes plus ou moins fait avec la démo. Il semble prendre sur 30 À 45 minutes, selon combien de questions, les gens demandent.

Nous avons alors les renvoyer à leurs bureaux avec des « devoirs ». Il s'agit d'un simple tableur excel où on leur demande de définir, pour nous, ce qu'ils pensent qu'ils ont besoin en termes de CT, tous les deux à un niveau élevé (le nom et tout usage) ainsi que le type de données et colonnes ils stockerait dans la colonne. Nous ne demandons pas à définir les types de données de colonne en termes MOSS, mais les modalités de l'entreprise.

En résumé:

Nous avons créé un environnement sandbox qui nous permettrait de démontrer certaines fonctionnalités MOSS de base dont l'appel sont à l'échelle.

Nous avons modélisé les entités métier facile à comprendre et commun afin que les utilisateurs peuvent se concentrer sur la mousse et pas s'enliser sur les entités / exemples eux-mêmes.

Les utilisateurs professionnels à pied sessions de thèses à faire leurs devoirs"" sous forme de documents excel dont ils sont désormais compétents pour remplir et utiliser pour concevoir leurs propres types de contenu de la première coupe.

Enfin, comme nous effectuons des démonstrations au fil du temps, membres de l'équipe du client eux-mêmes deviennent plus aptes à mener à bien, faire la démo eux-mêmes et libérer généralement le reste d'entre nous de travailler sur des questions plus complexes, comme la taxonomie global, flux de travail complexes, BDC, etc..

MOUSSE: Fonctionnelle exemple-Type de données personnalisé

Scénario d'entreprise:

L'échelle de l'entreprise mise en œuvre de mousse pour l'entreprise de fabrication avec 30+ sites et quelques dizaines des services.

Objectif de l'entreprise:

Malgré une multitude de groupes d'entreprises (départements, emplacements, etc.), certaines données devraient être maintenues à un niveau mondial. Par exemple, une liste principale faisant autoritaire de tous les lieux physiques de l'entreprise (e.g. installations de fabrication, entrepôts, bureaux de vente) devrait être maintenue dans un emplacement central.

Problème technique:

La taxonomie de l'entreprise a été implémentée à l'aide de plusieurs collections de sites. Nous aurions aimé créer la liste faisant autoritaire des emplacements physiques dans une liste personnalisée de WSS. Puis, Quand nous avions besoin d'avoir une colonne dans un type de contenu (ou une colonne ajoutée à une bibliothèque ou une liste doc) qui contenait des sociétés / entreprises, Nous créerions une colonne à l'aide de la recherche"" type de données, pointez sur cette liste principale.

Malheureusement, types de données de recherche doit accéder à une liste de source "localement" ce qui signifie que notre liste officielle ne peut pas s'étendent de collections de sites.

Solution technique:

Mettre en œuvre un nouveau type de données personnalisé mis en œuvre sur la base de SPField et représentée comme un DropDownList dans l'interface utilisateur dont ListItems peupler de la liste principale de WSS.

Nous avons créé une nouvelle collection de site appelée "http://localhost/EnterpriseData". Il, Nous avons créé une liste personnalisée nommée « Sociétés / entreprises ». Cette liste utilise seulement le titre"standard" champ pour contenir la liste des sociétés / entreprises réelles.

On suit plusieurs étapes discrètes pour créer un type de données personnalisé dans WSS. Ils sont:

  1. Définissez une classe qui hérite de SPField (On ne peut hériter d'autres domaines si nécessaire).

Voici le code pour ça:

public classe XYZZYCorporateLocationField : SPFieldText
{
public XYZZYCorporateLocationField
(SPFieldCollection champs, chaîne typeName, chaîne displayName)
: base(champs, typeName, displayName) { }

public XYZZYCorporateLocationField
(SPFieldCollection champs, chaîne displayName)
: base(champs, displayName) { }

public Substituez BaseFieldControl FieldRenderingControl
{
Télécharger
{
BaseFieldControl contrôle = Nouveau XYZZYCorporateLocationFieldControl();
contrôle. FieldName = ce.InternalName;
retour contrôle;
} //Télécharger
} // FieldRenderingControl

public Substituez chaîne GetValidatedString(objet valeur)
{
Si (ce.Obligatoire || valeur. ToString().Est égal à(Chaîne.Vide))
{
jeter Nouveau SPFieldValidationException ("Le ministère n'est pas affecté.");
}
retour base.GetValidatedString(valeur);
} // GetValidatedString

} // XYZZYCorporateLocation

  1. Définir une autre classe qui hérite du contrôle de champ de base, comme dans:

public classe XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protégé DropDownList XYZZYCorporateLocationSelector;

protégé Substituez chaîne DefaultTemplateName
{
Télécharger
{
retour "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

public Substituez objet Valeur
{
Télécharger
{
EnsureChildControls();
retour ce.SelectedValue XYZZYCorporateLocationSelector.;
} // Télécharger
ensemble
{
EnsureChildControls();
ce.XYZZYCorporateLocationSelector.SelectedValue = (chaîne)ce.ItemFieldValue;
} // ensemble
} // substituer la valeur d'objet

protégé Substituez VOID CreateChildControls()
{

Si (ce.Domaine == null || ce.ControlMode == SPControlMode.Affichage)
retour;

base.CreateChildControls();

ce.XYZZYCorporateLocationSelector =
(DropDownList)FindControl TemplateContainer.("XYZZYCorporateLocationSelector");

Si (ce.XYZZYCorporateLocationSelector == null)
jeter Nouveau Exception("ERREUR: Impossible de charger. Fichier ASCX!");

Si (!ce.Page IsPostBack.)
{

à l'aide de (SPSite site = Nouveau SPSite(« http://localhost/enterprisedata"))
{
à l'aide de (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Listes[Sociétés / entreprises""];

foreach (SPItem XYZZYCorporateLocation dans currentList.Items)
{
Si (XYZZYCorporateLocation[« Titre"] == null) continuer;

chaîne Titre;
Titre = XYZZYCorporateLocation[« Titre"].ToString();

ce.XYZZYCorporateLocationSelector.Items.Add
(Nouveau ListItem(Titre, Titre));

} // foreach

} // Using web As spweb = site.openweb()
} // en utilisant spsite site = nouvelle spsite(« http://localhost/enterprisedata")

} // Si ce n'est une publication (postback)

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Le code ci-dessus fondamentalement implémente la logique pour remplir le contrôle DropDownList avec les valeurs de la liste personnalisée de WSS, situé à http://localhost/enterprisedata et nommée « les services ».

J'ai défini les deux classes dans un fichier .cs seul, compilé et placez-le dans le global assembly cache (fort nécessaire, Bien sûr).

  1. Mettre en œuvre un modèle de contrôle (.ascx) comme le montre:

<%@ Contrôle Langue= "C#" Hérite="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Version = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Toujours" %>
<%
@ S'inscrire TagPrefix= wssawc"" Namespace="Microsoft.SharePoint.WebControls" Assemblée="Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ S'inscrire TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assemblée="Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= XYZZYCorporateLocationFieldControl"" runat= « server »>
<Modèle>
<ASP:DropDownList ID= XYZZYCorporateLocationSelector"" runat= "serveur" />
</Modèle>
</
SharePoint:RenderingTemplate>

Ce qui précède est enregistré en c:\programme filescommon filesmicrosoft sharedweb server extensions12controltemplates.

  1. Enfin, Nous créons un fichier XML pour enregistrer dans le... 12XML répertoire. Il s'agit de CAML qui définit notre type de données personnalisé et pour mon exemple, ressemble à ceci:

<?XML Version="1.0" codage="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Champ Nom="TypeName">CorporateLocations</Champ>
<
Champ Nom="ParentType">Texte</Champ>
<
Champ Nom="TypeDisplayName">Sociétés / entreprises</Champ>
<
Champ Nom="TypeShortDescription">Toutes les sociétés XYZZY / y compris les installations de fabrication ou d'autres.</Champ>
<
Champ Nom="UserCreatable">VRAI</Champ>
<
Champ Nom="ShowInListCreate">VRAI</Champ>
<
Champ Nom="ShowInDocumentLibraryCreate">VRAI</Champ>
<
Champ Nom="ShowInSurveyCreate">VRAI</Champ>
<
Champ Nom="ShowInColumnTemplateCreate">VRAI</Champ>
<
Champ Nom="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = b0b19e85410990c4</Champ>
<
RenderPattern Nom="DisplayPattern">
<
Commutateur>
<
Expr>
<
Colonne />
</
Expr>

<Affaire Valeur=""/>

<Par défaut>
<
HTML>
<![CDATA[
<span style = "color:Red"><b>]]>
</
HTML>

<
Colonne SubColumnNumber="0" HTMLEncode="VRAI"/>

<HTML><![CDATA[</b></travée>]]></HTML>

</
Par défaut>
</
Commutateur>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Ce fichier XML ajoute le type de données personnalisé à la "bibliothèque WSS" et il matches contre le GAC a l'Assemblée.

Après avoir déménagé tous ces bits en place, iisreset sur le serveur et il devrait démarrer tous fonctionne bien.

MOUSSE: Mise à jour d'une liste personnalisée

Il y a beaucoup de bons exemples de mise à jour de listes personnalisées via le SDK. Voici encore un autre.

Problème commercial: Formulaire InfoPath a été conçu pour que les demandes d'achat permet aux utilisateurs de s'inscrire en ligne. Réquisition de PO numéros devraient être séquence traditionnelle basée à valeurs entières et calculé automatiquement.

Solution d'affaires: Créer une liste personnalisée de mousse contenant deux colonnes: "ControlField" et « ControlValue ». La colonne valeur contient le prochain numéro de demande d'achat. Notez que le générique "contrôle" convention de nommage fournit pour les champs de contrôle futur qui peuvent être utilisés selon les besoins.

Solution technique: Créer un service web accédé par le client InfoPath. Le service web retourne en arrière le prochain numéro de réquisition d'achat et met à jour la valeur de la liste.

Leçons apprises:

  • Lors de l'ajout de ce service web comme une source de données au formulaire InfoPath, J'ai jugé nécessaire de convertir en une udc et la stocker dans une bibliothèque de connexions de données.
  • Je l'ai trouvé aussi nécessaire pour activer le script inter-domaines via l'administration centrale services // gestion des applications // configuration de serveur de formulaire.
  • La première fois la forme a essayé d'accéder au service web, Il faut du temps et à l'occasion, Il serait temps. J'ai bidouillé avec les paramètres de configuration de serveur de formulaire d'élargir les paramètres de délai d'attente et qui semblent aider.

Le code:

à l'aide de Système;
à l'aide de System.Web;
à l'aide de System.Web.Services;
à l'aide de System.Web.Services.Protocols;
à l'aide de Microsoft.SharePoint;
à l'aide de System.Configuration;

[WebService(Namespace = « http://www.Conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public classe PoService : System.Web.Services.WebService
{
public PoService () {

//Décommentez la ligne suivante si vous utilisez des composants conçus
//InitializeComponent();
}

/// <Résumé>
/// Obtenir le numéro suivant dans la liste numéro de contrôle sharepoint po.
/// Incrémenter le numéro de PO dans cette liste.
/// </Résumé>
/// <retourne></retourne>
[WebMethod]
public chaîne GetNextPoNumber()
{
chaîne SpPoControlSiteName; // Nom du site MOSS réel qui héberge la liste de contrôle de PO.
chaîne SpPoControlListName; // Nom de la liste réelle de MOSS qui contient le contrôle de Po.

SpPoControlSiteName = ConfigurationSettings.AppSettings["PoControlListHostingSite"].ToString();
SpPoControlListName = ConfigurationSettings.AppSettings["PoControlList"].ToString();

chaîne nextPoReqNumber = "xyzzy";

à l'aide de (SPSite site = Nouveau SPSite(SpPoControlSiteName))
{
à l'aide de (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Listes[SpPoControlListName];

foreach (SPItem controlItem dans currentList.Items)
{

Si (((chaîne)controlItem["ControlField"]).Est égal à("NextPoNumber"))
{
nextPoReqNumber = (chaîne)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Convert.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

controlItem["ControlValue"] = int_nextPoReqNumber;
controlItem.Update();
}

} // Localisation, lire et mettre à jour le nombre de PO dans la liste.


} // Using web As spweb = site.openweb()
} // en utilisant spsite site = nouvelle spsite(« http://localhost/mizuho")

retour nextPoReqNumber;

}
}