zoukankan      html  css  js  c++  java
  • 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 '不能有小数位'.
      endif.

    endform.                    "CHAR_FLTP_CONVERSION_PAK_F40


    *&---------------------------------------------------------------------*
    *&      Form  fltp_char_conversion_pak_f40
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->CHAR_WERT  text
    *      -->FLTP_WERT  text
    *      -->EINHEIT    text
    *----------------------------------------------------------------------*
    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'
        exporting
          char_unit       = einheit
          decimals        = 0
          exponent        = 0
          fltp_value_si   = fltp_wert
          indicator_value = 'X'
          masc_symbol     = ' '
        importing
          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(2type n. "函数参数

      clear cp_error.

      "将内表数据转换为输出格式
      write cs_template-zeieh to l_zykl1_out.

      "计算开始日期 = 下次开始日期 - 周期
      "首先将周期转换为以秒为单位的周期
      perform char_fltp_conversion_pak_f40
            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.
        endif.

        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.
        endif.

      enddo.

      write l_ndate to l_ndate. "转换格式,BDC用

      call function 'CONVERSION_EXIT_CUNIT_OUTPUT'
        exporting
          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.
      endif.

    *  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

                                  'X'  'SAPLIWP3'   '0201',
                                  '' '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.

      "判断是否成功
      clear cp_error.
      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.
      endif.

      "若成功,在消息内表中找到新生成的号码
      read table lt_bdcmsg with key msgtyp = 'S'
                                    msgid = 'IP'
                                    msgnr = '200'.
      if sy-subrc eq 0.
        call function 'CONVERSION_EXIT_ALPHA_INPUT'
          exporting
            input  = lt_bdcmsg-msgv1
          importing
            output = l_warpl. "维护计划
      endif.

    *  1.1 todo Save_text写入长文本
      perform frm_save_ip41_text using  cs_template.

    endform.                    " FRM_BDC_IP41

  • 相关阅读:
    606. Construct String from Binary Tree
    696. Count Binary Substrings
    POJ 3255 Roadblocks (次短路)
    POJ 2823 Sliding Window (单调队列)
    POJ 1704 Georgia and Bob (博弈)
    UVa 1663 Purifying Machine (二分匹配)
    UVa 10801 Lift Hopping (Dijkstra)
    POJ 3281 Dining (网络流之最大流)
    UVa 11100 The Trip, 2007 (题意+贪心)
    UVaLive 4254 Processor (二分+优先队列)
  • 原文地址:https://www.cnblogs.com/zhumk/p/2038059.html
Copyright © 2011-2022 走看看