เทมเพลตข้อมูลสำหรับกระบวนการจัดการใบแจ้งหนี้เจ้าหนี้
เทมเพลตข้อมูลสำหรับกระบวนการจัดการใบแจ้งหนี้เจ้าหนี้
- แอตทริบิวต์ที่แนะนำสำหรับการวิเคราะห์อย่างละเอียด
- กิจกรรมสำคัญในกระบวนการที่ควรติดตาม
- คำแนะนำทีละขั้นตอนในการดึงข้อมูล
แอตทริบิวต์ของกระบวนการจัดการใบแจ้งหนี้เจ้าหนี้
| ชื่อ | คำอธิบาย | ||
|---|---|---|---|
| กิจกรรม ActivityName | ชื่อของเหตุการณ์หรือขั้นตอนทางธุรกิจที่เกิดขึ้นในวงจรการประมวลผลใบแจ้งหนี้. | ||
| คำอธิบาย กิจกรรมหมายถึงขั้นตอนหรือการดำเนินการที่แยกจากกันในกระบวนการเจ้าหนี้การค้า เช่น 'รับใบแจ้งหนี้' 'ลงบัญชีใบแจ้งหนี้แล้ว' หรือ 'ดำเนินการจ่ายเงินแล้ว' กิจกรรมเหล่านี้เป็นองค์ประกอบพื้นฐานของแผนผังกระบวนการ การวิเคราะห์กิจกรรมเป็นหัวใจสำคัญของ process mining ช่วยให้เห็นภาพการไหลของกระบวนการ ระบุเส้นทางที่เกิดขึ้นบ่อย ตรวจจับความเบี่ยงเบนจากกระบวนการมาตรฐาน และวัดความถี่กับระยะเวลาของแต่ละขั้นตอน ลำดับกิจกรรมของใบแจ้งหนี้แต่ละรายการแสดงเส้นทางที่ผ่านในกระบวนการ. เหตุผลที่สำคัญ ระบุขั้นตอนของกระบวนการ ช่วยให้เห็นภาพและวิเคราะห์การไหลของกระบวนการ ระบุคอขวด และตรวจจับวงจรการแก้ไขงานซ้ำ. แหล่งข้อมูล ได้จากแหล่งข้อมูลหลายแห่ง เช่น การเปลี่ยนสถานะเอกสาร (เช่น BKPF-BSTAT) เอกสารการเปลี่ยนแปลง (ตาราง CDHDR/CDPOS) หรือบันทึกเวิร์กโฟลว์ โดยทั่วไปต้องกำหนดตรรกะการดึงข้อมูลเอง. ตัวอย่าง รับใบแจ้งหนี้อนุมัติใบแจ้งหนี้แล้วดำเนินการจ่ายเงินแล้วระงับการจ่ายเงินตามใบแจ้งหนี้ | |||
| ใบแจ้งหนี้ Invoice | รหัสเฉพาะของเอกสารใบแจ้งหนี้ ซึ่งใช้เป็นรหัสกรณีหลักของกระบวนการเจ้าหนี้การค้า. | ||
| คำอธิบาย ใบแจ้งหนี้เป็นออบเจ็กต์หลักที่เชื่อมโยงกิจกรรมทั้งหมด ตั้งแต่รับใบแจ้งหนี้จนถึงจ่ายเงินใน SAP S/4HANA โดยทั่วไปจะใช้คีย์ผสมจากรหัสบริษัท (BUKRS) หมายเลขเอกสารเฉพาะ (BELNR) และปีบัญชี (GJAHR). การวิเคราะห์ตามใบแจ้งหนี้ช่วยให้เห็นวงจรชีวิตของใบแจ้งหนี้ตั้งแต่ต้นจนจบ ซึ่งเป็นพื้นฐานสำคัญในการคำนวณตัวชี้วัด เช่น ระยะเวลารวมของวงจร ค้นหาคอขวดของใบแจ้งหนี้แต่ละรายการ และทำความเข้าใจเส้นทางต่าง ๆ ที่ใบแจ้งหนี้อาจผ่านในกระบวนการ. เหตุผลที่สำคัญ ระบุเส้นทางของใบแจ้งหนี้แต่ละรายการได้อย่างเฉพาะเจาะจง จึงติดตามวงจรชีวิตทั้งหมดและวิเคราะห์ประสิทธิภาพกระบวนการแยกเป็นรายกรณีได้. แหล่งข้อมูล คีย์ผสมนี้ได้จากตาราง BKPF (ส่วนหัวเอกสารบัญชี) หรือ RBKP (ส่วนหัวเอกสาร: การรับใบแจ้งหนี้) โดยใช้ฟิลด์ BUKRS, BELNR และ GJAHR. ตัวอย่าง 1000-1900000001-20231710-1900000002-20232000-5100000003-2024 | |||
| เวลาที่เกิดเหตุการณ์ EventTime | วันที่และเวลาที่กิจกรรมเกิดขึ้นอย่างแม่นยำ. | ||
| คำอธิบาย เวลาที่เกิดเหตุการณ์คือเวลาประทับของแต่ละกิจกรรม ซึ่งแสดงลำดับเหตุการณ์ของใบแจ้งหนี้ตามเวลา ข้อมูลนี้จำเป็นต่อการทำความเข้าใจการไหลของกระบวนการและการวิเคราะห์ตามช่วงเวลา ในการวิเคราะห์ ใช้เวลาที่เกิดเหตุการณ์เพื่อเรียงกิจกรรมให้ถูกต้อง คำนวณระยะเวลาระหว่างขั้นตอน ระบุเวลารอ และวิเคราะห์ประสิทธิภาพกระบวนการในช่วงเวลาต่าง ๆ เช่น เปรียบเทียบรายเดือน ข้อมูลนี้เป็นพื้นฐานของ KPI ที่วัดระยะเวลาทั้งหมด. เหตุผลที่สำคัญ เวลาประทับนี้สำคัญต่อการเรียงเหตุการณ์ตามลำดับเวลาและคำนวณตัวชี้วัดตามเวลา เช่น ระยะเวลาของวงจรและช่วงเวลาต่าง ๆ ซึ่งเป็นพื้นฐานของ process mining. แหล่งข้อมูล ได้จากฟิลด์วันที่และเวลาในตาราง SAP หลายแห่ง เช่น วันที่สร้าง (BKPF-CPUDT) วันที่ลงบัญชี (BKPF-BUDAT) วันที่ล้างยอด (BSAK-AUGDT) หรือเวลาประทับในบันทึกการเปลี่ยนแปลง (CDHDR-UDATE/UTIME). ตัวอย่าง 2023-10-01T09:00:00Z2023-10-05T14:30:15Z2023-10-15T11:21:05Z | |||
| ระบบต้นทาง SourceSystem | ระบบที่ใช้ดึงข้อมูล. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุแหล่งที่มาของข้อมูลกระบวนการ สำหรับมุมมองนี้ โดยทั่วไปจะเป็น 'SAP S/4HANA' ในสภาพแวดล้อมที่มี ERP หลายระบบหรือระบบที่เชื่อมต่อกัน ฟิลด์นี้สำคัญต่อการติดตามที่มาของข้อมูลและการแยกข้อมูล ช่วยให้วิเคราะห์ชุดข้อมูลที่ถูกต้อง และตรวจสอบปัญหาคุณภาพข้อมูลย้อนกลับไปยังแหล่งที่มาได้. เหตุผลที่สำคัญ ระบุแหล่งที่มาของข้อมูล ซึ่งสำคัญต่อการกำกับดูแลข้อมูล การแก้ไขปัญหา และการทำงานในสภาพแวดล้อมที่มีหลายระบบ. แหล่งข้อมูล โดยทั่วไปจะกำหนดค่าแบบคงที่ระหว่างการดึงข้อมูล เพื่อระบุแหล่งที่มาของชุดข้อมูล. ตัวอย่าง SAP S/4HANASAP ECC 6.0S4H_PROD_100 | |||
| อัปเดตข้อมูลล่าสุด LastDataUpdate | เวลาประทับที่ระบุว่ามีการดึงข้อมูลของระเบียนนี้จากระบบต้นทางมาอัปเดตครั้งล่าสุดเมื่อใด. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุวันที่และเวลาที่ดึงหรืออัปเดตข้อมูลจาก SAP S/4HANA ล่าสุด เป็นฟิลด์ข้อมูลกำกับที่สำคัญต่อการตรวจสอบว่าข้อมูลที่นำมาวิเคราะห์เป็นปัจจุบันเพียงใด ข้อมูลนี้ช่วยให้ผู้ใช้ทราบว่าการวิเคราะห์กระบวนการเป็นปัจจุบันแค่ไหน และช่วยกำหนดความคาดหวังเกี่ยวกับความล่าช้าของข้อมูล รวมถึงวางแผนการอัปเดตข้อมูลและรักษาความถูกต้องของข้อมูล. เหตุผลที่สำคัญ ระบุความใหม่ของข้อมูล เพื่อให้ผู้ใช้ทราบว่าการวิเคราะห์กระบวนการเป็นปัจจุบันเพียงใด. แหล่งข้อมูล ระบบสร้างและประทับค่านี้ในแต่ละระเบียนขณะดึงข้อมูลจากระบบต้นทาง. ตัวอย่าง 2024-05-20T04:00:00Z2024-05-21T04:00:00Z | |||
| ชื่อผู้ขาย VendorName | ชื่อผู้ขายที่ส่งใบแจ้งหนี้. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุชื่อทางการของซัพพลายเออร์หรือผู้ขาย โดยเชื่อมโยงผ่านหมายเลขผู้ขายที่จัดเก็บไว้ในเอกสารใบแจ้งหนี้ การวิเคราะห์ผู้ขายช่วยจัดการความสัมพันธ์กับซัพพลายเออร์และค้นหาปัญหาในกระบวนการที่เกี่ยวข้องกับผู้ขายแต่ละราย เช่น ผู้ขายรายใดส่งใบแจ้งหนี้ที่มีข้อแตกต่างบ่อยที่สุด หรือเราจ่ายเงินให้ซัพพลายเออร์เชิงกลยุทธ์ตรงเวลาสม่ำเสมอหรือไม่ นอกจากนี้ยังใช้ร่วมกับหมายเลขใบแจ้งหนี้และยอดเงินเพื่อค้นหาการจ่ายเงินซ้ำที่อาจเกิดขึ้น. เหตุผลที่สำคัญ ช่วยวิเคราะห์ประสิทธิภาพกระบวนการแยกตามซัพพลายเออร์ เพื่อค้นหาผู้ขายที่มีปัญหาและจัดการความสัมพันธ์กับซัพพลายเออร์เชิงกลยุทธ์ได้อย่างมีประสิทธิภาพ. แหล่งข้อมูล ดึงจากตารางข้อมูลหลักผู้ขาย LFA1 (ฟิลด์ NAME1) โดยเชื่อมโยงผ่านหมายเลขผู้ขาย (LIFNR) ใน BKPF หรือ RBKP. ตัวอย่าง Office Supplies Inc.Global Consulting GroupMachine Parts GmbH | |||
| ชื่อผู้ใช้ UserName | รหัสผู้ใช้ของผู้ที่ดำเนินกิจกรรม. | ||
| คำอธิบาย แอตทริบิวต์นี้บันทึกรหัสผู้ใช้ SAP ที่รับผิดชอบกิจกรรม เช่น ลงบัญชี อนุมัติ หรือล้างยอดใบแจ้งหนี้ จึงเชื่อมโยงขั้นตอนในกระบวนการกับผู้ใช้แต่ละราย การวิเคราะห์ตามชื่อผู้ใช้ช่วยให้เข้าใจการกระจายภาระงาน ระบุผู้ที่ทำงานได้ดี และค้นหาผู้ใช้ที่อาจต้องได้รับการฝึกอบรมเพิ่มเติม อีกทั้งยังช่วยวิเคราะห์คอขวดในการอนุมัติบนแดชบอร์ด โดยระบุได้ว่าผู้อนุมัติรายใดทำให้กระบวนการล่าช้า. เหตุผลที่สำคัญ เชื่อมโยงกิจกรรมกับบุคคลที่ดำเนินการแต่ละราย ทำให้วิเคราะห์ประสิทธิภาพ ภาระงาน และการปฏิบัติตามนโยบายการแบ่งแยกหน้าที่ของผู้ใช้ได้. แหล่งข้อมูล โดยทั่วไปพบในตารางส่วนหัว เช่น BKPF-USNAM (ผู้ป้อนข้อมูล) หรือตารางเอกสารการเปลี่ยนแปลง CDHDR-USERNAME (ผู้เปลี่ยนแปลง). ตัวอย่าง ABROWNJSMITHAP_AUTOMATION | |||
| ยอดเงินในใบแจ้งหนี้ InvoiceAmount | ยอดรวมก่อนหักรายการใด ๆ ของใบแจ้งหนี้ในสกุลเงินของเอกสารต้นฉบับ. | ||
| คำอธิบาย มูลค่ารวมของใบแจ้งหนี้ที่ผู้ขายส่งมา ซึ่งรวมค่าสินค้าหรือบริการ ภาษี และค่าใช้จ่ายอื่น ๆ ก่อนหักรายการหรือส่วนลด ยอดเงินในใบแจ้งหนี้เป็นแอตทริบิวต์ทางการเงินสำคัญที่ใช้วิเคราะห์ได้หลายด้าน ช่วยจัดลำดับความสำคัญของใบแจ้งหนี้ยอดสูง ทำความเข้าใจผลกระทบทางการเงินจากความล่าช้าของกระบวนการ เช่น ค่าปรับชำระล่าช้าสำหรับใบแจ้งหนี้ยอดสูง และแบ่งกลุ่มกระบวนการ เช่น ใบแจ้งหนี้ยอดสูงมีเส้นทางอนุมัติต่างจากรายการอื่นหรือไม่ นอกจากนี้ยังจำเป็นต่อการค้นหาการจ่ายเงินซ้ำที่อาจเกิดขึ้น. เหตุผลที่สำคัญ ให้ข้อมูลด้านการเงินประกอบกระบวนการ ช่วยวิเคราะห์ตามมูลค่า จัดลำดับความสำคัญของใบแจ้งหนี้ยอดสูง และประเมินผลกระทบทางการเงิน. แหล่งข้อมูล พบในตาราง เช่น RBKP-RMWWR (ยอดรวมใบแจ้งหนี้) สำหรับใบแจ้งหนี้ MM หรือคำนวณจากรายการใน BSEG (ฟิลด์ WRBTR) สำหรับใบแจ้งหนี้ FI. ตัวอย่าง 1500.00250.7512345.50 | |||
| รหัสบริษัท CompanyCode | หน่วยงานที่รับผิดชอบประมวลผลใบแจ้งหนี้. | ||
| คำอธิบาย รหัสบริษัทคือหน่วยงานระดับเล็กที่สุดที่สามารถจัดทำชุดบัญชีที่สมบูรณ์และแยกเป็นอิสระเพื่อรายงานภายนอกได้ ในบริบทของเจ้าหนี้การค้า รหัสนี้หมายถึงนิติบุคคลที่มีหนี้ต้องชำระให้ผู้ขาย การวิเคราะห์ตามรหัสบริษัทช่วยเปรียบเทียบประสิทธิภาพกระบวนการระหว่างนิติบุคคลต่าง ๆ ในองค์กร และช่วยระบุว่าส่วนใดดำเนินงานตามกระบวนการมาตรฐาน ส่วนใดมีประสิทธิภาพสูงกว่า ใช้เวลานานกว่า หรือมีอัตราการแก้ไขงานซ้ำสูงกว่า. เหตุผลที่สำคัญ ช่วยเปรียบเทียบประสิทธิภาพกระบวนการระหว่างนิติบุคคลต่าง ๆ และค้นหาปัญหาหรือแนวทางปฏิบัติที่ดีเฉพาะภูมิภาคหรือหน่วยธุรกิจ. แหล่งข้อมูล พบในตารางส่วนหัวเอกสาร โดยหลักคือ BKPF-BUKRS สำหรับใบแจ้งหนี้ FI และ RBKP-BUKRS สำหรับใบแจ้งหนี้ MM. ตัวอย่าง 10001710US01DE01 | |||
| วันครบกำหนดชำระใบแจ้งหนี้ InvoiceDueDate | วันที่ต้องชำระเงินตามใบแจ้งหนี้ให้ผู้ขาย. | ||
| คำอธิบาย วันครบกำหนดชำระใบแจ้งหนี้คือกำหนดเวลาที่ต้องจ่ายเงินให้ผู้ขาย เพื่อหลีกเลี่ยงค่าปรับชำระล่าช้าและรักษาความสัมพันธ์ที่ดีกับซัพพลายเออร์ วันที่นี้คำนวณจากวันที่ฐานของใบแจ้งหนี้และเงื่อนไขการจ่ายเงินที่ตกลงกับผู้ขาย วันที่นี้จำเป็นต่อแดชบอร์ด 'การปฏิบัติตามข้อกำหนดและอายุหนี้ด้านการจ่ายเงิน' และ KPI 'อัตราการจ่ายเงินตรงเวลา' เมื่อนำวันครบกำหนดมาเปรียบเทียบกับวันที่จ่ายเงินจริง จะเห็นได้ว่าจ่ายเงินตรงเวลา ก่อนกำหนด หรือล่าช้า ซึ่งส่งผลโดยตรงต่อการเงินและความสัมพันธ์กับผู้ขาย. เหตุผลที่สำคัญ เป็นข้อมูลหลักสำหรับวิเคราะห์การจ่ายเงินตรงเวลา ช่วยวัดประสิทธิภาพการจ่ายเงินและผลกระทบต่อความสัมพันธ์กับผู้ขายและค่าปรับชำระล่าช้า. แหล่งข้อมูล วันที่นี้มักคำนวณขึ้น โดยวันครบกำหนดสุทธิอยู่ในฟิลด์ BSEG-NETDT นอกจากนี้ยังคำนวณได้จากวันที่ฐานสำหรับการจ่ายเงิน (BSEG-ZFBDT) และเงื่อนไขการจ่ายเงิน (BSEG-ZTERM). ตัวอย่าง 2023-10-312023-11-152024-01-10 | |||
| หมายเลขใบสั่งซื้อ PurchaseOrderNumber | รหัสเฉพาะของใบสั่งซื้อที่เกี่ยวข้องกับใบแจ้งหนี้ หากมี. | ||
| คำอธิบาย แอตทริบิวต์นี้เชื่อมโยงใบแจ้งหนี้กับใบสั่งซื้อ (PO) ที่อนุมัติไว้ล่วงหน้า การมีหมายเลข PO เป็นพื้นฐานของกระบวนการจับคู่ 3 ทาง (PO-ใบแจ้งหนี้-ใบรับสินค้า) แอตทริบิวต์นี้สำคัญต่อการวิเคราะห์การปฏิบัติตามข้อกำหนดและประสิทธิภาพ ใช้คำนวณ KPI 'สัดส่วนใบแจ้งหนี้ที่ไม่มีใบสั่งซื้อ' เพื่อวัดการปฏิบัติตามนโยบายการจัดซื้อ และเป็นข้อมูลพื้นฐานของแดชบอร์ด 'ประสิทธิภาพการจับคู่ 3 ทาง' ซึ่งใช้วิเคราะห์การจับคู่ใบแจ้งหนี้ที่มี PO รองรับ. เหตุผลที่สำคัญ จำเป็นต่อการวิเคราะห์ประสิทธิภาพการจับคู่ 3 ทางและวัดการปฏิบัติตามนโยบายการจัดซื้อ โดยช่วยระบุใบแจ้งหนี้ที่ประมวลผลโดยไม่มี PO. แหล่งข้อมูล พบในตารางรายการใบแจ้งหนี้ เช่น RSEG-EBELN (สำหรับใบแจ้งหนี้ MM) หรือ BSEG-EBELN (สำหรับใบแจ้งหนี้ FI). ตัวอย่าง 45000012344500005678 | |||
| เงื่อนไขการชำระเงิน PaymentTerms | ข้อตกลงกับผู้ขายเกี่ยวกับการชำระใบแจ้งหนี้ ซึ่งมักรวมส่วนลดไว้ด้วย. | ||
| คำอธิบาย เงื่อนไขการชำระเงินกำหนดวันครบกำหนดชำระและส่วนลดที่อาจได้รับเมื่อชำระก่อนกำหนด ตัวอย่างเช่น เงื่อนไข 'Z001' อาจหมายถึง 'ชำระภายใน 30 วัน รับส่วนลด 2% หากชำระภายใน 10 วัน' แอตทริบิวต์นี้เป็นข้อมูลพื้นฐานของแดชบอร์ด 'อัตราการรับส่วนลดเมื่อชำระก่อนกำหนด' เมื่อวิเคราะห์เงื่อนไขการชำระเงิน คุณจะระบุใบแจ้งหนี้ทั้งหมดที่มีสิทธิ์ได้รับส่วนลดได้ จากนั้นเปรียบเทียบกับส่วนลดที่ได้รับจริง เพื่อหาส่วนลดที่พลาดไปและวัดประสิทธิภาพของกระบวนการชำระเงิน. เหตุผลที่สำคัญ ข้อมูลนี้จำเป็นต่อการวิเคราะห์โอกาสรับส่วนลดเมื่อชำระก่อนกำหนด การวัดผลด้านการเงินของกระบวนการชำระเงิน และการระบุโอกาสประหยัดที่พลาดไป. แหล่งข้อมูล พบได้ในรายการบัญชีผู้ขาย ตาราง BSEG-ZTERM หรือส่วนหัวใบแจ้งหนี้ใน RBKP-ZTERM. ตัวอย่าง Z0010001NT30 | |||
| ชำระเงินล่าช้าหรือไม่ IsLatePayment | ค่าบูลีนที่ระบุว่าใบแจ้งหนี้ได้รับการชำระหลังวันครบกำหนดหรือไม่. | ||
| คำอธิบาย แอตทริบิวต์ที่คำนวณนี้เป็นค่าจริง/เท็จที่ระบุว่าใบแจ้งหนี้ได้รับการชำระหลังวันครบกำหนดอย่างเป็นทางการหรือไม่ โดยคำนวณจากการเปรียบเทียบ 'วันที่ตัดบัญชี' กับ 'วันครบกำหนดชำระใบแจ้งหนี้' ค่านี้ช่วยให้วิเคราะห์แดชบอร์ด 'การปฏิบัติตามเงื่อนไขการชำระเงินและอายุหนี้' และ KPI 'อัตราการชำระตรงเวลา' ได้ง่ายขึ้น คุณสามารถกรองและสรุปข้อมูลเพื่อนับจำนวนการชำระล่าช้า คำนวณสัดส่วนการชำระตรงเวลา และระบุผู้ขายหรือรหัสบริษัทที่มีอัตราการชำระล่าช้าสูงได้. เหตุผลที่สำคัญ วัดการปฏิบัติตามเงื่อนไขการชำระเงินโดยตรง ช่วยคำนวณ KPI การชำระตรงเวลา และระบุจุดที่ผลการชำระเงินยังไม่ดี. แหล่งข้อมูล แอตทริบิวต์ที่คำนวณ โดยใช้เงื่อนไข: IF ClearingDate > InvoiceDueDate THEN true ELSE false. ตัวอย่าง truefalse | |||
| ดำเนินการอัตโนมัติหรือไม่ IsAutomated | ตัวบ่งชี้ว่าระบบดำเนินกิจกรรมโดยอัตโนมัติ แทนการดำเนินการโดยผู้ใช้. | ||
| คำอธิบาย แอตทริบิวต์แบบค่าจริง/เท็จนี้ใช้แยกกิจกรรมที่ผู้ใช้เริ่มดำเนินการกับกิจกรรมที่ระบบทำผ่านงาน เวิร์กโฟลว์ หรือบอต เช่น รอบการจ่ายเงินอัตโนมัติหรือการลงบัญชีใบแจ้งหนี้ที่ระบบสร้างจะถูกระบุว่าเป็นการดำเนินการอัตโนมัติ การวิเคราะห์แอตทริบิวต์นี้ช่วยให้เข้าใจระดับการทำงานอัตโนมัติในกระบวนการเจ้าหนี้การค้า ใช้วัดผลของโครงการระบบอัตโนมัติ เปรียบเทียบประสิทธิภาพระหว่างขั้นตอนอัตโนมัติกับขั้นตอนที่ทำด้วยตนเอง และค้นหาโอกาสในการปรับปรุงเพิ่มเติม. เหตุผลที่สำคัญ ช่วยวัดระดับการทำงานอัตโนมัติในกระบวนการ เพื่อวิเคราะห์ประสิทธิผลและค้นหาโอกาสในการปรับปรุงเพิ่มเติม. แหล่งข้อมูล อนุมานจากชื่อผู้ใช้ เช่น รหัสผู้ใช้ระบบอย่าง 'SAP_SYSTEM' หรือ 'BATCHUSER' หรือจากรหัสธุรกรรมเฉพาะที่เชื่อมโยงกับงานอัตโนมัติ. ตัวอย่าง truefalse | |||
| ได้รับส่วนลดหรือไม่ DiscountTaken | ค่าบูลีนที่ระบุว่าได้รับส่วนลดเมื่อชำระก่อนกำหนดหรือไม่. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุว่าได้รับส่วนลดเงินสดจริงเมื่อชำระใบแจ้งหนี้หรือไม่ เป็นข้อมูลสำคัญในการวัดประสิทธิภาพทางการเงินของกระบวนการบัญชีเจ้าหนี้ ค่านี้เป็นหัวใจของ KPI 'อัตราการรับส่วนลดเมื่อชำระก่อนกำหนด' เมื่อกรองใบแจ้งหนี้ที่มีสิทธิ์ได้รับส่วนลดตามเงื่อนไขการชำระเงิน แล้ววิเคราะห์ค่านี้ องค์กรจะคำนวณได้อย่างแม่นยำว่าประหยัดเงินได้เท่าใด และพลาดโอกาสประหยัดไปกี่ครั้ง จึงใช้วัดผลการดำเนินงานด้านบัญชีเจ้าหนี้ได้อย่างชัดเจน. เหตุผลที่สำคัญ วัดผลการใช้ส่วนลดเมื่อชำระก่อนกำหนดที่มีสิทธิ์ได้รับโดยตรง ซึ่งส่งผลต่อกำไรสุทธิของบริษัท. แหล่งข้อมูล คำนวณโดยตรวจว่าฟิลด์ยอดส่วนลด (BSEG-SKNTO) ในเอกสารการชำระเงินมีค่ามากกว่าศูนย์หรือไม่. ตัวอย่าง truefalse | |||
| ประเภทเอกสารใบแจ้งหนี้ InvoiceDocumentType | การจัดประเภทเอกสารใบแจ้งหนี้ ซึ่งกำหนดวิธีประมวลผลใน SAP. | ||
| คำอธิบาย ประเภทเอกสารเป็นองค์ประกอบการกำหนดค่าที่สำคัญใน SAP ใช้จัดหมวดหมู่เอกสารบัญชี เช่น โดยทั่วไปใช้ 'KR' สำหรับใบแจ้งหนี้จากผู้ขาย 'RE' สำหรับใบแจ้งหนี้ MM และ 'KG' สำหรับใบลดหนี้จากผู้ขาย ประเภทนี้กำหนดรายละเอียดต่าง ๆ เช่น ช่วงหมายเลขเอกสารและฟิลด์ที่ต้องระบุ ในการวิเคราะห์กระบวนการ การกรองตามประเภทเอกสารช่วยเปรียบเทียบเส้นทางของใบแจ้งหนี้แต่ละประเภทได้ เช่น ขั้นตอนอนุมัติใบลดหนี้อาจต่างจากใบแจ้งหนี้ทั่วไป ข้อมูลนี้ใช้กับแดชบอร์ด 'รูปแบบเส้นทางการอนุมัติใบแจ้งหนี้'. เหตุผลที่สำคัญ ช่วยแบ่งกลุ่มกระบวนการตามวิธีจัดการใบแจ้งหนี้แต่ละประเภท เพื่อให้เห็นความแตกต่างของเส้นทางการประมวลผลและระยะเวลาของวงจร. แหล่งข้อมูล ดึงโดยตรงจากฟิลด์ BKPF-BLART ในตารางส่วนหัวเอกสาร. ตัวอย่าง KRREKG | |||
| เลขที่ใบแจ้งหนี้ของผู้ขาย VendorInvoiceNumber | เลขที่ใบแจ้งหนี้ที่ผู้ขายระบุในเอกสาร. | ||
| คำอธิบาย หมายเลขอ้างอิงจากระบบบัญชีของผู้ขาย ซึ่งพิมพ์อยู่บนใบแจ้งหนี้ฉบับกระดาษหรืออิเล็กทรอนิกส์ ข้อมูลนี้ป้อนด้วยตนเองหรือบันทึกด้วย OCR เมื่อได้รับใบแจ้งหนี้ ฟิลด์นี้สำคัญอย่างยิ่งต่อการปฏิบัติงานและการวิเคราะห์ โดยเฉพาะแดชบอร์ด 'การชำระใบแจ้งหนี้ซ้ำที่อาจเกิดขึ้น' วิธีตรวจหารายการซ้ำที่ใช้กันทั่วไปคือค้นหาเอกสารใบแจ้งหนี้ภายในหลายรายการที่มีชื่อผู้ขาย เลขที่ใบแจ้งหนี้ของผู้ขาย และยอดใบแจ้งหนี้ตรงกัน ฟิลด์นี้เป็นหมายเลขอ้างอิงหลักจากภายนอกสำหรับใบแจ้งหนี้. เหตุผลที่สำคัญ เป็นฟิลด์สำคัญสำหรับตรวจหารายการชำระเงินซ้ำที่อาจเกิดขึ้น และเป็นหมายเลขอ้างอิงหลักเมื่อติดต่อกับผู้ขาย. แหล่งข้อมูล จัดเก็บในฟิลด์ 'Reference' ที่ส่วนหัวเอกสาร โดยทั่วไปคือ BKPF-XBLNR. ตัวอย่าง INV-2023-9876733401120231015-001 | |||
| วันที่ตัดบัญชี ClearingDate | วันที่ชำระเงินและตัดใบแจ้งหนี้ออกจากรายการค้างชำระ. | ||
| คำอธิบาย วันที่ตัดบัญชีแสดงว่าใบแจ้งหนี้ได้รับการชำระเงินเรียบร้อยแล้ว โดยเป็นวันที่เกิดกิจกรรม 'Payment Cleared' ซึ่งถือเป็นขั้นตอนสุดท้ายของเส้นทางใบแจ้งหนี้ส่วนใหญ่ที่ดำเนินการสำเร็จ ใช้วันที่นี้คำนวณวันที่ชำระเงินจริง แล้วนำไปเปรียบเทียบกับวันครบกำหนดชำระใบแจ้งหนี้ จึงจำเป็นต่อการคำนวณ KPI 'อัตราการชำระตรงเวลา' และการวิเคราะห์ผลการชำระเงิน นอกจากนี้ยังใช้เป็นจุดสิ้นสุดในการคำนวณระยะเวลาตั้งแต่ต้นจนจบของกระบวนการใบแจ้งหนี้. เหตุผลที่สำคัญ ระบุวันที่ชำระใบแจ้งหนี้เสร็จสิ้น ใช้เป็นจุดสิ้นสุดในการคำนวณระยะเวลากระบวนการและเป็นข้อมูลพื้นฐานสำหรับวิเคราะห์การชำระตรงเวลา. แหล่งข้อมูล พบได้ในตารางรายการที่ตัดบัญชีแล้ว เช่น BSAK-AUGDT สำหรับผู้ขาย. ตัวอย่าง 2023-10-282023-11-142024-01-09 | |||
| สกุลเงินของใบแจ้งหนี้ InvoiceCurrency | รหัสสกุลเงินของยอดใบแจ้งหนี้ เช่น USD หรือ EUR. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุสกุลเงินที่ใช้แสดงยอดใบแจ้งหนี้ และให้บริบทที่จำเป็นสำหรับข้อมูลทางการเงิน สำหรับองค์กรที่ดำเนินงานในหลายประเทศ การวิเคราะห์ใบแจ้งหนี้โดยไม่คำนึงถึงสกุลเงินอาจทำให้เข้าใจผิดได้ ฟิลด์นี้ช่วยให้จัดการข้อมูลทางการเงินได้อย่างเหมาะสม ไม่ว่าจะเป็นการแปลงยอดทั้งหมดเป็นสกุลเงินเดียวสำหรับรายงาน หรือแยกวิเคราะห์ตามสกุลเงินเพื่อทำความเข้าใจกิจกรรมทางการเงินในแต่ละภูมิภาค. เหตุผลที่สำคัญ ให้บริบทที่จำเป็นสำหรับยอดใบแจ้งหนี้ ช่วยให้วิเคราะห์และรายงานข้อมูลทางการเงินได้ถูกต้อง โดยเฉพาะในองค์กรที่ดำเนินงานหลายประเทศ. แหล่งข้อมูล พบในตารางส่วนหัวเอกสาร โดยหลักคือ BKPF-WAERS หรือ RBKP-WAERS. ตัวอย่าง USDEURGBPJPY | |||
| เหตุผลที่ระงับการชำระเงิน BlockingReason | เหตุผลที่ระงับการชำระใบแจ้งหนี้ ซึ่งบ่งชี้ว่ามีข้อมูลไม่ตรงกัน. | ||
| คำอธิบาย หากใบแจ้งหนี้ไม่ผ่านการตรวจสอบระหว่างการจับคู่ 3 ทางหรือขั้นตอนตรวจสอบอื่น ระบบจะระงับการชำระเงิน โดยระบุเหตุผลไว้ เช่น จำนวนไม่ตรง ราคาแตกต่าง หรือไม่มีใบรับสินค้า แอตทริบิวต์นี้สำคัญต่อแดชบอร์ด 'การวิเคราะห์งานแก้ไขใบแจ้งหนี้ที่ข้อมูลไม่ตรงกัน' การวิเคราะห์ความถี่ของเหตุผลที่ระงับการชำระเงินแต่ละประเภทช่วยให้ค้นหาสาเหตุหลักของความไม่มีประสิทธิภาพในกระบวนการได้ เช่น หากพบเหตุผล 'ราคาแตกต่าง' บ่อยครั้ง อาจเป็นสัญญาณว่าข้อมูลหลักในระบบจัดซื้อมีปัญหา. เหตุผลที่สำคัญ ช่วยให้เห็นสาเหตุของข้อมูลใบแจ้งหนี้ที่ไม่ตรงกันและงานแก้ไขได้โดยตรง เพื่อให้คุณปรับปรุงกระบวนการได้ตรงจุด. แหล่งข้อมูล จัดเก็บในตารางรายการใบแจ้งหนี้ เช่น RSEG ในฟิลด์ที่ขึ้นต้นด้วย SPGR* (เช่น SPGRP, SPGRQ, SPGRT) และอาจพบได้ใน RBKP_BLOCKED. ตัวอย่าง ราคาไม่ตรงกันจำนวนไม่ตรงกันไม่มีใบรับสินค้า | |||
กิจกรรมในกระบวนการจัดการใบแจ้งหนี้เจ้าหนี้
| กิจกรรม | คำอธิบาย | ||
|---|---|---|---|
| ดำเนินการจ่ายเงินแล้ว | มีการจ่ายเงินตามใบแจ้งหนี้แล้ว โดยบันทึกเหตุการณ์นี้เมื่อรอบการจ่ายเงินเสร็จสมบูรณ์และสร้างพร้อมลงบัญชีเอกสารการจ่ายเงิน. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้สำคัญต่อการวิเคราะห์กระแสเงินสดและวัด KPI 'อัตราการจ่ายเงินตรงเวลา' โดยเปรียบเทียบวันที่จ่ายกับวันครบกำหนดของใบแจ้งหนี้. แหล่งข้อมูล บันทึกจากวันที่ลงบัญชีของเอกสารการจ่ายเงินที่ล้างยอดใบแจ้งหนี้ หมายเลขเอกสารการจ่ายเงินเชื่อมโยงอยู่ในฟิลด์เอกสารล้างยอด (AUGBL) ของรายการใบแจ้งหนี้ (BSEG). บันทึก ระบุวันที่ลงบัญชี (BUDAT) ของเอกสารการจ่ายเงินที่ล้างยอดรายการใบแจ้งหนี้. ประเภทเหตุการณ์ explicit | |||
| ยกเลิกใบแจ้งหนี้ | กลับรายการเอกสารใบแจ้งหนี้ ทำให้ผลกระทบทางการเงินเป็นโมฆะ นี่เป็นสถานะสิ้นสุดอีกแบบหนึ่งของกระบวนการ ซึ่งมักเกิดจากการป้อนข้อมูลผิดหรือข้อโต้แย้งกับซัพพลายเออร์. | ||
| เหตุผลที่สำคัญ การติดตามการยกเลิกช่วยค้นหาสาเหตุที่กระบวนการไม่สำเร็จ เช่น ส่งเอกสารซ้ำหรือข้อมูลใบแจ้งหนี้ไม่ถูกต้อง ซึ่งอาจชี้ถึงปัญหาที่เกิดขึ้นก่อนหน้าในกระบวนการ. แหล่งข้อมูล บันทึกเหตุการณ์นี้อย่างชัดเจนเมื่อสร้างเอกสารกลับรายการ ส่วนหัวเอกสารต้นฉบับ (BKPF) จะมีการระบุหมายเลขเอกสารกลับรายการ (STBLG) และเหตุผลในการกลับรายการ. บันทึก ระบุวันที่ลงบัญชีของเอกสารกลับรายการ ซึ่งเชื่อมโยงอยู่ในส่วนหัวของเอกสารต้นฉบับ (BKPF-STBLG). ประเภทเหตุการณ์ explicit | |||
| ระงับการจ่ายเงินตามใบแจ้งหนี้ | ระบบหรือผู้ใช้ระงับใบแจ้งหนี้ไว้ ทำให้ไม่สามารถจ่ายเงินได้ โดยทั่วไปเกิดจากข้อแตกต่างด้านราคา ปริมาณ หรือการอนุมัติที่ยังไม่ครบ. | ||
| เหตุผลที่สำคัญ สถานะนี้เป็นตัวบ่งชี้สำคัญของปัญหาและการแก้ไขงานซ้ำ การวิเคราะห์เหตุผลและระยะเวลาที่ระงับช่วยค้นหาสาเหตุที่แท้จริงของความล่าช้าในการจ่ายเงินและความไม่มีประสิทธิภาพของกระบวนการ. แหล่งข้อมูล สถานะนี้บันทึกไว้อย่างชัดเจนในฟิลด์รหัสระงับการจ่ายเงิน (ZLSPR) ของรายการเจ้าหนี้ในเอกสารบัญชี (ตาราง BSEG). บันทึก บันทึกผ่านเอกสารการเปลี่ยนแปลงเมื่อมีการระบุเหตุผลการระงับในฟิลด์ BSEG-ZLSPR. ประเภทเหตุการณ์ explicit | |||
| รับใบแจ้งหนี้ | กิจกรรมนี้หมายถึงการสร้างเอกสารใบแจ้งหนี้ใน SAP ไม่ว่าจะป้อนด้วยตนเองหรือผ่านอินเทอร์เฟซอัตโนมัติ เช่น OCR/VIM โดยทั่วไปจะบันทึกเหตุการณ์จากวันที่และเวลาที่สร้างส่วนหัวเอกสารบัญชี. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้เป็นจุดเริ่มต้นของกระบวนการ จึงจำเป็นต่อการคำนวณระยะเวลาตั้งแต่ต้นจนจบของวงจรใบแจ้งหนี้ และวัดปริมาณงานที่ดำเนินการได้ของกระบวนการเจ้าหนี้การค้าทั้งหมด. แหล่งข้อมูล บันทึกเหตุการณ์นี้จากตารางส่วนหัวเอกสารบัญชี (BKPF) โดยใช้วันที่สร้างเอกสาร (CPUDT) และเวลา (CPUTM). บันทึก ใช้เวลาประทับการสร้างเอกสารใบแจ้งหนี้ (BKPF-CPUDT, BKPF-CPUTM). ประเภทเหตุการณ์ explicit | |||
| ลงบัญชีใบแจ้งหนี้แล้ว | บันทึกใบแจ้งหนี้ในบัญชีแยกประเภททั่วไปอย่างเป็นทางการ ทำให้เกิดหนี้สินทางการเงิน เอกสารที่พักไว้จะเปลี่ยนเป็นเอกสารที่ลงบัญชีแล้ว หรืออาจลงบัญชีโดยตรง. | ||
| เหตุผลที่สำคัญ นี่คือหมุดหมายสำคัญทางการเงินที่ยืนยันว่าบริษัทมีภาระต้องชำระเงิน และมักเป็นเงื่อนไขก่อนจัดตารางการจ่ายเงิน. แหล่งข้อมูล ระบุเหตุการณ์นี้จากวันที่ลงบัญชี (BUDAT) ในส่วนหัวเอกสาร (BKPF) เอกสารที่ลงบัญชีแล้วจะมีสถานะเอกสาร (BKPF-BSTAT) เป็นค่าว่าง. บันทึก ใช้วันที่ลงบัญชี (BKPF-BUDAT) สำหรับเอกสารที่ไม่ได้พักไว้ (BKPF-BSTAT เป็นค่าว่าง). ประเภทเหตุการณ์ explicit | |||
| ล้างยอดการจ่ายเงินแล้ว | กิจกรรมนี้เป็นการปิดใบแจ้งหนี้ขั้นสุดท้าย โดยกระทบยอดการจ่ายเงินกับใบแจ้งหนี้ในบัญชีย่อย แสดงว่ากระบวนการเสร็จสมบูรณ์แล้ว. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้เป็นจุดสิ้นสุดที่ชัดเจนของกระบวนการ จึงจำเป็นต่อการคำนวณระยะเวลาตั้งแต่ต้นจนจบอย่างแม่นยำ และยืนยันว่าชำระหนี้สินแล้ว. แหล่งข้อมูล เหตุการณ์นี้บันทึกไว้อย่างชัดเจนเมื่อมีการระบุวันที่ล้างยอด (AUGDT) ในรายการเจ้าหนี้ของเอกสารใบแจ้งหนี้ (ตาราง BSEG). บันทึก ใช้วันที่ล้างยอด (BSEG-AUGDT) จากรายการใบแจ้งหนี้. ประเภทเหตุการณ์ explicit | |||
| อนุมัติใบแจ้งหนี้แล้ว | ใบแจ้งหนี้ได้รับการอนุมัติครบตามที่กำหนดในระบบเวิร์กโฟลว์แล้ว โดยมักเป็นขั้นตอนสุดท้ายก่อนลงบัญชีหรือยกเลิกการระงับการจ่ายเงิน. | ||
| เหตุผลที่สำคัญ หมุดหมายสำคัญนี้เป็นจุดสิ้นสุดของรอบการอนุมัติ ระยะเวลาตั้งแต่ส่งขออนุมัติจนถึงได้รับอนุมัติเป็นตัวชี้วัดประสิทธิภาพที่สำคัญ. แหล่งข้อมูล บันทึกจาก SAP Business Workflow เมื่อเวิร์กโฟลว์เสร็จสมบูรณ์หรือมีการอนุมัติขั้นสุดท้าย อีกทางหนึ่ง อาจอนุมานจากการยกเลิกการระงับการจ่ายเงินหลังส่งขออนุมัติ. บันทึก ดึงเหตุการณ์เวิร์กโฟลว์ที่เสร็จสมบูรณ์จากบันทึก SAP workflow หรือค้นหาเหตุการณ์ 'อนุมัติให้ดำเนินการ' ขั้นสุดท้าย. ประเภทเหตุการณ์ explicit | |||
| แก้ไขข้อแตกต่างแล้ว | กิจกรรมนี้หมายถึงการตรวจสอบและแก้ไขปัญหาที่พบก่อนหน้านี้ ซึ่งอาจทำให้ระงับการจ่ายเงิน โดยบันทึกเหตุการณ์นี้เมื่อยกเลิกการระงับใบแจ้งหนี้. | ||
| เหตุผลที่สำคัญ การติดตามวงจรการแก้ไขงานซ้ำนี้สำคัญต่อแดชบอร์ด 'การวิเคราะห์การแก้ไขข้อแตกต่างในใบแจ้งหนี้' เพราะช่วยวัดเวลาและแรงงานที่ใช้แก้ข้อผิดพลาด. แหล่งข้อมูล อนุมานจากเอกสารการเปลี่ยนแปลงที่แสดงการยกเลิกการระงับการจ่ายเงิน โดยใช้บันทึกการเปลี่ยนแปลงของฟิลด์ BSEG-ZLSPR เป็นแหล่งข้อมูลหลัก. บันทึก ค้นหาเอกสารการเปลี่ยนแปลงของตาราง BSEG ที่ฟิลด์ ZLSPR เปลี่ยนจากมีค่าเป็นค่าว่าง. ประเภทเหตุการณ์ inferred | |||
| จับคู่ใบรับสินค้าแล้ว | กิจกรรมนี้หมายถึงการจับคู่ปริมาณและมูลค่าในใบแจ้งหนี้กับเอกสารใบรับสินค้าที่เกี่ยวข้องสำเร็จ ซึ่งเป็นขั้นตอนตรวจสอบขั้นสุดท้ายของการจับคู่ 3 ทาง. | ||
| เหตุผลที่สำคัญ การติดตามกิจกรรมนี้ช่วยระบุจุดที่ไม่มีประสิทธิภาพในการจับคู่ 3 ทาง และค้นหาข้อแตกต่างระหว่างสินค้าที่รับเข้ากับรายการที่ซัพพลายเออร์เรียกเก็บเงิน. แหล่งข้อมูล อนุมานจากการมีข้อมูลอ้างอิงเอกสารวัสดุ (ใบรับสินค้า) ในรายการใบแจ้งหนี้ ซึ่งมักเชื่อมโยงผ่านประวัติรายการใบสั่งซื้อ. บันทึก อนุมานจากการมีข้อมูลอ้างอิงเอกสารใบรับสินค้าในรายการใบแจ้งหนี้ เช่น ใน RSEG สำหรับใบแจ้งหนี้ MIRO. ประเภทเหตุการณ์ inferred | |||
| จับคู่ใบสั่งซื้อแล้ว | กิจกรรมนี้หมายถึงการจับคู่ใบแจ้งหนี้กับใบสั่งซื้อที่เกี่ยวข้องสำเร็จ ซึ่งเป็นขั้นตอนสำคัญของการจับคู่ 3 ทางสำหรับใบแจ้งหนี้ที่เกี่ยวข้องกับการจัดซื้อ. | ||
| เหตุผลที่สำคัญ การวิเคราะห์กิจกรรมนี้ช่วยวัดประสิทธิภาพของกระบวนการจับคู่ และเป็นพื้นฐานของ KPI 'ประสิทธิภาพการจับคู่ 3 ทาง' และ 'สัดส่วนใบแจ้งหนี้ที่ไม่มีใบสั่งซื้อ'. แหล่งข้อมูล อนุมานได้เมื่อรายการใบแจ้งหนี้ในตาราง BSEG หรือ ACDOCA มีหมายเลขใบสั่งซื้อ (EBELN) และรายการ (EBELP) ที่ถูกต้อง. บันทึก อนุมานจากการมีข้อมูลอ้างอิงใบสั่งซื้อ (BSEG-EBELN) ในเอกสารใบแจ้งหนี้ขณะสร้างเอกสาร. ประเภทเหตุการณ์ inferred | |||
| ปฏิเสธใบแจ้งหนี้ | ผู้อนุมัติปฏิเสธใบแจ้งหนี้ระหว่างเวิร์กโฟลว์การอนุมัติ โดยทั่วไปการดำเนินการนี้จะส่งใบแจ้งหนี้กลับไปยังผู้ประมวลผลเพื่อแก้ไขหรือชี้แจง. | ||
| เหตุผลที่สำคัญ การติดตามรายการที่ถูกปฏิเสธช่วยให้เห็นวงจรการแก้ไขงานซ้ำในกระบวนการอนุมัติ และอาจบ่งชี้ปัญหาการปฏิบัติตามนโยบายหรือการลงรหัสใบแจ้งหนี้ไม่ถูกต้อง. แหล่งข้อมูล บันทึกเป็นเหตุการณ์ผลลัพธ์เฉพาะในบันทึก SAP Business Workflow ที่เชื่อมโยงกับใบแจ้งหนี้. บันทึก ดึงเหตุการณ์สถานะ 'ปฏิเสธ' ของเวิร์กโฟลว์จากบันทึก SAP workflow. ประเภทเหตุการณ์ explicit | |||
| พักใบแจ้งหนี้ | หมายถึงใบแจ้งหนี้ที่ป้อนเข้าระบบแล้ว แต่ยังไม่ได้ลงบัญชีแยกประเภททั่วไป โดยมักเป็นขั้นตอนที่ตั้งใจพักเอกสารที่ยังไม่สมบูรณ์ไว้ เพื่อดำเนินการหรือขออนุมัติภายหลัง. | ||
| เหตุผลที่สำคัญ การติดตามใบแจ้งหนี้ที่พักไว้ช่วยให้เห็นความล่าช้าก่อนเริ่มลงบัญชีอย่างเป็นทางการ และอาจชี้ให้เห็นปัญหาข้อมูลไม่ครบหรือการตรวจสอบเบื้องต้น. แหล่งข้อมูล อนุมานสถานะนี้จากฟิลด์สถานะเอกสารในส่วนหัวเอกสารบัญชี (BKPF-BSTAT = 'V' สำหรับสถานะพักเอกสาร) เหตุการณ์เกิดขึ้นเมื่อมีการกำหนดสถานะนี้. บันทึก ค้นหาเอกสารการเปลี่ยนแปลงของตาราง BKPF ที่กำหนดฟิลด์ BSTAT เป็น 'V' (Vor-erfasst/ป้อนข้อมูลล่วงหน้า). ประเภทเหตุการณ์ inferred | |||
| เลยวันครบกำหนดชำระใบแจ้งหนี้ | เหตุการณ์ที่คำนวณขึ้นเพื่อระบุว่าเลยวันครบกำหนดสุทธิของใบแจ้งหนี้แล้ว โดยยังไม่มีการล้างยอดการจ่ายเงิน ซึ่งหมายถึงการจ่ายเงินล่าช้าหรือเกินกำหนด. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้จำเป็นต่อแดชบอร์ด 'การปฏิบัติตามข้อกำหนดและอายุหนี้ด้านการจ่ายเงิน' ช่วยให้พบและจัดการใบแจ้งหนี้เกินกำหนดได้ล่วงหน้า พร้อมวิเคราะห์สาเหตุที่แท้จริงของการจ่ายเงินล่าช้า. แหล่งข้อมูล SAP ไม่มีเหตุการณ์นี้โดยตรง แต่คำนวณโดยเปรียบเทียบวันที่ปัจจุบันของระบบกับวันครบกำหนดสุทธิ (คำนวณจาก BSEG-ZFBDT หรือวันที่ฐานและเงื่อนไขการจ่ายเงิน). บันทึก เหตุการณ์ที่คำนวณขึ้นเมื่อเวลาประทับของเหตุการณ์อยู่หลังวันครบกำหนดสุทธิของใบแจ้งหนี้. ประเภทเหตุการณ์ calculated | |||
| ส่งใบแจ้งหนี้เพื่อขออนุมัติ | ส่งใบแจ้งหนี้เข้าสู่เวิร์กโฟลว์เพื่อขออนุมัติตามกฎทางธุรกิจ ซึ่งเป็นจุดเริ่มต้นของกระบวนการย่อยด้านการอนุมัติ. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้เป็นจุดเริ่มต้นในการวัด KPI 'เวลาเฉลี่ยในการอนุมัติใบแจ้งหนี้' และวิเคราะห์คอขวดในขั้นตอนอนุมัติ. แหล่งข้อมูล บันทึกข้อมูลนี้ได้จากบันทึก SAP Business Workflow (ตาราง SWW*) ซึ่งระบุการเริ่มต้นอินสแตนซ์เวิร์กโฟลว์ที่เชื่อมโยงกับออบเจ็กต์ใบแจ้งหนี้ เช่น BUS2081. บันทึก ดึงเหตุการณ์เริ่มต้นเวิร์กโฟลว์จากบันทึก SAP workflow เช่น ตาราง SWW_WIHEAD ที่เชื่อมโยงกับเอกสารใบแจ้งหนี้. ประเภทเหตุการณ์ explicit | |||
| สร้างข้อเสนอการจ่ายเงิน | เพิ่มใบแจ้งหนี้ในข้อเสนอการจ่ายเงินซึ่งเป็นส่วนหนึ่งของรอบการจ่ายเงิน เช่น F110 ขณะนี้กำหนดให้จ่ายเงินแล้ว โดยรอการดำเนินการรอบจ่ายเงินขั้นสุดท้าย. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้แสดงการเปลี่ยนจากหนี้สินคงค้างไปสู่รายการที่กำลังเตรียมจ่ายเงิน ช่วยวิเคราะห์ประสิทธิภาพการปฏิบัติการด้านการจ่ายเงิน. แหล่งข้อมูล บันทึกเหตุการณ์นี้ไว้อย่างชัดเจนในตารางข้อมูลรอบการจ่ายเงิน โดยเฉพาะ REGUP (รายการที่ประมวลผลโดยโปรแกรมการจ่ายเงิน) และ REGUH (ส่วนหัว). บันทึก ตรวจสอบว่าใบแจ้งหนี้ปรากฏในตาราง REGUP เมื่อใด โดยอ้างอิงรอบการจ่ายเงินใน REGUH. ประเภทเหตุการณ์ explicit | |||
คู่มือการดึงข้อมูล
ขั้นตอน
- ข้อกำหนดเบื้องต้นและสิทธิ์เข้าถึง: ตรวจสอบว่าคุณมีผู้ใช้ที่มีสิทธิ์อ่านสคีมาฐานข้อมูล SAP S/4HANA ซึ่งเป็นที่เก็บ CDS view (โดยทั่วไปคือ SAPABAP1 หรือชื่อใกล้เคียง) คุณต้องมีเครื่องมือ SQL client ที่เชื่อมต่อกับฐานข้อมูล SAP HANA ได้ เช่น SAP HANA Studio, DBeaver หรือเครื่องมือ query ฐานข้อมูลอื่นๆ
- ระบุ CDS View หลัก: CDS view หลักที่ใช้ดึงข้อมูล ได้แก่ I_JournalEntry, I_JournalEntryItem, I_SupplierInvoiceAPI01, I_ChangeDocument, I_WorkflowStatusDetails และ I_PaymentProposalItem ทำความเข้าใจฟิลด์สำคัญของแต่ละ view
- กำหนดขอบเขต query: เปิด SQL client แล้วเชื่อมต่อกับฐานข้อมูล SAP HANA ก่อนเรียกใช้ query ฉบับเต็ม ให้กำหนดขอบเขตข้อมูลที่จะดึง โดยระบุตัวระบุระบบต้นทาง ช่วงวันที่ของใบแจ้งหนี้ (CreationDateTime) และ Company Code ที่เกี่ยวข้อง
- เตรียม query หลัก: คัดลอก SQL query ฉบับเต็มจากส่วน query ไปวางใน SQL client โดย query ใช้ Common Table Expressions (CTEs) เพื่อเลือกชุดใบแจ้งหนี้ตั้งต้นก่อน แล้วจึงรวมข้อมูลเป็นบันทึกเหตุการณ์สำหรับกิจกรรม 15 รายการ
- กำหนดพารามิเตอร์ query: ค้นหาตัวแปรแทนค่าใน SQL query ที่คัดลอกมา แทนที่ '[YYYY-MM-DD]' ด้วยวันที่เริ่มต้นและสิ้นสุดของช่วงวิเคราะห์ และแทนที่ '[Your Company Code 1]', '[Your Company Code 2]' ด้วยรายการ SAP Company Code ที่ต้องการวิเคราะห์
- เรียกใช้ query เพื่อดึงข้อมูล: เรียกใช้ SQL query ฉบับเต็ม ระยะเวลาอาจตั้งแต่หลายนาทีจนถึงหลายชั่วโมง ขึ้นอยู่กับปริมาณข้อมูลและช่วงวันที่ที่เลือก
- ตรวจสอบผลลัพธ์เบื้องต้น: เมื่อ query ทำงานเสร็จ ให้ตรวจสอบผลลัพธ์สองสามร้อยแถวแรก ดูว่าข้อมูลสอดคล้องกันหรือไม่ คอลัมน์มีค่าตามที่คาดไว้หรือไม่ และมีค่า ActivityName ที่แตกต่างกันครบหรือไม่
- ส่งออกบันทึกเหตุการณ์: ส่งออกผลลัพธ์ทั้งหมดจาก SQL client เป็นไฟล์ CSV และบันทึกเป็น UTF-8 เพื่อป้องกันปัญหาอักขระ ตั้งชื่อไฟล์ให้สื่อความหมาย เช่น sap_s4hana_ap_event_log.csv
- เตรียมไฟล์สำหรับอัปโหลด: ก่อนอัปโหลดไปยังเครื่องมือ process mining ให้ตรวจสอบว่าชื่อคอลัมน์ในไฟล์ CSV ตรงกับชื่อแอตทริบิวต์ที่กำหนดทุกประการ ได้แก่ Invoice, ActivityName, EventTime, SourceSystem, LastDataUpdate, UserName และอื่นๆ
- อัปโหลดไปยังเครื่องมือ process mining: อัปโหลดไฟล์ CSV ที่สร้างขึ้นไปยังแพลตฟอร์ม process mining แล้วกำหนดคอลัมน์ให้ตรงกับฟิลด์รหัสเคส กิจกรรม และเวลาเหตุการณ์
การกำหนดค่า
- CDS View หลัก: การดึงข้อมูลใช้ CDS View มาตรฐานหลายรายการของ S/4HANA โดยมี view หลักดังนี้
- I_JournalEntry และ I_JournalEntryItem: ใช้ดึงส่วนหัวและรายการของเอกสารการเงิน รายละเอียดการลงบัญชี และข้อมูลการหักล้าง
- I_SupplierInvoiceAPI01: ใช้ดึงรายละเอียดเฉพาะของใบแจ้งหนี้ MM (โลจิสติกส์) รวมถึงข้อมูลอ้างอิง PO และการระงับการชำระเงิน
- I_ChangeDocument: ใช้ติดตามเวลาที่มีการเปลี่ยนแปลงอย่างชัดเจน เช่น การตั้งค่าหรือยกเลิกการระงับการชำระเงิน
- I_WorkflowStatusDetails: ใช้ดึงเหตุการณ์ที่เกี่ยวข้องกับเวิร์กโฟลว์อนุมัติใบแจ้งหนี้
- I_PaymentProposalItem: ใช้ระบุว่าใบแจ้งหนี้ถูกรวมไว้ในข้อเสนอรอบการชำระเงินเมื่อใด
- I_Supplier: ใช้เพิ่มข้อมูลหลักของผู้ขาย เช่น VendorName
- การกรองช่วงวันที่: ควรกรองช่วงวันที่เพื่อจำกัดปริมาณข้อมูล query ที่ให้มาจะกรอง CreationDateTime ใน CTE Invoices_Base แนะนำให้เริ่มวิเคราะห์ด้วยข้อมูลย้อนหลัง 3-6 เดือน เพื่อให้ประมวลผลได้ในเวลาที่เหมาะสม
- ตัวกรองที่จำเป็น: กรองตาม CompanyCode เสมอ การวิเคราะห์ข้อมูลจากทุก Company Code พร้อมกันอาจใช้เวลานานมากและอาจไม่ตรงกับความต้องการทางธุรกิจ นอกจากนี้ ให้กรอง JournalEntryType เพื่อเลือกเฉพาะเอกสารที่เกี่ยวข้องกับผู้ขาย เช่น 'KR' และ 'RE'
- ข้อกำหนดเบื้องต้น: ผู้ใช้ฐานข้อมูลที่เรียกใช้ query ต้องมีสิทธิ์ SELECT สำหรับ CDS view ทุก view ที่ใช้ใน query และสคีมา HANA ที่เกี่ยวข้อง การมีสิทธิ์เข้าถึงระดับแอปพลิเคชันใน SAP GUI อย่างเดียวไม่เพียงพอ
- ข้อควรพิจารณาด้านประสิทธิภาพ: การ query I_ChangeDocument โดยตรงอาจใช้ทรัพยากรมาก query ที่ให้มาพยายามลดภาระด้วยการกรองใบแจ้งหนี้ก่อน หากมีข้อมูลจำนวนมาก ควรดึงข้อมูลนอกช่วงเวลาที่มีการใช้งานสูง หรือแบ่งดึงเป็นช่วงวันที่สั้นๆ.
ตัวอย่างคำค้น sql
-- Common Table Expression (CTE) to select the base set of AP Invoices
WITH Invoices_Base AS (
SELECT
I_JournalEntry.CompanyCode,
I_JournalEntry.AccountingDocument,
I_JournalEntry.FiscalYear,
CONCAT(I_JournalEntry.CompanyCode, CONCAT(I_JournalEntry.AccountingDocument, I_JournalEntry.FiscalYear)) AS InvoiceId,
I_JournalEntry.CreationDateTime,
I_JournalEntry.CreatedByUser,
I_JournalEntry.DocumentStatus,
I_JournalEntry.JournalEntryType,
I_JournalEntry.ReversalReferenceJournalEntry,
I_JournalEntry.IsReversed,
I_JournalEntry.ReversalDate,
IJE_ITEM.NetDueDate,
IJE_ITEM.Supplier,
SUP.SupplierName AS VendorName,
IJE_ITEM.AmountInCompanyCodeCurrency AS InvoiceAmount,
MM.PurchaseOrder AS PurchaseOrderNumber,
MM.PaymentBlockingReason
FROM I_JournalEntry
-- Join to get item details like due date and supplier
LEFT JOIN I_JournalEntryItem AS IJE_ITEM
ON I_JournalEntry.CompanyCode = IJE_ITEM.CompanyCode
AND I_JournalEntry.AccountingDocument = IJE_ITEM.AccountingDocument
AND I_JournalEntry.FiscalYear = IJE_ITEM.FiscalYear
AND IJE_ITEM.IsSupplier = 'X'
-- Join to get vendor name from master data
LEFT JOIN I_Supplier AS SUP
ON IJE_ITEM.Supplier = SUP.Supplier
-- Join to get MM Invoice specific data like PO Number and Payment Block
LEFT JOIN I_SupplierInvoiceAPI01 AS MM
ON I_JournalEntry.AccountingDocument = MM.AccountingDocument
AND I_JournalEntry.CompanyCode = MM.CompanyCode
AND I_JournalEntry.FiscalYear = MM.FiscalYear
WHERE
I_JournalEntry.JournalEntryType IN ('KR', 'RE') -- Standard Vendor Invoice Types
AND I_JournalEntry.CompanyCode IN ('[Your Company Code 1]', '[Your Company Code 2]')
AND I_JournalEntry.CreationDateTime BETWEEN '[YYYY-MM-DD]T00:00:00Z' AND '[YYYY-MM-DD]T23:59:59Z'
)
-- Event: 1. Invoice Received
SELECT
B.InvoiceId AS "Invoice",
'Invoice Received' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
UNION ALL
-- Event: 2. Invoice Parked
SELECT
B.InvoiceId AS "Invoice",
'Invoice Parked' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.DocumentStatus = 'V' -- 'V' stands for Parked
UNION ALL
-- Event: 3. Purchase Order Matched
SELECT
B.InvoiceId AS "Invoice",
'Purchase Order Matched' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.PurchaseOrderNumber IS NOT NULL AND B.PurchaseOrderNumber <> ''
UNION ALL
-- Event: 4. Goods Receipt Matched
SELECT
B.InvoiceId AS "Invoice",
'Goods Receipt Matched' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_SupplierInvoiceItemAPI01 AS MM_ITEM
ON B.AccountingDocument = MM_ITEM.AccountingDocument
AND B.FiscalYear = MM_ITEM.FiscalYear
WHERE MM_ITEM.GoodsReceipt IS NOT NULL AND MM_ITEM.GoodsReceipt <> ''
UNION ALL
-- Event: 5. Invoice Blocked For Payment
SELECT
B.InvoiceId AS "Invoice",
'Invoice Blocked For Payment' AS "ActivityName",
B.CreationDateTime AS "EventTime", -- Approximates block time as creation time if blocked on entry
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.PaymentBlockingReason IS NOT NULL AND B.PaymentBlockingReason <> ''
UNION ALL
-- Event: 6. Discrepancy Resolved (Payment Block Removed)
SELECT
B.InvoiceId AS "Invoice",
'Discrepancy Resolved' AS "ActivityName",
CD.ChangeTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
CD.UserName AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_ChangeDocument AS CD
ON CONCAT(B.CompanyCode, B.AccountingDocument, B.FiscalYear) = CD.ObjectValue
WHERE CD.ChangeDocumentObject = 'INVOICE'
AND CD.TableName = 'RBKP'
AND CD.FieldName = 'ZLSPR' -- Field for Payment Block
AND CD.NewFieldValue = '' -- Block was removed
UNION ALL
-- Event: 7, 8, 9. Workflow Events (Routed, Approved, Rejected)
SELECT
B.InvoiceId AS "Invoice",
CASE WF.WorkflowStatus
WHEN 'READY' THEN 'Invoice Routed For Approval'
WHEN 'APPROVED' THEN 'Invoice Approved'
WHEN 'REJECTED' THEN 'Invoice Rejected'
END AS "ActivityName",
WF.WorkflowStatusChangedDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
WF.WorkflowStatusChangedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_WorkflowStatusDetails AS WF
ON B.InvoiceId = WF.WorkflowScenarioInstance
WHERE WF.WorkflowStatus IN ('READY', 'APPROVED', 'REJECTED')
UNION ALL
-- Event: 10. Invoice Posted
SELECT
B.InvoiceId AS "Invoice",
'Invoice Posted' AS "ActivityName",
JE.PostingDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntry AS JE
ON B.AccountingDocument = JE.AccountingDocument
AND B.CompanyCode = JE.CompanyCode
AND B.FiscalYear = JE.FiscalYear
WHERE B.DocumentStatus <> 'V' -- Any status other than Parked is considered Posted for AP
UNION ALL
-- Event: 11. Payment Proposal Created
SELECT
B.InvoiceId AS "Invoice",
'Payment Proposal Created' AS "ActivityName",
PPI.PaymentProposalRunDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
PPI.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_PaymentProposalItem AS PPI
ON B.CompanyCode = PPI.CompanyCode
AND B.AccountingDocument = PPI.AccountingDocument
AND B.FiscalYear = PPI.FiscalYear
UNION ALL
-- Event: 12. Payment Executed
-- This links the invoice to its clearing document, which is the payment document
SELECT DISTINCT
B.InvoiceId AS "Invoice",
'Payment Executed' AS "ActivityName",
CLEAR_JE.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
CLEAR_JE.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
INNER JOIN I_JournalEntry AS CLEAR_JE
ON IJE_ITEM.ClearingJournalEntry = CLEAR_JE.AccountingDocument
AND IJE_ITEM.CompanyCode = CLEAR_JE.CompanyCode
WHERE IJE_ITEM.ClearingJournalEntry IS NOT NULL AND IJE_ITEM.ClearingJournalEntry <> ''
AND CLEAR_JE.JournalEntryType = 'KZ' -- Vendor Payment Document Type
UNION ALL
-- Event: 13. Invoice Due Date Passed
SELECT
B.InvoiceId AS "Invoice",
'Invoice Due Date Passed' AS "ActivityName",
ADD_DAYS(B.NetDueDate, 1) AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
'SYSTEM' AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
LEFT JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
WHERE B.NetDueDate < CURRENT_DATE
AND IJE_ITEM.ClearingDate IS NULL -- Invoice is not yet cleared
UNION ALL
-- Event: 14. Payment Cleared
SELECT DISTINCT
B.InvoiceId AS "Invoice",
'Payment Cleared' AS "ActivityName",
IJE_ITEM.ClearingDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
IJE_ITEM.ChangedByUser AS "UserName", -- User who cleared it
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
WHERE IJE_ITEM.ClearingDate IS NOT NULL
UNION ALL
-- Event: 15. Invoice Cancelled
SELECT
B.InvoiceId AS "Invoice",
'Invoice Cancelled' AS "ActivityName",
B.ReversalDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName", -- User who created the original document
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.IsReversed = 'X'; ขั้นตอน
- ตรวจสอบว่ามีสิทธิ์อ่านโดยตรงในสคีมา SAP HANA ที่มีตาราง SAP S/4HANA ที่เกี่ยวข้อง ขอ connection string ข้อมูลรับรอง ชื่อสคีมา และสิทธิ์ที่จำเป็นสำหรับอ่าน BKPF, ACDOCA รวมถึงตารางเพิ่มเติมที่ตั้งค่าไว้สำหรับเอกสารที่พักไว้ เวิร์กโฟลว์ การจัดซื้อ การรับสินค้า ข้อเสนอการชำระเงิน การหักล้าง และข้อมูลการกลับรายการ
- ตรวจสอบโมเดลข้อมูลทางเทคนิคในระบบเป้าหมายก่อนเรียกใช้ ยืนยันชื่อจริงของออบเจ็กต์ ฟิลด์คีย์ ฟิลด์เวลา ความสัมพันธ์ของรายการกลับรายการ ความสัมพันธ์การชำระเงิน และข้อมูลเวิร์กโฟลว์ที่ระบบใช้ แทนที่ตัวแทนค่าในวงเล็บเหลี่ยมแต่ละรายการด้วยออบเจ็กต์หรือฟิลด์ที่ตรงกับระบบ อย่าสมมติว่าข้อมูลเวิร์กโฟลว์หรือเอกสารที่พักไว้จัดเก็บอยู่ในตารางมาตรฐานเดียวกันทุกระบบ
- กำหนดพารามิเตอร์การดึงข้อมูล ระบุ [Start date], [End date], [Company code filter], [Document type filter] และ [Schema name] เริ่มจากช่วงวันที่สามถึงหกเดือน แล้วค่อยขยายหลังตรวจสอบประสิทธิภาพและความครบถ้วนของข้อมูลแล้ว
- เรียกใช้ SQL query ใน SQL client สำหรับ SAP HANA ที่ได้รับอนุมัติ เช่น SAP HANA Database Explorer หรือเครื่องมือเรียกใช้ SQL อื่นที่ได้รับอนุญาต query จะแสดงหนึ่งแถวต่อกิจกรรมที่ดึงข้อมูลไว้อย่างชัดเจน โดยไม่ให้ ProcessMind อนุมานเหตุการณ์ขึ้นเอง
- ตรวจสอบชุดผลลัพธ์ ยืนยันว่า Invoice เป็นรหัสเคส ActivityName มีชื่อกิจกรรมที่กำหนดครบทั้ง 15 รายการ EventTime มีค่าและเรียงตามลำดับเวลาที่สมเหตุสมผล SourceSystem ระบุ SAP S/4HANA และ LastDataUpdate มีเวลาที่อัปเดตข้อมูลจากการดึงครั้งนั้น ตรวจสอบเหตุการณ์ซ้ำ ความสัมพันธ์ของรายการกลับรายการ และการ join เอกสารก่อนโหลดข้อมูล
- จัดการการจับคู่ข้อมูลเฉพาะระบบตามที่จำเป็น ตัวอย่างเช่น จับคู่แหล่งข้อมูลเอกสารที่พักไว้กับ Invoice Parked จับคู่แหล่งข้อมูลเวิร์กโฟลว์กับ Invoice Routed For Approval, Invoice Approved และ Invoice Rejected และจับคู่แหล่งข้อมูลการชำระเงินกับ Payment Proposal Created และ Payment Executed หากต้องตรวจสอบย้อนหลัง ให้เก็บตัวระบุจากระบบต้นทางไว้ในคอลัมน์เพิ่มเติม
- ส่งออกผลลัพธ์เป็นไฟล์แบบมีตัวคั่นหรือชุดผลลัพธ์จากฐานข้อมูล โดยให้หนึ่งแถวแทนหนึ่งเหตุการณ์ ใช้ UTF-8 เก็บเวลาในเขตเวลาเดียวกัน และคงชื่อคอลัมน์ให้ตรงทุกประการ ได้แก่ Invoice, ActivityName, EventTime, SourceSystem, LastDataUpdate, UserName, CompanyCode, VendorName, InvoiceAmount, PurchaseOrderNumber และ InvoiceDueDate ห้ามรวมกิจกรรมหลายรายการไว้ในใบแจ้งหนี้แถวเดียว
- อัปโหลดบันทึกเหตุการณ์ไปยัง ProcessMind แล้วกำหนด Invoice เป็นรหัสเคส ActivityName เป็นคอลัมน์กิจกรรม และ EventTime เป็นคอลัมน์เวลาเหตุการณ์ ตรวจสอบว่าแอตทริบิวต์เสริมจับคู่กับฟิลด์ที่ถูกต้อง เนื่องจาก ProcessMind อ่านบันทึกเหตุการณ์ตามข้อมูลที่ได้รับ จึงต้องตรวจสอบให้แน่ใจว่าทุกกิจกรรมที่ต้องการแสดงมีแถวข้อมูลก่อนอัปโหลด
การกำหนดค่า
- ช่วงวันที่: เริ่มจากสามถึงหกเดือน โดยใช้วันที่ลงบัญชี วันที่สร้างเอกสาร หรือวันที่ของเหตุการณ์ต้นทางที่เกี่ยวข้องตามกิจกรรมที่ดึงข้อมูล ขยายช่วงหลังตรวจสอบเวลาที่ query ใช้และระยะเวลาการเก็บข้อมูลของระบบต้นทางแล้ว
- การกรอง Company Code: กำหนด [Company code filter] เพื่อจำกัดการดึงข้อมูลเฉพาะ Company Code ที่ต้องการ หากไม่จำเป็นต้องจำกัด ให้เลือกดึงข้อมูลทุกบริษัทอย่างมีการควบคุม แทนการเรียก query แบบไม่จำกัดในระบบจริง
- การกรองเอกสาร: กำหนด [Document type filter] หลังจากยืนยันประเภทเอกสารที่ใช้กับใบแจ้งหนี้ผู้ขาย ใบลดหนี้ เอกสารที่พักไว้ เอกสารการชำระเงิน และรายการกลับรายการในระบบเป้าหมายแล้วเท่านั้น
- การจับคู่สคีมาและออบเจ็กต์: แทนที่ [Schema name] และออบเจ็กต์หรือฟิลด์ต้นทางทุกตัวที่อยู่ในวงเล็บเหลี่ยมด้วยค่าที่ตรวจสอบแล้วในระบบ SAP S/4HANA เป้าหมาย ต้องปรับ query HANA โดยตรงให้สอดคล้องกับแอปพลิเคชันที่เปิดใช้งาน ส่วนขยาย การออกแบบเวิร์กโฟลว์ และโมเดลข้อมูลของระบบ
- การจัดการเวลา: ปรับเวลาจากแหล่งข้อมูลทั้งหมดให้อยู่ในเขตเวลาเดียวกัน หากมีเพียงวันที่ ให้กำหนดเวลาเริ่มต้นที่บันทึกไว้เป็นมาตรฐาน และระบุข้อจำกัดนี้ในพจนานุกรมข้อมูล
- ความหมายของเหตุการณ์: ดึงแต่ละกิจกรรมเป็นคนละแถว ห้ามรวมหลายกิจกรรมไว้ในระเบียนใบแจ้งหนี้เดียว และอย่าคาดหวังให้ ProcessMind สร้างเหตุการณ์จับคู่ อนุมัติ ครบกำหนดชำระ หรือหักล้างขึ้นเอง
- เหตุการณ์วันครบกำหนดชำระ: สร้าง Invoice Due Date Passed เฉพาะใบแจ้งหนี้ที่วันครบกำหนดผ่านไปก่อนเวลาประเมินที่กำหนด และยังไม่มีเหตุการณ์หักล้าง ณ เวลาดังกล่าว query ใช้ [Evaluation timestamp] ในการคำนวณนี้
- ประสิทธิภาพ: จำกัดช่วงเวลาและขอบเขตบริษัทในระยะแรก กรองฟิลด์ที่มีดัชนีหรือเกี่ยวข้องกับการแบ่งพาร์ทิชัน หลีกเลี่ยงการดึงคอลัมน์จำนวนมากโดยไม่จำเป็น และเรียกใช้ในช่วงเวลารายงานที่ได้รับอนุมัติ หาก query ในระบบจริงใช้เวลานานเกินที่ตกลงไว้ ให้พิจารณาพักข้อมูลบางส่วนไว้ในพื้นที่จัดเตรียม
- แนวทางการรีเฟรช: กำหนด LastDataUpdate เป็นเวลาที่เรียกใช้การดึงข้อมูล สำหรับการโหลดข้อมูลแบบเพิ่ม ให้เก็บ watermark ตามเวลาที่แหล่งข้อมูลมีการเปลี่ยนแปลง และกำหนดช่วงเวลาย้อนหลังเพื่อให้ครอบคลุมการอัปเดตล่าช้าและรายการกลับรายการ
- ข้อกำหนดเบื้องต้น: ต้องมีสิทธิ์ฐานข้อมูลที่จำเป็น ได้รับอนุมัติให้เข้าถึงระบบจริง เข้าใจการตั้งค่า Universal Journal ของระบบ เข้าถึงแหล่งข้อมูลเอกสารที่พักไว้ การจัดซื้อ การรับสินค้า เวิร์กโฟลว์ การชำระเงิน การหักล้าง และการกลับรายการที่กำหนดไว้ รวมถึงได้รับอนุมัติด้านไลเซนส์หรือการกำกับดูแลของ SAP หากเกี่ยวข้อง
ตัวอย่างคำค้น sql
WITH
params AS (
SELECT
TO_DATE('[Start date]') AS start_date,
TO_DATE('[End date]') AS end_date,
TO_TIMESTAMP('[Evaluation timestamp]') AS evaluation_ts,
TO_TIMESTAMP('[Extraction timestamp]') AS extraction_ts
FROM DUMMY
),
base_invoice AS (
SELECT
b.mandt,
b.bukrs,
b.belnr,
b.gjahr,
b.bldat,
b.budat,
b.cpudt,
b.cputm,
b.usnam,
b.blart,
b.xblnr,
b.stblg,
b.stjah,
a.lifnr,
a.wrbtr,
a.waers,
a.zfbdt,
a.zbd1t,
a.zbd2t,
a.zbd3t,
a.ebeln,
a.ebelp,
a.augbl,
a.augdt,
a.buzei,
v.name1 AS vendor_name,
CASE
WHEN a.zfbdt IS NOT NULL THEN ADD_DAYS(a.zfbdt, COALESCE(a.zbd1t, 0))
ELSE NULL
END AS invoice_due_date
FROM [Schema name].BKPF b
INNER JOIN [Schema name].ACDOCA a
ON a.mandt = b.mandt
AND a.rbukrs = b.bukrs
AND a.belnr = b.belnr
AND a.gjahr = b.gjahr
LEFT JOIN [Schema name].[Vendor master table] v
ON v.[Vendor key field] = a.lifnr
CROSS JOIN params p
WHERE b.bukrs IN ([Company code filter])
AND b.blart IN ([Document type filter])
AND b.cpudt BETWEEN p.start_date AND p.end_date
),
invoice_received AS (
SELECT DISTINCT
CAST(belnr AS NVARCHAR(40)) AS invoice,
'Invoice Received' AS activity_name,
TO_TIMESTAMP(TO_VARCHAR(cpudt, 'YYYY-MM-DD') || ' ' || COALESCE(TO_VARCHAR(cputm), '00:00:00')) AS event_time,
CAST(usnam AS NVARCHAR(80)) AS user_name,
bukrs AS company_code,
vendor_name,
wrbtr AS invoice_amount,
waers AS document_currency,
CAST(ebeln AS NVARCHAR(40)) AS purchase_order_number,
invoice_due_date
FROM base_invoice
),
invoice_parked AS (
SELECT
CAST([Parked invoice key field] AS NVARCHAR(40)) AS invoice,
'Invoice Parked' AS activity_name,
[Parked event timestamp field] AS event_time,
CAST([Parked user field] AS NVARCHAR(80)) AS user_name,
[Parked company code field] AS company_code,
[Parked vendor name field] AS vendor_name,
[Parked amount field] AS invoice_amount,
[Parked currency field] AS document_currency,
CAST([Parked purchase order field] AS NVARCHAR(40)) AS purchase_order_number,
[Parked due date field] AS invoice_due_date
FROM [Schema name].[Parked document source]
WHERE [Parked event date field] BETWEEN (SELECT start_date FROM params) AND (SELECT end_date FROM params)
AND [Parked company code field] IN ([Company code filter])
),
purchase_order_matched AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Purchase Order Matched' AS activity_name,
COALESCE([Purchase order match timestamp field], TO_TIMESTAMP(TO_VARCHAR(i.cpudt, 'YYYY-MM-DD') || ' ' || COALESCE(TO_VARCHAR(i.cputm), '00:00:00'))) AS event_time,
CAST(COALESCE([Purchase order match user field], i.usnam) AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrBtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Purchase order match source] m
ON m.[Invoice document key field] = i.belnr
AND m.[Invoice company code field] = i.bukrs
AND m.[Invoice fiscal year field] = i.gjahr
WHERE i.ebeln IS NOT NULL
),
goods_receipt_matched AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Goods Receipt Matched' AS activity_name,
[Goods receipt match timestamp field] AS event_time,
CAST(COALESCE([Goods receipt match user field], i.usnam) AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Goods receipt match source] g
ON g.[Invoice document key field] = i.belnr
AND g.[Invoice company code field] = i.bukrs
AND g.[Invoice fiscal year field] = i.gjahr
WHERE i.ebeln IS NOT NULL
),
invoice_blocked AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Invoice Blocked For Payment' AS activity_name,
[Payment block timestamp field] AS event_time,
CAST(COALESCE([Payment block user field], i.usnam) AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Payment block source] b
ON b.[Invoice document key field] = i.belnr
AND b.[Invoice company code field] = i.bukrs
AND b.[Invoice fiscal year field] = i.gjahr
WHERE [Payment block value field] IS NOT NULL
),
discrepancy_resolved AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Discrepancy Resolved' AS activity_name,
[Payment block removal timestamp field] AS event_time,
CAST(COALESCE([Payment block removal user field], i.usnam) AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Payment block history source] h
ON h.[Invoice document key field] = i.belnr
AND h.[Invoice company code field] = i.bukrs
AND h.[Invoice fiscal year field] = i.gjahr
WHERE [Previous payment block value field] IS NOT NULL
AND [New payment block value field] IS NULL
),
invoice_routed_for_approval AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Invoice Routed For Approval' AS activity_name,
[Workflow routed timestamp field] AS event_time,
CAST([Workflow initiator field] AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Workflow event source] w
ON w.[Invoice document key field] = i.belnr
AND w.[Invoice company code field] = i.bukrs
AND w.[Invoice fiscal year field] = i.gjahr
WHERE [Workflow event type field] = '[Workflow routed event value]'
),
invoice_approved AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Invoice Approved' AS activity_name,
[Workflow approval timestamp field] AS event_time,
CAST([Workflow approver field] AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Workflow event source] w
ON w.[Invoice document key field] = i.belnr
AND w.[Invoice company code field] = i.bukrs
AND w.[Invoice fiscal year field] = i.gjahr
WHERE [Workflow event type field] = '[Workflow approved event value]'
),
invoice_rejected AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Invoice Rejected' AS activity_name,
[Workflow rejection timestamp field] AS event_time,
CAST([Workflow rejector field] AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Workflow event source] w
ON w.[Invoice document key field] = i.belnr
AND w.[Invoice company code field] = i.bukrs
AND w.[Invoice fiscal year field] = i.gjahr
WHERE [Workflow event type field] = '[Workflow rejected event value]'
),
invoice_posted AS (
SELECT DISTINCT
CAST(belnr AS NVARCHAR(40)) AS invoice,
'Invoice Posted' AS activity_name,
TO_TIMESTAMP(TO_VARCHAR(budat, 'YYYY-MM-DD') || ' 00:00:00') AS event_time,
CAST(usnam AS NVARCHAR(80)) AS user_name,
bukrs AS company_code,
vendor_name,
wrbtr AS invoice_amount,
waers AS document_currency,
CAST(ebeln AS NVARCHAR(40)) AS purchase_order_number,
invoice_due_date
FROM base_invoice
WHERE stblg IS NULL
),
payment_proposal_created AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Payment Proposal Created' AS activity_name,
[Payment proposal timestamp field] AS event_time,
CAST([Payment proposal user field] AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Payment proposal source] p
ON p.[Invoice document key field] = i.belnr
AND p.[Invoice company code field] = i.bukrs
AND p.[Invoice fiscal year field] = i.gjahr
),
payment_executed AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Payment Executed' AS activity_name,
[Payment execution timestamp field] AS event_time,
CAST([Payment execution user field] AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Payment execution source] p
ON p.[Invoice document key field] = i.belnr
AND p.[Invoice company code field] = i.bukrs
AND p.[Invoice fiscal year field] = i.gjahr
),
invoice_due_date_passed AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Invoice Due Date Passed' AS activity_name,
TO_TIMESTAMP(TO_VARCHAR(i.invoice_due_date, 'YYYY-MM-DD') || ' 23:59:59') AS event_time,
CAST(i.usnam AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
WHERE i.invoice_due_date IS NOT NULL
AND TO_TIMESTAMP(TO_VARCHAR(i.invoice_due_date, 'YYYY-MM-DD') || ' 23:59:59') < (SELECT evaluation_ts FROM params)
AND i.augbl IS NULL
),
payment_cleared AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Payment Cleared' AS activity_name,
TO_TIMESTAMP(TO_VARCHAR(i.augdt, 'YYYY-MM-DD') || ' 00:00:00') AS event_time,
CAST(i.usnam AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
WHERE i.augbl IS NOT NULL
AND i.augdt IS NOT NULL
),
invoice_cancelled AS (
SELECT DISTINCT
CAST(belnr AS NVARCHAR(40)) AS invoice,
'Invoice Cancelled' AS activity_name,
TO_TIMESTAMP(TO_VARCHAR([Reversal posting date field], 'YYYY-MM-DD') || ' 00:00:00') AS event_time,
CAST(COALESCE([Reversal user field], usnam) AS NVARCHAR(80)) AS user_name,
bukrs AS company_code,
vendor_name,
wrbtr AS invoice_amount,
waers AS document_currency,
CAST(ebeln AS NVARCHAR(40)) AS purchase_order_number,
invoice_due_date
FROM base_invoice
WHERE stblg IS NOT NULL
),
all_events AS (
SELECT * FROM invoice_received
UNION ALL SELECT * FROM invoice_parked
UNION ALL SELECT * FROM purchase_order_matched
UNION ALL SELECT * FROM goods_receipt_matched
UNION ALL SELECT * FROM invoice_blocked
UNION ALL SELECT * FROM discrepancy_resolved
UNION ALL SELECT * FROM invoice_routed_for_approval
UNION ALL SELECT * FROM invoice_approved
UNION ALL SELECT * FROM invoice_rejected
UNION ALL SELECT * FROM invoice_posted
UNION ALL SELECT * FROM payment_proposal_created
UNION ALL SELECT * FROM payment_executed
UNION ALL SELECT * FROM invoice_due_date_passed
UNION ALL SELECT * FROM payment_cleared
UNION ALL SELECT * FROM invoice_cancelled
)
SELECT
invoice AS "Invoice",
activity_name AS "ActivityName",
event_time AS "EventTime",
'SAP S/4HANA' AS "SourceSystem",
(SELECT extraction_ts FROM params) AS "LastDataUpdate",
user_name AS "UserName",
company_code AS "CompanyCode",
vendor_name AS "VendorName",
invoice_amount AS "InvoiceAmount",
purchase_order_number AS "PurchaseOrderNumber",
invoice_due_date AS "InvoiceDueDate"
FROM all_events
WHERE invoice IS NOT NULL
AND event_time IS NOT NULL
ORDER BY "Invoice", "EventTime", "ActivityName"; ขั้นตอน
- กำหนดข้อกำหนดและออกแบบ: ก่อนเขียนโค้ด ให้ทำงานร่วมกับนักวิเคราะห์ธุรกิจเพื่อยืนยันเงื่อนไขที่ทำให้เกิดกิจกรรมและฟิลด์ข้อมูลของกิจกรรมทั้ง 15 รายการให้ชัดเจน ระบุตาราง SAP ประเภทเอกสาร เช่น 'KR' และ 'RE' รวมถึง Company Code ที่ต้องการรวมไว้ในขอบเขต
- สร้าง ABAP Program: เปิด ABAP Editor ด้วย transaction code SE38 แล้วสร้างโปรแกรมที่เรียกใช้ได้ เช่น Z_PM_AP_INVOICE_EXTRACT ระบุชื่อเรื่องให้สื่อความหมาย และตั้งค่าแอปพลิเคชันเป็น 'Financial Accounting'
- กำหนด Selection Screen: ในโปรแกรม ให้กำหนด selection screen โดยใช้คีย์เวิร์ด PARAMETERS และ SELECT-OPTIONS เพื่อให้ผู้ใช้ระบุช่วงวันที่ดึงข้อมูล (วันที่สร้างใบแจ้งหนี้) Company Code เป้าหมาย (BUKRS) และประเภทเอกสารใบแจ้งหนี้ที่เกี่ยวข้อง (BLART) เพิ่มพารามิเตอร์สำหรับระบุเส้นทางไฟล์ผลลัพธ์บน application server ด้วย
- ประกาศข้อมูล: กำหนดโครงสร้าง internal table ให้ตรงกับรูปแบบบันทึกเหตุการณ์สุดท้าย เช่น TY_EVENT_LOG โดยรวมแอตทริบิวต์ที่จำเป็นและแนะนำทั้งหมด ประกาศ internal table สำหรับเก็บข้อมูลที่เลือกจากตารางต้นทาง SAP เช่น BKPF, BSEG, RBKP, RSEG, CDHDR, CDPOS และ REGUH
- เลือกข้อมูลหลัก: เริ่มตรรกะการดึงข้อมูลด้วยการเลือกชุดใบแจ้งหนี้หลักจาก RBKP (ใบแจ้งหนี้โลจิสติกส์) และ BKPF (ใบแจ้งหนี้การเงิน) ตามเกณฑ์ที่ผู้ใช้กำหนดใน selection screen เก็บคีย์ใบแจ้งหนี้หลักไว้ใน internal table เพื่อใช้ค้นหาข้อมูลต่อไป
- ดึงข้อมูลกิจกรรมตามลำดับ: สำหรับใบแจ้งหนี้แต่ละรายการในชุดหลัก ให้เลือกข้อมูลเพื่อค้นหาเวลาและรายละเอียดของกิจกรรมทางธุรกิจแต่ละรายการ ตัวอย่างเช่น query CDHDR และ CDPOS เพื่อค้นหาการเปลี่ยนแปลงการระงับการชำระเงิน query REGUH และ REGUP เพื่อค้นหาข้อมูลรอบการชำระเงิน และ query BKPF เพื่อค้นหารายละเอียดเอกสารกลับรายการ เพิ่มระเบียนใหม่ลงในตารางบันทึกเหตุการณ์สุดท้ายสำหรับแต่ละกิจกรรมที่พบ
- กำหนดตรรกะสำหรับเหตุการณ์ที่คำนวณ: เขียนตรรกะ ABAP สำหรับกิจกรรมที่ไม่ได้จัดเก็บไว้ในฟิลด์ตารางโดยตรง สำหรับเหตุการณ์ 'Invoice Due Date Passed' ให้ใช้วันครบกำหนดของใบแจ้งหนี้ (BSEG-ZFBDT + เงื่อนไขการชำระเงิน) และวันที่หักล้าง (BSEG-AUGDT) หากวันที่หักล้างช้ากว่าวันครบกำหนด ให้สร้างระเบียนเหตุการณ์ใหม่โดยกำหนดเวลาเป็นวันครบกำหนด
- แปลงและเพิ่มข้อมูล: เมื่อรวบรวมข้อมูลของแต่ละกิจกรรม ให้ใส่ค่าแอตทริบิวต์ที่จำเป็นทั้งหมด โดยค้นหาชื่อผู้ขายจาก LFA1 รวมวันที่และเวลาเป็นสตริงเวลาเดียว (CONCATENATE...INTO...) และกำหนดค่า SourceSystem
- สร้างไฟล์ผลลัพธ์: เมื่อประมวลผลใบแจ้งหนี้และกิจกรรมที่เกี่ยวข้องทั้งหมดแล้ว ให้ใช้คำสั่ง OPEN DATASET, LOOP AT ... TRANSFER และ CLOSE DATASET เพื่อเขียนข้อมูลไปยังไฟล์ตามเส้นทางบน application server ที่ระบุใน selection screen
- ดาวน์โหลดและเตรียมอัปโหลด: ใช้ transaction code CG3Y เพื่อดาวน์โหลดไฟล์ที่สร้างจาก application server ไปยังเครื่องของคุณ บันทึกไฟล์เป็น CSV ที่เข้ารหัสแบบ UTF-8 ตรวจสอบว่าชื่อหัวคอลัมน์ตรงกับแอตทริบิวต์ที่กำหนด เช่น Invoice, ActivityName และ EventTime ก่อนอัปโหลดไปยังเครื่องมือ process mining.
การกำหนดค่า
- ช่วงวันที่: กำหนดตัวเลือก P_CPUDT สำหรับวันที่สร้างใบแจ้งหนี้ (BKPF-CPUDT หรือ RBKP-CPUDT) แนะนำให้เริ่มวิเคราะห์ด้วยข้อมูลย้อนหลัง 6-12 เดือน
- Company Code (P_BUKRS): พารามิเตอร์ SELECT-OPTIONS ที่จำเป็นสำหรับกรอง Company Code ที่ต้องการ ไม่แนะนำให้ประมวลผลทุก Company Code พร้อมกัน เว้นแต่จำเป็นอย่างยิ่ง
- ประเภทเอกสารใบแจ้งหนี้ (P_BLART): พารามิเตอร์ SELECT-OPTIONS สำหรับกรองประเภทเอกสารใบแจ้งหนี้ที่เกี่ยวข้อง ประเภทที่ใช้บ่อย ได้แก่ 'KR' (ใบแจ้งหนี้ผู้ขาย), 'KG' (ใบลดหนี้ผู้ขาย), 'RE' (การตรวจสอบใบแจ้งหนี้โลจิสติกส์)
- โหมดการเรียกใช้: หากมีข้อมูลจำนวนมาก ควรเรียกใช้โปรแกรมเป็น background job (SM36/SM37) เพื่อหลีกเลี่ยง timeout ในโหมด foreground dialog และตั้งเวลาให้ทำงานนอกช่วงเวลาที่มีการใช้งานสูง
- พาธไฟล์ผลลัพธ์: พารามิเตอร์สำหรับระบุพาธและชื่อไฟล์บน SAP application server เช่น ในไดเรกทอรี /tmp/ ไฟล์จะถูกเขียนไว้ที่นี่ก่อนดาวน์โหลด
- ข้อกำหนดเบื้องต้น: ผู้เรียกใช้ report ต้องมีสิทธิ์อ่านตาราง FI, CO และ MM (BKPF, BSEG, RBKP, RSEG, LFA1) ตารางเอกสารการเปลี่ยนแปลง (CDHDR, CDPOS) และตารางเวิร์กโฟลว์ นอกจากนี้ ต้องมีสิทธิ์ผ่านออบเจ็กต์ S_DATASET เพื่อเขียนไฟล์ไปยัง application server
ตัวอย่างคำค้น abap
*&---------------------------------------------------------------------*
*& Report Z_PM_AP_INVOICE_EXTRACT
*&---------------------------------------------------------------------*
*& This report extracts Accounts Payable invoice lifecycle events for
*& process mining analysis.
*&---------------------------------------------------------------------*
REPORT z_pm_ap_invoice_extract.
*&---------------------------------------------------------------------*
*& Data Structures
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
invoice TYPE belnr_d,
activityname TYPE string,
eventtime TYPE string,
sourcesystem TYPE logsys,
lastdataupdate TYPE string,
username TYPE uname,
companycode TYPE bukrs,
vendorname TYPE name1_gp,
invoiceamount TYPE wrbtr,
purchaseordernumber TYPE ebeln,
invoiceduedate TYPE d,
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
DATA: gv_system_id TYPE logsys.
DATA: gv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs OBLIGATORY,
s_cpudt FOR bkpf-cpudt OBLIGATORY DEFAULT sy-datum,
s_blart FOR bkpf-blart.
PARAMETERS: p_fpath TYPE string OBLIGATORY DEFAULT '/tmp/ap_extract.csv'.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
" Get System ID and Update Timestamp
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = gv_system_id
EXCEPTIONS
own_logical_system_not_defined = 1
OTHERS = 2.
CONCATENATE sy-datum sy-uzeit INTO gv_last_update.
" Internal tables for SAP data
DATA: lt_bkpf TYPE TABLE OF bkpf,
lt_rbkp TYPE TABLE OF rbkp.
" Select base documents
SELECT * FROM bkpf INTO TABLE lt_bkpf
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND blart IN s_blart
AND ( blart = 'KR' OR blart = 'KG' ). " Example FI Invoice Types
SELECT * FROM rbkp INTO TABLE lt_rbkp
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND blart IN s_blart
AND blart = 'RE'. " Example MM Invoice Type
" --- Process each invoice document ---
LOOP AT lt_bkpf ASSIGNING FIELD-SYMBOL(<fs_bkpf>).
PERFORM process_invoice USING <fs_bkpf>.
ENDLOOP.
LOOP AT lt_rbkp ASSIGNING FIELD-SYMBOL(<fs_rbkp>).
PERFORM process_mm_invoice USING <fs_rbkp>.
ENDLOOP.
" Write output to file
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*& Form PROCESS_INVOICE (Handles FI Invoices)
*&---------------------------------------------------------------------*
FORM process_invoice USING iv_bkpf TYPE bkpf.
DATA: ls_bseg TYPE bseg,
ls_lfa1 TYPE lfa1,
ld_due_date TYPE d.
DATA: ls_event TYPE ty_event_log.
" Get Vendor and other details from first line item
SELECT SINGLE * FROM bseg INTO ls_bseg
WHERE bukrs = iv_bkpf-bukrs
AND belnr = iv_bkpf-belnr
AND gjahr = iv_bkpf-gjahr
AND koart = 'K'.
IF sy-subrc = 0.
SELECT SINGLE name1 FROM lfa1 INTO ls_lfa1-name1 WHERE lifnr = ls_bseg-lifnr.
CALL FUNCTION 'DETERMINE_DUE_DATE'
EXPORTING
i_zfbdt = ls_bseg-zfbdt
i_zbd1t = ls_bseg-zbd1t
i_zbd2t = ls_bseg-zbd2t
i_zbd3t = ls_bseg-zbd3t
i_zbd1p = ls_bseg-zbd1p
i_zbd2p = ls_bseg-zbd2p
i_zterm = ls_bseg-zterm
IMPORTING
e_faedt = ld_due_date.
ENDIF.
" Helper function to populate common fields
MACRO set_common_fields.
ls_event-invoice = iv_bkpf-belnr.
ls_event-sourcesystem = gv_system_id.
ls_event-lastdataupdate = gv_last_update.
ls_event-companycode = iv_bkpf-bukrs.
ls_event-vendorname = ls_lfa1-name1.
ls_event-invoiceduedate = ld_due_date.
SELECT SINGLE wrbtr FROM bseg INTO ls_event-invoiceamount WHERE belnr = iv_bkpf-belnr AND gjahr = iv_bkpf-gjahr AND koart = 'K'.
ENDMACRO.
" 1. Invoice Received
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Received'.
CONCATENATE iv_bkpf-cpudt iv_bkpf-cputm INTO ls_event-eventtime.
ls_event-username = iv_bkpf-usnam.
APPEND ls_event TO gt_event_log.
" 2. Invoice Parked (if document was created as parked)
IF iv_bkpf-bstat = 'V'.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Parked'.
CONCATENATE iv_bkpf-cpudt iv_bkpf-cputm INTO ls_event-eventtime.
ls_event-username = iv_bkpf-usnam.
APPEND ls_event TO gt_event_log.
ENDIF.
" 10. Invoice Posted (For non-parked, same as received. For parked, this needs CDHDR/CDPOS logic not shown for brevity)
IF iv_bkpf-bstat <> 'V'.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Posted'.
CONCATENATE iv_bkpf-budat iv_bkpf-cputm INTO ls_event-eventtime. " Using posting date
ls_event-username = iv_bkpf-usnam.
APPEND ls_event TO gt_event_log.
ENDIF.
" 5. & 7. Invoice Blocked / Discrepancy Resolved from Change Docs
DATA: lt_cdhdr TYPE TABLE OF cdhdr, lt_cdpos TYPE TABLE OF cdpos.
DATA(ld_objectkey) = |{ iv_bkpf-bukrs }{ iv_bkpf-belnr }{ iv_bkpf-gjahr }|.
SELECT * FROM cdhdr INTO TABLE lt_cdhdr WHERE objectclas = 'BELEG' AND objectid = ld_objectkey.
IF sy-subrc = 0.
SELECT * FROM cdpos INTO TABLE lt_cdpos FOR ALL ENTRIES IN lt_cdhdr
WHERE changenr = lt_cdhdr-changenr AND tabname = 'BSEG' AND fname = 'ZLSPR'.
LOOP AT lt_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>).
READ TABLE lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>) WITH KEY changenr = <fs_cdpos>-changenr.
IF sy-subrc = 0.
CLEAR ls_event.
set_common_fields.
IF <fs_cdpos>-value_new IS NOT INITIAL AND <fs_cdpos>-value_old IS INITIAL.
ls_event-activityname = 'Invoice Blocked For Payment'.
ELSEIF <fs_cdpos>-value_new IS INITIAL AND <fs_cdpos>-value_old IS NOT INITIAL.
ls_event-activityname = 'Discrepancy Resolved'.
ELSE.
CONTINUE.
ENDIF.
CONCATENATE <fs_cdhdr>-udate <fs_cdhdr>-utime INTO ls_event-eventtime.
ls_event-username = <fs_cdhdr>-username.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDIF.
" 6. 8. 9. Workflow Events (Routed, Approved, Rejected) - Simplified Example
" This requires knowledge of specific workflow templates. Placeholder logic:
" SELECT ... FROM SWW_WI2OBJ ... WHERE INSTID = [Invoice Object]
" SELECT ... FROM SWWWIHEAD ... to get status and times
" 11. & 12. & 14. Payment Proposal, Executed, Cleared
IF ls_bseg-augbl IS NOT INITIAL.
DATA: ls_regup TYPE regup.
SELECT SINGLE * FROM regup INTO ls_regup WHERE vblnr = ls_bseg-belnr.
IF sy-subrc = 0.
DATA(ld_rundate) = ls_regup-laufd.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Payment Proposal Created'.
CONCATENATE ld_rundate '000000' INTO ls_event-eventtime.
APPEND ls_event TO gt_event_log.
ENDIF.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Payment Executed'.
CONCATENATE ls_bseg-augdt '120000' INTO ls_event-eventtime. " Using clearing date as proxy
APPEND ls_event TO gt_event_log.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Payment Cleared'.
CONCATENATE ls_bseg-augdt '120001' INTO ls_event-eventtime.
APPEND ls_event TO gt_event_log.
ENDIF.
" 13. Invoice Due Date Passed (Calculated)
IF ls_bseg-augdt IS NOT INITIAL AND ld_due_date IS NOT INITIAL.
IF ls_bseg-augdt > ld_due_date.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Due Date Passed'.
CONCATENATE ld_due_date '235959' INTO ls_event-eventtime.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDIF.
" 15. Invoice Cancelled
IF iv_bkpf-stblg IS NOT INITIAL.
DATA: ls_rev_bkpf TYPE bkpf.
SELECT SINGLE * FROM bkpf INTO ls_rev_bkpf WHERE belnr = iv_bkpf-stblg.
IF sy-subrc = 0.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Cancelled'.
CONCATENATE ls_rev_bkpf-cpudt ls_rev_bkpf-cputm INTO ls_event-eventtime.
ls_event-username = ls_rev_bkpf-usnam.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PROCESS_MM_INVOICE (Handles MM/Logistics Invoices)
*&---------------------------------------------------------------------*
FORM process_mm_invoice USING iv_rbkp TYPE rbkp.
" This form would be similar to PROCESS_INVOICE, but starts with RBKP.
" It needs to find the corresponding FI document in BKPF via AWKEY.
" The logic for PO/GR Matched would be included here.
" For demonstration, creating placeholder events for MM-specific activities.
DATA: ls_event TYPE ty_event_log.
ls_event-invoice = iv_rbkp-belnr.
ls_event-sourcesystem = gv_system_id.
ls_event-lastdataupdate = gv_last_update.
ls_event-companycode = iv_rbkp-bukrs.
" 1. Invoice Received (MM)
ls_event-activityname = 'Invoice Received'.
CONCATENATE iv_rbkp-cpudt iv_rbkp-cputm INTO ls_event-eventtime.
ls_event-username = iv_rbkp-usnam.
APPEND ls_event TO gt_event_log.
" 3. Purchase Order Matched (Implicit)
ls_event-activityname = 'Purchase Order Matched'.
CONCATENATE iv_rbkp-cpudt iv_rbkp-cputm INTO ls_event-eventtime.
ls_event-username = iv_rbkp-usnam.
APPEND ls_event TO gt_event_log.
" 4. Goods Receipt Matched (Implicit)
ls_event-activityname = 'Goods Receipt Matched'.
CONCATENATE iv_rbkp-cpudt iv_rbkp-cputm INTO ls_event-eventtime.
ls_event-username = iv_rbkp-usnam.
APPEND ls_event TO gt_event_log.
" NOTE: The rest of the events (Block, Pay, etc.) would be found by linking
" RBKP to BKPF and then reusing the logic from PROCESS_INVOICE.
" Link: BKPF-AWKEY = CONCATENATE( RBKP-BELNR, RBKP-GJAHR ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form WRITE_OUTPUT_FILE
*&---------------------------------------------------------------------*
FORM write_output_file.
DATA: lv_string TYPE string.
OPEN DATASET p_fpath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
RETURN.
ENDIF.
" Write Header
lv_string = 'Invoice,ActivityName,EventTime,SourceSystem,LastDataUpdate,UserName,CompanyCode,VendorName,InvoiceAmount,PurchaseOrderNumber,InvoiceDueDate'.
TRANSFER lv_string TO p_fpath.
" Write Data
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_event>).
" Create a comma-separated string, handling potential commas in data
CONCATENATE <fs_event>-invoice
<fs_event>-activityname
<fs_event>-eventtime
<fs_event>-sourcesystem
<fs_event>-lastdataupdate
<fs_event>-username
<fs_event>-companycode
<fs_event>-vendorname
<fs_event>-invoiceamount
<fs_event>-purchaseordernumber
<fs_event>-invoiceduedate
INTO lv_string SEPARATED BY ','.
TRANSFER lv_string TO p_fpath.
ENDLOOP.
CLOSE DATASET p_fpath.
WRITE: / 'Extraction complete. File written to:', p_fpath.
ENDFORM. พร้อมเริ่มต้นหรือยัง?
ใช้เทมเพลตนี้เพื่อเริ่มโครงการ process mining และเพิ่มประสิทธิภาพการปฏิบัติงานด้านเจ้าหนี้การค้า เริ่มปรับปรุงกระบวนการให้คล่องตัวและมีประสิทธิภาพยิ่งขึ้นได้วันนี้.
ลดค่าธรรมเนียมชำระล่าช้า ด้วยการปรับปรุงการประมวลผลใบแจ้งหนี้เจ้าหนี้
ลดต้นทุนการประมวลผลได้ 60% และจัดการรายการชำระเงินซ้ำได้ง่ายขึ้น.
ไม่ต้องใช้บัตรเครดิต เริ่มต้นใช้งานได้ภายในไม่กี่นาที.