ABAP DEMO so批量导入

*&---------------------------------------------------------------------*
*& Report  YDEMO_015
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT  YDEMO_015.

*&---------------------------------------------------------------------*
*&                 TOP
*&---------------------------------------------------------------------*
"相关表引用声明
TABLES:VBAK, VBAP,
       EKKO, EKPO,
       EKET, MEAN,
       MARA, MAKT,
       MARD, MARC,
       EORD, LFA1,
       EINA, T023T,
       T001W,T001L,
       KNA1, TVKO,
       TVKOV,TVAK,
       TVBUR.
TABLES:SSCRFIELDS.


*----------------------------------------------------------------------
*                          Internal table
*----------------------------------------------------------------------
*&EXCEL上传数据结构
TYPES:BEGIN OF TY_UP,
        BSTNK       LIKE VBAK-BSTNK, "客户订单号码
        KUNNR       LIKE VBAK-KUNNR, "客户代码
        NAME1       LIKE KNA1-NAME1, "客户名称1
        STREET      LIKE ADRC-STREET,"送货地址(KNA1-ADRNR->ADRC)
        AUART       LIKE VBAK-AUART, "SAP销售订单类型
        VKORG       LIKE VBAK-VKORG, "销售组织
        VKBUR       LIKE VBAK-VKBUR, "销售部门
        MATNR       LIKE VBAP-MATNR, "商品编码
        MAKTX       LIKE MAKT-MAKTX, "商品名称
        KWMENG      LIKE VBAP-KWMENG,"销售数量
        VRKME       LIKE VBAP-VRKME, "销售单位

        KBETR       LIKE KONV-KBETR, "单价
        WAERK       LIKE VBAP-WAERK, "币种
        KMEIN       LIKE VBAP-KMEIN, "EKPO-PEINH, "价格单位
        VDATU       LIKE VBAK-VDATU, "交货日期
        WERKS       LIKE VBAP-WERKS, "发货地点
        VTWEG       LIKE VBAK-VTWEG, "分销渠道
        SPART       LIKE VBAK-SPART, "产品组

        VBELN       LIKE VBAK-VBELN,
        FLAG(1),
        ICON        TYPE C,          "图标
        SEL         TYPE C,
        LIN(08)     TYPE N,          "LIKE SY-TABIX,
        REASON(500),

      END OF TY_UP.

TYPES:BEGIN OF TY_HA,   "EXCEL上传数据结构
        BSTNK       LIKE VBAK-BSTNK, "客户订单号码
        KUNNR       LIKE VBAK-KUNNR, "客户
        NAME1       LIKE KNA1-NAME1, "客户名称1
        STREET      LIKE ADRC-STREET,"送货地址(KNA1-ADRNR->ADRC)
        AUART       LIKE VBAK-AUART, "SAP销售订单类型
        VKORG       LIKE VBAK-VKORG, "销售组织
        VKBUR       LIKE VBAK-VKBUR, "销售部门
        VTWEG       LIKE VBAK-VTWEG, "销售渠道
        SPART       LIKE VBAK-SPART, "产品组
        VDATU       LIKE VBAK-VDATU, "交货日期

        VBELN       LIKE VBAK-VBELN,
        FLAG(1),
        ICON        TYPE C,          "图标
        REASON(500),
        LIN         TYPE SY-TABIX,
        SEL         TYPE C,
      END OF TY_HA.

DATA:GT_UP   TYPE STANDARD TABLE OF TY_UP,
     WA_UP   TYPE TY_UP,
*&so抬头数据
     GT_HA   TYPE STANDARD TABLE OF TY_HA,
     WA_HA   TYPE TY_HA,
*&比对重复记录
     GT_UPE  TYPE STANDARD TABLE OF TY_HA,
     WA_UPE  TYPE TY_HA,
*&创建so
     GT_HEAD TYPE STANDARD TABLE OF TY_HA WITH HEADER LINE,
     WA_HEAD TYPE TY_HA,
     LT_HEAD LIKE TABLE OF GT_HEAD,
     GT_ITAB LIKE STANDARD TABLE OF ALSMEX_TABLINE WITH HEADER LINE,
     G_TABIX LIKE SY-TABIX.
* GT_TVAK LIKE TVAK OCCURS 0 WITH HEADER LINE,
FIELD-SYMBOLS : <FS> TYPE ANY.

*----------------------------------------------------------------------
*                          Variants
*----------------------------------------------------------------------
DATA: G_LIN      TYPE I,
      G_SLIN     TYPE I,
      G_FLIN     TYPE I,
      G_TEXT(80).
DATA: C_ECOL TYPE I ,
      G_FILE TYPE CHAR20,
      G_NAME TYPE CHAR40.

DATA:L_VBELN   LIKE BAPIVBELN-VBELN.
DATA:WA_HEADER  TYPE BAPISDHD1,  "
     WA_HEADERX TYPE BAPISDHD1X, "
     WA_PARTNER TYPE BAPIPARNR,  "
     WA_ITEM    TYPE BAPISDITM,
     WA_ITEMX   TYPE BAPISDITMX,
     WA_COND    TYPE BAPICOND,
     WA_CONDX   TYPE BAPICONDX,
     WA_SCH     TYPE BAPISCHDL,
     WA_BAPE    TYPE BAPE_VBAK,
     WA_EX      TYPE BAPIPAREX,
     WA_TEXT    TYPE BAPISDTEXT,
     LT_PART    TYPE STANDARD TABLE OF BAPIPARNR,
     LT_ITEM    TYPE STANDARD TABLE OF BAPISDITM,
     LT_ITEMX   TYPE STANDARD TABLE OF BAPISDITMX,
     LT_SCH     TYPE STANDARD TABLE OF BAPISCHDL,
     LT_SCHX    TYPE STANDARD TABLE OF BAPISCHDLX,
     L_RETURN   LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE,
     LT_COND    TYPE STANDARD TABLE OF BAPICOND,
     LT_CONDX   TYPE STANDARD TABLE OF BAPICONDX,
     LT_TEXT    LIKE STANDARD TABLE OF BAPISDTEXT,
     LT_EX      TYPE STANDARD TABLE OF BAPIPAREX.
*---------------------------------------------------------------------*
*  Data parameters for alv report use
*---------------------------------------------------------------------*
DATA: G_PROGRAM    TYPE SY-REPID,
      GS_LAYOUT    TYPE SLIS_LAYOUT_ALV,
      GS_LAYOUT1   TYPE SLIS_LAYOUT_ALV,
      GT_FIELDCAT  TYPE SLIS_T_FIELDCAT_ALV,
      GS_FIELDCAT  LIKE LINE OF GT_FIELDCAT,
      GT_FIELDCAT1 TYPE SLIS_T_FIELDCAT_ALV,
      GS_FIELDCAT1 LIKE LINE OF GT_FIELDCAT,
      WA_FIELDCAT  TYPE SLIS_FIELDCAT_ALV,
      WA_FIELDCAT1 TYPE SLIS_FIELDCAT_ALV,
      IT_EVENTS    TYPE SLIS_T_EVENT WITH HEADER LINE,
      GT_EVENT     TYPE SLIS_T_EVENT,
      WA_EVENT     TYPE SLIS_ALV_EVENT.
DATA: GT_LIST_TOP_OF_PAGE     TYPE SLIS_T_LISTHEADER.
DATA: GC_FORMNAME_TOP_OF_PAGE TYPE SLIS_FORMNAME
                              VALUE 'ALV_TOP_OF_PAGE'.

RANGES:R_BSTNK FOR VBAK-BSTNK."客户订单号码


************************************************************************
*             Select Screen                                            *
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.

PARAMETERS:P_FNAME LIKE RLGRAP-FILENAME MEMORY ID M01. "OBLIGATORY.TYPE STRING

SELECTION-SCREEN END OF BLOCK BLK1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.

PARAMETERS:P_TEST   RADIOBUTTON GROUP RAD1 DEFAULT 'X',
           P_EXCUTE RADIOBUTTON GROUP RAD1.

SELECTION-SCREEN FUNCTION KEY 1.

SELECTION-SCREEN : END OF BLOCK B2.



*&------------------------------------------------------------------*
*&              INITIALIZATION
*&------------------------------------------------------------------*
INITIALIZATION.
  PERFORM FRM_INIT_FIELD.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FNAME.
  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    EXPORTING
      MASK      = '*.xls'
      STATIC    = 'X'
    CHANGING
      FILE_NAME = P_FNAME.

  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.


AT SELECTION-SCREEN.

  PERFORM FRM_CHECK_AUTHOR.
  PERFORM FRM_DOWN_EXCEL.


START-OF-SELECTION.

  PERFORM FRM_GET_DATA.
*&test run
  IF P_TEST EQ 'X'.
    PERFORM FRM_TEST_RUN.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_FIELD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_INIT_FIELD .

  SSCRFIELDS-FUNCTXT_01 = '下载EXCEL模板'.
  C_ECOL = 16.
  G_FILE = 'ZDQT005'.
  G_NAME = '电器采销售订单导入模板.XLS'.
ENDFORM.                    " FRM_INIT_FIELD
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_AUTHOR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CHECK_AUTHOR .

ENDFORM.                    " FRM_CHECK_AUTHOR
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWN_EXCEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DOWN_EXCEL .

  DATA:LW_PATH TYPE STRING.
  DATA:L_FORMKEY LIKE WWWDATATAB,
       L_FILE    TYPE CHAR20,
       L_PATH    TYPE LOCALFILE,
       L_TYPE    TYPE FILEFORMAT,
       L_NAME    TYPE CHAR40.

  IF SSCRFIELDS-UCOMM = 'FC01'.
*&S1.选择文件路径
*  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
*    EXPORTING
*      MASK      = '*.xls'
*      STATIC    = 'X'
*    CHANGING
*      FILE_NAME = P_FNAME.
*  IF SY-SUBRC <> 0.
*    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*  ENDIF.
*    L_TYPE = 'XLS'.
*&S2.下载文件
    CONCATENATE 'MI' G_FILE INTO L_FORMKEY.
* CONCATENATE P_FNAME G_NAME INTO L_PATH.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        KEY         = L_FORMKEY
        DESTINATION = L_PATH
      CHANGING
        TEMP        = L_PATH.
  ELSE.
    IF P_FNAME IS INITIAL.
      MESSAGE E001(00) WITH '请输入文件路径!'.
      STOP.
    ENDIF.
  ENDIF.

ENDFORM.                    " FRM_DOWN_EXCEL
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .

*&一致性检查:
  DATA:L_INDEX TYPE I,
       LR_OREF TYPE REF TO CX_ROOT,
       LV_TEXT TYPE STRING.
  DATA:LT_RAW TYPE TRUXS_T_TEXT_DATA.

  CLEAR:GT_UP[],GT_HA[],
        WA_UP,  WA_HEAD,
        GT_ITAB[], GT_ITAB.
*&S1.读取上传excel到内表
*  ( CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' )"要进行行列转换 限制1W行,
*  ( CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' )"直接转换到目标内表
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*     I_FIELD_SEPERATOR    =
      I_LINE_HEADER        = 'X'
      I_TAB_RAW_DATA       = LT_RAW
      I_FILENAME           = P_FNAME
    TABLES
      I_TAB_CONVERTED_DATA = GT_UP
    EXCEPTIONS
      CONVERSION_FAILED    = 1
      OTHERS               = 2.

  IF SY-SUBRC <> 0.
    MESSAGE ID     SY-MSGID
            TYPE   SY-MSGTY
            NUMBER SY-MSGNO
            WITH   SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

*&S2.内表单元格检查
  LOOP AT GT_UP INTO WA_UP.
    G_TABIX = SY-TABIX.
    WA_UP-LIN = SY-INDEX.
*&2.1客户订单号码
    IF WA_UP-BSTNK IS INITIAL.
      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
      WA_UP-REASON = '客户订单号码必输!'.

    ELSE.
      SELECT SINGLE *
               FROM VBAK
              WHERE BSTNK = WA_UP-BSTNK.
      IF SY-SUBRC = 0.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '客户订单:' WA_UP-BSTNK '已导入'  ' /' WA_UP-REASON INTO

WA_UP-REASON.
      ENDIF.

    ENDIF.

*&S2.1.1栏位格式转换
    CONDENSE WA_UP-KUNNR NO-GAPS.
    CONDENSE WA_UP-MATNR NO-GAPS.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = WA_UP-KUNNR
      IMPORTING
        OUTPUT = WA_UP-KUNNR.
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        INPUT  = WA_UP-MATNR
      IMPORTING
        OUTPUT = WA_UP-MATNR.

*&2.2客户代码检查
    IF WA_UP-KUNNR IS NOT INITIAL.
      SELECT SINGLE *
               FROM KNA1
              WHERE KUNNR = WA_UP-KUNNR.
      IF SY-SUBRC NE 0.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '客户代码错误' ' /' WA_UP-REASON INTO WA_UP-REASON.
      ENDIF.

    ELSE.
*& KNVV里找默认的零售的客户代码
      SELECT SINGLE KUNNR
        INTO WA_UP-KUNNR
        FROM KNVV
       WHERE VKORG EQ WA_UP-VKORG
         AND VTWEG EQ WA_UP-VTWEG
         AND SPART EQ WA_UP-SPART.
      IF SY-SUBRC NE 0.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '找不到默认零售客户,请检查!'  ' /' WA_UP-REASON INTO

WA_UP-REASON.
      ENDIF.

    ENDIF.
*&2.3客户名称
    IF WA_UP-KUNNR IS INITIAL.
      IF WA_UP-NAME1 IS INITIAL.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '客户名称必输!' ' /' WA_UP-REASON INTO WA_UP-REASON.
      ENDIF.
    ENDIF.
*&2.4送货地址
    IF WA_UP-KUNNR IS INITIAL.
      IF WA_UP-STREET IS INITIAL.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '送货地址必输!' ' /' WA_UP-REASON INTO WA_UP-REASON.
      ENDIF.
    ENDIF.
*&2.5订单类型
    IF WA_UP-AUART IS INITIAL.
      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
      CONCATENATE '订单类型必输!' ' /' WA_UP-REASON INTO WA_UP-REASON.

    ELSE.
*&订单类型检查
      SELECT SINGLE *
               FROM TVAK
              WHERE AUART = WA_UP-AUART.
      IF SY-SUBRC NE 0.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '订单类型错误' ' /' WA_UP-REASON INTO WA_UP-REASON.
      ENDIF.

    ENDIF.
*&2.6销售组织
    IF WA_UP-VKORG IS INITIAL.
      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
      CONCATENATE '销售组织必输!' ' /' WA_UP-REASON INTO WA_UP-REASON.

    ELSE.
*&销售组织检查
      SELECT SINGLE *
               FROM TVKO
              WHERE VKORG = WA_UP-VKORG.
      IF SY-SUBRC NE 0.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '销售组织错误' ' /' WA_UP-REASON INTO WA_UP-REASON.
      ENDIF.

    ENDIF.
*&2.7销售部门
    IF WA_UP-VKBUR IS INITIAL.
      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
      CONCATENATE '销售部门必输!' ' /' WA_UP-REASON INTO WA_UP-REASON.

    ELSE.
*&销售部门检查
      SELECT SINGLE *
               FROM TVBUR
              WHERE VKBUR = WA_UP-VKBUR.
      IF SY-SUBRC NE 0.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '销售部门错误' ' /' WA_UP-REASON INTO WA_UP-REASON.
      ENDIF.

    ENDIF.
*&2.8商品编码
    IF WA_UP-MATNR IS INITIAL.
      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
      CONCATENATE '商品编码必输!' ' /' WA_UP-REASON INTO WA_UP-REASON.

    ELSE.
*&商品检查
      SELECT SINGLE *
               FROM MARA
              WHERE MATNR = WA_UP-MATNR.
      IF SY-SUBRC NE 0.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '商品不存在' ' /'  WA_UP-REASON INTO WA_UP-REASON.
      ENDIF.

    ENDIF.
*&2.9商品名称

*&S2.10销售数量
    CLEAR LV_TEXT.
    TRY.
        IF WA_UP-KWMENG IS INITIAL.
          WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
          CONCATENATE '销售数量必输!' ' /' WA_UP-REASON INTO WA_UP-REASON.
        ENDIF.
      CATCH CX_SY_CONVERSION_ERROR INTO LR_OREF.
        LV_TEXT = LR_OREF->GET_TEXT( ).
    ENDTRY.
    IF LV_TEXT IS NOT INITIAL.
      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
      CONCATENATE '数量包含无效字符' ' /'  WA_UP-REASON INTO WA_UP-REASON.

    ELSE.
*&数量检查
      IF WA_UP-KWMENG <= 0.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '数量不能小于0' ' /' WA_UP-REASON INTO WA_UP-REASON.
      ENDIF.

    ENDIF.
*&2.11销售单位
    IF WA_UP-VRKME IS INITIAL.
      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
      CONCATENATE '销售单位必输!' ' /'  WA_UP-REASON INTO WA_UP-REASON.
    ENDIF.
*&2.12单价必输
    CLEAR LV_TEXT.
    TRY.
        IF WA_UP-KBETR IS INITIAL.
          WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
          CONCATENATE '单价必输!' ' /'  WA_UP-REASON INTO WA_UP-REASON.
        ENDIF.
      CATCH CX_SY_CONVERSION_ERROR INTO LR_OREF.
        LV_TEXT = LR_OREF->GET_TEXT( ).
    ENDTRY.
    IF LV_TEXT IS NOT INITIAL.
      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
      CONCATENATE '单价包含无效字符' ' /'  WA_UP-REASON INTO WA_UP-REASON.
    ENDIF.
*&2.13币种(如果为空,默认为CNY)
    IF WA_UP-WAERK IS INITIAL.
      WA_UP-WAERK = 'CNY'.
    ENDIF.
*&2.14价格单位(如果为空,默认为销售单位)
    IF WA_UP-KMEIN IS INITIAL.
      WA_UP-KMEIN =  WA_UP-VRKME.
    ENDIF.
*&2.15交货日期
    IF WA_UP-VDATU IS INITIAL.
      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
      CONCATENATE '交货日期必输!' ' /' WA_UP-REASON INTO WA_UP-REASON.

    ELSE.
*&日期栏位格式检查
      CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
        EXPORTING
          DATE                      = WA_UP-VDATU
        EXCEPTIONS
          PLAUSIBILITY_CHECK_FAILED = 1
          OTHERS                    = 2.
      IF SY-SUBRC <> 0.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '日期栏位格式不对' ' /' WA_UP-REASON INTO WA_UP-REASON.
      ENDIF.

    ENDIF.
*&2.16发货地点
    IF WA_UP-WERKS IS INITIAL.
* WA_UP-REASON = '发货地点必输!'.
      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
      CONCATENATE '发货地点必输!' ' /' WA_UP-REASON INTO WA_UP-REASON.

    ELSE.
*&地点检查
      SELECT SINGLE *
               FROM T001W
              WHERE WERKS = WA_UP-WERKS.
      IF SY-SUBRC = 0.
      ELSE.
        WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
        CONCATENATE '地点不存在' ' /' WA_UP-REASON INTO WA_UP-REASON.
      ENDIF.

    ENDIF.

*&S3.1产品组 默认为:  10
    WA_UP-SPART = 10.
*&S3.2销售渠道默认为: 40
    WA_UP-VTWEG = 40.
*&-----------------------------
*&S3.4抬头栏位检查
*    PERFORM FRM_PROC_CHECK.
*&S3.5ITEM信息检查
*    PERFORM FRM_ITEM_CHECK.
*&S3.6判断是否有条目重
* (允许重复)
*&4.error log
    IF WA_UP-FLAG NE 'E'.
      WA_UP-FLAG = 'S'.
*     WA_UP-ICON = 2.
    ELSE.
*&取得错误数据
      R_BSTNK-SIGN   = 'I'.
      R_BSTNK-OPTION = 'EQ'.
      R_BSTNK-LOW    = WA_UP-BSTNK.
      COLLECT R_BSTNK.
      CLEAR R_BSTNK.
    ENDIF.

*&4.1excel栏位赋值内表
    MODIFY GT_UP FROM WA_UP INDEX G_TABIX.
    MOVE-CORRESPONDING WA_UP TO WA_HA.

*&4.2赋值GT_HA.
    CLEAR:WA_HA-FLAG, WA_HA-REASON, WA_HA-ICON.
**&A.判断重复:
*    READ TABLE GT_UPE INTO WA_UPE WITH KEY BSTNK = WA_HA-BSTNK
*                                           AUART = WA_HA-AUART
*                                           KUNNR = WA_HA-KUNNR
*                                           VKORG = WA_HA-VKORG
*                                           VKBUR = WA_HA-VKBUR.
*    IF SY-SUBRC EQ 0.
*      G_TABIX = SY-TABIX.
*      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
*      CONCATENATE '采购订单号' WA_UPE-BSTNK '有重复' '/' WA_HA-REASON INTO WA_HA-REASON.
*      MODIFY GT_HA FROM WA_HA INDEX G_TABIX.
*    ENDIF.

    COLLECT WA_HA INTO GT_HA.
*&clear 变量:
    CLEAR:WA_UP, WA_HEAD.
*&Q1.判断内表是否重复
    GT_UPE[] = GT_HA[].

  ENDLOOP.

  SORT GT_HA BY BSTNK KUNNR AUART VKORG VKBUR.
*&A1.判断重复(客户订单)
*  LOOP AT GT_HEAD.
*    AT NEW BSTNK.
*      WA_HEAD-LIN = 1.
*      CONTINUE.
*    ENDAT.
*      WA_HEAD-LIN = WA_HEAD-LIN + 1.
**    AT END OF BSTNK.
**      WA_HEAD-LIN = WA_HEAD-LIN + 1.
**    ENDAT.
*    IF WA_HEAD-LIN LT 1.
*      CONCATENATE '客户订单号:' GT_HEAD-BSTNK '出现重复,请检查!' INTO WA_HEAD-REASON.
*    ENDIF.
*    MODIFY GT_HEAD FROM WA_HEAD TRANSPORTING LIN REASON.
*    CLEAR GT_HEAD.
*  ENDLOOP.
*  DATA:G_DAY TYPE D.
*  GET TIME. "STAMP FIELD G_DAY.
*  LOOP AT GT_HEAD WHERE LIN LT 1.
*    LOOP AT GT_UP INTO WA_UP WHERE BSTNK EQ GT_HEAD-BSTNK
*                    AND AUART EQ GT_HEAD-AUART
*                    AND KUNNR EQ GT_HEAD-KUNNR
*                    AND VKORG EQ GT_HEAD-VKORG.
*      CONCATENATE WA_HEAD-REASON '/' WA_UP-REASON INTO WA_UP-REASON.
*      WA_UP-FLAG = 'E'. WA_UP-ICON = 1.
*      MODIFY GT_UP FROM WA_UP TRANSPORTING FLAG ICON REASON.
*      CLEAR WA_UP.
*
*    ENDLOOP.
*
*  ENDLOOP.

  CLEAR:GT_UPE[].
  SORT GT_UP BY BSTNK KUNNR AUART VKORG VKBUR MATNR.
*&S3.
  G_LIN = LINES( GT_UP[] ).
  IF G_LIN EQ 0.
    MESSAGE E001(00) WITH '没有任何数据!'.
  ELSE.
    MESSAGE S001(00) WITH '导入数据' G_LIN '条!'.
  ENDIF.

ENDFORM.                    " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_TEST_RUN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_TEST_RUN .

*&S4对于ok的客户订单号 test CHECK
*&C1.获取ok的客户订单号
*CLEAR: GT_HEAD[].
  GT_HEAD[] = GT_HA[].
  IF R_BSTNK[] IS NOT INITIAL.
    DELETE GT_HEAD WHERE BSTNK IN R_BSTNK.
  ENDIF.

*&C2.
  PERFORM FRM_FOR_SO.

*&C3.返回信息显示明细
  LOOP AT GT_HEAD INTO WA_HEAD WHERE FLAG = 'E'.
    LOOP AT GT_UP INTO WA_UP WHERE AUART = WA_HEAD-AUART
                                AND VKORG = WA_HEAD-VKORG
                                AND VTWEG = WA_HEAD-VTWEG
                                AND KUNNR = WA_HEAD-KUNNR
                                AND BSTNK = WA_HEAD-BSTNK
                                AND VKBUR = WA_HEAD-VKBUR .
      WA_UP-VBELN = WA_HEAD-VBELN.
      WA_UP-FLAG  = WA_HEAD-FLAG.
      WA_UP-ICON  = WA_HEAD-ICON.
      WA_UP-REASON = WA_HEAD-REASON.
*CONCATENATE WA_UP-REASON '-' WA_UP-REASON INTO WA_UP-REASON.
      MODIFY GT_UP FROM WA_UP TRANSPORTING FLAG ICON REASON.
    ENDLOOP.
  ENDLOOP.

ENDFORM.                    " FRM_TEST_RUN
*&---------------------------------------------------------------------*
*&      Form  FRM_FOR_SO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_FOR_SO .
  DATA:BEGIN OF LT_BSTNR OCCURS 0,
         VBELN LIKE VBAK-VBELN,
       END OF LT_BSTNR.
*&A.判断客户订单号是否重复
  LOOP AT GT_HEAD INTO WA_HEAD.
    CLEAR:LT_ITEM[],WA_HEADER,
          LT_SCH[], LT_EX[].
*&1HEAD参数设置
    PERFORM FRM_SET_HEAD.
*&2ITEM参数设置
    PERFORM FRM_SET_ITEM.
*&3BAPI创建so
    PERFORM FRM_CALL_BAPI.

  ENDLOOP.

ENDFORM.                    " FRM_FOR_SO
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_HEAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SET_HEAD .
 CLEAR:WA_HEADER,WA_HEADERX.
*&H1.抬头必输
  WA_HEADER-PURCH_NO_C = WA_HEAD-BSTNK."客户订单号码
  WA_HEADER-DOC_TYPE   = WA_HEAD-AUART."订单类型
  WA_HEADER-SALES_ORG  = WA_HEAD-VKORG."销售组织
  WA_HEADER-SALES_OFF  = WA_HEAD-VKBUR."销售部门
  WA_HEADER-DISTR_CHAN = WA_HEAD-VTWEG."分销渠道
  WA_HEADER-DIVISION   = WA_HEAD-SPART."产品组
  WA_HEADER-REQ_DATE_H = WA_HEAD-VDATU."请求交货日期
*WA_HEADER-PO_METHOD = WA_HEAD-BSARK."客户采购订单类型
*WA_HEADER-REF_1     = WA_HEAD-BSTNK."参考
  WA_HEADERX-PURCH_NO_C = WA_HEAD-BSTNK."客户订单号码

  WA_HEADERX-DOC_TYPE   = 'X'."订单类型
  WA_HEADERX-SALES_ORG  = 'X'."销售组织
  WA_HEADERX-SALES_OFF  = 'X'."销售部门
  WA_HEADERX-DISTR_CHAN = 'X'."分销渠道
  WA_HEADERX-DIVISION   = 'X'."产品组
  WA_HEADERX-REQ_DATE_H = 'X'."请求交货日期
*WA_HEADERX-PO_METHOD = 'X'."客户采购订单类型
*WA_HEADERX-REF_1     = 'X'."参考

*&H2.Partners(?一次性客户处理是否有差别(一次性客户有无标识))
  CLEAR: WA_PARTNER, LT_PART[].
*&通讯字段: SD单据合作伙伴:WWW(WA_PARTNER)
* AG-售达方
* WE-送达方
*'RG'-付款方
*'RE'-开票方
  WA_PARTNER-PARTN_ROLE = 'AG'.         "售达方
  WA_PARTNER-PARTN_NUMB = WA_HEAD-KUNNR.
*&"一次性客户
  READ TABLE GT_UP INTO WA_UP WITH KEY AUART = WA_HEAD-AUART
                                       VKORG = WA_HEAD-VKORG
                                       VTWEG = WA_HEAD-VTWEG
                                       KUNNR = WA_HEAD-KUNNR
                                       BSTNK = WA_HEAD-BSTNK
                                       VKBUR = WA_HEAD-VKBUR.

  IF WA_UP-NAME1 IS NOT INITIAL.
    WA_PARTNER-NAME   = WA_UP-NAME1. "名称
    WA_PARTNER-STREET = WA_UP-STREET."地址
  ENDIF.
  WA_PARTNER-COUNTRY = 'CN'.
  WA_PARTNER-LANGU = SY-LANGU.
  APPEND WA_PARTNER TO LT_PART.
  CLEAR WA_PARTNER.

*&H4.送达方
  IF  WA_UP-KUNNR IS NOT INITIAL.
    CLEAR WA_PARTNER.
    WA_PARTNER-PARTN_ROLE = 'WE'.          "送达方
    WA_PARTNER-PARTN_NUMB = WA_HEAD-KUNNR. "客户
    WA_PARTNER-NAME       = WA_HEAD-NAME1. "名称
    WA_PARTNER-STREET     = WA_HEAD-STREET."地址
    WA_PARTNER-COUNTRY    = 'CN'.
    APPEND WA_PARTNER TO LT_PART.
    CLEAR WA_PARTNER.
  ENDIF.

*&ADD.
*  "RG 付款方
*  WA_PARTNER-PARTN_ROLE = 'RG'.
*  WA_PARTNER-PARTN_NUMB = WA_HEAD-KUNNR.
**  IF UP_HEAD-NAME1_RG IS NOT INITIAL.  "一次性客户
**    WA_PARTNER-NAME     = UP_HEAD-NAME1_RG.
**    WA_PARTNER-COUNTRY  = 'CN'.
**  ENDIF.
*  APPEND WA_PARTNER TO LT_PART.
*  CLEAR WA_PARTNER.

*&订单条件的通讯字段
    CLEAR:LT_COND[], LT_COND,
          LT_CONDX[],LT_CONDX.
**&抬头赋值定价条件类型---条件ZPB0不允许作为抬头条件
*  LOOP AT GT_UP INTO WA_UP  WHERE BSTNK = WA_HEAD-BSTNK
*                               AND KUNNR = WA_HEAD-KUNNR
*                               AND AUART = WA_HEAD-AUART
*                               AND VKORG = WA_HEAD-VKORG
*                               AND VKBUR = WA_HEAD-VKBUR
*                               AND VDATU = WA_HEAD-VDATU.
**AND VTWEG = WA_HEAD-VTWEG
**&H3定价控制
*    IF NOT WA_UP-KBETR IS INITIAL.
*      WA_COND-COND_TYPE  = 'ZPB0'.     "定价条件
*      WA_COND-COND_VALUE = WA_UP-KBETR."价格
*      WA_COND-CURRENCY   = WA_UP-WAERK."货币或%
** WA_COND-COND_P_UNT = 1."条件定价单位
*      APPEND WA_COND TO LT_COND.
*      CLEAR WA_COND.
*
*      WA_CONDX-COND_TYPE  = 'ZPB0'."定价条件
*      WA_CONDX-COND_VALUE = 'X'.   "价格
*      WA_CONDX-CURRENCY   = 'X'.   "货币或%
**      WA_CONDX-UPDATEFLAG = 'U'.
*      APPEND WA_CONDX TO LT_CONDX.
*      CLEAR: WA_CONDX.
*    ENDIF.
*  ENDLOOP.
  EXIT.

ENDFORM.                    " FRM_SET_HEAD
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_ITEM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SET_ITEM .
  DATA: L_POSNR LIKE VBAP-POSNR,
        L_LP    LIKE VBAP-POSNR VALUE '000010'.
  CLEAR:LT_ITEM[],
        LT_SCH[].
*        LT_COND[].

*&item 参数赋值
  LOOP AT GT_UP INTO WA_UP  WHERE BSTNK = WA_HEAD-BSTNK
                               AND KUNNR = WA_HEAD-KUNNR
                               AND AUART = WA_HEAD-AUART
                               AND VKORG = WA_HEAD-VKORG
                               AND VKBUR = WA_HEAD-VKBUR
                               AND VDATU = WA_HEAD-VDATU.

    READ TABLE LT_ITEM INTO WA_ITEM  WITH KEY MATERIAL = WA_UP-MATNR.
    IF SY-SUBRC NE 0.
*&i1.line赋值
      ADD L_LP TO L_POSNR.
      CLEAR WA_ITEM.
      WA_ITEM-ITM_NUMBER = L_POSNR.
      WA_ITEM-MATERIAL   = WA_UP-MATNR. "商品
      WA_ITEM-SALES_UNIT = WA_UP-VRKME. "计量单位
      WA_ITEM-PLANT      = WA_UP-WERKS. "工厂
*& WA_ITEM-STORE_LOC  = WA_SO-LGORT. "库存地
      APPEND WA_ITEM TO LT_ITEM.

*&i2.计划行数据
      CLEAR WA_SCH.
      WA_SCH-ITM_NUMBER = L_POSNR.
      WA_SCH-REQ_QTY    = WA_UP-KWMENG."数量
*WA_SCH-REQ_DATE   = WA_UP-VDATU. "计划行日期
      APPEND WA_SCH TO LT_SCH.
*&i3.订单条件的通讯字段
      CLEAR: WA_COND.
      WA_COND-ITM_NUMBER = L_POSNR.
      WA_COND-COND_TYPE  = 'ZPB0'.     "定价条件
*&->ADD(解决价格扩大十倍问题)
      WA_COND-COND_VALUE = WA_UP-KBETR / 10."价格
      WA_COND-COND_UNIT  = WA_UP-KMEIN."条件单位
*WA_COND-COND_P_UNT = WA_UP-KMEIN.  "条件定价单位
*WA_COND-CURRENCY   = LS_COND-KOEIN."货币或%
      WA_CONDX-UPDATEFLAG = 'I'.
      WA_CONDX-COND_TYPE  = 'ZPB0'."定价条件
      WA_CONDX-COND_VALUE = 'X'.   "价格
      WA_CONDX-COND_UNIT  = 'X'."条件单位
*      WA_CONDX-CURRENCY   = 'X'.   "货币或%
*      APPEND WA_CONDX TO LT_CONDX.
      APPEND WA_COND TO LT_COND.

    ENDIF.
  ENDLOOP.


ENDFORM.                    " FRM_SET_ITEM
*&---------------------------------------------------------------------*
*&      Form  FRM_CALL_BAPI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CALL_BAPI .
*&只需创建正常SO,
  DATA:L_TEST LIKE BAPIFLAG-BAPIFLAG.

  CLEAR :L_VBELN,
         L_RETURN[],
         L_TEST,
         L_RETURN[].

  IF P_TEST EQ 'X'.
    L_TEST = 'X'.
  ENDIF.

*&正常SO:C,调用BAPI_SALESORDER_CREATEFROMDAT2
  CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
    EXPORTING
      ORDER_HEADER_IN      = WA_HEADER
      TESTRUN              = L_TEST
    IMPORTING
      SALESDOCUMENT        = L_VBELN
    TABLES
      RETURN               = L_RETURN
      ORDER_ITEMS_IN       = LT_ITEM
      ORDER_PARTNERS       = LT_PART
      ORDER_SCHEDULES_IN   = LT_SCH
      ORDER_CONDITIONS_IN  = LT_COND
      ORDER_CONDITIONS_INX = LT_CONDX
      ORDER_TEXT           = LT_TEXT
      EXTENSIONIN          = LT_EX.

  READ TABLE L_RETURN WITH KEY TYPE = 'E'.
  IF SY-SUBRC NE 0.
    IF P_EXCUTE EQ 'X'.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
      WA_HEAD-ICON = 3.
    ENDIF.

    G_SLIN = G_SLIN + 1.
    WA_HEAD-VBELN = L_VBELN.
    WA_HEAD-FLAG = 'S'.
    CONCATENATE '销售订单:' L_VBELN '成功创建' INTO WA_HEAD-REASON.
    MODIFY GT_HEAD FROM WA_HEAD TRANSPORTING VBELN FLAG ICON REASON.
*&Q3.TEST.
  ELSE.
    G_FLIN = G_FLIN + 1.
    IF P_EXCUTE EQ 'X'.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ENDIF.

    WA_HEAD-FLAG = 'E'.
    WA_HEAD-ICON = 1.
    READ TABLE L_RETURN WITH KEY TYPE = 'E'.
    WA_HEAD-REASON = L_RETURN-MESSAGE.
    MODIFY GT_HEAD FROM WA_HEAD TRANSPORTING FLAG ICON REASON.
  ENDIF.

ENDFORM.                    " FRM_CALL_BAPI
原文地址:https://www.cnblogs.com/rainysblog/p/11980422.html