業務背景:SAP交貨單只有數量,沒有金額,所以開發報表從訂單的價格按數量計算交貨單的金額。
用戶反饋近期報表出現異常:
****2012/12/12 清風雅雨 規格變更 Chg 修改開始
** 修改原因:由于余數為0時,可能會報錯溢出。所以增加檢查。
* wa_alv-ttlwrx = ( wa_alv-lfimgr * wa_konv_pr01-kbetr / wa_konv_pr01-kpein +
* wa_alv-lfimgr * wa_konv_zr01-kbetr / wa_konv_zr01-kpein +
* wa_alv-lfimgr * wa_konv_pbxx-kbetr / wa_konv_pbxx-kpein +
* wa_alv-lfimgr * wa_konv_pb00-kbetr / wa_konv_pb00-kpein ) * ( 1 + p1 ) -
* wa_alv-lfimgr * wa_konv_zk01-kbetr / wa_konv_zk01-kpein +
* + wa_alv-lfimgr * wa_konv_zk03-kbetr / wa_konv_zk03-kpein.TRY.wa_alv-ttlwrx = ( wa_alv-lfimgr * wa_konv_pr01-kbetr / wa_konv_pr01-kpein +wa_alv-lfimgr * wa_konv_zr01-kbetr / wa_konv_zr01-kpein +wa_alv-lfimgr * wa_konv_pbxx-kbetr / wa_konv_pbxx-kpein +wa_alv-lfimgr * wa_konv_pb00-kbetr / wa_konv_pb00-kpein ) * ( 1 + p1 ) -wa_alv-lfimgr * wa_konv_zk01-kbetr / wa_konv_zk01-kpein ++ wa_alv-lfimgr * wa_konv_zk03-kbetr / wa_konv_zk03-kpein.CATCH cx_sy_zerodivide.IF p_jk <> 'X'.MESSAGE s000 WITH '交貨單' wa_alv-vbeln '被0除請檢查定價數量'.ENDIF.wa_alv-ttlwrx = 0.ENDTRY.
****2012/12/12 清風雅雨 規格變更 Chg 修改結束
當年年少不成熟,前臺報cx_sy_zerodivide錯誤,就采用把異常CATCH后直接前臺顯示,并把值賦為0,而現在用戶需要知道準確的值 ,時隔13年,再一次調查:
由于ZK01折讓價格 沒有價格單位,驗證一下:
REPORT ztmp_test2.
DATA wa_konv_zk01 TYPE konv.
DATA l_kbetr TYPE konv-kbetr.
wa_konv_zk01-kbetr = 0.
wa_konv_zk01-kpein = 0.
l_kbetr = wa_konv_zk01-kbetr / wa_konv_zk01-kpein.
WRITE : l_kbetr.
輸出0
REPORT ztmp_test2.
DATA wa_konv_zk01 TYPE konv.
DATA l_kbetr TYPE konv-kbetr.
wa_konv_zk01-kbetr = 1.
wa_konv_zk01-kpein = 0.
l_kbetr = wa_konv_zk01-kbetr / wa_konv_zk01-kpein.
WRITE : l_kbetr.
報cx_sy_zerodivide
總結:
1、0/0 = 0
2、有值/0 報cx_sy_zerodivide
問題找到了怎么解決?
檢查KONV ZK01類型,13年才有38條記錄。所以問題一直沒有爆露。
解決方案:
針對沒有價格單位kpein的計算邏輯:
交貨單XXX金額= 交貨單數量/訂單數量 x 訂單條件金額
而有價格單位的計算邏輯:
交貨單XXX金額= 交貨單數量 x 訂單條件金額/訂單條件價格單位
即
IF wa_konv_zk01-kpein NE 0.zk01tmp = wa_alv-lfimgr * wa_konv_zk01-kbetr / wa_konv_zk01-kpein.
ELSE.zk01tmp = wa_alv-lfimgr / wa_alv-kwmeng * wa_konv_zk01-kbetr
ENDIF.
比如本例:
如果交貨5萬則5/540000=40000
如果交貨2萬則2/540000=16000
同樣的算法取其他5個定價條件:
pr01tmp,zr01tmp,pbxxtmp,pb00tmp,zk03tmp.
這樣可以取到6個正確的定價條件的值,再進行交貨單行項目含稅金額的計算
wa_alv-ttlwrx = ( pr01tmp + zr01tmp + pbxxtmp + pb00tmp ) * ( 1 + p1 ) -zk01tmp + zk03tmp.