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