เทมเพลตข้อมูลสำหรับ Order to Cash: การประมวลผลคำสั่งซื้อขาย
เทมเพลตข้อมูลสำหรับ Order to Cash: การประมวลผลคำสั่งซื้อขาย
- แอตทริบิวต์ที่แนะนำให้รวบรวม
- กิจกรรมสำคัญที่ควรติดตาม
- แนวทางดึงข้อมูลจาก SAP ECC
แอตทริบิวต์ของ Order to Cash: การประมวลผลคำสั่งซื้อขาย
| ชื่อ | คำอธิบาย | ||
|---|---|---|---|
| ใบสั่งขาย SalesOrder | รหัสเฉพาะของเอกสารใบสั่งขาย ใช้เป็น Case ID หลักสำหรับติดตามกระบวนการ Order-to-Cash ทั้งหมด. | ||
| คำอธิบาย ใบสั่งขายเป็นเอกสารหลักในกระบวนการขาย ใช้บันทึกคำขอซื้อสินค้าหรือบริการจากลูกค้า และมีข้อมูลที่จำเป็นต่อการดำเนินการตั้งแต่ต้นจนจบ. ใน process mining ค่านี้ใช้เป็น Case ID โดยหมายเลขใบสั่งขายแต่ละหมายเลขแทนกระบวนการหนึ่งรายการตั้งแต่ต้นจนจบ การวิเคราะห์ตามใบสั่งขายช่วยติดตามวงจรทั้งหมด วัดระยะเวลาดำเนินการ และค้นหาความแตกต่างของใบสั่งซื้อแต่ละรายการ. เหตุผลที่สำคัญ เป็นคีย์สำคัญที่ใช้เชื่อมโยงกิจกรรมและเหตุการณ์ที่เกี่ยวข้องทั้งหมด ทำให้วิเคราะห์เส้นทางของใบสั่งซื้อแต่ละรายการตั้งแต่ต้นจนจบได้ครบถ้วน. แหล่งข้อมูล อยู่ในตารางข้อมูลส่วนหัวของเอกสารการขาย (VBAK) ในช่อง VBELN. ตัวอย่าง 900001234590000123469000012347 | |||
| กิจกรรม Activity | ชื่อขั้นตอนทางธุรกิจหรือเหตุการณ์ที่เกิดขึ้นในกระบวนการใบสั่งขาย. | ||
| คำอธิบาย แอตทริบิวต์นี้อธิบายขั้นตอนหนึ่งในกระบวนการ Order-to-Cash เช่น “สร้างใบสั่งขาย” “สร้างรายการส่งมอบ” หรือ “รับชำระเงิน” กิจกรรมเหล่านี้เป็นองค์ประกอบที่ใช้สร้างลำดับการทำงานของใบสั่งขายแต่ละรายการขึ้นใหม่. การวิเคราะห์ลำดับและเวลาของกิจกรรมเป็นหัวใจของ process mining ช่วยให้เห็นแผนผังกระบวนการ ระบุคอขวด ค้นหารูปแบบกระบวนการที่แตกต่างกัน และตรวจสอบการปฏิบัติตามข้อกำหนดเทียบกับโมเดลมาตรฐาน โดยทั่วไปจะอนุมานกิจกรรมจากเหตุการณ์สร้างเอกสาร การเปลี่ยนสถานะ หรือรหัสธุรกรรมเฉพาะที่บันทึกไว้ในระบบ. เหตุผลที่สำคัญ กิจกรรมเป็นองค์ประกอบหลักของแผนผังกระบวนการ ช่วยให้เห็นและวิเคราะห์ลำดับการทำงาน ความเบี่ยงเบน และคอขวดได้. แหล่งข้อมูล แอตทริบิวต์นี้ได้มาจากการประมวลผลข้อมูล โดยทั่วไปจะสร้างระหว่างการดึงข้อมูล ด้วยการจับคู่รหัสธุรกรรม SAP (T-Codes) การเปลี่ยนสถานะเอกสาร (เช่น จากตาราง VBUK, VBUP) หรือบันทึกการเปลี่ยนแปลง (ตาราง CDHDR, CDPOS) กับชื่อกิจกรรมที่เข้าใจง่าย. ตัวอย่าง สร้างคำสั่งขายสร้างเอกสารการส่งมอบตัดจ่ายสินค้าออกจากคลังสร้างใบแจ้งหนี้ได้รับชำระเงิน | |||
| ระบบต้นทาง SourceSystem | ระบุระบบต้นทางที่ใช้ดึงข้อมูล. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุระบบต้นทาง เช่น ชื่ออินสแตนซ์ SAP ECC หรือหมายเลขไคลเอนต์ ช่วยให้เข้าใจบริบทของข้อมูล โดยเฉพาะเมื่อมีระบบใช้งานจริงหลายระบบหรือมีข้อมูลจากระบบเดิม. ในการวิเคราะห์ ใช้กรองหรือแบ่งกลุ่มข้อมูลตามแหล่งที่มา ซึ่งมีประโยชน์เมื่อต้องเปรียบเทียบกระบวนการระหว่างระบบ หรือระหว่างโครงการย้ายระบบ เพื่อให้มั่นใจว่าข้อมูลถูกต้องและสอดคล้องกัน. เหตุผลที่สำคัญ ช่วยให้เข้าใจบริบทของข้อมูล โดยเฉพาะเมื่อมีหลายระบบ ทำให้เปรียบเทียบกระบวนการได้และตรวจสอบที่มาของข้อมูลได้ชัดเจน. แหล่งข้อมูล โดยทั่วไปจะเพิ่มค่านี้ระหว่างการดึงข้อมูล โดยมักเป็นค่าคงที่ที่ระบุ SAP System ID (SAPSID) หรือไคลเอนต์ (MANDT). ตัวอย่าง ECC_PROD_800SAP_ERP_EU1ECC_QAS_300 | |||
| เวลาเริ่มต้น StartTime | เวลาที่ระบุว่ากิจกรรมหรือเหตุการณ์เริ่มต้นเมื่อใด. | ||
| คำอธิบาย เวลาเริ่มต้น หรือที่เรียกว่าเวลาประทับเหตุการณ์ ใช้บันทึกวันที่และเวลาที่กิจกรรมหนึ่งเกิดขึ้นอย่างแม่นยำ เช่น เวลาสร้างใบสั่งขาย เวลาบันทึกการจ่ายสินค้า หรือเวลาบันทึกใบแจ้งหนี้. เวลานี้เป็นข้อมูลพื้นฐานสำหรับการวิเคราะห์ตามเวลาใน process mining ใช้คำนวณระยะเวลาระหว่างกิจกรรม วัดระยะเวลารวมของเคส และค้นหาความล่าช้าหรือคอขวด การบันทึกเวลาอย่างแม่นยำมีความสำคัญต่อแดชบอร์ดวิเคราะห์ประสิทธิภาพ เช่น แดชบอร์ดติดตามการส่งมอบตรงเวลาหรือระยะเวลาดำเนินการตามคำสั่งซื้อ. เหตุผลที่สำคัญ แอตทริบิวต์นี้สำคัญต่อการคำนวณตัวชี้วัดประสิทธิภาพทั้งหมด เช่น ระยะเวลาและเวลาที่ใช้ ซึ่งจำเป็นต่อการค้นหาคอขวด. แหล่งข้อมูล แอตทริบิวต์นี้ประกอบจากข้อมูลหลายช่อง โดยทั่วไปได้จากการรวมช่องวันที่ (เช่น ERDAT) กับช่องเวลา (เช่น ERZET) จากตาราง SAP ต่างๆ เช่น VBAK (ใบสั่งขาย), LIKP (การส่งมอบ) และ VBRK (ใบแจ้งหนี้). ตัวอย่าง 2023-04-15T09:00:12Z2023-04-16T14:30:00Z2023-04-20T11:22:45Z | |||
| อัปเดตข้อมูลล่าสุด LastDataUpdate | เวลาที่ระบุว่ามีการรีเฟรชข้อมูลของระเบียนนี้จากระบบต้นทางครั้งล่าสุดเมื่อใด. | ||
| คำอธิบาย แอตทริบิวต์นี้บันทึกวันที่และเวลาที่ดึงหรืออัปเดตข้อมูลของเหตุการณ์หรือเคสครั้งล่าสุด ช่วยให้ทราบว่าข้อมูลที่นำมาวิเคราะห์เป็นข้อมูลใหม่เพียงใด. ข้อมูลนี้ในแดชบอร์ดและรายงานช่วยให้ผู้ใช้เข้าใจว่าข้อมูลเชิงลึกเป็นปัจจุบันแค่ไหน และยืนยันได้ว่าการวิเคราะห์สะท้อนสถานะการปฏิบัติการล่าสุดหรืออ้างอิงข้อมูลเก่า ทั้งยังช่วยให้ผู้ใช้ทราบว่าข้อมูลอัปเดตล่าสุดเมื่อใด. เหตุผลที่สำคัญ ช่วยให้ผู้ใช้ทราบว่าข้อมูลเป็นปัจจุบันเพียงใด ซึ่งสำคัญต่อการตัดสินใจได้ทันเวลาและมีข้อมูลประกอบจากการวิเคราะห์ process mining. แหล่งข้อมูล นี่คือแอตทริบิวต์เมทาดาทาที่เครื่องมือหรือกระบวนการดึงข้อมูลเติมให้เมื่อนำข้อมูลเข้าสู่ระบบ โดยไม่ได้จัดเก็บไว้ในตาราง SAP ต้นทาง. ตัวอย่าง 2024-06-10T05:00:00Z2024-06-11T05:00:00Z2024-06-12T05:00:00Z | |||
| บล็อกการส่งมอบ DeliveryBlock | รหัสที่ระบุว่าใบสั่งขายถูกระงับการจัดส่งหรือไม่ ซึ่งจะป้องกันไม่ให้สร้างเอกสารการส่งมอบ. | ||
| คำอธิบาย บล็อกการส่งมอบคือสถานะที่กำหนดให้ใบสั่งขายในระดับส่วนหัวหรือระดับรายการ เพื่อหยุดกระบวนการชั่วคราวก่อนถึงขั้นตอนส่งมอบ ผู้ใช้อาจกำหนดบล็อกด้วยตนเอง หรือระบบกำหนดให้อัตโนมัติ เช่น เมื่อวงเงินเครดิตไม่ผ่านหรือข้อมูลไม่ครบถ้วน. แอตทริบิวต์นี้สำคัญต่อแดชบอร์ด “วิเคราะห์การระงับและการทำงานซ้ำของใบสั่งขาย” การวิเคราะห์ความถี่ ระยะเวลา และสาเหตุของบล็อกการส่งมอบช่วยระบุคอขวดสำคัญในกระบวนการดำเนินการตามคำสั่งซื้อ การลดการระงับเหล่านี้ช่วยให้ส่งมอบตรงเวลาและลดระยะเวลาดำเนินการโดยรวมได้. เหตุผลที่สำคัญ ช่วยระบุคอขวดในกระบวนการดำเนินการตามคำสั่งซื้อโดยตรง การวิเคราะห์สาเหตุและความถี่ที่ใบสั่งซื้อถูกระงับเป็นสิ่งสำคัญต่อการปรับปรุงความต่อเนื่องของกระบวนการ. แหล่งข้อมูล อยู่ในตารางข้อมูลส่วนหัวของเอกสารการขาย (VBAK) ในช่อง LIFSK. ตัวอย่าง 0102Z1 | |||
| ผู้ใช้ User | รหัสผู้ใช้ของพนักงานที่สร้างหรือแก้ไขเอกสารล่าสุด หรือดำเนินกิจกรรมดังกล่าว. | ||
| คำอธิบาย แอตทริบิวต์นี้บันทึกรหัสผู้ใช้ SAP ที่รับผิดชอบเหตุการณ์หนึ่งในกระบวนการ เช่น ระบุพนักงานขายที่สร้างใบสั่งซื้อ หรือพนักงานคลังสินค้าที่บันทึกการจ่ายสินค้า. การวิเคราะห์ตามผู้ใช้ช่วยให้เข้าใจการกระจายงาน ระบุความต้องการในการฝึกอบรม และค้นหาความแตกต่างในการทำงานเดียวกันของผู้ใช้แต่ละคน ข้อมูลนี้จำเป็นต่อแดชบอร์ดที่วิเคราะห์ประสิทธิภาพของทรัพยากร การปฏิบัติตามข้อกำหนด และการแทรกแซงด้วยการทำงานด้วยตนเอง. เหตุผลที่สำคัญ ช่วยให้เห็นประสิทธิภาพและปริมาณงานของทรัพยากร ระบุความเบี่ยงเบนของกระบวนการที่เกี่ยวข้องกับผู้ใช้แต่ละคน และใช้วิเคราะห์การปฏิบัติตามข้อกำหนดกับการทำงานอัตโนมัติได้. แหล่งข้อมูล พบได้ในตารางส่วนหัว SAP หลายตาราง เช่น ช่อง “สร้างโดย” (ERNAM) หรือ “แก้ไขโดย” (AENAM) ใน VBAK, LIKP และ VBRK. ตัวอย่าง CBURKEJSMITHRWILLIAMS | |||
| มูลค่าสุทธิ NetAmount | มูลค่ารวมของใบสั่งขายก่อนหักภาษีและส่วนลดในระดับส่วนหัวเอกสาร. | ||
| คำอธิบาย มูลค่าสุทธิแสดงมูลค่าเป็นเงินของใบสั่งขายแต่ละรายการ จึงเป็นตัวชี้วัดทางการเงินที่สำคัญของแต่ละเคส. แอตทริบิวต์นี้จำเป็นต่อการวิเคราะห์ process mining ตามมูลค่า ช่วยจัดลำดับความสำคัญของโครงการปรับปรุงกระบวนการ โดยเน้นใบสั่งซื้อที่มีมูลค่าสูง นักวิเคราะห์สามารถเชื่อมโยงปัญหาในกระบวนการ เช่น ความล่าช้าหรือการทำงานซ้ำ กับผลกระทบทางการเงิน เพื่อประกอบการตัดสินใจปรับปรุงได้ชัดเจนขึ้น ตัวอย่างเช่น ใช้เปรียบเทียบประสิทธิภาพการดำเนินการของใบสั่งซื้อมูลค่าสูงกับใบสั่งซื้อมูลค่าต่ำ. เหตุผลที่สำคัญ ช่วยวิเคราะห์ตามมูลค่าและจัดลำดับความสำคัญของการปรับปรุง โดยเน้นใบสั่งซื้อที่ส่งผลต่อการเงินของบริษัทมากที่สุด. แหล่งข้อมูล อยู่ในตารางข้อมูลส่วนหัวของเอกสารการขาย (VBAK) ในช่อง NETWR. ตัวอย่าง 1500.0012550.75850.50 | |||
| หมายเลขลูกค้า CustomerNumber | รหัสเฉพาะของลูกค้าที่ส่งใบสั่งขาย. | ||
| คำอธิบาย แอตทริบิวต์นี้แทน “ผู้ซื้อ” ซึ่งเป็นบัญชีลูกค้าหลักที่เชื่อมโยงกับใบสั่งขาย และเชื่อมรายการธุรกรรมกับข้อมูลหลักของลูกค้า. การวิเคราะห์ตามหมายเลขลูกค้าช่วยแบ่งกลุ่มกระบวนการเพื่อทำความเข้าใจพฤติกรรมและประสิทธิภาพของลูกค้าแต่ละราย เช่น ลูกค้ารายใดใช้เวลาดำเนินการนานที่สุด มีการทำงานซ้ำมากที่สุด หรือเปลี่ยนแปลงใบสั่งซื้อบ่อยที่สุด ข้อมูลนี้สำคัญต่อการปรับปรุงการบริหารความสัมพันธ์กับลูกค้าและระดับการให้บริการ. เหตุผลที่สำคัญ ช่วยวิเคราะห์โดยเน้นลูกค้า ทำให้ระบุปัญหากระบวนการที่กระทบลูกค้าแต่ละรายและวัดประสิทธิภาพแยกตามลูกค้าได้. แหล่งข้อมูล อยู่ในตารางข้อมูลส่วนหัวของเอกสารการขาย (VBAK) ในช่อง KUNNR. ตัวอย่าง 100234100567200112 | |||
| หมายเลขวัสดุ MaterialNumber | รหัสเฉพาะของสินค้าหรือบริการที่ขาย. | ||
| คำอธิบาย หมายเลขวัสดุใช้ระบุสินค้าแต่ละรายการในบรรทัดของใบสั่งขาย เนื่องจากใบสั่งขายหนึ่งรายการมีวัสดุได้หลายรายการ แอตทริบิวต์นี้จึงมักวิเคราะห์ในระดับรายการ. การวิเคราะห์กระบวนการตามหมายเลขวัสดุช่วยค้นหาปัญหาเฉพาะของสินค้า เช่น สินค้าบางชนิดใช้เวลาดำเนินการนานกว่า มีการระงับการส่งมอบบ่อยกว่า หรือพบความคลาดเคลื่อนของใบแจ้งหนี้มากกว่า ข้อมูลนี้สำคัญต่อการบริหารห่วงโซ่อุปทานและผลิตภัณฑ์ เพื่อปรับกระบวนการให้เหมาะกับสินค้าแต่ละกลุ่ม. เหตุผลที่สำคัญ ช่วยวิเคราะห์กระบวนการตามสินค้า และค้นหาว่าสินค้าชนิดใดเกี่ยวข้องกับความไม่มีประสิทธิภาพ เช่น ความล่าช้า การระงับ หรือการทำงานซ้ำ. แหล่งข้อมูล อยู่ในตารางข้อมูลรายการของเอกสารการขาย (VBAP) ในช่อง MATNR. ตัวอย่าง FG-1001-ARAW-205BSERV-INSTALL | |||
| เหตุผลที่ปฏิเสธ RejectionReason | รหัสที่ระบุสาเหตุที่ปฏิเสธหรือยกเลิกรายการในใบสั่งขาย. | ||
| คำอธิบาย เหตุผลที่ปฏิเสธช่วยอธิบายว่าเหตุใดจึงไม่ได้ดำเนินการตามใบสั่งขายหรือรายการใดรายการหนึ่งให้เสร็จ เช่น ลูกค้ายกเลิก สินค้าไม่มี หรือมีเหตุผลทางธุรกิจอื่น. แอตทริบิวต์นี้จำเป็นต่อแดชบอร์ด “แนวโน้มการยกเลิกใบสั่งขาย” เมื่อวิเคราะห์เหตุผลที่พบบ่อย ธุรกิจจะค้นหาสาเหตุของยอดขายที่สูญเสียไปได้ และนำข้อมูลไปปรับปรุงการบริหารสินค้าคงคลัง กลยุทธ์ราคา หรือการสื่อสารกับลูกค้า เพื่อลดอัตราการยกเลิกใบสั่งซื้อ. เหตุผลที่สำคัญ ช่วยให้เข้าใจสาเหตุของการยกเลิกใบสั่งซื้อ และวิเคราะห์ต้นตอเพื่อลดการสูญเสียยอดขายและปรับปรุงความแม่นยำของการคาดการณ์. แหล่งข้อมูล อยู่ในตารางข้อมูลรายการของเอกสารการขาย (VBAP) ในช่อง ABGRU. ตัวอย่าง 0215Z5 | |||
| องค์กรฝ่ายขาย SalesOrganization | หน่วยงานที่รับผิดชอบการขายสินค้าหรือบริการ. | ||
| คำอธิบาย องค์กรฝ่ายขายเป็นหน่วยงานหลักใน SAP ที่จัดโครงสร้างบริษัทตามความต้องการด้านการขาย รับผิดชอบการเจรจาเงื่อนไขการขายและการจัดจำหน่ายสินค้าและบริการ. ใน process mining แอตทริบิวต์นี้เป็นมิติสำคัญสำหรับการวิเคราะห์ ช่วยเปรียบเทียบประสิทธิภาพ ความคล่องตัว และการปฏิบัติตามข้อกำหนดระหว่างหน่วยขาย ภูมิภาค หรือแผนกต่างๆ ทำให้ค้นหาแนวทางที่ได้ผลดีในหน่วยงานที่มีประสิทธิภาพสูง และจุดที่ควรปรับปรุงในหน่วยงานอื่นได้. เหตุผลที่สำคัญ ช่วยเปรียบเทียบประสิทธิภาพของกระบวนการและการปฏิบัติตามข้อกำหนดระหว่างหน่วยธุรกิจหรือภูมิภาคต่างๆ. แหล่งข้อมูล อยู่ในตารางข้อมูลส่วนหัวของเอกสารการขาย (VBAK) ในช่อง VKORG. ตัวอย่าง 100025003100 | |||
| เงื่อนไขการจัดส่ง ShippingConditions | กำหนดแนวทางทั่วไปในการจัดส่งสินค้าให้ลูกค้า. | ||
| คำอธิบาย เงื่อนไขการจัดส่งกำหนดวิธีจัดส่งใบสั่งซื้อ เช่น “มาตรฐาน” “ด่วน” หรือ “รับสินค้าเอง” โดยตกลงกับลูกค้าและมีผลต่อการวางแผนโลจิสติกส์. แอตทริบิวต์นี้ใช้ในการวิเคราะห์ “ประสิทธิภาพและต้นทุนของวิธีจัดส่ง” การแบ่งกลุ่มกระบวนการตามเงื่อนไขการจัดส่งช่วยให้บริษัทตรวจสอบได้ว่าวิธีใดมีแนวโน้มล่าช้าหรือใช้เวลาดำเนินการนานกว่า ข้อมูลนี้ช่วยปรับปรุงโลจิสติกส์และจัดการความคาดหวังของลูกค้าเกี่ยวกับเวลาส่งมอบ. เหตุผลที่สำคัญ ช่วยวิเคราะห์ประสิทธิภาพด้านโลจิสติกส์ และตรวจสอบว่าวิธีจัดส่งบางประเภทสัมพันธ์กับความล่าช้าหรือประสิทธิภาพที่สูงขึ้นหรือไม่. แหล่งข้อมูล อยู่ในตารางข้อมูลส่วนหัวของเอกสารการขาย (VBAK) ในช่อง VSBED. ตัวอย่าง 011020 | |||
| มีการทำงานซ้ำหรือไม่ IsRework | ค่าสถานะแบบจริงหรือเท็จที่ระบุว่าใบสั่งขายมีการเปลี่ยนแปลงหรือทำงานซ้ำครั้งสำคัญหลังจากสร้างครั้งแรกหรือไม่. | ||
| คำอธิบาย แอตทริบิวต์ที่คำนวณนี้ใช้ระบุเคสที่มีการทำงานซ้ำ เช่น มีกิจกรรม “แก้ไขใบสั่งขาย” อย่างน้อยหนึ่งครั้ง โดยกำหนดหลักเกณฑ์ของการทำงานซ้ำระหว่างตั้งค่าโครงการ เช่น การเปลี่ยนราคา ปริมาณ หรือวันที่ส่งมอบ. แอตทริบิวต์นี้สำคัญต่อแดชบอร์ด “ความถี่ในการทำงานซ้ำและแก้ไขใบสั่งขาย” และ KPI อัตราการทำงานซ้ำของใบสั่งขาย ช่วยให้กรองและเปรียบเทียบใบสั่งซื้อที่ดำเนินไปตามขั้นตอนโดยไม่สะดุดกับรายการที่ต้องแก้ไขด้วยตนเองได้โดยตรง ทำให้วัดผลกระทบของการทำงานซ้ำต่อระยะเวลาและต้นทุนได้. เหตุผลที่สำคัญ ช่วยวัดความถี่ของการทำงานซ้ำโดยตรง และวิเคราะห์สาเหตุกับผลกระทบต่อประสิทธิภาพและระยะเวลาของกระบวนการโดยรวมได้. แหล่งข้อมูล แอตทริบิวต์นี้คำนวณจากบันทึกเหตุการณ์ โดยตรวจสอบว่ามีกิจกรรม “แก้ไขใบสั่งขาย” หรือเหตุการณ์เปลี่ยนแปลงเฉพาะในตาราง CDHDR/CDPOS หรือไม่. ตัวอย่าง truefalse | |||
| วันที่ยืนยันส่งมอบ ConfirmedDeliveryDate | วันที่ยืนยันกับลูกค้าว่าจะส่งมอบสินค้าหรือบริการ. | ||
| คำอธิบาย นี่คือวันที่กำหนดส่งมอบให้ลูกค้า โดยพิจารณาจากความพร้อมของวัสดุและการจัดตาราง ใช้เป็นเกณฑ์อ้างอิงในการวัดประสิทธิภาพการส่งมอบ. แอตทริบิวต์นี้เป็นพื้นฐานของแดชบอร์ด “ประสิทธิภาพการส่งมอบตรงเวลา” และ KPI อัตราการส่งมอบตรงเวลา เมื่อนำวันที่ยืนยันส่งมอบมาเปรียบเทียบกับวันที่ “บันทึกการจ่ายสินค้า” จริง การวิเคราะห์จะระบุได้ว่าใบสั่งซื้อส่งมอบตรงเวลา เร็วกว่า หรือช้ากว่ากำหนด ตัวชี้วัดนี้สะท้อนความน่าเชื่อถือของห่วงโซ่อุปทานและความพึงพอใจของลูกค้า. เหตุผลที่สำคัญ ใช้เป็นเกณฑ์วัดประสิทธิภาพการส่งมอบตรงเวลา ซึ่งเป็น KPI สำคัญต่อความพึงพอใจของลูกค้าและประสิทธิภาพของห่วงโซ่อุปทาน. แหล่งข้อมูล อยู่ในตารางกำหนดการของเอกสารการขาย (VBEP) ในช่อง EDATU. ตัวอย่าง 2023-05-102023-06-202023-07-01 | |||
| ส่งมอบตรงเวลาหรือไม่ IsOnTimeDelivery | ค่าสถานะแบบจริงหรือเท็จที่ระบุว่าส่งสินค้าในวันที่ยืนยันการส่งมอบหรือก่อนวันดังกล่าวหรือไม่. | ||
| คำอธิบาย แอตทริบิวต์ที่คำนวณนี้เปรียบเทียบวันที่จ่ายสินค้าจริงกับ “ConfirmedDeliveryDate” ของใบสั่งขาย หากจ่ายสินค้าในวันที่ยืนยันหรือก่อนวันดังกล่าว ค่าจะเป็นจริง มิฉะนั้นจะเป็นเท็จ. แอตทริบิวต์นี้ช่วยสร้างแดชบอร์ด “ประสิทธิภาพการส่งมอบตรงเวลา” และคำนวณ KPI อัตราการส่งมอบตรงเวลาได้ง่ายขึ้น โดยรวบรวมและแสดงผลประสิทธิภาพได้ทันที โดยไม่ต้องเปรียบเทียบวันที่ใหม่ทุกครั้งที่วิเคราะห์หรือสร้างแผนภูมิ จึงเห็นความน่าเชื่อถือในการส่งมอบได้ชัดเจน. เหตุผลที่สำคัญ เป็นตัวชี้วัดประสิทธิภาพการส่งมอบที่ชัดเจนและเข้าใจง่าย ช่วยคำนวณ KPI อัตราการส่งมอบตรงเวลาโดยรวมได้สะดวก. แหล่งข้อมูล แอตทริบิวต์นี้คำนวณโดยเปรียบเทียบเวลาประทับของกิจกรรม “บันทึกการจ่ายสินค้า” กับค่าในแอตทริบิวต์ “ConfirmedDeliveryDate”. ตัวอย่าง truefalse | |||
| สถานะตรวจสอบเครดิต CreditCheckStatus | ระบุสถานะการตรวจสอบเครดิตของเอกสารการขาย. | ||
| คำอธิบาย แอตทริบิวต์นี้แสดงผลการตรวจสอบเครดิตของใบสั่งขาย ซึ่งอาจดำเนินการโดยระบบหรือผู้ใช้ สถานะที่พบบ่อย ได้แก่ “อนุมัติ” “ปฏิเสธ” หรือ “ระงับ”. แอตทริบิวต์นี้เป็นข้อมูลสำคัญสำหรับแดชบอร์ด “วิเคราะห์ระยะเวลาการตรวจสอบเครดิต” ความล่าช้าหรือการระงับในขั้นตอนตรวจสอบเครดิตอาจส่งผลต่อระยะเวลาดำเนินการตามคำสั่งซื้อโดยรวมอย่างมาก การวิเคราะห์สถานะนี้ช่วยให้เข้าใจประสิทธิภาพของกระบวนการจัดการเครดิตและผลต่อความเร็วในการขาย. เหตุผลที่สำคัญ ส่งผลโดยตรงต่อความเร็วในการดำเนินการตามใบสั่งซื้อ การวิเคราะห์สถานะนี้ช่วยระบุคอขวดในการจัดการเครดิตที่ทำให้การส่งมอบล่าช้า. แหล่งข้อมูล อยู่ในตารางสถานะส่วนหัวของเอกสารการขาย (VBUK) หรือใน VBAK โดยตรง ในช่องสถานะเครดิต เช่น CMGST. ตัวอย่าง ABD | |||
กิจกรรมในกระบวนการ Order to Cash: การประมวลผลคำสั่งซื้อขาย
| กิจกรรม | คำอธิบาย | ||
|---|---|---|---|
| ได้รับชำระเงิน | เหตุการณ์นี้หมายถึงได้รับเงินจากลูกค้าและนำไปตัดกับใบแจ้งหนี้แล้ว ทำให้รายการลูกหนี้คงค้างถูกปิด เป็นเหตุการณ์ทางบัญชีที่อนุมานจากการเคลียร์เอกสารทางการเงิน. | ||
| เหตุผลที่สำคัญ นี่คือขั้นตอนสุดท้ายของการรับเงินจากการขาย และเป็นจุดสิ้นสุดที่ใช้วัด “ระยะเวลาตั้งแต่แจ้งหนี้จนถึงรับชำระเงิน” รวมถึง “ระยะเวลาตั้งแต่รับคำสั่งซื้อจนส่งมอบครบถ้วน” โดยรวม. แหล่งข้อมูล อนุมานจากข้อมูลเอกสารเคลียร์รายการในตาราง BSEG สำหรับรายการลูกค้า เมื่อมีข้อมูลใน BSEG-AUGBL (เอกสารเคลียร์รายการ) และ BSEG-AUGDT (วันที่เคลียร์รายการ) แสดงว่าได้รับชำระเงินแล้ว. บันทึก อนุมานจากการระบุวันที่เคลียร์รายการ (AUGDT) ในตาราง BSEG สำหรับรายการลูกหนี้การค้า. ประเภทเหตุการณ์ inferred | |||
| ตัดจ่ายสินค้าออกจากคลัง | เหตุการณ์สำคัญที่แสดงว่ากรรมสิทธิ์ในสินค้าถูกโอนและสินค้าออกจากคลังอย่างเป็นทางการ ระบบบันทึกรายการทางการเงินนี้โดยตรง ซึ่งจะสร้างเอกสารวัสดุและปรับปรุงสินค้าคงคลัง. | ||
| เหตุผลที่สำคัญ นี่คือเหตุการณ์ 'จัดส่งสินค้า' และเป็นหมุดหมายสำคัญสำหรับวัดการส่งมอบตรงเวลาและระยะเวลานำส่ง อีกทั้งยังกระตุ้นการปรับปรุงข้อมูลทางการเงินและเป็นจุดที่ย้อนกลับไม่ได้ในกระบวนการจัดส่งสินค้าจริง. แหล่งข้อมูล สร้างเอกสารวัสดุ (MKPF/MSEG) โดยใช้ประเภทการเคลื่อนไหวตัดจ่ายสินค้า (เช่น 601) และเชื่อมโยงกับเอกสารการส่งมอบ. บันทึก สร้างเอกสารวัสดุ (MKPF/MSEG) โดยใช้ประเภทการเคลื่อนไหวตัดจ่ายสินค้าและเชื่อมโยงกับการส่งมอบ. ประเภทเหตุการณ์ explicit | |||
| ปิดรายการใบสั่งขาย | กิจกรรมนี้ระบุว่ารายการในใบสั่งขายปิดสมบูรณ์แล้ว หมายถึงส่งมอบและออกใบแจ้งหนี้ครบถ้วน โดยอนุมานจากสถานะโดยรวมของรายการ. | ||
| เหตุผลที่สำคัญ เป็นเหตุการณ์สิ้นสุดที่แสดงว่ากระบวนการเสร็จสมบูรณ์ การวิเคราะห์เวลาปิดรายการช่วยให้เข้าใจระยะเวลาตั้งแต่ต้นจนจบ และค้นหาใบสั่งซื้อที่ยังเปิดค้างโดยไม่จำเป็น. แหล่งข้อมูล อนุมานจากช่องสถานะโดยรวมของรายการในตาราง VBUP (เอกสารการขาย: สถานะรายการ) เมื่อ VBUP-GBSTA เป็น 'C' (ประมวลผลครบถ้วน) ถือว่าปิดรายการแล้ว. บันทึก อนุมานจากสถานะรายการ (VBUP-GBSTA) ที่เปลี่ยนเป็น 'C' (ประมวลผลครบถ้วน). ประเภทเหตุการณ์ inferred | |||
| ยืนยันคำสั่งขาย | กิจกรรมนี้หมายความว่าคำสั่งขายผ่านการตรวจสอบเบื้องต้นทั้งหมดและยืนยันเพื่อดำเนินการจัดส่งแล้ว โดยทั่วไปอนุมานได้เมื่อคำสั่งขายไม่ถูกระงับอีกต่อไปและมีจำนวนที่ยืนยันแล้วในบรรทัดกำหนดการส่งมอบ. | ||
| เหตุผลที่สำคัญ นี่คือหมุดหมายสำคัญที่แบ่งขั้นตอนรับคำสั่งขายออกจากการจัดส่ง เป็นจุดเริ่มต้นสำหรับวัดระยะเวลานำส่งและประสิทธิภาพการส่งมอบตรงเวลา. แหล่งข้อมูล อนุมานได้เมื่อบรรทัดกำหนดการส่งมอบใน VBEP มีจำนวนที่ยืนยันแล้ว (BMENG > 0) และคำสั่งขายไม่ถูกระงับการส่งมอบ (เช่น VBUK-LIFSK ว่าง). บันทึก อนุมานจากการยืนยันบรรทัดกำหนดการส่งมอบ (VBEP-BMENG > 0) และการยกเลิกการระงับระดับส่วนหัว. ประเภทเหตุการณ์ inferred | |||
| สร้างคำสั่งขาย | ระบุการสร้างเอกสารคำสั่งขายใหม่ ระบบบันทึกเหตุการณ์นี้เมื่อผู้ใช้บันทึกคำสั่งขายใหม่ โดยทั่วไปผ่านธุรกรรม VA01 ใน SAP. | ||
| เหตุผลที่สำคัญ นี่คือเหตุการณ์เริ่มต้นหลักของกระบวนการ Order-to-Cash การวิเคราะห์เวลาที่เกิดเหตุการณ์นี้มีความสำคัญต่อการวัดเวลารอบกระบวนการโดยรวมและอัตราการรับคำสั่งขาย. แหล่งข้อมูล บันทึกในตาราง VBAK (ข้อมูลส่วนหัวของเอกสารการขาย) โดยใช้วันที่สร้าง (ERDAT) และเวลา (ERZET) รหัสธุรกรรมจัดเก็บไว้ใน VBAK-TCODE. บันทึก เหตุการณ์ที่อ้างอิงเวลาสร้าง (ERDAT, ERZET) ในตาราง VBAK. ประเภทเหตุการณ์ explicit | |||
| สร้างใบแจ้งหนี้ | ระบุการสร้างใบแจ้งหนี้ลูกค้าหรือเอกสารเรียกเก็บเงิน เหตุการณ์นี้เกิดขึ้นโดยตรงเมื่อระบบสร้างเอกสารใหม่ และเป็นจุดเริ่มต้นของขั้นตอนการชำระเงิน. | ||
| เหตุผลที่สำคัญ นี่คือหมุดหมายสำคัญที่ใช้เริ่มจับเวลา “ระยะเวลาตั้งแต่แจ้งหนี้จนถึงรับชำระเงิน” หากออกใบแจ้งหนี้ล่าช้า กระแสเงินสดก็ได้รับผลกระทบโดยตรง. แหล่งข้อมูล บันทึกในตาราง VBRK (เอกสารเรียกเก็บเงิน: ข้อมูลส่วนหัว) โดยอ้างอิงวันที่สร้างเอกสาร (ERDAT) ส่วนความเชื่อมโยงกับใบสั่งขายหรือการส่งมอบอยู่ในตาราง VBFA. บันทึก เหตุการณ์นี้อ้างอิงเวลาที่สร้างเอกสาร (ERDAT) ในตาราง VBRK. ประเภทเหตุการณ์ explicit | |||
| กำหนดการระงับการส่งมอบ | หมายถึงการกำหนดการระงับการส่งมอบให้กับคำสั่งขาย ซึ่งป้องกันไม่ให้สร้างเอกสารการส่งมอบ ระบบบันทึกเหตุการณ์นี้ได้โดยตรงจากบันทึกการเปลี่ยนแปลง หรืออนุมานจากตารางสถานะ. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้เกี่ยวข้องโดยตรงกับ KPI 'อัตราคำสั่งขายที่ติดขัด' การระบุสาเหตุและความถี่ของการระงับช่วยให้ค้นพบปัจจัยที่ทำให้การจัดส่งล่าช้า. แหล่งข้อมูล ค้นหาได้จากบันทึกการเปลี่ยนแปลง (CDHDR/CDPOS) ของฟิลด์ VBAK-LIFSK หรืออนุมานจากการตรวจพบว่าฟิลด์ VBAK-LIFSK มีค่า. บันทึก เหตุการณ์จากเอกสารการเปลี่ยนแปลงของฟิลด์ VBAK-LIFSK หรือ VBAP-LIFSP. ประเภทเหตุการณ์ explicit | |||
| ดำเนินการตรวจสอบเครดิตแล้ว | ระบุว่าการตรวจสอบเครดิตของลูกค้าสำหรับคำสั่งขายเสร็จสิ้นแล้ว ไม่ว่าจะเป็นการตรวจสอบอัตโนมัติหรือด้วยตนเอง โดยทั่วไปอนุมานจากการเปลี่ยนแปลงสถานะเครดิตโดยรวมของเอกสาร. | ||
| เหตุผลที่สำคัญ การตรวจสอบเครดิตมักเป็นคอขวดสำคัญ การวัดเวลาที่ใช้ในขั้นตอนนี้จำเป็นต่อ 'การวิเคราะห์เวลาประมวลผลการตรวจสอบเครดิต' และการเร่งกระบวนการคำสั่งขาย. แหล่งข้อมูล อนุมานจากฟิลด์สถานะเครดิตในตาราง VBUK (เอกสารการขาย: สถานะส่วนหัว) การเปลี่ยนแปลง VBUK-CMGST จากถูกระงับเป็นอนุมัติแล้วถือเป็นการเกิดกิจกรรมนี้. บันทึก อนุมานจากการเปลี่ยนแปลงฟิลด์สถานะเครดิตโดยรวม (VBUK-CMGST). ประเภทเหตุการณ์ inferred | |||
| เปลี่ยนแปลงคำสั่งขาย | หมายถึงการแก้ไขคำสั่งขายที่มีอยู่หลังจากสร้างครั้งแรก ระบบบันทึกการเปลี่ยนแปลงเหล่านี้ในตารางบันทึกการเปลี่ยนแปลงโดยเฉพาะ (CDHDR, CDPOS) เมื่อมีการแก้ไขฟิลด์ เช่น จำนวน ราคา หรือวันที่. | ||
| เหตุผลที่สำคัญ การติดตามการเปลี่ยนแปลงช่วยให้พบงานแก้ไขซ้ำ ความไม่เสถียรของกระบวนการ และปัญหาคุณภาพข้อมูล การเปลี่ยนแปลงที่เกิดขึ้นบ่อยอาจบ่งชี้ถึงปัญหาในขั้นตอนป้อนคำสั่งขายครั้งแรก ซึ่งทำให้เกิดความล่าช้า. แหล่งข้อมูล ดึงข้อมูลจากตารางเอกสารการเปลี่ยนแปลง CDHDR (ส่วนหัว) และ CDPOS (รายการ) โดยใช้ OBJECTCLAS = 'VERKBELEG' สามารถระบุเวลาและฟิลด์ที่เปลี่ยนแปลงได้. บันทึก เหตุการณ์จากตารางเอกสารการเปลี่ยนแปลง (CDHDR, CDPOS) สำหรับออบเจ็กต์เอกสารการขาย. ประเภทเหตุการณ์ explicit | |||
| ยกเลิกใบแจ้งหนี้ | แสดงการกลับรายการเอกสารเรียกเก็บเงินที่สร้างไว้ก่อนหน้า โดยระบบจะสร้างเอกสารยกเลิกใหม่เพื่อหักล้างรายการเดิม. | ||
| เหตุผลที่สำคัญ การติดตามใบแจ้งหนี้ที่ถูกยกเลิกช่วยให้พบปัญหาด้านราคา ความไม่ตรงกันของการจัดส่ง หรือข้อผิดพลาดของข้อมูล และใช้สนับสนุน KPI “อัตราความคลาดเคลื่อนของใบแจ้งหนี้”. แหล่งข้อมูล เหตุการณ์นี้บันทึกเมื่อมีการสร้างเอกสารเรียกเก็บเงินสำหรับการยกเลิก (VBRK-VBTYP = 'N' หรือ 'O') โดยอ้างอิงใบแจ้งหนี้เดิมใน VBRK-SFAKN. บันทึก สร้างเอกสารยกเลิกใน VBRK โดยอ้างอิงใบแจ้งหนี้เดิม. ประเภทเหตุการณ์ explicit | |||
| ยกเลิกใบสั่งขาย | ระบุว่าใบสั่งขายถูกยกเลิกก่อนส่งมอบ โดยทั่วไปบันทึกด้วยการกำหนด “เหตุผลที่ปฏิเสธ” ให้กับรายการที่เกี่ยวข้องทั้งหมดในใบสั่งขาย. | ||
| เหตุผลที่สำคัญ นี่คือจุดสิ้นสุดที่บ่งชี้ว่ากระบวนการไม่สำเร็จ และใช้สนับสนุน KPI “อัตราการยกเลิกใบสั่งซื้อ” การทำความเข้าใจว่าใบสั่งซื้อถูกยกเลิกเมื่อใดและเพราะเหตุใด ช่วยให้เห็นปัญหาในกระบวนการขาย. แหล่งข้อมูล อนุมานจากการกรอกช่อง VBAP-ABGRU (เหตุผลที่ปฏิเสธ) ในรายการที่ยังดำเนินการอยู่ทั้งหมดของใบสั่งขาย วันที่เปลี่ยนแปลงดูได้จาก CDHDR/CDPOS. บันทึก อนุมานจากการกรอกช่อง “เหตุผลที่ปฏิเสธ” (VBAP-ABGRU) ในทุกรายการ. ประเภทเหตุการณ์ inferred | |||
| ยืนยันหลักฐานการส่งมอบ | กิจกรรมนี้แสดงการยืนยันว่าลูกค้าได้รับสินค้าแล้ว โดยบันทึกเมื่อมีการลงหลักฐานการส่งมอบในระบบ ซึ่งมักทำให้สถานะเอกสารการส่งมอบได้รับการอัปเดต. | ||
| เหตุผลที่สำคัญ เหตุการณ์นี้ระบุวันที่ส่งมอบจริง ซึ่งจำเป็นต่อการวัด KPI “อัตราการส่งมอบตรงเวลา” เทียบกับวันที่สัญญาไว้ได้อย่างแม่นยำ. แหล่งข้อมูล อนุมานจากสถานะหลักฐานการส่งมอบ (VBUK-PODAT) ที่เปลี่ยนเป็น 'C' (ยืนยันแล้ว) วันที่ยืนยันจัดเก็บไว้ใน VLPOD-PODAT ทั้งนี้ ระบบไม่ได้ติดตั้งการทำงานนี้ไว้เสมอไป. บันทึก อนุมานจากการอัปเดตสถานะ POD ในรายการส่งมอบ (VBUK-PODAT) หรือจากรายการในตาราง VLPOD. ประเภทเหตุการณ์ inferred | |||
| สร้างเอกสารการส่งมอบ | เหตุการณ์นี้ระบุการสร้างเอกสารการส่งมอบขาออก ซึ่งเป็นคำสั่งให้คลังสินค้าเริ่มหยิบและจัดส่งสินค้า ระบบบันทึกเหตุการณ์นี้โดยตรงจากลำดับเอกสาร. | ||
| เหตุผลที่สำคัญ นี่คือขั้นตอนแรกของการจัดส่งสินค้าจริง ระยะเวลาตั้งแต่ยืนยันคำสั่งขายจนสร้างเอกสารการส่งมอบแสดงให้เห็นว่ากระบวนการโลจิสติกส์เริ่มต้นได้เร็วเพียงใด. แหล่งข้อมูล การสร้างรายการในตาราง LIKP (เอกสาร SD: ข้อมูลส่วนหัวของการส่งมอบ) โดยเชื่อมโยงกับคำสั่งขายผ่านตารางลำดับเอกสาร VBFA. บันทึก เหตุการณ์ที่อ้างอิงเวลาสร้างในตาราง LIKP และเชื่อมโยงผ่านตาราง VBFA. ประเภทเหตุการณ์ explicit | |||
| หยิบสินค้าเสร็จแล้ว | หมายถึงหยิบสินค้าทุกรายการสำหรับการส่งมอบออกจากคลังสินค้าแล้ว หากใช้ Warehouse Management (WM) สามารถอนุมานได้จากสถานะของ Transfer Order. | ||
| เหตุผลที่สำคัญ การวิเคราะห์เวลาหยิบสินค้าช่วยปรับปรุงการปฏิบัติงานในคลังสินค้า ความล่าช้าในขั้นตอนนี้ส่งผลโดยตรงต่อกำหนดการจัดส่งและรอบเวลาการดำเนินการให้เสร็จสิ้น. แหล่งข้อมูล อนุมานจากสถานะการหยิบของรายการส่งมอบในตาราง LIPS-KOSTA เมื่อเปลี่ยนเป็น 'C' (หยิบครบแล้ว) หากเปิดใช้ WM สามารถอนุมานจากการยืนยัน Transfer Order (ตาราง LTAK/LTAP). บันทึก อนุมานจากการเปลี่ยนสถานะการหยิบ (LIPS-KOSTA) หรือการยืนยัน Transfer Order ใน WM. ประเภทเหตุการณ์ inferred | |||
คู่มือการดึงข้อมูล
ขั้นตอน
- พัฒนาโปรแกรม: ใช้ธุรกรรม SE38 หรือ SE80 สร้างโปรแกรม ABAP ที่เรียกทำงานได้ โปรแกรมนี้จะรวมตรรกะการดึงข้อมูลทั้งหมด
- กำหนดหน้าจอเลือกข้อมูล: สร้างหน้าจอเลือกข้อมูลในโปรแกรมเพื่อกรองข้อมูล โดยเพิ่มพารามิเตอร์สำหรับวันที่สร้างใบสั่งขาย (VBAK-ERDAT), องค์กรฝ่ายขาย (VBAK-VKORG) และประเภทเอกสารการขาย (VBAK-AUART) วิธีนี้ช่วยให้ใช้การดึงข้อมูลซ้ำได้และจัดการได้ง่าย
- ประกาศข้อมูล: กำหนดตารางภายในและโครงสร้างที่ใช้เก็บข้อมูลจากตาราง SAP ต่าง ๆ เช่น VBAK, VBAP, VBFA, CDHDR, CDPOS, VBRK และ BSAD รวมถึงกำหนดโครงสร้างผลลัพธ์สุดท้ายของบันทึกเหตุการณ์ให้ตรงกับแอตทริบิวต์ที่จำเป็น
- เลือกใบสั่งขายตั้งต้น: เขียนคำสั่ง SELECT แรกเพื่อดึงส่วนหัวใบสั่งขาย (VBAK) และรายการสินค้า (VBAP) ตามค่าที่ผู้ใช้ป้อนในหน้าจอเลือกข้อมูล ชุดข้อมูลนี้เป็นเคสหลักสำหรับการวิเคราะห์
- ดึงเหตุการณ์ 'Creation': วนดูระเบียน VBAK ที่เลือกไว้แต่ละรายการ แล้วใส่กิจกรรม 'Sales Order Created' ลงในโครงสร้างบันทึกเหตุการณ์ โดยใช้ VBAK-ERDAT และ VBAK-ERZET เป็น StartTime
- ดึงเหตุการณ์จากบันทึกการเปลี่ยนแปลง: เลือกระเบียนจาก CDHDR และ CDPOS ที่มี OBJECTCLAS เป็น 'VERKBELEG' สำหรับใบสั่งขายที่เลือก วนดูผลลัพธ์เพื่อระบุการเปลี่ยนแปลงของฟิลด์ เช่น การเปลี่ยน VBAK-LIFSK หมายถึง 'Delivery Block Set' และการเปลี่ยน VBUK-CMGST หมายถึง 'Credit Check Performed' การเปลี่ยนแปลงอื่นที่เกี่ยวข้องสามารถบันทึกเป็น 'Sales Order Changed'
- ดึงข้อมูลการไหลของเอกสาร: สำหรับใบสั่งขายที่เลือก ให้ค้นหาตารางการไหลของเอกสาร (VBFA) ซึ่งเชื่อมใบสั่งขายกับเอกสารที่ตามมา เช่น การจัดส่ง การเคลื่อนไหวสินค้า และใบแจ้งหนี้ เลือกเอกสารที่เกี่ยวข้องทั้งหมดเพื่อนำไปประมวลผลต่อ
- ดึงเหตุการณ์การจัดส่งและการดำเนินการตามคำสั่งซื้อ: ใช้หมายเลขเอกสารการจัดส่งจาก VBFA ค้นหา LIKP และ LIPS เพื่อเก็บเหตุการณ์ 'Delivery Created' ค้นหาเอกสารการเบิกจ่ายสินค้าใน MKPF และ MSEG โดยใช้ประเภทการเคลื่อนไหว '601' เพื่อเก็บเหตุการณ์ 'Goods Issued' หากเปิดใช้ Warehouse Management ให้ค้นหา LTAK และ LTAP เพื่อหาเวลายืนยันของรายการคำสั่งโอนรายการสุดท้าย แล้วใช้ระบุ 'Picking Completed' ตรวจสอบสถานะส่วนหัวการจัดส่ง VBUK-PODAT เพื่อเก็บเหตุการณ์ 'Proof of Delivery Confirmed'
- ดึงเหตุการณ์การออกใบแจ้งหนี้และการชำระเงิน: ใช้หมายเลขเอกสารวางบิลจาก VBFA ค้นหา VBRK และ VBRP เพื่อเก็บเหตุการณ์ 'Invoice Created' และ 'Invoice Cancelled' (เมื่อ VBRK-FKSTO = 'X') หากต้องการหา 'Payment Received' ให้เชื่อมใบแจ้งหนี้จาก VBRK กับเอกสารบัญชีใน BKPF แล้วค้นหาเอกสารหักล้างและวันที่หักล้างใน BSAD
- ดึงเหตุการณ์จากสถานะ: ใช้ตารางสถานะ VBUP (สถานะรายการ) และ VBUK (สถานะส่วนหัว) เพื่ออนุมานเหตุการณ์ทางธุรกิจ เช่น ถือว่ารายการสินค้าในใบสั่งขายเป็น 'Order Item Closed' เมื่อ VBUP-GBSTA เท่ากับ 'C' ส่วนใบสั่งขายเป็น 'Order Cancelled' เมื่อกำหนด 'Reason for Rejection' (VBAP-ABGRU) ให้กับทุกรายการที่เกี่ยวข้อง
- รวมและจัดรูปแบบข้อมูล: รวมเหตุการณ์ทั้งหมดไว้ในตารางภายในสุดท้าย ตรวจสอบว่าแอตทริบิวต์ทั้งหมด เช่น SalesOrder, Activity, StartTime และ User มีค่าถูกต้องในแต่ละระเบียนเหตุการณ์ เพิ่ม SourceSystem และเวลาประทับ LastDataUpdate
- สร้างไฟล์ผลลัพธ์: ใช้ฟังก์ชันโมดูล GUI_DOWNLOAD หรือเมธอด cl_gui_frontend_services=>gui_download เพื่อส่งออกตารางภายในสุดท้ายเป็นไฟล์ CSV ในเครื่องของผู้ใช้ บันทึกไฟล์ด้วยการเข้ารหัส UTF-8
การกำหนดค่า
- ข้อกำหนดเบื้องต้น: ต้องมีสิทธิ์สำหรับนักพัฒนา ABAP เช่น เข้าถึงธุรกรรม SE38 และมีสิทธิ์อ่านตาราง SAP ที่จำเป็นทั้งหมด ได้แก่ VBAK, VBAP, CDHDR, CDPOS, VBFA, LIKP, LIPS, VBRK, VBRP, MKPF, MSEG และ BSAD
- พารามิเตอร์การเลือกข้อมูล: โปรแกรมต้องมีหน้าจอเลือกข้อมูลพร้อมพารามิเตอร์สำหรับกรองข้อมูล พารามิเตอร์สำคัญ ได้แก่:
- ช่วงวันที่: กำหนดช่วงวันที่สร้างคำสั่งซื้อขาย (VBAK-ERDAT) ซึ่งเป็นข้อมูลบังคับ เริ่มจากข้อมูลย้อนหลัง 3-6 เดือนเพื่อให้จัดการชุดข้อมูลได้สะดวก
- องค์กรฝ่ายขาย: กรองด้วย VBAK-VKORG เพื่อวิเคราะห์เฉพาะหน่วยธุรกิจที่ต้องการ
- ประเภทเอกสารการขาย: กรองด้วย VBAK-AUART เพื่อเลือกเฉพาะประเภทคำสั่งซื้อที่เกี่ยวข้อง เช่น คำสั่งซื้อมาตรฐาน และตัดประเภทอื่น เช่น ใบเสนอราคาหรือการคืนสินค้าออก
- ข้อควรพิจารณาด้านประสิทธิภาพ: การดึงข้อมูลปริมาณมากจากตารางบันทึกการเปลี่ยนแปลง (CDHDR, CDPOS) และลำดับเอกสาร (VBFA) อาจใช้เวลานาน ควรปรับโปรแกรมให้ใช้ฟิลด์ดัชนีในเงื่อนไข WHERE หากต้องดึงข้อมูลจำนวนมาก ให้ตั้งเวลาเรียกโปรแกรมเป็นงานเบื้องหลังในช่วงที่มีการใช้งานน้อยผ่านธุรกรรม SM36
- การเปิดใช้บันทึกการเปลี่ยนแปลง: วิธีนี้ใช้ฟังก์ชันเอกสารการเปลี่ยนแปลงของ SAP ตรวจสอบว่าเปิดบันทึกการเปลี่ยนแปลงสำหรับองค์ประกอบข้อมูลสำคัญ เช่น LIFSK, CMGST และ ABGRU แล้ว โดยตรวจสอบได้ผ่านธุรกรรม SCDO สำหรับออบเจ็กต์ VERKBELEG.
ตัวอย่างคำค้น abap
REPORT Z_O2C_PM_EXTRACTOR.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
TABLES: vbak.
TYPES: BEGIN OF ty_event_log,
salesorder TYPE vbeln_va,
activity TYPE string,
starttime TYPE string,
sourcesystem TYPE logsys,
lastdataupdate TYPE string,
user TYPE ernam,
customernumber TYPE kunnr,
salesorganization TYPE vkorg,
netamount TYPE netwr,
materialnumber TYPE matnr,
deliveryblock TYPE lifsk,
rejectionreason TYPE abgru,
salesordercycletime TYPE string, " Placeholder for calculation
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
DATA: gs_event_log TYPE ty_event_log.
DATA: gv_sysid TYPE logsys.
DATA: gv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbak-erdat OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_auart FOR vbak-auart.
PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY DEFAULT 'C:\temp\o2c_event_log.csv'.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = gv_sysid.
CONCATENATE sy-datum sy-uzeit INTO gv_last_update.
PERFORM get_base_data.
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*& Form get_base_data
*&---------------------------------------------------------------------*
FORM get_base_data.
TYPES: BEGIN OF ty_order_item,
vbeln TYPE vbeln_va,
posnr TYPE posnr_va,
erdat TYPE erdat,
erzet TYPE erzet,
ernam TYPE ernam,
kunnr TYPE kunnr,
vkorg TYPE vkorg,
netwr TYPE netwr_ak,
matnr TYPE matnr,
lifsk TYPE lifsk,
abgru TYPE abgru,
END OF ty_order_item.
DATA: lt_order_items TYPE TABLE OF ty_order_item.
SELECT h~vbeln i~posnr h~erdat h~erzet h~ernam h~kunnr h~vkorg h~netwr i~matnr h~lifsk i~abgru
INTO TABLE lt_order_items
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN s_erdat
AND h~vkorg IN s_vkorg
AND h~auart IN s_auart.
CHECK sy-subrc = 0.
DATA(lt_vbeln_range) = VALUE rsdsselopt_t(
FOR <fs_item> IN lt_order_items WHERE ( vbeln = <fs_item>-vbeln )
( sign = 'I' option = 'EQ' low = <fs_item>-vbeln ) ).
SORT lt_vbeln_range BY low.
DELETE ADJACENT DUPLICATES FROM lt_vbeln_range COMPARING low.
PERFORM extract_order_created USING lt_order_items.
PERFORM extract_changes USING lt_vbeln_range lt_order_items.
PERFORM extract_doc_flow_events USING lt_vbeln_range lt_order_items.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_order_created
*&---------------------------------------------------------------------*
FORM extract_order_created USING it_order_items TYPE ANY TABLE.
FIELD-SYMBOLS: <fs_item> TYPE any.
DATA: lt_unique_orders TYPE HASHED TABLE OF vbeln_va WITH UNIQUE KEY table_line.
lt_unique_orders = VALUE #( FOR <order> IN it_order_items ( CONV vbeln_va( <order>-vbeln ) ) ).
LOOP AT it_order_items ASSIGNING <fs_item> WHERE table_line IN lt_unique_orders.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Sales Order Created'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
gs_event_log-salesorganization = <fs_item>-vkorg.
gs_event_log-netamount = <fs_item>-netwr.
APPEND gs_event_log TO gt_event_log.
DELETE lt_unique_orders WHERE table_line = <fs_item>-vbeln.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_changes
*&---------------------------------------------------------------------*
FORM extract_changes USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_cdhdr TYPE TABLE OF cdhdr,
lt_cdpos TYPE TABLE OF cdpos.
SELECT * INTO TABLE lt_cdhdr FROM cdhdr
WHERE objectclas = 'VERKBELEG'
AND objectid IN it_vbeln_range
AND tcode = 'VA02'.
IF sy-subrc = 0.
SELECT * INTO TABLE lt_cdpos FROM cdpos
FOR ALL ENTRIES IN lt_cdhdr
WHERE objectclas = lt_cdhdr-objectclas
AND objectid = lt_cdhdr-objectid
AND changenr = lt_cdhdr-changenr.
ENDIF.
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_cdhdr>-objectid ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_cdhdr>-objectid.
gs_event_log-user = <fs_cdhdr>-username.
CONCATENATE <fs_cdhdr>-udate <fs_cdhdr>-utime INTO gs_event_log-starttime.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
" Generic Change Event
gs_event_log-activity = 'Sales Order Changed'.
APPEND gs_event_log TO gt_event_log.
LOOP AT lt_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>)
WHERE objectclas = <fs_cdhdr>-objectclas
AND objectid = <fs_cdhdr>-objectid
AND changenr = <fs_cdhdr>-changenr.
CASE <fs_cdpos>-fname.
WHEN 'LIFSK'. " Delivery Block
gs_event_log-activity = 'Delivery Block Set'.
gs_event_log-deliveryblock = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
WHEN 'CMGST'. " Credit Status
IF <fs_cdpos>-value_new = 'B'. " B = Credit Check OK
gs_event_log-activity = 'Credit Check Performed'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'ABGRU'. " Rejection Reason
IF <fs_cdpos>-value_new IS NOT INITIAL.
gs_event_log-activity = 'Order Cancelled'.
gs_event_log-rejectionreason = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_doc_flow_events
*&---------------------------------------------------------------------*
FORM extract_doc_flow_events USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_vbfa TYPE TABLE OF vbfa,
lt_vbrk TYPE TABLE OF vbrk,
lt_likp TYPE TABLE OF likp,
lt_mseg TYPE TABLE OF mseg,
lt_bsad TYPE TABLE OF bsad,
lt_vbup TYPE TABLE OF vbup.
SELECT * INTO TABLE lt_vbfa FROM vbfa
WHERE vbelv IN it_vbeln_range
AND ( vbtyp_n = 'J' " Delivery
OR vbtyp_n = 'M' " Invoice
OR vbtyp_n = 'N' " Invoice Cancellation
OR vbtyp_n = 'R' ). " Goods Movement
IF lt_vbfa IS INITIAL. RETURN. ENDIF.
SELECT vbeln, erdat, erzet, ernam, fksto, belnr FROM vbrk INTO TABLE lt_vbrk
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln
AND ( lt_vbfa-vbtyp_n = 'M' OR lt_vbfa-vbtyp_n = 'N' ).
SELECT vbeln, erdat, erzet, ernam, podat FROM likp INTO TABLE lt_likp
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln AND lt_vbfa-vbtyp_n = 'J'.
SELECT mblnr, mjahr, zeile, bwart, budat, cpuzt, usnam FROM mseg INTO TABLE lt_mseg
FOR ALL ENTRIES IN lt_vbfa
WHERE mblnr = lt_vbfa-vbeln AND mjahr = lt_vbfa-mjahr AND zeile = lt_vbfa-posnn AND lt_vbfa-vbtyp_n = 'R' AND bwart = '601'.
SELECT augdt, belnr, gjahr, kunnr FROM bsad INTO TABLE lt_bsad
FOR ALL ENTRIES IN lt_vbrk
WHERE belnr = lt_vbrk-belnr AND gjahr = SUBSTRING( val = lt_vbrk-erdat len = 4 ).
SELECT vbeln, posnr, gbsta FROM vbup INTO TABLE lt_vbup
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbelv AND posnr = lt_vbfa-posnv.
LOOP AT lt_vbfa ASSIGNING FIELD-SYMBOL(<fs_vbfa>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_vbfa>-vbelv ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_vbfa>-vbelv.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
gs_event_log-materialnumber = lv_order_info->matnr.
CASE <fs_vbfa>-vbtyp_n.
WHEN 'J'. " Delivery
READ TABLE lt_likp ASSIGNING FIELD-SYMBOL(<fs_likp>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Delivery Created'.
CONCATENATE <fs_likp>-erdat <fs_likp>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_likp>-ernam.
APPEND gs_event_log TO gt_event_log.
" Picking Completed - simplified logic, check status
gs_event_log-activity = 'Picking Completed'. APPEND gs_event_log TO gt_event_log.
" POD Confirmed
IF <fs_likp>-podat IS NOT INITIAL.
gs_event_log-activity = 'Proof Of Delivery Confirmed'.
gs_event_log-starttime = <fs_likp>-podat.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'R'. " Goods Issue
READ TABLE lt_mseg ASSIGNING FIELD-SYMBOL(<fs_mseg>) WITH KEY mblnr = <fs_vbfa>-vbeln mjahr = <fs_vbfa>-mjahr zeile = <fs_vbfa>-posnn.
IF sy-subrc = 0.
gs_event_log-activity = 'Goods Issued'.
CONCATENATE <fs_mseg>-budat <fs_mseg>-cpuzt INTO gs_event_log-starttime.
gs_event_log-user = <fs_mseg>-usnam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'M'. " Invoice
READ TABLE lt_vbrk ASSIGNING FIELD-SYMBOL(<fs_vbrk>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Invoice Created'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
" Payment Received
READ TABLE lt_bsad ASSIGNING FIELD-SYMBOL(<fs_bsad>) WITH KEY belnr = <fs_vbrk>-belnr.
IF sy-subrc = 0 AND <fs_bsad>-augdt IS NOT INITIAL.
gs_event_log-activity = 'Payment Received'.
gs_event_log-starttime = <fs_bsad>-augdt.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'N'. " Invoice Cancellation
READ TABLE lt_vbrk ASSIGNING <fs_vbrk> WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0 AND <fs_vbrk>-fksto = 'X'.
gs_event_log-activity = 'Invoice Cancelled'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Infer other events from status
LOOP AT lt_vbup ASSIGNING FIELD-SYMBOL(<fs_vbup>).
IF <fs_vbup>-gbsta = 'C'.
DATA(lv_order_info_stat) = REF #( it_order_items[ vbeln = <fs_vbup>-vbeln ] ).
IF lv_order_info_stat IS NOT BOUND. CONTINUE. ENDIF.
gs_event_log-salesorder = <fs_vbup>-vbeln.
gs_event_log-activity = 'Order Item Closed'.
" Timestamp for closed is harder, using current time as placeholder
CONCATENATE sy-datum sy-uzeit INTO gs_event_log-starttime.
gs_event_log-user = sy-uname.
gs_event_log-customernumber = lv_order_info_stat->kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
" Order Confirmed (Simplified - assumes if not blocked it's confirmed)
LOOP AT it_order_items ASSIGNING FIELD-SYMBOL(<fs_item>).
IF <fs_item>-lifsk IS INITIAL.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Order Confirmed'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form write_output_file
*&---------------------------------------------------------------------*
FORM write_output_file.
DATA: lt_final_output TYPE TABLE OF ty_event_log.
" Add common fields
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_event>).
<fs_event>-sourcesystem = gv_sysid.
<fs_event>-lastdataupdate = gv_last_update.
ENDLOOP.
SORT gt_event_log BY salesorder starttime.
DELETE ADJACENT DUPLICATES FROM gt_event_log COMPARING ALL FIELDS.
lt_final_output = gt_event_log.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'SalesOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'StartTime' TO lt_fieldnames.
APPEND 'SourceSystem' TO lt_fieldnames.
APPEND 'LastDataUpdate' TO lt_fieldnames.
APPEND 'User' TO lt_fieldnames.
APPEND 'CustomerNumber' TO lt_fieldnames.
APPEND 'SalesOrganization' TO lt_fieldnames.
APPEND 'NetAmount' TO lt_fieldnames.
APPEND 'MaterialNumber' TO lt_fieldnames.
APPEND 'DeliveryBlock' TO lt_fieldnames.
APPEND 'RejectionReason' TO lt_fieldnames.
APPEND 'SalesOrderCycleTime' TO lt_fieldnames.
DATA(lv_header) = REDUCE string(
INIT s = ''
FOR field IN lt_fieldnames
NEXT s = s && COND #( WHEN s = '' THEN field ELSE |,{ field }| ) ).
DATA: lt_file_content TYPE TABLE OF string.
APPEND lv_header TO lt_file_content.
LOOP AT lt_final_output INTO DATA(ls_output).
DATA(lv_line) = |"{ ls_output-salesorder }","{ ls_output-activity }","{ ls_output-starttime }","{ ls_output-sourcesystem }","{ ls_output-lastdataupdate }","{ ls_output-user }","{ ls_output-customernumber }","{ ls_output-salesorganization }",{ ls_output-netamount },"{ ls_output-materialnumber }","{ ls_output-deliveryblock }","{ ls_output-rejectionreason }","{ ls_output-salesordercycletime }"|.
APPEND lv_line TO lt_file_content.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_file_content ).
ENDFORM. ขั้นตอน
- ข้อกำหนดเบื้องต้น: ตรวจสอบว่าคุณมีสิทธิ์เข้าถึงฐานข้อมูล SAP ECC ต้นทางโดยตรงแบบอ่านอย่างเดียว คุณต้องมีเครื่องมือเชื่อมต่อฐานข้อมูล เช่น DBeaver, SQL Server Management Studio หรือ Oracle SQL Developer เพื่อเชื่อมต่อและเรียกใช้คิวรี
- รับสคริปต์ SQL: คัดลอกคิวรี SQL ทั้งหมดจากส่วน 'query' ในเอกสารนี้
- เชื่อมต่อฐานข้อมูล: เปิดเครื่องมือเชื่อมต่อฐานข้อมูลและเชื่อมต่อกับอินสแตนซ์ฐานข้อมูล SAP ECC คุณต้องมีที่อยู่เซิร์ฟเวอร์ พอร์ต ชื่อฐานข้อมูล และข้อมูลรับรองสำหรับเข้าสู่ระบบที่เหมาะสม
- กำหนดค่าคิวรี: วางสคริปต์ SQL ในหน้าต่างตัวแก้ไขคิวรีใหม่ ค้นหาส่วนกำหนดค่าใน Common Table Expression (CTE) หลักที่ชื่อ SalesOrders แล้วแทนค่าตัวอย่างของวันที่เริ่มต้น ('{StartDate}'), วันที่สิ้นสุด ('{EndDate}'), องค์กรฝ่ายขาย ('{SalesOrgs}') และประเภทเอกสาร ('{DocTypes}') ด้วยค่าจริงที่ใช้ในการวิเคราะห์
- เรียกใช้คิวรี: เรียกใช้สคริปต์ SQL ที่กำหนดค่าแล้ว ระยะเวลาทำงานอาจใช้เวลาหลายนาที ขึ้นอยู่กับช่วงวันที่และขนาดฐานข้อมูล SAP ของคุณ
- ตรวจสอบผลลัพธ์: เมื่อคิวรีทำงานเสร็จ ระบบจะแสดงชุดผลลัพธ์ ตรวจดูคร่าว ๆ ว่ามีคอลัมน์ที่คาดไว้ เช่น SalesOrder, Activity และ StartTime และมีแถวข้อมูลของกิจกรรมต่าง ๆ
- ส่งออกข้อมูล: ใช้ฟังก์ชันส่งออกของเครื่องมือฐานข้อมูลเพื่อบันทึกชุดผลลัพธ์เป็นไฟล์ CSV ตั้งชื่อไฟล์ให้สื่อความหมาย เช่น SAP_O2C_Event_Log.csv
- จัดรูปแบบสำหรับ ProcessMind: เปิดไฟล์ CSV ด้วยโปรแกรมแก้ไขสเปรดชีต ตรวจสอบว่าชื่อคอลัมน์ตรงกับแอตทริบิวต์ที่จำเป็นทุกประการ เช่น SalesOrder, Activity และ StartTime ตรวจสอบว่ารูปแบบวันที่และเวลาของ StartTime และ LastDataUpdate สอดคล้องกันและ ProcessMind รองรับ เช่น YYYY-MM-DD HH:MI:SS
- อัปโหลดไปยัง ProcessMind: อัปโหลดไฟล์ CSV ที่จัดรูปแบบเรียบร้อยแล้วไปยังโปรเจกต์ ProcessMind ของคุณเพื่อเริ่มวิเคราะห์
การกำหนดค่า
- ช่วงวันที่: query ใช้ค่าตัวอย่าง ('{StartDate}' และ '{EndDate}') เพื่อกรองคำสั่งซื้อขายตามวันที่สร้าง (VBAK.ERDAT) โดยทั่วไปแนะนำให้วิเคราะห์ข้อมูลย้อนหลัง 3-6 เดือน เพื่อให้ได้ตัวอย่างที่เป็นตัวแทนโดยไม่เพิ่มภาระให้ฐานข้อมูลมากเกินไป
- ตัวกรององค์กรฝ่ายขาย: ใช้ค่า '{SalesOrgs}' เพื่อจำกัดการดึงข้อมูลไว้เฉพาะองค์กรฝ่ายขายที่ต้องการ เช่น '1000' หรือ '2000' วิธีนี้ช่วยให้วิเคราะห์ได้ตรงจุดและ query ทำงานเร็วขึ้น
- ตัวกรองประเภทเอกสาร: ใช้ค่า '{DocTypes}' เพื่อเลือกประเภทคำสั่งซื้อขาย เช่น 'OR' สำหรับคำสั่งซื้อมาตรฐาน ช่วยตัดเอกสารที่ไม่เกี่ยวข้อง เช่น การส่งมอบสินค้าฟรีหรือการคืนสินค้า ออกจากขั้นตอนหลัก
- รหัสระบบต้นทาง: ใช้ค่าตัวอย่างที่กำหนดไว้ '{SourceSystemName}' เพื่อระบุระบบต้นทางให้แต่ละรายการ ควรเปลี่ยนเป็นชื่อที่สื่อความหมายสำหรับ SAP ECC ของคุณ เช่น SAP_ECC_PRD
- ความเข้ากันได้กับฐานข้อมูล: ฟังก์ชันที่ใช้รวมฟิลด์วันที่และเวลา [Your DB-specific timestamp function] เป็นเพียงค่าตัวอย่าง คุณต้องแทนที่ด้วยฟังก์ชันที่ถูกต้องสำหรับฐานข้อมูลของคุณ เช่น TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UZEIT), 'YYYYMMDDHH24MISS') สำหรับ SAP HANA หรือ CAST(CDHDR.UDATE AS DATETIME) + CAST(CDHDR.UZEIT AS DATETIME) สำหรับ SQL Server
- ข้อกำหนดเบื้องต้น: วิธีนี้ต้องใช้ข้อมูลเข้าสู่ระบบฐานข้อมูลที่มีสิทธิ์อ่านเท่านั้น ผู้ใช้ฐานข้อมูลต้องมีสิทธิ์เข้าถึงทุกตารางที่ระบุใน query ได้แก่ VBAK, VBAP, VBFA, CDHDR, CDPOS, LIKP, VBRK และ BSAD.
ตัวอย่างคำค้น sql
WITH SalesOrders AS (
SELECT VBELN
FROM VBAK
WHERE ERDAT BETWEEN '{StartDate}' AND '{EndDate}' -- Filter by creation date
AND VKORG IN ('{SalesOrgs}') -- Filter by Sales Organization(s)
AND AUART IN ('{DocTypes}') -- Filter by Sales Document Type(s)
)
-- 1. Sales Order Created
SELECT
vbak.VBELN AS "SalesOrder",
'Sales Order Created' AS "Activity",
[Your DB-specific timestamp function](vbak.ERDAT, vbak.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbak.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBAK vbak
JOIN SalesOrders so ON vbak.VBELN = so.VBELN
UNION ALL
-- 2. Sales Order Changed
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Sales Order Changed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG' AND cdhdr.TCODE IN ('VA02')
UNION ALL
-- 3. Credit Check Performed (Release)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Credit Check Performed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'CMGST'
AND cdpos.VALUE_NEW = 'B' -- Credit status 'Released'
UNION ALL
-- 4. Order Confirmed (Overall status not blocked)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Order Confirmed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'GBSTK'
AND cdpos.VALUE_OLD <> 'A' AND cdpos.VALUE_NEW = 'A' -- Status changes to 'Not yet processed'
UNION ALL
-- 5. Delivery Block Set
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Delivery Block Set' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
cdpos.VALUE_NEW AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAK'
AND cdpos.FNAME = 'LIFSK'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''
UNION ALL
-- 6. Delivery Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Delivery Created' AS "Activity",
[Your DB-specific timestamp function](likp.ERDAT, likp.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
UNION ALL
-- 7. Picking Completed
SELECT
vbfa.VBELV AS "SalesOrder",
'Picking Completed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN CDHDR cdhdr ON vbfa.VBELN = cdhdr.OBJECTID
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
AND cdhdr.OBJECTCLASS = 'LIEFERUNG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'PKSTK'
AND cdpos.VALUE_NEW = 'C'
UNION ALL
-- 8. Goods Issued
SELECT
vbfa_gi.VBELV AS "SalesOrder",
'Goods Issued' AS "Activity",
[Your DB-specific timestamp function](mkpf.BUDAT, mkpf.CPUTM) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
mkpf.USNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa_gi
JOIN SalesOrders so ON vbfa_gi.VBELV = so.VBELN
JOIN MKPF mkpf ON vbfa_gi.VBELN = mkpf.XBLNR -- XBLNR is Reference Document Number
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa_gi.VBTYP_V = 'J' AND vbfa_gi.VBTYP_N = 'R'
UNION ALL
-- 9. Proof Of Delivery Confirmed
SELECT
vbfa.VBELV AS "SalesOrder",
'Proof Of Delivery Confirmed' AS "Activity",
[Your DB-specific timestamp function](likp.PODAT, '000000') AS "StartTime", -- PODAT is only a date
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.AENAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J' AND likp.PODAT IS NOT NULL AND likp.PODAT <> '00000000'
UNION ALL
-- 10. Invoice Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Created' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
UNION ALL
-- 11. Invoice Cancelled
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Cancelled' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'M' AND vbfa.VBTYP_N = 'N'
UNION ALL
-- 12. Payment Received
SELECT
vbfa.VBELV AS "SalesOrder",
'Payment Received' AS "Activity",
[Your DB-specific timestamp function](bsad.AUGDT, '000000') AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
NULL AS "User", -- Clearing user not readily available here
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN BSAD bsad ON vbrk.VBELN = bsad.VBLNR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
AND bsad.AUGDT IS NOT NULL AND bsad.AUGDT <> '00000000'
UNION ALL
-- 13. Order Item Closed
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Item Closed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
vbap.ABGRU AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUP'
AND cdpos.FNAME = 'GBSTA'
AND cdpos.VALUE_NEW = 'C' -- Item is completely processed
UNION ALL
-- 14. Order Cancelled
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Cancelled' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
cdpos.VALUE_NEW AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAP'
AND cdpos.FNAME = 'ABGRU'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''; พร้อมเริ่มต้นหรือยัง?
ใช้เทมเพลตข้อมูลนี้เพื่อวิเคราะห์กระบวนการ Order to Cash: การประมวลผลคำสั่งซื้อขาย และค้นหาแนวทางเพิ่มประสิทธิภาพและเร่งกระแสเงินสด เริ่มต้นได้วันนี้.
เพิ่มประสิทธิภาพการประมวลผล Order to Cash วันนี้
ขจัดคอขวด ลดระยะเวลารอบงาน 30% และเพิ่มกระแสเงินสดให้เร็วขึ้น.
ไม่ต้องใช้บัตรเครดิต ตั้งค่าเสร็จได้ในไม่กี่นาที.