成本中心领用接口详解编程语言

广州某粮油公司的接口,因为OA太死板,所以这边接口统一做成字段,值  的形式传递。

抬头结构:ZMMS001

KOSTL    1 类型    KOSTL    CHAR    10    0    成本中心 
BLDAT    1 类型    BLDAT    DATS    8    0    凭证中的凭证日期 
XBLNR    1 类型    XBLNR    CHAR    16    0    参考凭证编号 

行项目结构:ZMMS002

ZEILE    1 类型    MBLPO    NUMC    4    0    物料凭证中的项目 
MATNR    1 类型    MATNR    CHAR    18    0    物料号  
WERKS    1 类型    WERKS_D    CHAR    4    0    工厂 
LGORT    1 类型    LGORT_D    CHAR    4    0    库存地点 
ERFMG    1 类型    ERFMG    QUAN    13    3    以输入单位计的数量  
SGTXT    1 类型    SGTXT    CHAR    50    0    项目文本 
ERFME    1 类型    ERFME    UNIT    3    0    条目单位

函数代码:

FUNCTION ZMM_OAMB1A. 
*"---------------------------------------------------------------------- 
*"*"本地接口: 
*"  TABLES 
*"      T_TAB STRUCTURE  ZJKS001 OPTIONAL 
*"      T_TAB_I STRUCTURE  ZJKS002 OPTIONAL 
*"---------------------------------------------------------------------- 
 
  DATA:S_TAB TYPE ZJKS001."表头结构 
  DATA:S_TAB_I TYPE ZJKS002."表体结构 
  FIELD-SYMBOLS:  <DYN_WA>,"表头 
                  <DYN_LA>,"表体 
                  <DYN_FIELD>."字段 
  DATA:GS_ZTMM_WADAT TYPE ZTMM_WADAT. 
  DATA:GT_ZMB1A01 TYPE TABLE OF ZMB1A01, 
       GS_ZMB1A01 LIKE LINE OF  GT_ZMB1A01. 
  DATA:LV_NUM TYPE N. 
 
  DATA:LS_TABH TYPE ZMMS001, 
       LS_TABI TYPE ZMMS002. 
  DATA:LV_FUNC TYPE CHAR50."结构ID 
  DATA:LV_XBLNR TYPE XBLNR1. 
 
  DATA:GS_HEAD TYPE          BAPI2017_GM_HEAD_01, 
       GV_CODE TYPE          BAPI2017_GM_CODE VALUE '03', 
       GT_ITEM TYPE TABLE OF BAPI2017_GM_ITEM_CREATE, 
       GS_ITEM TYPE          BAPI2017_GM_ITEM_CREATE, 
       GT_RETU TYPE TABLE OF BAPIRET2, 
       GS_RETU TYPE          BAPIRET2, 
       GV_MDOC TYPE          BAPI2017_GM_HEAD_RET-MAT_DOC. 
 
  DEFINE MESGADD."返回消息赋值 
    S_TAB-FIELDNAME = &1. 
    S_TAB-VALUE = &2. 
    APPEND S_TAB TO T_TAB. 
  END-OF-DEFINITION. 
 
 
  "************************************************************正式程序 
  READ TABLE T_TAB INTO S_TAB WITH KEY FIELDNAME = 'FUNCTION'. 
  IF SY-SUBRC = 0. 
    LV_FUNC = S_TAB-VALUE. 
    IF LV_FUNC = 'OAMB1A'. 
    ELSE. 
      REFRESH:T_TAB. 
      MESGADD:'RETURN' 'E', 
              'MESSAGE' '引用错误函数,请联系管理员!'. 
      RETURN. 
    ENDIF. 
  ELSE. 
    REFRESH:T_TAB. 
    MESGADD:'RETURN' 'E', 
            'MESSAGE' '未指定函数!'. 
    RETURN. 
  ENDIF. 
 
  IF T_TAB[] IS INITIAL OR T_TAB_I[] IS INITIAL. 
    REFRESH:T_TAB. 
    MESGADD:'RETURN' 'E', 
            'MESSAGE' '传入参数不完整,需要完整的表头表体信息!'. 
    RETURN. 
  ENDIF. 
 
  ASSIGN LS_TABH TO <DYN_WA>."表头结构 
  ASSIGN LS_TABI TO <DYN_LA>."表体结构 
 
 
  LOOP AT T_TAB INTO S_TAB."表头数据装换 
    ASSIGN COMPONENT S_TAB-FIELDNAME OF STRUCTURE <DYN_WA> TO <DYN_FIELD>. 
    IF SY-SUBRC = 0. 
      <DYN_FIELD> = S_TAB-VALUE. 
    ENDIF. 
  ENDLOOP. 
 
  IF LS_TABH-KOSTL IS INITIAL. 
    MESGADD:'RETURN' 'E', 
            'MESSAGE' '成本中心不能为空!'. 
  ENDIF. 
 
 
  GS_HEAD-REF_DOC_NO = LS_TABH-XBLNR. 
  GS_HEAD-PR_UNAME = SY-UNAME. 
 
  CALL FUNCTION 'NUMBER_RANGE_ENQUEUE' 
    EXPORTING 
      OBJECT           = 'ZOALS' 
    EXCEPTIONS 
      FOREIGN_LOCK     = 1 
      OBJECT_NOT_FOUND = 2 
      SYSTEM_FAILURE   = 3 
      OTHERS           = 4. 
  IF SY-SUBRC = 0. 
    CALL FUNCTION 'NUMBER_GET_NEXT' 
      EXPORTING 
        NR_RANGE_NR             = '01' 
        OBJECT                  = 'ZOALS' 
        IGNORE_BUFFER           = 'X' 
      IMPORTING 
        NUMBER                  = GS_ZMB1A01-ZJLLSH 
      EXCEPTIONS 
        INTERVAL_NOT_FOUND      = 1 
        NUMBER_RANGE_NOT_INTERN = 2 
        OBJECT_NOT_FOUND        = 3 
        QUANTITY_IS_0           = 4 
        QUANTITY_IS_NOT_1       = 5 
        INTERVAL_OVERFLOW       = 6 
        BUFFER_OVERFLOW         = 7 
        OTHERS                  = 8. 
    IF SY-SUBRC = 0. 
      CALL FUNCTION 'NUMBER_RANGE_DEQUEUE' 
        EXPORTING 
          OBJECT           = 'ZOALS' 
        EXCEPTIONS 
          OBJECT_NOT_FOUND = 1 
          OTHERS           = 2. 
    ENDIF. 
  ENDIF. 
 
  LOOP AT T_TAB_I INTO S_TAB_I."表体数据装换 
    AT NEW COL. 
      CLEAR LS_TABI. 
    ENDAT. 
    ASSIGN COMPONENT S_TAB_I-FIELDNAME OF STRUCTURE <DYN_LA> TO <DYN_FIELD>. 
    IF SY-SUBRC = 0. 
      <DYN_FIELD> = S_TAB_I-VALUE. 
    ENDIF. 
 
    AT END OF COL. 
      LV_NUM = LV_NUM + 1. 
      IF LS_TABI-MATNR IS INITIAL. 
        MESGADD:'RETURN' 'E', 
                'MESSAGE' '物料编码不能为空!'. 
        RETURN. 
      ENDIF. 
      IF LS_TABI-WERKS IS INITIAL. 
        MESGADD:'RETURN' 'E', 
                'MESSAGE' '工厂编码不能为空!'. 
        RETURN. 
      ENDIF. 
      IF LS_TABI-LGORT IS INITIAL. 
        MESGADD:'RETURN' 'E', 
                'MESSAGE' '库位编码不能为空!'. 
        RETURN. 
      ENDIF. 
      IF LS_TABI-ERFMG IS INITIAL. 
        MESGADD:'RETURN' 'E', 
                'MESSAGE' '数量字段不能为空!'. 
        RETURN. 
      ENDIF. 
      IF LS_TABI-ERFME IS INITIAL. 
        MESGADD:'RETURN' 'E', 
                'MESSAGE' '单位不能为空!'. 
        RETURN. 
      ENDIF. 
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' 
        EXPORTING 
          INPUT  = LS_TABI-MATNR 
        IMPORTING 
          OUTPUT = LS_TABI-MATNR. 
 
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' 
        EXPORTING 
          INPUT          = LS_TABI-ERFME 
          LANGUAGE       = SY-LANGU 
        IMPORTING 
          OUTPUT         = LS_TABI-ERFME 
        EXCEPTIONS 
          UNIT_NOT_FOUND = 1 
          OTHERS         = 2. 
      IF SY-SUBRC <> 0. 
      ENDIF. 
 
      GS_ITEM-MATERIAL = LS_TABI-MATNR. 
      GS_ITEM-PLANT = LS_TABI-WERKS. 
      IF GS_HEAD-DOC_DATE IS INITIAL. 
        SELECT SINGLE * INTO CORRESPONDING FIELDS OF GS_ZTMM_WADAT 
           FROM ZTMM_WADAT 
           WHERE WERKS = LS_TABI-WERKS 
           AND SDATE = SY-DATUM 
           AND ETIME >= SY-UZEIT 
           AND STIME <= SY-UZEIT. 
        IF SY-SUBRC = 0. 
          GS_HEAD-DOC_DATE = GS_ZTMM_WADAT-BUDAT. 
          GS_HEAD-PSTNG_DATE = GS_ZTMM_WADAT-BUDAT. 
        ELSE. 
          GS_HEAD-DOC_DATE = SY-DATUM. 
          GS_HEAD-PSTNG_DATE = SY-DATUM. 
        ENDIF. 
      ENDIF. 
 
      GS_ITEM-STGE_LOC = LS_TABI-LGORT. 
      GS_ITEM-MOVE_TYPE = '201'. 
      GS_ITEM-ENTRY_QNT = LS_TABI-ERFMG. 
      GS_ITEM-ENTRY_UOM = LS_TABI-ERFME. 
      IF LS_TABH-KOSTL IS INITIAL. 
        MESGADD:'RETURN' 'E', 
                'MESSAGE' '传递值中成本中心为空,请联系管理员!'. 
        RETURN. 
      ENDIF. 
 
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' 
        EXPORTING 
          INPUT  = LS_TABH-KOSTL 
        IMPORTING 
          OUTPUT = LS_TABH-KOSTL. 
 
*      CONCATENATE '000' LS_TABH-KOSTL INTO GS_ITEM-COSTCENTER. 
*      CONDENSE GS_ITEM-COSTCENTER NO-GAPS. 
      GS_ITEM-COSTCENTER = LS_TABH-KOSTL. 
      GS_ITEM-ITEM_TEXT = LS_TABI-SGTXT. 
      APPEND GS_ITEM TO GT_ITEM. 
 
      "ADD BY LY FOR LOG 
*      GS_ZMB1A01-ZJLLSH = 
      GS_ZMB1A01-POSNR = LV_NUM. 
      GS_ZMB1A01-XBLNR = GS_HEAD-REF_DOC_NO. 
      GS_ZMB1A01-KOSTL = GS_ITEM-COSTCENTER. 
      GS_ZMB1A01-MATNR = GS_ITEM-MATERIAL. 
      GS_ZMB1A01-WERKS = GS_ITEM-PLANT. 
      GS_ZMB1A01-LGORT = GS_ITEM-STGE_LOC. 
      GS_ZMB1A01-ERFMG = GS_ITEM-ENTRY_QNT. 
      GS_ZMB1A01-ERFME = GS_ITEM-ENTRY_UOM. 
      GS_ZMB1A01-DAT = SY-DATUM. 
      GS_ZMB1A01-TIM = SY-UZEIT. 
      APPEND GS_ZMB1A01 TO GT_ZMB1A01. 
      "ADD BY LY FOR LOG 
    ENDAT. 
  ENDLOOP. 
 
  CLEAR:LV_XBLNR. 
  SELECT SINGLE XBLNR INTO LV_XBLNR 
    FROM MKPF WHERE XBLNR = LS_TABH-XBLNR. 
 
  IF LV_XBLNR IS NOT INITIAL. 
    MESGADD:'RETURN' 'S'. 
    RETURN. 
  ENDIF. 
 
 
  CALL FUNCTION 'BAPI_GOODSMVT_CREATE' 
    EXPORTING 
      GOODSMVT_HEADER  = GS_HEAD 
      GOODSMVT_CODE    = GV_CODE 
    IMPORTING 
*     GOODSMVT_HEADRET = 
      MATERIALDOCUMENT = GV_MDOC 
*     MATDOCUMENTYEAR  = 
    TABLES 
      GOODSMVT_ITEM    = GT_ITEM 
      RETURN           = GT_RETU. 
 
  READ TABLE GT_RETU INTO GS_RETU WITH KEY TYPE = 'E'. 
  IF SY-SUBRC = 0. 
    LOOP AT GT_RETU INTO GS_RETU WHERE TYPE = 'E'. 
      MESGADD:'RETURN' 'E', 
            'MESSAGE' GS_RETU-MESSAGE. 
    ENDLOOP. 
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 
  ELSE. 
 
    LOOP AT GT_ZMB1A01 INTO GS_ZMB1A01. 
      GS_ZMB1A01-MBLNR = GV_MDOC. 
      MODIFY GT_ZMB1A01 FROM GS_ZMB1A01. 
    ENDLOOP. 
 
    MODIFY ZMB1A01 FROM TABLE GT_ZMB1A01. 
 
    MESGADD:'RETURN' 'S', 
            'MBLNR'  GV_MDOC. 
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 
      EXPORTING 
        WAIT = 'X'. 
  ENDIF. 
 
ENDFUNCTION.

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/18649.html

(0)
上一篇 2021年7月19日 21:20
下一篇 2021年7月19日 21:20

相关推荐

发表回复

登录后才能评论