コードなしのソリューション:SharePoint のリスト アイテムの最終更新日以降の日数の表示

コードなしのソリューション:SharePoint のリスト アイテムの最終更新日以降の日数の表示

重要:  この記事は機械翻訳されています。機械翻訳についての「免責事項」をお読みください。この記事の英語版を参照するには、ここをクリックしてください。

9/20/2011 3:01 PM

作成者: Justin Joyce、LANtek

注: この記事は、SharePoint のエンド ユーザーを対象とする Get the Point ブログ (英語) で 4 年間にわたって集めた投稿の一部です。

概要:コードを使用しないカスタム エージング レポート

SharePoint サイトでよく要求される機能部分の 1 つは、タスクまたはリスト アイテムのいずれかのエージング レポートです。つまり、リスト アイテムの最終更新日以降どれだけの日数または月数が経過したかということです。

この問題は表面的には非常に単純に見えます。結局、アイテムの作成日および修正日があり、イベント レシーバーを介してアイテムに特定の変更が行われたときそのカスタム日付を格納する機能があります。Excel のような数式を含めて情報に対して動作させることができる、計算列があります。これは、非常に簡単な問題のように見えます。日付フィールドを選択し、計算列を作成し、[DateField] – [Today] に似た数式の計算を行うことです。でも、そんなに簡単にはいきません。この “単純な” 作業を行ったことがあるすべてのユーザーがおわかりのように、計算列に [Today] のようなものを使用しようとすると問題が発生します。計算列の数式ボックスに [Today ] を挿入すると、次のようなエラー メッセージが表示されます。

エラー メッセージ

これはなぜなのでしょうか?これは、計算列の計算方法と関係します。

簡単な式を例にしてみましょう。

= IF( [Column1]<=[Column2], "OK", "Not OK")

これは単純に Column1 が Column2 以下の場合は OK と表示し、それ以外の場合は Not OK と表示するものです。これは計算列のかなり一般的な基本数式で、これらの列を含むリスト アイテムの基本的な前提条件です。リスト アイテムに対して更新イベントがない限り、Column1 と Column2 の値は変更できません。

計算する情報は、アイテム自体に含まれていると想定されているので、当然、計算列はリストの更新時 (または作成時) にしか再計算されません。これは、今日の日付など、アイテムのフィールドとは別に変更されるものを使用しようとするときに問題を起こします。

私は計算列がどのように動作するのかを決定する会議には出席していませんでした。ただし、経験に基づいて推測するのであれば、パフォーマンス上の理由からこのように動作させているのだと推定します。“ライブ” 更新が必要な計算列をそれぞれが含む、数千のアイテム リストがあることを想像してください。これでは、タイマー ジョブなどの何らかのメカニズムが、その計算列を含む各アイテムに対して繰り返し頻繁に実行され、その値を更新します。これでは、大規模な展開の場合、ジョブが常に実行され何らかの変更を行っているため、パフォーマンスに非常に大きな負荷がかかります。これが私の推測ですが、考えてみればかなり筋が通っていると言えるのではないでしょうか。

最初に Today という名前の列を作成し、それを数式に追加し、次いで削除して、Today の値を受け入れるように SharePoint をだます同様のソリューションの提案がいくつかあります。これらはすべて問題ありませんが、計算列が更新されることについて私が説明したことを思い出してください。この値は、アイテムの更新時にしか変更されず、これはつまり、値 (特に日にちにの計算) がすぐに不正になることを意味します。

巧妙な JavaScript を使用して、値をページに書き込んでいるユーザーを見たことがあります。これでも機能しますが、私は使用しないで済むのであればクライアント スクリプトは使用しない方がよいと考えています。

実装:

それではどうすればよいのでしょうか。Today 関数などのいわゆる “可変” な関数には、計算列は論外です。計算列、タイマー ジョブ、スケジュール済みの処理などのカスタム コードを開発して、この計算を行う必要のあるすべてのアイテムを完全に更新させることも可能です。その場合、前のパラグラフで触れたパフォーマンスの問題にまた戻ってきてしまい、加え、これは問題のサイト、リスト、列に固有なものとなってしまうため、もろいソリューションでもあります。これらの 2 つの懸念に加え、私などのようなコードを作成できるオタクを見つけてきて、このソリューションを開発してくれるよう説得する必要もあります。しかし、別の簡単な方法もあります。

サイトにフィールドを作成しページを編集する権限があり、XSLT とビューの作成に関する知識が少しある場合、リスト ビューに含めることができる XSL テンプレートを組み合わせて、ページの要求があるたびに値をきちんと計算させることができます。このシナリオはパフォーマンスの懸念をなくし、カスタム コードを開発したり、ソリューションを介して展開する必要がありません。

完璧です。では、これはどのようにすればよいのでしょうか。

  1. ソースとして動作するフィールドを作成または選択します。これは Date 型である必要があります。

  2. 計算する値のプレースホルダーの役割を果たすフィールドを作成します。

  3. これらの 2 つのフィールドをコンテンツ タイプに追加し、そのコンテンツ タイプをリストに追加します。

  4. ソースとプレースホルダー列の両方を含むそのリストのビューを作成します。

  5. XSL テンプレートをスタイル ライブラリにアップロードします。

  6. UI を使用してリスト ビュー Web パーツの “XSL Link” プロパティを設定します。

  7. 成功です。

ユース ケース例と実装を確認してみましょう。特定のリスト アイテムがどれくらいの期間、その状態に置かれていかがわかるメイン リストがほしいというお客様がいます。このリストには、Item 型から派生しリストに追加されたカスタム サイト コンテンツ タイプが含まれていました。リスト アイテムの状態フィールドが変更されたり保存されたりするたびに、その日付を “Date Status Changed” という列にキャプチャするイベント レシーバーが既にありました。このすべての配線は必要ではなく、任意の日付フィールドを使って行うことができます (たまたまこのように実装しただけですが自由に試してみてください)。リストに最低限追加する必要があるのは、ソース日付フィールドと計算式を保持するプレース ホルダー フィールドです (詳細については次のパラグラフを参照)。ただし、このソリューションをサイトの他の場所で再利用したい場合には、サイト列とサイト コンテンツ タイプを使用することをお勧めします。

したがって、今日の日付に対して使用できるソース日付が計算にあるわけです。これで、計算値のコンテナーとして使用できるカスタム サイト列を作成できます。この場合、ユーザーにこの列に任意の値を入れてほしくないので、新しいまたはアイテム編集フォームでは変更できない、しかしビューに表示するために選択することはできる計算列を使用することを選択しました。ビューに表示されないなど理由がわからなくなる可能性があります。

これでサイト列があるので、リストで使用するコンテンツ タイプに追加できます。次に、XSLT で後でカスタマイズするビューを作成する必要があります。ソース日付列と計算値のプレースホルダーとして機能する新しい計算列を含む標準のビューは必ず作成してください。

これでカスタム エイジング レポートをサポートするために必要なすべての準備が整いました。後は、XSL テンプレートを作成し、それをサイトのスタイル ライブラリにアップロードし、リスト ビューにリンクを行うのみです。使用する XSL テンプレートは、SharePoint で生成されるビューを生成するいくつかの標準のマークアップと、その一部をオーバーライドして希望する値を計算してくれる独自のカスタム マークアップを含むことになります。

クレジット_カードの与信が期限出典、このソリューションを使っていますが、実際の計算を行うための XSL テンプレート丁重から提供された MSDN フォーラムでは、"swirch":
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

次の場所から、私が作成した XSL スタイル シート (aging.zip) をダウンロードしてください。
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9! 104

これをお好みのテキスト エディタで開くと、ビューをレンダリングするための標準の SharePoint XSL マークアップが多数確認できます。357 行目までスクロールダウンすると、マークアップに追加したカスタム テンプレートの始まりを確認できます。最初のものは、“DateDiff” テンプレート、次いで順に “calculate-julian-day” と “FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status” です。これらの 3 つのテンプレートにより、ビューで計算を実行して表示できます。この記事の前半で指定したのとは別のフィールド名を使用する場合、これらのテンプレートを調べて、その別の名前にすべての参照を置き換える必要があります。この場合、フィールドの表示名ではない内部名を使用してください。

テンプレートの準備ができたら、スタイル ライブラリに移動し、“XSL Style Sheets” フォルダーにアップロードし、ファイルにリンクをコピーします。これにより、後で楽に変更したり、お好みでサイトの別の部分に追加することができます。

次いで、リストに移動し、この記事で既に作成したビューを選択します。[サイトの操作] メニューの [ページの編集] をクリックします。

[サイトの操作] メニューの [ページの編集]

ページでリスト ビュー Web パーツを探し、右上隅の小さい下向き矢印をクリックして、Web パーツ メニューを開きます。このメニューから [Web パーツの編集] を選択します。

[Web パーツ] メニューの [Web パーツの編集] コマンド

これにより、ブラウザー ウィンドウの右側に Web パーツのメニューが表示されます。

[Web パーツ] メニュー

+ をクリックして[その他] セクションを表示し、[XSL リンク] プロパティを見つけます。

[Web パーツ] メニューの [XSL リンク] プロパティ

前にコピーしたスタイル ライブラリ内の XSL ファイルへのリンクを貼り付けます (相対または絶対リンクが可能です)。

貼り付けられた XSL ファイル リンク

[OK] をクリックして変更内容を保存し、ページ上部の [ページ] リボン上の [編集の終了] ボタンをクリックします。

[ページ] タブの [編集の終了] ボタン

すべてが正しく設定されたら、“Days At Status” 列に数値が表示されます。

数値が表示される [状態の日数] 列

最後に、さまざまな日付のいくつかのテスト データがどのように示されるかの例を次に示します。

テスト データが表示されたエイジング レポート

概要​​:

このようにすれば、コードを実装せずに、きちんとフォーマットされた、堅固で、よりよく機能する SharePoint の完全なエージング レポートを作成することができます。これには、ここでのユース ケース以外に可能なアプリケーションがいくつかあります。この種のレポートによくあるもう 1 つのシナリオは、タスクが作成されてからどれくらいの期間がたったか一目でわかるようにするためのタスク リストへの接続です。

最新機能をご利用ください。

--Justin

Justin Joyce、LANtek

コメント

手順の欠落
10/8/2012 3:51 AM
手順に従いましたが、何かが欠落しているようです。XSL はどのようにして使用する日付がわかるのですか? または、特定の日付以降はどのフィールドに追加するのですか? 手順が欠落していると非常に困ります。

コードなしに同意!
8/30/2012 12:12 PM
実際これは "コードなし" ではないというのに同意します。
面白いことに SharePoint でのいくつかの失敗で、Today を使用する、機能する計算列ができました。また同じようには再現できないので、どのようにして、またはなぜかはわかりませんが、それはまだそこにあり機能しています。

"Days At Status" 計算列の数式?
5/2/2012 7:39 AM
Justin さん、"Days At Status" 計算サイト列 (プレースホルダー列) に使用したのはどの数式ですか?それは "=today" でしたか?

SharePoint 2007
2011/12/2 11:29 AM
今のところまだ SharePoint 2007 にこのソリューションを適用してはいませんが、考えています。残念ながら、UI の Web パーツに XslLink プロパティが表示されません。

素晴らしい投稿
11/30/2011 9:53 AM
こんにちは。
素晴らしい投稿ですね。
私は SharePoint 2007 を使用しています。
上記のような [その他] のセクションがありません
。SP2007 用の構成手順はありますか?
ありがとうございます。

Re:コードなしのソリューション:SharePoint のリスト アイテムの最終更新日以降の日数の表示
10/11/2011 8:24 AM
Chris さん、こんにちは。
よく発見してくれました!
あなたの投稿に、できれば今日以降、目を通し、より頑強なソリューションにできるか考えてみたいと思います。
投稿を気に入ってくれてたこと、またヨーロッパの日付形式のソリューションを見つけてくれたことをとてもうれしく思っています。 :)
-Justin

ヨーロッパの日付の形式のソリューション
2011 年 10 月 11 午前 6時 45分
高柴瀬もう一度、
ヒント、このページでは前述の問題のソリューションを検出は
https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

ヨーロッパの日付形式
10/7/2011 3:59 AM
Justin さん、こんにちは。
素晴らしいソリューションですね。ありがとうございます。ここ 2 日間私がまさに探していたものです!しかし、これで少し問題があって助けていただけないかと思いました。
あなたのコードを若干変更して、"DateDiff" 関数の最後の行の変数を変えて、何かが起こった日以降ではなくそれまでの日数を計算するようにしました。

<xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of>

しかし、2 回に 1 回しか差を正しく計算できません。たとえば、(形式 dd/MM/yyyy の)

30/12/2011

の日付は正しく計算されますが、この (同じ形式の)

12/10/2011

の日付は、12-Oct-2011 ではなく 10-Dec-2011 として計算されます。
単純に "JulianStartDate" 変数の日付と月の値をこのように置き換えてみました。

<xsl:with-param name="Month" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMMdd'),7,2)"/>
<xsl:with-param name="Day" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMMdd'),5,2)"/>

これで 2 番目の日付は直すことができましたが、すると最初の日付が不正になってしまうのです!
European LCID を使用するために FormatDateTime の呼び出しを変更してみたり、サブストリングの位置パラメータを適切なものに変え、FormatDateTime (例: ddMMyyyy、MMddyyyy) の最後のパラメーターにさまざまな変更を加えましたが、成功しませんでした。
何かアドバイスをいただければとてもうれしいです。
ありがとうございます。
Chris

コードなし
9/21/2011 4:27 AM
プログラミングは不要ですが、誰もが XSL 言語を理解できるとは思わないので、XSL は "コードなし" のソリューションだとは見なされないと思います。それを除いては素晴らしいソリューションだと思います。ありがとうございます

注: 機械翻訳についての免責事項: この記事の翻訳はコンピューター システムによって行われており、人間の手は加えられていません。マイクロソフトでは、英語を話さないユーザーがマイクロソフトの製品、サービス、テクノロジに関するコンテンツを理解するのに役立てるため、こうした機械翻訳を提供しています。記事は機械翻訳されているため、用語、構文、文法などに誤りがある場合があります。

スキルを磨く
トレーニングの探索
新機能を最初に入手
Office Insider に参加する

この情報は役に立ちましたか?

ご意見をいただきありがとうございます。

フィードバックをお寄せいただき、ありがとうございます。Office サポートの担当者におつなぎいたします。

×