关于ABAP批次或生产订单特性值的随记

特性值

特性值是为了控制一些特定属性,特性字段可以在SAP里配置,以方便管控物料或者订单。

后台表

特性值涉及到的SAP后台表有:
CABN,CABNT,CAWN,CAWNT,KSML,KLAH,AUSP

  1. CABN,CABNT,CAWN,CAWNT
    包含内部特性号及其描述字段
  2. KSML
    包含内部等级号字段,与CABN表连接可获取内部特性值(atinn)
  3. KLAH
    包含内部等级号,类,类别等字段
  4. AUSP
    包含对象,内部特性号,计数器,类等字段

2024.05.07新增
 表INOB:内部编号与对象号之间的关系

批次特性值

1.可根据函数来读取或者更改特性值
VB_BATCH_2_CLASS_OBJECT
BAPI_OBJCL_GETDETAIL

DATA: lv_objek TYPE OBJNUM,
      lv_obtab TYPE TABELLE,
      lv_klart TYPE KLASSENART,
      lv_class TYPE KLASSE_D.

DATA: lt_num TYPE TABLE OF BAPI1003_ALLOC_VALUES_NUM,
      lt_char TYPE TABLE OF BAPI1003_ALLOC_VALUES_CHAR,
      lt_curr TYPE TABLE OF BAPI1003_ALLOC_VALUES_CURR,
      lt_return TYPE TABLE OF BAPIRET2.

DATA: lt_numnew TYPE TABLE OF BAPI1003_ALLOC_VALUES_NUM,
      lt_charnew TYPE TABLE OF BAPI1003_ALLOC_VALUES_CHAR,
      lt_currnew TYPE TABLE OF BAPI1003_ALLOC_VALUES_CURR,
      lt_returnnew TYPE TABLE OF BAPIRET2.

DATA: ls_char TYPE BAPI1003_ALLOC_VALUES_CHAR,
      ls_return TYPE BAPIRET2.

CALL FUNCTION 'VB_BATCH_2_CLASS_OBJECT'      "获取对象,类等
  EXPORTING
    i_matnr       = '000000001200005491'
    i_charg       = '0001356318'
    I_WERKS       = '2050'
  IMPORTING
    E_OBJEK       = lv_objek
    E_OBTAB       = lv_obtab
    E_KLART       = lv_klart
    E_CLASS       = lv_class.

CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'         "获取已维护特性值
  EXPORTING
    objectkey              = lv_objek
    objecttable            = lv_obtab
    classnum               = lv_class
    classtype              = lv_klart
  tables
    allocvaluesnum         = lt_num
    allocvalueschar        = lt_char
    allocvaluescurr        = lt_curr
    return                 = lt_return.

lt_numnew[] = lt_num[].
lt_charnew[] = lt_char[].
lt_currnew[] = lt_curr[].
lt_returnnew[] = lt_return[].

IF lt_charnew[] IS NOT INITIAL.             "新特性值赋值
  LOOP AT lt_charnew INTO ls_char.
    ls_char-value_char    = '1233333333'.
    ls_char-value_neutral = '1233333333'.
    MODIFY lt_charnew FROM ls_char.
  ENDLOOP.
ELSE.
  ls_char-CHARACT       = 'Z_MO'.
  ls_char-value_char    = '1233333333'.
  ls_char-value_neutral = '1233333333'.
  APPEND ls_char TO lt_charnew[].
ENDIF.

CALL FUNCTION 'BAPI_OBJCL_CHANGE'          "新特性值更新
  EXPORTING
    objectkey                = lv_objek
    objecttable              = lv_obtab
    classnum                 = lv_class
    classtype                = lv_klart
  tables
    allocvaluesnumnew        = lt_numnew
    allocvaluescharnew       = lt_charnew
    allocvaluescurrnew       = lt_currnew
    return                   = lt_returnnew
          .

LOOP AT lt_return INTO ls_return WHERE type = 'E' OR type = 'A'.
  WRITE: ls_return-MESSAGE.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  EXIT.
ENDLOOP.

IF sy-subrc <> 0.
  call function 'BAPI_TRANSACTION_COMMIT'
          exporting
            wait = 'X'.
ENDIF.

2024.05.07新增
 上述的函数取值新版本下可能已经不太适用了,函数参数的数据对象也变了,建议还是直接从表取值
 
2.可根据后台表来读取特性值

DATA: lv_zmuju TYPE ausp-atwrt,
      lt_ausp TYPE TABLE OF ausp.

DATA: BEGIN OF lt_cabn OCCURS 0,
        atinn TYPE cabn-atinn,
        ATNAM TYPE cabn-ATNAM,
        atbez TYPE CABNT-atbez,
      END OF lt_cabn.

*SELECT SINGLE atwrt INTO lv_zmuju FROM ausp        "得到对象
*      WHERE OBJEK = '000000000001525818'.
**      AND   ATINN = 'Z_REMARKS'   atinn用字符串查询会失败
**      AND   atwrt = '7777777777'.
  SELECT
      CABN~ATINN  "内部特性号
      ATNAM
      ATBEZ   "特性描述
      INTO CORRESPONDING FIELDS OF TABLE lt_cabn
      FROM CABN
      INNER JOIN CABNT ON CABN~ATINN = CABNT~ATINN AND CABNT~SPRAS = SY-LANGU
      INNER JOIN KSML ON KSML~IMERK = CABN~ATINN
      WHERE KLART = '023'.

  LOOP AT lt_cabn.

  ENDLOOP.
  
*  read table lt_cabn with key atnam = 'Z_REMARKS'.     通过atnam得到atinn号值
*  lv_atinn = lt_cabn-atinn.
* 
  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_ausp FROM ausp        "得到对象
      WHERE OBJEK = '000000000001525818'
      AND   ATINN = '0000000991'.   "备注Z_REMARKS
*      AND   atwrt = '7777777777'.
WRITE lv_zmuju.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_ausp FROM ausp        "得到对象
      WHERE OBJEK = 'OR003000006229'
      AND   ATINN = '0000000953'.   "返工原因
*      AND   atwrt = '7777777777'.

    WRITE lv_zmuju.
	
	"2022.3.18新增
	SELECT SINGLE atinn
          FROM cabn
          INTO lv_atinn
         WHERE atnam = 'Z_PP_REWORK3'.
         
    IF sy-subrc = 0.
       
    ENDIF.

2024.05.07新增
	对于对象号怎么找呢,需要通过表INOB查找
	
DATA: lv_matnr TYPE matnr,
      lv_charg TYPE charg_d,
      lv_werks TYPE werks_d,
      lv_djpfs TYPE p LENGTH 10 DECIMALS 3.

DATA: lv_objectkey TYPE bapi1003_key-object.

DATA:BEGIN OF gt_inob OCCURS 0,
       cuobj  TYPE inob-cuobj,
       objek  TYPE inob-objek,
       objek2 TYPE kssk-objek,
       matnr  TYPE mara-matnr,
       werks  TYPE marc-werks,
       charg  TYPE mch1-charg,
     END OF gt_inob.

DATA:BEGIN OF gt_data OCCURS 0,
       charg TYPE mch1-charg,
       matnr TYPE mara-matnr,
       werks TYPE marc-werks,
       maktx TYPE makt-maktx,
       class TYPE klah-class,
       objek TYPE inob-objek,
       djpfs  TYPE p LENGTH 10 DECIMALS 3,
       lifnr TYPE lfa1-lifnr,
       shrq  TYPE sy-datum,
     END OF gt_data.

FIELD-SYMBOLS <fs_data> LIKE LINE OF gt_data.

DATA:gt_ausp TYPE TABLE OF ausp WITH HEADER LINE.
FIELD-SYMBOLS <fs_inob> LIKE LINE OF gt_inob.
DATA: gv_r_fld   TYPE char10.

DATA: lv_cuobj TYPE inob-cuobj,
      lv_objek TYPE inob-objek,
      lv_ATFLV TYPE ausp-atflv.

SELECT
  cuobj,
  objek
  INTO  TABLE @gt_inob
  FROM inob
  WHERE klart EQ '022'           "分类号要根据实际情况来
  AND   obtab EQ 'MCHA'.       “这里表也要根据实际情况来,MCH1,MARA都是可以的

LOOP AT gt_inob ASSIGNING <fs_inob>.
  <fs_inob>-objek2 = <fs_inob>-cuobj.

  <fs_inob>-matnr = <fs_inob>-objek+0(40).
  <fs_inob>-werks = <fs_inob>-objek+40(4).
  <fs_inob>-charg = <fs_inob>-objek+44(10).

ENDLOOP.

*DELETE gt_inob WHERE matnr <> lv_matnr.
*DELETE gt_inob WHERE objek2 NS '15033'.

IF gt_inob[] IS NOT INITIAL.

  SELECT *
    INTO TABLE @gt_ausp
    FROM ausp
    FOR ALL ENTRIES IN @gt_inob
    WHERE objek EQ @gt_inob-objek2
    AND   klart EQ '022'.

  SORT gt_ausp BY objek.
ENDIF.

LOOP AT gt_inob ASSIGNING <fs_inob>.

  READ TABLE gt_ausp WITH KEY objek = <fs_inob>-objek2 BINARY SEARCH TRANSPORTING NO FIELDS.
  IF sy-subrc EQ 0.
    LOOP AT gt_ausp FROM sy-tabix.
      IF gt_ausp-objek NE <fs_inob>-objek2.
        EXIT.
      ENDIF.

      CLEAR gv_r_fld.

      CASE gt_ausp-atinn.
        WHEN '0000000808'."单卷平方数

            CALL FUNCTION 'MC_FLTP_CHAR'
              EXPORTING
                fc_a_fld = gt_ausp-atflv
              IMPORTING
                fc_r_fld = gv_r_fld.
            CONDENSE gv_r_fld NO-GAPS.
            gt_data-djpfs = gv_r_fld.
          WHEN '0000000819'."供应商帐户号
            GT_DATA-LIFNR = GT_AUSP-ATWRT.

            CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
              EXPORTING
                INPUT  = GT_DATA-LIFNR
              IMPORTING
                OUTPUT = GT_DATA-LIFNR.

          WHEN '0000000820'."最近的收货日期
            CALL FUNCTION 'MC_FLTP_CHAR'
              EXPORTING
                FC_A_FLD = GT_AUSP-ATFLV
              IMPORTING
                FC_R_FLD = GV_R_FLD.
            CONDENSE GV_R_FLD NO-GAPS.
            GT_DATA-SHRQ = GV_R_FLD.
      
      ENDCASE.

      gt_data-matnr = <fs_inob>-matnr.
      gt_data-werks = <fs_inob>-werks.
      gt_data-charg = <fs_inob>-charg.
      
      APPEND gt_data.
      CLEAR  gt_data.
    ENDLOOP.
  ENDIF.
ENDLOOP.

"查询单条
SELECT SINGLE
            inob~cuobj,
            inob~objek,
            ausp~atflv
            INTO  ( @lv_cuobj,@lv_objek,@lv_atflv )
            FROM inob
            INNER JOIN ausp
            ON inob~cuobj = ausp~objek
            INNER JOIN cabn
            ON ausp~atinn = cabn~atinn
            WHERE inob~klart EQ '022'
            AND   inob~obtab EQ 'MCHA'
  		    AND   cabn~atnam EQ 'Z_UNITCONVERSION'
            AND   inob~objek LIKE @lv_wech.

		CALL FUNCTION 'MC_FLTP_CHAR'
		  EXPORTING
		    fc_a_fld = lv_ATFLV
		  IMPORTING
		    fc_r_fld = gv_r_fld.
		CONDENSE gv_r_fld NO-GAPS.
		gt_data-scrq = gv_r_fld.

3.前台查看批次特性值,事务码MSC3N,里面会有类别,类=类别种类指示
在这里插入图片描述

生产订单特性值

1.生产订单特性值前台在订单抬头分类控制里
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值