2009-05-18 9 views
10

J'aimerais pouvoir utiliser la date du jour dans une colonne calculée d'une liste SharePoint pour, par exemple, déterminer si une tâche est en retard. Il y a une astuce bien documentée qui consiste à créer une colonne factices nommée "Aujourd'hui", à l'utiliser dans une formule, puis à la supprimer, ce qui "pousse" SharePoint à utiliser la fonction Aujourd'hui.Une solution au problème de colonnes calculées aujourd'hui est-elle SharePoint?

Le problème est que cette méthode ne fonctionne pas de manière fiable - le calcul n'est pas dynamique; il est seulement fait quand l'article est sauvé, et par conséquent la «colonne» Aujourd'hui devient effectivement la date modifiée. (C'est probablement pourquoi SharePoint ne vous permet pas d'utiliser la fonction Today de manière directe.)

Quelqu'un a-t-il trouvé une solution qui fonctionne? Je sais que je peux utiliser javascript pour obtenir la date réelle du côté client et afficher les couleurs, les drapeaux, peu importe, mais je suis à la recherche d'une solution «côté serveur».


Pour référence, l'astuce de colonne aujourd'hui et ses problèmes sont décrits assez bien à ces deux postes et commentaires associés: http://blogs.msdn.com/cjohnson/archive/2006/03/16/552314.aspx et http://pathtosharepoint.wordpress.com/2008/08/14/calculated-columns-the-useless-today-trick/

Répondre

4

Il n'y a tout simplement pas de solution pour cela. Comme les valeurs de la liste sont stockées dans la base de données et renvoyées "telles quelles" à d'autres entités telles que le moteur de recherche, un champ dynamique ne peut pas être créé.

Il est possible de créer un champ personnalisé qui afficher la valeur en utilisant la date d'aujourd'hui dans son calcul.

+0

Si les futurs lecteurs envisagent de codage aujourd'hui colonne calculée, vous peut souhaiter lire sur mes expériences d'essayer de faire exactement cela: http://blog.pentalogic.net/2011/08/how-not-to-develop-a-sharepointtoday-calculated-column/ –

0

Mon conseil est de créer votre sur le champ qui fait ce calcul pour vous et ensuite référencer dans votre liste SharePoint. Pas une implémentation simple mais ça marcherait.

0

Je cherchais une solution non plus, toujours pas de chance ... L'astuce de la colonne Aujourd'hui a la limitation de ne pas être dynamique.

J'ai cependant une suggestion, pourquoi ne pas créer un travail de minuterie qui mettra à jour une certaine colonne avec la date actuelle tous les jours à 12 heures. Je sais que certains d'entre vous pourraient tous penser que c'est un problème. Juste ma suggestion: D !!

0

Je suis arrivé avec une solution très approximative, mais fonctionnante à ce problème sans avoir à faire de codage. Je vais vous expliquer à la fois comment j'ai fait la colonne aujourd'hui et comment j'ai travaillé dans une colonne en retard, parce que cette colonne était une douleur pour savoir comment faire aussi bien.

D'abord, j'ai fait une colonne nommée "aujourd'hui" (gasp!). Ensuite j'ai fait une colonne nommée "Days Overdue". J'ai ensuite ouvert le concepteur de sharepoint et créé un nouveau flux de travail. Je l'ai configuré pour être exécuté chaque fois qu'un article est édité/mis à jour (gardez à l'esprit que j'ai désactivé le versioning pour cette liste, sinon j'aurais dû recourir au codage pour éviter toute accumulation de données inutiles sur notre serveur). J'ai défini les actions pour stocker simplement la date modifiée dans une variable de flux de travail, puis modifier la valeur de la colonne Today pour cette variable. Bien que la colonne modifiée soit une date/heure et que ma colonne d'aujourd'hui ne soit qu'une date, elle est très bien transférée. J'ai ensuite mis le flux de travail à une pause de 2 heures. Vous pouvez définir cette option sur la durée que vous souhaitez. Elle changera simplement la dernière heure possible pour la mise à jour de votre colonne actuelle, c'est-à-dire 2 heures dans mon cas.

sur la colonne des jours en retard. c'est le code pour ce type -

=IF([Due Date]>Today,"None",IF([Date Closed]=0,Today-[Due Date],IF([Due Date]>[Date Closed],"None",IF(Today>=[Date Closed],[Date Closed]-[Due Date],IF([Due Date]<Today,Today-[Due Date]))))) 

Cela montre les jours de retard sous forme de nombre de jours, ou si son pas en retard, il montre « Aucun ».Vous pouvez utiliser un format numérique ou un format de chaîne, mais PAS un format de date. Bien, j'espère que ceci aide n'importe qui qui se heurte à ce problème et ne veut pas avoir à plonger dans le codage.

EDIT: J'ai oublié de dire que dans le code ci-dessus pour la colonne jours en retard, je mets que si aujourd'hui est passé la date fermée, utiliser la date fermée moins la date d'échéance au lieu de assurez-vous que le calcul ne se poursuit pas après la fermeture d'un article. vous auriez probablement remarqué cela dans le code, mais je pensais que je devrais le signaler juste au cas où.

EDIT 2: Le code que j'avais avant ma deuxième modification pour ma colonne calculée n'a pas calculé correctement les jours en retard après qu'un problème ait été marqué "fermé". J'ai mis dans le code mis à jour. La dernière partie du code n'a pas de sens, car c'est la même logique que le début, mais ça a marché donc je n'ai pas voulu prendre de risques! :)

Paix.

+0

Comment serait cette mise à jour ' Jours en retard 'si l'article n'a pas été modifié depuis, disons une semaine? Est-ce que je manque quelque chose? – Ryan

+0

mon mauvais, j'ai mis le flux de travail pour modifier une colonne factice après avoir attendu les 2 heures, se rallumant ainsi de nouveau. –

+0

Ceci est un peu vieux, mais pourriez-vous me donner une étape par étape pour cette partie: "Je définis les actions pour stocker simplement la date modifiée dans une variable de flux de travail, puis changer la valeur de la colonne aujourd'hui à cette variable. la colonne modifiée est une date/heure et ma colonne d'aujourd'hui est juste une date, elle est très bien transférée, puis je mets le flux de travail en pause pendant 2 heures, vous pouvez régler cela sur le temps que vous voulez. le dernier moment possible pour mettre à jour votre colonne aujourd'hui, c'est-à-dire 2 heures dans mon cas. " – tehman

4

En plus de l'article de Christophe (le PathToSharePoint), ce couvre également l'affaire aujourd'hui et pourquoi il ne fonctionne pas

The Truth about using Today in calculated columns

Il y a un certain nombre de fondants, probablement le meilleur est la console de Dessie app (mentionné ci-dessus par MNM)

Dynamically updating a SharePoint calculated column containing a Today reference

son bon mais ne est pas parfait, par exemple, vous pourriez avoir à vous soucier de différents fuseaux horaires. Avant de descendre cette route, vous devriez vous demander si vous avez vraiment, vraiment besoin de le faire. Par exemple: -

  • Si vous voulez un countdown (days overdue/days left to complete a task) vous pouvez utiliser SPD et une partie web de données XLST Voir

  • Si vous voulez une vue pour afficher les éléments en retard ou des objets créés dans les X derniers jours ec alors vous pouvez utiliser [aujourd'hui] dans un filtre de vues 2

-1

Voici une solution de contournement:

Créer une colonne de date appelée aujourd'hui. Utilisez cette colonne dans votre formule calculée (ignorez le fait que la formule renvoie une valeur incorrecte). Une fois que vous avez terminé avec la formule, supprimez la colonne Aujourd'hui de votre liste.

Pour une raison quelconque, cela fonctionne de cette façon! Nowpoint traite le Today dans votre formule comme la date d'aujourd'hui.

Remarque: Si vous décidez de modifier la formule, vous devez créer à nouveau la colonne Aujourd'hui. Sinon, il ne reconnaîtra pas Today comme une colonne valide.

-1

J'ai essayé @ Farzad approche et il semble fonctionner parfaitement. Je voulais faire un compte personnalisé sur Jours Écoulé donc ajouté une colonne calculée qui, auparavant, j'utilisais une différence entre les Date de création et Date de modification Colonnes, qui n'a été montrant chaque fois qu'un utilisateur mis à jour le poste, beaucoup à mon grand désarroi.

J'ai maintenant une formule qui fonctionne comme je le voudrais et utilise la colonne Today, et il est ici pour tous ceux qui voudraient l'utiliser. J'ai également une colonne Statut sur la base de laquelle une base de En attente est utilisée, et la formule restante sont basées sur la différence de date de Aujourd'hui - Créé.

=IF(Status="On Hold","On Hold",IF(AND(Today=Created,(DATEDIF(Created,Today,"D")=0)),"New",IF(AND(Today<>Created,(DATEDIF(Created,Today,"D")=0)),"New (updated)",IF(DATEDIF(Created,Today,"d")>3,"Need Update Immediately",IF(DATEDIF(Created,Today,"d")=1,"One day old",IF(DATEDIF(Created,Today,"d")=2,"Two days old","")))))) 

Fondamentalement juste un tas de emboîtées IF conditions qui me reçoivent des étiquettes sur la base desquelles je peux ajouter un groupe à mon avis et filtrer les données en cas de besoin. J'espère que cela aidera tous ceux qui cherchent une réponse!

1

Si vous créez une colonne Aujourd'hui, elle doit être mise à jour. Vous pouvez le faire avec un travail de minuteur ou en plaçant un script jquery sur une page qui est touchée par l'utilisateur. Le script peut appeler SPServices.SPUpdateMultipleListItems pour effectuer la mise à jour. Passez une clause CAML afin de ne mettre à jour que les éléments de la liste où la valeur Today doit être mise à jour, par ex. une fois par jour.

+0

Je suggère de créer un programme de traitement par lots pour y parvenir, laissez-le s'exécuter quotidiennement et le programme ne mettra à jour que la date qui n'est pas égale à la date du jour. Mais j'aimerais voir l'exemple de script que vous mentionnez. Merci d'avance. – mutanic

0

J'ai utilisé ce qui suit et n'ai eu aucun problème.

Nom du champ: Overdue

Type de champ: calculé

Type de données Retourné: Oui/Non

Formule: =AND([Due Date]<NOW(),Status<>"Completed",[Due Date]<>"")

+0

Cela fonctionne très bien, merci. – Renan

+0

Ne fonctionne pas - ne mettra à jour que si l'enregistrement est mis à jour. Vérifiez encore demain et vous verrez. – Ryan