Bar est encore assez élevé pour étendre MOSS

Aujourd'hui, J'ai été travailler avec un client et qui décrit comment modifier le composant WebPart requête de contenu et d'afficher des bits supplémentaires d'informations d'un type de contenu.

« D'abord, vous configurez la CQWP pour se connecter à sa source de données, Ensuite, vous exportez votre station de travail, modifier <CommonViewFields>, Télécharger, supprimer l'original, et maintenant c'est ' apprêté’ pour afficher les autres colonnes. Prochaine, Ouvrez SharePoint designer, Accédez à la racine du site collection et localisez ItemStyle.xsl. Copier un des modèles comme point de départ utile. Revenir en arrière et modifier la CQWP de faire usage de ce nouveau modèle. Enfin, modifier le modèle pour afficher vos nouveaux champs! (N'oubliez pas de vérifier que dedans alors que d'autres utilisateurs peuvent voir les résultats)."

Il est tout à fait clair pour moi (et la plupart d'entre nous, les types de développeur SharePoint) ce qui se passe et comment il est très agréable, vraiment, que les aspects de récupération de données de la WebPart sont tellement bien-séparée des aspects de présentation de données. Mais, Il n'est pas si facile à expliquer, est-ce?

<fin />

Afficher le contenu Web partie résultats dans une grille / Table

Présentation et objectif

Out of the box, MOUSSE’ WebPart requête de contenu (CQWP) affiche les résultats dans un format de liste, semblables aux résultats de la recherche. Il est également possible d'afficher les résultats sous forme de grille (i.e. Format de tableau HTML). Formats de grille sont meilleures dans certaines circonstances. Je décris comment arriver à cet effet dans le présent article.

Scénario d'entreprise

J'ai travaillé avec un client sur un déploiement MOSS d'échelle de l'entreprise. Nous avons conçu leur taxinomie, telles que projets sont des citoyens de première classe dans la hiérarchie et ont leur propre site de niveau supérieur. Chefs de projet maintient une liste de singleton des informations sommaires sur le projet, par exemple, titre, budget, date d'achèvement prévue, budget restant et autres champs type de résumé. Par « singleton" Je veux dire une liste SharePoint personnalisée garantie pour ne contenir qu'un seul élément. De manière simpliste, Il ressemble à ceci:

image

L'approche technique est bien la même que celle décrite ici (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). Le WebPart utilise une transformation XSL pour émettre HTML du navigateur pour le rendu.

J'envisage toujours le résultat avant de plonger dans le XSL, XSL étant un cauchemar. Voici mon résultat souhaité:

image

HTML comme ceci génère ce résultat:

<html>
 <corps>
 <Centre>
 <table frontière= 1>

<!-- Étiquettes-->
 <TR bgcolor= bleu>
 <TD><polices Couleur= blanc><b>Nom du projet</b></polices></TD>
 <TD aligner= droite><polices Couleur= blanc><b>Date complète</b></polices></TD>
 <TD aligner= droite><polices Couleur= blanc><b>Budget</b></polices></TD>
 <TD aligner= droite><polices Couleur= blanc><b>Dépense réelle</b></polices></TD>
 <TD><polices Couleur= blanc><b>État général</b></polices></TD>
 </TR>

<TR>
 <TD>Recâbler salle informatique.</TD>
 <TD aligner= droite>02/01/08</TD>
 <TD aligner= droite>22,500.00</TD>
 <TD aligner= droite>19,000.00</TD>
 <TD>En cours</TD>
 </TR>

<TR>
 <TD>Serveurs de disposition pour la mise à niveau SQL</TD>
 <TD aligner= droite>04/01/08</TD>
 <TD aligner= droite>7,500.00</TD>
 <TD aligner= droite>0.00</TD>
 <TD>Prévues</TD>
 </TR>

</table>
 </Centre>
 </corps>
</html>

Approche

Procédez comme suit pour créer la grille:

  1. Identifier les composantes de la grille (lignes/colonnes).
  2. Définir et créer des colonnes de site nécessaires.
  3. Créer des sous-sites pour les projets et les listes de singleton.
  4. Ajoutez le WebPart à une page web et le configurer pour rechercher vos listes.
  5. Modifier XML de la CQWP pour pouvoir les colonnes supplémentaires.
  6. Modifier le langage XSL pour générer une table.

Je vais me concentrer sur numéro six. Numéros d'un à quatre sont simples et quelque chose que n'importe quel utilisateur WebPart a déjà fait. Numéro cinq a été bien documenté par des tiers, y compris cet article en charge exhaustif de capture d'écran de MSDN ici (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) et le blog de Heather Solomon ici (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

Écrous et boulons

Commencer et mettre en œuvre les étapes une à cinq selon la documentation MSDN et article de Heather Solomon.

À ce point, vous avez ajouté votre WebPart à la page et vous avez votre <CommonViewFields> configuré selon les besoins.

Suivant la procédure habituelle, Je reçois ces résultats intermédiaires:

1. Créer un type de contenu, une liste personnalisée modélisée pour ce type de contenu et deux sites. Voici le type de contenu:

image

Voici la structure du site:

image

2. Ajoutez le WebPart après avoir créé mon projet sous-sites et singleton listes sommaires de projet:

image

3. Ajouter toutes les données supplémentaires je veux via le <CommonViewFields>:

        <propriété nom="CommonViewFields" type="chaîne">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</propriété>

Notez que j'ai dû garder tous les champs de propriété sur une ligne ou il ne fonctionnerait pas (CQWP me disait que la requête a retourné aucun élément).

4. À ce point, Nous sommes prêts à aller au-delà de l'article MSDN et flip sur l'article de Heather Solomon. Suivez ses étapes commençant près étape #5 pour créer un personnalisé / version incarnée de ItemStyle.xsl. J'ai suivi les conseils de Heather, vers le haut jusqu'à l'étape 11 et d'obtenir ces résultats intermédiaires:

4.1: Nom de mon modèle XSL comme suit:

<XSL:nom du modèle = "grille" match = "Row[@Style = "Grille"]" mode = « itemstyle »>

J'ai également légèrement modifier lui a suggéré <XSL:pour chaque …> en ajoutant un <br /> balise pour fournir une liste plus propre:

    <XSL:pour chaque Sélectionnez="@*">
      P:<XSL:de la valeur Sélectionnez="nom()" /><br/>
    </XSL:pour chaque>

4.2: J'ai modifier le composant WebPart, allez dans apparence et sélectionnez ma grille"" style:

image

Appliquer le changement et voici le résultat:

image

De ce qui précède, nous pouvons voir que les domaines que nous voulons (Nom du projet, frais, statut, etc.) n'existe pas pour nous d'utiliser lorsque nous émettons le code HTML. Non seulement cela, mais nous voyons les noms par lequel nous devons faire référence à ces colonnes dans le XSL. Par exemple, nous référençons projet statut comme « Project_x005F_x0020_Name ».

À ce point, Nous partons du blog de Heather et des épaules de ces géants, J'ajoute mon propre petit peu.

ContentQueryMain.xsl

NOTE: Lorsque des changements à la fois ContentQueryMain.xsl ainsi que ItemStyle.xsl, vous devez vérifier que ces fichiers en arrière en avant de voir l'effet de vos modifications.

À des fins de fabrication de grille, MOSS utilise deux fichiers XSL différents pour produire les résultats que nous voyons dans une CQWP. Pour générer le bit précédent de sortie, Nous avons modifié ItemStyle.xsl. MOSS utilise en fait un autre fichier XSL, ContentQueryMain.xsl pour conjointement avec ItemStyle.xsl pour générer son code HTML. Comme son nom l'indique, ContentQueryMain.xsl est le principal"" XSL qui contrôle l'ensemble du flux de traduction. Il parcourt tous les éléments trouvés et les passe un par un pour modèles ItemStyle.xsl. Nous allons modifier ItemStyle.xsl pour générer l'open <table> balise avant d'émettre la première ligne de données et de la fermeture <table> balise après émission de la dernière rangée. Pour y parvenir, ContentQueryMain.xsl est modifié pour passer deux paramètres à notre grille"" modèle en ItemStyle.xsl, "dernière ligne" et « ligne active ». ItemStyle.xsl utilise pour émettre sous certaines conditions les balises nécessaires.

À l'aide technique de Heather Solomon, Nous localiser ContentQueryMain.xsl. Il est situé au même endroit que ItemStyle.xsl. Cette capture d'écran devrait aider:

image

Nous avons besoin d'apporter les modifications suivantes:

  • Modifier un modèle xsl, "CallItemTemplate" qui appelle en fait notre modèle de grille dans ItemStyle.xsl. Nous passerons deux paramètres dans le modèle de grille afin qu'elle aura les données qu'il doit générer sous certaines conditions d'ouverture et de fermeture <table> balises.
  • Modifier un autre peu de ContentQueryMain.xsl qui appelle le "CallItemTemplate" pour réussir un LastRow"" paramètre afin que LastRow peut-être être transmise à notre modèle de grille.

Recherchez le modèle nommé "OuterTemplate.CallItemTemplate" identifié par la chaîne:

  <XSL:modèle nom="OuterTemplate.CallItemTemplate">

Remplacer le modèle entier comme suit:

  <XSL:modèle nom="OuterTemplate.CallItemTemplate">
    <XSL:Param nom="CurPosition" />

    <!--
      Ajouter le LastRow"" paramètre.
      Nous l'utilisons uniquement lorsque l'élément style pass en est la « Grille ».
    -->
    <XSL:Param nom="LastRow" />

    <XSL:choisir>
      <XSL:Lorsque test="@Style = 'NewsRollUpItem'">
        <XSL:appliquer-templates Sélectionnez="." mode="ItemStyle">
          <XSL:avec-param nom="EditMode" Sélectionnez="$cbq_iseditmode" />
        </XSL:appliquer-templates>
      </XSL:Lorsque>
      <XSL:Lorsque test="@Style = 'NewsBigItem'">
        <XSL:appliquer-templates Sélectionnez="." mode="ItemStyle">
          <XSL:avec-param nom="CurPos" Sélectionnez="$CurPosition" />
        </XSL:appliquer-templates>
      </XSL:Lorsque>
      <XSL:Lorsque test="@Style = 'NewsCategoryItem'">
        <XSL:appliquer-templates Sélectionnez="." mode="ItemStyle">
          <XSL:avec-param nom="CurPos" Sélectionnez="$CurPosition" />
        </XSL:appliquer-templates>
      </XSL:Lorsque>

      <!--
              Passer de la position actuelle et lastrow au modèle grille itemstyle.xsl.
              ItemStyle.xsl qui utilisera pour émettre l'ouverture et de fermeture <table> balises.
      -->
      <XSL:Lorsque test="@Style = "Grille"">
        <XSL:appliquer-templates Sélectionnez="." mode="ItemStyle">
          <XSL:avec-param nom="CurPos" Sélectionnez="$CurPosition" />
          <XSL:avec-param nom="Dernière" Sélectionnez="$LastRow" />
        </XSL:appliquer-templates>
      </XSL:Lorsque>

      <XSL:autrement>
        <XSL:appliquer-templates Sélectionnez="." mode="ItemStyle">
        </XSL:appliquer-templates>
      </XSL:autrement>
    </XSL:choisir>
  </XSL:modèle>

Les observations décrivent l'objet des modifications.

Bien sûr, le OuterTemplate.CallItemTemplate"" est elle-même appelée à partir d'un autre modèle. Localiser ce modèle en recherchant cette chaîne de texte:

<XSL:modèle nom="OuterTemplate.Body">

Faites défiler les instructions dans OuterTemplate.Body et insérer le paramètre LastRow comme suit (montré comme un commentaire en italique):

<XSL:appel-modèle nom="OuterTemplate.CallItemTemplate">
  <XSL:avec-param nom="CurPosition" Sélectionnez="$CurPosition" />
  <!-- Insérer le paramètre LastRow. -->
  <XSL:avec-param nom="LastRow" Sélectionnez="$LastRow"/>
</XSL:appel-modèle>

Après tout cela, Nous avons enfin les choses correctement mis en place afin que nos ItemStyle.xsl peut émettre <table> balises au bon endroit.

ItemStyle.Xsl

NOTE: Encore une fois, heure d'arrivée ItemStyle.xsl après d'apporter des modifications afin que vous voyez l'effet de ces changements.

Nous avons deux tâches ici:

  • Remplacer le modèle de grille complet. Vous pouvez copier/coller d'en bas.
  • Ajouter certains charabia en dehors de la définition du modèle qui permet de "formatcurrency" modèle de travailler. (Vous pouvez dire que j'ai une poignée ténue sur XSL).

Première, haut de ItemStyle.xsl, Ajoutez cette ligne:

  <!-- Certains charabia qui nous permet d'afficher des États-Unis. monnaie. -->
  <XSL:format décimal nom="personnel" chiffres="D" />

  <XSL:modèle nom="Par défaut" match de football="*" mode="ItemStyle">

Remarque que je l'ai ajouté directement avant le <XSL:nom du modèle = "par défaut" …> définition.

Prochaine, revenir à notre modèle de grille. Remplacer le modèle de grille complet avec le code ci-dessous. Il est abondamment commenté, mais n'hésitez pas à m'envoyer un email ou de laisser des commentaires sur mon blog, si vous avez des questions.

  <XSL:modèle nom="Grille" match de football="Ligne[@Style = "Grille"]" mode="ItemStyle">

    <!--
      ContentMain.xsl passe CurPos et dernier.
      Nous utilisons ces à émettre sous certaines conditions l'ouverture et de fermeture <table> balises.
    -->
    <XSL:Param nom="CurPos" />
    <XSL:Param nom="Dernière" />

    <!-- Les variables suivantes sont non modifiées de la norme ItemStyle.xsl -->
    <XSL:variable nom="SafeImageUrl">
      <XSL:appel-modèle nom="OuterTemplate.GetSafeStaticUrl">
        <XSL:avec-param nom="UrlColumnName" Sélectionnez="'ImageUrl'"/>
      </XSL:appel-modèle>
    </XSL:variable>
    <XSL:variable nom="SafeLinkUrl">
      <XSL:appel-modèle nom="OuterTemplate.GetSafeLink">
        <XSL:avec-param nom="UrlColumnName" Sélectionnez="« LinkUrl »"/>
      </XSL:appel-modèle>
    </XSL:variable>
    <XSL:variable nom="DisplayTitle">
      <XSL:appel-modèle nom="OuterTemplate.GetTitle">
        <XSL:avec-param nom="Titre" Sélectionnez="@Title"/>
        <XSL:avec-param nom="UrlColumnName" Sélectionnez="« LinkUrl »"/>
      </XSL:appel-modèle>
    </XSL:variable>
    <XSL:variable nom="LinkTarget">
      <XSL:Si test="@OpenInNewWindow = « True »" >_blank</XSL:Si>
    </XSL:variable>

    <!--
      Ici, nous définissons une variable, « tableStart ».  Ce dernier contient le code HTML que nous utilisons pour définir l'ouverture de la table ainsi que les étiquettes de colonne.  Notez que si CurPos = 1, Il inclut le code HTML dans une balise CDATA.
      Dans le cas contraire, il sera vide.

      La valeur de tableStart est émise chaque fois ItemStyle est appelée via ContentQueryMain.xsl.
    -->
    <XSL:variable nom="tableStart">
      <XSL:Si test="$CurPos = 1">
        <![CDATA[
        <bordure du tableau = 1>
          <TR bgcolor = « blue »>
            <TD><couleur de police = « white »><b>Nom du projet</b></polices></TD>
            <td align = « right »><couleur de police = « white »><b>Date complète</b></polices></TD>
            <td align = « right »><couleur de police = « white »><b>Budget</b></polices></TD>
            <td align = « right »><couleur de police = « white »><b>Dépense réelle</b></polices></TD>
            <TD><couleur de police = « white »><b>État général</b></polices></TD>
          </TR>
        ]]>
      </XSL:Si>
    </XSL:variable>

    <!--
      Une autre variable, tableEnd définit simplement la fermeture balise de tableau.

      Comme avec tableStart, Il est toujours émise.  C'est pourquoi sa valeur est assignée conditionnelle basée sur si nous avons passés la dernière rangée de ContentQueryMain.xsl.
    -->
    <XSL:variable nom="tableEnd">
      <XSL:Si test="$CurPos = $Last">
        <![CDATA[ </table> ]]>
      </XSL:Si>
    </XSL:variable>

    <!--
      Émettent toujours le contenu de tableStart.  Si ce n'est pas la première ligne passée à nous par ContentQueryMain.xsl, Ensuite, nous connaissons que sa valeur sera vide.

      Désactiver la sortie s'échapper parce que quand tableStart il non pas vides, Il inclut HTML réel que nous voulons être restitué par le navigateur.  Si nous ne disons l'analyseur XSL pour désactiver la sortie échappement, il génère des trucs comme"&lt;table&gt;" au lieu de"<table>".
    -->
    <XSL:de la valeur Sélectionnez="$tableStart" disable-output-escaping="Oui"/>


    <TR>
      <!--
      P:Project_x005F_x0020_Name P:Project_x005F_x0020_End_x005F_x0020_Date P:Project_x005F_x0020_Budget P:Project_x005F_x0020_Expenses P:Project_x005F_x0020_Status
      -->
      <TD>
        <XSL:de la valeur Sélectionnez="@Project_x005F_x0020_Name"/>
      </TD>

      <TD aligner="droit">
        <XSL:de la valeur Sélectionnez="@Project_x005F_x0020_End_x005F_x0020_Date"/>
      </TD>

      <TD aligner="droit">
        <XSL:appel-modèle nom="FormatCurrency">
          <XSL:avec-param nom="valeur" 
Sélectionnez="@Project_x005F_x0020_Budget"></XSL:avec-param> </XSL:appel-modèle> </TD> <TD aligner="droit"> <XSL:appel-modèle nom="FormatCurrency"> <XSL:avec-param nom="valeur" Sélectionnez="@Project_x005F_x0020_Expenses">
</XSL:avec-param> </XSL:appel-modèle> </TD> <TD> <XSL:de la valeur Sélectionnez="@Project_x005F_x0020_Status"/> </TD> <!-- Tous les éléments suivants est commentée pour clarifier les choses. Cependant, le ramener et tout ça dans un <TD> pour voir son effet. --> <!-- <div id = "linkitem" Class = « item »> <XSL:si test = "string-length($SafeImageUrl) != 0"> <div class = « image-zone-left »> <a href = "{$SafeLinkUrl}" cible = "{$LinkTarget}"> <IMG class = "image-fixed-width" SRC = "{$SafeImageUrl}"
Alt = "{@ImageUrlAltText}"/> </un> </Div> </XSL:Si> <div class = « lien-item »> <XSL:appel-modèle
Name="OuterTemplate.CallPresenceStatusIconTemplate"/> <a href = "{$SafeLinkUrl}"
cible = "{$LinkTarget}" titre = "{@LinkToolTip}"> <XSL:de la valeur select = « $DisXSLyTitle » /> </un> <div class = « description »> <XSL:valeur-de select="@Description" /> </Div> </Div> </Div>
--> </TR> <!-- Émettre la fermeture balise de tableau. Si nous ne sommes pas sur la dernière rangée, ce sera vide. --> <XSL:de la valeur Sélectionnez="$tableEnd" disable-output-escaping="Oui"/> </XSL:modèle> <XSL:modèle nom="FormatCurrency"> <XSL:Param nom="valeur" Sélectionnez="0" /> <XSL:de la valeur Sélectionnez='format-nombre($valeur, $DDD",DDD,DDD.DD", « personnel »)' /> </XSL:modèle>

Écrans de saisie des données standard WSS/MOSS ne supportent pas la chute en cascade-downs (ou autre intra-communication)

MISE À JOUR (04/2008): Cet excellent blog montre une approche bien javascript basé à ce problème: http://webborg.blogspot.com/2008/04/add-functions-and-events-to-sharepoint.html

MISE À JOUR II: (04/2008): Cette entrée de blog est prometteuse ainsi: http://www.cleverworkarounds.com/2008/03/13/free-mosswss-2007-web-part-hide-controls-via-javascript/

Plusieurs fois par semaine, Si pas quotidiennement, Forum des utilisateurs décrivent une exigence qui serait normalement atteint via les listes déroulantes en cascade. Par exemple, J'ai deux contrôles déroulants:

  • Liste des États-Unis. États
  • Liste des États-Unis. villes.

En tant que responsables fournisseurs UI, Nous voulons qu'elle fonctionne comme ceci:

  • Paul sélectionne un U.S. État dans le menu déroulant.
  • Cela provoque les villes liste déroulante pour filtrer uniquement les villes qui appartiennent à l'état sélectionné.
  • Paul choisit une ville dans cette liste filtrée.

Il n'y a aucun soutien d'out-of-the-box pour cette fonctionnalité. En fait, Il n'y a aucun soutien OOB pour tout type de communication intra-forme directe. Cela inclut par programme masquage/activation/désactivation des champs en réponse aux changements de champ ailleurs sur le formulaire.

Le véritable objectif de cet article à pour décrire les solutions possibles et ce sont les options que je les connais:

  1. Développer un type de colonne personnalisé. En tant que coutume-colonne-développeur, vous avez un contrôle total sur le monde"" Cette colonne personnalisée. Vous pouvez implémenter une cascade vers le bas comme ça.
  2. Envisagez d'utiliser des flux de travail. Dans certains cas, vous voulez assigner automatiquement une valeur au champ basé sur valeur d'un autre champ. Dans ce cas, normalement, vous essayeriez d'utiliser une colonne calculée, mais certaines fois, il ne sera pas juste faire le travail. Flux de travail SharePoint Designer est une alternative relativement facile administrer à descendre dans le code et visual studio. Si vous suivez cette voie, être au courant de la question traitée par Cet article (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
  3. Les gestionnaires d'événements: Comme le flux de travail, Il s'agit d'une solution après le fait. Votre gestionnaire d'événements est un assembly .NET (C#, VB.NET) transmet le contrôle à laquelle SharePoint. L'objet que vous développez a accès aux données de la liste (et le modèle d'objet complet) et peut faire n'importe quel calcul nécessaire.
  4. Utiliser SharePoint Designer pour créer des formulaires d'inscription personnalisés. Je n'ai pas l'expérience directe avec cette approche, but I hear they are doing good things with NewForm.aspx these days 🙂
  5. Rouler votre propre fonction d'entrée de données ASP.NET (comme une page web autonome ou un composant WebPart) et utiliser à la place.

Si quelqu'un sait options autres et/ou mieux, s'il vous plaît poster un commentaire et je vais mettre à jour le corps de ce post.

<fin />

Tags Technorati:

Oui/non (case à cocher) filtrage dans WebPart requête de contenu

Pour filtrer une requête pour l'Oui/aucune case à cocher n'intitulée « PG jalon », configurer CQWP comme ceci:

image

C'est un autre de ces questions évidentes-une fois-vous-savez-it, mais hard-to-find-an-answer-to: Comment filtrer sur un Oui/aucune case à cocher utiliser le composant WebPart requête de contenu.

Le premier résultat de la recherche J'ai trouver en utilisant le mot-clé "composant WebPart requête de contenu oui/non de filtre" est faux plat, alors j'ai pensé que je pourrais mettre cela là-haut et voir si elle peut remplacer le résultat incorrect dans les résultats de la recherche typique.

Il est assez facile: Vrai valeurs = "1" et des valeurs erronées n'égalent pas "1" (jolie rétro, en fait).

Dans l'exemple ci-dessus, J'ai créé la colonne de site de type oui/non" (case à cocher)" nommée « PG Milestone ». Je l'ai ajouté à une bibliothèque de doc, téléchargé quelques documents, définir la valeur pour un couple et l'ai testé.

<fin />

Créer des graphiques à barres dans SharePoint

Vue d'ensemble:

(MISE À JOUR 12/04/07: Ajouter une autre ressource intéressante à la fin qui relie à un autre blog qui traite de cela via une partie très intéressante de web)

Ce blog décrit comment créer un graphique à barres dans SharePoint. Cela fonctionne dans les environnements fois WSS et MOSS, puisqu'il dépend seulement du composant WebPart Affichage de données.

L'approche globale est la suivante:

  1. Créer une liste ou bibliothèque de documents qui contient les données que vous voulez graphique.
  2. Place de la bibliothèque de documents associés / personnalisé la liste sur une page et de le convertir à un composant WebPart Affichage de données (DVWP).
  3. Modifier XSL de la DVWP pour générer le code HTML qui présente sous forme de graphique.

Scénario d'entreprise / Programme d'installation:

J'ai créé une liste personnalisée avec la colonne de titre standard et une colonne supplémentaire, « Status ». Ce modèles (de manière très simpliste) une « autorisation de dépense" scénario où le titre représente le projet et le statut d'une valeur de la liste des:

  • Proposé
  • Dans le processus
  • Au point mort

L'objectif est de produire un diagramme à barres horizontales interactive qui montre ces codes d'État.

J'ai rempli la liste et il ressemble à ceci:

image

Créer le composant WebPart Affichage de données:

Créer le DVWP en ajoutant la liste personnalisée à une page (page du site dans mon cas) et suivez les instructions ici (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!395.entry).

En plus de créer simplement le DVWP, Nous devons également définir la propriété de pagination pour afficher toutes les lignes disponibles. Pour moi, Cela ressemble à quelque chose comme ça:

image

À ce point, J'ai toujours de fermer SPD et le navigateur. J'ai ensuite ré-ouvrir la page en utilisant le navigateur. Cela évite de déblayage accidentellement jusqu'à la mise en page web part sur la page.

Modifier la transformation XSLT:

Il est maintenant temps de modifier la transformation XSLT.

J'ai toujours utiliser visual studio pour cela. (Voir ici pour une remarque importante sur intellisense qui vous aidera beaucoup).

J'ai créer un projet vide ajouter quatre nouveaux fichiers (remplaçant les mots "Original" et "New" le cas échéant):

  • Original.XSLT
  • New.XSLT
  • Original Params.xml
  • Nouveau Params.xml

Dans mon cas, Il ressemble à ceci:

image

Modifier le composant WebPart, puis copiez les params et XSL à l'Original"" version dans Visual Studio.

L'objectif ici est de provoquer le XSL transformer les résultats que nous revenir de la requête DVWP dans HTML qui est restitué sous un graphe.

À cette fin, Il est utile d'examiner tout d'abord ce que le code HTML devrait ressembler avant que nous ayons confondus par la folie qui est connue comme « XSL ». (Pour être clair, Ceci est simplement un exemple; ne pas taper ou copier/coller dans visual studio. Je fournis un coup complet, point de départ pour que plus tard dans l'écriture). Le graphique suivant est rendu selon le code HTML qui suit immédiatement:

Bar échantillon graphique

HTML correspondant:

<html>
<corps>
<Centre>
<table width = 80 %>
<TR><TD><Centre>Graphique à barres horizontales</TD></TR>
<TR>
<TD align = « center »>
<bordure de table = "1" largeur = 80 %>
<TR>
<TD largeur = 10 %>Ouvert</TD>
<TD><table cellpadding ="0" CellSpacing ="0" border = 0 width = 50 %><TR bgcolor = rouge><TD>&nbsp;</TD></TR></table></TD>
</TR>
<TR>
<TD largeur = 10 %>Fermé</TD>
<TD><table cellpadding ="0" CellSpacing ="0" border = 0 width = 25 %><TR bgcolor = rouge><TD>&nbsp;</TD></TR></table></TD>
</TR>
<TR>
<TD largeur = 10 %>Au point mort</TD>
<TD><table cellpadding ="0" CellSpacing ="0" border = 0 width = 25 %><TR bgcolor = rouge><TD>&nbsp;</TD></TR></table></TD>
</TR>
</table>
</TD>
</TR>
</table>
</corps>
</html>

J'ai utilisé une approche simple pour créer mes barres en définissant la couleur d'arrière-plan d'une ligne « rouge ».

La vente à l'emporter ici est la suivante: En fin de compte, tout ce que nous faisons est création HTML contenant des lignes et des colonnes.

Modèle XSLT:

J'ai copié le XSLT qui génère un graphique à barres horizontal. Il est assez bien donc je n'ajoutera beaucoup ici à l'exception de ces notes a commenté:

  • J'ai commencé avec la valeur par défaut XSL que SharePoint Designer m'a donné quand j'ai d'abord créé le DVWP.
  • J'ai été capable d'abattre du SPD 657 lignes à 166 lignes.
  • Je na pas perdre son temps avec le fichier de paramètres XML (qui est séparé de la XSL et vous saurez ce que je veux dire, quand vous allez à modifier le DVWP lui-même; Il y a deux fichiers, que vous pouvez modifier). Cependant, afin de simplifier, La quasi-totalité d'entre eux a fait retirer de XSL. Cela signifie que si vous voulez faire usage de ces paramètres, vous avez juste besoin d'ajouter leurs définitions variables vers le XSL. Qui ne sera pas facile puisque vous aurez les définitions originales de variable XSL dans votre projet visual studio.
  • Vous devriez être en mesure de copier et coller ce directement dans votre projet visual studio. Puis, enlever mes appels et insérer vos propres appels à « ShowBar ».
  • Le zoom fonctionne en créant un <a href> Comme ça: http://server/List?FilterField1=fieldname&FilterValue1=actualFilterValue. Cette technique peut être utile dans d'autres contextes. Dans un premier temps, J'ai pensé que j'aurais besoin pour se conformer à un format plus complexe: http://server/List/AllItems.aspx?View={guid}&FilterField1=blah&FilterValue1=blah, mais dans mon environnement qui n'est pas nécessaire. URL de la liste est passée à nous par SharePoint, donc c'est assez facile de généraliser.

C'est ici:

<XSL:feuille de style Version="1.0" exclure-résultat-préfixes="RS z o s ddwrt dt msxsl" 
xmlns:msxsl="urn:schemas-microsoft-com:XSLT" xmlns:XSL="http://www.w3.org/ 1999/transformation/XSL"
xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
xmlns:ASP="http://schemas.microsoft.com/ASPNET/20" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
xmlns:o="urn:schemas-microsoft-com:Bureau" xmlns:s="UUID:BDC6E3F0-6DA3-11D1-A2A3-00AA00C14882"
xmlns:DT="UUID:C2F41010-65B3 - 11d 1-A29F-00AA00C14882" xmlns:RS="urn:schemas-microsoft-com:ensemble de lignes" xmlns:z="#RowsetSchema"
xmlns:ddwrt2="urn:FrontPage:interne"
> <XSL:sortie méthode="html" tiret="ne" /> <XSL:format décimal NaN="" /> <XSL:Param nom="ListUrlDir"></XSL:Param> <!-- J'ai besoin de ça pour soutenir une exploration. --> <XSL:modèle match de football="/" xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:__designer=http://schemas.microsoft.com/WebParts/v2/DataView/designer xmlns:ASP="http://schemas.microsoft.com/ASPNET/20"
> <XSL:variable nom="dvt_StyleName">Table</XSL:variable> <XSL:variable nom="Lignes" Sélectionnez="/dsQueryResponse/lignes/en rangée" /> <XSL:variable nom="dvt_RowCount" Sélectionnez="comte($Lignes)" /> <XSL:variable nom="IsEmpty" Sélectionnez="$dvt_RowCount = 0" /> <XSL:variable nom="dvt_IsEmpty" Sélectionnez="$dvt_RowCount = 0" /> <XSL:choisir> <XSL:Lorsque test="$dvt_IsEmpty"> Il n'y a pas de données au graphique!<br/> </XSL:Lorsque> <XSL:autrement> <!-- Les trucs intéressants commence ici. Nous devons définir une paire de variables pour chaque ligne dans le graphique: nombre total d'éléments et pourcentage du total. --> <XSL:variable nom="totalProposed" Sélectionnez="comte(/dsQueryResponse/lignes/en rangée[Normalize-space(@Status) = « Proposée »])" /> <XSL:variable nom="percentProposed" Sélectionnez="$totalProposed div $dvt_RowCount" /> <XSL:variable nom="totalInProcess" Sélectionnez="comte(/dsQueryResponse/lignes/en rangée[Normalize-space(@Status) = "Dans le processus"])" /> <XSL:variable nom="percentInProcess" Sélectionnez="$totalInProcess div $dvt_RowCount" /> <XSL:variable nom="totalStalled" Sélectionnez="comte(/dsQueryResponse/lignes/en rangée[Normalize-space(@Status) = « Calé »])" /> <XSL:variable nom="percentStalled" Sélectionnez="$totalStalled div $dvt_RowCount" /> <!-- Nous définissons notre table HTML ici. Je suis empruntant certains styles SharePoint standards ici pour la rendre cohérente. Je pense qu'il honorera les modifications dans le fichier css global ainsi que le thème substitue. --> <table Largeur="100%" CellSpacing="0" CellPadding="2" style="border-right: 1 #C0C0C0 solides; border-bottom: 1 #C0C0C0 solides; border-left-style: solide; border-left-width: 1; border-top-style: solide; border-top-width: 1;"> <TR> <TD aligner="Centre"> <table frontière="1" Largeur="100%"> <!-- Pour chaque situation que nous voulons graphique, Nous appelons le « ShowBar" modèle. Nous passons il: 1. Une étiquette pour la ligne. C'est transformé en un lien hypertexte. 2. Le pour cent (variable d'en haut). 3. Le véritable nom du champ du code de la liste sous-jacente. Cela ne doit pas nécessaire correspondre à l'étiquette d'affichage. 4. Valeur de champ correspondant pour #3. 5. Total des Articles de ce code d'État (pas le total de tous les codes d'État). Il émet une <TR></TR> et la ligne du diagramme à barres horizontales. Nous appelons ce modèle pour chaque code d'État que nous voulez afficher. --> <XSL:appel-modèle nom="ShowBar"> <XSL:avec-param nom="BarDisplayLabel" Sélectionnez="« Proposée »"/> <XSL:avec-param nom="BarPercent" Sélectionnez="$percentProposed"/> <XSL:avec-param nom="QueryFilterFieldName" Sélectionnez="« Statut »"/> <XSL:avec-param nom="QueryFilterFieldValue" Sélectionnez="« Proposée »"/> <XSL:avec-param nom="TotalItems" Sélectionnez="$totalProposed"></XSL:avec-param> </XSL:appel-modèle> <XSL:appel-modèle nom="ShowBar"> <XSL:avec-param nom="BarDisplayLabel" Sélectionnez="« Au point mort »"/> <XSL:avec-param nom="BarPercent" Sélectionnez="$percentStalled"/> <XSL:avec-param nom="QueryFilterFieldName" Sélectionnez="« Statut »"/> <XSL:avec-param nom="QueryFilterFieldValue" Sélectionnez="« Au point mort »"/> <XSL:avec-param nom="TotalItems" Sélectionnez="$totalStalled"></XSL:avec-param> </XSL:appel-modèle> <XSL:appel-modèle nom="ShowBar"> <XSL:avec-param nom="BarDisplayLabel" Sélectionnez=""Dans le processus""/> <XSL:avec-param nom="BarPercent" Sélectionnez="$percentInProcess"/> <XSL:avec-param nom="QueryFilterFieldName" Sélectionnez="« Statut »"/> <XSL:avec-param nom="QueryFilterFieldValue" Sélectionnez=""Dans le processus""/> <XSL:avec-param nom="TotalItems" Sélectionnez="$totalInProcess"></XSL:avec-param> </XSL:appel-modèle> </table> </TD> </TR> </table> </XSL:autrement> </XSL:choisir> </XSL:modèle> <!-- Ce modèle effectue le travail d'affichage des lignes individuelles dans le graphique à barres. Vous ferez probablement la plupart de vos peaufinage ici. --> <XSL:modèle nom="ShowBar"> <XSL:Param nom="BarDisplayLabel" /> <!-- étiquette pour montrer --> <XSL:Param nom="BarPercent"/> <!-- Pourcentage du total. --> <XSL:Param nom="QueryFilterFieldName"/> <!-- Utilisé pour accéder à la requête & filtre --> <XSL:Param nom="QueryFilterFieldValue"/> <!-- Utilisé pour accéder à la requête & filtre --> <XSL:Param nom="TotalItems" /> <!-- nombre total d'appels cette barlabel --> <TR> <!-- La barre de l'étiquette elle-même. --> <TD classe="MS-formbody" Largeur="30%"> <!-- Cette prochaine série de déclarations génère une chaîne de requête qui nous permet d'explorer une vue filtrée des données sous-jacentes. Nous faisons usage de quelques petites choses ici: 1. Nous pouvons passer FilterField1 et FilterValue1 à une liste pour filtrer sur une colonne. 2. SharePoint est en passant un paramètre clé pour nous, ListUrlDir qui pointe vers la liste sous-jacente contre laquelle cette DVWP est « running ». N'est pas amusant XSL? --> <XSL:texte disable-output-escaping="Oui"> <![CDATA[<a href ="]]></XSL:texte> <XSL:de la valeur Sélectionnez="$ListUrlDir"/> <XSL:texte disable-output-escaping="Oui"><![CDATA[?FilterField1 =]]></XSL:texte> <XSL:de la valeur Sélectionnez="$QueryFilterFieldName"/> <XSL:texte disable-output-escaping="Oui"><![CDATA[&FilterValue1 =]]></XSL:texte> <XSL:de la valeur Sélectionnez="$QueryFilterFieldValue"/> <XSL:texte disable-output-escaping="Oui"><![CDATA[">]]></XSL:texte> <XSL:de la valeur Sélectionnez="$BarDisplayLabel"/> <XSL:texte disable-output-escaping="Oui"><![CDATA[</un>]]></XSL:texte> <!-- Le bit suivant montre quelques chiffres au format: "(total / % du total)" --> (<XSL:de la valeur Sélectionnez="$TotalItems"/> / <!-- Cela crée une étiquette de pourcentage sympa pour nous. Merci, Microsoft! --> <XSL:appel-modèle nom="PercentFormat"> <XSL:avec-param nom="pour cent" Sélectionnez="$BarPercent"/> </XSL:appel-modèle>) </TD> <!-- Enfin, émettre un <TD> balise pour la barre elle-même.--> <TD> <table CellPadding="0" CellSpacing="0" frontière="0" Largeur="{tour($BarPercent * 100)+1}%"> <TR bgcolor="rouge"> <XSL:texte disable-output-escaping="Oui"><![CDATA[&nbsp;]]></XSL:texte> </TR> </table> </TD> </TR> </XSL:modèle> <!-- Cela est pris directement à partir de quelques XSL, j'ai trouvé dans un modèle MS. --> <XSL:modèle nom="PercentFormat"> <XSL:Param nom="pour cent"/> <XSL:choisir> <XSL:Lorsque test="format-nombre($pour cent, '#,##0%;-#,##0%')= « NaN »">0%</XSL:Lorsque> <XSL:autrement> <XSL:de la valeur Sélectionnez="format-nombre($pour cent, '#,##0%;-#,##0%')" /> </XSL:autrement> </XSL:choisir> </XSL:modèle> </XSL:feuille de style>

Les résultats:

Le XSL ci-dessus génère ce graphique:

image

Explorer les données sous-jacentes en cliquant sur le code d'État:

image

Pensées finales:

Ceci peut être généralisé?

J'adore ce concept graphique, mais je déteste le fait que j'ai d'aller faire autant-codage à la main. J'ai donné un peu de réflexion pour savoir si elle peut être généralisée et je suis optimiste, mais je suis aussi un peu peur qu'il peut y avoir un mur de briques quelque part le long de la voie qui n'offre aucune solution de contournement. Si quelqu'un a quelques bonnes idées sur ce, Veuillez prendre note dans les commentaires ou Ecrivez-moi.

Graphes verticales:

Il s'agit d'un diagramme à barres horizontales. Il est certainement possible créer un graphique vertical. Nous avons juste besoin de modifier le code HTML. Je voudrais commencer de la même manière: Créer une représentation HTML d'un graphique à barres vertical et puis trouver un moyen d'obtenir que la via XSL. Si quelqu'un est intéressé par ce, Je pourrais être persuadé de l'essayer et travailler sur the kinks. Si quelqu'un a déjà fait, s'il vous plaît laissez-moi savoir et je vais créer un lien avec plaisir sur votre blog 🙂

Je pense que le défi avec un graphique vertical est que les étiquettes du graphique sont plus difficiles à gérer, mais certainement pas impossible.

Du champ nom Gotcha:

Il y a au moins deux choses à regarder dehors pour vos noms de domaine.

Première, un nom de domaine avec un espace doit être échappé dans le XSL. Ce sera probablement une question ici:

        <XSL:variable nom="totalProposed" 
Sélectionnez="comte(/dsQueryResponse/lignes/en rangée[Normalize-space(@Status) = « Proposée »])" />

Si votre statut"" colonne est en fait nommé "Code d'État" ensuite vous devez le référencer comme « Status_x0020_Code »:

   <XSL:variable nom="totalProposed" 
Sélectionnez="comte(/dsQueryResponse/lignes/en rangée[Normalize-space(@Status_x0020_Code) = « Proposée »])" />

Seconde, et je suis un peu floue sur ce, mais il faut aussi être sur le qui-vive pour les changements de nom de domaine. Si vous nommez votre champ "Code d'État" et puis plus tard sur, Renommez-le en « AFE Status », le nom"interne" ne change pas. Le nom interne sera toujours "Code d'État" et doit être référencé comme « Status_x0020_Code ». Les « autres ressources" liens peuvent aider à diagnostiquer et corriger ce genre de problème.

Sur cette couleur:

J'ai choisi "rouge" parce que c'est agréable à moi en ce moment. Il ne serait pas une grosse affaire pour montrer les différentes couleurs afin de fournir plus qu'une description visuelle d'un certain nombre, mais aussi fournir un indicateur de performance clé utile. Par exemple, Si le pourcentage de "calé" L'AFE est > 10% alors montrez-le rouge, dans le cas contraire le montrer en noir. Utilisation <XSL:choisir> pour y parvenir.

Autres ressources:

Transformer heureux!

<fin />

S'abonner à mon blog!

SharePoint ne fournit pas “Qui a accès” Rapports

MISE À JOUR 01/28/08: Ce projet codeplex aborde cette question: http://www.codeplex.com/AccessChecker. Je le n'ai pas utilisé, mais il semble prometteur, il s'agit d'une question, que vous avez besoin de l'adresse dans votre environnement.

MISE À JOUR 11/13/08: Joel Oleson a écrit un très bon poste sur la plus grande sécurité gestion question ici: http://www.sharepointjoel.com/lists/posts/post.aspx?Liste = 0cd1a63d % 2D183c % 2D4fc2 % 2 D 8320 % 2Dba5369008acb&ID = 113. Liens vers un certain nombre d'autres ressources utiles.

Les clients et les utilisateurs du forum demandent souvent une question dans ce sens: "Comment générer une liste de tous les utilisateurs ayant accès à un site" ou "Comment peux j'ai alerter automatiquement tous les utilisateurs ayant accès à la liste sur les modifications apportées à la liste?"

Il n'y a aucune sortie de la solution de la boîte pour cela. Si vous y réfléchissez un instant, Il n'est pas difficile de comprendre pourquoi.

Sécurité de SharePoint est très flexible. Il y a au moins quatre grandes catégories d'utilisateurs:

  • Utilisateurs anonymes.
  • Groupes et des utilisateurs SharePoint.
  • Utilisateurs Active Directory.
  • L'authentification basée sur les formulaires (FBA) utilisateurs.

La flexibilité signifie que dans une perspective de sécurité, n'importe quel site SharePoint donné sera très différent de l'autre. Afin de générer un rapport de liste d'accès, On a besoin déterminer comment le site est sécurisé, interroger plusieurs référentiels de profil utilisateur différent et présentez-le ensuite de manière utile. C'est un problème difficile à résoudre de manière générique.

Comment les organisations sont face à cela? Je serais ravi de vous entendre dans les commentaires ou Messagerie.

</fin>

MOSS raconte moi mon nom de colonne est réservé ou en cours d'utilisation … Mais ce n'est pas

MISE À JOUR 12/04/07: Voir Cette KB Microsoft (http://support.microsoft.com/kb/923589) Pour plus d'informations.

En fait, Il s'avère que c'est, mais tricksy MOSS devait rendre difficile.

Mon client a fait un travail de développement sur son site MOSS au cours du week-end. C'est un peu un fouillis quant à ce qu'il faisait en fait, mais le résultat final est la suivante:

  • Il tente d'ajouter une colonne de site appelée « quantité" et réponses MOSS: "Le nom de la colonne que vous avez entré est déjà en cours d'utilisation ou réservés. Choisissez un autre nom."
  • Il tente d'ajouter à un autre environnement et qui fonctionne. Donc, « Quantité" n'est pas un nom réservé.
  • Il essaie de trouver une colonne de site existante, appelée « quantité" dans cette collection de sites. Il ne le trouve pas.

J'ai fait quelques recherche, et même une certaine codification, ciré philosophique et finit par trouver qu'une colonne appelée quantité a fait, En fait, Il existe. C'est dans le » _Hidden" Groupe. C'est pourquoi, Nous n'avons trouvé via l'interface utilisateur de SharePoint.

Comment a-t-elle reçu là? Je ne sais pas, mais j'ai une théorie (ou comme ma femme s'appelle, « blah blah blah »). Quelque part le long de la ligne, un fabuleux modèle quarante a été ajouté et probablement activé sur un site à la collection de sites. Il a été ensuite mis hors tension (ou le site supprimé). La colonne de site, Cependant, est resté mais en les » _Hidden" Groupe. Si quelqu'un sait mieux, s'il vous plaît faites le moi savoir par l'intermédiaire Messagerie ou par la poste dans les commentaires.

SharePoint, disait la vérité. C'est à peine utile de préciser que ce message n'est pas aussi utile qu'elle pourrait être. Il serait agréable de voir cette fourche message dans deux messages différents dans le futur: 1) Dire que le nom de colonne est réservé ou il n'est pas. 2) Si elle n'est pas réservée, afficher le site, ou au moins le groupe, où le nom de colonne est déjà utilisé.

</fin>

OM présentent les données Via une liste personnalisée (ou, Encore un autre données OM Displayor [comme YACC, mais différents])

Aujourd'hui, J'ai passé quelques heures à traquer la cause derrière le message "le nom de la colonne que vous avez saisi est déjà utilisé ou réservés. Choisissez un autre nom."

La colonne en question pourrait être créée, supprimé et recréé dans un autre environnement, alors je savais que ce n'était pas un nom réservé. Cependant, Je ne pouvais pas simplement trouver la colonne n'importe où par l'intermédiaire de l'interface utilisateur SharePoint standard à n'importe quel site dans la collection de sites.

J'ai posté à Forums MSDN ici et l'indomptable Andrew Woodward me dirigé dans la direction des données sous-jacentes du modèle objet.

Je suis allé à CodePlex pour trouver des outils qui m'aiderait à scruter les données sous-jacentes des OM et m'aider à localiser le problème.

J'ai essayé plusieurs outils et ils étaient très cool et intéressant, mais en fin de compte, l'interface utilisateur n'était pas assez bon pour mon but. Je ne critique pas eux par tous les moyens, mais clairement les outilleurs n'avais mon problème à l'esprit quand ils ont créé leur interface utilisateur :). La plupart des gens semblent investir passablement de temps et d'efforts dans la création de poste de travail / applications clientes qui offrent des vues de l'arbre, Cliquez sur les menus contextuels, etc.. Ils sont gentils et tous les, mais il y a beaucoup de travail pour créer une expérience utilisateur top-of-the-line qui est aussi très flexible.

J'ai vraiment besoin d'une réponse à ce problème. Il m'est apparu que si je pouvais obtenir toutes les colonnes de site dans la collection de sites dans une liste personnalisée, Je pouvais filtrer, trier et créer des vues qui pourrait m'aider à trouver cette colonne soi-disant existante (laquelle il l'a fait, BTW). J'ai avancé et fait qui et une heure ou deux plus tard, toutes les colonnes de mon site avaient chargé dans une liste personnalisée avec regroupement, tri, etc.. J'ai trouvé ma réponse cinq minutes plus tard.

Si je prends avec succès dans le monde entier, Je pense que j'ai le décret, que tous les fournisseurs d'outils SharePoint doivent envisager sérieusement de surfaçage leurs données de modèle d'objet dans une liste personnalisée. De cette façon, J'ai le pouvoir pour rechercher un chemin que je veux (contraint, Bien sûr, par les fonctionnalités standard de sharepoint).

Action de personnalisée pour le flux de travail SharePoint Designer — Observation sur <FieldBind Designer Type =”StringBuilder” … />

Juste une observation rapide qu'il y a une différence très importante entre ces deux définitions:

<FieldBind Field = "InParam1" DesignerType = "StringBuilder" ID = "2" Text = « Paramètre d'entrée # 1 » />

par rapport à:

<FieldBind Field = "InParam1" ID = "2" Text = « Paramètre d'entrée # 1 » />

La première montre comme ça dans le SPD:

image

alors qu'il le montre ce dernier comme ceci:

image

Je ne sais pas comment ces utiles captures d'écran sont mais je mis dans l'effort pour les faire de sorte que vous devez les voir 🙂

L'observation est la suivante: StringBuilder vous permet de créer une chaîne de (de toute évidence) en mélangeant des littéraux de chaîne et les données de flux de travail (via le « ajouter Lookup" bouton dans le coin inférieur gauche). Lorsque vous utilisez le bouton Ajouter Lookup, elle insère un jeton sous la forme"[%jeton %]". Lorsque SharePoint appelle l'action personnalisée, (Code c# dans mon cas), SharePoint passe le jeton lui-même, pas la valeur du jeton. Si vous utilisez le type de concepteur par défaut (le second type), SharePoint étend le jeton et passe le jeton de la valeur réelle de votre action.

StringBuilder = BAD, par défaut le type de concepteur = bonne.

Bien sûr, Ce n'est pas ce que j'ai vraiment. N'essayez et passez un paramètre à votre action personnalisée lorsque le concepteur tapez = StringBuilder. Utilisez le type de concepteur par défaut et la chaîne un StringBuilder pour elle dès le départ si vous avez besoin pour construire des chaînes complexes dans votre flux de travail (qui est d'ailleurs exactement ce qu'on fait pour créer un objet dynamique pour l'action de Courriel, mais c'est un sujet pour une autre entrée de blog, har har).

<fin />

Activation de flux de travail prématuré — Une Solution Non médicaux

MISE À JOUR: Voir cette discussion MSDN, surtout la dernière entrée: http://forums.microsoft.com/MSDN/showpost.aspx?postid=2631057&siteid=1. Il décrit une condition qui peut court-circuiter tout cela. En bref, Il peut être aussi simple que de faire au moins un des champs obligatoires.

J'ai une bibliothèque de document qui prend en charge les types de contenu de huit.

J'ai un flux de travail SharePoint Designer qui veut calculer et attribuer une date de rappel"" en soustrayant simplement 30 jours d'une autre colonne, « date d'échéance ». Cela se produit uniquement pour l'un des types de contenu, « Assurance ». L'objectif de l'entreprise est de produire un indicateur de performance clé qui affiche deux catégories de documents d'assurance: « sur le point d'expirer" et "a expiré." (Vous pouvez lire plus sur ce genre de KPI et plus importante forage ici).

J'ai configuré le flux de travail au feu lorsqu'un nouvel élément est créé et lorsqu'un élément est modifié. L'idée est que lorsqu'un document d'assurance est téléchargé, Nous calculons une date de mise en garde »" basé sur la date d'expiration. Une paire de vues travailler dans le cadre d'une liste de KPI pour mettre en évidence ces conditions lorsque les utilisateurs a frappé leur page d'accueil.

Cette stratégie ne fonctionne pas lorsque je télécharger un document.

J'ai télécharger le document et je suis présenté à l'écran de saisie de données meta. À ce point, Je suis déjà dans le pétrin. SharePoint a déjà, prématurément, de mon point de vue, tiré du flux de travail. Je n'ai pas eu la chance de choisir le type de contenu correct, ni attribuer une date d'échéance. En même temps, le flux de travail ne se déclenche pas lorsque j'ai touché le bouton soumettre en ce moment. Il y a une logique intégrée qui « croit" qui d'abord soumettre fait partie de la « créer" événement. Si … mon workflow a tiré et lorsqu'il est exécuté, Il a été adopté des valeurs par défaut de données meta.

La contourner meilleur à ma connaissance est d'insérer une "pause jusqu'en" activité du workflow. J'ai la pause de flux de travail pour 1 minute. Alors que c'est une pause, Sélectionner le type de contenu correct, Entrez les données méta et soumettre. La pause se termine et le flux de travail procède au besoin. (Notez que dans mon environnement, activités de flux de travail du minuteur du SPD ne fonctionnent pas out of the box. Vous pouvez avoir le même ennui. Voir ici Pour plus de détails).

Je n'aime pas "retard magique" solution de contournement. Que se passe-t-il si l'utilisateur télécharge un document et le téléphone sonne et la conversation qui s'ensuivie survit à la pause? Je peux faire la pause plus longue, mais je reste ne l'aime.

J'ai écrit à ce sujet sur les forums MSDN ici: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2430725&SiteID=1