BAPI_OBJCL_CREATE:创建批次特性值,BAPI_OBJCL_CHANGE:修改批次的特性值,BAPI_OBJCL_GETDETAIL:获取批次属性信息

1、BAPI_BATCH_CREATE:创建批次

2、BAPI_OBJCL_GETDETAIL :获取批次属性信息

3、BAPI_OBJCL_CREATE :创建批次特性值

4、BAPI_OBJCL_CHANGE:修改批次的特性值

该文章注主要是针对批次号存在或者批次号不存在进行的批次创建以及批次属性创建或者修改的操作

1、批次号不存在的话,先调用BAPI_BATCH_CREATE创建批次,示例如下:

call function 'BAPI_BATCH_CREATE'
          exporting
            material = lv_matnr
            batch    = lv_charg
            plant    = lv_werks
          tables
            return   = lt_rettab.

        read table lt_rettab into ls_rettab with key type = 'S' id = '12'  number = '128'. "#EC CI_STDSEQ
        if sy-subrc = 0. "批次创建成功
          call function 'BAPI_TRANSACTION_COMMIT'
            exporting
              wait = 'X'.
          <ls_value_message> = | { <ls_value_message> }  { '[批次创建成功!]'  } |.
        else. "批次创建失败
          call function 'BAPI_TRANSACTION_ROLLBACK'.
          <ls_value_icon> = c_red.
          <ls_value_message> = |错误:{ ls_rettab-type } ID:{ ls_rettab-id } Number:{ ls_rettab-number } 消息:{ ls_rettab-message }|.
          continue.
        endif.

2、如果批次存在,则调用BAPI_OBJCL_GETDETAIL 获取批次属性信息,如果批次属性有特性值则调用BAPI_OBJCL_CHANGE修改特性值,如果批次属性没有特性值,则调用BAPI_OBJCL_CREATE创建批次特性值

data :lv_objek type cuobn,
        lv_obtab type bapi1003_key-objecttable,
        lv_klart type klassenart,
        lv_class type klasse_d. 
data:lv_key        type bapi1003_key-object,
       lv_table      type bapi1003_key-objecttable,
       lv_class_1    type bapi1003_key-classnum,
       lv_class_type type bapi1003_key-classtype,
       lv_status     type bapi1003_key-status,
       lv_long       type bapi1003_key-object_long.

  data: lt_alloc_curr    type table of bapi1003_alloc_values_curr, "是货币类型特性值
        lt_alloc_num     type table of bapi1003_alloc_values_num, "是数值类型的特性值
        lt_alloc_char    type table of bapi1003_alloc_values_char, "是CHAR类型的特性值
        ls_alloc_char    type bapi1003_alloc_values_char,
        lt_alloc_char_cr type table of bapi1003_alloc_values_char.
  data:lv_atnam type atnam,
       lv_imerk type atinn.
       “通过物料,批次,工厂先获取到批次的信息
  call function 'VB_BATCH_2_CLASS_OBJECT'
    exporting
      i_matnr = pv_matnr_1
      i_charg = pv_charg_1
      i_werks = pv_werks_1
    importing
      e_objek = lv_objek
      e_obtab = lv_obtab
      e_klart = lv_klart
      e_class = lv_class.

*****获取到分类值
  clear:lv_imerk,lv_atnam.
  read table lt_ksml into data(ls_ksml) with key class = lv_class
                                                 klart = lv_class_type. 
  if sy-subrc = 0.
    lv_imerk = ls_ksml-imerk.
    call function 'CONVERSION_EXIT_ATINN_OUTPUT'
      exporting
        input  = lv_imerk
      importing
        output = lv_atnam.
  endif.
  "获取批次属性信息 BAPI_OBJCL_GETDETAIL
 call function 'BAPI_OBJCL_GETDETAIL'
    exporting
      objectkey       = lv_key
      objecttable     = lv_table
      classnum        = lv_class_1
      classtype       = lv_class_type
      language        = sy-langu
      objectkey_long  = lv_long
    importing
      status          = lv_status
    tables
      allocvaluesnum  = lt_alloc_num
      allocvalueschar = lt_alloc_char
      allocvaluescurr = lt_alloc_curr
      return          = lt_return.

  lt_alloc_char_cr = lt_alloc_char.

"将品味的值转换成大写
  lv_atwrt = pv_atwrt.
  lv_atwrt  = to_upper( lv_atwrt  ).
  read table lt_alloc_char into ls_alloc_char with key charact = lv_atnam ##WARN_OK
                                                       value_char = lv_atwrt .
  if sy-subrc = 0.
    cv_flag = 'X'.
    return.
  endif.

  "如果特性值有修改则调用函数修改批次值
  if cv_flag is initial.
***再调用bapi_objcl_change将特性值写入批次特性
    lr_tabledescr_ref ?= cl_abap_typedescr=>describe_by_data( t_dyn_table[] ).
    lr_descr_ref ?= lr_tabledescr_ref->get_table_line_type( ).
    lt_field = lr_descr_ref->components.
    delete lt_field where name <> 'ATWRT'.               "#EC CI_STDSEQ
    read table lt_field into ls_field index 1.
    if sy-subrc = 0.
      assign component ls_field-name of structure pv_dyn_table to <ls_value>.
      read table lt_alloc_char assigning <ls_s_alloc_char> with key  charact = lv_atnam.
      if sy-subrc = 0.
        if <ls_value> is assigned..
          <ls_s_alloc_char>-charact = lv_atnam.
          <ls_s_alloc_char>-value_char    = <ls_value>.
          <ls_s_alloc_char>-value_neutral = <ls_value>.
          <ls_s_alloc_char>-value_char_long = <ls_value>.
          <ls_s_alloc_char>-value_neutral_long = <ls_value>.
        else.
          delete lt_alloc_char where  charact = lv_atnam.
        endif.
      else.
        if <ls_value> is assigned.
          append initial line to lt_alloc_char assigning <ls_s_alloc_char>.
          <ls_s_alloc_char>-charact = lv_atnam.
          <ls_s_alloc_char>-value_char    = <ls_value>.
          <ls_s_alloc_char>-value_neutral = <ls_value>.
          <ls_s_alloc_char>-value_char_long = <ls_value>.
          <ls_s_alloc_char>-value_neutral_long = <ls_value>.
        endif.
      endif.

      clear:lt_return.
      "如果批次值为空,则创建批次特性值 BAPI_OBJCL_CREATE
      if lt_alloc_char_cr is initial and lv_status is initial.
        call function 'BAPI_OBJCL_CREATE'
          exporting
            objectkeynew      = lv_key
            objecttablenew    = lv_table
            classnumnew       = lv_class_1
            classtypenew      = lv_class_type
            objectkeynew_long = lv_long
          tables
            allocvaluesnum    = lt_alloc_num
            allocvalueschar   = lt_alloc_char
            allocvaluescurr   = lt_alloc_curr
            return            = lt_return.
      else. "否则就直接修改批次的特性值即可 
        call function 'BAPI_OBJCL_CHANGE'
          exporting
            objectkey          = lv_key
            objecttable        = lv_table
            classnum           = lv_class_1
            classtype          = lv_class_type
            status             = '1'
            keydate            = sy-datum
            objectkey_long     = lv_long
          importing
            classif_status     = lv_status
          tables
            allocvaluesnumnew  = lt_alloc_num
            allocvaluescharnew = lt_alloc_char
            allocvaluescurrnew = lt_alloc_curr
            return             = lt_return.
      endif.

      ct_return = lt_return[]. "将返回结果传出去
    endif.
  endif.
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值