1. 程式人生 > 其它 >BDC修改已經拆分批次的內向交貨單的某些欄位

BDC修改已經拆分批次的內向交貨單的某些欄位

技術標籤:ABAPSAP

以下程式碼是修改已經拆分了批次的內向交貨單的一些欄位,通過BDC的技術實現,以供參考。

FORM VL32N_BDC_DGTRK  TABLES  P_DLVR STRUCTURE LS_DGTRK
                       USING  P_VBELN LIKE LIPS-VBELN.

  DATA: L_NUMB     TYPE N LENGTH 2,
        L_NUMB_SUB TYPE N LENGTH 2.
  DATA: L_LICHN_FIELD TYPE C LENGTH 30.
  DATA: L_POSNR_FIELD TYPE C LENGTH 30,
        L_POSNR_VALUE LIKE LIPS-POSNR,
        PO_NUMBER     LIKE LIPS-VGBEL,
        PO_ITEM       LIKE LIPS-VGPOS,
        L_LICHN_VALUE LIKE LIPS-POSNR.
  DATA: L_CHMULT_FIELD    TYPE C LENGTH 30.
  DATA: L_LICHN_FIELD_SUB TYPE C LENGTH 30.
  DATA: L_POSNR_FIELD_SUB TYPE C LENGTH 30.
  DATA: L_CHPL_T_CODE     TYPE C LENGTH 30.

  DATA: LT_LIPS LIKE TABLE OF LIPS WITH HEADER LINE.

  DATA: L_TEXT TYPE CHAR200.
  DATA: L_DB_CNT       TYPE P DECIMALS 0,   "總筆數
        L_INT          TYPE P DECIMALS 0,    "整數部分
        LV_DB_CNT_SUB  TYPE P DECIMALS 0,   "總筆數
        LV_INT_SUB     TYPE P DECIMALS 0,    "整數部分
        LV_DECIMAL_SUB TYPE P DECIMALS 0,    "餘數
        L_INDEX        LIKE SY-TABIX,         "當前筆
        L_DECIMAL      TYPE P DECIMALS 0.    "餘數

  DATA: LV_HSDAT(10) TYPE C,
        LV_VFDAT(10) TYPE C.

  DATA:IT_TAB TYPE STANDARD TABLE OF TLINE,   "傳入內容
       WA_TAB LIKE LINE OF IT_TAB,
       G_NAME TYPE THEAD-TDNAME.              "文字物件名稱

  DATA:L_LIFEXPOS  LIKE LIPS-LIFEXPOS.   "外部專案號

****建立臨時變數用於儲存資料
  DATA: TEMP_LICHN LIKE LIPS-LICHN, 
        TEMP_HSDAT LIKE LIPS-HSDAT,  
        TEMP_VFDAT LIKE LIPS-VFDAT,  
        TEMP_KDMAT LIKE LIPS-KDMAT,  
        TEMP_EAN11 LIKE LIPS-EAN11.  
  DATA: LV_TIME     TYPE I,
        LV_TIME_SUB TYPE I.
  DATA(LT_DLVR) = P_DLVR[].

  CLEAR: L_DB_CNT.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_LIPS
   FROM LIPS
  WHERE VBELN = P_VBELN.
  DELETE LT_LIPS WHERE POSNR(1) = '9'.
  L_DB_CNT = LINES( LT_LIPS ).
  CLEAR:BDCDATA,BDCDATA[].
*=================填充BDC=======================*
*---------------------選擇螢幕-------------------*
  PERFORM BDC_DYNPRO      USING 'SAPMV50A' '4104'."螢幕
  PERFORM BDC_FIELD       USING 'BDC_CURSOR'    'LIKP-VBELN'."游標
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'    '/00'."OK_CODE
  PERFORM BDC_FIELD       USING 'LIKP-VBELN'    P_VBELN."內向交貨單

  CLEAR: L_NUMB,L_INDEX.
  SORT LT_LIPS BY POSNR.
*    L_DB_CNT = SY-DBCNT.
  L_INT     = L_DB_CNT DIV 8.
  L_DECIMAL = L_DB_CNT MOD 8.
  LOOP AT LT_LIPS WHERE POSNR+0(1) NE '9'.

    SELECT *
      FROM LIPS
      INTO TABLE @DATA(LT_SUB_LIPS)
     WHERE VBELN = @LT_LIPS-VBELN
       AND UECHA = @LT_LIPS-POSNR
       AND POSNR LIKE '9%'.

    DATA(LV_DB_CN_SUB) = LINES( LT_SUB_LIPS ).

    L_INDEX = SY-TABIX.

******以下為新增文字內容*******

**** 呼叫BAPI:CREATE_TEXT
    CLEAR: G_NAME, WA_TAB, IT_TAB.
    CONCATENATE LT_LIPS-VBELN LT_LIPS-POSNR INTO G_NAME.
    IF STRLEN( L_TEXT ) > 120.
      WA_TAB-TDFORMAT = '01'.
      WA_TAB-TDLINE   = L_TEXT+0(120).
      APPEND WA_TAB TO IT_TAB.
      WA_TAB-TDFORMAT = '02'.
      WA_TAB-TDLINE   = L_TEXT+120(*).
      APPEND WA_TAB TO IT_TAB.
    ELSE.
      WA_TAB-TDFORMAT = '01'.
      WA_TAB-TDLINE   = L_TEXT.
      APPEND WA_TAB TO IT_TAB.
    ENDIF.
    CALL FUNCTION 'CREATE_TEXT'
      EXPORTING
        FID         = '0001' "Text ID
        FLANGUAGE   = SY-LANGU    "語言程式碼
        FNAME       = G_NAME "文字名稱
        FOBJECT     = 'VBBP' "文字物件
        SAVE_DIRECT = 'X'    "直接儲存標識
      TABLES
        FLINES      = IT_TAB
      EXCEPTIONS
        NO_INIT     = 1
        NO_SAVE     = 2
        OTHERS      = 3.

    L_NUMB = L_NUMB + 1.
    CONCATENATE 'LIPS-POSNR(' L_NUMB ')'   INTO L_POSNR_FIELD.
    CONCATENATE 'RV50A-CHMULT(' L_NUMB ')' INTO L_CHMULT_FIELD.
    CONCATENATE '=CHPL_T' L_NUMB           INTO L_CHPL_T_CODE.

    IF LT_SUB_LIPS[] IS NOT INITIAL.
      PERFORM BDC_DYNPRO      USING 'SAPMV50A'     '1000'.
      PERFORM BDC_FIELD       USING 'BDC_OKCODE'   L_CHPL_T_CODE.
      PERFORM BDC_FIELD       USING 'BDC_CURSOR'   L_CHMULT_FIELD.
    ENDIF.
    CLEAR L_NUMB_SUB.
    L_NUMB_SUB = 1.

    LV_INT_SUB     = LV_DB_CN_SUB DIV 8.
    LV_DECIMAL_SUB = LV_DB_CN_SUB MOD 8.
    LOOP AT LT_SUB_LIPS INTO DATA(LS_SUB_LIPS).

      DATA(LV_INDEX_SUB)   = SY-TABIX.
      LV_INDEX_SUB = LV_INDEX_SUB + 1.
      L_NUMB_SUB = L_NUMB_SUB + 1.
      IF L_NUMB_SUB = 2.
        DATA(LV_FLAG) = 'X'.
      ENDIF.

      READ TABLE LT_DLVR INTO DATA(LS_DLVR) WITH KEY EBELN = LS_SUB_LIPS-VGBEL
                                                     EBELP = LS_SUB_LIPS-VGPOS+1(5)
                                                     DLVNUM = LS_SUB_LIPS-LFIMG.
      IF SY-SUBRC = 0.
        DATA(LV_TABIX) = SY-TABIX.
        TEMP_LICHN = LS_DLVR-LICHN.	"供應商批號
        TEMP_HSDAT = LS_DLVR-HSDAT.   "生產日期
        TEMP_VFDAT = LS_DLVR-VFDAT.   "有效期至
        TEMP_KDMAT = LS_DLVR-KDMAT.   "爐號
        TEMP_EAN11 = LS_DLVR-EAN11.   "檢驗要求
        L_TEXT     = LS_DLVR-REMARK.   "備註
        DELETE LT_DLVR INDEX LV_TABIX.
      ENDIF.
      CLEAR:L_LIFEXPOS.
      L_LIFEXPOS = LS_DLVR-POSNR.

      CONCATENATE 'LIPS-POSNR(' L_NUMB_SUB ')' INTO L_POSNR_FIELD_SUB.
      CONCATENATE 'LIPS-LICHN(' L_NUMB_SUB ')'  INTO L_LICHN_FIELD.

*---------------------選擇螢幕1-------------------*
      PERFORM BDC_DYNPRO   USING 'SAPMV50A' '1000'."螢幕
      PERFORM BDC_FIELD       USING 'BDC_OKCODE'    '=IDET_T'."OK_CODE
      PERFORM BDC_FIELD       USING 'BDC_CURSOR'    L_POSNR_FIELD_SUB.
      PERFORM BDC_FIELD       USING 'BDC_CURSOR'    L_LICHN_FIELD.
      PERFORM BDC_FIELD       USING L_LICHN_FIELD   TEMP_LICHN.       "供應商批號


*---------------------選擇螢幕2-------------------*
      PERFORM BDC_DYNPRO   USING 'SAPMV50A' '3000'."螢幕
      PERFORM BDC_FIELD       USING 'BDC_OKCODE'    '=T\09'.

      PERFORM BDC_FIELD       USING 'BDC_SUBSCR'    'SAPMV50A   3502SUBSCREEN_HEADER'."
      PERFORM BDC_FIELD       USING 'BDC_CURSOR'    'LIPS-POSNR'.
      PERFORM BDC_FIELD       USING 'BDC_SUBSCR'    'SAPMV50A    3202SUBSCREEN_BODY'."OK_CODE
      PERFORM BDC_FIELD       USING 'BDC_SUBSCR'    'SAPMV50A   0611SUBSCREEN_BOTTOM'."OK_CODE  "

*---------------------選擇螢幕21-------------------*
      PERFORM BDC_DYNPRO   USING 'SAPMV50A' '3000'."螢幕
      PERFORM BDC_FIELD       USING 'BDC_OKCODE'    '=T\02'."OK_CODE
      PERFORM BDC_FIELD       USING 'BDC_SUBSCR'    'SAPMV50A   3502SUBSCREEN_HEADER'."
      PERFORM BDC_FIELD       USING 'BDC_SUBSCR'    'SAPMV50A   3216SUBSCREEN_BODY'.
      PERFORM BDC_FIELD       USING 'BDC_CURSOR'    'LIPS-POSNR'.

      PERFORM BDC_FIELD       USING 'BDC_CURSOR'    'LIPS-LIFEXPOS'.
      PERFORM BDC_FIELD       USING 'LIPS-LIFEXPOS'    L_LIFEXPOS.

*---------------------選擇螢幕3-------------------*
      PERFORM BDC_DYNPRO   USING 'SAPMV50A' '3000'."螢幕
      PERFORM BDC_FIELD       USING 'BDC_OKCODE'    '=BACK_T'."OK_CODE
      PERFORM BDC_FIELD       USING 'BDC_CURSOR'    'LIPS-EAN11'.     "

      IF TEMP_HSDAT IS NOT INITIAL.
        PERFORM CHANGE_DATE USING TEMP_HSDAT
                                  LV_HSDAT.
        PERFORM BDC_FIELD       USING 'LIPS-HSDAT'  LV_HSDAT.        "生產日期
      ENDIF.

      IF TEMP_VFDAT IS NOT INITIAL.
        PERFORM CHANGE_DATE USING TEMP_VFDAT
                                  LV_VFDAT.
        PERFORM BDC_FIELD       USING 'LIPS-VFDAT'    LV_VFDAT.      "有效期至
      ENDIF.

      PERFORM BDC_FIELD       USING 'RV50A-KDMAT_LA'  TEMP_KDMAT.   " 爐號
      PERFORM BDC_FIELD       USING 'LIPS-EAN11'      TEMP_EAN11.     "檢驗要求

*    拆分的子專案超過8行以後,需要點選下一頁的按鈕
      AT LAST.
        DATA(LV_LAST_SUB) = 'X'.
      ENDAT.
      IF LV_LAST_SUB = ''.
        IF L_NUMB_SUB = 8.
          PERFORM BDC_DYNPRO   USING 'SAPMV50A' '1000'."螢幕
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'    '=NPAG_T'."OK_CODE
          PERFORM BDC_FIELD       USING 'BDC_CURSOR'  'LIPS-POSNR(01)'.

          LV_TIME_SUB = LV_TIME_SUB + 1.
          CLEAR: L_NUMB_SUB.
          IF LV_INDEX_SUB = LV_INT_SUB * 8.
            L_NUMB_SUB = 8 - LV_DECIMAL_SUB.
            L_NUMB_SUB = L_NUMB_SUB - 1.
          ENDIF.
        ENDIF.
      ENDIF.
      CLEAR: TEMP_LICHN,  "供應商批號
             TEMP_HSDAT,   "生產日期
             TEMP_VFDAT,   "有效期至
             TEMP_KDMAT,   "爐號
             TEMP_EAN11.   "檢驗要求

      CLEAR: L_POSNR_FIELD_SUB,LS_DLVR.
    ENDLOOP.
    IF LT_SUB_LIPS[] IS NOT INITIAL.
      IF LV_TIME_SUB > 0.
        DO LV_TIME_SUB TIMES.
          PERFORM BDC_DYNPRO   USING 'SAPMV50A' '1000'."螢幕
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'    '=PPAG_T'."OK_CODE
          PERFORM BDC_FIELD       USING 'BDC_CURSOR'  'LIPS-POSNR(01)'.
        ENDDO.
      ENDIF.
      PERFORM BDC_DYNPRO      USING 'SAPMV50A'     '1000'.
      PERFORM BDC_FIELD       USING 'BDC_OKCODE'    '=CHPL_T01'."L_CHPL_T_CODE.
      PERFORM BDC_FIELD       USING 'BDC_CURSOR'    'RV50A-CHMULT(01)'."L_CHMULT_FIELD.
    ENDIF.
*  主專案超過8行以後,需要點選下一頁的按鈕
    AT LAST.
      DATA(LV_LAST) = 'X'.
    ENDAT.
    IF LV_LAST = ''.
      IF L_NUMB = 8.

        PERFORM BDC_DYNPRO   USING 'SAPMV50A' '1000'."螢幕
        PERFORM BDC_FIELD       USING 'BDC_OKCODE'    '=NPAG_T'."OK_CODE
        PERFORM BDC_FIELD       USING 'BDC_CURSOR'  'LIPS-POSNR(01)'.
        CLEAR: L_NUMB.
        IF L_INDEX = L_INT * 8.
          L_NUMB = 8 - L_DECIMAL.
        ENDIF.

      ENDIF.
    ENDIF.


    CLEAR:L_CHMULT_FIELD,L_POSNR_FIELD,L_CHPL_T_CODE,
          LS_DLVR,LV_INDEX_SUB,LV_TIME_SUB,LV_LAST_SUB.
  ENDLOOP.

*---------------------選擇螢幕4-------------------*
  PERFORM BDC_DYNPRO   USING 'SAPMV50A' '1000'."螢幕
  PERFORM BDC_FIELD       USING 'BDC_OKCODE'    '=SICH_T'."OK_CODE
*      PERFORM bdc_field       USING 'LV70T-SPRAS'    'ZH'."OK_CODE

  OPTION-DISMODE = 'N'.
  OPTION-UPDMODE = 'S'.
  OPTION-DEFSIZE = 'A'.
  L_TCODE = 'VL32N'.

  PERFORM CALL_BDC_TRANSACTION USING L_TCODE 'X'.
FORM bdc_field USING fnam fval.

  IF fval IS NOT INITIAL.
    CLEAR bdcdata.
    bdcdata-fnam = fnam.
    bdcdata-fval = fval.
    APPEND bdcdata.
  ENDIF.

ENDFORM.                    "bdc_field
*&---------------------------------------------------------------------*
*&      Form  bdc_field_null
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FNAM       text
*----------------------------------------------------------------------*
FORM bdc_field_null USING fnam.

  CLEAR bdcdata.
  bdcdata-fnam = fnam.
  bdcdata-fval = ''.
  APPEND bdcdata.

ENDFORM.                    "bdc_field
FORM call_bdc_transaction USING p_tcode LIKE sy-tcode fill_msg.

  CLEAR:messtab,messtab[].

***add by mark 2015-12-05   >>>>
*  IF p_tcode = 'XK01'.
*    option-NOBINPT = 'X'.
*    option-NOBIEND = 'J'.
*  ENDIF.
***add by mark 2015-12-05   >>>>
  CALL TRANSACTION p_tcode  USING bdcdata
                                                     OPTIONS FROM option
                                                     MESSAGES INTO messtab.
  READ TABLE messtab WITH KEY msgtyp = 'E'.
  IF sy-subrc <> 0.
    READ TABLE messtab WITH KEY msgtyp = 'S' msgid = 'F2'.
    IF sy-subrc NE 0.
      READ TABLE messtab WITH KEY msgtyp = 'S'.
      messtab-msgtyp = 'E'.
    ELSEIF messtab-msgnr NOT IN r_msgnr[].
      messtab-msgtyp = 'E'.
    ENDIF.
  ENDIF.

  CHECK fill_msg = 'X'.
  gt_return-type = messtab-msgtyp.
  PERFORM read_message USING gt_return-message.
  gt_return-message_v1 = messtab-msgv1.
  gt_return-message_v2 = messtab-msgv2.
  gt_return-message_v3 = messtab-msgv3.
  gt_return-message_v4 = messtab-msgv4.
  APPEND gt_return.

ENDFORM.                    "call_bdc_transaction