無程式碼解決方案:顯示自上次變更清單專案以來的天數
Applies To
Microsoft 365 中的 SharePoint Microsoft 365 小型企業版中的 SharePoint依 Justin Joyce、LANtek
附註: 本文是四年的文章集合的一部分,可取得 SharePoint 最終使用者 的要點 博客。
概覽:不含程式碼的自訂老化報告
SharePoint 網站其中一個常見的功能元件是任務或清單專案的帳齡報告。 換句話說,自上次修改此清單專案以來,有多少天/幾個月已完成?
在表面上,這似乎是一個非常簡單的要求。 畢竟,我們有建立及修改專案的日期,我們可以在事件接收器進行特定變更時,儲存自訂日期的功能。 我們有匯出的資料行,我們可以在其中加入 Excel 等公式,以與我們的資訊搭配使用。 這看起來就像是相當直接的直向式投影。 我們會挑選一個日期欄位、建立計算結果欄,然後沿著 [DateField] 行的 []-[Today]] 來執行公式操作。 噢,不過太快了! 如果有人嘗試「簡單」工作,但嘗試在計算結果欄中使用諸如 [Today] 之類的內容,會導致問題。 嘗試將 [Today] 插入您的計算結果欄的公式方塊中,會出現如下所示的錯誤訊息:
為什麼這麼做? 因此,它必須以計算計算結果欄的方式進行。
我們以簡單的公式做為範例:
= IF ( [欄 1] <= [欄2等],"確定","Not OK" )
這表示如果欄1小於或等於欄2等,則顯示 [確定],否則顯示 [不正常]。 這是相當典型的計算結果欄基本公式,並針對包含這些資料行的清單專案進行基本假設:欄1和欄2等的值永遠無法在清單專案上變更,而不需要更新事件。
那就是,計算結果欄只會在清單更新時重新計算 (或建立) ,因為它們會假設您要計算的資訊包含在專案本身中。 當您嘗試使用與專案欄位無關的內容(例如今天的日期)時,就會產生問題。
現在我不在會議中,他們決定計算欄將起作用的方式,不過,如果我必須讓他們以這種方式發揮效能。 假設您有幾千個專案的清單,每個專案都包含需要「即時」更新的計算結果欄。 這表示某些機制(可能是計時器作業)必須逐一遍歷每個包含該計算結果欄的專案,並更新其值。 這個作業可能會持續執行並變更專案,因此在效能方面可能會有極大的負擔。 這只是我的猜測,但如果您想知道它,這會相當有意義。
我們有一些針對浮動的解決方案所提供的相關建議,其中包括欺騙 SharePoint,只要建立名為 Today 的欄,然後再將它新增到您的公式,然後將它刪除。 這些全都不錯,但請記住在計算結果欄更新時所說的資訊。 這個值只會在專案更新時變更,這表示您的值很快就會不正確,尤其是在日期計算的情況下。
我已看到其他人使用聰明 JavaScript 將值寫入頁面。 這也能正常運作,但是當您可以避免使用用戶端腳本時,我會有很大的 categorically。
部署
該怎麼辦? 計算結果欄的問題就是所謂的「可變」函數,就像今天這樣。 我們可以開發一些自訂程式碼來處理此問題,例如計算結果欄、計時器作業或排程的程式,並更新每一個需要此計算的專案。 這會讓我們回到最後一段中提到的效能問題,此外,也是一種 brittle 解決方案,該方案對於問題中的網站/清單/資料行來說是非常特殊的。 在這兩個擔心的情況下,您也必須找到自己的 nerdy 專家(例如自己),瞭解如何程式碼,並誘使他為您開發這個方案。 但有更簡單的方法!
如果您有許可權在您的網站上建立欄位和編輯頁面,並對 XSLT 及建立視圖有一些瞭解,您可以將 XSL 範本放在清單視圖中,並在每次要求頁面時,以切實計算您的值。 這個案例會將我們的問題排除在效能上,而且不需要透過方案來開發及部署自訂程式碼。
理想. 那我們該怎麼做呢?
-
建立或選取將充當我們來源的欄位。 它必須是日期類型。
-
建立將充當所計算之值的預留位置的欄位。
-
將這兩個欄位新增至內容類型,並將該內容類型新增至清單。
-
建立包含 [來源] 和 [預留位置] 欄的清單視圖。
-
將 XSL 範本上傳到樣式庫。
-
透過 UI 設定清單視圖網頁元件的 [XSL 連結] 屬性。
-
成功!
讓我們來探索範例使用案例,並逐步完成實現。 我們的客戶想要查看其主要清單,告訴他們特定清單專案在其狀態中的時間。 此清單包含從專案類型衍生的自訂網站內容類型,並新增至清單中。 已有一個事件收件者,其中會捕獲清單專案上的狀態欄位已變更,並將日期儲存到名為「日期狀態已變更」的欄。 所有這種佈線都不是必要的,而且您可以使用任何日期欄位來完成 (它就是我們的實現,但在這種情況下,您可以免費實驗) 。 您最少需要的是 [來源日期] 欄位和 [預留位置) ] 欄位來保留您的 (計算,但如果您想要在您的網站上的其他位置重複使用此方案,您可以使用網站欄和網站內容類型。
所以我們有我們的來源日期,我們可以在我們的計算結果中使用今天的日期。 現在,我們可以建立自訂網站欄,以做為計算值的容器。 在這種情況下,我選擇使用計算結果欄,因為它無法在新的或編輯專案表單上變更,但您可以選取在 [視圖] 中顯示,因為我們不希望使用者在此欄中輸入任意值。 這可能會令人混淆,原因是它不會顯示在 [視圖] 中等等。
現在我們有了 [網站] 欄,我們可以將它新增至將在清單中使用的內容類型。 接下來,我們需要建立會在稍後使用 XSLT 進行自訂的視圖。 請確定您已建立一個標準視圖,其中包含 [來源日期] 資料行,以及將充當計算結果之預留位置的新計算結果欄。
我們現在已將我們所需的一切放在一起,以提供自訂的過時報告。 剩下的全部工作就是建立 XSL 範本、將其上傳至網站的樣式庫,以及將其連結至我們的清單視圖。 我們將使用的 XSL 範本會包含一些標準的 SharePoint 產生標記,用於產生視圖,以及我們自己的自訂標記,用來覆寫這部分的特定部分,並計算我們想要的值。
在信用到期的點數中,您可以在 MSDN 論壇上 graciously 「swirch」提供的用來執行此方案之實際計算的 XSL 範本: HTTP://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/
下載 XSL 樣式表 ( # A0) 我已將它放在以下位置: Https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged = 1&ID = c262e8e2d59a86d9! 104
在您最愛的文字編輯器中開啟此功能。如果您繼續向下滾動至 [行 357],您會看到我新增至標記的自訂範本開始,第一個是 "DateDiff" 範本,後面接著是 "計算-julian-日" 和 "FieldRef_printTableCell_EcbAllowed. Days_x0020_At_x0020_Status"。 以下是我們的三個範本,可在我們的 [視圖] 中進行及顯示計算。 如果您要使用的功能變數名稱與本文先前所指定的名稱不同,您將需要流覽這些範本,並取代其他名稱的參照。 請記住,您會想要使用欄位的內部名稱,不是顯示名稱。
當您認為範本已準備就緒,請流覽至您的樣式庫,然後將其上傳到 [XSL 樣式表單] 資料夾底下,然後複製到檔案的連結。 這可讓我們稍後輕鬆地對其進行變更,或將它新增到網站的不同部分。
接著,移至您的清單,然後選取您先前在本文中建立的視圖。 在 [網站動作] 功能表上,按一下 [編輯頁面]。
在頁面上尋找您的清單視圖網頁元件,然後按一下右上角的小型向下箭號,開啟 [網頁元件] 功能表。 從這個功能表中,選取 [編輯網頁元件]。
這將會開啟瀏覽器視窗右側的 [網頁元件] 功能表。
按一下 [其他] 區段的 +,找出 [XSL 連結] 屬性。
將連結貼到您先前複製的樣式庫中的 XSL 檔案連結中 (這可以是相對或絕對連結) 。
按一下 [確定] 以儲存變更,然後在頁面頂端的 [頁面] 功能區上,按一下 [停止編輯] 按鈕。
如果所有設定都正確無誤,您現在應該會在 [您的日期的狀態] 欄中看到數位。
最後,以下是不同日期的一些測試資料所看起來的樣子:
摘要:
就是:在 SharePoint 中建立老化報告的格式良好、穩健且更好的執行方式。,請完成簡單的無程式碼實現。 在這裡我們探索的一個使用案例旁邊,您有幾個可能的應用程式。 此報表類型的另一個常見案例是將它附加到 [工作] 清單,讓您可以看到自工作開始產生所需的時間。
盡情享受!
--Justin
Justin Joyce, LANtek
註解
缺少
的步驟 10/8/2012 3:51 AM [確定] 按照這些步驟操作,但必須遺漏一些問題: XSL 如何知道要使用哪個日期,或是要在哪一個欄位加上天數? 如果沒有步驟,就不會這麼做。書面程式碼!
8/30/2012 12:12 PM 我同意-我不認為這個實際會算作 "無代碼"。 有趣的是,透過一些 SharePoint screwup,我有一個使用今天的工作匯出資料行 .。。不確定原因或原因,因為我無法再次執行該作業,但仍然有,但仍可正常運作。[狀態] 計算結果欄
的公式 5/2/2012 7:39 AM Justin-您在「狀態」的 [日期] 欄位中,您所用的公式是什麼 (預留位置欄) ? 是「= 今天」嗎?SharePoint 2007
12/2/2011 11:29 AM 我們目前未嘗試將此方案套用至 SharePoint 2007,但我正在尋找它。 遺憾的是,沒有透過 UI 在網頁元件上呈現 XslLink 屬性。精彩文章
11/30/2011 9:53 AM 你好, 精彩文章。 我使用的是 SharePoint 2007。 我沒有如上所述的其他章節。 您是否有 SP2007 設定的步驟? 謝謝。Re:無程式碼解決方案:顯示 SharePoint 清單專案上次變更
後的天數 10/11/2011 8:24 AM 麗麗。 不錯的尋找! 現在,我要看看您在今天要張貼的內容,並查看是否可以讓這個方案變得更穩定。 我很高興您喜歡這篇文章,所以我非常樂意找到歐洲日期格式的方案。 : ) -Justin 的方案 10/11/2011 6:45 AM 你好 Justin, 僅供參考:我找到先前在此頁面 上提到之問題的解決方案,歐洲日期格式
10/7/2011 3:59 AM 你好 Justin, 這是一個很好的解決方案,只是感謝您在過去兩天所花費的時間。 不過我對 it 有一些問題,希望您能提供協助。 我已將您的程式碼變更成輕微 calcultate,直到您在 [DateDiff "函數的最後一行中切換變數,而不是從 [到] 為止。 <xsl: value = "$JulianToday-$JulianStartDate" ></xsl:值為> 不過,我只能取得正確的 caclulate 半次差異。 如此一來, (格式 dd/MM/yyyy) ; 30/12/2011 它會正確計算,但在這個日期 (相同的格式) 12/10/2011 它會計算出10月2011(而不是 12-10 月12日)2011時的情況。 我嘗試只是在 "JulianStartDate" 變數中切換日和月份值的位置,如下所示; <xsl: with param 名稱 = 「Month」 select = "substring (ddwrt: FormatDateTime (字串 ($StartDate) 、1033、" yyyyMMdd ") 、7、2) "/> <xsl: with param 名稱 = "Day" 選取 = "substring (ddwrt: FormatDateTime (字串 ($StartDate) 、1033、" yyyyMMdd ") 、5、2) "/> 如此一來修正第二個日期的問題,不過第一個日期卻不正確! 我也嘗試將 FormatDateTime 通話變更為使用歐洲的 Lcid 和各種變更來 FormatDateTime ((例如 ddMMyyyy)) MMddyyyy 使用子字串位置參數的適當調整,而不會成功。 我非常感謝您提供的任何建議。 多謝, 分別無程式碼
9/21/2011 4:27 AM 我認為 XSL 不符合「不是程式碼」的解決方案,因為瞭解 XSL 語言不適合所有人,但它不會涉及程式設計。 除了:好的解決方案,感謝您!