โซลูชันแบบไม่มีโค้ด: การแสดงจํานวนวันตั้งแต่มีการเปลี่ยนแปลงข้อมูลในรายการครั้งล่าสุด
นำไปใช้กับ
โดย Justin Joyce, LANtek
หมายเหตุ: บทความนี้เป็นส่วนหนึ่งของคอลเลกชันโพสต์จากสี่ปีของบล็อก Get the Point สําหรับผู้ใช้ SharePoint
ภาพรวม: รายงานอายุที่กําหนดเองที่ไม่มีรหัส
ส่วนการทํางานที่ร้องขอบ่อยส่วนหนึ่งของไซต์ SharePoint คือรายงานอายุสําหรับงานหรือข้อมูลในรายการ กล่าวอีกนัยหนึ่งคือ จํานวนวัน/เดือนนับตั้งแต่ที่ข้อมูลในรายการนี้ถูกปรับเปลี่ยนครั้งล่าสุด
บนพื้นผิวนี้ดูเหมือนจะเป็นคําขอที่ง่ายมาก ท้ายที่สุด เรามีวันที่สําหรับรายการที่ถูกสร้างและปรับเปลี่ยน เรามีความสามารถในการจัดเก็บวันที่แบบกําหนดเองเมื่อมีการเปลี่ยนแปลงบางอย่างกับรายการผ่านตัวรับเหตุการณ์ เรามีคอลัมน์จากการคํานวณที่เราสามารถรวมสูตรที่คล้ายกับ Excel เพื่อทํางานกับข้อมูลของเรา ดูเหมือนว่าข้อเสนอนี้ค่อนข้างตรงไปตรงมา เราเลือกเขตข้อมูลวันที่ สร้างคอลัมน์จากการคํานวณ แล้วทําสูตรตามบรรทัดของ [DateField] – [Today] อ้า ยังเร็วไม่หรอก! ตามที่ทุกคนที่พยายามทํางาน "ง่าย" นี้รู้ว่าการพยายามใช้บางอย่างเช่น [วันนี้] ในคอลัมน์จากการคํานวณทําให้เกิดปัญหา ลองแทรก [วันนี้] ลงในกล่องสูตรของคอลัมน์จากการคํานวณของคุณจะให้ข้อความแสดงข้อผิดพลาดดังนี้:
ทําไมจึงเป็นเช่นนี้ มันจะต้องเกี่ยวข้องกับวิธีคํานวณคอลัมน์จากการคํานวณ
ลองมาดูสูตรอย่างง่ายเป็นตัวอย่าง:
= IF( [Column1]<=[Column2], "OK", "Not OK")
ทั้งหมดนี้หมายความว่าถ้า Column1 น้อยกว่าหรือเท่ากับ คอลัมน์ 2 ให้แสดง ตกลง มิเช่นนั้นให้แสดง ไม่ตกลง นี่คือสูตรพื้นฐานทั่วไปสําหรับคอลัมน์จากการคํานวณ และเป็นสมมติฐานพื้นฐานเกี่ยวกับข้อมูลในรายการที่มีคอลัมน์เหล่านี้: ค่าสําหรับ คอลัมน์ 1 และ คอลัมน์ 2 จะไม่สามารถเปลี่ยนแปลงได้ถ้าไม่มีเหตุการณ์ Update ในข้อมูลในรายการ
ใช่แล้ว คอลัมน์จากการคํานวณจะคํานวณใหม่เมื่อรายการถูกอัปเดต (หรือสร้าง) ขึ้นเท่านั้น เนื่องจากถือว่าข้อมูลที่คุณกําลังคํานวณอยู่ในรายการนั้น ซึ่งจะสร้างปัญหาเมื่อคุณพยายามใช้สิ่งที่เปลี่ยนแปลงโดยอิสระจากเขตข้อมูลของรายการ เช่น วันที่ของวันนี้
ตอนนี้ฉันไม่ได้อยู่ในการประชุมที่พวกเขาตัดสินใจว่านี่คือวิธีที่คอลัมน์จากการคํานวณจะทํางานอย่างไรก็ตามถ้าฉันต้องทําให้การคาดเดาการศึกษาฉันจะสมมติว่าพวกเขาทํางานด้วยวิธีนี้เพื่อประสิทธิภาพ ลองนึกภาพถ้าคุณมีรายการหลายพันรายการ โดยแต่ละรายการมีคอลัมน์จากการคํานวณที่ต้องการการอัปเดต "live" นั่นหมายความว่ากลไกบางอย่าง อาจเป็นงานตัวจับเวลา อาจต้องวนซ้ําทีละรายการที่มีคอลัมน์จากการคํานวณอยู่บ่อยๆ และอัปเดตค่าของคอลัมน์นั้น ซึ่งอาจเป็นการเสียภาษีอย่างมากในแง่ของประสิทธิภาพเนื่องจากการปรับใช้ที่มีขนาดใหญ่ขึ้นงานนี้อาจทํางานและเปลี่ยนแปลงสิ่งต่างๆ อย่างต่อเนื่อง นั่นเป็นเพียงการคาดเดาของฉัน แต่มันค่อนข้างสมเหตุสมผลถ้าคุณคิดเกี่ยวกับมัน
มีคําแนะนําบางอย่างสําหรับโซลูชันที่คล้ายกันซึ่งลอยออกไปที่นั่นซึ่งเกี่ยวข้องกับการหลอกให้ SharePoint ยอมรับค่า วันนี้ โดยการสร้างคอลัมน์ที่ชื่อว่า วันนี้ ก่อนแล้วจึงเพิ่มไปยังสูตรของคุณ แล้วลบออก ทั้งหมดนี้ดีและดี แต่โปรดจําไว้ว่าสิ่งที่ฉันพูดเมื่อคอลัมน์จากการคํานวณได้รับการอัปเดต ค่านี้จะเปลี่ยนแปลงเฉพาะเมื่อมีการอัปเดตรายการ ซึ่งหมายความว่าค่าของคุณจะไม่ถูกต้องเร็วๆ นี้ โดยเฉพาะในกรณีของการคํานวณวัน
ฉันเคยเห็นผู้อื่นใช้ JavaScript ฉลาดในการเขียนค่าลงในหน้า สิ่งนี้จะใช้งานได้เช่นกัน แต่ฉันค่อนข้างเป็นประเภทกับสคริปต์ลูกค้าเมื่อสามารถหลีกเลี่ยงได้
การใช้งาน:
แล้วต้องทําอย่างไร คอลัมน์จากการคํานวณอยู่นอกคําถามที่เรียกว่าฟังก์ชัน "เปลี่ยนแปลงได้" เช่น Today เป็นไปได้ว่าเราสามารถพัฒนาโค้ดแบบกําหนดเองบางอย่างเพื่อจัดการสิ่งนี้ให้กับเรา เช่น คอลัมน์จากการคํานวณ งานตัวจับเวลา หรือกระบวนการตามกําหนดการเพื่อมาและอัปเดตทุกรายการที่ต้องการทําการคํานวณนี้ นั่นทําให้เรากลับมาที่ปัญหาของประสิทธิภาพที่ฉันกล่าวถึงในย่อหน้าสุดท้ายและนอกจากนี้มันเป็นวิธีการแก้ปัญหาเปราะที่จะมีความเฉพาะเจาะจงสูงสําหรับไซต์ / รายการ / คอลัมน์ในคําถาม ด้านบนของข้อกังวลทั้งสองนั้นคุณจะต้องไปหาคนโง่เช่นตัวฉันเองที่รู้วิธีเขียนโค้ดและชักชวนให้เขาพัฒนาโซลูชันนี้สําหรับคุณ แต่มีวิธีที่ง่ายกว่านั้น!
ถ้าคุณมีสิทธิ์ในการสร้างเขตข้อมูลและแก้ไขหน้าบนไซต์ของคุณ และมีความรู้เล็กน้อยเกี่ยวกับ XSLT และการสร้างมุมมอง คุณสามารถรวบรวมเทมเพลต XSL ที่สามารถรวมอยู่ในมุมมองรายการและจะคํานวณค่าของคุณอย่างสมจริงทุกครั้งที่มีการร้องขอหน้า สถานการณ์นี้จะขจัดความกังวลของเราเกี่ยวกับประสิทธิภาพการทํางาน และไม่จําเป็นต้องมีการพัฒนาโค้ดแบบกําหนดเองและปรับใช้ผ่านโซลูชัน
ยอดเยี่ยม แล้วเราจะทํายังไงดีล่ะ?
-
สร้างหรือเลือกฟิลด์ที่จะทําหน้าที่เป็นแหล่งข้อมูลของเรา ต้องเป็นชนิดวันที่
-
สร้างเขตข้อมูลของเราที่จะทําหน้าที่เป็นพื้นที่ที่สํารองไว้สําหรับค่าที่จะถูกคํานวณ
-
เพิ่มเขตข้อมูลทั้งสองนี้ลงในชนิดเนื้อหา และเพิ่มชนิดเนื้อหานั้นลงในรายการ
-
สร้างมุมมองของรายการที่มีทั้งคอลัมน์ต้นฉบับและพื้นที่ที่สํารองไว้
-
อัปโหลดเทมเพลต XSL ไปยังไลบรารี สไตล์
-
ตั้งค่าคุณสมบัติ "ลิงก์ XSL" สําหรับ Web Part สําหรับมุมมองรายการผ่าน UI
-
สำเร็จ!
ลองสํารวจตัวอย่างกรณีใช้งานและแนะนําการใช้งาน ลูกค้าของเราต้องการมุมมองของรายการหลักของพวกเขาที่จะบอกให้พวกเขาทราบว่าข้อมูลในรายการนั้นๆ นั่งอยู่ที่สถานะนานเท่าใด รายการนี้มีชนิดเนื้อหาของไซต์แบบกําหนดเองที่ได้รับมาจากชนิด รายการ และถูกเพิ่มลงในรายการ มีตัวรับเหตุการณ์อยู่แล้วโดยที่จับภาพทุกครั้งที่เขตข้อมูลสถานะบนข้อมูลในรายการถูกเปลี่ยน และบันทึกวันที่นั้นลงในคอลัมน์ที่เรียกว่า "วันที่สถานะเปลี่ยน" ไม่จําเป็นต้องใช้สายไฟทั้งหมดนี้และสามารถทําได้ด้วยเขตข้อมูลวันที่ใด ๆ (มันเพิ่งเกิดขึ้นนี่คือการใช้งานของเรา แต่อย่าลังเลที่จะทดลอง) ค่าน้อยที่สุดที่คุณจะต้องการคือเขตข้อมูลวันที่ต้นทางและพื้นที่ที่สํารองไว้ของคุณเพื่อเก็บการคํานวณของคุณ (เพิ่มเติมในย่อหน้าถัดไป) ที่เพิ่มลงในรายการของคุณ แม้ว่าฉันขอแนะนําให้คุณใช้คอลัมน์ไซต์และชนิดเนื้อหาของไซต์ในกรณีที่คุณต้องการนําโซลูชันนี้มาใช้ใหม่ในที่อื่นๆ บนไซต์ของคุณ
ดังนั้นเราจึงมีวันที่ต้นทางของเราที่เราสามารถใช้ในการคํานวณของเรากับวันที่ของวันนี้ ตอนนี้เราสามารถสร้างคอลัมน์ไซต์แบบกําหนดเองเพื่อใช้เป็นคอนเทนเนอร์สําหรับค่าจากการคํานวณของเรา ในกรณีนี้ ฉันเลือกที่จะใช้คอลัมน์จากการคํานวณเนื่องจากไม่สามารถเปลี่ยนบนฟอร์มรายการใหม่หรือฟอร์มแก้ไขรายการ แต่สามารถเลือกให้แสดงในมุมมองได้ เนื่องจากเราไม่ต้องการให้ผู้ใช้ใส่ค่าที่กําหนดเองในคอลัมน์นี้ อาจเป็นเรื่องที่น่าสับสนว่าเหตุใดจึงไม่แสดงในมุมมอง เป็นต้น
ตอนนี้เรามีคอลัมน์เว็บไซต์ของเราเราสามารถเพิ่มลงในประเภทเนื้อหาของเราที่จะใช้ในรายการของเรา ต่อไป เราจําเป็นต้องสร้างมุมมองของเราซึ่งจะปรับแต่งด้วย XSLT ของเราในภายหลัง ตรวจสอบให้แน่ใจว่าคุณสร้างมุมมองมาตรฐานที่มีคอลัมน์วันที่ต้นทางและคอลัมน์จากการคํานวณใหม่ของคุณซึ่งจะทําหน้าที่เป็นพื้นที่ที่สํารองไว้สําหรับค่าจากการคํานวณ
ตอนนี้เรามีทุกอย่างในสถานที่ที่เราจะต้องสนับสนุนรายงานอายุที่กําหนดเองของเรา สิ่งที่เหลืออยู่คือการสร้างเทมเพลต XSL ของเราอัปโหลดไปยังไลบรารีสไตล์ของเว็บไซต์และเชื่อมโยงไปยังมุมมองรายการของเรา เทมเพลต XSL ที่เราจะใช้จะมีมาร์กอัปที่สร้างโดย SharePoint ตามปกติสําหรับการสร้างมุมมองและมาร์กอัปแบบกําหนดเองของเราใช้ในการแทนที่บางส่วนของสิ่งนี้และคํานวณค่าที่ต้องการของเรา
ให้เครดิตเมื่อเครดิตครบกําหนดเทมเพลต XSL สําหรับทําการคํานวณจริงที่ฉันใช้สําหรับโซลูชันนี้ให้บริการโดย "swirch" บนฟอรั่ม MSDN: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
การเปิดสิ่งนี้ขึ้นในตัวแก้ไขข้อความโปรดของคุณ คุณจะเห็นมาร์กอัป XSL ของ SharePoint ปกติมากมายสําหรับการแสดงมุมมอง ถ้าคุณเลื่อนลงไปที่บรรทัด 357 คุณจะเห็นจุดเริ่มต้นของเทมเพลตแบบกําหนดเองที่ฉันเพิ่มลงในมาร์กอัป เทมเพลตแรกเป็นเทมเพลต "DateDiff" ตามด้วย "calculate-julian-day" และ "FieldRef_printTableCell_EcbAllowed Days_x0020_At_x0020_Status" นี่คือเทมเพลตสามแบบของเราที่จะทําและแสดงการคํานวณของเราในมุมมองของเรา ถ้าคุณจะใช้ชื่อเขตข้อมูลที่ต่างจากที่ระบุไว้ก่อนหน้าในบทความนี้ คุณจะต้องไปที่เทมเพลตเหล่านี้และแทนที่การอ้างอิงใดๆ ไปยังชื่ออื่น โปรดทราบว่า สําหรับสิ่งนี้ คุณจะต้องใช้ชื่อภายในของฟิลด์ไม่ใช่ชื่อที่แสดง
เมื่อคุณพอใจแล้วว่าเทมเพลตพร้อมใช้งาน ให้นําทางไปยังไลบรารีสไตล์ของคุณและอัปโหลดภายใต้โฟลเดอร์ "สไตล์ชีต XSL" จากนั้นคัดลอกลิงก์ไปยังไฟล์ วิธีนี้จะช่วยให้เราสามารถทําการเปลี่ยนแปลงได้อย่างง่ายดายในภายหลังหรือเพิ่มลงในส่วนต่าง ๆ ของเว็บไซต์ตามที่เราโปรด
ถัดไป ให้ไปที่รายการของคุณและเลือกมุมมองที่คุณสร้างไว้ก่อนหน้าในบทความนี้ จากเมนู "การดําเนินการในเว็บไซต์" ให้คลิกที่ "แก้ไขหน้า"
ค้นหา Web Part สําหรับมุมมองรายการของคุณบนหน้า และเปิดเมนู Web Part โดยคลิกที่ลูกศรชี้ลงขนาดเล็กที่มุมขวาบน จากเมนูนี้ ให้เลือก "แก้ไข Web Part"
การทําเช่นนี้จะเปิดเมนูของ Web Part ทางด้านขวามือของหน้าต่างเบราว์เซอร์ของคุณ
คลิก + สําหรับส่วน "เบ็ดเตล็ด" และค้นหาคุณสมบัติ "ลิงก์ XSL"
วางลิงก์ไปยังไฟล์ XSL ของคุณในไลบรารีสไตล์ที่คุณคัดลอกไว้ก่อนหน้านี้ (ซึ่งอาจเป็นลิงก์แบบสัมพัทธ์หรือสัมบูรณ์)
คลิก "ตกลง" เพื่อบันทึกการเปลี่ยนแปลงของคุณ จากนั้นคลิกปุ่ม "หยุดการแก้ไข" บน Ribbon "หน้า" ที่ด้านบนของหน้า
หากทุกอย่างได้รับการกําหนดค่าอย่างถูกต้อง คุณควรเห็นตัวเลขในคอลัมน์ "Days At Status" ของคุณ
และสุดท้ายนี่คือสิ่งที่มันจะมีลักษณะเหมือนกับข้อมูลการทดสอบบางส่วนของวันที่ต่างๆ:
สรุป:
มีคือ: มีรูปแบบที่ดีมีเสถียรภาพและมีประสิทธิภาพมากขึ้นวิธีในการสร้างรายงานอายุใน SharePoint สมบูรณ์ด้วยการใช้งานแบบไม่มีโค้ดที่เรียบง่าย นี้มีแอปพลิเคชั่นที่เป็นไปได้ค่อนข้างน้อยนอกเหนือจากกรณีการใช้งานเดียวที่เราสํารวจที่นี่ สถานการณ์สมมติทั่วไปอีกประการหนึ่งสําหรับรายงานชนิดนี้คือการแนบรายงานนั้นกับรายการงาน เพื่อให้คุณสามารถดูระยะเวลาที่รายงานถูกสร้างขึ้นได้อย่างรวดเร็ว
ขอให้สนุก!
--จัสติน
Justin Joyce, LANtek
ข้อคิดเห็น
ขั้นตอนที่หายไป
10/8/2012 3:51 AM ตกลง ฉันทําตามขั้นตอน แต่ต้องมีบางอย่างหายไป - XSL จะทราบวันที่ที่จะใช้หรือเขตข้อมูลใดที่จะเพิ่มวันตั้งแต่วันลงไป เมื่อพลาดขั้นตอนไม่มีรหัส, เห็นด้วย!
30/8/2555 12:12 น. ฉันเห็นด้วย - ฉันไม่คิดว่านี่เป็น "ไม่มีรหัส" จริงๆ น่าสนใจผ่านการเมาของ SharePoint ฉันมีคอลัมน์จากการคํานวณที่ทํางานโดยใช้วันนี้... ไม่แน่ใจว่าทําไมหรือเพราะฉันไม่สามารถทําให้มันกลับมาทําอีกครั้ง แต่หนึ่งยังคงอยู่ที่นั่นและทํางานสูตรสําหรับคอลัมน์จากการคํานวณ "Days At Status" ใช่หรือไม่
2/5/2012 7:39 น. Justin - สูตรใดที่คุณใช้สําหรับคอลัมน์ไซต์จากการคํานวณ "Days At Status" ของคุณ (คอลัมน์พื้นที่ที่สํารองไว้) "=today" ใช่หรือไม่SharePoint 2007
12/2/2011 11:29 AM ขณะนี้ฉันไม่ได้พยายามนําโซลูชันนี้ไปใช้กับ SharePoint 2007 แต่ฉันกําลังค้นหาอยู่ น่าเสียดายที่ไม่มีคุณสมบัติ XslLink แสดงบน Web Part ผ่านทาง UIโพสต์
ที่ดี 11/30/2011 9:53 AM สวัสดี โพสต์ที่ยอดเยี่ยม ฉันกําลังใช้ SharePoint 2007 อยู่ ฉันไม่มีส่วน Misc ตามที่ระบุไว้ข้างต้น คุณมีขั้นตอนสําหรับการกําหนดค่า SP2007 หรือไม่ ขอบคุณRe: No-code solution: การแสดงวันตั้งแต่มีการเปลี่ยนแปลง
ข้อมูลในรายการ SharePoint ครั้งล่าสุด 10/11/2011 8:24 AM สวัสดีคริส การค้นหาที่ยอดเยี่ยม! ฉันจะดูสิ่งที่คุณโพสต์หวังว่าภายหลังในวันนี้และดูว่าฉันสามารถทําให้การแก้ปัญหานี้มีเสถียรภาพมากขึ้นเล็กน้อย ฉันดีใจที่คุณชอบโพสต์และฉันดีใจมากที่คุณสามารถหาวิธีแก้ปัญหารูปแบบวันที่ในยุโรปได้ :) -จัสตินโซลูชันสําหรับรูปแบบวันที่แบบhttps://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/
ยุโรป 10/11/2011 6:45 AM สวัสดีจัสติน อีกครั้ง ฉันพบวิธีแก้ปัญหาสําหรับปัญหาที่ฉันกล่าวถึงก่อนหน้านี้ในหน้า นี้รูปแบบวันที่แบบ
ยุโรป 10/7/2011 3:59 AM สวัสดีจัสติน นี่เป็นทางออกที่ดีจริงๆและเป็นเพียงแค่สิ่งที่ฉันใช้เวลาสองวันที่ผ่านมาเพื่อค้นหา! อย่างไรก็ตามฉันมีปัญหาเล็กน้อยกับมันและฉันหวังว่าคุณจะช่วยฉันได้ ฉันได้เปลี่ยนรหัสของคุณเล็กน้อยเพื่อคํานวณจํานวนวันจนกว่าจะเกิดเหตุการณ์บางอย่างขึ้น แทนที่จะเปลี่ยนตัวแปรในบรรทัดสุดท้ายของฟังก์ชัน "DateDiff" <xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of> อย่างไรก็ตามฉันสามารถทําให้มันคํานวณความแตกต่างได้อย่างถูกต้องครึ่งหนึ่งของเวลา ตัวอย่างเช่น ด้วยวันที่นี้ (จัดรูปแบบวว/ดด/ปปป); 30/12/2011 โดยจะคํานวณได้อย่างถูกต้อง แต่ด้วยวันที่นี้ (รูปแบบเดียวกัน) 12/10/2011 โดยจะคํานวณราวกับว่า 10 ธ.ค. 2554 แทนที่จะเป็น 12 ต.ค. 2554 ฉันพยายามสลับตําแหน่งของค่าวันและเดือนในตัวแปร "JulianStartDate" เช่นนี้ <xsl:with-param name="Month" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMdd'),7,2)"/> <xsl:with-param name="Day" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMdd'),5,2)"/> และวิธีนี้ได้แก้ไขปัญหาเกี่ยวกับวันที่ที่สอง แต่วันที่นั้นไม่ถูกต้องสําหรับวันที่แรก! นอกจากนี้ ฉันได้ลองเปลี่ยนการโทร FormatDateTime เพื่อใช้ LCID ของยุโรปและการเปลี่ยนแปลงต่างๆ กับพารามิเตอร์สุดท้ายของ FormatDateTime (เช่น ddMyyyy, MMddyyy) ด้วยการปรับเปลี่ยนที่เหมาะสมกับพารามิเตอร์ตําแหน่งของสตริงย่อยโดยไม่ประสบความสําเร็จ ผมขอขอบคุณเป็นอย่างยิ่งสําหรับคําแนะนําที่คุณเสนอได้ ขอบคุณ คริสNo-Code
9/21/2011 4:27 AM ฉันไม่คิดว่า XSL มีคุณสมบัติเป็นโซลูชัน "ไม่มีโค้ด" เนื่องจากการทําความเข้าใจภาษา XSL ไม่ใช่สําหรับทุกคน - อย่างไรก็ตามมันไม่ได้เกี่ยวข้องกับการเขียนโปรแกรม นอกจากนั้น: ทางออกที่ดีขอบคุณ!