matinal:SAP ABAP 批量删除销售订单的程序,可直接使用

在sap应用中常常会需要批量删除一些错误录入的单据,为此开发了一个小程序。该程序为了安全,程序做了一下控制

1、限制用户只能删除自己的订单,不能删除别人输入的订单,如果需要修改一下查询条件;

2、系统默认为“测试运行”,方便用户在删除订单前要核实一下订单,确认不要误操作;

程序代码如下,供大家参考!

REPORT  zmatinal.

TYPE-POOLS: slis.
*----------------------------------------------------------------------*
*  data Declarations
*----------------------------------------------------------------------*
*公众号:matinal
TABLES: vbak.        " Sales Document: Header Data
*----------------------------------------------------------------------*
* table control Output Declarations
*----------------------------------------------------------------------*
TYPES: BEGIN OF tc_0100,
        sel(1),                      " Check box
        vbeln  LIKE vbak-vbeln,      " Sales Order Number
        erdat  LIKE vbak-erdat,      " Sales order creation date
        ernam  LIKE vbak-ernam,
        kunnr  LIKE likp-kunag,      " Sold-to Party
        name1  LIKE kna1-name1,      " Sold-to Company Name
        text(200),
      END OF tc_0100.
DATA: wa_tc_0100 TYPE tc_0100,
      it_tc_0100 TYPE tc_0100 OCCURS 0 WITH HEADER LINE.

DATA g_fieldcat TYPE slis_t_fieldcat_alv.

*----------------------------------------------------------------------*
* Selection Screen
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK params1 WITH FRAME TITLE text-001.
PARAMETER:  s_vkorg LIKE vbak-vkorg DEFAULT ‘6001‘ OBLIGATORY MODIF ID s1.  " " Sales Org.
SELECT-OPTIONS:
            s_vtweg FOR vbak-vtweg OBLIGATORY,     " Distribution Channel
            s_spart FOR vbak-spart OBLIGATORY DEFAULT ‘10‘,    " Division
            s_auart FOR vbak-auart OBLIGATORY,        " Order type
            s_erdat FOR vbak-erdat OBLIGATORY, " Sales order creation date
*            s_ERNAM FOR vbak-ERNAM OBLIGATORY , " Sales order creation date
            s_kunnr FOR vbak-kunnr ,        " Sold-to party
            s_vbeln FOR vbak-vbeln .        " Sales Order
PARAMETER  p_test AS CHECKBOX DEFAULT ‘X‘.

SELECTION-SCREEN END OF BLOCK params1.
***********************************************************************
*INITIALIZATION.
***********************************************************************
*公众号:matinal
INITIALIZATION.
  s_auart-sign = ‘I‘.
  s_auart-option = ‘EQ‘.
  s_auart-low = ‘ZC01‘.
  APPEND s_auart.
  s_auart-low = ‘ZC03‘.
  APPEND s_auart.
  s_auart-low = ‘ZC06‘.
  APPEND s_auart.
  s_auart-low = ‘ZC20‘.
  APPEND s_auart.
  s_vtweg-sign   = ‘I‘.
  s_vtweg-option = ‘EQ‘.
  s_vtweg-low    = ‘10‘.
  APPEND s_vtweg.
  s_vtweg-low    = ‘20‘.
  APPEND s_vtweg.
  s_vtweg-low    = ‘30‘.
  APPEND s_vtweg.
  s_vtweg-low    = ‘40‘.
  APPEND s_vtweg.
*----------------------------------------------------------------------*
* Selection Events Processing
*----------------------------------------------------------------------*
*公众号:matinal
AT SELECTION-SCREEN OUTPUT.
  PERFORM screen_check.

AT SELECTION-SCREEN.
  CLEAR:   it_tc_0100, wa_tc_0100.
  REFRESH: it_tc_0100.

START-OF-SELECTION.
  PERFORM extract_data.

END-OF-SELECTION.
  PERFORM change_sales_orders.
  PERFORM display_mes.

*&---------------------------------------------------------------------*
*&      Form  SCREEN_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*公众号:matinal
FORM screen_check.
  DATA: l_line TYPE i .
  DESCRIBE TABLE s_erdat LINES l_line.
  IF l_line EQ 0.
    s_erdat-sign   = ‘I‘.
    s_erdat-option = ‘BT‘.
    s_erdat-high   = sy-datum.
    s_erdat-low    = sy-datum.
    APPEND s_erdat.
  ENDIF.
  DESCRIBE TABLE s_vtweg LINES l_line.
  IF l_line EQ 0.
  ENDIF.
ENDFORM.                    "SCREEN_CHECK
*&---------------------------------------------------------------------*
*&      Form  extract_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM extract_data.
  DATA: lt_it1 LIKE it_tc_0100 OCCURS 0 WITH HEADER LINE,
        l_chk(1).                                          " for exclude incomplete SO
*公众号:matinal
  SELECT a~vbeln a~erdat a~ernam a~kunnr  INTO CORRESPONDING FIELDS OF TABLE lt_it1
  FROM vbak AS a
  WHERE a~vbeln IN s_vbeln
    AND a~auart IN s_auart
    AND a~vkorg EQ s_vkorg
    AND a~vtweg IN s_vtweg
    AND a~spart IN s_spart
    AND a~erdat IN s_erdat
    AND a~ernam = sy-uname
    AND a~kunnr IN s_kunnr.

  LOOP AT lt_it1.
* get sold-to party company name
    PERFORM get_customer_company_name USING lt_it1-kunnr CHANGING lt_it1-name1.
    MODIFY lt_it1.
  ENDLOOP.
  it_tc_0100[] = lt_it1[].
ENDFORM.                    "extract_data
*&---------------------------------------------------------------------*
*&      Form  GET_CUSTOMER_COMPANY_NAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->F_KUNNR    text
*      -->F_NAME     text
*----------------------------------------------------------------------*
FORM get_customer_company_name USING f_kunnr CHANGING f_name.
  CLEAR f_name.
  SELECT SINGLE name1 INTO f_name
  FROM kna1
  WHERE kunnr = f_kunnr.
ENDFORM.                    "GET_CUSTOMER_COMPANY_NAME
*&---------------------------------------------------------------------*
*&      Form  change_sales_orders
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM change_sales_orders.
  DATA: lt_order_header_in  LIKE bapisdh1,
        lt_order_header_inx LIKE bapisdh1x,
        lt_return           LIKE bapiret2 OCCURS 0 WITH HEADER LINE,
        lt_order_item_in    LIKE bapisditm OCCURS 0 WITH HEADER LINE,
        lt_order_item_inx   LIKE bapisditmx OCCURS 0 WITH HEADER LINE,
        cp_eind(1).

  SORT it_tc_0100 BY vbeln.
  DELETE ADJACENT DUPLICATES FROM it_tc_0100.
*公众号:matinal
  LOOP AT it_tc_0100.
    CLEAR:   lt_order_header_inx,lt_order_item_in, lt_order_item_inx, lt_return,cp_eind.
    REFRESH: lt_order_item_in, lt_order_item_inx, lt_return.
    lt_order_header_inx-updateflag = ‘D‘.
    IF p_test NE ‘X‘.
      CALL FUNCTION ‘BAPI_SALESORDER_CHANGE‘
        EXPORTING
          salesdocument    = it_tc_0100-vbeln
*         ORDER_HEADER_IN  = LT_ORDER_HEADER_IN
          order_header_inx = lt_order_header_inx
        TABLES
          return           = lt_return.
* 处理错误消息:通过判断消息的类型,来判断BAPI是否成功
      LOOP AT lt_return .
        IF lt_return-type EQ ‘E‘ OR
            lt_return-type = ‘A‘ OR
            lt_return = ‘X‘.
          cp_eind = ‘X‘.  "失败
          it_tc_0100-text = lt_return-message.
        ENDIF.
      ENDLOOP.
      IF cp_eind NE ‘X‘.
        CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT‘
          EXPORTING
            wait = ‘X‘.
      ELSE.
        CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK‘.
      ENDIF.
    ENDIF.
    IF  cp_eind NE ‘X‘ AND sy-subrc = 0.
      IF p_test = ‘X‘.
        it_tc_0100-text = ‘Test successfully.‘.

      ELSE.
        it_tc_0100-text = ‘Delete successfully.‘.
      ENDIF.
    ELSE.
      CONCATENATE  it_tc_0100-text ‘---‘ ‘Delete error.‘ into it_tc_0100-text.
    ENDIF.
    MODIFY it_tc_0100.
  ENDLOOP.
ENDFORM.                    "change_sales_orders


*&---------------------------------------------------------------------*
*&      Form  init_fieldedi
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_FIELDTAB  text
*----------------------------------------------------------------------*
FORM init_fieldedi USING p_p_fieldtab TYPE slis_t_fieldcat_alv.
  DATA: l_fieldcat TYPE slis_fieldcat_alv.
  REFRESH  p_p_fieldtab.
  CLEAR l_fieldcat.
  l_fieldcat-fieldname  = ‘VBELN‘.
  l_fieldcat-seltext_m = ‘ORDER NUMBER‘.
  l_fieldcat-outputlen = 10.
  APPEND l_fieldcat TO p_p_fieldtab.
  CLEAR l_fieldcat.
  l_fieldcat-fieldname  = ‘ERDAT‘.
  l_fieldcat-seltext_m = ‘Create Date‘.
  l_fieldcat-ref_fieldname = ‘ERDAT‘.
  l_fieldcat-ref_tabname = ‘VBAK‘.
  l_fieldcat-outputlen = 10.
  APPEND l_fieldcat TO p_p_fieldtab.
  CLEAR l_fieldcat.
  l_fieldcat-fieldname  = ‘ERNAM‘.
  l_fieldcat-seltext_m = ‘Input Person‘.
  l_fieldcat-ref_fieldname = ‘ERDAT‘.
  l_fieldcat-ref_tabname = ‘VBAK‘.
  l_fieldcat-outputlen = 10.
  APPEND l_fieldcat TO p_p_fieldtab.
  CLEAR l_fieldcat.
  l_fieldcat-fieldname  = ‘KUNNR‘.
  l_fieldcat-seltext_m = ‘Sold Code‘.
  l_fieldcat-ref_fieldname = ‘KUNNR‘.
  l_fieldcat-ref_tabname = ‘VBAK‘.
  l_fieldcat-outputlen = 10.
  APPEND l_fieldcat TO p_p_fieldtab.

  CLEAR l_fieldcat.
  l_fieldcat-fieldname  = ‘NAME1‘.
  l_fieldcat-seltext_m = ‘Sold Name1‘.
  l_fieldcat-outputlen = 35.
  APPEND l_fieldcat TO p_p_fieldtab.

  CLEAR l_fieldcat.
  l_fieldcat-fieldname  = ‘TEXT‘.
  l_fieldcat-seltext_m = ‘Message‘.
  l_fieldcat-outputlen = 120.
  APPEND l_fieldcat TO p_p_fieldtab.

ENDFORM.                               " INITIALIZE_FIELDEDI
*&---------------------------------------------------------------------*
*&      Form  display_mes
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_mes .
  PERFORM init_fieldedi USING g_fieldcat[].
  CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY‘
    EXPORTING
      i_callback_program = sy-repid
      it_fieldcat        = g_fieldcat[]
      i_save             = ‘A‘
      i_default          = ‘A‘
    TABLES
      t_outtab           = it_tc_0100.
ENDFORM.                    " display_mes

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的vector是一种动态数组,可以存储不同类型的元素。sort函数是C++ STL库中的一个算法函数,用于对容器中的元素进行排序。该函数可以接受三个参数,分别是要排序的容器的起始迭代器、结束迭代器和一个比较函数。 在引用中的例子中,使用sort函数对vector容器中的元素进行排序。sort函数默认使用小于号运算符(operator<)进行比较,因此默认情况下是按照升序对容器中的元素进行排序。 在引用中的例子中,定义了两个比较函数GreaterSort和LessSort,分别用于降序和升序排序。通过传入这些比较函数作为sort函数的第三个参数,可以实现自定义的排序方式。 在引用中的例子中,使用greater<int>()作为sort函数的第三个参数,实现了对容器中元素的降序排序。而没有传入第三个参数时,默认按照小于号运算符进行升序排序。 因此,C++中的vector容器可以通过sort函数进行排序,并且可以根据需要使用默认比较函数或自定义比较函数来实现不同的排序方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++中,结构体vector使用sort排序](https://blog.csdn.net/zhouxun623/article/details/49887555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [C++vector容器使用sort排序(含升序以及降序)](https://blog.csdn.net/G_matinal/article/details/126769371)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值