เทมเพลตข้อมูลใบสั่งซื้อสำหรับกระบวนการจัดซื้อจนถึงชำระเงิน
เทมเพลตข้อมูลใบสั่งซื้อสำหรับกระบวนการจัดซื้อจนถึงชำระเงิน
- แอตทริบิวต์ที่แนะนำให้เก็บ
- กิจกรรมหลักที่ควรติดตาม
- แนวทางนำข้อมูลออกจาก SAP ECC
แอตทริบิวต์ของใบสั่งซื้อสำหรับกระบวนการจัดซื้อจนถึงชำระเงิน
| ชื่อ | คำอธิบาย | ||
|---|---|---|---|
| กิจกรรม Activity | ชื่อของเหตุการณ์หรือขั้นตอนทางธุรกิจที่เกิดขึ้นในวงจรชีวิตของใบสั่งซื้อ. | ||
| คำอธิบาย แอตทริบิวต์นี้อธิบายขั้นตอนหนึ่งในกระบวนการ เช่น 'สร้างใบสั่งซื้อแล้ว' 'อนุมัติใบสั่งซื้อแล้ว' หรือ 'บันทึกรับสินค้าแล้ว' ลำดับกิจกรรมเหล่านี้ประกอบกันเป็นกระบวนการของใบสั่งซื้อแต่ละรายการ. การวิเคราะห์ลำดับ ความถี่ และระยะเวลาระหว่างกิจกรรมเป็นหัวใจของ process mining ช่วยระบุคอขวด การวนกลับไปแก้ไขงาน และขั้นตอนที่เบี่ยงเบนจากมาตรฐาน เพื่อให้ปรับปรุงและกำหนดมาตรฐานได้ตรงจุด. เหตุผลที่สำคัญ กิจกรรมแสดงขั้นตอนต่างๆ ของกระบวนการ การวิเคราะห์ลำดับและช่วงเวลาของกิจกรรมช่วยให้เห็นกระบวนการที่เกิดขึ้นจริง คอขวด และความเบี่ยงเบน. แหล่งข้อมูล ได้จากตารางและบันทึกธุรกรรม SAP หลายแหล่ง เช่น CDHDR/CDPOS สำหรับการเปลี่ยนแปลง EKBE สำหรับ GR/IR และ EBAN สำหรับใบขอซื้อ โดยมักต้องใช้ตรรกะเฉพาะหรือโปรแกรมดึงข้อมูลเพื่อสร้างรายการกิจกรรม. ตัวอย่าง สร้างใบสั่งซื้ออนุมัติใบสั่งซื้อบันทึกการรับสินค้า | |||
| ใบสั่งซื้อ PurchaseOrder | รหัสเฉพาะของเอกสารใบสั่งซื้อ (PO) ซึ่งใช้เป็นกรณีหลักในการติดตามกระบวนการจัดซื้อ. | ||
| คำอธิบาย หมายเลขใบสั่งซื้อเป็นรหัสหลักที่เชื่อมโยงกิจกรรมทั้งหมด ตั้งแต่การสร้างไปจนถึงการรับสินค้าขั้นสุดท้ายและการดำเนินการเสร็จสิ้น หมายเลข PO แต่ละหมายเลขแทนกระบวนการจัดซื้อหนึ่งรายการ. ใน process mining แอตทริบิวต์นี้จำเป็นต่อการสร้างเส้นทางการจัดซื้อแต่ละรายการตั้งแต่ต้นจนจบ ช่วยวิเคราะห์ระยะเวลาของกระบวนการ ความแตกต่างของขั้นตอน และการปฏิบัติตามข้อกำหนดของแต่ละคำสั่งซื้อ จึงเป็นพื้นฐานของแบบจำลองกระบวนการทั้งหมด. เหตุผลที่สำคัญ นี่คือรหัสหลักที่เชื่อมโยงเหตุการณ์ที่เกี่ยวข้องทั้งหมด ทำให้วิเคราะห์วงจรชีวิตของใบสั่งซื้อแต่ละรายการได้ครบถ้วน. แหล่งข้อมูล ตาราง: EKKO, ฟิลด์: EBELN ตัวอย่าง 450001762345000176244500017625 | |||
| เวลาที่เกิดเหตุการณ์ EventTime | วันที่และเวลาที่กิจกรรมเกิดขึ้นอย่างแม่นยำ. | ||
| คำอธิบาย เวลาประทับนี้ระบุเวลาที่เกิดเหตุการณ์อย่างแม่นยำ เช่น เวลาที่อนุมัติ PO หรือบันทึกรับสินค้า และใช้เรียงลำดับกิจกรรมทั้งหมดภายในกรณี. เวลาประทับเป็นข้อมูลพื้นฐานของ process mining เพราะช่วยให้วิเคราะห์ข้อมูลตามเวลาได้ ทั้งการคำนวณระยะเวลาระหว่างกิจกรรม การระบุความล่าช้า การวิเคราะห์ปริมาณงานที่ดำเนินการ และการวัดผลเทียบกับข้อตกลงระดับการให้บริการ (SLA). เหตุผลที่สำคัญ เวลาประทับนี้จำเป็นต่อการคำนวณตัวชี้วัดตามระยะเวลาทั้งหมด เช่น ระยะเวลาของกระบวนการและคอขวด รวมถึงการเรียงเหตุการณ์ตามลำดับเวลา. แหล่งข้อมูล ได้จากฟิลด์วันที่และเวลาหลายรายการในตาราง SAP เช่น EKKO-AEDAT (วันที่เปลี่ยนแปลง), CDHDR-UDATE/UTIME (เวลาประทับในบันทึกการเปลี่ยนแปลง) หรือ EKBE-BUDAT (วันที่ผ่านรายการ). ตัวอย่าง 2023-04-15T10:05:31Z2023-04-16T14:22:00Z2023-05-01T09:00:15Z | |||
| กลุ่มวัสดุ MaterialGroup | การจัดประเภทวัสดุหรือบริการที่มีลักษณะคล้ายกันให้อยู่ในกลุ่มเดียวกัน. | ||
| คำอธิบาย กลุ่มวัสดุหรือหมวดจัดซื้อใช้จำแนกประเภทสินค้าและบริการที่จัดซื้อ เช่น 'อุปกรณ์ไอที' 'เครื่องใช้สำนักงาน' หรือ 'บริการวิชาชีพ'. แอตทริบิวต์นี้สำคัญต่อการวิเคราะห์ค่าใช้จ่ายและทำความเข้าใจรูปแบบการจัดซื้อ ช่วยกรองกระบวนการเพื่อดูว่าแต่ละหมวดมีขั้นตอนอย่างไร ใครเป็นผู้อนุมัติ และผู้ขายรายใดเป็นผู้จัดหา อีกทั้งยังเป็นมิติสำคัญในแดชบอร์ด 'วิเคราะห์มูลค่าใบสั่งซื้อ'. เหตุผลที่สำคัญ ช่วยแบ่งกระบวนการตามหมวดสินค้าและบริการ เพื่อให้เห็นความแตกต่างด้านรูปแบบการทำงาน ระยะเวลาของกระบวนการ หรือผู้ขายในแต่ละหมวดค่าใช้จ่าย. แหล่งข้อมูล ตาราง: EKPO, ฟิลด์: MATKL ตัวอย่าง 00101IT_HWCONSULT | |||
| ชื่อผู้ใช้ UserName | รหัสผู้ใช้ของผู้ที่ดำเนินกิจกรรม. | ||
| คำอธิบาย แอตทริบิวต์นี้บันทึกชื่อผู้ใช้ SAP ของพนักงานที่สร้าง แก้ไข หรืออนุมัติเอกสาร สำหรับขั้นตอนอัตโนมัติ อาจแสดงรหัสผู้ใช้ของระบบหรือชุดงาน. การวิเคราะห์ตามผู้ใช้ช่วยระบุความต้องการด้านการฝึกอบรม ผู้ที่ทำผลงานได้ดี หรือปัญหาที่อาจเกี่ยวข้องกับการปฏิบัติตามข้อกำหนด นอกจากนี้ยังใช้สร้างแดชบอร์ดเพื่อดูการกระจายภาระงาน การปฏิบัติตามลำดับการอนุมัติ และผลงานของทีมงานหรือบุคคลได้. เหตุผลที่สำคัญ เชื่อมโยงการดำเนินการของผู้ใช้กับบุคคลที่ระบุ ช่วยวิเคราะห์ผลงาน ภาระงาน และการปฏิบัติตามข้อกำหนดของแต่ละคน. แหล่งข้อมูล ตาราง: EKKO, ฟิลด์: ERNAM (ผู้สร้าง); ตาราง: CDHDR, ฟิลด์: USERNAME (ผู้แก้ไข). ตัวอย่าง JSMITHMBROWNBATCH_USER | |||
| ประเภทเอกสาร DocumentType | รหัสที่ใช้จำแนกประเภทใบสั่งซื้อ. | ||
| คำอธิบาย ประเภทเอกสารเป็นการตั้งค่าใน SAP ที่ควบคุมช่วงหมายเลข การเลือกฟิลด์ และลำดับการทำงานโดยรวมของใบสั่งซื้อ เช่น อาจมีประเภทแยกสำหรับ PO มาตรฐาน PO บริการ หรือคำสั่งซื้อเพื่อโอนย้ายสินค้า. แอตทริบิวต์นี้ใช้วิเคราะห์กระบวนการได้ เพราะประเภทเอกสารที่ต่างกันมักมีขั้นตอนที่กำหนดไว้ต่างกัน การกรองตามประเภทเอกสารช่วยให้เปรียบเทียบระยะเวลาของกระบวนการและลำดับขั้นตอนได้อย่างเหมาะสม. เหตุผลที่สำคัญ แยกประเภทกระบวนการจัดซื้อ เช่น มาตรฐาน บริการ หรือการคืนสินค้า ซึ่งมักมีขั้นตอนและเป้าหมายด้านผลงานต่างกัน. แหล่งข้อมูล ตาราง: EKKO, ฟิลด์: BSART ตัวอย่าง NBFOUB | |||
| มูลค่าคำสั่งซื้อ OrderAmount | มูลค่ารวมของรายการในใบสั่งซื้อ. | ||
| คำอธิบาย แอตทริบิวต์นี้แสดงมูลค่ารวมของรายการหนึ่งในใบสั่งซื้อ โดยคำนวณจากปริมาณคูณราคาสุทธิ หากต้องการมูลค่า PO ทั้งหมด ต้องรวมมูลค่าของทุกรายการ. การวิเคราะห์กระบวนการตามมูลค่าคำสั่งซื้อช่วยระบุรายการมูลค่าสูงที่อาจต้องมีการควบคุมเข้มงวดขึ้นหรือใช้ลำดับการอนุมัติที่ต่างออกไป ข้อมูลนี้ใช้ในแดชบอร์ด 'วิเคราะห์มูลค่าใบสั่งซื้อ' และช่วยจัดลำดับความสำคัญของการปรับปรุงกระบวนการตามผลกระทบทางการเงิน. เหตุผลที่สำคัญ แสดงมูลค่าทางการเงินของการซื้อแต่ละรายการ ช่วยวิเคราะห์ตามมูลค่าเพื่อจัดลำดับความสำคัญของคำสั่งซื้อมูลค่าสูงหรือค้นหาโอกาสลดต้นทุน. แหล่งข้อมูล ตาราง: EKPO, ฟิลด์: NETWR (มูลค่าสุทธิของคำสั่งซื้อ). ตัวอย่าง 1500.00250.7512345.50 | |||
| รหัสบริษัท CompanyCode | รหัสนิติบุคคลหรือบริษัทที่เป็นผู้เริ่มการจัดซื้อ. | ||
| คำอธิบาย รหัสบริษัทใช้แทนนิติบุคคลอิสระใน SAP โดยบันทึกธุรกรรมทั้งหมดในระดับรหัสบริษัท จึงเป็นหน่วยงานพื้นฐานขององค์กร. การวิเคราะห์กระบวนการตามรหัสบริษัทช่วยเปรียบเทียบประสิทธิภาพการจัดซื้อและการปฏิบัติตามข้อกำหนดระหว่างหน่วยธุรกิจหรือประเทศต่างๆ ช่วยค้นหาแนวทางปฏิบัติที่ดีเพื่อนำไปปรับใช้ในหน่วยงานอื่น หรือระบุหน่วยงานที่มีปัญหาในกระบวนการ. เหตุผลที่สำคัญ ระบุนิติบุคคล ช่วยเปรียบเทียบผลการดำเนินงานของกระบวนการและตรวจสอบการปฏิบัติตามข้อกำหนดในส่วนต่างๆ ขององค์กร. แหล่งข้อมูล ตาราง: EKKO, ฟิลด์: BUKRS ตัวอย่าง 10002100US01 | |||
| หมายเลขผู้ขาย VendorNumber | รหัสเฉพาะของผู้ขายหรือซัพพลายเออร์. | ||
| คำอธิบาย รหัสที่ใช้ระบุผู้ขายสินค้าหรือบริการได้โดยเฉพาะ เป็นข้อมูลหลักที่สำคัญในกระบวนการจัดซื้อ. แอตทริบิวต์นี้จำเป็นต่อการวิเคราะห์ผู้ขาย ช่วยประเมินผลงานการจัดส่ง เปรียบเทียบระยะเวลานำส่งของผู้ขายแต่ละราย และวิเคราะห์รูปแบบค่าใช้จ่าย อีกทั้งยังเป็นมิติหลักของแดชบอร์ด 'ผลงานการจัดส่งของผู้ขาย'. เหตุผลที่สำคัญ ช่วยวิเคราะห์ผลงานผู้ขายและระบุผู้ขายที่เชื่อถือได้ รวมถึงผู้ขายที่ทำให้เกิดความล่าช้าหรือปัญหาด้านคุณภาพ. แหล่งข้อมูล ตาราง: EKKO, ฟิลด์: LIFNR ตัวอย่าง 100345V-20598700112 | |||
| กลุ่มจัดซื้อ PurchasingGroup | ผู้ซื้อหรือกลุ่มผู้ซื้อที่รับผิดชอบกิจกรรมการจัดซื้อ. | ||
| คำอธิบาย กลุ่มจัดซื้อหมายถึงผู้ซื้อรายบุคคลหรือทีมที่รับผิดชอบกิจกรรมการจัดซื้อบางอย่าง และเป็นผู้ติดต่อหลักสำหรับผู้จัดจำหน่าย แอตทริบิวต์นี้ช่วยให้วิเคราะห์ได้ละเอียดกว่าองค์กรจัดซื้อ โดยช่วยให้เห็นการกระจายภาระงานระหว่างผู้ซื้อ และเปรียบเทียบประสิทธิภาพในระดับผู้ซื้อได้ ข้อมูลนี้นำไปใช้ประกอบการจัดสรรทรัพยากรและวางแผนการฝึกอบรม. เหตุผลที่สำคัญ แสดงรายละเอียดว่าใครรับผิดชอบการจัดซื้อ ช่วยวิเคราะห์ภาระงานและประสิทธิภาพของผู้ซื้อหรือทีมได้อย่างละเอียด. แหล่งข้อมูล ตาราง: EKKO, ฟิลด์: EKGRP ตัวอย่าง 001002N01 | |||
| คำขอซื้อ PurchaseRequisition | รหัสใบขอซื้อที่สร้างก่อนใบสั่งซื้อ. | ||
| คำอธิบาย แอตทริบิวต์นี้เชื่อมใบสั่งซื้อกับใบขอซื้อที่เป็นต้นทาง โดย PO บางรายการอาจไม่มีใบขอซื้อก่อนหน้า. ลิงก์นี้จำเป็นต่อการวิเคราะห์แดชบอร์ด 'การแปลงใบขอซื้อเป็นคำสั่งซื้อ' และ KPI 'อัตราการแปลง PR เป็น PO' ช่วยวัดประสิทธิภาพตั้งแต่การส่งคำขอเริ่มต้นจนถึงการสร้างคำสั่งซื้ออย่างเป็นทางการ และระบุ PO ที่สร้างโดยไม่มีใบขอซื้อซึ่งอาจไม่เป็นไปตามข้อกำหนด. เหตุผลที่สำคัญ เชื่อม PO กับคำขอต้นทาง ช่วยวิเคราะห์กระบวนการแปลง PR เป็น PO และระบุ PO ที่สร้างโดยไม่มีใบขอซื้อล่วงหน้า. แหล่งข้อมูล ตาราง: EKPO, ฟิลด์: BANFN ตัวอย่าง 1001589010015891 | |||
| ชื่อผู้ขาย VendorName | ชื่อตามกฎหมายของผู้ขายหรือซัพพลายเออร์. | ||
| คำอธิบาย ชื่อที่อ่านเข้าใจง่ายของผู้ขาย ซึ่งใช้งานสะดวกกว่าหมายเลขผู้ขาย โดยทั่วไปดึงจากข้อมูลหลักของผู้ขาย. หมายเลขผู้ขายใช้เชื่อมโยงข้อมูลและระบุผู้ขายแต่ละราย ส่วนชื่อผู้ขายเหมาะสำหรับแสดงบนแดชบอร์ดและรายงาน ช่วยให้ผู้ใช้ทางธุรกิจที่ไม่คุ้นเคยกับรหัสผู้ขายเข้าใจผลวิเคราะห์ได้ง่ายขึ้น. เหตุผลที่สำคัญ แสดงชื่อผู้ขายที่อ่านเข้าใจง่าย ช่วยให้ผู้ใช้ทางธุรกิจเข้าใจแดชบอร์ดและรายงานได้สะดวกขึ้น. แหล่งข้อมูล ตาราง: LFA1, ฟิลด์: NAME1 ต้องเชื่อม EKKO-LIFNR กับ LFA1-LIFNR. ตัวอย่าง Staples Inc.Global Tech SolutionsOffice Supply Co. | |||
| มีการเปลี่ยนแปลงหลังอนุมัติหรือไม่ IsPostApprovalChange | ตัวบ่งชี้ว่ามีการเปลี่ยนแปลง PO หลังจากอนุมัติครั้งแรกหรือไม่. | ||
| คำอธิบาย แอตทริบิวต์แบบค่าจริง/เท็จนี้จะเป็นจริงเมื่อพบกิจกรรม 'เปลี่ยนใบสั่งซื้อ' หลังจากกิจกรรม 'อนุมัติใบสั่งซื้อ' สำหรับ PO เดียวกัน ช่วยแยกการเปลี่ยนแปลงที่เป็นปัญหาและเกิดขึ้นในช่วงท้ายของกระบวนการ ฟิลด์ที่คำนวณนี้ใช้สนับสนุน KPI 'อัตราการเปลี่ยน PO หลังอนุมัติ' และแดชบอร์ด 'การแก้ไขงานและการเปลี่ยนแปลงใบสั่งซื้อ' โดยตรง ช่วยวัดและแสดงให้เห็นการเปลี่ยนแปลงที่ส่งผลกระทบ ทำให้เกิดความล่าช้าและต้องขออนุมัติใหม่ ซึ่งอาจชี้ถึงปัญหาในการระบุข้อกำหนดหรือกำหนดขอบเขตงานตั้งแต่แรก. เหตุผลที่สำคัญ วัดการแก้ไขงานหลังอนุมัติโดยตรง ซึ่งเป็น KPI สำคัญที่ใช้ประเมินเสถียรภาพและประสิทธิภาพของกระบวนการ หากอัตราสูง อาจบ่งชี้ว่าการกำหนดความต้องการในขั้นตอนก่อนหน้ามีปัญหา. แหล่งข้อมูล แอตทริบิวต์นี้คำนวณจากลำดับกิจกรรมในบันทึกเหตุการณ์. ตัวอย่าง truefalse | |||
| ระบบต้นทาง SourceSystem | ระบบที่ใช้ดึงข้อมูล. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุแหล่งที่มาของข้อมูล ซึ่งโดยทั่วไปคือรหัสอินสแตนซ์ SAP ECC เช่น 'ECC_PROD_100' หากมีหลายระบบ จะช่วยแยกแหล่งข้อมูลออกจากกัน. การทราบระบบต้นทางมีความสำคัญต่อการกำกับดูแลข้อมูลและการติดตามที่มาของข้อมูล ช่วยรักษาความถูกต้องและแก้ไขปัญหาการดึงข้อมูลหรือคุณภาพข้อมูล โดยเฉพาะเมื่อรวมข้อมูลจาก ERP หรือโมดูลต่างๆ. เหตุผลที่สำคัญ ระบุแหล่งที่มาของข้อมูล ซึ่งจำเป็นต่อการกำกับดูแล การตรวจสอบความถูกต้อง และการจัดการการวิเคราะห์จากหลายระบบ. แหล่งข้อมูล โดยทั่วไปจะเพิ่มค่าแบบคงที่นี้ระหว่างการดึงข้อมูล เพื่อระบุระบบต้นทางของชุดข้อมูล. ตัวอย่าง SAP_ECC_PRODECC_EU_100S4H_FIN | |||
| โรงงาน Plant | สถานที่จริงหรือโรงงานที่จัดส่งสินค้าไป. | ||
| คำอธิบาย โรงงานเป็นหน่วยงานที่หมายถึงสถานที่ผลิต คลังสินค้า หรือสถานที่อื่นที่รับสินค้าและบริการ การวิเคราะห์แยกตามโรงงานช่วยให้เห็นความแตกต่างของกระบวนการจัดซื้อในแต่ละพื้นที่ เช่น ระยะเวลาจัดส่งของผู้ขายไปยังแต่ละแห่ง หรือโรงงานที่มีขั้นตอนรับสินค้าที่ไม่มีประสิทธิภาพ ข้อมูลนี้ช่วยวิเคราะห์ได้ว่ารับสินค้าได้ตรงเวลาหรือไม่. เหตุผลที่สำคัญ ระบุสถานที่จัดส่ง ซึ่งช่วยวิเคราะห์ความแตกต่างของกระบวนการในแต่ละภูมิภาคและประสิทธิภาพด้านโลจิสติกส์. แหล่งข้อมูล ตาราง: EKPO, ฟิลด์: WERKS ตัวอย่าง 100011002000 | |||
| วันที่ขอให้ส่งมอบ RequestedDeliveryDate | วันที่ธุรกิจต้องการให้ผู้ขายจัดส่งสินค้าหรือบริการ. | ||
| คำอธิบาย นี่คือวันที่เป้าหมายในการจัดส่งที่ระบุไว้ในใบสั่งซื้อ ใช้เป็นเกณฑ์อ้างอิงสำหรับวัดผลการจัดส่งจริง. วันที่นี้จำเป็นต่อการคำนวณ KPI 'อัตราการรับสินค้าตรงเวลา' โดยเปรียบเทียบวันที่รับสินค้าจริงกับวันที่ต้องการ องค์กรจึงวัดความน่าเชื่อถือของผู้ขายและประสิทธิภาพการรับสินค้าภายในได้ และนำผลไปใช้ในแดชบอร์ด 'ผลงานการจัดส่งของผู้ขาย'. เหตุผลที่สำคัญ วันที่เป้าหมายสำหรับการจัดส่ง ซึ่งจำเป็นต่อการคำนวณ KPI การจัดส่งตรงเวลาและประเมินความน่าเชื่อถือของผู้ขาย. แหล่งข้อมูล ตาราง: EKPO, ฟิลด์: EINDT ตัวอย่าง 2023-06-102023-07-222023-08-01 | |||
| สกุลเงิน Currency | รหัสสกุลเงินของมูลค่าใบสั่งซื้อ. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุสกุลเงินที่ใช้แสดงมูลค่าใบสั่งซื้อ เช่น USD, EUR หรือ GBP เพื่อให้เข้าใจบริบทของมูลค่าเงินได้ถูกต้อง. สำหรับองค์กรที่ดำเนินงานหลายประเทศ สกุลเงินเป็นข้อมูลสำคัญต่อการวิเคราะห์ทางการเงิน ช่วยรวมและเปรียบเทียบมูลค่าคำสั่งซื้อได้อย่างถูกต้อง และต้องพิจารณาสกุลเงินประกอบเมื่อตีความ KPI ทางการเงิน. เหตุผลที่สำคัญ ให้บริบทที่จำเป็นสำหรับมูลค่าเงินทั้งหมด เพื่อให้วิเคราะห์ทางการเงินได้ถูกต้อง โดยเฉพาะในองค์กรที่ดำเนินงานหลายประเทศ. แหล่งข้อมูล ตาราง: EKKO, ฟิลด์: WAERS ตัวอย่าง USDEURJPY | |||
| ส่งมอบตรงเวลาหรือไม่ IsOnTimeDelivery | ตัวบ่งชี้ว่าสินค้ามาถึงภายในหรือก่อนวันที่ขอให้จัดส่งหรือไม่. | ||
| คำอธิบาย แอตทริบิวต์แบบค่าจริง/เท็จนี้จะเป็นจริงเมื่อเวลาของกิจกรรม 'บันทึกรับสินค้า' ตรงกับหรืออยู่ก่อน 'วันที่ขอให้จัดส่ง' จึงแสดงผลการส่งมอบของสินค้าแต่ละรายการใน PO ได้อย่างชัดเจน แอตทริบิวต์นี้เป็นพื้นฐานของ KPI 'อัตราการรับสินค้าตรงเวลา' ช่วยให้วิเคราะห์ประสิทธิภาพของผู้ขายและขั้นตอนรับสินค้าภายในองค์กรได้ง่ายขึ้น โดยสามารถสรุปและกรองรายการส่งมอบตรงเวลาหรือล่าช้าได้. เหตุผลที่สำคัญ แสดงผลการส่งมอบตรงเวลาว่าสำเร็จหรือล่าช้าอย่างชัดเจน รองรับ KPI และแดชบอร์ดด้านประสิทธิภาพของผู้ขายโดยตรง. แหล่งข้อมูล แอตทริบิวต์นี้คำนวณโดยเปรียบเทียบวันที่บันทึกรับสินค้า (EKBE-BUDAT) กับวันที่ขอให้จัดส่ง (EKPO-EINDT). ตัวอย่าง truefalse | |||
| เหตุผลที่ปฏิเสธ RejectionReason | รหัสหรือข้อความที่อธิบายเหตุผลที่ปฏิเสธใบขอซื้อหรือใบสั่งซื้อ. | ||
| คำอธิบาย แอตทริบิวต์นี้บันทึกเหตุผลที่ระบุเมื่อใบสั่งซื้อถูกปฏิเสธในเวิร์กโฟลว์การอนุมัติ ข้อมูลนี้สำคัญต่อการทำความเข้าใจสาเหตุของการแก้ไขงานและความล่าช้า การวิเคราะห์เหตุผลที่ถูกปฏิเสธช่วยให้พบปัญหาที่เกิดซ้ำ เช่น ราคาที่ไม่ถูกต้อง งบประมาณเกินกำหนด หรือการเลือกผู้ขายที่ไม่เป็นไปตามข้อกำหนด เมื่อทราบสาเหตุแล้ว องค์กรจะจัดการปัญหาที่ต้นเหตุ ปรับปรุงคุณภาพการจัดทำ PO ตั้งแต่แรก และทำให้ขั้นตอนอนุมัติคล่องตัวขึ้น. เหตุผลที่สำคัญ ช่วยให้เห็นสาเหตุที่การอนุมัติไม่ผ่านโดยตรง เพื่อปรับปรุงได้ตรงจุด ลดการแก้ไขงาน และย่นระยะเวลาการอนุมัติ. แหล่งข้อมูล ข้อมูลนี้อาจค้นหาได้ยาก เพราะอาจอยู่ในฟิลด์ข้อความยาวหรือขึ้นอยู่กับการตั้งค่าเวิร์กโฟลว์แบบกำหนดเอง โดยทั่วไปต้องอาศัยความรู้เฉพาะด้านการติดตั้งระบบ. ตัวอย่าง ราคาไม่ถูกต้องใช้งบประมาณเกินคำขอซ้ำ | |||
| องค์กรจัดซื้อ PurchasingOrganization | หน่วยงานที่รับผิดชอบการเจรจาราคาและจัดซื้อวัสดุหรือบริการ. | ||
| คำอธิบาย องค์กรจัดซื้อเป็นหน่วยงานสำคัญใน SAP ที่รับผิดชอบกิจกรรมการจัดซื้อ อาจรวมศูนย์สำหรับทั้งบริษัท หรือกระจายตามโรงงานหรือภูมิภาค. การวิเคราะห์ผลการดำเนินงานตามองค์กรจัดซื้อช่วยระบุทีมจัดซื้อที่ทำงานได้มีประสิทธิภาพ และเปรียบเทียบตัวชี้วัด เช่น ระยะเวลาของกระบวนการ อัตราการแก้ไขงาน และค่าใช้จ่ายระหว่างหน่วยงาน เพื่อค้นหาแนวทางปฏิบัติที่ดีและจุดที่ต้องการการสนับสนุน. เหตุผลที่สำคัญ ระบุทีมจัดซื้อที่รับผิดชอบ ช่วยเปรียบเทียบผลงานและวิเคราะห์ระหว่างหน่วยงานต่างๆ. แหล่งข้อมูล ตาราง: EKKO, ฟิลด์: EKORG ตัวอย่าง 1000US01DE01 | |||
| อัปเดตข้อมูลล่าสุด LastDataUpdate | เวลาประทับที่ระบุว่ามีการรีเฟรชข้อมูลจากระบบต้นทางครั้งล่าสุดเมื่อใด. | ||
| คำอธิบาย แอตทริบิวต์นี้บันทึกวันที่และเวลาที่ดึงหรืออัปเดตข้อมูลครั้งล่าสุด เพื่อให้ทราบว่าข้อมูลที่นำมาวิเคราะห์เป็นข้อมูลใหม่เพียงใด. การแสดงข้อมูลนี้บนแดชบอร์ดช่วยให้ผู้ใช้ทราบว่าข้อมูลเชิงลึกอ้างอิงจากข้อมูลที่ใกล้เคียงเวลาจริงหรือข้อมูลย้อนหลัง และช่วยให้เข้าใจอายุของข้อมูลก่อนนำไปใช้ตัดสินใจ. เหตุผลที่สำคัญ ช่วยให้ผู้ใช้ทราบว่าข้อมูลเป็นปัจจุบันเพียงใด และเข้าใจว่าผลวิเคราะห์สะท้อนสถานะล่าสุดของการปฏิบัติการหรือไม่. แหล่งข้อมูล กระบวนการดึงข้อมูลหรือ ETL สร้างและเพิ่มเวลาประทับนี้เมื่อเริ่มทำงาน. ตัวอย่าง 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
กิจกรรมของใบสั่งซื้อสำหรับกระบวนการจัดซื้อจนถึงชำระเงิน
| กิจกรรม | คำอธิบาย | ||
|---|---|---|---|
| ดำเนินการใบสั่งซื้อเสร็จสมบูรณ์ | หมายถึงรายการในใบสั่งซื้อที่ถือว่าส่งมอบครบแล้ว ระบบอนุมานเหตุการณ์นี้โดยทั่วไปจากการกำหนดตัวบ่งชี้ 'ส่งมอบครบแล้ว' ในรายการใบสั่งซื้อโดยอัตโนมัติหรือด้วยตนเอง. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้เป็นจุดสิ้นสุดเชิงตรรกะของขั้นตอนการส่งมอบตามคำสั่งซื้อ จำเป็นต่อการคำนวณระยะเวลารวมของ PO ตั้งแต่สร้างจนเสร็จสิ้น. แหล่งข้อมูล อนุมานจากเอกสารการเปลี่ยนแปลง (CDHDR/CDPOS) ซึ่งบันทึกเวลาที่กำหนดตัวบ่งชี้ 'ส่งมอบครบแล้ว' (EKPO-ELIKZ) เป็น 'X' สำหรับรายการ PO การทำเครื่องหมายรายการสุดท้ายว่าเสร็จแล้วอาจหมายถึงการดำเนินการ PO ทั้งหมดเสร็จสิ้น. บันทึก ระบุเวลาประทับจากเอกสารการเปลี่ยนแปลงเมื่อกำหนดแฟล็ก EKPO-ELIKZ. ประเภทเหตุการณ์ inferred | |||
| บันทึกการรับสินค้า | กิจกรรมนี้หมายถึงการรับสินค้าจากผู้ขายจริงตามใบสั่งซื้อที่ระบุ การบันทึกรับสินค้าเป็นการดำเนินการที่ชัดเจน เช่น ผ่านธุรกรรม MIGO ซึ่งสร้างเอกสารวัสดุและปรับปรุงสินค้าคงคลัง. | ||
| เหตุผลที่สำคัญ นี่คือหมุดหมายสำคัญในการติดตามผลงานการจัดส่งของผู้ขาย และเป็นจุดเริ่มต้นของกระบวนการตรวจสอบใบแจ้งหนี้ ใช้คำนวณอัตราการจัดส่งตรงเวลาและความตรงต่อเวลาของการรับสินค้า. แหล่งข้อมูล บันทึกเมื่อสร้างเอกสารวัสดุ โดยใช้วันที่ผ่านรายการ (MKPF-BUDAT) หรือวันที่สร้าง (MKPF-CPUDT) จากตารางส่วนหัวเอกสารวัสดุ (MKPF) ซึ่งเชื่อมโยงกับ PO ผ่านตารางรายการ (MSEG). บันทึก ใช้เวลาผ่านรายการหรือเวลาสร้างจากตาราง MKPF สำหรับเอกสารวัสดุที่อ้างอิงถึง PO. ประเภทเหตุการณ์ explicit | |||
| ส่งใบสั่งซื้อให้ผู้ขาย | กิจกรรมนี้หมายถึงการส่งใบสั่งซื้อที่อนุมัติแล้วไปยังผู้ขายอย่างเป็นทางการ เช่น ผ่าน EDI อีเมล หรือเอกสารพิมพ์ ระบบบันทึกเหตุการณ์นี้ในตารางควบคุมข้อความเมื่อประมวลผลข้อความขาออกสำเร็จ. | ||
| เหตุผลที่สำคัญ นี่คือหมุดหมายสำคัญที่เริ่มนับระยะเวลานำส่งของผู้ขาย การวิเคราะห์เวลาตั้งแต่เหตุการณ์นี้จนถึงการรับสินค้าเป็นหัวใจสำคัญในการประเมินผลงานผู้ขายและความตรงต่อเวลาของการจัดส่ง. แหล่งข้อมูล บันทึกในตารางสถานะข้อความ (NAST) โดยใช้วันที่และเวลาจาก NAST-DATVR และ NAST-UHRVR เมื่อสถานะการประมวลผล (NAST-VSTAT) เป็น '1' (ประมวลผลสำเร็จ) สำหรับประเภทข้อความขาออกของ PO ที่เกี่ยวข้อง. บันทึก ใช้เวลาประมวลผลจากตาราง NAST สำหรับข้อความขาออกของ PO. ประเภทเหตุการณ์ explicit | |||
| สร้างใบขอซื้อ | กิจกรรมนี้หมายถึงการสร้างคำขอซื้อสินค้าหรือบริการอย่างเป็นทางการ ระบบบันทึกเหตุการณ์นี้เมื่อผู้ใช้บันทึกเอกสารใบขอซื้อใหม่ เช่น ผ่านธุรกรรม ME51N และสร้างระเบียนเฉพาะในตาราง EBAN. | ||
| เหตุผลที่สำคัญ นี่คือจุดเริ่มต้นหลักของกระบวนการจัดซื้อ การวิเคราะห์ระยะเวลาตั้งแต่เหตุการณ์นี้จนถึงการสร้างใบสั่งซื้อช่วยวัดประสิทธิภาพในการเปลี่ยนความต้องการภายในให้เป็นคำสั่งซื้อที่ดำเนินการได้. แหล่งข้อมูล บันทึกเมื่อมีการสร้างรายการในตารางส่วนหัวใบขอซื้อ (EBAN) โดยใช้วันที่สร้าง (EBAN-BADAT) และเวลาเป็นเวลาประทับของเหตุการณ์นี้. บันทึก ค้นหารายการใหม่ในตาราง EBAN โดยอ้างอิงวันที่สร้าง. ประเภทเหตุการณ์ explicit | |||
| สร้างใบสั่งซื้อ | กิจกรรมนี้หมายถึงการสร้างเอกสารใบสั่งซื้ออย่างเป็นทางการ ซึ่งเป็นสัญญาผูกพันกับผู้ขาย ระบบบันทึกเหตุการณ์นี้เมื่อผู้ใช้สร้างและบันทึก PO เช่น ผ่านธุรกรรม ME21N ทำให้เกิดรายการในตาราง EKKO และ EKPO. | ||
| เหตุผลที่สำคัญ เป็นจุดเริ่มต้นอย่างเป็นทางการของวงจรชีวิตใบสั่งซื้อ และเป็นหมุดหมายสำคัญในการวัดทั้งระยะเวลาแปลง PR เป็น PO และระยะเวลาตั้งแต่ต้นจนจบของการจัดส่งตามคำสั่งซื้อ. แหล่งข้อมูล ดึงข้อมูลจากวันที่สร้าง (EKKO-AEDAT) ในตารางส่วนหัวใบสั่งซื้อ (EKKO) ของหมายเลข PO ที่เกี่ยวข้อง (EKKO-EBELN). บันทึก ใช้เวลาประทับการสร้างจากตาราง EKKO สำหรับใบสั่งซื้อใหม่แต่ละรายการ. ประเภทเหตุการณ์ explicit | |||
| อนุมัติใบสั่งซื้อ | หมายถึงการอนุมัติใบสั่งซื้อขั้นสุดท้าย ซึ่งอนุญาตให้ส่งใบสั่งซื้อไปยังผู้ขายได้ โดยทั่วไปอนุมานหมุดหมายนี้จากการเปลี่ยนสถานะการอนุมัติของ PO เป็นสถานะ 'อนุมัติครบถ้วน' หรือ 'อนุมัติแล้ว'. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้สำคัญต่อการคำนวณ KPI ระยะเวลาการอนุมัติ PO และการระบุคอขวดใน workflow การอนุมัติ อีกทั้งยังเป็นเงื่อนไขก่อนดำเนินกิจกรรมถัดไปส่วนใหญ่ เช่น การส่งคำสั่งซื้อให้ผู้ขาย. แหล่งข้อมูล อนุมานโดยติดตามบันทึกการเปลี่ยนแปลง (CDHDR/CDPOS) ของตารางส่วนหัวใบสั่งซื้อ (EKKO) เพื่อดูเวลาที่ใช้รหัสอนุมัติขั้นสุดท้าย หรือเวลาที่กำหนดตัวบ่งชี้สถานะการอนุมัติโดยรวม (EKKO-FRGKE) เป็น 'อนุมัติแล้ว'. บันทึก ระบุเวลาประทับที่สถานะการอนุมัติโดยรวมของ PO (EKKO-FRGKE) เปลี่ยนเป็นสถานะอนุมัติขั้นสุดท้าย. ประเภทเหตุการณ์ inferred | |||
| แก้ไขใบสั่งซื้อ | หมายถึงการแก้ไขใบสั่งซื้อหลังจากสร้างครั้งแรก เช่น เปลี่ยนปริมาณ ราคา หรือวันที่จัดส่ง SAP บันทึกการเปลี่ยนแปลงเหล่านี้ไว้อย่างชัดเจนในระบบเอกสารการเปลี่ยนแปลง. | ||
| เหตุผลที่สำคัญ การแก้ไขบ่อยครั้ง โดยเฉพาะหลังอนุมัติแล้ว อาจบ่งชี้ว่ากระบวนการไม่มีประสิทธิภาพ วางแผนตั้งแต่ต้นไม่ดี หรือมีการเปลี่ยนขอบเขตงาน กิจกรรมนี้จำเป็นต่อแดชบอร์ดการแก้ไขและงานแก้ไข PO รวมถึง KPI ที่เกี่ยวข้อง. แหล่งข้อมูล บันทึกไว้อย่างชัดเจนในตารางส่วนหัวเอกสารการเปลี่ยนแปลง (CDHDR) และรายการ (CDPOS) สำหรับออบเจ็กต์ใบสั่งซื้อ (EINKBELEG) การเปลี่ยนแปลงแต่ละครั้งจะสร้างรายการใหม่พร้อมเวลาประทับ. บันทึก ดึงเหตุการณ์การเปลี่ยนแปลงและเวลาประทับจากตาราง CDHDR และ CDPOS ที่เชื่อมโยงกับหมายเลขใบสั่งซื้อ. ประเภทเหตุการณ์ explicit | |||
| ตรวจสอบคุณภาพสินค้า | หมายถึงสินค้าที่รับเข้ามาผ่านการตรวจสอบคุณภาพแล้ว โดยทั่วไปอนุมานกิจกรรมนี้เมื่อมีการตัดสินใจการใช้งานสำหรับล็อตตรวจสอบที่สร้างขึ้นตอนรับสินค้าในโมดูล Quality Management. | ||
| เหตุผลที่สำคัญ สำหรับอุตสาหกรรมที่ให้ความสำคัญกับคุณภาพ กิจกรรมนี้ช่วยวิเคราะห์ระยะเวลาและผลการตรวจสอบ ความล่าช้าในขั้นตอนนี้อาจทำให้เกิดคอขวดระหว่างการรับสินค้ากับการพร้อมนำไปใช้งาน. แหล่งข้อมูล อนุมานจากโมดูล Quality Management โดยสร้างล็อตตรวจสอบในตาราง QALS เมื่อรับสินค้า และระบุกิจกรรมจากการสร้างการตัดสินใจการใช้งานในตาราง QAVE ซึ่งมีเวลาประทับกำกับ. บันทึก ระบุเวลาประทับของการตัดสินใจการใช้งานในตาราง QAVE สำหรับล็อตตรวจสอบที่เชื่อมโยงกับเอกสารวัสดุ. ประเภทเหตุการณ์ inferred | |||
| บันทึกการยืนยันการให้บริการ | สำหรับใบสั่งซื้อบริการ กิจกรรมนี้หมายถึงการยืนยันว่าให้บริการแล้ว ระบบบันทึกเหตุการณ์นี้เมื่อสร้างใบรับบริการ (Service Entry Sheet) เช่น ผ่านธุรกรรม ML81N. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้เทียบเท่ากับการรับสินค้าในกรณีบริการ และจำเป็นต่อการติดตามการส่งมอบบริการตามคำสั่งซื้อ อีกทั้งยังเริ่มกระบวนการชำระเงินค่าบริการ. แหล่งข้อมูล ดึงข้อมูลจากวันที่สร้าง (ESSR-ERDAT) ในตารางส่วนหัวใบรับบริการ (ESSR) โดยเชื่อมโยงกับใบสั่งซื้อผ่านตาราง ESLL. บันทึก ใช้เวลาประทับการสร้างจากตาราง ESSR สำหรับใบรับบริการที่เชื่อมโยงกับ PO. ประเภทเหตุการณ์ explicit | |||
| ปฏิเสธใบสั่งซื้อ | กิจกรรมนี้เกิดขึ้นเมื่อผู้อนุมัติปฏิเสธใบสั่งซื้อระหว่าง workflow การอนุมัติ ระบบอนุมานเหตุการณ์นี้จากการเปลี่ยนสถานะในข้อมูลกลยุทธ์การอนุมัติของ PO ซึ่งบ่งชี้ว่ามีการปฏิเสธ. | ||
| เหตุผลที่สำคัญ การติดตามการปฏิเสธช่วยระบุปัญหาด้านคุณภาพข้อมูล PO การไม่ปฏิบัติตามนโยบาย หรือปัญหาในลำดับการอนุมัติ โดยมักทำให้ต้องแก้ไขงานและเพิ่มระยะเวลารวมของกระบวนการ. แหล่งข้อมูล อนุมานจากเอกสารการเปลี่ยนแปลง (CDHDR/CDPOS) ของสถานะการอนุมัติใบสั่งซื้อ โดยทั่วไปจะบันทึกการปฏิเสธเมื่อยกเลิกรหัสอนุมัติ หรือกำหนดสถานะการปฏิเสธโดยเฉพาะ. บันทึก ติดตามบันทึกการเปลี่ยนแปลงเพื่อดูการยกเลิกรหัสอนุมัติหรือการเปลี่ยนสถานะที่บ่งชี้ว่าถูกปฏิเสธ. ประเภทเหตุการณ์ inferred | |||
| ลบใบสั่งซื้อ | หมายถึงการยกเลิกหรือลบรายการใบสั่งซื้อในระบบ เพื่อไม่ให้ดำเนินการต่อ เช่น รับสินค้าหรือออกใบแจ้งหนี้ ระบบอนุมานเหตุการณ์นี้เมื่อกำหนดตัวบ่งชี้การลบในรายการ PO. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้เป็นสถานะสิ้นสุดที่บ่งชี้ว่ามีการยกเลิกคำสั่งซื้อ การวิเคราะห์สาเหตุและเวลาที่ลบคำสั่งซื้ออาจช่วยค้นพบปัญหาในการวางแผนความต้องการหรือการเลือกผู้ขาย. แหล่งข้อมูล อนุมานจากเอกสารการเปลี่ยนแปลง (CDHDR/CDPOS) ที่แสดงว่ากำหนดตัวบ่งชี้การลบ (EKPO-LOEKZ) เป็น 'L' สำหรับรายการใบสั่งซื้อ. บันทึก ระบุเวลาประทับจากเอกสารการเปลี่ยนแปลงเมื่อกำหนดแฟล็ก EKPO-LOEKZ. ประเภทเหตุการณ์ inferred | |||
| ส่งคืนสินค้าให้ผู้ขาย | หมายถึงการส่งสินค้าที่รับมาแล้วคืนให้ผู้ขาย ซึ่งมักเกิดจากปัญหาคุณภาพหรือการจัดส่งไม่ถูกต้อง ระบบบันทึกเหตุการณ์นี้เมื่อผ่านรายการเอกสารวัสดุโดยใช้ประเภทการเคลื่อนไหวสำหรับการคืนสินค้าโดยเฉพาะ. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้ชี้ให้เห็นปัญหาด้านคุณภาพของผู้ขายหรือความถูกต้องของคำสั่งซื้อ และเป็นตัวบ่งชี้สำคัญของงานที่ต้องแก้ไข จำเป็นต่อการคำนวณ KPI อัตราความคลาดเคลื่อนในการรับสินค้า. แหล่งข้อมูล บันทึกในตารางเอกสารวัสดุ (MKPF/MSEG) เมื่อใช้ประเภทการเคลื่อนไหวสำหรับการคืนสินค้า เช่น '122' สำหรับการคืนสินค้าให้ผู้ขาย โดยใช้วันที่ผ่านรายการ (MKPF-BUDAT) เป็นเวลาประทับ. บันทึก ค้นหาเอกสารวัสดุที่ใช้ประเภทการเคลื่อนไหวสำหรับการคืนสินค้า เช่น 122 และอ้างอิงถึง PO ต้นทาง. ประเภทเหตุการณ์ explicit | |||
| ส่งใบสั่งซื้อเพื่อขออนุมัติ | หมายถึงการส่งใบสั่งซื้อที่สร้างหรือแก้ไขแล้วเพื่อขออนุมัติตามกลยุทธ์การอนุมัติที่กำหนดค่าไว้ ระบบอนุมานเหตุการณ์นี้เมื่อเริ่มใช้กลยุทธ์การอนุมัติและ PO เข้าสู่สถานะรออนุมัติ. | ||
| เหตุผลที่สำคัญ การแยกช่วงสร้าง PO ออกจากช่วงเริ่มต้นการอนุมัติช่วยวัด KPI ระยะเวลาการอนุมัติได้อย่างแม่นยำ และทำให้เห็นความล่าช้าก่อนเริ่ม workflow การอนุมัติ. แหล่งข้อมูล อนุมานจากเอกสารการเปลี่ยนแปลง (CDHDR/CDPOS) ของใบสั่งซื้อ (ออบเจ็กต์ EINKBELEG) ซึ่งแสดงการกำหนดสถานะการอนุมัติครั้งแรก หรือเมื่อกำหนดสถานะการอนุมัติโดยรวม (EKKO-FRGKE) เป็นค่าที่บ่งชี้ว่ากระบวนการอนุมัติกำลังดำเนินอยู่. บันทึก ค้นหารายการแรกในเอกสารการเปลี่ยนแปลงที่เริ่มใช้กลยุทธ์การอนุมัติสำหรับ PO. ประเภทเหตุการณ์ inferred | |||
| อนุมัติใบขอซื้อ | หมายถึงการอนุมัติใบขอซื้ออย่างเป็นทางการ ซึ่งอนุญาตให้นำไปสร้างเป็นใบสั่งซื้อได้ ระบบอนุมานเหตุการณ์นี้จากการเปลี่ยนแปลงฟิลด์สถานะการอนุมัติในข้อมูลใบขอซื้อ ซึ่ง SAP ติดตามผ่าน workflow กลยุทธ์การอนุมัติ. | ||
| เหตุผลที่สำคัญ การติดตามการอนุมัติช่วยระบุคอขวดในขั้นตอนก่อนสั่งซื้อ และตรวจสอบว่าปฏิบัติตามนโยบายการอนุมัติหรือไม่ ความล่าช้าในขั้นตอนนี้ส่งผลโดยตรงต่อระยะเวลารวมของกระบวนการจัดซื้อ. แหล่งข้อมูล อนุมานจากบันทึกการเปลี่ยนแปลงของตารางใบขอซื้อ (EBAN) โดยติดตามการเปลี่ยนแปลงฟิลด์สถานะการอนุมัติ เช่น EBAN-FRGZU หรือวิเคราะห์เอกสารการเปลี่ยนแปลงใน CDHDR/CDPOS สำหรับออบเจ็กต์ EBAN. บันทึก ติดตามเอกสารการเปลี่ยนแปลงของฟิลด์สถานะการอนุมัติใน EBAN เพื่อระบุเวลาประทับของการอนุมัติขั้นสุดท้าย. ประเภทเหตุการณ์ inferred | |||
คู่มือการนำข้อมูลออก
ขั้นตอน
- สร้างโปรแกรม ABAP: เปิด ABAP Editor ด้วยรหัสธุรกรรม SE38 ตั้งชื่อโปรแกรมใหม่ เช่น Z_PM_PO_EXTRACT แล้วคลิก 'สร้าง' ระบุชื่อเรื่อง เช่น 'การดึงข้อมูลใบสั่งซื้อสำหรับ Process Mining' และตั้งประเภทเป็น 'โปรแกรมที่เรียกใช้ได้'
- กำหนดหน้าจอเลือกข้อมูล: กำหนดพารามิเตอร์บนหน้าจอเลือกข้อมูลในโปรแกรม เพื่อให้ผู้ใช้กรองข้อมูลที่จะดึง พารามิเตอร์สำคัญ ได้แก่ ช่วงวันที่สร้างใบสั่งซื้อ รหัสบริษัท (BUKRS) และประเภทเอกสารจัดซื้อ (BSART)
- กำหนดโครงสร้างข้อมูล: ประกาศโครงสร้างตารางภายในให้ตรงกับรูปแบบบันทึกเหตุการณ์ปลายทาง โดยควรมีแอตทริบิวต์ที่จำเป็นและแนะนำทั้งหมด ได้แก่ PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode และ DocumentType
- เขียนตรรกะเลือกข้อมูล: เขียนตรรกะหลักของ ABAP เพื่อเลือกข้อมูลสำหรับกิจกรรมที่ต้องใช้ทั้ง 14 รายการ โดยค้นหาข้อมูลจากตาราง SAP หลายตาราง เช่น EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS และ NAST ใช้รูทีนย่อยแยกกัน (PERFORM) สำหรับแต่ละกิจกรรม เพื่อให้โค้ดเป็นระเบียบ
- เลือกข้อมูลใบขอซื้อ: ค้นหาตาราง EBAN เพื่อดึงเหตุการณ์ 'สร้างใบขอซื้อ' และเชื่อมโยงกับใบสั่งซื้อผ่านตาราง EKPO ใช้ตารางบันทึกการเปลี่ยนแปลง (CDHDR, CDPOS) ระบุเหตุการณ์ 'อนุมัติใบขอซื้อ' โดยติดตามการเปลี่ยนแปลงฟิลด์สถานะการอนุมัติ
- เลือกเหตุการณ์หลักของใบสั่งซื้อ: ค้นหาตาราง EKKO และ EKPO เพื่อดึงเหตุการณ์ 'สร้างใบสั่งซื้อ' ใช้ตารางบันทึกการเปลี่ยนแปลง (CDHDR, CDPOS) ของออบเจ็กต์ EINKBELEG เพื่อดึงเหตุการณ์ 'เปลี่ยนแปลงใบสั่งซื้อ', 'อนุมัติใบสั่งซื้อ', 'ปฏิเสธใบสั่งซื้อ', 'ดำเนินการใบสั่งซื้อเสร็จสิ้น' และ 'ลบใบสั่งซื้อ' โดยอ้างอิงการเปลี่ยนแปลงฟิลด์เฉพาะ เช่น ตัวบ่งชี้การอนุมัติและตัวบ่งชี้การลบ
- เลือกเหตุการณ์การสื่อสารใบสั่งซื้อ: ค้นหาตาราง NAST เพื่อหารายการที่ส่งใบสั่งซื้อสำเร็จ แล้วบันทึกกิจกรรม 'ส่งใบสั่งซื้อให้ผู้ขาย'
- เลือกเหตุการณ์สินค้าและบริการ: ค้นหาการลงรายการเอกสารวัสดุในตาราง EKBE เพื่อระบุกิจกรรม 'ลงรายการรับสินค้า' และ 'ส่งคืนสินค้า' โดยอ้างอิงหมวดหมู่ประเภทการเคลื่อนย้าย ค้นหาตาราง ESSR และ ESLL สำหรับใบรับบริการ เพื่อบันทึก 'บันทึกการยืนยันบริการ'
- เลือกเหตุการณ์การจัดการคุณภาพ: หากใช้โมดูล Quality Management ให้ค้นหาตาราง QALS และ QAVE เพื่อระบุเวลาที่มีการตัดสินใจใช้งานสำหรับล็อตตรวจสอบที่เชื่อมโยงกับใบสั่งซื้อ ซึ่งถือเป็นกิจกรรม 'ดำเนินการตรวจสอบคุณภาพ'
- รวมและจัดรูปแบบข้อมูล: รวมข้อมูลจากการเลือกแต่ละส่วนไว้ในตารางภายในชุดเดียว ตรวจสอบว่าฟิลด์ EventTime ใช้รูปแบบเดียวกัน เช่น YYYY-MM-DDTHH:MI:SS
- เพิ่มฟังก์ชันดาวน์โหลดไฟล์: เพิ่มฟังก์ชันดาวน์โหลดตารางภายในสุดท้ายเป็นไฟล์ แนะนำให้ใช้ไฟล์คั่นด้วยแท็บหรือ CSV ซึ่งทำได้ด้วยโมดูลฟังก์ชัน GUI_DOWNLOAD
- เรียกใช้และบันทึก: เรียกใช้โปรแกรมด้วยธุรกรรม SE38 หรือ SA38 กรอกเงื่อนไขเลือกข้อมูลแล้วเรียกรายงาน เมื่อระบบแจ้ง ให้บันทึกผลลัพธ์ลงในเครื่องเป็นไฟล์นามสกุล .csv เพื่อเตรียมอัปโหลด
การกำหนดค่า
- ช่วงวันที่: ควรกำหนดช่วงวันที่ให้ชัดเจนสำหรับการดึงข้อมูล โดยทั่วไปใช้วันที่สร้างใบสั่งซื้อ (EKKO-AEDAT) ช่วง 3-6 เดือนเป็นจุดเริ่มต้นที่เหมาะสม เพื่อให้สมดุลระหว่างปริมาณข้อมูลกับข้อมูลเชิงลึกเกี่ยวกับกระบวนการ.
- รหัสบริษัท (BUKRS): กรองด้วยรหัสบริษัทหนึ่งรหัสหรือหลายรหัส เพื่อจำกัดการดึงข้อมูลให้อยู่ในนิติบุคคลที่เกี่ยวข้อง พารามิเตอร์นี้สำคัญต่อประสิทธิภาพและความเกี่ยวข้องของข้อมูล.
- ประเภทเอกสารจัดซื้อ (BSART): กรองตามประเภทเอกสารที่ต้องการ เช่น 'NB' สำหรับ PO มาตรฐาน เพื่อเน้นวิเคราะห์กระบวนการมาตรฐานและตัดประเภทจัดซื้อพิเศษออกหากจำเป็น.
- ระดับรายละเอียดข้อมูล: การดึงข้อมูลนี้ออกแบบมาสำหรับระดับรายการใบสั่งซื้อ Case ID คือหมายเลขใบสั่งซื้อ (EBELN) เหตุการณ์ทั้งหมด รวมถึงเหตุการณ์ระดับรายการอย่างการรับสินค้า จะเชื่อมโยงกลับไปยัง Case ID หลักนี้.
- ข้อควรพิจารณาด้านประสิทธิภาพ: หากมีข้อมูลจำนวนมาก ให้กำหนดเวลาเรียกใช้โปรแกรมเป็นงานเบื้องหลัง (SM36) เพื่อหลีกเลี่ยงข้อผิดพลาดจากการหมดเวลา ตรวจสอบว่ามีดัชนีฐานข้อมูลในฟิลด์หลักที่ใช้ในเงื่อนไข WHERE โดยเฉพาะตารางอย่าง CDHDR และ CDPOS.
- ข้อกำหนดเบื้องต้น: ผู้เรียกใช้รายงานต้องได้รับอนุญาตให้เข้าถึง ABAP workbench (SE38) เพื่อพัฒนา และมีสิทธิ์เรียกใช้โปรแกรม รวมถึงต้องมีสิทธิ์อ่านตารางต้นทางทั้งหมด ได้แก่ EKKO, EKPO, EKBE, CDHDR, CDPOS, EBAN, NAST, ESSR และตาราง QM.
ตัวอย่างคำค้น abap
REPORT Z_PM_PO_EXTRACT.
TABLES: ekko, ekpo, eban.
*&---------------------------------------------------------------------*
*& Data Structures for Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
purchaseorder TYPE ebeln,
activity TYPE string,
eventtime TYPE timestamp,
username TYPE ernam,
vendornumber TYPE lifnr,
orderamount TYPE netwr_ak,
materialgroup TYPE matkl,
companycode TYPE bukrs,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_aedat FOR ekko-aedat OBLIGATORY, " PO Creation Date
s_bukrs FOR ekko-bukrs, " Company Code
s_bsart FOR ekko-bsart, " PO Document Type
s_ebeln FOR ekko-ebeln. " PO Number
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_po_headers.
IF gt_event_log IS NOT INITIAL.
PERFORM get_pr_created.
PERFORM get_pr_approved.
PERFORM get_po_created.
PERFORM get_po_release_events. " Approved, Rejected, Approval Requested
PERFORM get_po_sent_to_vendor.
PERFORM get_po_changed.
PERFORM get_goods_receipt_posted.
PERFORM get_services_confirmed.
PERFORM get_quality_inspection.
PERFORM get_goods_returned.
PERFORM get_po_completed.
PERFORM get_po_deleted.
PERFORM download_to_csv.
ELSE.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'I'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GET_PO_HEADERS (Base data)
*&---------------------------------------------------------------------*
FORM get_po_headers.
SELECT h~ebeln, h~lifnr, h~bukrs, h~bsart, p~netwr, p~matkl
FROM ekko AS h
INNER JOIN ekpo AS p ON h~ebeln = p~ebeln
INTO TABLE @DATA(lt_po_base)
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
AND h~ebeln IN @s_ebeln.
SORT lt_po_base BY ebeln.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_CREATED
*&---------------------------------------------------------------------*
FORM get_pr_created.
DATA: lt_pr_events TYPE TABLE OF ty_event_log.
SELECT p~ebeln AS purchaseorder,
'Purchase Requisition Created' AS activity,
b~erdat AS event_date,
'000000' AS event_time,
b~ernam AS username,
h~lifnr AS vendornumber,
p~netwr AS orderamount,
p~matkl AS materialgroup,
h~bukrs AS companycode,
h~bsart AS documenttype
FROM ekpo AS p
JOIN eban AS b ON p~banfn = b~banfn AND p~bnfpo = b~bnfpo
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~ebeln IN @s_ebeln
AND p~banfn IS NOT NULL AND p~banfn <> ''
AND h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created ASSIGNING FIELD-SYMBOL(<fs_pr>).
DATA(ls_event) = CORRESPONDING ty_event_log(<fs_pr>).
CONCATENATE <fs_pr>-event_date <fs_pr>-event_time INTO DATA(lv_ts).
CONVERT DATE <fs_pr>-event_date TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_APPROVED
*&---------------------------------------------------------------------*
FORM get_pr_approved.
DATA: lt_pr_list TYPE TABLE OF eban-banfn.
SELECT DISTINCT p~banfn FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND p~banfn IS NOT NULL AND p~banfn <> ''
INTO TABLE @lt_pr_list.
IF lt_pr_list IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~fname, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
FOR ALL ENTRIES IN @lt_pr_list
WHERE h~objectclas = 'BANF'
AND h~objectid = @lt_pr_list-table_line
AND p~tabname = 'EBAN'
AND p~fname = 'FRGZU'
INTO TABLE @DATA(lt_cd_pr).
LOOP AT lt_cd_pr ASSIGNING FIELD-SYMBOL(<fs_cd>) WHERE <fs_cd>-value_new = 'X'.
SELECT SINGLE p~ebeln, p~netwr, p~matkl, h~lifnr, h~bukrs, h~bsart
FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~banfn = @<fs_cd>-objectid(10)
INTO @DATA(ls_po_info).
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = ls_po_info-ebeln
activity = 'Purchase Requisition Approved'
username = <fs_cd>-username
vendornumber = ls_po_info-lifnr
orderamount = ls_po_info-netwr
materialgroup = ls_po_info-matkl
companycode = ls_po_info-bukrs
documenttype = ls_po_info-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CREATED
*&---------------------------------------------------------------------*
FORM get_po_created.
LOOP AT lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>).
SELECT SINGLE aedat, ernam FROM ekko INTO @DATA(ls_ekko)
WHERE ebeln = @<fs_po>-ebeln.
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Created'
username = ls_ekko-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE ls_ekko-aedat TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_RELEASE_EVENTS
*&---------------------------------------------------------------------*
FORM get_po_release_events.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
WHERE h~objectclas = 'EINKBELEG'
AND h~objectid IN lt_ebeln
AND p~tabname = 'EKKO'
AND p~fname = 'FRGKE'
INTO TABLE @DATA(lt_cd_po).
LOOP AT lt_cd_po ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
CASE <fs_cd>-value_new.
WHEN '2' OR 'R'. " Final Release
ls_event-activity = 'Purchase Order Approved'.
WHEN '1'. " Blocked
ls_event-activity = 'Purchase Order Rejected'.
WHEN OTHERS. " Any other change implies a pending state
ls_event-activity = 'Purchase Order Approval Requested'.
ENDCASE.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_SENT_TO_VENDOR
*&---------------------------------------------------------------------*
FORM get_po_sent_to_vendor.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT objky, erdat, eruhr, ernam
FROM nast
WHERE kapol = 'EF' AND objky IN lt_ebeln AND vstat = '1'
INTO TABLE @DATA(lt_nast).
LOOP AT lt_nast ASSIGNING FIELD-SYMBOL(<fs_nast>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_nast>-objky.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Sent to Vendor'
username = <fs_nast>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_nast>-erdat TIME <fs_nast>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CHANGED
*&---------------------------------------------------------------------*
FORM get_po_changed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT DISTINCT objectid, username, udate, utime
FROM cdhdr
WHERE objectclas = 'EINKBELEG' AND objectid IN lt_ebeln AND tcode <> 'ME21N' AND tcode <> 'ME22'
INTO TABLE @DATA(lt_cdhdr_chg).
LOOP AT lt_cdhdr_chg ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Changed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RECEIPT_POSTED
*&---------------------------------------------------------------------*
FORM get_goods_receipt_posted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam, k~bewtp
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bewtp = 'E' AND k~shkzg = 'S'
INTO TABLE @DATA(lt_gr).
LOOP AT lt_gr ASSIGNING FIELD-SYMBOL(<fs_gr>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_gr>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Receipt Posted'
username = <fs_gr>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_gr>-cpudt TIME <fs_gr>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_SERVICES_CONFIRMED
*&---------------------------------------------------------------------*
FORM get_services_confirmed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT l~ebeln, h~erdat, h~eruhr, h~ernam
FROM essr AS h JOIN esll AS l ON h~lblni = l~lblni
WHERE l~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_ses).
LOOP AT lt_ses ASSIGNING FIELD-SYMBOL(<fs_ses>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ses>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Services Confirmation Entered'
username = <fs_ses>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ses>-erdat TIME <fs_ses>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_QUALITY_INSPECTION
*&---------------------------------------------------------------------*
FORM get_quality_inspection.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT q~ebeln, v~vdatum, v~vzeit, v~vname
FROM qals AS q JOIN qave AS v ON q~prueflos = v~prueflos
WHERE q~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_qm).
LOOP AT lt_qm ASSIGNING FIELD-SYMBOL(<fs_qm>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_qm>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Quality Inspection Performed'
username = <fs_qm>-vname
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_qm>-vdatum TIME <fs_qm>-vzeit INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RETURNED
*&---------------------------------------------------------------------*
FORM get_goods_returned.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bwart = '122'
INTO TABLE @DATA(lt_ret).
LOOP AT lt_ret ASSIGNING FIELD-SYMBOL(<fs_ret>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ret>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Returned'
username = <fs_ret>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ret>-cpudt TIME <fs_ret>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_COMPLETED
*&---------------------------------------------------------------------*
FORM get_po_completed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'ELIKZ' AND p~value_new = 'X'
INTO TABLE @DATA(lt_cd_comp).
LOOP AT lt_cd_comp ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Completed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_DELETED
*&---------------------------------------------------------------------*
FORM get_po_deleted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'LOEKZ' AND p~value_new = 'L'
INTO TABLE @DATA(lt_cd_del).
LOOP AT lt_cd_del ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Deleted'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_TO_CSV
*&---------------------------------------------------------------------*
FORM download_to_csv.
DATA: lv_filename TYPE string.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'PurchaseOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'EventTime' TO lt_fieldnames.
APPEND 'UserName' TO lt_fieldnames.
APPEND 'VendorNumber' TO lt_fieldnames.
APPEND 'OrderAmount' TO lt_fieldnames.
APPEND 'MaterialGroup' TO lt_fieldnames.
APPEND 'CompanyCode' TO lt_fieldnames.
APPEND 'DocumentType' TO lt_fieldnames.
DATA(lv_header) = REDUCE string( INIT h = '' FOR f IN lt_fieldnames NEXT h = h && f && cl_abap_char_utilities=>horizontal_tab ).
REPLACE LAST OCCURRENCE OF cl_abap_char_utilities=>horizontal_tab IN lv_header WITH cl_abap_char_utilities=>cr_lf.
DATA(lv_file_content) = lv_header.
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
DATA lv_line TYPE string.
DATA lv_eventtime_str TYPE string.
lv_eventtime_str = |{ <fs_log>-eventtime TIMESTAMP = ISO }|.
lv_line = <fs_log>-purchaseorder && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-activity && cl_abap_char_utilities=>horizontal_tab &&
lv_eventtime_str && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-username && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-vendornumber && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-orderamount && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-materialgroup && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-companycode && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-documenttype && cl_abap_char_utilities=>cr_lf.
CONCATENATE lv_file_content lv_line INTO lv_file_content.
ENDLOOP.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lv_file_content. ขั้นตอน
- ตั้งค่าการเชื่อมต่อฐานข้อมูล: ขอข้อมูลรับรองแบบอ่านอย่างเดียวและรายละเอียดการเชื่อมต่อ (ชื่อโฮสต์ พอร์ต ชื่อฐานข้อมูล) สำหรับฐานข้อมูล SAP ECC ที่ใช้งานอยู่ ตรวจสอบว่าติดตั้งเครื่องมือไคลเอ็นต์ที่จำเป็น เช่น DBeaver, SQL Developer หรือ SSMS แล้ว
- ตรวจสอบสคีมา SAP: เชื่อมต่อฐานข้อมูลและระบุสคีมาหลักของ SAP ที่จัดเก็บตาราง โดยมักใช้ชื่อ SAPSR3, SAPHANADB หรือชื่อเฉพาะระบบอื่น หากสคีมานี้ไม่ใช่ค่าเริ่มต้นของผู้ใช้ คุณต้องใส่ชื่อสคีมานำหน้าชื่อตารางทั้งหมดในคิวรี
- ตรวจสอบคิวรี SQL: เปิดสคริปต์ SQL ที่ให้มาในเครื่องมือไคลเอ็นต์ คิวรีนี้ออกแบบมาเพื่อดึงกิจกรรม 14 รายการจากกระบวนการจัดซื้อจนถึงชำระเงิน โดยเชื่อมตาราง SAP หลายตารางเข้าด้วยกัน
- ปรับพารามิเตอร์คิวรี: ค้นหา Common Table Expression (CTE) ชื่อ PO_BASE ที่ต้นสคริปต์ แล้วแก้ค่าตัวอย่างเพื่อกำหนดขอบเขตการดึงข้อมูล:
- [START_DATE] และ [END_DATE]: กำหนดช่วงวันที่สำหรับการวิเคราะห์ เช่น '20230101' และ '20230630' แนะนำให้กรองด้วยฟิลด์ AEDAT (วันที่เปลี่ยนแปลง)
- [COMPANY_CODE_1], [COMPANY_CODE_2]: ระบุรหัสบริษัท SAP ที่ต้องการรวม
- [DOC_TYPE_1], [DOC_TYPE_2]: ระบุประเภทเอกสารใบสั่งซื้อที่ต้องการรวม
- [Your SAP Schema]: แทนที่ด้วยชื่อสคีมา SAP จริงของคุณตลอดทั้งสคริปต์
- เรียกใช้คิวรี: เรียกใช้สคริปต์ SQL ที่ปรับแต่งแล้วกับฐานข้อมูล SAP ระยะเวลาประมวลผลขึ้นอยู่กับช่วงวันที่ ปริมาณข้อมูล และประสิทธิภาพฐานข้อมูล
- ตรวจสอบผลลัพธ์: เมื่อคิวรีทำงานเสร็จ ให้ตรวจสอบผลลัพธ์อย่างรวดเร็ว ดูว่าจำนวนแถวสมเหตุสมผล และคอลัมน์สำคัญ เช่น PurchaseOrder, Activity และ EventTime มีข้อมูลตามที่คาดไว้
- ส่งออกข้อมูลเป็น CSV: ส่งออกผลลัพธ์ทั้งหมดจากไคลเอ็นต์ SQL เป็นไฟล์ CSV ใช้การเข้ารหัส UTF-8 เพื่อป้องกันปัญหาเกี่ยวกับอักขระ
- เตรียมไฟล์สำหรับอัปโหลด: ตรวจสอบว่าชื่อคอลัมน์ในไฟล์ CSV ตรงกับชื่อแอตทริบิวต์ที่กำหนดทุกประการ ได้แก่ PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode และ DocumentType
- อัปโหลดไปยังเครื่องมือ Process Mining: อัปโหลดไฟล์ CSV ที่เสร็จแล้วไปยังแอปพลิเคชัน process mining เพื่อวิเคราะห์และแสดงผล
การกำหนดค่า
- ข้อกำหนดเบื้องต้น: ต้องมีสิทธิ์เข้าถึงฐานข้อมูลต้นทางของ SAP ECC โดยตรงแบบอ่านอย่างเดียว และมีสิทธิ์เพียงพอในการค้นตาราง เช่น EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS และ NAST.
- การกรองช่วงวันที่: จำเป็นต้องกรองช่วงวันที่เพื่อจำกัดปริมาณข้อมูล โดยทั่วไปเริ่มจากกรอง EKKO.AEDAT (วันที่เปลี่ยนแปลง PO) ย้อนหลัง 3-6 เดือน หากกำหนดช่วงวันที่กว้างเกินไป การประมวลผลคำสั่งค้นหาอาจใช้เวลานานมาก.
- ตัวกรองข้อมูลหลัก: เพื่อให้การวิเคราะห์ตรงประเด็น ให้กรองด้วย EKKO.BUKRS (รหัสบริษัท) และ EKKO.BSART (ประเภทเอกสาร) ทุกครั้ง วิธีนี้ช่วยจำกัดขอบเขตให้เหลือเฉพาะนิติบุคคลและกระบวนการธุรกิจที่เกี่ยวข้อง.
- ข้อควรพิจารณาด้านประสิทธิภาพ: คำสั่งค้นหาเชื่อมตารางขนาดใหญ่หลายตาราง รวมถึงตารางประวัติการเปลี่ยนแปลง (CDHDR, CDPOS) ซึ่งใช้ทรัพยากรมาก แนะนำอย่างยิ่งให้ดึงข้อมูลนอกช่วงเวลาที่มีการใช้งานสูง หรือใช้ฐานข้อมูลจำลองที่ไม่ใช่ระบบจริง เพื่อไม่ให้กระทบประสิทธิภาพของระบบ.
- การบันทึกเอกสารการเปลี่ยนแปลง: ความถูกต้องของกิจกรรมอย่าง 'อนุมัติ', 'ปฏิเสธ', 'ดำเนินการเสร็จสิ้น' และ 'เปลี่ยนแปลง' ขึ้นอยู่กับการเปิดบันทึกเอกสารการเปลี่ยนแปลงสำหรับฟิลด์ที่เกี่ยวข้องใน SAP โปรดยืนยันกับผู้ดูแล SAP ว่าเปิดการบันทึกนี้แล้ว (ผ่านธุรกรรม SCDO).
ตัวอย่างคำค้น sql
WITH PO_BASE AS (
SELECT
H.EBELN, -- Purchase Order Number
I.EBELP, -- Purchase Order Item
H.LIFNR, -- Vendor Number
H.BUKRS, -- Company Code
H.BSART, -- Document Type
I.NETWR, -- Order Amount (Item Level)
I.MATKL, -- Material Group
I.BANFN, -- Purchase Requisition Number
I.BNFPO -- Purchase Requisition Item
FROM [Your SAP Schema].EKKO AS H
JOIN [Your SAP Schema].EKPO AS I ON H.EBELN = I.EBELN
WHERE H.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' -- Filter on PO Change Date, e.g., '20230101' and '20231231'
AND H.BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]') -- Specify Company Codes
AND H.BSART IN ('[DOC_TYPE_1]', '[DOC_TYPE_2]') -- Specify PO Document Types
)
-- 1. Purchase Requisition Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Created' AS "Activity",
TO_TIMESTAMP(CONCAT(pr.ERDAT, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime", -- Time is not available in EBAN
pr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EBAN pr ON po.BANFN = pr.BANFN AND po.BNFPO = pr.BNFPO
WHERE po.BANFN IS NOT NULL AND po.BANFN <> ''
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Approved' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'BANF' AND ch.OBJECTID = po.BANFN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EBAN' AND cp.FNAME = 'FRGZU' AND cp.VALUE_NEW = 'X' -- Release indicator set to 'released'
UNION ALL
-- 3. Purchase Order Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Created' AS "Activity",
TO_TIMESTAMP(CONCAT(ekko.ERDAT, ' ', ekko.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
ekko.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (from Change Docs)
SELECT
po.EBELN AS "PurchaseOrder",
CASE
WHEN cp.VALUE_NEW > cp.VALUE_OLD THEN 'Purchase Order Approval Requested'
WHEN cp.VALUE_NEW = ekko.FRGKE AND ekko.FRGKE = 'R' THEN 'Purchase Order Approved'
ELSE 'Purchase Order Rejected' -- Simplified logic, may need adjustment
END AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKKO' AND cp.FNAME = 'FRGZU' -- Release status
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Sent to Vendor' AS "Activity",
TO_TIMESTAMP(CONCAT(na.ERDAT, ' ', na.ERUHR), 'YYYYMMDD HH24MISS') AS "EventTime",
na.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].NAST na ON na.OBJKY = po.EBELN AND na.KSCHL = '[Your PO Output Type]' -- e.g., 'NEU'
WHERE na.VSTAT = '1' -- Successfully processed
UNION ALL
-- 8. Purchase Order Changed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Changed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
WHERE ch.TCODE IN ('ME22', 'ME22N') -- Filter for change transactions
UNION ALL
-- 9. Goods Receipt Posted
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Receipt Posted' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Receipt
AND ekbe.SHKZG = 'S' -- Debit/Credit Indicator: Goods Receipt
UNION ALL
-- 10. Services Confirmation Entered
SELECT
po.EBELN AS "PurchaseOrder",
'Services Confirmation Entered' AS "Activity",
TO_TIMESTAMP(CONCAT(essr.ERDAT, ' ', essr.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
essr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].ESSR essr ON ekbe.LBLNI = essr.LBLNI
WHERE ekbe.BEWTP = 'L' -- Service Entry Sheet
UNION ALL
-- 11. Quality Inspection Performed
SELECT
po.EBELN AS "PurchaseOrder",
'Quality Inspection Performed' AS "Activity",
TO_TIMESTAMP(CONCAT(qave.VDATUM, ' ', qave.VZEIT), 'YYYYMMDD HH24MISS') AS "EventTime",
qave.VNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].QALS qals ON qals.MBLNR = ekbe.BELNR AND qals.MJAHR = ekbe.GJAHR
JOIN [Your SAP Schema].QAVE qave ON qals.PRUEFLOS = qave.PRUEFLOS
WHERE ekbe.BEWTP = 'E' -- Linked to a Goods Receipt
UNION ALL
-- 12. Goods Returned
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Returned' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Movement
AND ekbe.SHKZG = 'H' -- Debit/Credit Indicator: Return
AND ekbe.BWART = '122' -- Movement type for return to vendor
UNION ALL
-- 13. Purchase Order Completed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Completed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'ELIKZ' AND cp.VALUE_NEW = 'X' -- Delivery completed indicator
UNION ALL
-- 14. Purchase Order Deleted
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Deleted' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'LOEKZ' AND cp.VALUE_NEW = 'L'; -- Deletion indicator ขั้นตอน
- เตรียมข้อกำหนดและการเชื่อมต่อ: ตรวจสอบว่าเครื่องมือ ETL ของผู้ให้บริการภายนอกติดตั้งและมีไลเซนส์ SAP Certified Connector แล้ว ในคอนโซลผู้ดูแลระบบของเครื่องมือ ETL ให้ตั้งค่าการเชื่อมต่อใหม่กับระบบ SAP ECC คุณต้องมีโฮสต์แอปพลิเคชันเซิร์ฟเวอร์ หมายเลขระบบ รหัสไคลเอ็นต์ และบัญชีผู้ใช้ SAP เฉพาะที่มีสิทธิ์ RFC และสิทธิ์อ่านตารางอย่างเหมาะสม
- ระบุตารางต้นทาง: กำหนดตาราง SAP ที่ต้องใช้เป็นแหล่งข้อมูลในงาน ETL หรือโฟลว์ข้อมูล ตารางหลัก ได้แก่ EKKO (ส่วนหัวใบสั่งซื้อ), EKPO (รายการใบสั่งซื้อ), EBAN (ใบขอซื้อ), CDHDR (ส่วนหัวเอกสารการเปลี่ยนแปลง), CDPOS (รายการเอกสารการเปลี่ยนแปลง), MSEG (ส่วนรายการเอกสารวัสดุ), MKPF (ส่วนหัวเอกสารวัสดุ), NAST (สถานะข้อความ), ESSR (ส่วนหัวใบรับบริการ) และ QALS (ล็อตตรวจสอบ)
- ดึง 'สร้างใบสั่งซื้อ': สร้างโฟลว์ข้อมูลจากตาราง EKKO กรองรายการตามช่วงวันที่ที่ต้องการ เช่น ใช้ AEDAT และขอบเขตองค์กร เช่น BUKRS สำหรับรหัสบริษัท และ BSART สำหรับประเภทเอกสาร กำหนด EKKO.EBELN เป็น PurchaseOrder, 'สร้างใบสั่งซื้อ' เป็น Activity และรวม AEDAT กับ ERZET เพื่อกำหนด EventTime จับคู่แอตทริบิวต์ที่จำเป็นอื่นๆ ด้วย
- ดึง 'ลงรายการรับสินค้า': สร้างโฟลว์ข้อมูลแยกจาก MSEG แล้วเชื่อมกับ MKPF ด้วย MBLNR และ MJAHR กรองประเภทการเคลื่อนย้ายที่เกี่ยวข้อง เช่น '101' กำหนด MSEG.EBELN เป็น PurchaseOrder, 'ลงรายการรับสินค้า' เป็น Activity และใช้ MKPF.CPUDT กับ MKPF.CPUTM เป็น EventTime
- ดึงเหตุการณ์จากการเปลี่ยนแปลง (การอนุมัติ การแก้ไข และการลบ): สร้างโฟลว์ข้อมูลจาก CDHDR และ CDPOS โดยเชื่อมกันด้วย CHANGENR แหล่งข้อมูลนี้ใช้ระบุกิจกรรมได้หลายรายการ
- กรอง OBJECTCLAS = 'EINKBELEG' และ TABNAME = 'EKPO'
- สำหรับ 'อนุมัติใบสั่งซื้อ' ให้กรองการเปลี่ยนแปลงฟิลด์สถานะการอนุมัติ เช่น FNAME = 'FRGZU' โดยค่าใหม่ (VALUE_NEW) แสดงว่าอนุมัติขั้นสุดท้ายแล้ว
- สำหรับ 'ลบใบสั่งซื้อ' ให้กรองการเปลี่ยนแปลงตัวบ่งชี้การลบ (FNAME = 'LOEKZ') เมื่อค่าใหม่เป็น 'L'
- สำหรับ 'เปลี่ยนแปลงใบสั่งซื้อ' ให้กรองการเปลี่ยนแปลงฟิลด์อื่นๆ ที่เกี่ยวข้อง โดยไม่รวมฟิลด์สถานะที่ใช้ระบุกิจกรรมอื่น
- ใช้ CDHDR.UDATE และ CDHDR.UTIME เป็น EventTime สำหรับเหตุการณ์ทั้งหมดนี้
- ดึงเหตุการณ์ 'ใบขอซื้อ': สร้างโฟลว์ข้อมูลจาก EBAN สำหรับ 'สร้างใบขอซื้อ' หากต้องการเชื่อมกับเคสใบสั่งซื้อ ให้เชื่อม EBAN กับ EKPO ด้วยหมายเลขใบขอซื้อ (BANFN) และรายการ (BNFPO) สำหรับ 'อนุมัติใบขอซื้อ' ให้ใช้ CDHDR/CDPOS กับ OBJECTCLAS = 'BANF' ต้องจับคู่ข้อมูลอย่างระมัดระวังเพื่อให้เหตุการณ์เชื่อมโยงกับใบสั่งซื้อที่สร้างขึ้นภายหลัง
- ดึง 'ส่งใบสั่งซื้อให้ผู้ขาย': สร้างโฟลว์ข้อมูลจากตาราง NAST กรอง OBJECTKEY (ซึ่งมีหมายเลขใบสั่งซื้อ), ประเภทผลลัพธ์ที่เกี่ยวข้อง (KSCHL) และสถานะการประมวลผลสำเร็จ (VSTAT = '1') ใช้ ERDAT และ UHR เป็น EventTime
- รวมชุดกิจกรรม: ใช้การแปลงข้อมูลแบบ 'Union' หรือ 'Merge' ในเครื่องมือ ETL เพื่อรวมผลลัพธ์จากโฟลว์ข้อมูลแต่ละรายการที่สร้างไว้ในขั้นตอนก่อนหน้า ตรวจสอบว่าชื่อคอลัมน์และชนิดข้อมูลของทุกชุดตรงกัน (PurchaseOrder, Activity, EventTime เป็นต้น)
- แปลงชนิดและรูปแบบข้อมูล: ตรวจสอบว่าคอลัมน์ EventTime แปลงเป็นรูปแบบเวลาเดียวกัน เช่น YYYY-MM-DD HH:MM:SS แปลง OrderAmount เป็นรูปแบบเลขทศนิยมมาตรฐาน
- กำหนดปลายทางข้อมูล: ตั้งค่าปลายทางหรือ 'sink' สำหรับชุดข้อมูลที่รวมแล้ว โดยทั่วไปจะเป็นไฟล์ เช่น CSV หรือ Parquet กำหนดตัวคั่น อักขระครอบข้อความ และตัวเลือกส่วนหัวคอลัมน์
- เรียกใช้และตรวจสอบ: เรียกใช้งาน ETL ทั้งหมด ตรวจสอบไฟล์ผลลัพธ์ว่ามีกิจกรรมครบทั้ง 14 รายการ จำนวนแถวสมเหตุสมผล และแอตทริบิวต์สำคัญมีข้อมูลถูกต้อง
- ตั้งเวลาและส่งออก: เมื่อตรวจสอบแล้ว ให้ตั้งเวลาทำงาน ETL เป็นระยะ เช่น ทุกคืน เพื่อให้ข้อมูลเป็นปัจจุบัน ไฟล์ที่สร้างขึ้นพร้อมอัปโหลดไปยังเครื่องมือ process mining
การกำหนดค่า
- ข้อกำหนดเบื้องต้น: ต้องมีเครื่องมือ ETL เชิงพาณิชย์ เช่น Informatica PowerCenter, Talend หรือ SAP Data Services พร้อม SAP Certified Connector สำหรับ ECC ที่เกี่ยวข้อง และผู้ใช้ SAP แบบ dialog หรือ system ที่มีสิทธิ์ S_RFC และ S_TABU_DIS สำหรับตารางที่จำเป็น
- การเชื่อมต่อ SAP: กำหนดค่า connector ด้วย application server, system number, client, user และ password ของ SAP แนะนำให้ใช้ Secure Network Communications (SNC)
- ตัวกรองช่วงวันที่: ควรกำหนดช่วงวันที่เพื่อจำกัดปริมาณข้อมูล โดยทั่วไปจะกรอง EKKO.AEDAT (วันที่สร้าง PO) ย้อนหลัง 3 ถึง 12 เดือน ควรใช้ตัวกรองนี้ที่ต้นทาง เพื่อไม่ให้ดึงข้อมูลจาก SAP มากเกินจำเป็น
- ตัวกรองขอบเขตองค์กร: กรองตาม EKKO.BUKRS (รหัสบริษัท) เสมอ และพิจารณากรองตาม EKPO.WERKS (โรงงาน) หรือ EKKO.EKORG (องค์กรจัดซื้อ) เพื่อจำกัดการวิเคราะห์ให้เหลือหน่วยธุรกิจที่ต้องการ
- ตัวกรองประเภทเอกสาร: ใช้ EKKO.BSART เพื่อเลือกเฉพาะประเภทใบสั่งซื้อที่เกี่ยวข้อง และตัดการโอนย้ายสินค้าคงคลังหรือเอกสารภายในอื่นๆ ที่ไม่อยู่ในกระบวนการ P2P มาตรฐานออก
- การปรับประสิทธิภาพ: การดึงข้อมูลจากตารางเอกสารการเปลี่ยนแปลง (CDHDR, CDPOS) อาจใช้เวลานาน ตรวจสอบว่าได้ใช้ตัวกรอง OBJECTCLAS, OBJECTID และ UDATE แล้ว ปรับค่า 'Packet Size' ใน SAP connector เพื่อเพิ่มประสิทธิภาพการถ่ายโอนข้อมูล หากเป็นระบบขนาดใหญ่มาก ให้พิจารณาโหลดข้อมูลย้อนหลังครั้งแรก แล้วจึงโหลดข้อมูลส่วนเพิ่มตามกำหนดเวลา.
ตัวอย่างคำค้น sql
/*
This is a logical representation of the transformations performed within the ETL tool.
The tool's graphical interface will be used to configure these separate data flows, which are then combined with a UNION transformation.
Placeholders like [Your ETL Tool Functions] and [Filter Values] must be configured in the tool.
*/
-- 1. Purchase Requisition Created
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Created' AS Activity,
[Your ETL Tool Functions].DateTime(eban.ERDAT, eban.ERZET) AS EventTime,
eban.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM EBAN AS eban
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 2. Purchase Requisition Approved (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Approved' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EBAN AS eban ON cdhdr.OBJECTID = eban.BANFN
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'BANF' AND cdpos.TABNAME = 'EBAN' AND cdpos.FNAME = 'FRGZU' AND cdpos.VALUE_NEW = '[Final Release Indicator for PR]'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 3. Purchase Order Created
SELECT
EBELN AS PurchaseOrder,
'Purchase Order Created' AS Activity,
[Your ETL Tool Functions].DateTime(AEDAT, ERZET) AS EventTime,
ERNAM AS UserName,
LIFNR AS VendorNumber,
NULL AS OrderAmount, -- Amount is at item level
NULL AS MaterialGroup, -- Attribute is at item level
BUKRS AS CompanyCode,
BSART AS DocumentType
FROM EKKO
WHERE AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
CASE
WHEN cdpos.VALUE_NEW = '[Final Release Code]' THEN 'Purchase Order Approved'
WHEN cdpos.VALUE_NEW = '[Rejection Release Code]' THEN 'Purchase Order Rejected'
ELSE 'Purchase Order Approval Requested'
END AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKKO' AND cdpos.FNAME = 'FRGKE'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Sent to Vendor' AS Activity,
[Your ETL Tool Functions].DateTime(nast.ERDAT, nast.UHR) AS EventTime,
nast.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM NAST AS nast
INNER JOIN EKKO AS ekko ON nast.OBJKY = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE nast.KAPPL = 'EF' AND nast.VSTAT = '1' AND nast.KSCHL IN ([Your PO Output Types])
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 8. Purchase Order Changed (inferred from change documents, simplified example)
SELECT DISTINCT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Changed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.FNAME NOT IN ('FRGKE', 'FRGZU', 'LOEKZ', 'ELIKZ')
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 9. Goods Receipt Posted
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Receipt Posted' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '101' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 10. Services Confirmation Entered
SELECT
essr.EBELN AS PurchaseOrder,
'Services Confirmation Entered' AS Activity,
[Your ETL Tool Functions].DateTime(essr.ERDAT, essr.ERZET) AS EventTime,
essr.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM ESSR AS essr
INNER JOIN EKKO AS ekko ON essr.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON essr.EBELN = ekpo.EBELN AND essr.EBELP = ekpo.EBELP
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 11. Quality Inspection Performed
SELECT
qals.EBELN AS PurchaseOrder,
'Quality Inspection Performed' AS Activity,
[Your ETL Tool Functions].DateTime(qals.PASTRTERM, '000000') AS EventTime, -- Time is often not available
qals.PRUEFER AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM QALS AS qals
INNER JOIN EKKO AS ekko ON qals.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON qals.EBELN = ekpo.EBELN AND qals.EBELP = ekpo.EBELP
WHERE qals.VCODE <> '' -- A usage decision code exists
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 12. Goods Returned
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Returned' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '122' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 13. Purchase Order Completed (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Completed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'ELIKZ' AND cdpos.VALUE_NEW = 'X'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 14. Purchase Order Deleted (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Deleted' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'LOEKZ' AND cdpos.VALUE_NEW = 'L'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]); พร้อมเริ่มต้นหรือยัง?
เทมเพลตนี้เป็นแนวทางให้คุณปรับปรุงกระบวนการจัดซื้อจนถึงชำระเงินสำหรับใบสั่งซื้อใน SAP ECC เริ่มใช้ข้อมูลของคุณเพื่อค้นหาข้อมูลเชิงลึกและเพิ่มประสิทธิภาพได้เลย.
เพิ่มประสิทธิภาพใบสั่งซื้อ P2P เริ่มทดลองใช้ฟรีวันนี้
ลดคอขวดและลดระยะเวลาของกระบวนการได้ 30% ขึ้นไป.
ไม่ต้องใช้บัตรเครดิต เริ่มต้นใช้งานได้ในไม่กี่นาที