今天用户提了个需求写个自动程序来修改授信额度。因为之前没有用过,我先直接在SE37上运行这个BAPI来看看要填入哪些字段来进行修改。我贸贸然写了这三个字段的数字就点击运行了。
SE37上显示运行成功了,
但我在前台FD33查看修改效果时,傻眼了,系统直接崩溃了。什么也查询不了了!
然后我后台查查询了一下数据表。KNKK表中除了 KUNNR、KKBER、KLIMK三个字段有值为其他所有字段都被清空了。我稍稍分析一下,那个信贷账号字段KNKLI应该是不能为空的。我后台把这个字段补回去后就FD32查看就没有报错了。
接下来在开发这个程序时,我就谨慎了,先把旧的 KNKK表行的数据复制到要修改的行,然后在修改要修改的字段。如下图所示:
我这次完成的需求是把超过一年没有下单的客户信贷额度置为0.我把代码贴出来分享给大家。
REPORT zfi_fd32_update.
DATA i_days TYPE tfmatage.
DATA wa_zknkk_log LIKE zknkk_log.
* 1从信贷管理表中找出所有信贷金额不为0的客户数据
* 2判断这些客户最后一次下单是否超过一年
* 3如果超过一年就把信贷改为0
SELECT * INTO TABLE @DATA(it_knkk) FROM knkk WHERE klimk <> ''.
IF it_knkk IS NOT INITIAL .
LOOP AT it_knkk INTO DATA(wa_knkk) .
SELECT * INTO TABLE @DATA(it_vbak) FROM vbak WHERE kunnr = @wa_knkk-kunnr.
IF it_vbak IS NOT INITIAL.
SORT it_vbak BY audat DESCENDING.
READ TABLE it_vbak INTO DATA(wa_vbak) INDEX 1. "读取最新下单的一条数据
CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
EXPORTING
i_date_from = wa_vbak-audat
* I_KEY_DAY_FROM =
i_date_to = sy-datum
* I_KEY_DAY_TO =
* I_FLG_SEPARATE = ' '
IMPORTING
e_days = i_days
* E_MONTHS =
* E_YEARS =
.
IF i_days > '365'. "如过超过一年
MOVE-CORRESPONDING wa_knkk TO wa_zknkk_log.
wa_zknkk_log-audat = wa_vbak-audat.
wa_zknkk_log-i_days = i_days.
DATA:
s_knka LIKE knka,
s_knkk LIKE knkk,
yknka LIKE knka,
yknkk LIKE knkk.
" READ TABLE it_zknkk_tmp INTO DATA(wa_zknkk) INDEX 1.
MOVE-CORRESPONDING wa_knkk TO s_knkk ." 把旧的KNKK行复制到新行
"把要修改的字段重新赋值
s_knkk-klimk = 0. " 修改授信额度
s_knkk-kraus = ''. " 修改信用信息号
CALL FUNCTION 'CREDITLIMIT_CHANGE'
EXPORTING
i_knka = s_knka
i_knkk = s_knkk
upd_knka = ''
upd_knkk = 'U'
* XNEUA = ' '
* XREFL = ' '
yknka = yknka
yknkk = yknkk.
IF sy-subrc = '0'.
wa_zknkk_log-emsg = '更新成功'.
ELSE.
wa_zknkk_log-emsg = '更新失败'.
ENDIF.
MODIFY zknkk_log FROM wa_zknkk_log.. "先把数据保存一版记录在log表,方便回头查看
COMMIT WORK.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.