天天看點

IP41 - 維護計劃中的日期和周期

在自定義程式的開發中,涉及到對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