ABAP中获取物料/批次/订单的特性值

该文详细阐述了在SAP系统中如何通过数据库查询和BAPI函数来获取及操作物料特性,包括200特性、批次特性023以及销售订单的VC特性300。涉及的步骤包括读取、创建和删除特性,并提供了相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

物料特性 / 200 特性

通过数据库取值

  SELECT
    objek "将分类的对象的键值
    atinn "内部特性
    atwrt "特性值
    atflv "内部浮点自
    klart "类别种类
    INTO TABLE gt_ausp
    FROM ausp
    INNER JOIN cabn
    ON cabn~atinn = ausp~atinn
    WHERE objek = '000000000101004001'
      AND klart = '200'
      AND atnam = 'WG0078'. " 内部特性
  SORT gt_ausp BY objek atinn.
    
    READ TABLE gt_ausp INTO gs_ausp 
      WITH KEY objek = '000000000101004001' 
               atinn = 'WG0078' 
               BINARY SEARCH.
  IF sy-subrc = 0.
    CALL FUNCTION 'MC_FLTP_CHAR'
      EXPORTING
        fc_a_fld = gs_ausp-atflv
      IMPORTING
        fc_r_fld = gs_alv-wg0078.
  ENDIF.

通过 BAPI 取值

DATA: lv_matnr           TYPE matnr,
      lv_object          TYPE objnum,
      ls_alloclist       TYPE bapi1003_alloc_list,
      lt_alloclist       TYPE TABLE OF bapi1003_alloc_list,
      ls_return          TYPE bapiret2,
      lt_return          TYPE TABLE OF bapiret2,
      ls_allocvaluesnum  TYPE bapi1003_alloc_values_num,
      lt_allocvaluesnum  TYPE TABLE OF bapi1003_alloc_values_num,
      ls_allocvalueschar TYPE bapi1003_alloc_values_char,
      lt_allocvalueschar TYPE TABLE OF bapi1003_alloc_values_char,
      ls_allocvaluescurr TYPE bapi1003_alloc_values_curr,
      lt_allocvaluescurr TYPE TABLE OF bapi1003_alloc_values_curr,
      ls_retur2          TYPE bapiret2,
      lt_retur2          TYPE TABLE OF bapiret2.

lv_object = lv_matnr.  " 物料号带前置零

CALL FUNCTION 'BAPI_OBJCL_GETCLASSES' " 可以通过 cl03 查看
  EXPORTING
    objectkey_imp   = lv_object " 物料号
    objecttable_imp = 'MARA'
    classtype_imp   = '200'
  TABLES
    alloclist       = lt_alloclist
    return          = lt_return.

READ TABLE lt_alloclist INTO ls_alloclist INDEX 1.
CALL FUNCTION 'BAPI_OBJCL_GETDETAIL' " 也可以用 claf_classification_of_objects 取值
  EXPORTING
    objectkey       = lv_object
    objecttable     = 'MARA'
    classnum        = ls_alloclist-classnum
    classtype       = '200'
  TABLES
    allocvaluesnum  = lt_allocvaluesnum
    allocvalueschar = lt_allocvalueschar
    allocvaluescurr = lt_allocvaluescurr
    return          = lt_retur2.

通过 BAPI 创建特性

l_objectkeynew = l_matnr.
l_objecttablenew = 'MARA'.
l_classnumnew = ls_tmp-class.
l_classtypenew = ls_tmp-klart.
CLEAR: lt_numout,lt_charout,lt_returnout.
CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
  EXPORTING
    objectkey       = l_objectkeynew
    objecttable     = l_objecttablenew
    classnum        = l_classnumnew
    classtype       = l_classtypenew
  TABLES
    allocvaluesnum  = lt_numout
    allocvalueschar = lt_charout
    allocvaluescurr = lt_currout
    return          = lt_returnout.
CLEAR ls_return.
READ TABLE lt_returnout INTO ls_return WITH KEY type = 'E'.
IF sy-subrc <> 0.
  CLEAR lt_returnout.
  CALL FUNCTION 'BAPI_OBJCL_DELETE' "删除已有分类
    EXPORTING
      objectkey   = l_objectkeynew
      objecttable = l_objecttablenew
      classnum    = l_classnumnew
      classtype   = l_classtypenew
*     CHANGENUMBER =
*     KEYDATE     = SY-DATUM
    TABLES
      return      = lt_returnout.
  CLEAR ls_return.
  READ TABLE lt_returnout INTO ls_return WITH KEY type = 'E'.
  IF sy-subrc = 0.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    MESSAGE e000 WITH '删除物料' l_objectkeynew '已有分类失败'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.
ENDIF.
LOOP AT gt_upload INTO gs_upload WHERE matnr = ls_tmp-matnr AND klart =
ls_tmp-klart AND class = ls_tmp-class.
  CLEAR: ls_num, ls_char,l_atinn,l_atfor.
  CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
    EXPORTING
      input  = gs_upload-atnam
    IMPORTING
      output = l_atinn.
* SELECT SINGLE atfor FROM cabn INTO l_atfor WHERE atinn = l_atinn.
  READ TABLE lt_cabn INTO ls_cabn WITH KEY atinn = l_atinn.
  IF sy-subrc <> 0.
    MESSAGE e000 WITH '特性没有维护,请先维护特性!'.
  ENDIF.
  l_atfor = ls_cabn-atfor.
  IF gs_upload-atwrt IS NOT INITIAL.
    IF l_atfor = 'CHAR'.
      ls_char-charact = gs_upload-atnam.
      ls_char-charact_descr = gs_upload-atbez.
      ls_char-value_char = gs_upload-atwrt.
      APPEND ls_char TO lt_char.
    ELSEIF l_atfor = 'NUM'.
      ls_num-charact = gs_upload-atnam.
      ls_num-charact_descr = gs_upload-atbez.
      ls_num-value_from = gs_upload-atwrt.
      APPEND ls_num TO lt_num.
    ENDIF.
  ENDIF.
ENDLOOP.
CALL FUNCTION 'BAPI_OBJCL_CREATE'
  EXPORTING
    objectkeynew    = l_objectkeynew
    objecttablenew  = l_objecttablenew
    classnumnew     = l_classnumnew
    classtypenew    = l_classtypenew
    status          = '1'
*    standardclass   = 
*    changenumber    =
*   KEYDATE         = SY-DATUM
*   NO_DEFAULT_VALUES = ' '
* IMPORTING
*   CLASSIF_STATUS  =
  tables
    allocvaluesnum  = lt_num
    allocvalueschar = lt_char
*   ALLOCVALUESCURR =
    return          = lt_return.
CLEAR: l_type,l_info, ls_return.
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
IF sy-subrc = 0.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  CLEAR l_info.
  CALL FUNCTION 'MESSAGE_TEXT_BUILD'
    EXPORTING
      msgid               = ls_return-id
      msgnr               = ls_return-number
      msgv1               = ls_return-message_v1
      msgv2               = ls_return-message_v2
      msgv3               = ls_return-message_v3
      msgv4               = ls_return-message_v4
    IMPORTING
      message_text_output = l_info.
  l_type = 'E'.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
  l_type = 'S'.
  l_info = '物料主数据分类视图创建特性成功'.
ENDIF.

物料批次特性 / 023 特性

通过数据库取值

  SELECT
    mch1~matnr,
    mch1~charg,
    cabn~atnam,
    ausp~atwrt,
    ausp~atflv
    FROM mch1
    INNER JOIN ausp
    ON ausp~objek = mch1~cuobj_bm
    INNER JOIN cabn
    ON cabn~atinn = ausp~atinn
    WHERE mch1~matnr = '000000000101004001'
    AND mch1~charg = '152200110'.

通过 BAPI 取值

  CALL FUNCTION 'VB_BATCH_2_CLASS_OBJECT'
    EXPORTING
      i_matnr = w_mseg-matnr " 104001001
      i_charg = w_mseg-charg " 925401637
      i_werks = w_mseg-werks " 7000
    IMPORTING
      e_objek = r_e_objek1 " 000000000104001001
      e_obtab = r_e_obtab " MCH1
      e_klart = r_e_klart " 023
      e_class = r_e_class. " Y0001
  CONDENSE r_e_objek1 NO-GAPS.
  r_e_objek = r_e_objek1.
  CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
    EXPORTING
      objectkey       = r_e_objek " 000000000104001001925401637
      objecttable     = r_e_obtab " MCH1
      classnum        = r_e_class " Y0001
      classtype       = r_e_klart " 023
    TABLES
      allocvaluesnum  = allocvaluesnum
      allocvalueschar = allocvalueschar
      allocvaluescurr = allocvaluescurr
      return          = return.

销售订单特性 / VC 特性 / 可配置物料特性 / 300 特性

通过数据库取值

  SELECT
    vbap~vbeln,
    vbap~posnr,
    cabn~atinn,"内部特性
    cabn~atnam,"特性名称
    ibsymbol~atwrt,"特性值
    ibsymbol~atflv,
    ibsymbol~atflb
    INTO TABLE @DATA(gt_data)
    FROM vbap
    INNER JOIN ibin 
       ON ibin~instance = vbap~cuobj
      AND ibin~valto = '99991231235959'
    INNER JOIN ibinvalues 
       ON ibinvalues~in_recno = ibin~in_recno
    INNER JOIN ibsymbol 
       ON ibsymbol~symbol_id = ibinvalues~symbol_id
    INNER JOIN cabn 
       ON cabn~atinn = ibsymbol~atinn
    WHERE vbap~vbeln = '2000046612'
      AND vbap~posnr = '000010'.

通过 BAPI 取值

  SELECT SINGLE 
    cuobj 
    matnr
    INTO (l_cuobj,l_matnr)
    FROM vbap
    WHERE vbeln = w_mseg-kdauf
    AND posnr = w_mseg-kdpos.
    
  DATA: t_configuration LIKE STANDARD TABLE OF conf_out WITH HEADER LINE.
        
  IF l_cuobj IS NOT INITIAL.
    CALL FUNCTION 'VC_I_GET_CONFIGURATION'
      EXPORTING
        instance              = l_cuobj
        language              = '1'
        iv_max_massprocessing = 10
      TABLES
        configuration         = t_configuration.
  ENDIF.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bu知疲倦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值