ZDN_BLOCK

本文介绍了一个ABAP程序示例,该程序通过读取销售订单并更改交货阻止状态来展示如何使用BDC(Business Workbench Dictionary Component)进行数据处理。程序首先检查权限,然后根据特定条件更改交货阻止,并通过事务代码VL02N提交更改。

*&---------------------------------------------------------------------*
*& Report  ZDN_BLOCK
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zdn_block.

INCLUDE zbdcrecx1.

DATA: gs_vbak LIKE vbak,
      gs_likp LIKE likp,
      p_mode TYPE ctu_mode VALUE 'N',
      l_subrc LIKE sy-subrc,
      l_lifsk LIKE likp-lifsk,
      is_authority,
      is_success.

DATA: BEGIN OF gt_out OCCURS 0,
      msg TYPE c LENGTH 100,
      END OF gt_out.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001 NO INTERVALS.
PARAMETERS: p_vbeln LIKE likp-vbeln.
SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.
  PERFORM get_data.
  PERFORM process_data.
*  PERFORM display_data.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_data .
  SELECT SINGLE vbelv AS vbeln FROM vbfa
    INTO CORRESPONDING FIELDS OF gs_vbak
    WHERE vbtyp_n = 'J'
      AND vbtyp_v = 'C'
      AND vbeln   = p_vbeln.

  SELECT SINGLE vkbur vkgrp INTO CORRESPONDING FIELDS OF gs_vbak
    FROM vbak
    WHERE vbeln = gs_vbak-vbeln.

  SELECT SINGLE lifsk INTO CORRESPONDING FIELDS OF gs_likp
    FROM likp
    WHERE vbeln = p_vbeln.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM process_data .
  CLEAR is_authority.
  PERFORM check_authority_pmc CHANGING l_subrc.
  IF l_subrc EQ 0.
    IF gs_likp-lifsk EQ 'Z0'.
      l_lifsk = 'Z1'.
      is_authority = 'X'.
    ELSEIF gs_likp-lifsk EQ 'Z1'.
      l_lifsk = 'Z0'.
      is_authority = 'X'.
    ENDIF.
  ENDIF.
  PERFORM check_authority_pmt CHANGING l_subrc.
  IF l_subrc EQ 0.
    IF gs_likp-lifsk EQ 'Z1'.
      l_lifsk = ''.
      is_authority = 'X'.
    ELSEIF gs_likp-lifsk EQ ''.
      l_lifsk = 'Z1'.
      is_authority = 'X'.
    ENDIF.
  ENDIF.

  IF NOT is_authority IS INITIAL.
    PERFORM bdc_vl02n USING l_lifsk.
  ELSE.
    is_success = 'D'.
    export is_success to MEMORY id 'DN_STATUS'.
  ENDIF.

*  IF l_lifsk IS INITIAL.
*    CONCATENATE 'You can not change the delivery block for DN' p_vbeln
*      INTO gt_out-msg.
*    APPEND gt_out.
*  ENDIF.

ENDFORM.                    " PROCESS_DATA
*&---------------------------------------------------------------------*
*&      Form  BDC_VL02N
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0082   text
*----------------------------------------------------------------------*
FORM bdc_vl02n  USING p_lifsk TYPE likp-lifsk.
  PERFORM bdc_dynpro      USING 'SAPMV50A' '4004'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'LIKP-VBELN'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '/00'.
  PERFORM bdc_field       USING 'LIKP-VBELN'
                                p_vbeln.
  PERFORM bdc_dynpro      USING 'SAPMV50A' '1000'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=HADM_T'.
  PERFORM bdc_dynpro      USING 'SAPMV50A' '2000'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=SICH_T'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'LIKP-LIFSK'.
  PERFORM bdc_field       USING 'LIKP-LIFSK'
                                p_lifsk.
  CALL TRANSACTION 'VL02N'
    USING bdcdata
    MODE p_mode
    UPDATE 'S'
    MESSAGES INTO messtab.
  READ TABLE messtab WITH KEY msgtyp = 'E'.
  IF sy-subrc EQ 0.
*    CONCATENATE 'Change the delivery block for DN' p_vbeln
*      'to' p_lifsk 'failure' INTO gt_out-msg SEPARATED BY space.
*    APPEND gt_out.
    is_success = 'N'.
  ELSE.
    READ TABLE messtab WITH KEY msgid = '00'
                                msgnr = '347'.
    IF sy-subrc eq 0.
      is_success = 'B'.
    ELSE.
      is_success = 'Y'.
      EXPORT p_lifsk TO MEMORY id 'BLOCK_FIELD'.
    ENDIF.
  ENDIF.
  EXPORT is_success TO MEMORY id 'DN_STATUS'.
  REFRESH bdcdata.
ENDFORM.                                                    " BDC_VL02N
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_data .
  LOOP AT gt_out.
    WRITE:/ gt_out-msg.
  ENDLOOP.
ENDFORM.                    " DISPLAY_DATA
*&---------------------------------------------------------------------*
*&      Form  CHECK_AUTHORITY_PMT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_SUBRC  text
*----------------------------------------------------------------------*
FORM check_authority_pmt  CHANGING p_subrc TYPE sy-subrc.
  AUTHORITY-CHECK OBJECT 'ZDNAPP01'
               ID 'ACTVT'  FIELD '02'
               ID 'VKBUR' FIELD gs_vbak-vkbur
               ID 'VKGRP' FIELD gs_vbak-vkgrp.
  p_subrc = sy-subrc.
ENDFORM.                    " CHECK_AUTHORITY_PMT
*&---------------------------------------------------------------------*
*&      Form  CHECK_AUTHORITY_PMC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_SUBRC  text
*----------------------------------------------------------------------*
FORM check_authority_pmc  CHANGING p_subrc TYPE sy-subrc.
  AUTHORITY-CHECK OBJECT 'ZDNAPP01'
                   ID 'ACTVT'  FIELD '01'
                   ID 'VKBUR' FIELD gs_vbak-vkbur
                   ID 'VKGRP' FIELD gs_vbak-vkgrp.
  p_subrc = sy-subrc.
ENDFORM.                    " CHECK_AUTHORITY_PMC

FORM frm_get_delivery_data . DATA:lv_tdline TYPE string. DATA:lv_name TYPE thead-tdname. SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_delivery_alv FROM zv_sd_005 WHERE werks IN s_cwerks AND zdn IN s_zdn AND kunnr IN s_kunnr AND wbstk = 'C' AND wadat_ist IN s_ccpudt AND lfart <> 'ZL4' AND lfart <> 'ZL5'. SORT gt_delivery_alv BY zdn zmeslotid. IF gt_delivery_alv IS NOT INITIAL. SELECT zpartner, bu_group, bu_sort1, znick_name INTO TABLE @DATA(lt_zv_sd_021) FROM zv_sd_021 FOR ALL ENTRIES IN @gt_delivery_alv WHERE zpartner = @gt_delivery_alv-kunnr. SORT lt_zv_sd_021 BY zpartner. SELECT vkorg, vtweg, kunnr, matnr, kdmat INTO TABLE @DATA(lt_knmt) FROM knmt FOR ALL ENTRIES IN @gt_delivery_alv WHERE vkorg = @gt_delivery_alv-vkorg AND vtweg = @gt_delivery_alv-vtweg AND kunnr = @gt_delivery_alv-kunnr AND matnr = @gt_delivery_alv-matnr. SORT lt_knmt BY vkorg vtweg kunnr matnr. "产成品收货凭证 SELECT mblnr, mjahr, zmeslotid, aufnr, gamng, werks, charg, productname, zkunnr, zdelivered_check, zdeliv_check_date, zdeliv_check_time, lgpbe INTO TABLE @DATA(lt_ztmm028) FROM ztmm028 FOR ALL ENTRIES IN @gt_delivery_alv WHERE werks = @gt_delivery_alv-werks AND productname = @gt_delivery_alv-matnr AND charg = @gt_delivery_alv-charg AND zdeliv_check_date IN @s_ccpudt. IF lt_ztmm028 IS NOT INITIAL. SELECT * FROM ztpp012 FOR ALL ENTRIES IN @lt_ztmm028 WHERE lotid = @lt_ztmm028-zmeslotid INTO TABLE @DATA(lt_ztpp012). SORT lt_ztpp012 BY lotid issuedate DESCENDING issuetime DESCENDING . ENDIF. SELECT b~zdn, a~vbeln, a~posnr, a~carton INTO TABLE @DATA(lt_dn_max) FROM ztsd016 AS a INNER JOIN ztsd015 AS b ON a~vbeln = b~vbeln FOR ALL ENTRIES IN @gt_delivery_alv WHERE b~zdn = @gt_delivery_alv-zdn. SORT lt_dn_max BY zdn carton DESCENDING. DELETE ADJACENT DUPLICATES FROM lt_dn_max COMPARING zdn. "销货单抬头 SELECT xblnr, zdn, zispitch, groes, afnam, ztracking_number * zcustomer_type INTO TABLE @DATA(lt_ztsd018) FROM ztsd018 FOR ALL ENTRIES IN @gt_delivery_alv WHERE zdn = @gt_delivery_alv-zdn. ENDIF. LOOP AT gt_delivery_alv INTO gs_delivery_alv. READ TABLE lt_zv_sd_021 INTO DATA(ls_zv_sd_021) WITH KEY zpartner = gs_delivery_alv-kunnr BINARY SEARCH. IF sy-subrc = 0. gs_delivery_alv-znick_name = ls_zv_sd_021-znick_name. ENDIF. READ TABLE lt_knmt INTO DATA(ls_knmt) WITH KEY vkorg = gs_delivery_alv-vkorg vtweg = gs_delivery_alv-vtweg kunnr = gs_delivery_alv-kunnr matnr = gs_delivery_alv-matnr BINARY SEARCH. IF sy-subrc = 0. gs_delivery_alv-kdmat = ls_knmt-kdmat. ENDIF. READ TABLE lt_ztmm028 INTO DATA(ls_ztmm028) WITH KEY werks = gs_delivery_alv-werks productname = gs_delivery_alv-matnr charg = gs_delivery_alv-charg. IF sy-subrc = 0. gs_delivery_alv-zmeslotid = ls_ztmm028-zmeslotid. gs_delivery_alv-zdelivered_check = ls_ztmm028-zdelivered_check. gs_delivery_alv-zdeliv_check_date = ls_ztmm028-zdeliv_check_date. gs_delivery_alv-lgpbe = ls_ztmm028-lgpbe."架位 READ TABLE lt_ztpp012 INTO DATA(ls_ztpp012) WITH KEY lotid = ls_ztmm028-zmeslotid. IF sy-subrc = 0. CALL FUNCTION 'ZPP_WAFERID_SPLIT' EXPORTING iv_componentid = ls_ztpp012-componentid IMPORTING ev_waferid = gs_delivery_alv-waferid. CALL FUNCTION 'ZPP_WAFERID_CONCAT' EXPORTING iv_componentid = gs_delivery_alv-waferid IMPORTING ev_waferid = gs_delivery_alv-waferid. ENDIF. ENDIF. gs_delivery_alv-ntgew_t = gs_delivery_alv-ntgew * gs_delivery_alv-lfimg. gs_delivery_alv-brgew_t = gs_delivery_alv-ntgew_t + gs_delivery_alv-brgew. READ TABLE lt_dn_max INTO DATA(ls_dn_max) WITH KEY zdn = gs_delivery_alv-zdn. IF sy-subrc = 0. gs_delivery_alv-carton_c = ls_dn_max-carton && '-' && gs_delivery_alv-carton. ENDIF. gs_delivery_alv-origin = 'China'. READ TABLE lt_ztsd018 INTO DATA(ls_ztsd018) WITH KEY zdn = gs_delivery_alv-zdn. IF sy-subrc = 0. * gs_delivery_alv-zcustomer_type = ls_ztsd018-zcustomer_type. gs_delivery_alv-zispitch = ls_ztsd018-zispitch. gs_delivery_alv-groes = ls_ztsd018-groes. gs_delivery_alv-bookingfor = ls_ztsd018-afnam. gs_delivery_alv-dim = ls_ztsd018-groes. gs_delivery_alv-ztracking_number = ls_ztsd018-ztracking_number. IF ls_ztsd018-zispitch = '0'. gs_delivery_alv-zispitch_c = '否'. gs_delivery_alv-zbzlx = '纸箱'. ELSEIF ls_ztsd018-zispitch = '1'. gs_delivery_alv-zispitch_c = '是'. gs_delivery_alv-zbzlx = '栈板'. ENDIF. ENDIF. lv_name = gs_delivery_alv-vbeln. CLEAR lv_tdline. PERFORM call_read_text USING lv_name '1' 'Z007' 'VBBK' CHANGING lv_tdline. gs_delivery_alv-kunnr_address = lv_tdline. CLEAR lv_tdline. PERFORM call_read_text USING lv_name '1' 'Z008' 'VBBK' CHANGING lv_tdline. gs_delivery_alv-kunnr_lxr = lv_tdline. CLEAR lv_tdline. PERFORM call_read_text USING lv_name '1' 'Z009' 'VBBK' CHANGING lv_tdline. gs_delivery_alv-kunnr_tel = lv_tdline. MODIFY gt_delivery_alv FROM gs_delivery_alv. CLEAR gs_delivery_alv. ENDLOOP. DELETE gt_delivery_alv WHERE zmeslotid = ''. IF s_clotid IS NOT INITIAL. DELETE gt_delivery_alv WHERE zmeslotid NOT IN s_clotid. ENDIF. SORT gt_delivery_alv BY zdn carton.这段代码的哪个逻辑会导致gt_delivery_alv里出现多个DN号
最新发布
09-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值