無程式代碼解決方案:顯示清單專案上次變更后的天數
套用到
由美國拉恩特克的Ju
附註: 本文是 SharePoint 使用者取得 點 數部落格四年文章集合的一部分。
概觀:無程序代碼的自定義使用年份報告
SharePoint 網站中經常要求的功能部分之一,就是工作或列表專案的使用方式報告。 換句話說,上次修改此列表專案的日期/月有多久?
表面上,這似乎是一個非常簡單的要求。 畢竟,我們有建立和修改專案的日期,能夠在透過事件接收器對專案進行某些變更時儲存自定義日期。 我們有計算結果列,其中可以包含類似 Excel 的公式來處理我們的資訊。 這看起來像是一個相當直立的前進專案。 我們選擇日期欄位、建立計算結果列,然後沿著 [DateField] - [今天] 這兩行執行公式。 啊,沒那麼快! 任何嘗試過此「簡單」工作的人都知道,嘗試在計算結果列中使用類似 [今天] 的內容會造成問題。 試著在計算結果列的公式方塊中插入 [今天] 會顯示如下的錯誤訊息:
為什麼會是這樣? 因此,它必須與計算結果列的計算方式有關。
讓我們以簡單的公式做為範例:
= IF ( [Column1]<=[Column2], “OK”, “Not OK”)
這表示如果 [欄1] 小於或等於 [欄2],則顯示 [確定],否則顯示 [無法確定]。 這是計算結果列相當典型的基本公式,它會對包含這些欄的清單專案做出基本假設:若沒有清單專案上的 Update 事件,Column1 和 Column2 的值永遠無法變更。
沒錯,計算結果列只會在清單更新 (或建立) 時重新計算,因為他們假設您正在計算的資訊包含在專案本身中。 當您嘗試使用與專案字段無關的變更專案時,這會造成問題,例如今天的日期。
現在我不在會議中,他們決定這是計算結果列的運作方式,不過,如果我必須做出一個猜測,我會假設它們以這種方式執行效能。 假設您有數千個項目的清單,每個專案都包含需要「即時」更新的計算結果列。 這表示某些機制,或許是定時器工作,必須經常逐一查看包含該計算結果列的每個專案,並更新其值。 就效能而言,這可能會對效能造成極大的加值,因為透過較大的部署,這項工作可能會不斷地執行及變更專案。 這隻是我的猜測,但如果您思考這個問題,這會相當有意義。
有一些類似解決方案的建議四處浮動,其中涉及誘騙SharePoint接受Today值,方法是先建立名為Today的欄,然後將它新增到您的公式,然後刪除它。 這些都很好,但請記住我在計算結果列更新時所說的內容。 只有在專案更新時,此值才會變更,這表示您的值很快就會不正確,尤其是在一天計算的情況下。
我看過其他人使用聰明的 JavaScript 將值寫入頁面。 這也可以運作,但在可以避免的情況下,我幾乎會對用戶端腳本進行分類。
實現:
該怎麼做呢? 計算結果列不在像 Today 這樣的「動態」函數的問題中。 我們可能會開發一些自定義程式碼來處理這個問題,例如計算數據行、定時器工作或排程程式,以便在需要計算的每一個專案上進行更新。 這可讓我們回到我在上一個段落提到的效能問題,此外,它是一個高度特定於有問題的網站/清單/欄的解決方案。 基於這兩個疑慮,您也必須尋找像我這樣懂得如何編解碼並說服他為您開發此解決方案的壞子。 但是有一個更簡單的方式!
如果您有權在網站上建立字段和編輯頁面,而且對 XSLT 和建立檢視有一點瞭解,您可以將可包含在清單檢視中的 XSL 範本放在一起,並在每次要求頁面時共同計算您的值。 此案例移除我們對效能的疑慮,而且不需要透過解決方案開發和部署自定義程序代碼。
太棒了。 我們該怎麼做呢?
-
建立或選取要做為來源的欄位。 它必須是日期類型。
-
建立我們的欄位,做為計算值的佔位元。
-
將這兩個字段新增到內容類型,並將該內容類型新增至清單。
-
建立包含來源和佔位符欄之清單的檢視。
-
將 XSL 範本上傳到樣式庫。
-
設定清單檢視網頁元件透過UI的「XSL 連結」屬性。
-
成功!
讓我們探索範例使用案例,並逐步執行實作。 我們的客戶想要查看其主要清單,以告知特定清單項目已經坐到其狀態多久。 此清單包含從專案類型衍生並新增至清單的自訂網站內容類型。 已經有事件接收器就位了,每當清單專案上的狀態字段變更,並將該日期儲存到稱為「日期狀態已變更」的欄時,就會擷取。 所有這些佈線都不需要,而且可以使用 ANY 日期欄位來完成, (實作就是我們的實作,但歡迎嘗試) 。 您最不需要的就是來源日期欄位和佔位元字段,以便在下一段落中保留計算 (更多相關信息,) 新增至清單中,不過我建議您在想要在網站的其他位置重複使用此解決方案時使用網站欄和網站內容類型。
因此,我們的來源日期可用於對今天日期的計算。 現在我們可以建立自定義網站數據行,做為計算值的容器。 在此情況下,我選擇使用計算結果列,因為它無法在新或編輯專案窗體上變更,但可以選取以顯示在檢視中,因為我們不希望使用者在此欄中輸入任意值。 不顯示在檢視中等原因可能會令人混淆。
現在我們已經有網站列,可以將它新增到清單中將會使用的內容類型。 接下來,我們需要建立檢視,以便日後使用 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&权限Changed=1&id=C262E8E2D59A86D9!104
在您最愛的文本編輯器中開啟此選項,您會看到許多可呈現檢視的標準 SharePoint XSL 標記,如果您持續向下卷動至行 357,您會看到我新增至標記的自定義範本開始,第一個範本是「DateDiff」範本,後面接著「calculate-the」和「FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status」。 以下是我們的三個範本,可在我們的檢視中製作並顯示計算。 如果您使用的功能變數名稱會與本文稍早所指定的不同,您必須瀏覽這些範本,並取代其他名稱的任何參照。 請記住,您會想要使用功能變數名稱,而不是顯示名稱。
一旦您滿意範本已準備就緒,請瀏覽至樣式庫,然後在 [XSL 樣式表單] 資料夾底下上傳範本,然後將連結複製到檔案。 這可讓我們日後輕鬆變更網站,或視需要將它新增至網站的不同部分。
接下來,移至您的清單,然後選取您先前在本文中建立的檢視。 從 [網站動作] 選單按一下 [編輯頁面]。
在頁面上尋找您的清單檢視網頁元件,然後按下右上角的小向下箭號來開啟網頁元件功能表。 從此功能表選取 [編輯網頁元件]。
這會開啟瀏覽器視窗右側的網頁元件功能表。
按兩下 [其他] 區段的 +,然後找出 「XSL Link」 屬性。
將您先前複製的 XSL 檔案連結貼到樣式庫中, (這可能是相對或絕對連結) 。
按兩下 [確定] 儲存變更,然後按下頁面頂端 [頁面] 功能區上的 [停止編輯] 按鈕。
如果所有設定都正確無誤,您現在應該會在 [天數顯示狀態] 欄中看到數位。
最後,以下是各種日期的測試數據的外觀:
摘要:
有:在 SharePoint 中建立使用舊版報表的格式設定良好、功能強大且效能更好的方法,並透過簡單的無程式代碼實作完成。 除了我們在此探索的一個使用案例之外,這還有相當多的潛在應用程式。 這種報表類型的另一個常見案例是將它附加至工作清單,讓您一目了然地查看該工作建立后已經過多久。
祝您使用愉快!
--賈斯汀
張德文,LANtek
註解
步驟遺失
2012 年 10 月 8 日上午 3:51 好的,我已依照步驟進行,但一定缺少一些資訊-XSL 會如何知道要使用哪個日期,或是要將日期新增到哪個字段? 不喜歡錯過步驟。[無代碼],已同意!
2012 年 8 月 30 日下午 12:12 我同意 - 我認為這並不真正視為「無代碼」。 有趣的是,我透過SharePoint的一些螺絲起子,在使用Today的計算結果列中...不確定做法或原因,因為我無法讓它再次執行,但其中一個仍然存在且可以運作。「天數在狀態」計算結果列的公式?
2012年5月2日上午 7:39 住家 - 您用於「狀態日期」計算網站列 (佔位符欄) 的公式為何? 是 「=today」嗎?SharePoint 2007
2011年12月2日上午 11:29 目前我尚未嘗試將此解決方案套用至 SharePoint 2007,但我正在尋找此解決方案。 很抱歉,網頁元件上沒有透過UI顯示的XslLink屬性。絕佳貼文
2011年11月30日上午 9:53 你好 [絕佳貼文]。 我正在使用 SharePoint 2007。 我沒有如上文所述的[雜項] 區段。 您是否有SP2007設定的步驟? 謝謝。重新:無程式代碼解決方案:顯示上次變更
SharePoint 清單專案後的天數 2011年10月11日上午 8:24 嗨,Chris。 好用的尋找! 我要看看您今天稍後所張貼的內容,看看我是否可以讓這個解決方案更穩固一些。 我很高興您對這篇文章說讚,而且很高興您能夠找到歐洲日期格式的解決方案。 :) -賈斯汀 解決方案 2011年10月11日上午 6:45 又等一次,又說一次, 僅供參考,我已找到先前在此頁面上提及之問題的解決方案;歐洲日期格式
2011年10月7日上午 3:59 嗨,膻 感謝您,這是很好解決的解決方案,也是我在過去兩天所尋找的一種東西! 不過我有點問題,希望您能幫我一些説明。 我稍微變更了您的程式代碼,藉由切換 「DateDiff」函數最後一行中的變數,來計算發生錯誤之前,而不是從此開始算起的天數; <xsl:value-of select=“$JulianToday - $JulianStartDate”></xsl:value-of> 不過我只能讓它正確快取一半時間的差異。 因此,在此日期 (格式為 dd/MM/yyyy) ; 2011年30月12 日 計算正確,但使用此日期 (相同的格式) 2011年12月10 日 它會計算為 10-Dec-2011,而不是 12-Oct-2011。 我嘗試只在「天數和月份值」變數中切換日期和月份值的位置,如下所示; <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) ”/> 這修正了第二個日期的問題,不過第一個日期當時卻不正確! 我也嘗試變更 FormatDateTime 呼叫以使用歐洲 LCID,以及對 FormatDateTime (的最後一個參數進行各種變更,例如 ddMMyyyy、MMddyyyy) ,並且對子站位置參數進行適當調整而沒有成功。 我們非常感謝您提供的任何建議。 謝謝 克裡斯無代碼
2011年9月21日上午 4:27 我認為 XSL 不符合「無程式代碼」解決方案的資格,因為瞭解 XSL 語言並不適用於所有人,但不涉及程序設計。 除此之外:好的解決方案,感謝您!