• 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
  • 相关阅读:
    计算几何 判断点在直线的左右哪一侧
    图论 迪杰斯特拉dijkstra求最短路径
    图论 用prim法求最小生成树
    图论 邻接表广搜
    图论 用广搜搜邻接矩阵
    图论 邻接表建图+dfs
    图论 邻接矩阵建图+dfs遍历
    HDU 2141 二分查找
    二叉树知道前序和中序求后序,知道中序后序求中序
    二叉树的查找
  • 原文地址:https://www.cnblogs.com/rainysblog/p/11980422.html
Copyright © 2020-2023  润新知