← หน้ารวม (Hub) My 5 WRICEFs →
X-ray ANONYMIZED · PUBLIC EDITION Shared engine

ZTAXA_R01 X-ray
โปรแกรมเดียว — WRICEF กว่า 10 ตัวแก้อยู่ในนั้น

T-code · ZTAXB_R01 Base · RFIDYYWT (Generic WHT) Code snapshot · 31-Aug-2026

Source: ABAP main program ZTAXA_R01 (header, change history and event blocks) อ่านเมื่อ 31-Aug-2026 · ชื่อผู้แก้ในโค้ดถูกตัดออก · ตีความ include ที่ไม่ได้เห็นโค้ดติดป้าย INFER

ทำไม bug หนึ่งตัวถึงพังหลาย object พร้อมกัน? เพราะใน SAP ไม่ได้มี “โปรแกรม RPT-1” “โปรแกรม FRM-1” แยกกัน — ทุกตัวคือ ทางแยกในโปรแกรมเดียว ที่ copy มาจาก RFIDYYWT ตั้งแต่ปี 2016 แล้วแต่ละ WRICEF ก็เข้าไปเติมโค้ดของตัวเองไว้ตรงจุดต่าง ๆ · หน้านี้ เอ็กซ์เรย์โปรแกรมจริง ให้เห็นว่าใครแก้ตรงไหน และกดเลือก WRICEF เพื่อดู “รัศมีความเสียหาย” ได้เลย
1

Identity card

ReportREPORT zfitaxr034 MESSAGE-ID id_wt · T-code ZTAXB_R01 · dump แสดงเป็น main program SAPLZTAXA_R01
Origin (ECC)01-Feb-2016 · ECDK924266 “Copy report from RFIDYYWT … generate report layout by ALV Grid instead of ALV_list” · โค้ด custom หลักอยู่ใน method ZTAX_PRINT_ALV
IncludesI_RFIDYYWT_TOP (global) · ZTAXA_R01_TOP · ZTAXA_R01_001 (selection screen) · ZTAXA_R01_I01 (processing) · I_RFIDYYWT_F01 · I_RFIDYYWT_FICA_* · I_RFIDYYWT_I02 · ZTAXA_R01_I02
Custom helpersFunction ZTAXA_R01_DISPATCHER · class ZTAXA_R_UTIL_CLASS ถือค่า static: GT_PRCTR_VAL, GT_RECID_VAL (PC/RI จากจอ), GV_LAND1, GV_OUT_GRP
BAdIs ที่เรียกCountry BAdI IDWTREP_ADDFUNCINT (instance exit) · User BAdI WTAXREPORT_MODIFY (instance userexit)
2

Execution X-ray — กด WRICEF เพื่อดูว่าแก้ตรงไหน

เลือก WRICEF ด้านบน → จะเห็นบล็อกที่มันแก้ และรายการที่ต้อง regression
standard RFIDYYWT BAdI hook custom insert (WRICEF) dispatch / output
INITIALIZATION
i01_initialization + FICA init include
AT SELECTION-SCREEN
ON block m1 / p_land1 / p_budat / p_bukrs / p_witht / p_wthcd / p_bupla
ตรวจ output group · additional field ต่อประเทศ · reporting period · company codes · WT types / codes · business place · ALV variants
Country BAdI · screen_checks_after_input
ENH-5validate_year
เมื่อกด Execute (ONLI) — ตรวจปีของ reporting period (14-May-2026)
START-OF-SELECTION
ENH-7validate_ap2_screen → set_err_msg
output group AP2/AP3: reporting period ต้องอยู่ในปีเดียวกัน ไม่งั้นหยุดด้วย error
RPT-1ENH-6ENH-7Country BAdI · addinfo_enter_before_selection (pop-up)
ถูกห่อด้วย IF p_land1 <> 'TH' (RPT-1) แล้วเปิดให้ TH อีกครั้งเฉพาะ output group E05 PND3 · E06 PND53 · AP2 · AP3 · background job ใช้ค่าจาก memory ID
User BAdI · enter_addinfo_before_selection
RPT-1FRM-1ENH-1check_pftctr → ZTAXA_R_UTIL_CLASS=>GT_PRCTR_VAL / GT_RECID_VAL
PC และ RI จากจอเลือกถูกเก็บเป็น static range ให้ include อื่นใช้กรอง (17-Dec-2025)
RPT-1RPT-7GV_LAND1 = p_land1 · GV_OUT_GRP = p_cust
ประเทศ (RPT-1, 12-Jan-2026) และ output group (RPT-7, 19-Jan-2026) ถูกเก็บไว้ให้ทุกจุดถัดไปตัดสินใจ
RPT-1FRM-1ENH-1i01_select_wt_data
LDB + callback → ตาราง QSTRMAIN · จุดที่ PC/RI filter ลบระดับเอกสาร (ZTAXA_R01_I01) INFER จาก FUT
END-OF-SELECTION
Country BAdI · qstrmain_modify_before_output
User BAdI · modify_fidoc_before_output
i01_create_reporting_data
สร้างตาราง IDWT: COMPCD · PARTNER · FIDOC
RPT-7Country BAdI · alldata_modify_before_output
ข้ามสำหรับ output group AP1 / AR1 · ตาราง partner ถูกเก็บสำรองแล้วคืนค่าหลังเรียก (22-Jun-2026)
User BAdI · modify_data_before_output
User program ของ output group (ถ้าตั้งไว้)
RPT-1RPT-7check_witht
whitelist WHT type จาก ZCAX_P01 (param WHT_TYPE_PND54) · ข้ามสำหรับ AP1 / AR1
ENH-7sum_amount_ap3
AP3 (PND1 Kor): รวมยอดต่อ CoCd / business place / vendor แล้ว map เป็น income type · ตัด recipient type ที่ไม่เกี่ยว
DISPATCH
ไม่มีรายการเหลือ → message 7Q 702 “No items have been selected”
ENH-1ENH-6ENH-5ติ๊ก File อย่างเดียว → กรองตามหลักแรกของ WITHT → IDWT_DISPATCHER (standard)
E05→3 · E06→4 · E07/E08→1 · E09/E10→2 แล้ว DELETE แถวอื่นใน FIDOC และ ERROR · ไฟล์ DMEEX ออกจาก standard dispatcher
RPT-1FRM-1ENH-7FRM-4อื่น ๆ → EXPORT output group TO MEMORY ID 'ZTAXA_R01_OUTPUTGROUP' → ZTAXA_R01_DISPATCHER
ALV / forms แบบ custom · ส่ง radio สกุล LC1 หรือ LC3 (LC2 ถูก comment ออก) · memory ID ถูกเพิ่มโดย ENH-7 (03-Aug-2026)
3

Output-group routing — ตามที่โค้ดเขียนจริง

Standard path · IDWT_DISPATCHER

เงื่อนไข: ติ๊ก File และไม่ติ๊ก Form 1 / Form 2 · ใช้กับ text file (DMEEX) ของ ENH-1 / ENH-6 / ENH-5

Custom path · ZTAXA_R01_DISPATCHER

ทุกกรณีอื่น · ALV ของ RPT-1 · ใบแนบ FRM-1 · AP2 / AP3 · output group ถูกส่งผ่าน memory ID ZTAXA_R01_OUTPUTGROUP

Output groupในโค้ดใช้กับหมายเหตุ
AP1 · AR1อยู่ใน range ยกเว้นAP1 = 50 ทวิ + แบบ PND54 (FRM-3)ข้าม country BAdI alldata_modify และ check_witht (RPT-7)
AP2gc_pnd_output-wht_54WHT Certificate for Thailand & Form No. 54 (ตรงกับ F4 ที่เห็นตอน FUT)ตรวจปีของ reporting period (ENH-7) · SYS แก้ข้อขัดแย้งที่ knowledge base เขียนว่า AP2 = PND1 Kor
AP3gc_pnd_output-wht_pnd1kPND1 Korsum_amount_ap3 · ตัด recipient type ที่ไม่เกี่ยว · ปรับ posting/issued date (ENH-7)
E05 / E06pnd3 / pnd53SWC text PND3 / PND53 (ENH-6)กรอง WITHT ขึ้นต้น 3 / 4
E07 / E08pnd1 / pnd1kSWC text PND1 / PND1 Kor (ENH-5)กรอง WITHT ขึ้นต้น 1
E09 / E10pnd2 / pnd2kSWC text PND2 / PND2 Kor (ENH-5)กรอง WITHT ขึ้นต้น 2
R03(custom dispatcher)RPT-1 ALV + ใบแนบ FRM-1ผ่าน check_witht
E01–E04 · E1K · E2K(ไม่ได้อยู่ในบล็อกนี้)ENH-1 ใบแนบ + e-filingจาก knowledge base / FD FD
4

Change history — ใครเข้ามาแก้โปรแกรมนี้บ้าง

จาก header ของโปรแกรม + comment BOC/EOC ในโค้ด · transport ยังเก็บไว้เพื่อใช้ไล่ใน SE09/SE10

ยังเห็นร่องรอย TAX-RPT-6 (บล็อก E05/E06 เดิมถูก comment ออก 24-Jul) และ TAX-ENH-6 / ENH-1 (BOI blocks ที่ dispatch) · รวมแล้ว 11 WRICEF แตะโปรแกรมนี้

5

สิ่งที่โค้ดสอน (เอาไปใช้ตอนเทส)

RPT-7 ≠ RPT-1

AP1 / AR1 ข้าม check_witht และ country BAdI alldata_modify — ถ้า RPT-7 กับ RPT-1 ให้แถวไม่เท่ากัน ให้ดูตรงนี้ก่อนสงสัย data

sy-tcode ใช้ไม่ได้

เงื่อนไข sy-tcode <> 'ZTAXB_R01' ถูก comment ทิ้ง · ตัวจริงที่ใช้คือ GV_OUT_GRP และ memory ID ZTAXA_R01_OUTPUTGROUP — ตรงกับบทเรียนว่า background job ไม่มี T-code ให้พึ่ง

รายงานว่าง ≠ bug

ถ้าทุกแถวถูกกรองหมด จะขึ้น 7Q 702 “No items have been selected” · ไล่ row-disappearance ladder: select → BAdI → check_witht → PC/RI → output

ไฟล์ vs ฟอร์ม

ENH-1 / ENH-6 / ENH-5 วิ่ง standard dispatcher ส่วน RPT-1 / FRM-1 / AP2 / AP3 วิ่ง custom dispatcher — แก้ฝั่งหนึ่งไม่ทำให้อีกฝั่งเปลี่ยน แต่ แก้ตอน select / filter กระทบทั้งคู่

✓

Self-check

1. Output group ไหนไม่ผ่าน check_witht?

ดูเฉลย
AP1 และ AR1 (เพิ่มโดย RPT-7)

2. AP2 กับ AP3 ในโค้ดคืออะไร?

ดูเฉลย
AP2 = wht_54 (WHT certificate & Form No. 54) · AP3 = wht_pnd1k (PND1 Kor)

3. Text file ของ ENH-6 PND3 ถูกกรองอย่างไรก่อนออกไฟล์?

ดูเฉลย
output group E05 → เก็บเฉพาะ WITHT ที่ขึ้นต้นด้วย 3 แล้วส่ง IDWT_DISPATCHER

4. Custom dispatcher รู้ output group จากไหน?

ดูเฉลย
EXPORT p_cust TO MEMORY ID 'ZTAXA_R01_OUTPUTGROUP' (ENH-7, 03-Aug-2026) ไม่ใช่ sy-tcode

5. แก้ check_pftctr แล้วต้อง regression อะไร?

ดูเฉลย
ทุก output ที่ใช้ PC/RI: RPT-1, FRM-1, ENH-1 (และ RPT-7 / FRM-3 ที่ใช้ selection เดียวกัน)