Giải pháp không có mã: Hiển thị các ngày kể từ khi mục danh sách được thay đổi gần nhất
Áp dụng cho
của Justin Joyce, LANtek
Lưu ý: Bài viết này là một phần của tập hợp các bài đăng từ bốn năm của blog Get the Point cho người dùng cuối SharePoint.
Tổng quan: Báo cáo lão hóa tùy chỉnh không có mã
Một trong những phần chức năng thường được yêu cầu của site SharePoint là báo cáo cũ cho các tác vụ hoặc mục danh sách. Nói cách khác, đã bao nhiêu ngày/tháng kể từ khi mục danh sách này được sửa đổi lần cuối?
Trên bề mặt này dường như là một yêu cầu rất đơn giản. Sau khi tất cả, chúng tôi có ngày tháng cho các mục được tạo và sửa đổi, chúng tôi có thể lưu trữ ngày tùy chỉnh khi một số thay đổi đối với các mục diễn ra thông qua người nhận sự kiện. Chúng tôi đã tính toán các cột trong đó chúng ta có thể bao gồm các công thức giống excel để làm việc với thông tin của mình. Điều này có vẻ như một đề xuất khá thẳng về phía trước. Chúng tôi chọn một trường ngày, tạo một cột được tính toán, rồi thực hiện một công thức nào đó dọc theo các dòng [DateField] – [Today]. Ah, mặc dù không nhanh như vậy! Như bất kỳ ai đã thử thực hiện tác vụ "đơn giản" này đều biết, việc cố gắng sử dụng một tác vụ như [Hôm nay] trong cột được tính sẽ gây ra sự cố. Hãy thử chèn [Hôm nay] vào hộp công thức của cột được tính sẽ cung cấp cho bạn một thông báo lỗi như sau:
Tại sao là điều này? Vâng, nó phải làm với cách tính toán cột được tính toán.
Chúng ta hãy lấy một công thức đơn giản làm ví dụ:
= IF( [Column1]<=[Column2], "OK", "Not OK")
Tất cả điều này cho biết là nếu Cột1 nhỏ hơn hoặc bằng Cột 2 thì hiển thị OK, nếu không thì hiển thị Không OK. Đây là một công thức cơ bản khá điển hình cho một cột được tính toán và nó làm cho một giả định cơ bản về mục danh sách có chứa các cột này: Các giá trị cho Cột1 và Cột2 sẽ không bao giờ có thể thay đổi mà không có sự kiện Update trên mục danh sách.
Đúng vậy, các cột được tính toán sẽ chỉ tính toán lại khi danh sách được cập nhật (hoặc được tạo) vì chúng giả định thông tin mà bạn đang tính toán có trong chính mục đó. Điều này sẽ tạo ra sự cố khi bạn đang tìm cách sử dụng nội dung thay đổi độc lập với trường của mục, chẳng hạn như ngày hôm nay.
Bây giờ tôi đã không trong cuộc họp, nơi họ đã quyết định rằng đây là cách mà tính toán cột sẽ hoạt động, tuy nhiên, nếu tôi đã phải thực hiện một đoán có giáo dục, tôi sẽ giả định rằng họ chức năng theo cách này cho hiệu suất. Hãy tưởng tượng nếu bạn đã có một danh sách gồm vài nghìn mục, mỗi mục chứa một cột được tính cần cập nhật "trực tiếp". Điều đó có nghĩa là một cơ chế nào đó, có lẽ là công việc hẹn giờ, sẽ phải lặp đi lặp lại qua từng mục chứa cột được tính toán thường xuyên và cập nhật giá trị của nó. Điều này có thể cực kỳ kém về hiệu suất vì với triển khai lớn hơn, công việc này có thể liên tục chạy và thay đổi mọi thứ. Đó chỉ là phỏng đoán của tôi, nhưng nó làm cho khá một chút ý nghĩa nếu bạn nghĩ về nó.
Có một số đề xuất cho các giải pháp tương tự nổi xung quanh có liên quan đến lừa SharePoint để chấp nhận giá trị Hôm nay bằng cách đầu tiên tạo một cột có tên Hôm nay, sau đó thêm nó vào công thức của bạn, sau đó xóa nó. Đây là tất cả tốt và tốt, nhưng hãy nhớ những gì tôi đã nói về khi tính toán cột được cập nhật. Giá trị này sẽ chỉ thay đổi khi mục được cập nhật, nghĩa là giá trị của bạn sẽ sớm không chính xác, đặc biệt là trong trường hợp tính toán theo ngày.
Tôi đã nhìn thấy những người khác sử dụng thông minh JavaScript để viết các giá trị vào trang. Điều này cũng sẽ làm việc, nhưng tôi khá phân loại đối với kịch bản khách hàng khi nó có thể tránh được.
Thực hiện:
Vậy phải làm gì? Cột được tính toán là câu hỏi thường được gọi là các hàm "biến đổi" như Today. Chúng ta có thể phát triển một số mã tùy chỉnh để xử lý vấn đề này cho chúng ta như Cột tính toán, công việc hẹn giờ hoặc quy trình đã lên lịch để đi cùng và cập nhật mọi mục đơn lẻ cần tính toán này. Điều đó mang lại cho chúng tôi trở lại vấn đề về hiệu suất tôi đã đề cập trong đoạn cuối mặc dù, và ngoài ra, nó là một giải pháp giòn mà sẽ rất cụ thể cho các trang web / danh sách / cột trong câu hỏi. Trên đầu trang của hai mối quan tâm, bạn cũng sẽ phải đi tìm một chàng trai nerdy, chẳng hạn như bản thân mình, mà biết làm thế nào để mã hóa và thuyết phục anh ta để phát triển giải pháp này cho bạn. Nhưng có một cách dễ dàng hơn!
Nếu bạn có quyền tạo trường và sửa trang trên site của bạn và có một chút kiến thức về XSLT và tạo dạng xem, bạn có thể kết hợp một mẫu XSL có thể được bao gồm trong dạng xem danh sách và sẽ trung thành tính toán giá trị của bạn mỗi khi trang được yêu cầu. Kịch bản này loại bỏ mối quan tâm của chúng tôi về hiệu suất và không yêu cầu phát triển và triển khai mã tùy chỉnh thông qua giải pháp.
Hoàn hảo. Vậy chúng ta làm điều đó như thế nào?
-
Tạo hoặc chọn trường sẽ hoạt động như nguồn của chúng tôi. Đó phải là kiểu ngày.
-
Tạo trường của chúng tôi sẽ đóng vai trò là chỗ dành sẵn cho giá trị được tính toán.
-
Thêm cả hai trường này vào một kiểu nội dung và thêm kiểu nội dung đó vào danh sách.
-
Tạo dạng xem của danh sách đó chứa cả cột nguồn và cột chỗ dành sẵn.
-
Tải mẫu XSL lên Thư viện Kiểu.
-
Đặt thuộc tính "Nối kết XSL" cho Phần Web Dạng xem Danh sách thông qua giao diện người dùng.
-
Thành công!
Chúng ta hãy khám phá một trường hợp sử dụng ví dụ và đi qua quá trình triển khai. Khách hàng của chúng tôi muốn xem danh sách chính của họ sẽ cho họ biết bao lâu một mục danh sách cụ thể đã được ngồi ở trạng thái của nó. Danh sách này chứa một loại nội dung site tùy chỉnh bắt nguồn từ loại Mục và được thêm vào danh sách. Đã có một người nhận sự kiện tại chỗ ghi lại mỗi lần thay đổi trường trạng thái trên mục danh sách và lưu ngày đó vào một cột có tên là "Đã thay đổi Trạng thái Ngày". Tất cả điều này là không bắt buộc, và có thể được thực hiện với BẤT KỲ trường ngày (nó chỉ như vậy xảy ra đây là việc thực hiện của chúng tôi nhưng cảm thấy tự do để thử nghiệm). Mức tối thiểu trần mà bạn sẽ cần là trường ngày nguồn và trường chỗ dành sẵn để giữ tính toán của bạn (xem thêm về điều này trong đoạn văn tiếp theo) được thêm vào danh sách của bạn, mặc dù tôi khuyên bạn nên sử dụng các cột site và kiểu nội dung site trong trường hợp bạn muốn tái sử dụng giải pháp này ở những nơi khác trên site của bạn.
Vì vậy, chúng tôi có ngày nguồn của chúng tôi mà chúng tôi có thể sử dụng trong tính toán của chúng tôi so với ngày hôm nay. Bây giờ chúng ta có thể tạo một cột trang web tùy chỉnh để sử dụng như một bộ chứa cho giá trị tính toán của chúng tôi. Trong trường hợp này, tôi đã chọn sử dụng một cột được tính vì nó sẽ không thể được thay đổi trên biểu mẫu mục mới hoặc chỉnh sửa, nhưng có thể được chọn để hiển thị trong các dạng xem vì chúng tôi không muốn người dùng nhập các giá trị tùy ý vào cột này. Nó có thể gây nhầm lẫn như lý do tại sao nó không được hiển thị trong các dạng xem, vv
Bây giờ chúng ta có cột trang web của chúng tôi, chúng ta có thể thêm nó vào các loại nội dung của chúng tôi sẽ được sử dụng trong danh sách của chúng tôi. Tiếp theo, chúng ta cần tạo dạng xem sau này sẽ được tùy chỉnh với XSLT của chúng tôi. Hãy đảm bảo bạn tạo dạng xem tiêu chuẩn có chứa cột ngày nguồn và cột được tính mới của bạn, cột này sẽ đóng vai trò là chỗ dành sẵn cho giá trị được tính toán.
Bây giờ chúng tôi có tất cả mọi thứ tại chỗ mà chúng tôi sẽ yêu cầu để hỗ trợ báo cáo lão hóa tùy chỉnh của chúng tôi. Tất cả những gì còn lại là tạo mẫu XSL của chúng tôi, tải nó lên Thư viện Kiểu của trang web và liên kết nó với dạng xem danh sách của chúng tôi. Mẫu XSL mà chúng tôi sẽ sử dụng sẽ chứa một số đánh dấu do SharePoint tạo thông thường để tạo dạng xem cũng như đánh dấu tùy chỉnh của riêng chúng tôi được sử dụng để ghi đè lên các phần nhất định của điều này và tính toán giá trị mong muốn cho chúng tôi.
Cho tín dụng mà tín dụng đến hạn, các mẫu XSL để thực hiện các tính toán thực tế tôi đang sử dụng cho giải pháp này đã được cung cấp một cách hấp dẫn bởi "swirch" trên diễn đàn MSDN:http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/
Tải xuống biểu phong cách XSL (aging.zip) Tôi đã kết hợp nằm ở đây:https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104
Mở mục này trong trình soạn thảo văn bản yêu thích của mình, bạn sẽ thấy nhiều vết cập nhật SharePoint XSL bình thường để kết xuất các dạng xem, nếu bạn tiếp tục cuộn xuống dòng 357, bạn sẽ thấy đầu mẫu tùy chỉnh mà tôi đã thêm vào đánh dấu, mẫu đầu tiên là mẫu "DateDiff" tiếp theo là "calculate-julian-day" và "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Đây là ba mẫu sẽ thực hiện và hiển thị tính toán của chúng tôi trong quan điểm của chúng tôi. Nếu bạn sẽ sử dụng các tên trường khác với tên đã xác định trước đó trong bài viết này, bạn sẽ cần phải xem qua các mẫu này và thay thế bất kỳ tham chiếu nào đến các tên khác. Hãy nhớ rằng, vì điều này, bạn sẽ muốn sử dụng tên NỘI BỘ của trường không phải là tên hiển thị.
Sau khi bạn đã hài lòng với việc mẫu đã sẵn sàng để sử dụng, hãy dẫn hướng đến Thư viện Kiểu của bạn và tải lên dưới thư mục "Biểu định Kiểu XSL" rồi sao chép liên kết đến tệp. Điều này sẽ cho phép chúng tôi dễ dàng thực hiện thay đổi cho nó sau này, hoặc thêm nó vào các phần khác nhau của trang web như chúng tôi xin.
Tiếp theo, đi đến danh sách của bạn và chọn dạng xem bạn đã tạo trước đó trong bài viết này. Từ menu "Hành động Site" bấm vào "Sửa Trang".
Tìm Phần Web Dạng xem Danh sách của bạn trên trang và mở menu Phần Web bằng cách bấm vào mũi tên nhỏ hướng xuống dưới ở góc trên bên phải. Từ menu này, chọn "Sửa Phần Web".
Thao tác này sẽ mở menu của Phần Web ở bên phải cửa sổ trình duyệt của bạn.
Bấm vào + cho phần "Hỗn hợp" và xác định vị trí "XSL liên kết" bất động sản.
Dán vào liên kết đến tệp XSL của bạn trong Thư viện Kiểu mà bạn đã sao chép xuống trước đó (đây có thể là một liên kết tương đối hoặc tuyệt đối).
Bấm vào "OK" để lưu các thay đổi của bạn, rồi bấm vào nút "Dừng Chỉnh sửa" trên dải băng "Trang" ở đầu trang.
Nếu tất cả mọi thứ đã được đặt cấu hình đúng cách, bây giờ bạn sẽ thấy các số trong cột "Ngày Tại Trạng thái" của bạn.
Và cuối cùng, đây là diện mạo của nó với một số dữ liệu kiểm tra có nhiều ngày khác nhau:
Tóm tắt:
Đó là: một cách thực hiện được định dạng độc lập, mạnh mẽ và tốt hơn để tạo báo cáo lão hóa trong SharePoint., hoàn chỉnh với việc thực hiện không cần mã đơn giản. Điều này có khá một vài ứng dụng tiềm năng bên cạnh trường hợp sử dụng một trong chúng tôi khám phá ở đây. Một kịch bản phổ biến khác cho loại báo cáo này là đính kèm nó vào danh sách nhiệm vụ để bạn có thể xem đã mất bao lâu kể từ khi một nhiệm vụ được tạo ra trong nháy mắt.
Xem vui nhé!
--Justin
Justin Joyce, LANtek
Chú thích
Thiếu các bước
08/10/2012 3:51 SA ok tôi làm theo các bước, nhưng phải có một cái gì đó thiếu - làm thế nào sẽ XSL biết ngày để sử dụng, hoặc trường để thêm các ngày kể từ ngày vào? ghét nó khi bước được bỏ lỡ.Không mã, đồng ý!
30/08/2012 12:12 CH Tôi đồng ý - Tôi không nghĩ rằng điều này thực sự được tính là "không có mã". Điều thú vị là thông qua một số ví dụ về SharePoint, tôi có một cột được tính toán đang hoạt động bằng cách sử dụng Hôm nay... không chắc chắn làm thế nào hoặc tại sao bởi vì tôi không thể nhận được nó để làm điều đó một lần nữa, nhưng một trong những vẫn còn đó và làm việc.Công thức cho Cột được Tính "Ngày Ở Trạng thái"?
02/05/2012 7:39 SA Justin - Công thức bạn đã sử dụng cho cột site được tính toán "Ngày Ở Trạng thái" là gì (cột chỗ dành sẵn)? Nó có phải là "=today"?SharePoint 2007
NGÀY 2/12/2011 11:29 SA Hiện tại tôi đã không cố gắng để áp dụng giải pháp này cho SharePoint 2007, Tuy nhiên, tôi nhìn vào nó. Rất tiếc, không có thuộc tính XslLink nào xuất hiện trên phần web thông qua giao diện người dùng.Great Đăng bài
30/11/2011 9:53 SA Xin chào Great Đăng bài. Tôi đang sử dụng SharePoint 2007. Tôi không có phần Misc như đã nêu ở trên. Bạn có các bước cho cấu hình SP2007 không? Cảm ơn bạn.Re: Giải pháp không có mã: Hiển thị các ngày kể từ khi mục danh sách SharePoint được thay đổi gần nhất
11/10/2011 8:24 SA Chào Chris. tìm tuyệt vời! Tôi sẽ có một cái nhìn vào những gì bạn đăng hy vọng sau ngày hôm nay và xem nếu tôi có thể làm cho giải pháp này một chút mạnh mẽ hơn. Tôi vui mừng bạn thích bài đăng, và tôi rất vui mừng bạn đã có thể tìm thấy một giải pháp cho định dạng ngày châu Âu. :) -JustinGiải pháp cho Định dạng Ngày châu Âuhttps://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/
11/10/2011 6:45 SA Chào justin lần nữa, FYI, tôi tìm thấy một giải pháp cho vấn đề tôi đã đề cập trước đó trên trang này;Định dạng Ngày châu Âu
07/10/2011 3:59 SA Xin chào Justin, Đây là một giải pháp thực sự tốt nhờ, và chỉ là loại điều tôi đã dành hai ngày qua tìm kiếm! Tuy nhiên tôi đang có một chút vấn đề với nó và tôi đã hy vọng bạn có thể giúp tôi. Tôi đã thay đổi mã của bạn một chút để tính toán số ngày cho đến khi điều gì đó xảy ra, chứ không phải là kể từ, bằng cách chuyển đổi các biến trong dòng cuối cùng của "DateDiff" chức năng; <xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of > Tuy nhiên, tôi chỉ có thể có được nó để bao gồm sự khác biệt một nửa chính xác của thời gian. Vì vậy, ví dụ với ngày này (định dạng dd/MM/yyyy); Ngày 30/12/2011 Nó tính toán chính xác, nhưng với ngày này (cùng định dạng) Ngày 10 tháng 12 năm 2011 Nó tính toán như thể 10 tháng 12 năm 2011 chứ không phải 12 tháng 10 năm 2011. Tôi đã cố gắng chỉ đơn giản là chuyển đổi vị trí của các giá trị ngày và tháng trong biến "JulianStartDate", như thế này; <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)"/> Và điều này đã khắc phục sự cố với ngày thứ hai, tuy nhiên sau đó nó đã không chính xác cho ngày đầu tiên! Tôi cũng đã thử thay đổi các cuộc gọi FormatDateTime để sử dụng LCID châu Âu và thay đổi khác nhau để tham số cuối cùng của FormatDateTime (ví dụ: ddMMyyyy, MMddyyyy) với các điều chỉnh thích hợp cho các tham số vị trí chuỗi con mà không thành công. Tôi đánh giá rất cao bất kỳ lời khuyên nào bạn có thể cung cấp. Cảm ơn ChrisKhông có Mã
21/09/2011 4:27 SA Tôi không nghĩ rằng XSL đủ điều kiện như là một giải pháp "không có mã", như sự hiểu biết về ngôn ngữ XSL không phải là cho tất cả mọi người - tuy nhiên nó không liên quan đến lập trình. Bên cạnh đó: Giải pháp tốt đẹp, cảm ơn bạn!