在自定義程式的開發中,涉及到對IP41的程式設計,使用BDC進行程式設計,需要進行幾個相關問題的處理
1.計劃開始日期限定為時間類型
2.周期必須為天的整數倍
3.如果在計劃開始日期的當天就能運作處第一個工單,那麼需要将該日期提前一個周期(計劃開始日期在開發的程式界面填寫)
對于1,2,見如下代碼
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_TIME
* 校驗填寫的時間是否為天的整數倍
*----------------------------------------------------------------------*
* -->P_GS_HEAD_200_ZYKL1 text
* -->P_GS_HEAD_200_ZEIEH text
form frm_check_time using up_zykl1 like zzpmttzsxm-zykl1
up_zeieh like zzpmttzsxm-zeieh.
data: lv_sec_zykl1 like mmpt-zykl1. "以秒為機關的周期
data: rest_tag like mmpt-zykl1.
data: lv_zykl1 like zzpmttzsxm-zykl1.
lv_zykl1 = up_zykl1.
perform char_fltp_conversion_pak_f40
using lv_zykl1 "周期
lv_sec_zykl1 "傳回以秒計算的周期數
up_zeieh. "周期機關
perform fltp_char_conversion_pak_f40
using lv_zykl1
lv_sec_zykl1
up_zeieh.
if not ( lv_sec_zykl1 is initial ).
clear rest_tag.
rest_tag = lv_sec_zykl1 mod 86400. "判斷是否能被一天的秒數整除
if rest_tag <> 0.
message e000(zdev) with '必須為天的整數倍'.
endif.
endif.
endform. " FRM_CHECK_TIME
*& Form CHAR_FLTP_CONVERSION_PAK_F40
* text
* -->CHAR_WERT text
* -->FLTP_WERT text
* -->EINHEIT text
form char_fltp_conversion_pak_f40 using char_wert
fltp_wert
einheit.
data: dec_max like t006-decan value '15'.
data: dec_char like t006-decan.
call function 'CHAR_FLTP_CONVERSION_TO_SI'
exporting
char_unit = einheit
char_value = char_wert
decimals_max = dec_max
field_name = ' '
masc_symbol = ' '
importing
fltp_value_si = fltp_wert
decimals = dec_char
exceptions
no_unit_given = 1.
* CASE sy-subrc.
* WHEN '1'.
* SET CURSOR FIELD 'RMIPM-ZEIEH'.
* MESSAGE e044(ir). "nicht mit Masseinheit
* ENDCASE.
if dec_char ne 0.
message e000 with '不能有小數位'.
endform. "CHAR_FLTP_CONVERSION_PAK_F40
*& Form fltp_char_conversion_pak_f40
form fltp_char_conversion_pak_f40 using char_wert
fltp_wert
einheit.
clear char_wert.
check not einheit is initial.
call function 'FLTP_CHAR_CONVERSION_FROM_SI'
char_unit = einheit
decimals = 0
exponent = 0
fltp_value_si = fltp_wert
indicator_value = 'X'
masc_symbol = ' '
char_value = char_wert.
endform. "fltp_char_conversion_pak_f40
對于第三點,需要将日期提前一個周期,相關計算邏輯及IP41的BDC程式如下:
form frm_bdc_ip41 changing cs_template like gs_template
cp_error type c.
data:
l_zykl1_out like t006a-mseh3,
l_ndate like sy-datum,
l_warpl like zzpmttemplate-warpl,
lt_bdcmsg like standard table of bdcmsgcoll with header line.
data:lv_sec_zykl1 like mmpt-zykl1,
lv_days type i,
lv_days_f(2) type n. "函數參數
clear cp_error.
"将内表資料轉換為輸出格式
write cs_template-zeieh to l_zykl1_out.
"計算開始日期 = 下次開始日期 - 周期
"首先将周期轉換為以秒為機關的周期
using cs_template-zykl1
lv_sec_zykl1
cs_template-zeieh.
lv_days = lv_sec_zykl1 / cns_sec_tag. "前面校驗過整數倍
"由于函數的天數隻有2位,是以最大值為99天,是以對于大于99天
"的周期,需要多次減,才能得到正确的日期(不能直接以30天轉化為月)
l_ndate = cs_template-ndate.
do.
if lv_days >= 99.
lv_days_f = 99.
else.
lv_days_f = lv_days.
call function 'RP_CALC_DATE_IN_INTERVAL'
exporting
date = l_ndate
days = lv_days_f
months = 00
signum = '-'
years = 00
importing
calc_date = l_ndate.
lv_days = lv_days - 99.
if lv_days <= 0.
exit.
enddo.
write l_ndate to l_ndate. "轉換格式,BDC用
call function 'CONVERSION_EXIT_CUNIT_OUTPUT'
input = cs_template-zeieh
language = '1'
importing
* LONG_TEXT =
output = l_zykl1_out
* SHORT_TEXT =
exceptions
unit_not_found = 1
others = 2
.
if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
* 1.0 BDC IP41
refresh:gt_bdcdata[],lt_bdcmsg[].
perform frm_fill_bdc using: 'X' 'SAPLIWP3' '0100',
' ' 'BDC_OKCODE' '/00',
' ' 'RMIPM-MPTYP' 'PM',
'X' 'SAPLIWP3' '0201',
'' 'BDC_OKCODE' '/00',
'' 'RMIPM-WPTXT' cs_template-name1,
'' 'RMIPM-PSTXT' cs_template-name1,
'' 'RIWO1-TPLNR' cs_template-tplnr,
'' 'RMIPM-IWERK' cs_template-werks,
'' 'RMIPM-WPGRP' cs_template-jxbm ,
'' 'RMIPM-AUART' cs_template-jxlx,
'' 'RMIPM-GEWERK' cs_template-jxxz,
'' 'RMIPM-WERGW' cs_template-werks,
'' 'RMIPM-ZYKL1' cs_template-zykl1,
"機關轉換
'' 'RMIPM-ZEIEH' l_zykl1_out,
"us_template-zeieh,
'X' 'SAPLIWP3' '0201',
'' 'BDC_OKCODE' '=T\02',
'' 'RMIPM-PRIOK' cs_template-priok, "優先級
'X' 'SAPLIWP3' '0201',
'' 'BDC_OKCODE' '=TX',
* '' 'BDC_OKCODE' '=BU',
'' 'RMIPM-ABRHO' cns_ip41_days,
'' 'RMIPM-HUNIT' cns_ip41_days_unit,
'' 'RMIPM-HORIZ' '100', "100%
'' 'RMIPM-STADT' l_ndate, "long text
* "給一個預設值,先激活文本,否則後面Save Text函數不能儲存
'X' 'SAPLSTXX' '1100',
'' 'RSTXT-TXLINE(02)' '.',
'' 'BDC_OKCODE' '=TXBA', "back
'' 'BDC_OKCODE' '=BU' . "save
"us_template-ndate.
call transaction 'IP41' using gt_bdcdata
mode g_mode
update 'S'
messages into lt_bdcmsg.
" 儲存消息,待顯示
append lines of lt_bdcmsg to gt_bdcmsg.
"判斷是否成功
loop at lt_bdcmsg where msgtyp = 'E' or msgtyp = 'A'.
cp_error = 'X'.
exit.
endloop.
if cp_error is initial.
commit work and wait.
else.
rollback work.
* MESSAGE e000(zdev) WITH '模闆啟用失敗,'
* '調用TCODE:IP41生成維護計劃失敗'.
return.
"若成功,在消息内表中找到新生成的号碼
read table lt_bdcmsg with key msgtyp = 'S'
msgid = 'IP'
msgnr = '200'.
if sy-subrc eq 0.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
input = lt_bdcmsg-msgv1
output = l_warpl. "維護計劃
* 1.1 todo Save_text寫入長文本
perform frm_save_ip41_text using cs_template.
endform. " FRM_BDC_IP41