销售订单行项目批量导入(BDC)

这是一个使用ABAP编写的程序,用于批量导入销售订单行项目。程序通过读取外部文件,检查订单是否存在,然后执行BDC(Business Data Control)来更新或插入数据。它涉及订单号、项目号、物料号、数量等多个关键字段,并在完成后输出错误或成功信息。
摘要由CSDN通过智能技术生成

*----------------------------------------------------------------------*
* Program name : ZSD_BDC_ORDERITEM_NEW        Date written: 07-11-10   *
* Author's name: HouZhiYu                     Last update :            *
* Program title: 销售订单行项目批量导入                                *
*----------------------------------------------------------------------*
REPORT ZSD_BDC_ORDERITEM.

TABLES: VBAK,"销售凭证:抬头数据
        VBAP,"销售凭证:项目数据
        VBEP,"销售凭证:细目数据
        TVAP,"销售凭证:项目类别
        KONV."条件(事务数据)


*****************************************************************
*        INTERNAL TABLES
*****************************************************************
DATA: BEGIN OF L_VBAK OCCURS 0,
      VBELN    LIKE VBAP-VBELN,      "订单号
      POSNR    LIKE VBAP-POSNR,      "项目号
      MATNR    LIKE RV45A-MABNR,      "物料编号
      KWMENG(15)   TYPE C,  "数量
      KDMAT LIKE   VBAP-KDMAT,   "客户物料编号
      PSTYV LIKE   VBAP-PSTYV,   "项目类型
      UEPOS LIKE   VBAP-UEPOS,   "上层项
      PR01_KBETR(11)    TYPE C,                             "PR01价格
      PR01_KOEIN(5)    TYPE C,                              "PR01币种
      ETDAT LIKE   RV45A-ETDAT,  "首次日期
      PS_PSP_PNR(24) TYPE C,"WBS元素
      PN00_KBETR(11)    TYPE C,                             "PN00价格
      PN00_KOEIN(5)    TYPE C,                              "PN00币种
*      PN002_KBETR(5)    TYPE C,                             "PN00价格
*      PN002_KOEIN LIKE  RV45A-KOEIN,                        "PN00币种
      ZP01_KBETR(11)    TYPE C,                             "ZP01价格
      ZP01_KOEIN(5)    TYPE C,                              "ZP01币种
      ZP21_KBETR(11)    TYPE C,                             "ZP21价格
      ZP21_KOEIN(5)    TYPE C,                              "ZP21币种
      ZP03_KBETR(11)    TYPE C,                             "ZP03价格
      ZP03_KOEIN(5)    TYPE C,                              "ZP03币种
      ZP23_KBETR(11)    TYPE C,                             "ZP23价格
      ZP23_KOEIN(5)    TYPE C,                              "ZP23币种
      ZP05_KBETR(11)    TYPE C,                             "ZP05价格
      ZP05_KOEIN(5)    TYPE C,                              "ZP05币种
      ZP25_KBETR(11)    TYPE C,                             "ZP25价格
      ZP25_KOEIN(5)    TYPE C,                              "ZP25币种
      ZP08_KBETR(11)    TYPE C,                             "ZP08价格
      ZP08_KOEIN(5)    TYPE C,                              "ZP08币种
      ZP28_KBETR(11)    TYPE C,                             "ZP28价格
      ZP28_KOEIN(5)    TYPE C,                              "ZP28币种
      ZP09_KBETR(11)    TYPE C,                             "ZP09价格
      ZP09_KOEIN(5)    TYPE C,                              "ZP09币种
      ZP29_KBETR(11)    TYPE C,                             "ZP29价格
      ZP29_KOEIN(5)    TYPE C,                              "ZP29币种
      ZP11_KBETR(11)    TYPE C,                             "ZP11价格
      ZP11_KOEIN(5)    TYPE C,                              "ZP11币种
      ZP31_KBETR(11)    TYPE C,                             "ZP31价格
      ZP31_KOEIN(5)    TYPE C,                              "ZP31币种
      ZTERM  LIKE  VBKD-ZTERM,"付款方式
      S_PARTNER  LIKE  SDPARTNERLIST-PARTNER,"送达方
      JUMING(50)   TYPE C,      "局名
      IHREZ      LIKE VBKD-IHREZ,"售达方中您的参考
      POSEX      LIKE VBAP-POSEX,"售达方中采购订单项目
      IHREZ_E    LIKE VBKD-IHREZ_E,"送达方中您的参考
      END OF L_VBAK.
*---bdc专用-------------------------
DATA:T_BDC LIKE STANDARD TABLE OF BDCDATA INITIAL SIZE 0
                WITH HEADER LINE.      "STANDARD BDC TABLE

DATA: BEGIN OF MESSTAB OCCURS 0."输出消息号
        INCLUDE STRUCTURE BDCMSGCOLL.
DATA: END OF MESSTAB.

REFRESH T_BDC.
DATA: MODE TYPE C.
*-------输出错误信息内表--------------------------
DATA: BEGIN OF ITAB_MESSTAB OCCURS 0.

        INCLUDE STRUCTURE L_VBAK.

DATA:    FLAG(10)."错误标记
DATA:    MESSAGE(100)."信息

DATA: END OF ITAB_MESSTAB.
*--------------------------------------------
DATA: IT_UPLOAD LIKE L_VBAK OCCURS 0 WITH HEADER LINE.
DATA: IT_UPLOAD_SO LIKE L_VBAK OCCURS 0 WITH HEADER LINE.
DATA: P_VBELN LIKE VBAK-VBELN.
DATA L_NAME LIKE THEAD-TDNAME.
RANGES: R_PSTYV FOR VBAP-PSTYV.
DATA: SUM TYPE I.
*----------alv所需变量定义----------------------------------------------
TYPE-POOLS: SLIS.
DATA:
  V_REPID            LIKE SY-REPID,
  I_PERIOD           TYPE STRING.
DATA:
  GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
                                            "ALV 字段
  V_ALV_LAYOUT       TYPE SLIS_LAYOUT_ALV.  "ALV 样式
DATA GIT_LISTHEADER TYPE SLIS_T_LISTHEADER.
DATA GIT_EVENTS TYPE SLIS_T_EVENT.
*****************************************************************
*        SELECTION-SCREEN
*****************************************************************
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-001.
PARAMETERS: P_FILE LIKE RLGRAP-FILENAME OBLIGATORY.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: R1 TYPE C
            RADIOBUTTON GROUP MOD.
SELECTION-SCREEN COMMENT 3(20) TEXT-005 FOR FIELD R1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: R2 TYPE C
            RADIOBUTTON GROUP MOD.
SELECTION-SCREEN COMMENT 3(20) TEXT-006 FOR FIELD R2.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: R3 TYPE C
            RADIOBUTTON GROUP MOD DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(20) TEXT-007 FOR FIELD R3.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BLOCK1.

*&-------------------------------------------------------------------*
* AT SELECTION-SCREEN
*&-------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  PERFORM GET_FILENAME USING P_FILE.


*&-------------------------------------------------------------------*
* START-OF-SELECTION
*&-------------------------------------------------------------------*
START-OF-SELECTION.
  IF R1 = 'X'.
    MODE = 'A'.
  ENDIF.

START-OF-SELECTION.
  IF R2 = 'X'.
    MODE = 'E'.
  ENDIF.

START-OF-SELECTION.
  IF R3 = 'X'.
    MODE = 'N'.
  ENDIF.
  PERFORM MAIN.

*&---------------------------------------------------------------------*
*&      Form  main
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MAIN.

  PERFORM UPOLOAD_FILE.

  SORT IT_UPLOAD_SO BY VBELN.
  SORT IT_UPLOAD BY VBELN.

  LOOP AT IT_UPLOAD_SO.


*--检查订单是否存在--------------------------
    P_VBELN = IT_UPLOAD_SO-VBELN.
*-------------在P_VBELN前面补零-----
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
         EXPORTING
              INPUT  = P_VBELN
         IMPORTING
              OUTPUT = P_VBELN.

    CLEAR VBAK.
    SELECT SINGLE VBELN FROM VBAK
                   INTO VBAK-VBELN
                   WHERE VBELN = P_VBELN.

    IF SY-SUBRC <> 0.
      MOVE-CORRESPONDING IT_UPLOAD_SO TO ITAB_MESSTAB.
      ITAB_MESSTAB-FLAG = '失败'."错误标记
      ITAB_MESSTAB-MESSAGE = '该订单没有被创建,无法更新ITEM!!'."信息
      APPEND ITAB_MESSTAB.
      DELETE IT_UPLOAD WHERE VBELN = IT_UPLOAD_SO-VBELN.
      DELETE IT_UPLOAD_SO WHERE VBELN = IT_UPLOAD_SO-VBELN.
      CONTINUE.
    ENDIF.

*-----将外部数据赋值给要执行BDC的内表-------
    LOOP AT IT_UPLOAD WHERE VBELN = IT_UPLOAD_SO-VBELN.
      MOVE-CORRESPONDING IT_UPLOAD TO L_VBAK.
      APPEND L_VBAK.
    ENDLOOP.
*----判断当前表头合作伙伴个数-----------------
    SELECT COUNT( DISTINCT PARVW ) FROM VBPA
                      INTO SUM
                      WHERE VBELN = P_VBELN
                      AND   POSNR = '000000'.
*--数据检查如果没有问题则执行BDC------------------
    PERFORM CHECK_INPUT.
    CLEAR: L_VBAK[],IT_UPLOAD,L_VBAK,P_VBELN,
    SUM.

  ENDLOOP.
*---输出日志信息-----------
  PERFORM OUTPUT_LOG.
ENDFORM.                    " main
*&---------------------------------------------------------------------*
*&      Form  check_input
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM CHECK_INPUT.
  SORT L_VBAK BY VBELN  POSNR.
  LOOP AT L_VBAK.
*---数据检查-------
*以下数据为必填项,如果为空则报系统错误---------
*订单行项目/物料/数量/项目类型/首次日期/送达方/送达方中您的参考

    IF L_VBAK-POSNR = ''."订单行项目
      MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
      ITAB_MESSTAB-FLAG = '失败'."错误标记
      ITAB_MESSTAB-MESSAGE = '订单行项目不能为空'."信息
      APPEND ITAB_MESSTAB.
      DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
                    AND   POSNR = L_VBAK-POSNR.
      CONTINUE.
    ENDIF.


    IF L_VBAK-MATNR = ''."物料
      MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
      ITAB_MESSTAB-FLAG = '失败'."错误标记
      ITAB_MESSTAB-MESSAGE = '物料不能为空'."信息
      APPEND ITAB_MESSTAB.
      DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
                    AND   POSNR = L_VBAK-POSNR.
      CONTINUE.
    ENDIF.

    IF L_VBAK-KWMENG = ''."数量
      MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
      ITAB_MESSTAB-FLAG = '失败'."错误标记
      ITAB_MESSTAB-MESSAGE = '数量不能为空'."信息
      APPEND ITAB_MESSTAB.
      DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
                    AND   POSNR = L_VBAK-POSNR.
      CONTINUE.
    ENDIF.

    IF L_VBAK-PSTYV = ''."项目类型
      MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
      ITAB_MESSTAB-FLAG = '失败'."错误标记
      ITAB_MESSTAB-MESSAGE = '项目类型不能为空'."信息
      APPEND ITAB_MESSTAB.
      DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
                    AND   POSNR = L_VBAK-POSNR.
      CONTINUE.
    ENDIF.

    IF L_VBAK-ETDAT = ''."首次日期
      MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
      ITAB_MESSTAB-FLAG = '失败'."错误标记
      ITAB_MESSTAB-MESSAGE = '首次日期不能为空'."信息
      APPEND ITAB_MESSTAB.
      DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
                    AND   POSNR = L_VBAK-POSNR.
      CONTINUE.
    ENDIF.


*    IF L_VBAK-IHREZ_E = ''."送达方中您的参考
*      MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
*      ITAB_MESSTAB-FLAG = '失败'."错误标记
*      ITAB_MESSTAB-MESSAGE = '送达方中您的参考不能为空'."信息
*      APPEND ITAB_MESSTAB.
*      DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
*                    AND   POSNR = L_VBAK-POSNR.
*      CONTINUE.
*    ENDIF.

*&数量 ,价格处理。
    CONDENSE L_VBAK-KWMENG NO-GAPS.
    CONDENSE L_VBAK-PR01_KBETR NO-GAPS.
    CONDENSE L_VBAK-PN00_KBETR   NO-GAPS.
*    CONDENSE L_VBAK-PN002_KBETR  NO-GAPS.
    CONDENSE L_VBAK-ZP01_KBETR   NO-GAPS.                   "ZP01价格
    CONDENSE L_VBAK-ZP21_KBETR   NO-GAPS.                   "ZP21价格
    CONDENSE L_VBAK-ZP03_KBETR   NO-GAPS.                   "ZP03价格
    CONDENSE L_VBAK-ZP23_KBETR   NO-GAPS.                   "ZP23价格
    CONDENSE L_VBAK-ZP05_KBETR   NO-GAPS.                   "ZP05价格
    CONDENSE L_VBAK-ZP25_KBETR   NO-GAPS.                   "ZP25价格
    CONDENSE L_VBAK-ZP08_KBETR   NO-GAPS.                   "ZP08价格
    CONDENSE L_VBAK-ZP28_KBETR   NO-GAPS.                   "ZP28价格
    CONDENSE L_VBAK-ZP09_KBETR   NO-GAPS.                   "ZP09价格
    CONDENSE L_VBAK-ZP29_KBETR   NO-GAPS.                   "ZP29价格
    C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值