เทมเพลตข้อมูลสำหรับกระบวนการจัดซื้อจนถึงชำระเงินและการประมวลผลใบแจ้งหนี้
เทมเพลตข้อมูลสำหรับกระบวนการจัดซื้อจนถึงชำระเงินและการประมวลผลใบแจ้งหนี้
- แอตทริบิวต์ที่แนะนำให้รวบรวม
- กิจกรรมสำคัญที่ควรติดตาม
- แนวทางดึงข้อมูลจาก SAP S/4HANA
แอตทริบิวต์สำหรับกระบวนการจัดซื้อจนถึงชำระเงินและการประมวลผลใบแจ้งหนี้
| ชื่อ | คำอธิบาย | ||
|---|---|---|---|
| หมายเลขใบแจ้งหนี้ InvoiceNumber | รหัสเฉพาะของเอกสารใบแจ้งหนี้ผู้ขาย ซึ่งใช้เป็นรหัสกรณีหลักของกระบวนการ. | ||
| คำอธิบาย หมายเลขใบแจ้งหนี้เป็นรหัสเฉพาะที่กำหนดให้ใบแจ้งหนี้ผู้ขายแต่ละรายการใน SAP S/4HANA โดยเชื่อมกิจกรรมที่เกี่ยวข้องทั้งหมด เช่น การสร้าง การพักรายการ การอนุมัติ และการชำระเงิน ให้เป็นกระบวนการเดียวกัน. ใน process mining แอตทริบิวต์นี้เป็นข้อมูลหลักสำหรับติดตามวงจรของใบแจ้งหนี้แต่ละรายการตั้งแต่ต้นจนจบ ช่วยสร้างลำดับกระบวนการทั้งหมด ตั้งแต่รับใบแจ้งหนี้จนถึงชำระเงิน พร้อมวิเคราะห์ระยะเวลาดำเนินการ คอขวด และความแตกต่างของกระบวนการในระดับใบแจ้งหนี้แต่ละรายการ. เหตุผลที่สำคัญ นี่คือคีย์สำคัญที่ใช้เชื่อมเหตุการณ์ที่เกี่ยวข้องทั้งหมด และติดตามวงจรของใบแจ้งหนี้ในระบบได้ครบถ้วน. แหล่งข้อมูล หมายเลขเอกสารบัญชี อยู่ในตาราง BKPF ฟิลด์ BELNR. ตัวอย่าง 190000000119000000451900000132 | |||
| ชื่อกิจกรรม ActivityName | ชื่อกิจกรรมทางธุรกิจหรือเหตุการณ์ที่เกิดขึ้นกับใบแจ้งหนี้ ณ เวลาหนึ่ง. | ||
| คำอธิบาย ชื่อกิจกรรมใช้ระบุขั้นตอนหรือการเปลี่ยนสถานะในวงจรการประมวลผลใบแจ้งหนี้ ตัวอย่างเช่น 'สร้างเอกสารใบแจ้งหนี้' 'ส่งใบแจ้งหนี้เพื่ออนุมัติ' 'ตั้งค่าบล็อกการชำระเงิน' และ 'ดำเนินการชำระเงินแล้ว'. แอตทริบิวต์นี้จำเป็นต่อการสร้างแผนผังกระบวนการ ซึ่งแสดงลำดับกิจกรรมให้เห็นได้ชัดเจน การวิเคราะห์ลำดับ ความถี่ และระยะเวลาระหว่างกิจกรรมช่วยระบุคอขวด งานที่ต้องทำซ้ำ และความแตกต่างของกระบวนการที่ไม่เป็นไปตามข้อกำหนด นอกจากนี้ยังเป็นข้อมูลหลักสำหรับการวิเคราะห์ process mining. เหตุผลที่สำคัญ ใช้ระบุขั้นตอนในกระบวนการ เพื่อแสดงแผนผังกระบวนการและวิเคราะห์ลำดับงานกับความแตกต่างของกระบวนการ. แหล่งข้อมูล ได้จากการรวมรหัสธุรกรรม SAP (SY-TCODE) สถานะของออบเจ็กต์เอกสารการเปลี่ยนแปลง (CDHDR/CDPOS) และค่าเฉพาะของฟิลด์ที่บ่งชี้การเปลี่ยนสถานะ. ตัวอย่าง พักรายการใบแจ้งหนี้อนุมัติใบแจ้งหนี้แล้วดำเนินการชำระเงินแล้ว | |||
| เวลาเกิดเหตุการณ์ EventTime | วันที่และเวลาที่กิจกรรมเกิดขึ้นอย่างแม่นยำ. | ||
| คำอธิบาย เวลาเกิดเหตุการณ์คือเวลาประทับที่บันทึกเวลาที่กิจกรรมหนึ่งเกิดขึ้นอย่างแม่นยำ ข้อมูลนี้จำเป็นต่อการคำนวณระยะเวลา รอบเวลาดำเนินการ และเวลารอระหว่างขั้นตอนต่างๆ ในกระบวนการ. การวิเคราะห์ process mining ใช้เวลาประทับที่แม่นยำเพื่อวัด KPI ด้านประสิทธิภาพ เช่น 'ระยะเวลาดำเนินการเฉลี่ยของใบแจ้งหนี้' และ 'ระยะเวลาการอนุมัติใบแจ้งหนี้' เมื่อวิเคราะห์เวลาที่ผ่านไประหว่างกิจกรรม องค์กรจะระบุจุดที่ใบแจ้งหนี้ล่าช้าและหาโอกาสเร่งกระบวนการได้. เหตุผลที่สำคัญ เวลาประทับนี้เป็นพื้นฐานของการวิเคราะห์ตามเวลา ทั้งการติดตามประสิทธิภาพ การระบุคอขวด และการติดตาม SLA. แหล่งข้อมูล โดยทั่วไปได้จากตารางเอกสารการเปลี่ยนแปลง CDHDR (ส่วนหัว) และ CDPOS (รายการ) โดยใช้ฟิลด์ UDATE และ UTIME สำหรับบางเหตุการณ์ อาจใช้วันที่สร้างหรือวันที่ป้อนข้อมูลจากฟิลด์ในตาราง เช่น BKPF (CPUDT, CPUTM). ตัวอย่าง 2023-04-15T10:30:00Z2023-04-18T14:05:21Z2023-05-02T09:00:00Z | |||
| ชื่อผู้ใช้ UserName | รหัสผู้ใช้ SAP ของบุคคลหรือระบบที่ทำกิจกรรม. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุผู้ใช้ที่ทำธุรกรรมหรือสร้างเอกสาร อาจเป็นรหัสผู้ใช้ของบุคคลหรือรหัสระบบสำหรับงานประมวลผลแบบกลุ่มอัตโนมัติ. การวิเคราะห์ตามผู้ใช้ช่วยให้เข้าใจการกระจายงาน ระบุความต้องการในการฝึกอบรม และตรวจจับพฤติกรรมการใช้งานที่ผิดปกติ ตัวอย่างเช่น ช่วยระบุผู้ใช้ที่จัดการกรณียกเว้นบ่อย หรือใบแจ้งหนี้ที่ระบบประมวลผลอัตโนมัติ เช่น ผู้ใช้ 'BATCHUSER' ซึ่งเป็นข้อมูลสำคัญในการคำนวณ KPI 'อัตราการประมวลผลใบแจ้งหนี้อัตโนมัติ'. เหตุผลที่สำคัญ ระบุว่ากิจกรรมในกระบวนการเป็นของผู้ใช้หรือบัญชีระบบใด จึงวิเคราะห์ปริมาณงาน เปรียบเทียบประสิทธิภาพ และตรวจจับการทำงานอัตโนมัติได้. แหล่งข้อมูล ได้จากฟิลด์ เช่น BKPF-USNAM (ผู้ป้อนข้อมูล) หรือ CDHDR-USERNAME (ผู้แก้ไข). ตัวอย่าง SMITHJMUELLERTWF-BATCH | |||
| ใบสั่งซื้อ PurchasingDocument | หมายเลขใบสั่งซื้อที่เกี่ยวข้องกับใบแจ้งหนี้. | ||
| คำอธิบาย หมายเลขเอกสารจัดซื้อเชื่อมใบแจ้งหนี้ผู้ขายกับใบสั่งซื้อ (PO) ต้นฉบับ ซึ่งเป็นส่วนสำคัญของกระบวนการตรวจสอบสามทางที่ใช้เทียบใบแจ้งหนี้กับใบสั่งซื้อและใบรับสินค้า. การวิเคราะห์ตามแอตทริบิวต์นี้ช่วยให้เข้าใจปัญหาที่เกี่ยวข้องกับใบแจ้งหนี้ที่มีหรือไม่มีใบสั่งซื้อรองรับ และใช้ตรวจสอบความคลาดเคลื่อนในการจับคู่ รวมถึงประสิทธิภาพของขั้นตอนจัดซื้อในกระบวนการได้. เหตุผลที่สำคัญ เชื่อมใบแจ้งหนี้กับกระบวนการจัดซื้อ ซึ่งจำเป็นต่อการวิเคราะห์ความคลาดเคลื่อนในการจับคู่และการปฏิบัติตามข้อกำหนดของ PO. แหล่งข้อมูล โดยทั่วไปพบข้อมูลนี้ในตารางรายการเอกสาร BSEG ฟิลด์ EBELN (หมายเลขเอกสารจัดซื้อ). ตัวอย่าง 450000123445000056784500009012 | |||
| ประเภทเอกสาร DocumentType | รหัสที่ใช้จำแนกเอกสารบัญชีประเภทต่างๆ เช่น ใบแจ้งหนี้ผู้ขายหรือใบลดหนี้. | ||
| คำอธิบาย SAP ใช้ประเภทเอกสารเพื่อแยกธุรกรรมทางธุรกิจแต่ละประเภท ตัวอย่างเช่น 'KR' มักหมายถึงใบแจ้งหนี้ผู้ขายทั่วไป ส่วน 'KG' อาจหมายถึงใบลดหนี้จากผู้ขาย. การวิเคราะห์ตามประเภทเอกสารช่วยแบ่งกระบวนการเพื่อดูว่าธุรกรรมแต่ละประเภทได้รับการจัดการอย่างไร ตัวอย่างเช่น กระบวนการของใบลดหนี้อาจต่างจากใบแจ้งหนี้ทั่วไปมาก การแบ่งกลุ่มเช่นนี้ช่วยให้ได้ข้อมูลเชิงลึกเกี่ยวกับกระบวนการที่แม่นยำและตรงประเด็นขึ้น. เหตุผลที่สำคัญ ช่วยแยกธุรกรรมทางการเงินประเภทต่างๆ เช่น ใบแจ้งหนี้ทั่วไปและใบลดหนี้ ซึ่งมักมีขั้นตอนการทำงานต่างกัน. แหล่งข้อมูล อยู่ในตารางส่วนหัวเอกสาร BKPF ฟิลด์ BLART. ตัวอย่าง KRREKG | |||
| ยอดเงินในใบแจ้งหนี้ AmountInCompanyCodeCurrency | ยอดรวมก่อนหักรายการของใบแจ้งหนี้ในสกุลเงินท้องถิ่นของรหัสบริษัท. | ||
| คำอธิบาย แอตทริบิวต์นี้แสดงมูลค่ารวมของใบแจ้งหนี้ เป็นตัวชี้วัดสำคัญที่ช่วยให้เข้าใจผลกระทบทางการเงินและขนาดของงานประมวลผลใบแจ้งหนี้. การวิเคราะห์ยอดเงินช่วยจัดลำดับความสำคัญให้ใบแจ้งหนี้มูลค่าสูงได้รับการประมวลผลเร็วขึ้น ระบุแนวโน้มการใช้จ่าย และเชื่อมโยงปัญหาในกระบวนการกับมูลค่าทางการเงิน ตัวอย่างเช่น ใช้ตรวจสอบว่าใบแจ้งหนี้มูลค่าสูงมีโอกาสถูกบล็อกหรือใช้เวลาอนุมัตินานกว่าหรือไม่. เหตุผลที่สำคัญ ให้ข้อมูลด้านการเงินประกอบการวิเคราะห์ เช่น ตรวจสอบว่าใบแจ้งหนี้มูลค่าสูงได้รับการประมวลผลต่างจากรายการอื่นหรือไม่. แหล่งข้อมูล โดยทั่วไปค่านี้ได้จากผลรวมของรายการที่เกี่ยวข้องในตาราง BSEG ฟิลด์ WRBTR (ยอดเงินในสกุลเงินท้องถิ่น). ตัวอย่าง 1500.75125000.00850.20 | |||
| รหัสบริษัท CompanyCode | หน่วยงานที่เป็นตัวแทนของบริษัทซึ่งมีสถานะเป็นนิติบุคคลอิสระและจัดทำงบการเงิน. | ||
| คำอธิบาย รหัสบริษัทเป็นหน่วยงานพื้นฐานใน SAP Finance ใบแจ้งหนี้แต่ละรายการจะกำหนดให้กับรหัสบริษัทหนึ่ง ซึ่งระบุนิติบุคคลที่รับผิดชอบธุรกรรมนั้น. ใน process mining การกรองหรือเปรียบเทียบตามรหัสบริษัทจำเป็นต่อการวิเคราะห์ประสิทธิภาพกระบวนการระหว่างหน่วยธุรกิจ นิติบุคคล หรือประเทศต่างๆ ช่วยระบุความแตกต่างด้านประสิทธิภาพ การปฏิบัติตามข้อกำหนด และระดับการทำงานอัตโนมัติในแต่ละภูมิภาค เพื่อกำหนดแนวทางปรับปรุงให้ตรงจุด. เหตุผลที่สำคัญ ช่วยแบ่งกลุ่มและเปรียบเทียบประสิทธิภาพการประมวลผลใบแจ้งหนี้ระหว่างนิติบุคคลหรือพื้นที่ต่างๆ ภายในองค์กร. แหล่งข้อมูล เป็นฟิลด์มาตรฐานในตารางส่วนหัวเอกสาร BKPF ฟิลด์ BUKRS. ตัวอย่าง 1000US01DE01 | |||
| วันครบกำหนดชำระเงิน PaymentDueDate | วันที่ต้องชำระใบแจ้งหนี้เพื่อไม่ให้เกินกำหนด. | ||
| คำอธิบาย วันครบกำหนดชำระเงินคือวันที่ต้องชำระเงินให้ผู้ขาย โดยคำนวณจากวันที่ในใบแจ้งหนี้และเงื่อนไขการชำระเงินที่ตกลงกันไว้ ซึ่งเป็นกำหนดเวลาสำคัญของกระบวนการ. แอตทริบิวต์นี้จำเป็นต่อ KPI 'อัตราการชำระเงินตรงเวลา' และแดชบอร์ด 'ประสิทธิภาพการชำระเงินให้ผู้ขาย' เมื่อเปรียบเทียบวันที่ชำระเงินจริงกับวันครบกำหนด บริษัทจะวัดความสามารถในการชำระเงินตามกำหนด ซึ่งส่งผลต่อความสัมพันธ์กับผู้ขายและความน่าเชื่อถือทางการเงิน. เหตุผลที่สำคัญ เป็นเกณฑ์หลักในการวัดผลการชำระเงินตรงเวลา ซึ่งสำคัญต่อการรักษาความสัมพันธ์ที่ดีกับผู้ขายและหลีกเลี่ยงค่าธรรมเนียมชำระล่าช้า. แหล่งข้อมูล มักดูวันที่นี้ได้โดยตรงจากรายการผู้ขายในตาราง BSEG ฟิลด์ ZFBDT (วันที่ฐานสำหรับคำนวณวันครบกำหนด) โดยคำนวณวันครบกำหนดสุทธิจากวันที่ฐานและเงื่อนไขการชำระเงิน. ตัวอย่าง 2023-05-302023-06-152023-07-01 | |||
| หมายเลขผู้ขาย VendorNumber | รหัสเฉพาะของผู้ขายที่ส่งใบแจ้งหนี้. | ||
| คำอธิบาย หมายเลขผู้ขายใช้ระบุผู้จัดหาหรือเจ้าหนี้ที่เกี่ยวข้องกับใบแจ้งหนี้ และเชื่อมธุรกรรมใบแจ้งหนี้กับข้อมูลหลักของผู้ขาย. แอตทริบิวต์นี้สำคัญต่อการวิเคราะห์ผู้ขาย เช่น การประเมิน 'ประสิทธิภาพการชำระเงินให้ผู้ขาย' หรือระบุผู้ขายที่ส่งใบแจ้งหนี้มีปัญหาบ่อยจนเกิดกรณียกเว้นหรือบล็อกการชำระเงิน ข้อมูลนี้ช่วยบริหารความสัมพันธ์กับผู้ขายและประเมินความน่าเชื่อถือของผู้จัดหา. เหตุผลที่สำคัญ ช่วยวิเคราะห์ประสิทธิภาพกระบวนการแยกตามผู้ขาย เพื่อระบุรูปแบบ จัดการความสัมพันธ์ และประเมินปัญหาที่เกี่ยวข้องกับผู้จัดหา. แหล่งข้อมูล โดยทั่วไปพบในตารางรายการเอกสารบัญชี BSEG ฟิลด์ LIFNR. ตัวอย่าง 100345700012V9832 | |||
| เหตุผลที่บล็อกการชำระเงิน PaymentBlockReason | รหัสที่ระบุสาเหตุที่บล็อกการชำระเงินใบแจ้งหนี้. | ||
| คำอธิบาย เมื่อบล็อกการชำระเงินใบแจ้งหนี้ แอตทริบิวต์นี้จะระบุสาเหตุ เช่น 'จำนวนไม่ตรงกัน' หรือ 'ราคาไม่ตรงกัน' โดยกำหนดเหตุผลเหล่านี้ไว้ใน SAP เพื่อให้จัดการกรณียกเว้นได้เป็นมาตรฐาน. แอตทริบิวต์นี้จำเป็นต่อแดชบอร์ด 'จำนวนครั้งและระยะเวลาที่บล็อกการชำระเงิน' การวิเคราะห์ความถี่ของเหตุผลแต่ละประเภทช่วยระบุสาเหตุที่ทำให้การชำระเงินล่าช้า เช่น ปัญหากับผู้ขาย วัสดุ หรือกระบวนการภายใน และช่วยกำหนดแนวทางแก้ไขให้ตรงจุด. เหตุผลที่สำคัญ ระบุสาเหตุที่แท้จริงของการบล็อกการชำระเงิน ช่วยวิเคราะห์และลดความล่าช้า พร้อมเพิ่มโอกาสให้ดำเนินการถูกต้องตั้งแต่ครั้งแรก. แหล่งข้อมูล อยู่ในรายการผู้ขายของตาราง BSEG ฟิลด์ ZLSPR (คีย์บล็อกการชำระเงิน). ตัวอย่าง RIA | |||
| เงื่อนไขการชำระเงิน PaymentTerms | รหัสที่กำหนดเงื่อนไขการชำระเงินที่ตกลงกับผู้ขาย เช่น วันครบกำหนดและช่วงเวลารับส่วนลด. | ||
| คำอธิบาย เงื่อนไขการชำระเงินกำหนดหลักเกณฑ์การชำระใบแจ้งหนี้ รวมถึงส่วนลดที่อาจได้รับเมื่อชำระก่อนกำหนด ตัวอย่างเช่น 'Z030' อาจหมายถึง 'ชำระภายใน 30 วันโดยไม่หักส่วนลด'. แอตทริบิวต์นี้จำเป็นต่อการวางแผนการเงินและบริหารเงินทุนหมุนเวียนให้มีประสิทธิภาพ ใน process mining ใช้คำนวณ 'วันครบกำหนดชำระเงิน' และตรวจสอบสิทธิ์รับส่วนลดเมื่อชำระก่อนกำหนด จึงช่วยติดตาม KPI 'อัตราการใช้สิทธิ์รับส่วนลดเมื่อชำระก่อนกำหนด' ได้โดยตรง. เหตุผลที่สำคัญ กำหนดหลักเกณฑ์ของวันครบกำหนดและส่วนลด ซึ่งส่งผลโดยตรงต่อ KPI การชำระเงินตรงเวลาและการบริหารเงินทุนหมุนเวียน. แหล่งข้อมูล อยู่ในรายการผู้ขายของตาราง BSEG ฟิลด์ ZTERM (คีย์เงื่อนไขการชำระเงิน). ตัวอย่าง 0001Z030NT60 | |||
| จำนวนรอบการอนุมัติ ApprovalCycleCount | จำนวนครั้งที่ส่งใบแจ้งหนี้เพื่อขออนุมัติ. | ||
| คำอธิบาย ตัวชี้วัดนี้นับจำนวนครั้งที่กิจกรรม 'ส่งใบแจ้งหนี้เพื่ออนุมัติ' เกิดขึ้นกับใบแจ้งหนี้หนึ่งรายการ หากมีจำนวนมากกว่าหนึ่ง แสดงว่าใบแจ้งหนี้ถูกปฏิเสธหรือส่งกลับอย่างน้อยหนึ่งครั้ง จึงต้องเริ่มรอบอนุมัติใหม่. แอตทริบิวต์นี้ช่วยติดตาม KPI 'อัตราการอนุมัติผ่านในครั้งแรก' โดยวิเคราะห์ใบแจ้งหนี้ที่มีรอบอนุมัติหลายครั้ง องค์กรจะระบุสาเหตุที่ไม่ผ่านการอนุมัติ เช่น ข้อมูลไม่ครบหรือกำหนดรหัสไม่ถูกต้อง และหาทางปรับปรุงกระบวนการได้. เหตุผลที่สำคัญ วัดปริมาณงานซ้ำในขั้นตอนย่อยการอนุมัติ ช่วยประเมินอัตราการดำเนินการถูกต้องตั้งแต่ครั้งแรกและระบุสาเหตุที่ถูกปฏิเสธการอนุมัติ. แหล่งข้อมูล คำนวณโดยนับจำนวนครั้งที่กิจกรรม 'ส่งใบแจ้งหนี้เพื่ออนุมัติ' เกิดขึ้นสำหรับ InvoiceNumber แต่ละค่าที่ไม่ซ้ำกัน. ตัวอย่าง 123 | |||
| ชำระเงินตรงเวลาหรือไม่ IsPaidOnTime | ตัวบ่งชี้ที่เป็นจริงเมื่อชำระใบแจ้งหนี้ภายในหรือก่อนวันครบกำหนดชำระเงิน. | ||
| คำอธิบาย แอตทริบิวต์แบบค่าจริง/เท็จนี้ได้จากการเปรียบเทียบวันที่ชำระเงินจริง (เวลาประทับของกิจกรรม 'ดำเนินการชำระเงินแล้ว') กับ 'วันครบกำหนดชำระเงิน' จึงแสดงสถานะการชำระเงินของใบแจ้งหนี้แต่ละรายการได้อย่างชัดเจน. นี่คือการคำนวณหลักสำหรับ KPI 'อัตราการชำระเงินตรงเวลา' ช่วยกรองและวิเคราะห์ลักษณะของการชำระเงินล่าช้าได้ง่ายขึ้น เช่น ผู้ขาย รหัสบริษัท หรือยอดเงินในใบแจ้งหนี้ที่มักเกี่ยวข้องกับความล่าช้า. เหตุผลที่สำคัญ วัดการปฏิบัติตามเงื่อนไขการชำระเงินโดยตรง ซึ่งเป็น KPI สำคัญต่อการบริหารความสัมพันธ์กับผู้ขายและการปฏิบัติการด้านการเงิน. แหล่งข้อมูล คำนวณโดยเปรียบเทียบ EventTime ของกิจกรรม 'ดำเนินการชำระเงินแล้ว' กับแอตทริบิวต์ PaymentDueDate (วันที่ชำระเงิน <= PaymentDueDate). ตัวอย่าง truefalse | |||
| เป็นการทำงานอัตโนมัติหรือไม่ IsAutomated | ตัวบ่งชี้ว่ากิจกรรมดำเนินการโดยผู้ใช้ระบบอัตโนมัติหรือไม่. | ||
| คำอธิบาย แอตทริบิวต์แบบค่าจริง/เท็จนี้จะเป็นจริงเมื่อผู้ใช้ที่เกี่ยวข้องกับกิจกรรมเป็นบัญชีระบบหรือบัญชีประมวลผลแบบกลุ่มที่รู้จัก เช่น 'WF-BATCH' หรือ 'SAP_SYSTEM' ช่วยแยกขั้นตอนที่ทำด้วยตนเองออกจากขั้นตอนอัตโนมัติ. แอตทริบิวต์นี้จำเป็นต่อการคำนวณ KPI 'อัตราการประมวลผลใบแจ้งหนี้อัตโนมัติ' การวิเคราะห์ว่าส่วนใดของกระบวนการทำงานอัตโนมัติช่วยให้องค์กรวัดผลการนำระบบอัตโนมัติมาใช้ และหาโอกาสลดงานที่ต้องทำด้วยตนเองเพื่อเพิ่มประสิทธิภาพ. เหตุผลที่สำคัญ แยกกิจกรรมที่ทำด้วยตนเองออกจากกิจกรรมที่ระบบดำเนินการ ซึ่งเป็นพื้นฐานในการวัดอัตราการทำงานอัตโนมัติและหาโอกาสเพิ่มระบบอัตโนมัติ. แหล่งข้อมูล ได้จากแอตทริบิวต์ UserName โดยกำหนดการจับคู่หรือกฎเพื่อจัดประเภท ID ผู้ใช้ที่ระบุว่าเป็น 'ระบบอัตโนมัติ'. ตัวอย่าง truefalse | |||
| มีการทำงานซ้ำหรือไม่ IsRework | ตัวบ่งชี้ว่าใบแจ้งหนี้ผ่านกิจกรรมที่ต้องทำซ้ำหรือไม่ เช่น ถูกปฏิเสธการอนุมัติหรือยกเลิกบล็อกการชำระเงิน. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุใบแจ้งหนี้ที่ผ่านการทำงานซ้ำอย่างน้อยหนึ่งรอบ โดยตรวจจากลำดับกิจกรรมที่กำหนด เช่น 'อนุมัติใบแจ้งหนี้แล้ว' หลัง 'ปฏิเสธใบแจ้งหนี้' หรือ 'ยกเลิกบล็อกการชำระเงิน' หลัง 'ตั้งค่าบล็อกการชำระเงิน'. แอตทริบิวต์นี้ช่วยให้คำนวณ KPI 'อัตราการทำงานซ้ำของใบแจ้งหนี้' ได้ง่ายขึ้น นักวิเคราะห์สามารถแยกกรณีที่มีการทำงานซ้ำมาศึกษา เพื่อหาสาเหตุที่ทำให้กระบวนการไม่มีประสิทธิภาพและต้องใช้แรงงานทำซ้ำ. เหตุผลที่สำคัญ ระบุเส้นทางกระบวนการที่ไม่มีประสิทธิภาพและต้องทำงานซ้ำ ช่วยวัดงานที่สูญเปล่าและหาสาเหตุที่แท้จริงของกรณียกเว้นในกระบวนการ. แหล่งข้อมูล คำนวณจากลำดับกิจกรรมในบันทึกเหตุการณ์ ตัวอย่างเช่น หากพบ 'ปฏิเสธใบแจ้งหนี้' ในเส้นทางของใบแจ้งหนี้ ค่านี้จะเป็นจริง. ตัวอย่าง truefalse | |||
| รหัสระบบต้นทาง SourceSystemId | รหัสของระบบ SAP S/4HANA ต้นทางที่ใช้ดึงข้อมูล. | ||
| คำอธิบาย แอตทริบิวต์นี้ระบุระบบต้นทาง เช่น 'S4H_PROD' หรือ 'ERP_EU' ซึ่งสำคัญเป็นพิเศษเมื่อมี ERP หลายระบบ หรือใช้ทั้งระบบเดิมและระบบใหม่. การวิเคราะห์ช่วยเปรียบเทียบประสิทธิภาพกระบวนการระหว่างระบบหรือภูมิภาคต่างๆ ทั้งยังยืนยันที่มาของข้อมูล ซึ่งจำเป็นต่อการกำกับดูแลข้อมูลและแก้ไขปัญหาเมื่อรวมข้อมูลจากหลายแหล่งไว้ในแพลตฟอร์ม process mining ส่วนกลาง. เหตุผลที่สำคัญ แสดงที่มาของข้อมูล ซึ่งจำเป็นต่อการกำกับดูแลข้อมูลและเปรียบเทียบกระบวนการระหว่างระบบหรือสถานที่ตั้งบริษัทต่างๆ. แหล่งข้อมูล โดยทั่วไปค่านี้ได้จากรหัสระบบ SAP (sy-sysid) ระหว่างการดึงข้อมูล หรือตั้งเป็นค่าคงที่ในไปป์ไลน์ ETL. ตัวอย่าง S4PS4H_PROD_100ECC_EU | |||
| วันที่ในใบแจ้งหนี้ InvoiceDate | วันที่ผู้ขายออกเอกสารใบแจ้งหนี้. | ||
| คำอธิบาย วันที่ในใบแจ้งหนี้ หรือวันที่เอกสาร คือวันที่ผู้ขายระบุไว้ในใบแจ้งหนี้ ใช้เป็นจุดเริ่มต้นในการคำนวณวันครบกำหนดชำระตามเงื่อนไขที่ตกลงกัน. การวิเคราะห์ใช้วันที่นี้ในการคำนวณทางการเงิน เช่น อายุของใบแจ้งหนี้และสิทธิ์รับส่วนลดเมื่อชำระก่อนกำหนด นอกจากนี้ยังเป็นข้อมูลสำคัญสำหรับ KPI 'อัตราการใช้สิทธิ์รับส่วนลดเมื่อชำระก่อนกำหนด'. เหตุผลที่สำคัญ ใช้เป็นวันที่ฐานในการคำนวณเงื่อนไขและวันครบกำหนดชำระ ซึ่งจำเป็นต่อการบริหารเงินทุนหมุนเวียนและการใช้สิทธิ์รับส่วนลด. แหล่งข้อมูล อยู่ในตารางส่วนหัวเอกสาร BKPF ฟิลด์ BLDAT (วันที่เอกสาร). ตัวอย่าง 2023-04-122023-05-152023-06-20 | |||
| เวลาประทับการดึงข้อมูล ExtractionTimestamp | วันที่และเวลาที่ดึงข้อมูลจากระบบต้นทาง. | ||
| คำอธิบาย แอตทริบิวต์นี้บันทึกเวลาที่ดึงข้อมูล และแสดงว่าข้อมูลที่วิเคราะห์ในเครื่องมือ process mining เป็นข้อมูลล่าสุดเพียงใด. การวิเคราะห์ใช้ค่านี้เพื่อตรวจสอบว่าข้อมูลเชิงลึกที่ได้เป็นข้อมูลใหม่แค่ไหน แดชบอร์ดติดตามการปฏิบัติการจำเป็นต้องใช้ข้อมูลนี้เพื่อให้การตัดสินใจอ้างอิงข้อมูลล่าสุด และช่วยจัดการรอบการอัปเดตข้อมูลได้อย่างมีประสิทธิภาพ. เหตุผลที่สำคัญ แสดงความใหม่ของข้อมูล เพื่อให้การวิเคราะห์และรายงานอ้างอิงข้อมูลล่าสุดที่มีอยู่. แหล่งข้อมูล ฟิลด์นี้ไม่ได้มาจาก SAP แต่เครื่องมือดึงข้อมูลหรือกระบวนการ ETL จะสร้างและเพิ่มให้ขณะดึงข้อมูล. ตัวอย่าง 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| หมายเลขเอกสารเคลียร์รายการ. ClearingDocumentNumber | หมายเลขเอกสารที่ใช้เคลียร์ใบแจ้งหนี้ โดยทั่วไปคือเอกสารการชำระเงิน. | ||
| คำอธิบาย หมายเลขเอกสารเคลียร์รายการเชื่อมรายการใบแจ้งหนี้ค้างชำระกับธุรกรรมที่ใช้เคลียร์รายการ ซึ่งเกือบทุกครั้งคือเอกสารการชำระเงิน จึงยืนยันได้ว่าชำระใบแจ้งหนี้แล้ว. แอตทริบิวต์นี้เป็นตัวเชื่อมที่ยืนยันความสัมพันธ์ระหว่างใบแจ้งหนี้กับการชำระเงิน ใช้ระบุกิจกรรม 'ดำเนินการชำระเงินแล้ว' และเวลาที่เกิดกิจกรรม ซึ่งจำเป็นต่อการคำนวณระยะเวลาตั้งแต่ต้นจนจบและอัตราการชำระเงินตรงเวลา. เหตุผลที่สำคัญ ยืนยันว่าใบแจ้งหนี้ได้รับการชำระแล้ว และเชื่อมกับธุรกรรมการชำระเงินที่เกี่ยวข้อง ซึ่งสำคัญต่อการวิเคราะห์ระยะเวลาดำเนินการและผลการชำระเงิน. แหล่งข้อมูล อยู่ในตารางรายการเอกสาร BSEG ฟิลด์ AUGBL (หมายเลขเอกสารเคลียร์รายการ). ตัวอย่าง 150000000115000000231500000088 | |||
| เหตุผลที่กลับรายการ ReversalReason | รหัสที่ระบุสาเหตุที่กลับรายการเอกสารใบแจ้งหนี้. | ||
| คำอธิบาย หากบันทึกบัญชีใบแจ้งหนี้ผิด มักต้องกลับรายการ รหัสเหตุผลที่กลับรายการจะอธิบายสาเหตุ เช่น 'วันที่บันทึกบัญชีไม่ถูกต้อง' หรือ 'ป้อนข้อมูลผิด'. การวิเคราะห์เหตุผลที่กลับรายการช่วยระบุรูปแบบข้อผิดพลาดในขั้นตอนบันทึกบัญชีใบแจ้งหนี้ ข้อมูลนี้นำไปใช้ปรับปรุงการฝึกอบรม เพิ่มการควบคุมในระบบ หรือแก้ปัญหาที่เกิดซ้ำ ซึ่งทำให้ต้องทำงานทางการเงินซ้ำและเพิ่มภาระงานธุรการ. เหตุผลที่สำคัญ อธิบายสาเหตุที่ยกเลิกใบแจ้งหนี้ ช่วยให้เห็นแหล่งที่มาของข้อผิดพลาดและงานที่ต้องทำซ้ำในขั้นตอนบันทึกบัญชีโดยตรง. แหล่งข้อมูล อยู่ในส่วนหัวของเอกสารต้นฉบับในตาราง BKPF ฟิลด์ STGRD (เหตุผลที่กลับรายการ). ตัวอย่าง 010205 | |||
กิจกรรมในกระบวนการจัดซื้อจนถึงชำระเงินและการประมวลผลใบแจ้งหนี้
| กิจกรรม | คำอธิบาย | ||
|---|---|---|---|
| กลับรายการใบแจ้งหนี้ | กิจกรรมนี้หมายถึงการกลับรายการเอกสารใบแจ้งหนี้ที่บันทึกบัญชีไปแล้ว เป็นเหตุการณ์สิ้นสุดของใบแจ้งหนี้ที่ไม่ถูกต้อง ซึ่งมักมีการป้อนข้อมูลใหม่ให้ถูกต้องภายหลัง. | ||
| เหตุผลที่สำคัญ การกลับรายการบ่งชี้ถึงข้อผิดพลาดสำคัญที่ไม่พบตั้งแต่ขั้นตอนก่อนหน้า การติดตามความถี่และสาเหตุที่แท้จริงช่วยปรับปรุงกระบวนการและลดความคลาดเคลื่อนทางการเงิน. แหล่งข้อมูล ระบุการกลับรายการได้เมื่อมีการสร้างเอกสารกลับรายการ ส่วนหัวเอกสารต้นฉบับ (BKPF) จะมีหมายเลขเอกสารกลับรายการ (BKPF-STBLG) และเอกสารกลับรายการก็จะอ้างถึงเอกสารต้นฉบับเช่นกัน ใช้วันที่บันทึกบัญชีของเอกสารกลับรายการเป็นเวลาเกิดเหตุการณ์. บันทึก ค้นหาเอกสารที่มีค่าในฟิลด์ BKPF-STBLG แล้วใช้วันที่บันทึกบัญชีของเอกสารกลับรายการ. ประเภทเหตุการณ์ explicit | |||
| ดำเนินการชำระเงินแล้ว | นี่เป็นกิจกรรมสุดท้ายในกระบวนการมาตรฐาน โดยมีการชำระเงินและเคลียร์ใบแจ้งหนี้ แสดงว่ามีการจ่ายเงินให้ผู้ขายแล้ว. | ||
| เหตุผลที่สำคัญ เหตุการณ์นี้เป็นจุดสิ้นสุดของวงจรใบแจ้งหนี้ P2P ซึ่งจำเป็นต่อการคำนวณระยะเวลาตั้งแต่ต้นจนจบ และวัดผลการชำระเงินตรงตามกำหนด. แหล่งข้อมูล บันทึกเหตุการณ์นี้จากข้อมูลเอกสารเคลียร์รายการในรายการบัญชีผู้ขาย วันที่เคลียร์รายการ (BSEG-AUGDT) และเอกสารเคลียร์รายการ (BSEG-AUGBL) ใช้ยืนยันว่ามีการชำระเงินแล้ว. บันทึก ใช้วันที่เคลียร์รายการ (BSEG-AUGDT) จากรายการบัญชีผู้ขายที่เคลียร์แล้ว. ประเภทเหตุการณ์ explicit | |||
| ลงบัญชีใบแจ้งหนี้แล้ว | นี่คือเหตุการณ์ทางการเงินสำคัญที่นำใบแจ้งหนี้ซึ่งพักรายการหรือได้รับอนุมัติแล้วไปลงบัญชีในบัญชีแยกประเภททั่วไปอย่างเป็นทางการ การดำเนินการนี้บันทึกหนี้สินที่มีต่อผู้ขาย. | ||
| เหตุผลที่สำคัญ การบันทึกบัญชีเป็นจุดเปลี่ยนสำคัญที่แบ่งขั้นตอนการป้อนข้อมูลและอนุมัติออกจากขั้นตอนชำระเงิน ระยะเวลาตั้งแต่สร้างใบแจ้งหนี้จนถึงบันทึกบัญชีเป็นตัวชี้วัดสำคัญที่ใช้ประเมินประสิทธิภาพการประมวลผลภายใน. แหล่งข้อมูล ระบุเหตุการณ์นี้ได้จากวันที่บันทึกบัญชี (BKPF-BUDAT) ในส่วนหัวเอกสาร สำหรับเอกสารที่พักรายการไว้ก่อน การเปลี่ยนสถานะเป็นบันทึกบัญชีแล้วจะระบุเวลาที่เกิดเหตุการณ์. บันทึก ใช้วันที่บันทึกบัญชี (BKPF-BUDAT) เป็นเวลาที่เกิดเหตุการณ์. ประเภทเหตุการณ์ explicit | |||
| สร้างเอกสารใบแจ้งหนี้แล้ว | นี่คือเหตุการณ์แรก ซึ่งบันทึกการสร้างเอกสารใบแจ้งหนี้ใน SAP โดยตรวจจับได้เมื่อผู้ใช้บันทึกเอกสารใบแจ้งหนี้ใหม่ ซึ่งอาจอยู่ในสถานะพักรายการหรือยังไม่ผ่านการลงบัญชี. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้เป็นจุดเริ่มต้นของวงจรการประมวลผลใบแจ้งหนี้ การวิเคราะห์เวลาตั้งแต่เหตุการณ์นี้ไปจนถึงเหตุการณ์อื่นมีความสำคัญต่อการวัดระยะเวลารวมของกระบวนการ. แหล่งข้อมูล ตรวจจับเหตุการณ์นี้จากวันที่และเวลาที่สร้างเอกสาร (CPUDT, CPUTM) ในตารางส่วนหัวเอกสาร ซึ่งโดยทั่วไปคือ BKPF หรือ RBKP สำหรับใบแจ้งหนี้ด้านโลจิสติกส์ รหัสธุรกรรม (BKPF-TCODE) เช่น FB60, MIRO หรือ MIR7 ใช้ระบุวิธีสร้างเอกสาร. บันทึก ใช้เวลาที่สร้างเอกสารจาก BKPF-CPUDT และ BKPF-CPUTM สำหรับเอกสารใบแจ้งหนี้. ประเภทเหตุการณ์ explicit | |||
| อนุมัติใบแจ้งหนี้แล้ว | กิจกรรมนี้หมายถึงใบแจ้งหนี้ได้รับอนุมัติจากผู้มีอำนาจที่กำหนดแล้ว ตรวจจับได้เมื่อเวิร์กโฟลว์อนุมัติเสร็จสมบูรณ์ หรือมีการตั้งค่าตัวบ่งชี้การอนุมัติ. | ||
| เหตุผลที่สำคัญ นี่คือจุดสำคัญที่ทำให้ใบแจ้งหนี้พร้อมชำระเงิน การอนุมัติที่ล่าช้าเป็นคอขวดที่พบได้บ่อย การติดตามกิจกรรมนี้ช่วยระบุผู้อนุมัติหรือขั้นตอนที่ใช้เวลานาน. แหล่งข้อมูล อนุมานได้จากขั้นตอนอนุมัติขั้นสุดท้ายในเวิร์กโฟลว์ SAP หรือติดตามการเปลี่ยนแปลงฟิลด์สถานะการอนุมัติในตารางที่เกี่ยวข้องกับใบแจ้งหนี้หรือเอกสารจัดซื้อ. บันทึก อนุมานจากเหตุการณ์ที่เวิร์กโฟลว์เสร็จสมบูรณ์ หรือการเปลี่ยนแปลงฟิลด์สถานะการอนุมัติของเอกสาร. ประเภทเหตุการณ์ inferred | |||
| ดำเนินการชำระเงินล่าช้า | เหตุการณ์นี้คำนวณจากกรณีที่ชำระใบแจ้งหนี้หลังวันครบกำหนดที่คำนวณไว้ โดยเปรียบเทียบวันที่สองค่า. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้ช่วยวัด KPI การชำระเงินตรงเวลา และระบุผู้ขายหรือหน่วยธุรกิจที่ชำระเงินล่าช้าบ่อยครั้ง ซึ่งอาจกระทบความสัมพันธ์กับผู้ขายและทำให้เกิดค่าปรับ. แหล่งข้อมูล คำนวณโดยเปรียบเทียบวันที่เคลียร์รายการ (BSEG-AUGDT) กับวันครบกำหนดสุทธิ โดยคำนวณวันครบกำหนดจากวันที่ฐาน (BSEG-ZFBDT) และเงื่อนไขการชำระเงิน (BSEG-ZTERM). บันทึก คำนวณโดยเปรียบเทียบ BSEG-AUGDT > (BSEG-ZFBDT + จำนวนวันตามเงื่อนไขการชำระเงิน). ประเภทเหตุการณ์ calculated | |||
| ตั้งค่าระงับการชำระเงิน | กิจกรรมที่ตั้งค่าระงับใบแจ้งหนี้โดยตั้งใจเพื่อป้องกันการชำระเงิน มักเกิดจากราคา或จำนวนไม่ตรงกัน หรือยังรอใบลดหนี้. | ||
| เหตุผลที่สำคัญ การระงับการชำระเงินเป็นสาเหตุหลักของการจ่ายเงินล่าช้าและข้อโต้แย้งกับผู้ขาย การวิเคราะห์ความถี่ ระยะเวลา และสาเหตุของการระงับมีความสำคัญต่อการเพิ่มอัตราการชำระเงินตรงเวลา. แหล่งข้อมูล ตรวจจับเหตุการณ์นี้โดยติดตามการเปลี่ยนแปลงฟิลด์รหัสระงับการชำระเงิน (BSEG-ZLSPR) ในรายการบรรทัดใบแจ้งหนี้ บันทึกการเปลี่ยนแปลงใน CDHDR และ CDPOS ระบุเวลาและผู้ใช้ที่ตั้งค่าการระงับ. บันทึก ระบุเวลาที่มีการกรอกฟิลด์ BSEG-ZLSPR โดยใช้เอกสารการเปลี่ยนแปลง (CDHDR/CDPOS). ประเภทเหตุการณ์ explicit | |||
| ปฏิเสธใบแจ้งหนี้ | หมายถึงการปฏิเสธใบแจ้งหนี้ระหว่างขั้นตอนอนุมัติ เหตุการณ์นี้ทำให้ต้องกลับไปแก้ไขและส่งขออนุมัติใหม่. | ||
| เหตุผลที่สำคัญ การปฏิเสธใบแจ้งหนี้เป็นตัวชี้วัดสำคัญของความไม่มีประสิทธิภาพในกระบวนการและปัญหาคุณภาพข้อมูล การวิเคราะห์ความถี่และสาเหตุของการปฏิเสธช่วยระบุโอกาสในการปรับปรุงและฝึกอบรม. แหล่งข้อมูล อนุมานได้จากการอัปเดตสถานะเฉพาะในเวิร์กโฟลว์ SAP เช่น สถานะ 'ถูกปฏิเสธ' หรือจากเหตุการณ์ที่ยกเลิกเวิร์กโฟลว์อนุมัติปัจจุบันและส่งกลับไปยังผู้ประมวลผล. บันทึก อนุมานจากการเปลี่ยนแปลงสถานะเวิร์กโฟลว์ที่แสดงว่าถูกปฏิเสธ. ประเภทเหตุการณ์ inferred | |||
| พักรายการใบแจ้งหนี้ | หมายถึงใบแจ้งหนี้ที่ป้อนเข้าสู่ระบบแล้ว แต่ยังไม่ได้ลงบัญชีในบัญชีแยกประเภททั่วไป การพักรายการใช้บันทึกใบแจ้งหนี้ที่ยังไม่สมบูรณ์ หรือเก็บไว้ตรวจสอบก่อนลงบัญชี. | ||
| เหตุผลที่สำคัญ การพักรายการแสดงว่ากระบวนการหยุดชั่วคราวโดยตั้งใจ การติดตามระยะเวลาและความถี่ของใบแจ้งหนี้ที่พักรายการช่วยระบุสาเหตุของความล่าช้าก่อนเริ่มรอบการลงบัญชีและอนุมัติอย่างเป็นทางการ. แหล่งข้อมูล ระบุได้จากเอกสารที่สร้างผ่านธุรกรรมพักรายการ เช่น MIR7, FV60 หรือตรวจสอบฟิลด์สถานะเฉพาะในตาราง BKPF หรือตารางเอกสารพักรายการโดยเฉพาะ เช่น VBKPF. บันทึก ระบุเอกสารที่สร้างผ่านธุรกรรมพักรายการ หรือตรวจสอบสถานะเอกสารว่าพักรายการอยู่หรือไม่. ประเภทเหตุการณ์ explicit | |||
| ยกเลิกการระงับการชำระเงิน | หมายถึงการแก้ไขปัญหา โดยยกเลิกการระงับการชำระเงินที่ตั้งไว้ก่อนหน้านี้ ทำให้ใบแจ้งหนี้กลับมามีสิทธิ์รับชำระเงิน. | ||
| เหตุผลที่สำคัญ ระยะเวลาตั้งแต่เริ่มระงับจนถึงยกเลิกการระงับคือเวลาที่ใช้แก้ไขกรณียกเว้นในกระบวนการ การลดระยะเวลานี้เป็นกุญแจสำคัญในการเพิ่มประสิทธิภาพและปรับปรุงความสัมพันธ์กับผู้ขาย. แหล่งข้อมูล ตรวจจับเหตุการณ์นี้เมื่อมีการล้างค่าฟิลด์รหัสระงับการชำระเงิน (BSEG-ZLSPR) การเปลี่ยนแปลงนี้บันทึกไว้ในตาราง CDHDR และ CDPOS ซึ่งระบุเวลาที่ยกเลิกการระงับ. บันทึก ระบุเวลาที่ล้างค่าฟิลด์ BSEG-ZLSPR โดยใช้เอกสารการเปลี่ยนแปลง (CDHDR/CDPOS). ประเภทเหตุการณ์ explicit | |||
| ส่งใบแจ้งหนี้เพื่ออนุมัติ | กิจกรรมนี้บันทึกการเริ่มเวิร์กโฟลว์อนุมัติใบแจ้งหนี้อย่างเป็นทางการ โดยมักอนุมานได้เมื่อสถานะใบแจ้งหนี้เปลี่ยนเป็น 'รออนุมัติ' หรือมีการสร้างรายการเวิร์กโฟลว์. | ||
| เหตุผลที่สำคัญ นี่คือจุดเริ่มต้นสำหรับวัดเวลารอบการอนุมัติ การทราบว่าเริ่มอนุมัติเมื่อใดเป็นสิ่งสำคัญต่อการระบุคอขวดในเวิร์กโฟลว์อนุมัติ. แหล่งข้อมูล โดยทั่วไปอนุมานได้จากการเริ่ม SAP Business Workflow ในตาราง SWW_WI2OBJ ที่เชื่อมโยงกับออบเจ็กต์ใบแจ้งหนี้ เช่น BUS2081 หรือจากการเปลี่ยนแปลงฟิลด์สถานะที่กำหนดเองในส่วนหัวเอกสาร. บันทึก อนุมานจากการสร้างรายการเวิร์กโฟลว์ที่เกี่ยวข้องกับเอกสารใบแจ้งหนี้. ประเภทเหตุการณ์ inferred | |||
| สร้างข้อเสนอการชำระเงิน | ระบบเลือกใบแจ้งหนี้และเพิ่มลงในข้อเสนอการชำระเงินระหว่างรอบการชำระเงิน นี่เป็นขั้นตอนแรกของกระบวนการชำระเงินอัตโนมัติ. | ||
| เหตุผลที่สำคัญ กิจกรรมนี้แสดงว่ามีแผนจะชำระเงิน ความล่าช้าระหว่างขั้นตอนนี้กับการชำระเงินจริงอาจบ่งชี้ถึงปัญหาในกระบวนการจัดรอบชำระเงิน การอนุมัติ หรือการติดต่อกับธนาคาร. แหล่งข้อมูล ค้นหาข้อมูลนี้ได้ในตารางรอบการชำระเงิน โดยเฉพาะ REGUP ซึ่งเก็บรายการที่รวมอยู่ในข้อเสนอการชำระเงิน ส่วนวันที่รอบการชำระเงินในตาราง REGUH ที่เกี่ยวข้องจะระบุเวลาเกิดเหตุการณ์. บันทึก ระบุเวลาที่ใบแจ้งหนี้ปรากฏในตาราง REGUP จากการจัดรอบข้อเสนอการชำระเงิน. ประเภทเหตุการณ์ explicit | |||
| อัปเดตข้อมูลใบแจ้งหนี้แล้ว | กิจกรรมนี้บันทึกการเปลี่ยนแปลงเอกสารใบแจ้งหนี้หลังจากสร้างครั้งแรก ซึ่งมักเกิดระหว่างการแก้ไขงานหลังถูกปฏิเสธ หรือเพื่อแก้ข้อผิดพลาด. | ||
| เหตุผลที่สำคัญ การอัปเดตบ่อยครั้งบ่งชี้ว่ามีการแก้ไขงานซ้ำและอาจมีปัญหาคุณภาพข้อมูลตั้งแต่ขั้นตอนป้อนข้อมูล การติดตามการเปลี่ยนแปลงเหล่านี้ช่วยวัดเวลาที่ใช้แก้ไขและระบุข้อผิดพลาดที่พบบ่อย. แหล่งข้อมูล SAP บันทึกการเปลี่ยนแปลงฟิลด์สำคัญไว้ในตารางเอกสารการเปลี่ยนแปลง ได้แก่ CDHDR (ส่วนหัว) และ CDPOS (รายการ) คุณสร้างเหตุการณ์ได้โดยกรองการเปลี่ยนแปลงของออบเจ็กต์ใบแจ้งหนี้ที่เกี่ยวข้อง. บันทึก ดึงเหตุการณ์การเปลี่ยนแปลงของออบเจ็กต์ใบแจ้งหนี้จากตาราง CDHDR และ CDPOS. ประเภทเหตุการณ์ explicit | |||
คู่มือการดึงข้อมูล
ขั้นตอน
- ข้อกำหนดเบื้องต้นและสิทธิ์การเข้าถึง: ตรวจสอบว่าผู้ใช้ที่ดึงข้อมูลมีสิทธิ์ที่จำเป็นใน SAP S/4HANA เพื่อเข้าถึง Core Data Services (CDS) view ที่ต้องใช้ โดย view หลักได้แก่
I_InvoiceDocument,I_OperationalAcctgDocItem,I_ChangeDocument,I_ChangeDocumentItemและI_PaymentProposalItemผู้ใช้ยังต้องมีสิทธิ์เรียกใช้ query ผ่านช่องทางที่เลือก เช่น OData service หรือการเชื่อมต่อ SQL โดยตรง - เลือกวิธีเชื่อมต่อ: กำหนดวิธีเชื่อมต่อกับระบบ SAP S/4HANA เพื่อเรียกใช้ SQL query วิธีที่ใช้กันทั่วไป ได้แก่ SAP Data Services, SAP Data Intelligence, เครื่องมือ ETL จากผู้ให้บริการรายอื่นที่มี SAP connector หรือการเชื่อมต่อ SQL โดยตรงกับฐานข้อมูล SAP HANA หากนโยบายความปลอดภัยขององค์กรอนุญาต
- กำหนดพารามิเตอร์การดึงข้อมูล: กำหนดพารามิเตอร์สำคัญก่อนเรียกใช้ query เช่น ระบุช่วงวันที่ดึงข้อมูลด้วย
CreationDateระหว่าง'YYYY-MM-DD'ถึง'YYYY-MM-DD'และเลือกค่าCompanyCodeที่ต้องการรวม เพื่อจำกัดขอบเขตข้อมูล - ปรับ SQL query: คัดลอก SQL query ที่ให้ไว้ไปยัง SQL client หรือเครื่องมือดึงข้อมูลที่เลือก ตรวจสอบ placeholder เช่น
'{StartDate}','{EndDate}'และ('{CompanyCode1}', '{CompanyCode2}')แล้วแทนที่ด้วยค่าจริงที่กำหนดไว้ในขั้นตอนก่อนหน้า คุณอาจต้องปรับชื่อฟิลด์สถานะเวิร์กโฟลว์ให้ตรงกับการตั้งค่า SAP ขององค์กร - เรียกใช้ query: เรียกใช้ SQL query ทั้งชุดกับฐานข้อมูล SAP S/4HANA หรือผ่าน service layer ที่เหมาะสม query นี้ออกแบบให้ดึงข้อมูลหลายส่วน จึงอาจใช้เวลานานตามปริมาณข้อมูลและช่วงวันที่ที่เลือก ตรวจสอบการทำงานเพื่อดูข้อผิดพลาดหรือ timeout
- ตรวจสอบผลลัพธ์เบื้องต้น: เมื่อ query ทำงานเสร็จ ให้ตรวจผลลัพธ์อย่างรวดเร็ว ตรวจสอบว่าคอลัมน์
InvoiceNumber,ActivityNameและEventTimeมีข้อมูล และดูว่าคอลัมน์ActivityNameมีหลายกิจกรรม ไม่ใช่มีเพียง 'Invoice Document Created' - จัดการการแปลงข้อมูล: query นี้จัดรูปแบบข้อมูลให้อยู่ในรูปแบบบันทึกเหตุการณ์ที่พร้อมใช้งาน อย่างไรก็ตาม ให้ตรวจสอบว่าคอลัมน์
EventTimeใช้รูปแบบเวลาเดียวกัน เช่นYYYY-MM-DDTHH:MM:SSquery ที่ให้มาจะรวมฟิลด์วันที่และเวลาเป็น timestamp เดียวเมื่อจำเป็น - ส่งออกข้อมูล: ส่งออกผลลัพธ์สุดท้ายจากเครื่องมือเป็นไฟล์ CSV (Comma-Separated Values) ซึ่งใช้ได้กับเครื่องมือ process mining ทั่วไป รวมถึง ProcessMind
- เตรียมอัปโหลด: ก่อนอัปโหลด ตรวจสอบว่าไฟล์ CSV เข้ารหัสแบบ UTF-8 เพื่อป้องกันปัญหาอักขระ และตรวจสอบว่าชื่อหัวคอลัมน์ตรงกับแอตทริบิวต์ที่กำหนดทุกประการ ได้แก่
InvoiceNumber,ActivityName,EventTime,UserName,CompanyCodeเป็นต้น - อัปโหลดไปยัง ProcessMind: อัปโหลดไฟล์ CSV ที่เตรียมไว้ไปยังโปรเจกต์ process mining แล้วจับคู่คอลัมน์ในไฟล์กับฟิลด์รหัสเคส ชื่อกิจกรรม และ timestamp ในการตั้งค่าโมเดลข้อมูลของเครื่องมือ.
การกำหนดค่า
- CDS View ที่ใช้: แหล่งข้อมูลหลักคือ SAP CDS view มาตรฐาน โดย view สำคัญได้แก่
I_InvoiceDocumentสำหรับข้อมูลส่วนหัว,I_OperationalAcctgDocItemสำหรับรายละเอียดการบันทึกบัญชีและการเคลียร์รายการ และI_ChangeDocumentร่วมกับI_ChangeDocumentItemสำหรับติดตามการเปลี่ยนแปลงย้อนหลังของแอตทริบิวต์ใบแจ้งหนี้ เช่น การระงับการชำระเงินและสถานะเวิร์กโฟลว์ - การกรองช่วงวันที่: ควรกรองข้อมูลตามช่วงวันที่ที่กำหนดเพื่อควบคุมประสิทธิภาพ คิวรีที่ให้มามี placeholder สำหรับ
CreationDateใน viewI_InvoiceDocumentโดยแนะนำให้เริ่มจากข้อมูลย้อนหลัง 3 ถึง 6 เดือน - การกรองรหัสบริษัท: กรองด้วย
CompanyCodeอย่างน้อยหนึ่งค่าเสมอ เพื่อให้ข้อมูลที่ดึงมาตรงกับความต้องการและจัดการได้สะดวก คิวรีมี placeholderWHERE inv.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')สำหรับการกรองนี้ - การกรองประเภทเอกสาร: คุณสามารถจำกัดข้อมูลเพิ่มเติมด้วย
InvoiceDocumentTypeเช่น เลือกใบแจ้งหนี้ผู้ขายทั่วไป (RE) และไม่รวมใบลดหนี้ โดยเพิ่มเงื่อนไขในส่วนWHEREของ CTE แรก - ข้อกำหนดเบื้องต้น: ผู้เรียกใช้คิวรีต้องมีสิทธิ์ดูเอกสารการเงินและเอกสารจัดซื้อในรหัสบริษัทที่ระบุ การเข้าถึงฐานข้อมูล HANA ด้วย SQL client ไม่ใช่สิทธิ์มาตรฐาน และต้องได้รับอนุญาตเป็นกรณีพิเศษ
- ข้อควรพิจารณาด้านประสิทธิภาพ: การดึงข้อมูลจากตารางเอกสารการเปลี่ยนแปลง (
I_ChangeDocument,I_ChangeDocumentItem) อาจใช้ทรัพยากรมาก ควรกรองวันที่ รหัสบริษัท และ object class (INCOMINGINVOICE) อย่างเคร่งครัด เพื่อป้องกันไม่ให้คิวรีใช้เวลานานเกินไป.
ตัวอย่างคำค้น sql
WITH InvoiceBase AS (
SELECT
inv.InvoiceDocument,
inv.FiscalYear,
inv.CompanyCode,
inv.Supplier AS VendorNumber,
inv.DocumentType,
inv.GrossInvoiceAmountInCoCoCrcy AS AmountInCompanyCodeCurrency,
inv.NetDueDate AS PaymentDueDate,
inv.PurchasingDocument,
inv.CreationDateTime,
inv.CreatedByUser,
accdoc.AccountingDocument,
accdoc.ClearingDate,
accdoc.ClearingJournalEntry,
accdoc.PaymentBlockReason,
accdoc.IsReversed
FROM I_InvoiceDocument AS inv
LEFT JOIN I_OperationalAcctgDocItem AS accdoc
ON inv.AccountingDocument = accdoc.AccountingDocument
AND inv.FiscalYear = accdoc.FiscalYear
AND inv.CompanyCode = accdoc.CompanyCode
WHERE
inv.CreationDate BETWEEN '{StartDate}' AND '{EndDate}'
AND inv.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')
)
-- 1. Invoice Document Created
SELECT
InvoiceDocument AS "InvoiceNumber",
'Invoice Document Created' AS "ActivityName",
CreationDateTime AS "EventTime",
CreatedByUser AS "UserName",
CompanyCode AS "CompanyCode",
VendorNumber AS "VendorNumber",
AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
PaymentDueDate AS "PaymentDueDate",
DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase
UNION ALL
-- 2. Invoice Parked
SELECT
i.InvoiceDocument AS "InvoiceNumber",
'Invoice Parked' AS "ActivityName",
i.CreationDateTime AS "EventTime",
i.CreatedByUser AS "UserName",
i.CompanyCode AS "CompanyCode",
i.Supplier AS "VendorNumber",
i.GrossInvoiceAmountInCoCoCrcy AS "AmountInCompanyCodeCurrency",
i.NetDueDate AS "PaymentDueDate",
i.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
i.PurchasingDocument AS "PurchasingDocument"
FROM I_InvoiceDocument AS i
WHERE
i.InvoiceDocumentIsParked = 'X'
AND i.CreationDate BETWEEN '{StartDate}' AND '{EndDate}'
AND i.CompanyCode IN ('{CompanyCode1}', '{CompanyCode2}')
UNION ALL
-- 3, 4, 5. Workflow activities (Sent for Approval, Approved, Rejected) from Change Docs
SELECT
cdpos.ObjectValue AS "InvoiceNumber",
CASE
WHEN cdpos.ValueNew = '[StatusSentForApproval]' THEN 'Invoice Sent For Approval'
WHEN cdpos.ValueNew = '[StatusApproved]' THEN 'Invoice Approved'
WHEN cdpos.ValueNew = '[StatusRejected]' THEN 'Invoice Rejected'
END AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.InvoiceDocument
WHERE
cdhdr.ObjectClassName = 'INCOMINGINVOICE'
AND cdpos.FieldName = '[WorkflowStatusFieldName]'
AND cdpos.ValueNew IN ('[StatusSentForApproval]', '[StatusApproved]', '[StatusRejected]')
UNION ALL
-- 6. Invoice Data Updated
SELECT
cdpos.ObjectValue AS "InvoiceNumber",
'Invoice Data Updated' AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.InvoiceDocument
WHERE
cdhdr.ObjectClassName = 'INCOMINGINVOICE'
AND cdpos.FieldName IN ('GrossInvoiceAmount', 'DocumentDate', 'PaymentTerms')
AND cdhdr.ChangeDate BETWEEN '{StartDate}' AND '{EndDate}'
UNION ALL
-- 7 & 8. Payment Block Set/Removed
SELECT
inv.InvoiceDocument AS "InvoiceNumber",
CASE
WHEN cdpos.ValueNew <> '' AND cdpos.ValueOld = '' THEN 'Payment Block Set'
WHEN cdpos.ValueNew = '' AND cdpos.ValueOld <> '' THEN 'Payment Block Removed'
END AS "ActivityName",
CAST(cdhdr.ChangeDate AS TIMESTAMP) + CAST(cdhdr.ChangeTime AS TIME) AS "EventTime",
cdhdr.UserName AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
cdpos.ValueNew AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM I_ChangeDocument AS cdhdr
JOIN I_ChangeDocumentItem AS cdpos ON cdhdr.ChangeDocument = cdpos.ChangeDocument
JOIN InvoiceBase AS inv ON cdpos.ObjectValue = inv.AccountingDocument
WHERE
cdhdr.ObjectClassName = 'BELEG'
AND cdpos.TableName = 'BSEG'
AND cdpos.FieldName = 'ZLSPR'
AND ( (cdpos.ValueNew <> '' AND cdpos.ValueOld = '') OR (cdpos.ValueNew = '' AND cdpos.ValueOld <> '') )
UNION ALL
-- 9. Invoice Posted
SELECT
inv.InvoiceDocument AS "InvoiceNumber",
'Invoice Posted' AS "ActivityName",
CAST(accdoc.PostingDate AS TIMESTAMP) AS "EventTime",
accdoc.CreatedByUser AS "UserName",
inv.CompanyCode AS "CompanyCode",
inv.VendorNumber AS "VendorNumber",
inv.AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
inv.PaymentDueDate AS "PaymentDueDate",
inv.DocumentType AS "DocumentType",
accdoc.PaymentBlockReason AS "PaymentBlockReason",
inv.PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase AS inv
JOIN I_OperationalAcctgDocItem AS accdoc ON inv.AccountingDocument = accdoc.AccountingDocument
WHERE inv.AccountingDocument IS NOT NULL AND inv.IsReversed = FALSE
UNION ALL
-- 10. Payment Proposal Created
SELECT
item.InvoiceReference AS "InvoiceNumber",
'Payment Proposal Created' AS "ActivityName",
CAST(prun.PaymentRunDate AS TIMESTAMP) AS "EventTime",
prun.CreatedByUser AS "UserName",
item.CompanyCode AS "CompanyCode",
item.Supplier AS "VendorNumber",
item.AmountInTransactionCurrency AS "AmountInCompanyCodeCurrency",
item.NetDueDate AS "PaymentDueDate",
item.AccountingDocumentType AS "DocumentType",
item.PaymentBlockReason AS "PaymentBlockReason",
item.PurchasingDocument AS "PurchasingDocument"
FROM I_PaymentProposalItem as item
JOIN I_PaymentRun as prun ON item.PaymentRunName = prun.PaymentRunName
JOIN InvoiceBase AS inv ON item.InvoiceReference = inv.InvoiceDocument
UNION ALL
-- 11 & 12. Payment Executed / Late Payment Executed
SELECT
InvoiceDocument AS "InvoiceNumber",
CASE
WHEN ClearingDate > PaymentDueDate THEN 'Late Payment Executed'
ELSE 'Payment Executed'
END AS "ActivityName",
CAST(ClearingDate AS TIMESTAMP) AS "EventTime",
CAST(NULL AS VARCHAR(12)) AS "UserName", -- User for clearing is not always straightforward
CompanyCode AS "CompanyCode",
VendorNumber AS "VendorNumber",
AmountInCompanyCodeCurrency AS "AmountInCompanyCodeCurrency",
PaymentDueDate AS "PaymentDueDate",
DocumentType AS "DocumentType",
'' AS "PaymentBlockReason",
PurchasingDocument AS "PurchasingDocument"
FROM InvoiceBase
WHERE ClearingDate IS NOT NULL AND IsReversed = FALSE
UNION ALL
-- 13. Invoice Reversed
SELECT
rev.OriginalInvoiceDocument AS "InvoiceNumber",
'Invoice Reversed' AS "ActivityName",
rev.CreationDateTime AS "EventTime",
rev.CreatedByUser AS "UserName",
rev.CompanyCode AS "CompanyCode",
rev.Supplier AS "VendorNumber",
rev.GrossInvoiceAmountInCoCoCrcy AS "AmountInCompanyCodeCurrency",
CAST(NULL AS DATE) AS "PaymentDueDate",
rev.DocumentType AS "DocumentType",
CAST(NULL AS VARCHAR(1)) AS "PaymentBlockReason",
rev.PurchasingDocument AS "PurchasingDocument"
FROM I_InvoiceDocument AS rev
WHERE rev.OriginalInvoiceDocument IN (SELECT InvoiceDocument FROM InvoiceBase) AND rev.IsReversal = 'X' ขั้นตอน
- ยืนยันว่าได้รับอนุมัติให้เข้าถึง tenant หรือ schema ของฐานข้อมูล SAP HANA โดยตรง และขอบัญชีฐานข้อมูลแบบอ่านอย่างเดียวที่มีสิทธิ์เข้าถึงตาราง SAP ที่จำเป็น รวมถึงตารางประวัติการเปลี่ยนแปลงหรือเวิร์กโฟลว์ที่ได้รับอนุมัติ ใช้ SAP HANA Database Explorer, SAP HANA Studio หรือ SQL client ที่ได้รับอนุมัติ ห้ามใช้สิทธิ์เขียนข้อมูลในระบบจริง
- ตรวจสอบชื่อ table และ column จริงในระบบ S/4HANA เป้าหมาย โดยทั่วไปเริ่มจาก ACDOCA, BKPF และ RBKP ได้ แต่ข้อมูลเวิร์กโฟลว์ การพักรายการ ข้อเสนอการชำระเงิน การดำเนินการชำระเงิน ประวัติการเปลี่ยนแปลง และประวัติการระงับการชำระเงิน อาจอยู่ในออบเจ็กต์ที่แตกต่างกันตามรุ่นหรือการปรับแต่งขององค์กร แทนที่ placeholder ในวงเล็บเหลี่ยมแต่ละรายการด้วยออบเจ็กต์ที่ตรวจสอบแล้วจาก system catalog และตรงกับความหมายทางธุรกิจ
- กำหนดช่วงดึงข้อมูลด้วย [Start timestamp] และ [End timestamp] ดึงข้อมูลเอกสารและกิจกรรมให้ครอบคลุมเพียงพอ โดยปกติใช้ช่วง 3 ถึง 6 เดือน และขยายช่วงเมื่อวันครบกำหนดชำระหรือการชำระล่าช้าอยู่นอกช่วงวันที่สร้างใบแจ้งหนี้
- ระบุกรณีใบแจ้งหนี้ด้วยคีย์ที่กำหนดไว้ คิวรีใช้ InvoiceNumber เป็นรหัสกรณี และรวมรหัสบริษัทกับปีงบประมาณไว้ภายในเมื่อจำเป็นเพื่อป้องกันรหัสซ้ำ ตรวจสอบว่าคำจำกัดความทางธุรกิจต้องใช้ปีงบประมาณหรือรหัสบริษัทเป็นส่วนหนึ่งของรหัสกรณีใน ProcessMind เพิ่มเติมหรือไม่
- จับคู่ข้อมูลใบแจ้งหนี้ที่ผ่านรายการจาก RBKP, BKPF และ ACDOCA ใช้ RBKP สำหรับข้อมูลส่วนหัวใบแจ้งหนี้, BKPF สำหรับ timestamp และผู้ใช้ของเอกสารบัญชี และ ACDOCA สำหรับข้อมูลผู้ขาย จำนวนเงิน เอกสารจัดซื้อ การเคลียร์รายการ และรายการบัญชีที่เกี่ยวกับการชำระเงินเมื่อมีข้อมูล อย่าสมมติว่าทุกฟิลด์มีข้อมูลในทุกกรณีที่ผ่านรายการ
- จับคู่กิจกรรมการพักรายการ การอนุมัติ การปฏิเสธ การอัปเดต การระงับการชำระเงิน การกลับรายการ ข้อเสนอการชำระเงิน และการดำเนินการชำระเงินจากแหล่งข้อมูลเฉพาะระบบที่ตรวจสอบแล้ว แทนที่ view ต้นทางใน placeholder ด้วย view หรือตารางที่ได้รับอนุมัติ ซึ่งมี timestamp ของกิจกรรม ข้อมูลอ้างอิงใบแจ้งหนี้ ผู้ใช้ สถานะ และค่าเดิมกับค่าใหม่ ต้องส่งออกแต่ละกิจกรรมเป็นแถวเหตุการณ์โดยตรง เพราะ ProcessMind ไม่ได้อนุมานกิจกรรมให้
- เรียกใช้คิวรี SQL ฉบับสมบูรณ์ในเซสชันที่ไม่ใช่ระบบจริงหรือเป็นแบบอ่านอย่างเดียว ตรวจสอบแผนการทำงานและจำกัดคิวรีตามรหัสบริษัท ประเภทเอกสาร ปีงบประมาณ และ timestamp ของกิจกรรมตามความเหมาะสม หลีกเลี่ยงการ join ตารางรายการบัญชีและตารางประวัติขนาดใหญ่โดยไม่มีเงื่อนไขจำกัด
- ตรวจสอบผลลัพธ์ตามรายการตรวจสอบด้านล่าง ยืนยันว่ามีคอลัมน์ที่จำเป็นครบทุกคอลัมน์, EventTime มีค่าสำหรับทุกกิจกรรม, InvoiceNumber มีค่าสำหรับทุกกรณี และพบชื่อกิจกรรมทั้ง 13 รายการเมื่อมีข้อมูลต้นทางที่เกี่ยวข้อง
- ส่งออกผลลัพธ์เป็นไฟล์แบบมีตัวคั่นที่ ProcessMind รองรับ โดยแนะนำให้ใช้ CSV เข้ารหัส UTF-8 และมีหนึ่งแถวต่อเหตุการณ์ พร้อมคอลัมน์ InvoiceNumber, ActivityName, EventTime, UserName, CompanyCode, VendorNumber, AmountInCompanyCodeCurrency, PaymentDueDate, DocumentType, PaymentBlockReason และ PurchasingDocument ใช้เขตเวลาเดียวกันกับ timestamp ทั้งหมด และคงเลขศูนย์นำหน้าในรหัสต่าง ๆ
- อัปโหลดบันทึกเหตุการณ์ไปยัง ProcessMind แล้วกำหนด InvoiceNumber เป็นรหัสกรณี, ActivityName เป็นคอลัมน์กิจกรรม และ EventTime เป็นคอลัมน์ timestamp หากการตั้งค่า ProcessMind รองรับคีย์กรณีเพิ่มเติม ให้ใช้นโยบายคีย์ผสมแบบเดียวกับที่ใช้ตอนดึงข้อมูล.
การกำหนดค่า
- ช่วงวันที่: เริ่มดึงข้อมูลย้อนหลังแบบต่อเนื่อง 3 ถึง 6 เดือน เพิ่มข้อมูลย้อนหลังหากกิจกรรมอนุมัติ การชำระเงิน การเคลียร์รายการ การกลับรายการ หรือการชำระล่าช้าเกิดขึ้นหลังช่วงที่สร้างใบแจ้งหนี้
- ขอบเขตบริษัท: กรองด้วย [Company code filter] และตรวจสอบว่ารหัสบริษัทที่เลือกได้รับอนุญาตให้ดึงข้อมูล
- ขอบเขตเอกสาร: กรองด้วย [Document type filter] และรวมประเภทเอกสารที่ใช้แทนใบแจ้งหนี้ผู้ขาย ใบลดหนี้ ใบแจ้งหนี้ที่พักรายการ และรายการกลับรายการในกระบวนการเป้าหมาย
- รหัสกรณี: ใช้ InvoiceNumber ตามคำจำกัดความของกระบวนการ หากหมายเลขใบแจ้งหนี้ไม่ซ้ำกันทั่วทั้งระบบ ให้เก็บรหัสบริษัทและปีงบประมาณไว้ในผลลัพธ์ต้นทาง หรือกำหนดคีย์กรณีแบบผสมให้สอดคล้องกับโมเดล ProcessMind
- แหล่งกิจกรรม: ตรวจสอบแหล่งข้อมูลจริงสำหรับการเปลี่ยนสถานะเวิร์กโฟลว์ การตัดสินใจอนุมัติ การพักรายการ ประวัติการเปลี่ยนแปลง การระงับการชำระเงิน ข้อเสนอการชำระเงิน และการดำเนินการชำระเงิน แหล่งข้อมูลเหล่านี้แตกต่างกันตามรุ่น S/4HANA ขอบเขตที่เปิดใช้งาน รูปแบบเวิร์กโฟลว์ และส่วนขยายเฉพาะขององค์กร
- แนวทางใช้ timestamp: เลือก timestamp ของกิจกรรมทางธุรกิจ ไม่ใช่ timestamp ตอนดึงข้อมูล ระบุเขตเวลาและแปลง timestamp ของทุกกิจกรรมให้เป็นรูปแบบเดียวกันก่อนอัปโหลด
- แนวทางใช้จำนวนเงิน: ใช้จำนวนเงินในสกุลเงินของรหัสบริษัท และตรวจสอบว่าแหล่งข้อมูลที่เลือกจัดเก็บเครื่องหมายเดบิตและเครดิตอย่างสม่ำเสมอหรือไม่ อย่ารวมยอดรายการบัญชีจนกว่าจะตรวจสอบกฎการรวมสำหรับกรณีใบแจ้งหนี้แล้ว
- แนวทางกำหนดการชำระเงิน: ระบุว่า Payment Executed หมายถึงการเคลียร์รายการ การผ่านรายการเอกสารชำระเงิน การดำเนินการผ่านธนาคาร หรือหมุดหมายทางธุรกิจอื่น ใช้แหล่งข้อมูลที่ตรงกับคำจำกัดความของกระบวนการที่ตกลงกัน
- การชำระล่าช้า: ส่งออก Late Payment Executed เฉพาะเมื่อ Payment Executed เกิดขึ้นหลัง PaymentDueDate คิวรีจะคำนวณกิจกรรมนี้โดยตรง ไม่ได้อาศัยการอนุมานจาก ProcessMind
- ประสิทธิภาพ: จำกัดการอ่านข้อมูลต้นทางตามวันที่ รหัสบริษัท ประเภทเอกสาร และปีงบประมาณที่เกี่ยวข้อง เลือกเฉพาะคอลัมน์ที่จำเป็น ตรวจสอบแผนการทำงานของคิวรี และสร้าง view ชั่วคราวที่ได้รับอนุมัติหากตารางประวัติมีขนาดใหญ่
- ข้อกำหนดเบื้องต้น: ต้องเชื่อมต่อ SAP HANA ได้ มีสิทธิ์อ่านออบเจ็กต์ที่เลือกทั้งหมด มีสิทธิ์ตรวจสอบ metadata และเข้าถึงข้อมูลเจ้าหนี้ บัญชีแยกประเภททั่วไป การจัดซื้อ เวิร์กโฟลว์ และการชำระเงินที่เกี่ยวข้อง ตรวจสอบว่ามีใบอนุญาต SAP นโยบายการเข้าถึงฐานข้อมูล และการอนุมัติด้านการคุ้มครองข้อมูลที่จำเป็นครบถ้วน
- ความปลอดภัย: ใช้บัญชีเทคนิคแบบอ่านอย่างเดียว ปกป้องข้อมูลผู้ขายและข้อมูลการชำระเงิน และปฏิบัติตามนโยบายขององค์กรเกี่ยวกับการขนส่งระบบ การตรวจสอบ การปกปิดข้อมูล และการจัดการข้อมูลรับรอง.
ตัวอย่างคำค้น sql
WITH
invoice_base AS (
SELECT
r.INV_DOC_NO AS InvoiceNumber,
r.COMPANY_CODE AS CompanyCode,
r.FISCAL_YEAR AS FiscalYear,
r.DOCUMENT_TYPE AS DocumentType,
r.VENDOR_NO AS VendorNumber,
r.GROSS_AMOUNT_CC AS AmountInCompanyCodeCurrency,
r.PAYMENT_DUE_DATE AS PaymentDueDate,
r.PURCHASING_DOCUMENT AS PurchasingDocument,
r.CREATED_AT AS InvoiceCreatedAt,
r.CREATED_BY AS InvoiceCreatedBy
FROM [Your RBKP invoice header source] r
WHERE r.CREATED_AT >= '[Start timestamp]'
AND r.CREATED_AT < '[End timestamp]'
AND r.COMPANY_CODE IN ([Company code filter])
AND r.DOCUMENT_TYPE IN ([Document type filter])
),
posted_accounting AS (
SELECT
b.INV_DOC_NO AS InvoiceNumber,
b.COMPANY_CODE AS CompanyCode,
b.FISCAL_YEAR AS FiscalYear,
b.ACCOUNTING_DOCUMENT AS AccountingDocument,
b.POSTING_DATE AS PostingDate,
b.CREATED_AT AS PostedAt,
b.CREATED_BY AS PostedBy,
b.REVERSAL_DOCUMENT AS ReversalDocument,
b.REVERSED_DOCUMENT AS ReversedDocument
FROM [Your BKPF accounting document source] b
WHERE b.CREATED_AT >= '[Start timestamp]'
AND b.CREATED_AT < '[End timestamp]'
AND b.COMPANY_CODE IN ([Company code filter])
),
journal_attributes AS (
SELECT
a.COMPANY_CODE AS CompanyCode,
a.FISCAL_YEAR AS FiscalYear,
a.ACCOUNTING_DOCUMENT AS AccountingDocument,
MAX(a.VENDOR_NO) AS VendorNumber,
SUM(a.AMOUNT_IN_COMPANY_CODE_CURRENCY) AS AmountInCompanyCodeCurrency,
MAX(a.PURCHASING_DOCUMENT) AS PurchasingDocument,
MAX(a.CLEARING_DATE) AS ClearingDate,
MAX(a.CLEARING_DOCUMENT) AS ClearingDocument
FROM [Your ACDOCA universal journal source] a
WHERE a.COMPANY_CODE IN ([Company code filter])
AND a.POSTING_DATE >= '[Start date]'
AND a.POSTING_DATE < '[End date]'
GROUP BY
a.COMPANY_CODE,
a.FISCAL_YEAR,
a.ACCOUNTING_DOCUMENT
),
source_events AS (
SELECT
e.INV_DOC_NO AS InvoiceNumber,
e.COMPANY_CODE AS CompanyCode,
e.FISCAL_YEAR AS FiscalYear,
e.EVENT_TIMESTAMP AS EventTime,
e.EVENT_USER AS UserName,
e.PAYMENT_BLOCK_REASON AS PaymentBlockReason,
e.PURCHASING_DOCUMENT AS PurchasingDocument,
e.VENDOR_NO AS VendorNumber,
e.AMOUNT_IN_COMPANY_CODE_CURRENCY AS AmountInCompanyCodeCurrency,
e.PAYMENT_DUE_DATE AS PaymentDueDate,
e.DOCUMENT_TYPE AS DocumentType,
e.EVENT_TYPE AS SourceEventType
FROM [Your verified invoice event and workflow source] e
WHERE e.EVENT_TIMESTAMP >= '[Start timestamp]'
AND e.EVENT_TIMESTAMP < '[End timestamp]'
AND e.COMPANY_CODE IN ([Company code filter])
),
base_events AS (
SELECT
i.InvoiceNumber,
'Invoice Document Created' AS ActivityName,
i.InvoiceCreatedAt AS EventTime,
i.InvoiceCreatedBy AS UserName,
i.CompanyCode,
COALESCE(i.VendorNumber, j.VendorNumber) AS VendorNumber,
COALESCE(i.AmountInCompanyCodeCurrency, j.AmountInCompanyCodeCurrency) AS AmountInCompanyCodeCurrency,
i.PaymentDueDate,
i.DocumentType,
CAST(NULL AS NVARCHAR(20)) AS PaymentBlockReason,
COALESCE(i.PurchasingDocument, j.PurchasingDocument) AS PurchasingDocument
FROM invoice_base i
LEFT JOIN posted_accounting p
ON p.InvoiceNumber = i.InvoiceNumber
AND p.CompanyCode = i.CompanyCode
AND p.FiscalYear = i.FiscalYear
LEFT JOIN journal_attributes j
ON j.CompanyCode = p.CompanyCode
AND j.FiscalYear = p.FiscalYear
AND j.AccountingDocument = p.AccountingDocument
WHERE i.InvoiceCreatedAt IS NOT NULL
UNION ALL
SELECT
s.InvoiceNumber,
'Invoice Parked' AS ActivityName,
s.EventTime,
s.UserName,
s.CompanyCode,
COALESCE(s.VendorNumber, i.VendorNumber) AS VendorNumber,
COALESCE(s.AmountInCompanyCodeCurrency, i.AmountInCompanyCodeCurrency) AS AmountInCompanyCodeCurrency,
COALESCE(s.PaymentDueDate, i.PaymentDueDate) AS PaymentDueDate,
COALESCE(s.DocumentType, i.DocumentType) AS DocumentType,
s.PaymentBlockReason,
COALESCE(s.PurchasingDocument, i.PurchasingDocument) AS PurchasingDocument
FROM source_events s
LEFT JOIN invoice_base i ON i.InvoiceNumber = s.InvoiceNumber AND i.CompanyCode = s.CompanyCode AND i.FiscalYear = s.FiscalYear
WHERE s.SourceEventType = 'PARKED'
UNION ALL
SELECT s.InvoiceNumber, 'Invoice Sent For Approval', s.EventTime, s.UserName, s.CompanyCode, COALESCE(s.VendorNumber, i.VendorNumber), COALESCE(s.AmountInCompanyCodeCurrency, i.AmountInCompanyCodeCurrency), COALESCE(s.PaymentDueDate, i.PaymentDueDate), COALESCE(s.DocumentType, i.DocumentType), s.PaymentBlockReason, COALESCE(s.PurchasingDocument, i.PurchasingDocument)
FROM source_events s LEFT JOIN invoice_base i ON i.InvoiceNumber = s.InvoiceNumber AND i.CompanyCode = s.CompanyCode AND i.FiscalYear = s.FiscalYear
WHERE s.SourceEventType = 'SENT_FOR_APPROVAL'
UNION ALL
SELECT s.InvoiceNumber, 'Invoice Approved', s.EventTime, s.UserName, s.CompanyCode, COALESCE(s.VendorNumber, i.VendorNumber), COALESCE(s.AmountInCompanyCodeCurrency, i.AmountInCompanyCodeCurrency), COALESCE(s.PaymentDueDate, i.PaymentDueDate), COALESCE(s.DocumentType, i.DocumentType), s.PaymentBlockReason, COALESCE(s.PurchasingDocument, i.PurchasingDocument)
FROM source_events s LEFT JOIN invoice_base i ON i.InvoiceNumber = s.InvoiceNumber AND i.CompanyCode = s.CompanyCode AND i.FiscalYear = s.FiscalYear
WHERE s.SourceEventType = 'APPROVED'
UNION ALL
SELECT s.InvoiceNumber, 'Invoice Rejected', s.EventTime, s.UserName, s.CompanyCode, COALESCE(s.VendorNumber, i.VendorNumber), COALESCE(s.AmountInCompanyCodeCurrency, i.AmountInCompanyCodeCurrency), COALESCE(s.PaymentDueDate, i.PaymentDueDate), COALESCE(s.DocumentType, i.DocumentType), s.PaymentBlockReason, COALESCE(s.PurchasingDocument, i.PurchasingDocument)
FROM source_events s LEFT JOIN invoice_base i ON i.InvoiceNumber = s.InvoiceNumber AND i.CompanyCode = s.CompanyCode AND i.FiscalYear = s.FiscalYear
WHERE s.SourceEventType = 'REJECTED'
UNION ALL
SELECT s.InvoiceNumber, 'Invoice Data Updated', s.EventTime, s.UserName, s.CompanyCode, COALESCE(s.VendorNumber, i.VendorNumber), COALESCE(s.AmountInCompanyCodeCurrency, i.AmountInCompanyCodeCurrency), COALESCE(s.PaymentDueDate, i.PaymentDueDate), COALESCE(s.DocumentType, i.DocumentType), s.PaymentBlockReason, COALESCE(s.PurchasingDocument, i.PurchasingDocument)
FROM source_events s LEFT JOIN invoice_base i ON i.InvoiceNumber = s.InvoiceNumber AND i.CompanyCode = s.CompanyCode AND i.FiscalYear = s.FiscalYear
WHERE s.SourceEventType = 'DATA_UPDATED'
UNION ALL
SELECT s.InvoiceNumber, 'Payment Block Set', s.EventTime, s.UserName, s.CompanyCode, COALESCE(s.VendorNumber, i.VendorNumber), COALESCE(s.AmountInCompanyCodeCurrency, i.AmountInCompanyCodeCurrency), COALESCE(s.PaymentDueDate, i.PaymentDueDate), COALESCE(s.DocumentType, i.DocumentType), s.PaymentBlockReason, COALESCE(s.PurchasingDocument, i.PurchasingDocument)
FROM source_events s LEFT JOIN invoice_base i ON i.InvoiceNumber = s.InvoiceNumber AND i.CompanyCode = s.CompanyCode AND i.FiscalYear = s.FiscalYear
WHERE s.SourceEventType = 'PAYMENT_BLOCK_SET'
UNION ALL
SELECT s.InvoiceNumber, 'Payment Block Removed', s.EventTime, s.UserName, s.CompanyCode, COALESCE(s.VendorNumber, i.VendorNumber), COALESCE(s.AmountInCompanyCodeCurrency, i.AmountInCompanyCodeCurrency), COALESCE(s.PaymentDueDate, i.PaymentDueDate), COALESCE(s.DocumentType, i.DocumentType), s.PaymentBlockReason, COALESCE(s.PurchasingDocument, i.PurchasingDocument)
FROM source_events s LEFT JOIN invoice_base i ON i.InvoiceNumber = s.InvoiceNumber AND i.CompanyCode = s.CompanyCode AND i.FiscalYear = s.FiscalYear
WHERE s.SourceEventType = 'PAYMENT_BLOCK_REMOVED'
UNION ALL
SELECT
i.InvoiceNumber,
'Invoice Posted',
p.PostedAt,
p.PostedBy,
i.CompanyCode,
COALESCE(i.VendorNumber, j.VendorNumber),
COALESCE(i.AmountInCompanyCodeCurrency, j.AmountInCompanyCodeCurrency),
i.PaymentDueDate,
i.DocumentType,
CAST(NULL AS NVARCHAR(20)),
COALESCE(i.PurchasingDocument, j.PurchasingDocument)
FROM invoice_base i
INNER JOIN posted_accounting p ON p.InvoiceNumber = i.InvoiceNumber AND p.CompanyCode = i.CompanyCode AND p.FiscalYear = i.FiscalYear
LEFT JOIN journal_attributes j ON j.CompanyCode = p.CompanyCode AND j.FiscalYear = p.FiscalYear AND j.AccountingDocument = p.AccountingDocument
WHERE p.PostedAt IS NOT NULL
UNION ALL
SELECT s.InvoiceNumber, 'Payment Proposal Created', s.EventTime, s.UserName, s.CompanyCode, COALESCE(s.VendorNumber, i.VendorNumber), COALESCE(s.AmountInCompanyCodeCurrency, i.AmountInCompanyCodeCurrency), COALESCE(s.PaymentDueDate, i.PaymentDueDate), COALESCE(s.DocumentType, i.DocumentType), s.PaymentBlockReason, COALESCE(s.PurchasingDocument, i.PurchasingDocument)
FROM source_events s LEFT JOIN invoice_base i ON i.InvoiceNumber = s.InvoiceNumber AND i.CompanyCode = s.CompanyCode AND i.FiscalYear = s.FiscalYear
WHERE s.SourceEventType = 'PAYMENT_PROPOSAL_CREATED'
UNION ALL
SELECT s.InvoiceNumber, 'Payment Executed', s.EventTime, s.UserName, s.CompanyCode, COALESCE(s.VendorNumber, i.VendorNumber), COALESCE(s.AmountInCompanyCodeCurrency, i.AmountInCompanyCodeCurrency), COALESCE(s.PaymentDueDate, i.PaymentDueDate), COALESCE(s.DocumentType, i.DocumentType), s.PaymentBlockReason, COALESCE(s.PurchasingDocument, i.PurchasingDocument)
FROM source_events s LEFT JOIN invoice_base i ON i.InvoiceNumber = s.InvoiceNumber AND i.CompanyCode = s.CompanyCode AND i.FiscalYear = s.FiscalYear
WHERE s.SourceEventType = 'PAYMENT_EXECUTED'
UNION ALL
SELECT s.InvoiceNumber, 'Late Payment Executed', s.EventTime, s.UserName, s.CompanyCode, COALESCE(s.VendorNumber, i.VendorNumber), COALESCE(s.AmountInCompanyCodeCurrency, i.AmountInCompanyCodeCurrency), COALESCE(s.PaymentDueDate, i.PaymentDueDate), COALESCE(s.DocumentType, i.DocumentType), s.PaymentBlockReason, COALESCE(s.PurchasingDocument, i.PurchasingDocument)
FROM source_events s LEFT JOIN invoice_base i ON i.InvoiceNumber = s.InvoiceNumber AND i.CompanyCode = s.CompanyCode AND i.FiscalYear = s.FiscalYear
WHERE s.SourceEventType = 'PAYMENT_EXECUTED'
AND s.EventTime > CAST(COALESCE(s.PaymentDueDate, i.PaymentDueDate) AS TIMESTAMP)
UNION ALL
SELECT
i.InvoiceNumber,
'Invoice Reversed',
p.ReversalEventAt,
p.ReversalUser,
i.CompanyCode,
COALESCE(i.VendorNumber, j.VendorNumber),
COALESCE(i.AmountInCompanyCodeCurrency, j.AmountInCompanyCodeCurrency),
i.PaymentDueDate,
i.DocumentType,
CAST(NULL AS NVARCHAR(20)),
COALESCE(i.PurchasingDocument, j.PurchasingDocument)
FROM invoice_base i
INNER JOIN [Your verified reversal event source] p ON p.INV_DOC_NO = i.InvoiceNumber AND p.COMPANY_CODE = i.CompanyCode AND p.FISCAL_YEAR = i.FiscalYear
LEFT JOIN journal_attributes j ON j.CompanyCode = p.COMPANY_CODE AND j.FiscalYear = p.FISCAL_YEAR AND j.AccountingDocument = p.ACCOUNTING_DOCUMENT
WHERE p.ReversalEventAt IS NOT NULL
)
SELECT
InvoiceNumber,
ActivityName,
EventTime,
UserName,
CompanyCode,
VendorNumber,
AmountInCompanyCodeCurrency,
PaymentDueDate,
DocumentType,
PaymentBlockReason,
PurchasingDocument
FROM base_events
WHERE InvoiceNumber IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY InvoiceNumber, EventTime, ActivityName; ขั้นตอน
- เปิด ABAP Editor: เข้าสู่ระบบ SAP S/4HANA แล้วเปิด transaction
SE38(ABAP Editor) - สร้างโปรแกรม: ป้อนชื่อโปรแกรมใหม่ในช่อง Program เช่น
Z_PM_INVOICE_EXTRACTแล้วคลิกปุ่ม 'Create' ระบุชื่อเรื่อง ตั้ง Type เป็น 'Executable Program' และบันทึกไว้ใน package ที่เหมาะสม - กำหนดโครงสร้างโปรแกรมและหน้าจอเลือกข้อมูล: ใน editor ให้กำหนดโครงสร้างข้อมูลสำหรับผลลัพธ์บันทึกเหตุการณ์ จากนั้นสร้างหน้าจอเลือกข้อมูลเพื่อให้ผู้ใช้ระบุพารามิเตอร์ เช่น ช่วงวันที่บันทึกใบแจ้งหนี้ รหัสบริษัท และประเภทเอกสาร วิธีนี้ช่วยให้เรียกใช้โปรแกรมซ้ำและปรับเปลี่ยนได้สะดวก
- เขียนตรรกะเลือกข้อมูล: เขียนคำสั่ง ABAP SQL หลักเพื่อเลือกข้อมูลจากตาราง SAP ต่าง ๆ โปรแกรมจะเรียกข้อมูลตามลำดับสำหรับกิจกรรมที่จำเป็นทั้ง 13 รายการ
- ดึงข้อมูลส่วนหัวและรายการ: สำหรับกิจกรรมพื้นฐาน เช่น 'Invoice Document Created' และ 'Invoice Posted' ให้เลือกข้อมูลจากตารางหลัก เช่น
RBKP(ส่วนหัวใบแจ้งหนี้โลจิสติกส์) และBKPF(ส่วนหัวเอกสารบัญชี) - ดึงข้อมูลเอกสารการเปลี่ยนแปลง: สำหรับกิจกรรม เช่น 'Payment Block Set' และ 'Payment Block Removed' ให้เรียกข้อมูลจากตารางเอกสารการเปลี่ยนแปลง
CDHDR(ส่วนหัวเอกสารการเปลี่ยนแปลง) และCDPOS(รายการเอกสารการเปลี่ยนแปลง) โดยระบุการเปลี่ยนแปลงของฟิลด์ที่เกี่ยวข้อง เช่นZLSPRในตารางBSEG - ดึงข้อมูลการชำระเงิน: หากต้องการบันทึกกิจกรรมเกี่ยวกับการชำระเงิน ให้เรียกข้อมูลจากตาราง เช่น
REGUP(รายการที่ประมวลผลโดยโปรแกรมการชำระเงิน) สำหรับข้อเสนอการชำระเงิน และBSAK(รายการเจ้าหนี้ที่เคลียร์แล้ว) สำหรับการชำระเงินจริง แยก 'Late Payment Executed' โดยเปรียบเทียบวันที่เคลียร์รายการ (AUGDT) กับวันครบกำหนดสุทธิ (ZFBDT) - ดึงข้อมูลเวิร์กโฟลว์: สำหรับกิจกรรมอนุมัติ ให้เรียกข้อมูลจากตาราง SAP Business Workflow เช่น
SWW_WI2OBJเพื่อเชื่อมรายการเวิร์กโฟลว์กับออบเจ็กต์ใบแจ้งหนี้ ขั้นตอนนี้ขึ้นอยู่กับการตั้งค่าเวิร์กโฟลว์ของคุณอย่างมาก และอาจต้องปรับแก้หลายส่วน - รวมข้อมูลให้อยู่ในรูปแบบบันทึกเหตุการณ์: จัดรูปแบบข้อมูลของแต่ละกิจกรรมให้อยู่ในโครงสร้างตารางภายในเดียวกัน แต่ละแถวแทนหนึ่งเหตุการณ์และต้องมีรหัสกรณี (
InvoiceNumber),ActivityNameและEventTimeรวมถึงแอตทริบิวต์แนะนำอื่น ๆ - สร้างไฟล์ผลลัพธ์: ใช้คำสั่ง ABAP
OPEN DATASET,TRANSFERและCLOSE DATASETเพื่อเขียนข้อมูลจากตารางภายในสุดท้ายลงในไฟล์บน SAP application server แนะนำให้ใช้รูปแบบ CSV - กำหนดเวลาและเรียกใช้โปรแกรม: เรียกใช้โปรแกรมใน foreground เพื่อทดสอบ (ใช้
F8) สำหรับการใช้งานจริง ให้กำหนดเป็น background job ด้วย transactionSM36และเรียกใช้ในช่วงที่ระบบมีการใช้งานน้อย เพื่อไม่ให้กระทบประสิทธิภาพระบบ - นำไฟล์ออกและอัปโหลด: ใช้ transaction
AL11ไปยังไดเรกทอรีบน application server ที่บันทึกไฟล์ไว้ ดาวน์โหลดไฟล์มายังเครื่องของคุณ ตรวจสอบว่าไฟล์เข้ารหัส UTF-8 และจัดรูปแบบถูกต้องก่อนอัปโหลดไปยังเครื่องมือ process mining
การกำหนดค่า
- ช่วงวันที่: กำหนดช่วงวันที่ดึงข้อมูลโดยอิงจากวันที่บันทึกใบแจ้งหนี้ (
RBKP-CPUDT) หรือวันที่ผ่านรายการ (BKPF-BUDAT) สำหรับการวิเคราะห์ครั้งแรก แนะนำให้ใช้ช่วง 3 ถึง 6 เดือนเพื่อควบคุมปริมาณข้อมูล - รหัสบริษัท (BUKRS): ต้องกรองด้วยรหัสบริษัทอย่างน้อยหนึ่งค่า การดึงข้อมูลจากรหัสบริษัททั้งหมดในองค์กรขนาดใหญ่อาจใช้เวลานานมากและทำให้ได้ไฟล์ขนาดใหญ่
- ประเภทเอกสาร (BLART): กรองตามประเภทเอกสารที่เกี่ยวข้องเพื่อแยกใบแจ้งหนี้ผู้ขาย ประเภทที่พบบ่อย ได้แก่ 'RE' (ใบแจ้งหนี้ยอดรวม) และ 'KR' (ใบแจ้งหนี้ผู้ขาย) วิธีนี้ช่วยตัดเอกสารที่ไม่เกี่ยวข้องออกจากการวิเคราะห์
- บัญชีผู้ขาย (LIFNR): โปรแกรมสามารถเพิ่มตัวกรองหมายเลขผู้ขายเฉพาะรายได้ ซึ่งมีประโยชน์สำหรับการวิเคราะห์แบบเจาะจงหรือการทดสอบ
- การตั้งค่าไฟล์ผลลัพธ์: โปรแกรมควรมีพารามิเตอร์สำหรับกำหนดพาธไฟล์ผลลัพธ์บน application server และตัวคั่นฟิลด์ เช่น จุลภาคหรืออัฒภาค
- ข้อกำหนดเบื้องต้น: ผู้ใช้หรือบัญชีระบบที่เรียกใช้โปรแกรมต้องมีสิทธิ์นักพัฒนาเพื่อสร้างและเรียกใช้โปรแกรม ABAP ผ่าน
SE38รวมถึงสิทธิ์อ่านข้อมูลอย่างครอบคลุมในตาราง FI, MM และ Basis เช่นBKPF,BSEG,RBKP,RSEG,CDHDR,CDPOSและตารางเวิร์กโฟลว์.
ตัวอย่างคำค้น abap
REPORT Z_PM_INVOICE_EXTRACT.
* --- Internal table structure for the final event log
TYPES: BEGIN OF ty_s_event_log,
invoicenumber TYPE char25,
activityname TYPE char50,
eventtime TYPE char19, "YYYY-MM-DD HH:MM:SS
username TYPE sy-uname,
companycode TYPE bukrs,
vendornumber TYPE lifnr,
amountincompanycodecurrency TYPE wrbtr,
paymentduedate TYPE char10, "YYYY-MM-DD
documenttype TYPE blart,
paymentblockreason TYPE char1,
purchasingdocument TYPE ebeln,
END OF ty_s_event_log.
DATA: lt_event_log TYPE STANDARD TABLE OF ty_s_event_log.
DATA: ls_event_log TYPE ty_s_event_log.
* --- Selection Screen for user inputs
PARAMETERS: p_path TYPE string DEFAULT '/usr/sap/tmp/invoice_events.csv'.
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY, " Entry Date
s_bukrs FOR bkpf-bukrs OBLIGATORY, " Company Code
s_blart FOR bkpf-blart. " Document Type
START-OF-SELECTION.
* --- 1. Invoice Document Created (from Logistics Invoice Verification)
SELECT CONCAT( rbkp~belnr, rbkp~gjahr ) AS invoicenumber,
'Invoice Document Created' AS activityname,
CONCAT( rbkp~cpudt, rbkp~cputm ) AS eventtime,
rbkp~usnam AS username,
rbkp~bukrs AS companycode,
rbkp~lifnr AS vendornumber,
rbkp~rmwwr AS amountincompanycodecurrency,
'' AS paymentduedate,
rbkp~blart AS documenttype,
rbkp~zuonr AS paymentblockreason,
'' AS purchasingdocument
FROM rbkp
INTO TABLE @DATA(lt_created)
WHERE rbkp~cpudt IN @s_erdat
AND rbkp~bukrs IN @s_bukrs
AND rbkp~blart IN @s_blart.
LOOP AT lt_created INTO DATA(ls_created).
ls_event_log-invoicenumber = ls_created-invoicenumber.
ls_event_log-activityname = ls_created-activityname.
ls_event_log-eventtime = |{ ls_created-eventtime(8) } { ls_created-eventtime+8(2) }:{ ls_created-eventtime+10(2) }:{ ls_created-eventtime+12(2) }|.
ls_event_log-username = ls_created-username.
ls_event_log-companycode = ls_created-companycode.
ls_event_log-vendornumber = ls_created-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_created-amountincompanycodecurrency.
ls_event_log-paymentduedate = ''.
ls_event_log-documenttype = ls_created-documenttype.
ls_event_log-paymentblockreason = ''.
ls_event_log-purchasingdocument = ls_created-purchasingdocument.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 2. Invoice Parked (assuming status 'A' or 'B' in RBKP)
SELECT CONCAT( belnr, gjahr ) AS invoicenumber,
'Invoice Parked' AS activityname,
CONCAT( cpudt, cputm ) AS eventtime,
usnam AS username,
bukrs AS companycode,
lifnr AS vendornumber,
rmwwr AS amountincompanycodecurrency,
'' AS paymentduedate,
blart AS documenttype,
'' AS paymentblockreason,
'' AS purchasingdocument
FROM rbkp
INTO TABLE @DATA(lt_parked)
WHERE rbstat IN ('A', 'B')
AND cpudt IN @s_erdat
AND bukrs IN @s_bukrs
AND blart IN @s_blart.
LOOP AT lt_parked INTO DATA(ls_parked).
ls_event_log-invoicenumber = ls_parked-invoicenumber.
ls_event_log-activityname = ls_parked-activityname.
ls_event_log-eventtime = |{ ls_parked-eventtime(8) } { ls_parked-eventtime+8(2) }:{ ls_parked-eventtime+10(2) }:{ ls_parked-eventtime+12(2) }|.
ls_event_log-username = ls_parked-username.
ls_event_log-companycode = ls_parked-companycode.
ls_event_log-vendornumber = ls_parked-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_parked-amountincompanycodecurrency.
ls_event_log-paymentduedate = ''.
ls_event_log-documenttype = ls_parked-documenttype.
ls_event_log-paymentblockreason = ''.
ls_event_log-purchasingdocument = ''.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 3, 4, 5. Sent For Approval, Approved, Rejected (Placeholder logic, needs adaptation)
* --- This logic is a generic template for SAP Business Workflow.
* --- Your implementation will vary. You must identify the correct workflow tasks.
SELECT obj.instid, wi.wi_cd, wi.wi_ct, wi.wi_stat, wi.wi_aagent
FROM sww_wi2obj AS obj
JOIN swwlog AS wi ON obj~instid = wi~wi_id
INTO TABLE @DATA(lt_workflow)
WHERE obj~typeid = 'BUS2081' " Business Object for Incoming Invoice
AND obj~catid = 'BO'
AND wi~wi_cd IN s_erdat.
LOOP AT lt_workflow INTO DATA(ls_workflow).
* --- This is a placeholder, adapt task IDs and logic
CASE ls_workflow-wi_stat.
WHEN 'STARTED'.
ls_event_log-activityname = 'Invoice Sent For Approval'.
WHEN 'COMPLETED'.
ls_event_log-activityname = 'Invoice Approved'.
WHEN 'CANCELLED'.
ls_event_log-activityname = 'Invoice Rejected'.
WHEN OTHERS.
CONTINUE.
ENDCASE.
* --- Code to get invoice details based on ls_workflow-instid needed here
* --- ... appending to lt_event_log ...
ENDLOOP.
* --- 6, 7, 8. Payment Block Set/Removed, Data Updated (from Change Docs)
SELECT h~objectid, h~username, h~udate, h~utime, p~fname, p~value_new, p~value_old
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectclas = p~objectclas AND h~objectid = p~objectid AND h~changenr = p~changenr
INTO TABLE @DATA(lt_changes)
WHERE h~objectclas = 'BELEGV'
AND h~udate IN s_erdat.
LOOP AT lt_changes INTO DATA(ls_change).
ls_event_log-invoicenumber = |{ ls_change-objectid+10(10) }{ ls_change-objectid(4) }|.
ls_event_log-username = ls_change-username.
ls_event_log-eventtime = |{ ls_change-udate } { ls_change-utime(2) }:{ ls_change-utime+2(2) }:{ ls_change-utime+4(2) }|.
IF ls_change-fname = 'ZLSPR'. " Payment Block
IF ls_change-value_old IS INITIAL AND ls_change-value_new IS NOT INITIAL.
ls_event_log-activityname = 'Payment Block Set'.
ls_event_log-paymentblockreason = ls_change-value_new.
ELSEIF ls_change-value_old IS NOT INITIAL AND ls_change-value_new IS INITIAL.
ls_event_log-activityname = 'Payment Block Removed'.
ls_event_log-paymentblockreason = ''.
ELSE.
CONTINUE.
ENDIF.
ELSE.
ls_event_log-activityname = 'Invoice Data Updated'.
ENDIF.
* --- Need to select other attributes based on invoice number
* --- ... appending to lt_event_log ...
ENDLOOP.
* --- 9. Invoice Posted
SELECT CONCAT( bkpf~belnr, bkpf~gjahr ) AS invoicenumber,
'Invoice Posted' AS activityname,
CONCAT( bkpf~cpudt, bkpf~cputm ) AS eventtime,
bkpf~usnam AS username,
bkpf~bukrs AS companycode,
bseg~lifnr AS vendornumber,
bseg~wrbtr AS amountincompanycodecurrency,
bseg~zfBDT AS paymentduedate,
bkpf~blart AS documenttype,
bseg~zlspr AS paymentblockreason,
bseg~ebeln AS purchasingdocument
FROM bkpf
JOIN bseg ON bkpf~bukrs = bseg~bukrs AND bkpf~belnr = bseg~belnr AND bkpf~gjahr = bseg~gjahr
INTO TABLE @DATA(lt_posted)
WHERE bkpf~cpudt IN @s_erdat
AND bkpf~bukrs IN @s_bukrs
AND bkpf~blart IN @s_blart
AND bseg~koart = 'K'. " Vendor line
LOOP AT lt_posted INTO DATA(ls_posted).
ls_event_log-invoicenumber = ls_posted-invoicenumber.
ls_event_log-activityname = ls_posted-activityname.
ls_event_log-eventtime = |{ ls_posted-eventtime(8) } { ls_posted-eventtime+8(2) }:{ ls_posted-eventtime+10(2) }:{ ls_posted-eventtime+12(2) }|.
ls_event_log-username = ls_posted-username.
ls_event_log-companycode = ls_posted-companycode.
ls_event_log-vendornumber = ls_posted-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_posted-amountincompanycodecurrency.
ls_event_log-paymentduedate = ls_posted-paymentduedate.
ls_event_log-documenttype = ls_posted-documenttype.
ls_event_log-paymentblockreason = ls_posted-paymentblockreason.
ls_event_log-purchasingdocument = ls_posted-purchasingdocument.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 10. Payment Proposal Created
SELECT CONCAT( regup~belnr, regup~gjahr ) AS invoicenumber,
'Payment Proposal Created' AS activityname,
CONCAT( reguh~erfdt, reguh~erfzt ) AS eventtime,
reguh~erfbu AS username,
regup~bukrs AS companycode,
regup~lifnr AS vendornumber,
regup~wrbtr AS amountincompanycodecurrency,
'' AS paymentduedate,
regup~blart AS documenttype,
'' AS paymentblockreason,
'' AS purchasingdocument
FROM regup
JOIN reguh ON regup~laufd = reguh~laufd AND regup~laufi = reguh~laufi
INTO TABLE @DATA(lt_proposal)
WHERE reguh~erfdt IN @s_erdat
AND regup~bukrs IN @s_bukrs.
LOOP AT lt_proposal INTO DATA(ls_proposal).
ls_event_log-invoicenumber = ls_proposal-invoicenumber.
ls_event_log-activityname = ls_proposal-activityname.
ls_event_log-eventtime = |{ ls_proposal-eventtime(8) } { ls_proposal-eventtime+8(2) }:{ ls_proposal-eventtime+10(2) }:{ ls_proposal-eventtime+12(2) }|.
ls_event_log-username = ls_proposal-username.
ls_event_log-companycode = ls_proposal-companycode.
ls_event_log-vendornumber = ls_proposal-vendornumber.
ls_event_log-amountincompanycodecurrency = ls_proposal-amountincompanycodecurrency.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- 11, 12. Payment Executed / Late Payment Executed
SELECT CONCAT( belnr, gjahr ) AS invoicenumber,
augdt,
zfBDT
FROM bsak
INTO TABLE @DATA(lt_cleared)
WHERE augdt IN @s_erdat
AND bukrs IN @s_bukrs.
LOOP AT lt_cleared INTO DATA(ls_cleared).
IF ls_cleared-augdt > ls_cleared-zfbdt.
ls_event_log-activityname = 'Late Payment Executed'.
ELSE.
ls_event_log-activityname = 'Payment Executed'.
ENDIF.
ls_event_log-invoicenumber = ls_cleared-invoicenumber.
ls_event_log-eventtime = |{ ls_cleared-augdt } 00:00:00|.
* --- Need to select other attributes based on invoice number
* --- ... appending to lt_event_log ...
ENDLOOP.
* --- 13. Invoice Reversed
SELECT CONCAT( stblg, stjah ) AS invoicenumber,
'Invoice Reversed' AS activityname,
CONCAT( cpudt, cputm ) AS eventtime,
usnam AS username,
bukrs AS companycode,
'' AS vendornumber,
'' AS amountincompanycodecurrency,
'' AS paymentduedate,
blart AS documenttype,
'' AS paymentblockreason,
'' AS purchasingdocument
FROM bkpf
INTO TABLE @DATA(lt_reversed)
WHERE stblg IS NOT NULL
AND cpudt IN @s_erdat
AND bukrs IN @s_bukrs.
LOOP AT lt_reversed INTO DATA(ls_reversed).
ls_event_log-invoicenumber = ls_reversed-invoicenumber.
ls_event_log-activityname = ls_reversed-activityname.
ls_event_log-eventtime = |{ ls_reversed-eventtime(8) } { ls_reversed-eventtime+8(2) }:{ ls_reversed-eventtime+10(2) }:{ ls_reversed-eventtime+12(2) }|.
ls_event_log-username = ls_reversed-username.
ls_event_log-companycode = ls_reversed-companycode.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
* --- Write internal table to CSV file
OPEN DATASET p_path FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
ENDIF.
DATA: lv_line TYPE string.
FIELD-SYMBOLS: <fs_any> TYPE any.
* --- Header row
lv_line = 'InvoiceNumber,ActivityName,EventTime,UserName,CompanyCode,VendorNumber,AmountInCompanyCodeCurrency,PaymentDueDate,DocumentType,PaymentBlockReason,PurchasingDocument'.
TRANSFER lv_line TO p_path.
LOOP AT lt_event_log INTO ls_event_log.
CLEAR lv_line.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE ls_event_log TO <fs_any>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF sy-index = 1.
lv_line = <fs_any>.
ELSE.
CONCATENATE lv_line <fs_any> INTO lv_line SEPARATED BY ','.
ENDIF.
ENDDO.
TRANSFER lv_line TO p_path.
ENDLOOP.
CLOSE DATASET p_path.
WRITE: / 'Extraction complete. File saved to:', p_path. พร้อมเริ่มต้นหรือยัง?
เริ่มปรับปรุงการจัดการใบแจ้งหนี้ได้วันนี้ เทมเพลตนี้เป็นก้าวแรกสู่การปรับปรุงการปฏิบัติงานและเพิ่มประสิทธิภาพอย่างเห็นผล.
เริ่มเพิ่มประสิทธิภาพการประมวลผลใบแจ้งหนี้ P2P ใน SAP S/4HANA
ระบุคอขวดและลดระยะเวลารอบการจัดการใบแจ้งหนี้ได้อย่างน้อย 30%.
ไม่ต้องใช้บัตรเครดิต ตั้งค่าเสร็จในไม่กี่นาที.