oleh Justin Joyce, LANtek
Catatan
Artikel ini merupakan bagian dari kumpulan postingan dari empat tahun blog Get the Point untuk pengguna akhir SharePoint.
Gambaran Umum: Laporan penuaan kustom tanpa kode
Salah satu bagian fungsional situs SharePoint yang sering diminta adalah laporan penuaan untuk tugas atau item daftar. Dengan kata lain, sudah berapa hari/bulan sejak item daftar ini terakhir diubah?
Di permukaan, ini tampaknya menjadi permintaan yang sangat sederhana. Lagi pula, kami memiliki tanggal untuk item yang dibuat dan dimodifikasi, kami memiliki kemampuan untuk menyimpan tanggal khusus ketika perubahan tertentu pada item terjadi melalui penerima peristiwa. Kami telah menghitung kolom tempat kami dapat menyertakan rumus seperti Excel untuk bekerja dengan informasi kami. Ini sepertinya proposisi yang cukup lurus ke depan. Kami memilih bidang tanggal, membuat kolom terhitung, lalu membuat rumus seperti [DateField] – [Today]. Ah, tidak begitu cepat! Seperti yang diketahui siapa pun yang telah mencoba tugas "sederhana" ini, mencoba menggunakan sesuatu seperti [Today] dalam kolom terhitung menyebabkan masalah. Coba sisipkan [Hari Ini] ke dalam kotak rumus kolom kalkulasi Anda akan memberi Anda pesan kesalahan seperti ini:
Mengapa demikian? Nah, itu ada hubungannya dengan cara penghitungan kolom yang dihitung.
Mari kita ambil rumus sederhana sebagai contoh:
= IF( [Column1]<=[Column2], "OK", "Tidak OK")
Semua ini mengatakan bahwa jika Kolom1 kurang dari atau sama dengan Kolom2, maka tampilkan OK, jika tidak, tampilkan Tidak OK. Ini adalah rumus dasar yang cukup umum untuk kolom terhitung dan membuat asumsi dasar tentang item daftar yang berisi kolom ini: Nilai untuk Kolom1 dan Kolom2 tidak akan pernah dapat berubah tanpa acara Pembaruan pada item daftar.
Benar, kolom terhitung hanya akan dihitung ulang ketika daftar diperbarui (atau dibuat) karena mereka mengasumsikan informasi yang Anda hitung terkandung dalam item itu sendiri. Hal ini menimbulkan masalah ketika Anda mencoba menggunakan sesuatu yang berubah secara independen dari bidang item, seperti tanggal hari ini.
Sekarang saya tidak berada dalam pertemuan di mana mereka memutuskan bahwa ini adalah cara kolom yang dihitung akan berfungsi, namun, jika saya harus membuat tebakan yang terdidik, saya akan berasumsi bahwa mereka berfungsi dengan cara ini untuk kinerja. Bayangkan jika Anda memiliki daftar beberapa ribu item, yang masing-masing berisi kolom terhitung yang memerlukan pembaruan "langsung". Itu berarti bahwa beberapa mekanisme, mungkin pekerjaan pengatur waktu, harus mengulangi setiap item yang berisi kolom terhitung itu sesering mungkin dan memperbarui nilainya. Ini bisa sangat melelahkan dalam hal kinerja karena dengan penyebaran yang lebih besar, pekerjaan ini mungkin terus-menerus berjalan dan mengubah banyak hal. Itu hanya tebakan saya, tetapi itu cukup masuk akal jika Anda memikirkannya.
Ada beberapa saran untuk solusi serupa yang beredar di luar sana yang melibatkan mengelabui SharePoint untuk menerima nilai Hari Ini dengan membuat kolom bernama Hari Ini terlebih dahulu, lalu menambahkannya ke rumus Anda, lalu menghapusnya. Ini semua baik dan bagus, tetapi ingat apa yang saya katakan tentang ketika kolom terhitung diperbarui. Nilai ini hanya akan berubah saat item diperbarui, yang berarti nilai Anda akan segera salah, terutama dalam hal penghitungan hari.
Saya telah melihat orang lain menggunakan JavaScript cerdas untuk menulis nilai ke halaman. Ini juga akan berhasil, tetapi saya cukup tegas menentang skrip klien ketika itu dapat dihindari.
Implementasi:
Jadi apa yang harus dilakukan? Kolom terhitung tidak mungkin untuk apa yang disebut fungsi "volatile" seperti Today. Ada kemungkinan bahwa kami dapat mengembangkan beberapa kode khusus untuk menangani ini bagi kami seperti Kolom Komputasi, pekerjaan timer, atau proses terjadwal untuk datang dan memperbarui setiap item yang membutuhkan perhitungan ini. Itu membawa kita kembali ke masalah kinerja yang saya sebutkan di paragraf terakhir, dan selain itu adalah solusi rapuh yang akan sangat spesifik untuk situs/daftar/kolom yang dimaksud. Di atas dua kekhawatiran itu, Anda juga harus mencari pria kutu buku, seperti saya, yang tahu cara membuat kode dan membujuknya untuk mengembangkan solusi ini untuk Anda. Tapi ada cara yang lebih mudah!
Jika Anda memiliki hak untuk membuat bidang dan mengedit halaman di situs Anda, dan memiliki sedikit pengetahuan tentang XSLT dan membuat tampilan, Anda dapat menyusun templat XSL yang dapat disertakan dalam tampilan daftar dan akan dengan setia menghitung nilai Anda setiap kali halaman diminta. Skenario ini menghilangkan kekhawatiran kami atas performa, dan tidak memerlukan kode kustom untuk dikembangkan dan disebarkan melalui solusi.
Sempurna. Jadi bagaimana kita melakukannya?
- Buat atau pilih bidang yang akan bertindak sebagai sumber kami. Harus berupa tipe tanggal.
- Buat bidang kami yang akan bertindak sebagai placeholder untuk nilai yang sedang dihitung.
- Tambahkan kedua bidang ini ke tipe konten dan tambahkan tipe konten tersebut ke daftar.
- Buat tampilan daftar tersebut yang berisi kolom sumber dan tempat penampung.
- Unggah templat XSL ke Pustaka Gaya.
- Atur properti "Tautan XSL" untuk Komponen Web Tampilan Daftar melalui UI.
- Berhasil!
Mari kita jelajahi contoh kasus penggunaan dan telusuri implementasinya. Pelanggan kami menginginkan tampilan daftar utama mereka yang akan memberi tahu mereka berapa lama item daftar tertentu telah berada pada statusnya. Daftar ini berisi tipe konten situs kustom yang diambil dari tipe Item dan ditambahkan ke daftar. Sudah ada penerima peristiwa yang menangkap setiap kali bidang status pada item daftar diubah dan menyimpan tanggal tersebut ke kolom yang disebut "Tanggal Status Diubah". Semua kabel ini tidak diperlukan, dan dapat dilakukan dengan bidang tanggal APA pun (kebetulan ini adalah implementasi kami tetapi jangan ragu untuk bereksperimen). Minimum yang Anda perlukan adalah bidang tanggal sumber dan bidang placeholder untuk menahan perhitungan Anda (selengkapnya tentang ini di paragraf berikutnya) ditambahkan ke daftar Anda, meskipun saya sarankan Anda menggunakan kolom situs dan tipe konten situs jika Anda ingin menggunakan kembali solusi ini di tempat lain di situs Anda.
Jadi kami memiliki tanggal sumber yang dapat kami gunakan dalam penghitungan kami terhadap tanggal hari ini. Kini kita dapat membuat kolom situs kustom untuk digunakan sebagai wadah untuk nilai terhitung kita. Dalam hal ini saya memilih untuk menggunakan kolom terhitung karena tidak akan dapat diubah pada formulir item baru atau edit, tetapi dapat dipilih untuk ditampilkan dalam tampilan karena kami tidak ingin pengguna memasukkan nilai arbitrer ke kolom ini. Mungkin membingungkan mengapa itu tidak ditampilkan dalam tampilan, dll.
Setelah kami memiliki kolom situs, kami dapat menambahkannya ke tipe konten yang akan digunakan dalam daftar kami. Selanjutnya, kita perlu membuat tampilan kita yang nantinya akan disesuaikan dengan XSLT kita. Pastikan Anda membuat tampilan standar yang berisi kolom tanggal sumber dan kolom kalkulasi baru yang akan bertindak sebagai placeholder untuk nilai yang dihitung.
Kami kini memiliki semua yang kami perlukan untuk mendukung laporan penuaan kustom kami. Yang tersisa hanyalah membuat templat XSL kami, mengunggahnya ke Pustaka Gaya situs, dan menautkannya ke tampilan daftar kami. Templat XSL yang akan kami gunakan akan berisi beberapa markup normal yang dihasilkan SharePoint untuk menghasilkan tampilan serta markup kustom kami sendiri yang digunakan untuk menimpa bagian-bagian tertentu dari ini dan menghitung nilai yang kami inginkan untuk kami.
Memberikan kredit di mana kredit harus dilakukan, templat XSL untuk melakukan perhitungan aktual yang saya gunakan untuk solusi ini disediakan dengan ramah oleh "swirch" di forum MSDN:
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/
Unduh lembar gaya XSL (aging.zip) yang telah saya kumpulkan terletak di sini:
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104
Membuka ini di editor teks favorit Anda, Anda akan melihat banyak markup SharePoint XSL normal untuk merender tampilan, jika Anda terus menggulir ke bawah ke baris 357 Anda akan melihat awal templat kustom yang saya tambahkan ke markup, yang pertama adalah templat "DateDiff" diikuti oleh "calculate-julian-day" dan "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Ini adalah tiga templat kami yang akan membuat dan menampilkan penghitungan kami dalam tampilan kami. Jika Anda akan menggunakan nama bidang yang berbeda dari yang ditentukan sebelumnya dalam artikel ini, Anda perlu menelusuri templat ini dan mengganti referensi apa pun ke nama lain. Ingat, untuk ini Anda sebaiknya menggunakan nama INTERNAL bidang bukan nama tampilan.
Setelah Anda puas bahwa templat sudah siap digunakan, navigasikan ke Pustaka Gaya dan unggah ke folder "Lembar Gaya XSL", lalu salin tautan ke file. Ini akan memungkinkan kami untuk dengan mudah membuat perubahan pada itu nanti, atau menambahkannya ke berbagai bagian situs sesuai keinginan kami.
Selanjutnya, masuk ke daftar Anda dan pilih tampilan yang Anda buat sebelumnya dalam artikel ini. Dari menu "Tindakan Situs" klik "Edit Halaman".
Temukan Komponen Web Tampilan Daftar Anda di halaman dan buka menu Komponen Web dengan mengeklik panah kecil yang menghadap ke bawah di sudut kanan atas. Dari menu ini, pilih "Edit Komponen Web".
Tindakan ini akan membuka menu Komponen Web di sisi kanan jendela browser Anda.
Klik + untuk bagian "Lain-lain" dan temukan properti "Tautan XSL".
Tempelkan tautan ke file XSL di Pustaka Gaya yang Anda salin sebelumnya (ini dapat berupa tautan relatif atau absolut).
Klik "OK" untuk menyimpan perubahan, lalu klik tombol "Hentikan Pengeditan" di pita "Halaman" di bagian atas halaman.
Jika semuanya dikonfigurasi dengan benar, kini Anda akan melihat angka di kolom "Hari Pada Status".
Dan akhirnya, inilah tampilannya dengan beberapa data pengujian dari berbagai tanggal:
Ringkasan:
Itu dia: cara yang diformat dengan baik, kuat, dan berkinerja lebih baik untuk membuat laporan lama di SharePoint., lengkap dengan implementasi no-code sederhana. Ini memiliki beberapa aplikasi potensial selain satu kasus penggunaan yang kami jelajahi di sini. Skenario umum lainnya untuk jenis laporan ini adalah melampirkannya ke daftar tugas sehingga Anda dapat melihat secara sekilas sudah berapa lama sejak tugas dibuat secara sekilas.
Silakan dinikmati!
--Justin
Justin Joyce, LANtek
Komentar
Langkah-langkah hilang
8/10/2012 03:51
ok Saya mengikuti langkah-langkahnya, tetapi pasti ada sesuatu yang hilang - bagaimana XSL tahu tanggal mana yang harus digunakan, atau bidang mana yang harus ditambahkan hari sejak itu? Benci ketika langkah terlewat.
No-Code, setuju!
30/08/2012 12:12
Saya setuju - saya tidak berpikir ini benar-benar dihitung sebagai "tidak ada kode".
Menariknya, melalui beberapa kekacauan SharePoint, saya memiliki kolom terhitung yang berfungsi menggunakan Hari Ini... tidak yakin bagaimana atau mengapa karena saya tidak bisa membuatnya lagi, tetapi yang itu masih ada dan berfungsi.
Rumus untuk kolom terhitung "Hari di Status"?
02/05/2012 07:39
Justin - Apa rumus yang Anda gunakan untuk kolom situs terhitung "Hari Di Status" (kolom placeholder)? Apakah itu "=hari ini"?
SharePoint 2007
2/12/2011 11:29 PM
Saat ini saya belum mencoba menerapkan solusi ini ke SharePoint 2007, namun saya sedang mencarinya. Sayangnya, tidak ada properti XslLink yang muncul di komponen web melalui UI.
Posting Bagus
30/11/2011 09:53
Halo,
Posting yang bagus.
Saya menggunakan SharePoint 2007.
Saya tidak memiliki bagian Lain-lain seperti yang disebutkan di atas.
Apakah Anda memiliki langkah-langkah untuk konfigurasi SP2007?
Terima kasih.
Re: Solusi tanpa kode: Menampilkan hari sejak item daftar SharePoint terakhir diubah
10/11/2011 08:24
Hai Chris.
Penemuan yang luar biasa!
Saya akan melihat apa yang Anda posting semoga nanti hari ini dan melihat apakah saya dapat membuat solusi ini sedikit lebih kuat.
Saya senang Anda menyukai postingan ini, dan saya sangat senang Anda dapat menemukan solusi untuk format tanggal Eropa. :)
-Justin
Solusi untuk format tanggal Eropa
10/11/2011 06:45
Hai lagi Justin,
FYI, saya menemukan solusi untuk masalah yang saya sebutkan sebelumnya di halaman ini;
https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/
Format Tanggal Eropa
07/10/2011 03:59
Hai Justin,
Ini adalah solusi yang sangat bagus terima kasih, dan hanya hal yang saya habiskan dua hari terakhir untuk mencari! Namun saya memiliki sedikit masalah dengannya dan saya berharap Anda dapat membantu saya.
Saya telah mengubah kode Anda sedikit untuk menghitung jumlah hari sampai sesuatu terjadi, bukan sejak itu, dengan mengganti variabel di baris terakhir fungsi "DateDiff";
<xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of>
Namun saya hanya bisa membuatnya untuk mengoceh perbedaan dengan benar setengah dari waktu. Jadi misalnya dengan tanggal ini (format dd/MM/yyyy);
30/12/2011
Penghitungan dihitung dengan benar, tetapi dengan tanggal ini (format yang sama)
12/10/2011
Ini dihitung seolah-olah 10-Dec-2011 daripada 12-Oct-2011.
Saya mencoba mengganti posisi nilai hari dan bulan dalam variabel "JulianStartDate", seperti ini;
<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)"/>
Dan ini memperbaiki masalah dengan kencan kedua, namun kemudian salah untuk kencan pertama!
Saya juga telah mencoba mengubah panggilan FormatDateTime untuk menggunakan LCD Eropa dan berbagai perubahan pada parameter terakhir FormatDateTime (misalnya ddMMyyyy, MMddyyyy) dengan penyesuaian yang sesuai pada parameter posisi substring tanpa hasil.
Saya akan sangat menghargai saran apa pun yang dapat Anda tawarkan.
Terima kasih,
Chris
No-Code
21/09/2011 04:27
Saya tidak berpikir bahwa XSL memenuhi syarat sebagai solusi "no-code", karena memahami bahasa XSL bukan untuk semua orang - namun tidak melibatkan pemrograman. Selain itu: Solusi bagus, terima kasih!