当前位置:网站首页>Md61 plan independent demand import Bapi [by daily dimension / dynamic template / dynamic field]

Md61 plan independent demand import Bapi [by daily dimension / dynamic template / dynamic field]

2022-06-11 02:06:00 DeveloperMrMeng

Realize downloading dynamic templates according to the input interval of the selection screen , According to the actual date column name in the upload template , Create a planned independent demand for the corresponding date .

Download effect :

  Upload effect :

The complete code is as follows , With a little modification, it can be reused directly :

*&---------------------------------------------------------------------*
*& Form FRM_GET_COMP
*&---------------------------------------------------------------------*
*&  Get field structure list 
*&---------------------------------------------------------------------*
FORM FRM_GET_COMP USING     US_DATA
                  CHANGING  CT_COMP TYPE ABAP_COMPDESCR_TAB.
  DATA:
    LO_DESCR_REF TYPE REF TO CL_ABAP_TYPEDESCR,
    LO_STRUC     TYPE REF TO CL_ABAP_STRUCTDESCR.

  CALL METHOD CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_DATA
    EXPORTING
      P_DATA      = US_DATA
    RECEIVING
      P_DESCR_REF = LO_DESCR_REF.

  LO_STRUC ?= LO_DESCR_REF.

  CT_COMP = LO_STRUC->COMPONENTS.
ENDFORM.
*&---------------------------------------------------------------------*
*& Report ZPPR005
*&---------------------------------------------------------------------*
*&  Plan independent demand import 
*&---------------------------------------------------------------------*
REPORT ZPPR005.
TABLES:PBIM,SSCRFIELDS.

TYPES:
  BEGIN OF TY_PBIM,
    MATNR TYPE PBIM-MATNR,                        " materiel 
    WERKS TYPE PBIM-WERKS,                        " factory 
    BEDAE TYPE PBIM-BEDAE,                        " Type of demand 
    VERSB TYPE PBIM-VERSB,                        " edition 
    PBDNR TYPE PBIM-PBDNR,                        " Demand planning 
  END OF TY_PBIM,
  TY_TAB_PBIM TYPE STANDARD TABLE OF TY_PBIM,

  BEGIN OF TY_MARA,
    MATNR TYPE MARA-MATNR,                        " materiel 
    MEINS TYPE MARA-MEINS,                        " The basic unit of measurement 
  END OF TY_MARA,
  TY_TAB_MARA TYPE STANDARD TABLE OF TY_MARA.

DATA:
  GT_PBIM     TYPE TY_TAB_PBIM,
  GS_PBIM     TYPE TY_PBIM,
  GT_MARA     TYPE TY_TAB_MARA,
  GT_FIELDCAT TYPE LVC_T_FCAT,
  GS_FIELDCAT TYPE LVC_S_FCAT,
  GS_FUNCTXT  TYPE SMP_DYNTXT.                     " Menu Maker 

FIELD-SYMBOLS:
  <FS_TAB_UPLOAD> TYPE STANDARD TABLE,
  <FS_UPLOAD>     TYPE ANY,
  <FS_TAB_ALV>    TYPE STANDARD TABLE,
  <FS_ALV>        TYPE ANY.

*OLE Define with relevant parameters 
DATA:
  MYEXCEL     TYPE OLE2_OBJECT,
  MYSHEET     TYPE OLE2_OBJECT,
  MYSHEETNAME TYPE OLE2_OBJECT,
  MYCELL      TYPE OLE2_OBJECT,
  MYWORKBOOK  TYPE OLE2_OBJECT,
  MYRANGE     TYPE OLE2_OBJECT.

SELECTION-SCREEN BEGIN OF BLOCK B1  WITH FRAME TITLE TEXT-001.
  PARAMETERS:
    P_FILE TYPE RLGRAP-FILENAME OBLIGATORY MEMORY ID Z1 MODIF ID M1.
  SELECT-OPTIONS:
    S_DATUM FOR PBIM-DATLP MODIF ID M2 NO-EXTENSION.
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2  WITH FRAME TITLE TEXT-003.
  PARAMETERS:
    P_RB1 RADIOBUTTON GROUP R1 DEFAULT 'X' USER-COMMAND CREATE,    " Plan independent requirement template download 
    P_RB2 RADIOBUTTON GROUP R1.                                    " Plan independent demand import 
SELECTION-SCREEN END OF BLOCK B2.

INITIALIZATION.
*  Initialize screen text description 
  PERFORM FRM_INITIAL_DESC.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
*  Import file search help 
  PERFORM FRM_CALL_F4 CHANGING P_FILE.

AT SELECTION-SCREEN OUTPUT.
*  Dynamic update screen 
  PERFORM FRM_CHANGE_SCREEN.

AT SELECTION-SCREEN.

START-OF-SELECTION.
*  Execution start 
  PERFORM FRM_PROCESS_MAIN.

*&---------------------------------------------------------------------*
*& Form FRM_INITIAL_DESC
*&---------------------------------------------------------------------*
*&  Initialize screen text description 
*&---------------------------------------------------------------------*
FORM FRM_INITIAL_DESC .
  GS_FUNCTXT-ICON_ID = ICON_EXPORT.
  GS_FUNCTXT-QUICKINFO = TEXT-002.                " Download the production version import template 
  GS_FUNCTXT-ICON_TEXT = TEXT-002.                " Download the production version import template 
  SSCRFIELDS-FUNCTXT_01 = GS_FUNCTXT.

*  The default template date range is the next two months 
  S_DATUM-SIGN   = 'I'.
  S_DATUM-OPTION = 'EQ'.
  S_DATUM-LOW    = SY-DATUM.

  CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
    EXPORTING
      DATE      = SY-DATUM
      DAYS      = 0
      MONTHS    = 2
      SIGNUM    = '+'
      YEARS     = 0
    IMPORTING
      CALC_DATE = S_DATUM-HIGH.
  APPEND S_DATUM.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_call_f4
*&---------------------------------------------------------------------*
*&  Import file search help 
*&---------------------------------------------------------------------*
FORM FRM_CALL_F4 CHANGING CV_FILE TYPE RLGRAP-FILENAME.
  CALL FUNCTION 'F4_FILENAME'
    IMPORTING
      FILE_NAME = CV_FILE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHANGE_SCREEN
*&---------------------------------------------------------------------*
*&  Dynamic update screen 
*&---------------------------------------------------------------------*
FORM FRM_CHANGE_SCREEN .
  IF P_RB1 = 'X'.
    LOOP AT SCREEN.
      IF SCREEN-GROUP1 = 'M1'.
        SCREEN-ACTIVE = 0.
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.
  ELSE.
    LOOP AT SCREEN.
      IF SCREEN-GROUP1 = 'M2'.
        SCREEN-ACTIVE = 0.
      ENDIF.
      IF SCREEN-NAME = 'P_FILE'.
        SCREEN-REQUIRED = 2.
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*&  Download the template 
*&---------------------------------------------------------------------*
FORM FRM_DOWNLOAD_TEMPLATE .
  DATA:
    LV_FULLPATH TYPE STRING,
    LV_PATH     TYPE STRING.

*  Get the template save path 
  PERFORM FRM_GET_FULLPATH CHANGING LV_FULLPATH
                                    LV_PATH.
*  If the path is empty, exit 
  IF LV_FULLPATH IS INITIAL.
*    Download canceled !
    MESSAGE S028(ZMSG01).
    LEAVE LIST-PROCESSING.
  ENDIF.

*  Use OLE Download dynamic templates 
  PERFORM FRM_CRT_EXCEL2 USING LV_FULLPATH
                               LV_PATH.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_MAIN
*&---------------------------------------------------------------------*
*&  Execution start 
*&---------------------------------------------------------------------*
FORM FRM_PROCESS_MAIN .
  CASE ABAP_ON.
*    Plan independent requirement template download 
    WHEN P_RB1.
*      Download the template 
      PERFORM FRM_DOWNLOAD_TEMPLATE.
*    Plan independent demand import 
    WHEN P_RB2.
*      Create an upload template dynamic internal table 
      PERFORM FRM_CREATE_UPLOAD_TAB.

*      Import plan independent demand data 
      PERFORM FRM_UPLOAD_FILE.

*      Processing imported data 
      PERFORM FRM_PROCESS_DATA.

*      Exhibition ALV
      PERFORM FRM_DISPLAY_ALV.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_FILE
*&---------------------------------------------------------------------*
*&  Import plan independent demand data 
*&---------------------------------------------------------------------*
FORM FRM_UPLOAD_FILE .
  DATA:
    LT_RAW_DATA TYPE TRUXS_T_TEXT_DATA.

  IF P_FILE IS INITIAL.
*      Please select the import file !
    MESSAGE S035(ZMSG01) DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

*  Import file data 
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*     I_FIELD_SEPERATOR    =
*     I_LINE_HEADER        = 'X'
      I_TAB_RAW_DATA       = LT_RAW_DATA
      I_FILENAME           = P_FILE
*     I_STEP               = 1
    TABLES
      I_TAB_CONVERTED_DATA = <FS_TAB_UPLOAD>
    EXCEPTIONS
      CONVERSION_FAILED    = 1
      OTHERS               = 2.

  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID
          TYPE 'S'
        NUMBER SY-MSGNO
          WITH SY-MSGV1
               SY-MSGV2
               SY-MSGV3
               SY-MSGV4
       DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ELSE.
    IF LINES( <FS_TAB_UPLOAD> ) = 1.
*      The file content is empty , Please check !
      MESSAGE S029(ZMSG01) DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*&  Processing imported data 
*&---------------------------------------------------------------------*
FORM FRM_PROCESS_DATA .
*  Build dynamic ALV
  PERFORM FRM_CREATE_DYN_ALV.

*  Data mapping 
  PERFORM FRM_MAPPING_DATA.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*&  Exhibition ALV
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .
  DATA:
    LS_LAYOUT    TYPE LVC_S_LAYO,
    LT_FIELDCAT  TYPE LVC_T_FCAT,
    LT_EXCLUDING TYPE SLIS_T_EXTAB,
    LT_EVENT     TYPE SLIS_T_EVENT,
    LS_EVENT     TYPE SLIS_ALV_EVENT,
    LS_DDVAL     TYPE LVC_S_DROP.

*  Set layout control 
  LS_LAYOUT-ZEBRA      = 'X'.                     " Color spacing 
  LS_LAYOUT-SEL_MODE   = 'D'.                     " Choice mode 
  LS_LAYOUT-CWIDTH_OPT = 'X'.                     " Column width adaption 
  LS_LAYOUT-STYLEFNAME = 'STYLE'.                 " Control field 
  LS_LAYOUT-BOX_FNAME  = 'CBOX'.                  " Select box fields 

*  Additional events 
  LS_EVENT-NAME = 'DATA_CHANGED'.
  LS_EVENT-FORM = 'FRM_ALV_DATA_CHANGED'.
  APPEND LS_EVENT TO LT_EVENT.

*  Exhibition ALV
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'FRM_STATUS_SET'
      I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND'
      IS_LAYOUT_LVC            = LS_LAYOUT
      IT_FIELDCAT_LVC          = GT_FIELDCAT
      IT_EXCLUDING             = LT_EXCLUDING
      I_SAVE                   = 'A'
      IT_EVENTS                = LT_EVENT
    TABLES
      T_OUTTAB                 = <FS_TAB_ALV>
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.

  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DATA_CHANGED
*&---------------------------------------------------------------------*
*&  Data change event 
*&---------------------------------------------------------------------*
*&      --> ER_DATA_CHANGED       Data change monitoring instance object 
*&---------------------------------------------------------------------*
FORM FRM_ALV_DATA_CHANGED USING ER_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
*  Manual trigger PBO event , To achieve the refresh column width adaptive effect 
  CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'
    EXPORTING
      FUNCTIONCODE           = 'REFRESH'
    EXCEPTIONS
      FUNCTION_NOT_SUPPORTED = 1
      OTHERS                 = 2.

  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_STATUS_SET
*&---------------------------------------------------------------------*
*& GUI Status bar settings 
*&---------------------------------------------------------------------*
*&      --> RT_EXTAB       Exclude button 
*&---------------------------------------------------------------------*
FORM FRM_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
  DATA:
    LS_EXTAB TYPE SLIS_EXTAB.

  SET PF-STATUS 'STATUS' EXCLUDING RT_EXTAB.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*&  User button event response 
*&---------------------------------------------------------------------*
*&      --> R_UCOMM       Event code 
*&      --> RS_SELFIELD   Operation data field information 
*&---------------------------------------------------------------------*
FORM FRM_USER_COMMAND USING R_UCOMM     LIKE SY-UCOMM
                            RS_SELFIELD TYPE SLIS_SELFIELD.

  DATA:
    LO_GRID    TYPE REF TO CL_GUI_ALV_GRID,
    LS_STABLE  TYPE LVC_S_STBL,
    LV_VALID   TYPE CHAR1,
    LS_LAYOUT  TYPE LVC_S_LAYO,
    LV_REFRESH TYPE CHAR1.

  LS_STABLE-ROW = 'X'.
  LS_STABLE-COL = 'X'.

*  Get the current screen instance object 
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LO_GRID.

*  take EDIT The data is updated back to the internal table GT_RESULT in .
  CALL METHOD LO_GRID->CHECK_CHANGED_DATA
    IMPORTING
      E_VALID   = LV_VALID
    CHANGING
      C_REFRESH = LV_REFRESH.

  CASE R_UCOMM.
*    double-click 
    WHEN '&IC1'.

*    preservation 
    WHEN 'SAVE'.
*      Create plan independent requirements 
      PERFORM FRM_CREATE_MD61.
    WHEN OTHERS.
  ENDCASE.

  CALL METHOD LO_GRID->GET_FRONTEND_LAYOUT
    IMPORTING
      ES_LAYOUT = LS_LAYOUT.

  LS_LAYOUT-CWIDTH_OPT = 'X'.

*  Set column width adaptation 
  CALL METHOD LO_GRID->SET_FRONTEND_LAYOUT
    EXPORTING
      IS_LAYOUT = LS_LAYOUT.

*  Refresh ALV
  CALL METHOD LO_GRID->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE = LS_STABLE
    EXCEPTIONS
      FINISHED  = 1
      OTHERS    = 2.

  IF SY-SUBRC <> 0.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_MD61
*&---------------------------------------------------------------------*
*&  Create plan independent requirements 
*&---------------------------------------------------------------------*
FORM FRM_CREATE_MD61 .
  DATA:
    LS_REQ_ITEM      TYPE BAPISITEMR,
    LT_REQ_SCHE_ITEM TYPE FSH_BAPISSHDIN_T,
    LS_REQ_SCHE_ITEM TYPE BAPISSHDIN,
    LT_RETURN        TYPE TAB_BAPIRET1,
    LT_COMPONENTS    TYPE ABAP_COMPDESCR_TAB,
    LV_VERVS         TYPE PBIM-VERVS,
    LV_SELNUM        TYPE I.

*  Get field structure list 
  PERFORM FRM_GET_COMP(ZCUSTOM_FORM)
    USING <FS_ALV>
    CHANGING LT_COMPONENTS IF FOUND.

  LOOP AT <FS_TAB_ALV> INTO <FS_ALV>.
    ASSIGN COMPONENT 'CBOX'    OF STRUCTURE <FS_ALV> TO FIELD-SYMBOL(<FS_CBOX>).    " Selection box 
    ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <FS_ALV> TO FIELD-SYMBOL(<FS_MESSAGE>). " news 
    ASSIGN COMPONENT 'ICON'    OF STRUCTURE <FS_ALV> TO FIELD-SYMBOL(<FS_ICON>).    " Status light 

    IF <FS_CBOX> <> 'X' OR <FS_ICON> = ICON_LED_GREEN.
      CONTINUE.
    ENDIF.

    ADD 1 TO LV_SELNUM.

    ASSIGN COMPONENT 'MATNR' OF STRUCTURE <FS_ALV> TO FIELD-SYMBOL(<FS_MATNR>)." materiel 
    ASSIGN COMPONENT 'WERKS' OF STRUCTURE <FS_ALV> TO FIELD-SYMBOL(<FS_WERKS>)." factory 
    ASSIGN COMPONENT 'VERSB' OF STRUCTURE <FS_ALV> TO FIELD-SYMBOL(<FS_VERSB>)." edition 
    ASSIGN COMPONENT 'PBDNR' OF STRUCTURE <FS_ALV> TO FIELD-SYMBOL(<FS_PBDNR>)." Demand planning 
    ASSIGN COMPONENT 'VERVS' OF STRUCTURE <FS_ALV> TO FIELD-SYMBOL(<FS_VERVS>)." Activate 

    READ TABLE GT_MARA INTO DATA(LS_MARA)
      WITH KEY MATNR = <FS_MATNR>
        BINARY SEARCH.

*   BAPI Detail filling 
    LOOP AT LT_COMPONENTS INTO DATA(LS_COMPOMENTS) FROM 9.
      ASSIGN COMPONENT LS_COMPOMENTS-NAME OF STRUCTURE <FS_ALV> TO FIELD-SYMBOL(<FS_PLNMG>).
      IF <FS_PLNMG> IS NOT INITIAL.
        LS_REQ_SCHE_ITEM-DATE_TYPE = '1'.                    " The date type ( Japan ,  week ,  month ,  interval  )
        LS_REQ_SCHE_ITEM-REQ_DATE  = LS_COMPOMENTS-NAME+1(8)." Plan line date 
        LS_REQ_SCHE_ITEM-REQ_QTY   = <FS_PLNMG>.             " Planned quantity 
        LS_REQ_SCHE_ITEM-UNIT      = LS_MARA-MEINS.          " The basic unit of measurement 
        APPEND LS_REQ_SCHE_ITEM TO LT_REQ_SCHE_ITEM.
        CLEAR LS_REQ_SCHE_ITEM.
      ENDIF.
    ENDLOOP.

    READ TABLE GT_PBIM INTO DATA(LS_PBIM)
      WITH KEY MATNR = <FS_MATNR>
               WERKS = <FS_WERKS>
               VERSB = <FS_VERSB>
               PBDNR = <FS_PBDNR>
               BINARY SEARCH.
*    establish 
    IF SY-SUBRC <> 0.
      LS_REQ_ITEM-MATERIAL   = <FS_MATNR>.        " materiel 
      LS_REQ_ITEM-PLANT      = <FS_WERKS>.        " factory 
      LS_REQ_ITEM-REQU_TYPE  = 'VSF'.             " Type of demand 
      LS_REQ_ITEM-VERSION    = <FS_VERSB>.        " edition 
      LS_REQ_ITEM-REQ_NUMBER = <FS_PBDNR>.        " Demand planning 
      LS_REQ_ITEM-VERS_ACTIV = <FS_VERVS>.        " Activate 

*      Independent demand plan creation 
      CALL FUNCTION 'BAPI_REQUIREMENTS_CREATE'
        EXPORTING
          REQUIREMENTS_ITEM        = LS_REQ_ITEM
          DO_COMMIT                = 'X'
        TABLES
          REQUIREMENTS_SCHEDULE_IN = LT_REQ_SCHE_ITEM
          RETURN                   = LT_RETURN.
*    change 
    ELSE.
      LV_VERVS = <FS_VERVS>.

*      Independent demand plan change 
      CALL FUNCTION 'BAPI_REQUIREMENTS_CHANGE'
        EXPORTING
          MATERIAL_LONG            = LS_PBIM-MATNR " materiel 
          PLANT                    = LS_PBIM-WERKS " factory 
          REQUIREMENTSTYPE         = 'VSF'         " Type of demand 
          VERSION                  = LS_PBIM-VERSB " edition 
          REQMTSPLANNUMBER         = LS_PBIM-PBDNR " Demand planning 
          VERS_ACTIV               = LV_VERVS      " Activate 
          DO_COMMIT                = 'X'
          UPDATE_MODE              = 'X'
          DELETE_OLD               = 'X'
        TABLES
          REQUIREMENTS_SCHEDULE_IN = LT_REQ_SCHE_ITEM
          RETURN                   = LT_RETURN.
    ENDIF.

    LOOP AT LT_RETURN INTO DATA(LS_RETURN) WHERE TYPE CA 'EAX'.
      IF <FS_MESSAGE> IS INITIAL.
        <FS_MESSAGE> = LS_RETURN-MESSAGE.
      ELSE.
        <FS_MESSAGE> = <FS_MESSAGE> && ';' && LS_RETURN-MESSAGE.
      ENDIF.
    ENDLOOP.

    IF SY-SUBRC <> 0.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.

      <FS_ICON>    = ICON_LED_GREEN.              " A green light 
*      The independent demand plan was created successfully !
      MESSAGE S165(ZMSG01) INTO <FS_MESSAGE>.
    ELSE.
      <FS_ICON>    = ICON_LED_RED.                " A red light 
    ENDIF.

    MODIFY <FS_TAB_ALV> FROM <FS_ALV>.

    CLEAR:
      LT_REQ_SCHE_ITEM,
      LT_RETURN,
      LS_MARA,
      LV_VERVS,
      LS_PBIM.
  ENDLOOP.

  IF LV_SELNUM = 0.
*    Please select at least one row of data !
    MESSAGE S041(ZMSG01) DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_FULLPATH
*&---------------------------------------------------------------------*
*&  Get the template save path 
*&---------------------------------------------------------------------*
*&      <-- CV_FULLPATH     The full path 
*&      <-- CV_PATH         File path 
*&---------------------------------------------------------------------*
FORM FRM_GET_FULLPATH  CHANGING CV_FULLPATH
                                CV_PATH.
  DATA:
    LV_INIT_PATH  TYPE STRING,
    LV_INIT_FNAME TYPE STRING,
    LV_PATH       TYPE STRING,
    LV_FILENAME   TYPE STRING,
    LV_FULLPATH   TYPE STRING.

*  Initial name ( Plan independent demand import template .XLSX)
  CONCATENATE TEXT-010
              S_DATUM-LOW
              '~'
              S_DATUM-HIGH
               '.xlsx'
         INTO LV_INIT_FNAME.

*  Get desktop path 
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_DESKTOP_DIRECTORY
    CHANGING
      DESKTOP_DIRECTORY    = LV_INIT_PATH
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC <> 0.
    EXIT.
  ENDIF.

*  The user selects the name 、 route 
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
      DEFAULT_FILE_NAME    = LV_INIT_FNAME
      FILE_FILTER          = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
      INITIAL_DIRECTORY    = LV_INIT_PATH
      PROMPT_ON_OVERWRITE  = 'X'
    CHANGING
      FILENAME             = LV_FILENAME
      PATH                 = LV_PATH
      FULLPATH             = LV_FULLPATH
*     USER_ACTION          =
*     FILE_ENCODING        =
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC = 0.
    CV_FULLPATH = LV_FULLPATH.
    CV_PATH     = LV_PATH.
  ENDIF.
ENDFORM.                    " FRM_GET_FULLPATH
*&---------------------------------------------------------------------*
*& Form FRM_CRT_EXCEL2
*&---------------------------------------------------------------------*
*&  Use OLE Download dynamic templates 
*&---------------------------------------------------------------------*
*&      --> LV_FULLPATH
*&      --> LV_PATH
*&---------------------------------------------------------------------*
FORM FRM_CRT_EXCEL2  USING UV_FULLPATH
                           UV_PATH.
*  Download template file 
  PERFORM FRM_DOWNLOAD_FROM_SERVER USING UV_FULLPATH.

*  open excel
  PERFORM FRM_OPEN_EXCEL USING UV_FULLPATH.

*  Dynamically populate data 
  PERFORM FRM_FILL_SHEET .

*  Save the file 
  CALL METHOD OF MYWORKBOOK 'SAVE'.

*  Close file 
  CALL METHOD OF MYWORKBOOK 'CLOSE'.

*  sign out excel
  CALL METHOD OF MYEXCEL 'QUIT'.

*  Release object 
  FREE OBJECT MYSHEET.
  FREE OBJECT MYWORKBOOK.
  FREE OBJECT MYEXCEL.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD_FROM_SERVER
*&---------------------------------------------------------------------*
*&  Download template file 
*&---------------------------------------------------------------------*
*&      --> UV_FULLPATH
*&---------------------------------------------------------------------*
FORM FRM_DOWNLOAD_FROM_SERVER  USING UV_FULLPATH.
  DATA:
    LV_MOD      TYPE WWWDATA-OBJID,               " Template object name 
    LS_OBJECT   TYPE WWWDATATAB,                  " Template object 
    LV_FULLPATH TYPE LOCALFILE,                   " The full path 
    LV_RC       TYPE SY-SUBRC.                    " Return code 

  LV_MOD      = 'ZPPR005_TEMP'.
  LV_FULLPATH = UV_FULLPATH.

*  Query and download templates 
  SELECT SINGLE
         RELID
         OBJID
    FROM WWWDATA
    INTO CORRESPONDING FIELDS OF LS_OBJECT
   WHERE SRTF2 = '0'
     AND OBJID = LV_MOD.                          "smw0 Object name 

  IF SY-SUBRC <> 0 OR LS_OBJECT-OBJID = SPACE .
*    Template file &1 non-existent , Please use first. SMW0 Upload !
    MESSAGE S025(ZMSG01) WITH LV_MOD DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

*  Download the template 
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      KEY         = LS_OBJECT
      DESTINATION = LV_FULLPATH
    IMPORTING
      RC          = LV_RC.

  IF LV_RC <> 0.
*    Template file &1 Download failed , Please contact the developer !
    MESSAGE S026(ZMSG01) WITH LV_MOD DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

*  Download successful !
  MESSAGE S027(ZMSG01).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_OPEN_EXCEL
*&---------------------------------------------------------------------*
*&  open excel
*&---------------------------------------------------------------------*
*&      --> UV_FULLPATH
*&---------------------------------------------------------------------*
FORM FRM_OPEN_EXCEL  USING UV_FULLPATH.
*  open excel application 
  CREATE OBJECT MYEXCEL 'EXCEL.APPLICATION'.

  SET PROPERTY OF MYEXCEL 'VISIBLE' = 0 .         "0 Running on behalf of the background ,1 Running on behalf of the front desk 

*  Get the workbooks .
  CALL METHOD OF MYEXCEL 'WORKBOOKS' = MYWORKBOOK.

*  Open the workbook 
  CALL METHOD OF MYWORKBOOK 'OPEN'
    EXPORTING
      #1 = UV_FULLPATH.

*  Set the active workbook .
  GET PROPERTY OF MYEXCEL 'ACTIVEWORKBOOK' = MYWORKBOOK.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_SHEET
*&---------------------------------------------------------------------*
*&  Dynamically populate data 
*&---------------------------------------------------------------------*
FORM FRM_FILL_SHEET .
  DATA:
    LV_DAYS      TYPE TFMATAGE,
    LV_DATE      TYPE DATUM,
    LV_FIELDNAME TYPE CHAR12,
    LT_TITLE     TYPE STANDARD TABLE OF CHAR2000,
    LS_TITLE     LIKE LINE OF LT_TITLE,
    LV_RC        TYPE I.

*  Set up sheet Page name 
  CALL METHOD OF MYEXCEL 'WORKSHEETS' = MYSHEET
    EXPORTING
    #1 = TEXT-010.                                " Plan independent demand import template 

  CALL METHOD OF MYSHEET 'ACTIVATE'.

*  Get the number of days in the date range 
  CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
    EXPORTING
      I_DATE_FROM = S_DATUM-LOW
      I_DATE_TO   = S_DATUM-HIGH
    IMPORTING
      E_DAYS      = LV_DAYS.

  LV_DATE = S_DATUM-LOW.

  DO LV_DAYS + 1 TIMES.
    WRITE LV_DATE TO LV_FIELDNAME USING EDIT MASK '____/__/__'.

    IF LS_TITLE IS INITIAL.
      LS_TITLE = LV_FIELDNAME.
    ELSE.
      CONCATENATE LS_TITLE
                  LV_FIELDNAME
             INTO LS_TITLE
        SEPARATED BY CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
    ENDIF.

    LV_DATE = LV_DATE + 1.
  ENDDO.

  APPEND LS_TITLE TO LT_TITLE.

*  Copy the contents into the pasteboard 
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_EXPORT
    IMPORTING
      DATA                 = LT_TITLE
    CHANGING
      RC                   = LV_RC
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.

  CALL METHOD OF MYEXCEL 'CELLS' = MYCELL
    EXPORTING
      #1 = 1                                      " That's ok 
      #2 = 6.                                     " Column 

*  Paste the content 
  CALL METHOD OF MYCELL 'PASTESPECIAL'.

*  Select range 
  CALL METHOD OF MYEXCEL 'RANGE' = MYRANGE
    EXPORTING
      #1 = 'F1'                                   " Start cell 
      #2 = 'EO1'.                                 " End cell 

*  Change column width 
  SET PROPERTY OF MYRANGE 'COLUMNWIDTH' = '12'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_UPLOAD_TAB
*&---------------------------------------------------------------------*
*&  Create an upload template dynamic internal table 
*&---------------------------------------------------------------------*
FORM FRM_CREATE_UPLOAD_TAB .
  DATA:
    LT_COMPONENTS TYPE ABAP_COMPONENT_TAB,
    LO_STRUC      TYPE REF TO CL_ABAP_STRUCTDESCR,
    LO_TABLE      TYPE REF TO CL_ABAP_TABLEDESCR,
    LO_WS         TYPE REF TO DATA,
    LO_TAB        TYPE REF TO DATA,
    LV_INDEX      TYPE I,
    LV_FNAME      TYPE STRING.

*  Add template fixed column : materiel 
  PERFORM FRM_CHANGE_COMP USING 'MATNR'
                                'CHAR30'
                       CHANGING LT_COMPONENTS.
*  Add template fixed column : factory 
  PERFORM FRM_CHANGE_COMP USING 'WERKS'
                                'CHAR30'
                       CHANGING LT_COMPONENTS.
*  Add template fixed column : edition 
  PERFORM FRM_CHANGE_COMP USING 'VERSB'
                                'CHAR30'
                      CHANGING LT_COMPONENTS.
*  Add template fixed column : Demand planning 
  PERFORM FRM_CHANGE_COMP USING 'PBDNR'
                                'CHAR30'
                       CHANGING LT_COMPONENTS.
*  Add template fixed column : Activation ID 
  PERFORM FRM_CHANGE_COMP USING 'VERVS'
                                'CHAR30'
                       CHANGING LT_COMPONENTS.

*  Add dynamic columns ( Reserve one year's days )
  DO 365 TIMES.
    ADD 1 TO LV_INDEX.
    LV_FNAME = |FIELD{ LV_INDEX }|.

*    Add dynamic columns : Demand quantity 
    PERFORM FRM_CHANGE_COMP USING LV_FNAME
                                  'CHAR30'
                         CHANGING LT_COMPONENTS.
  ENDDO.

  TRY.
*      Get workspace type 
      CALL METHOD CL_ABAP_STRUCTDESCR=>CREATE
        EXPORTING
          P_COMPONENTS = LT_COMPONENTS
        RECEIVING
          P_RESULT     = LO_STRUC.
    CATCH CX_SY_STRUCT_CREATION.
  ENDTRY.

  TRY.
*      Get table type 
      CALL METHOD CL_ABAP_TABLEDESCR=>CREATE
        EXPORTING
          P_LINE_TYPE = LO_STRUC
        RECEIVING
          P_RESULT    = LO_TABLE.
    CATCH CX_SY_TABLE_CREATION.
  ENDTRY.

  CREATE DATA LO_TAB TYPE HANDLE LO_TABLE.
  CREATE DATA LO_WS  TYPE HANDLE LO_STRUC.

  ASSIGN LO_TAB->* TO <FS_TAB_UPLOAD>.
  ASSIGN LO_WS->* TO <FS_UPLOAD>.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHANGE_COMP
*&---------------------------------------------------------------------*
*&  Add dynamic field 
*&---------------------------------------------------------------------*
*&      --> UV_FNAME
*&      --> UV_REF_FIELD
*&      <-- CT_COMPONENTS
*&---------------------------------------------------------------------*
FORM FRM_CHANGE_COMP  USING    VALUE(UV_FNAME)
                               VALUE(UV_REF_FIELD)
                      CHANGING CT_COMPONENTS TYPE ABAP_COMPONENT_TAB.
  DATA:
    LO_TYPE       TYPE REF TO CL_ABAP_TYPEDESCR,
    LS_COMPOMENTS TYPE ABAP_COMPONENTDESCR.

  LS_COMPOMENTS-NAME = UV_FNAME.

  CALL METHOD CL_ABAP_DATADESCR=>DESCRIBE_BY_NAME
    EXPORTING
      P_NAME         = UV_REF_FIELD
    RECEIVING
      P_DESCR_REF    = LO_TYPE
    EXCEPTIONS
      TYPE_NOT_FOUND = 1
      OTHERS         = 2.

  LS_COMPOMENTS-TYPE ?= LO_TYPE.
  APPEND LS_COMPOMENTS TO CT_COMPONENTS.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_DYN_ALV
*&---------------------------------------------------------------------*
*&  Build dynamic ALV
*&---------------------------------------------------------------------*
FORM FRM_CREATE_DYN_ALV .
  DATA:
    LO_TAB       TYPE REF TO DATA,
    LO_WS        TYPE REF TO DATA,
    LV_INDEX     TYPE I,
    LV_DATEFNAME TYPE CHAR9,
    LT_SPLIT     TYPE STANDARD TABLE OF STRING,
    LV_YEAR      TYPE N LENGTH 4,
    LV_MONTH     TYPE N LENGTH 2,
    LV_DAY       TYPE N LENGTH 2,
    LV_COL_POS   TYPE LVC_COLPOS.

  CLEAR <FS_UPLOAD>.
  READ TABLE <FS_TAB_UPLOAD> INTO <FS_UPLOAD> INDEX 1.

*  Set field control ( Fixed column section )
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      I_STRUCTURE_NAME       = 'ZSPP_ALV_STRUC_003'
      I_BYPASSING_BUFFER     = 'X'
    CHANGING
      CT_FIELDCAT            = GT_FIELDCAT
    EXCEPTIONS
      INCONSISTENT_INTERFACE = 1
      PROGRAM_ERROR          = 2
      OTHERS                 = 3.

  READ TABLE GT_FIELDCAT ASSIGNING FIELD-SYMBOL(<FS_FIELDCAT>)  " Selection box 
    WITH KEY FIELDNAME = 'CBOX'.
  IF SY-SUBRC = 0.
    <FS_FIELDCAT>-NO_OUT = 'X'.
    <FS_FIELDCAT>-TECH   = 'X'.
  ENDIF.

*  From 6 The column starts as a dynamic column 
  LV_INDEX = 6.
  LV_COL_POS = LINES( GT_FIELDCAT ).

  DO.
    ASSIGN COMPONENT LV_INDEX OF STRUCTURE <FS_UPLOAD> TO FIELD-SYMBOL(<FS_FIELD>).
    IF <FS_FIELD> IS NOT INITIAL.
      SPLIT <FS_FIELD> AT '/' INTO TABLE LT_SPLIT.
      READ TABLE LT_SPLIT INTO DATA(LS_SPLIT) INDEX 1.
      LV_YEAR = LS_SPLIT.
      READ TABLE LT_SPLIT INTO LS_SPLIT INDEX 2.
      LV_MONTH = LS_SPLIT.
      READ TABLE LT_SPLIT INTO LS_SPLIT INDEX 3.
      LV_DAY = LS_SPLIT.

      LV_DATEFNAME = |D{ LV_YEAR }{ LV_MONTH }{ LV_DAY }|.
      ADD 1 TO LV_COL_POS.

*      Add quantity field 
      PERFORM FRM_ADD_FIELDCAT USING <FS_FIELD>
                                     LV_DATEFNAME
                                     'PBED'
                                     'PLNMG'
                                     LV_COL_POS.
      ADD 1 TO LV_INDEX.
    ELSE.
      EXIT.
    ENDIF.
    CLEAR:
      LT_SPLIT.
  ENDDO.

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG           = GT_FIELDCAT
    IMPORTING
      EP_TABLE                  = LO_TAB
    EXCEPTIONS
      GENERATE_SUBPOOL_DIR_FULL = 1
      OTHERS                    = 2.

  ASSIGN LO_TAB->* TO <FS_TAB_ALV>.
  CREATE DATA LO_WS LIKE LINE OF <FS_TAB_ALV>.
  ASSIGN LO_WS->* TO <FS_ALV>.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MAPPING_DATA
*&---------------------------------------------------------------------*
*&  Data mapping 
*&---------------------------------------------------------------------*
FORM FRM_MAPPING_DATA .
  DATA:
    LV_INDEX_FILE TYPE I,
    LV_INDEX_ALV  TYPE I,
    LT_PBIM       TYPE TY_TAB_PBIM,
    LS_PBIM       TYPE TY_PBIM,
    LV_VERSB      TYPE VERSB.

  LOOP AT <FS_TAB_UPLOAD> INTO <FS_UPLOAD> FROM 2.
    ASSIGN COMPONENT 'MATNR' OF STRUCTURE <FS_UPLOAD> TO FIELD-SYMBOL(<FS_FIELD>).
    ASSIGN COMPONENT 'MATNR' OF STRUCTURE <FS_ALV> TO FIELD-SYMBOL(<FS_ALV_FIELD>).
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        INPUT        = <FS_FIELD>
      IMPORTING
        OUTPUT       = <FS_ALV_FIELD>             " materiel 
      EXCEPTIONS
        LENGTH_ERROR = 1
        OTHERS       = 2.
    LS_PBIM-MATNR = <FS_ALV_FIELD>.

    ASSIGN COMPONENT 'WERKS' OF STRUCTURE <FS_UPLOAD> TO <FS_FIELD>.
    ASSIGN COMPONENT 'WERKS' OF STRUCTURE <FS_ALV> TO <FS_ALV_FIELD>.
    <FS_ALV_FIELD> = <FS_FIELD>.                  " factory 
    LS_PBIM-WERKS = <FS_FIELD>.

    ASSIGN COMPONENT 'VERSB' OF STRUCTURE <FS_UPLOAD> TO <FS_FIELD>.
    ASSIGN COMPONENT 'VERSB' OF STRUCTURE <FS_ALV> TO <FS_ALV_FIELD>.
    LV_VERSB = |{ <FS_FIELD> ALPHA = IN }|.
    <FS_ALV_FIELD> = LV_VERSB.                    " edition 
    LS_PBIM-VERSB = LV_VERSB.

    ASSIGN COMPONENT 'PBDNR' OF STRUCTURE <FS_UPLOAD> TO <FS_FIELD>.
    ASSIGN COMPONENT 'PBDNR' OF STRUCTURE <FS_ALV> TO <FS_ALV_FIELD>.
    <FS_ALV_FIELD> = <FS_FIELD>.                  " Demand planning 
    LS_PBIM-PBDNR = <FS_FIELD>.

    ASSIGN COMPONENT 'VERVS' OF STRUCTURE <FS_UPLOAD> TO <FS_FIELD>.
    ASSIGN COMPONENT 'VERVS' OF STRUCTURE <FS_ALV> TO <FS_ALV_FIELD>.
    <FS_ALV_FIELD> = <FS_FIELD>.                  " Activation ID 

*    From 6 The column starts as a dynamic column ( file )
    LV_INDEX_FILE = 6.

*    From 9 The column starts as a dynamic column (ALV)
    LV_INDEX_ALV  = 9.

    DO.
      ASSIGN COMPONENT LV_INDEX_FILE OF STRUCTURE <FS_UPLOAD> TO <FS_FIELD>.
      IF <FS_FIELD> IS ASSIGNED.
        ASSIGN COMPONENT LV_INDEX_ALV OF STRUCTURE <FS_ALV> TO <FS_ALV_FIELD>.
        <FS_ALV_FIELD> = <FS_FIELD>.
        ADD 1 TO LV_INDEX_FILE.
        ADD 1 TO LV_INDEX_ALV.
      ELSE.
        EXIT.
      ENDIF.
      UNASSIGN <FS_FIELD>.
    ENDDO.

    APPEND <FS_ALV> TO <FS_TAB_ALV>.
    APPEND LS_PBIM TO LT_PBIM.
    CLEAR:
      <FS_ALV>,
      LS_PBIM.
  ENDLOOP.

*  Get the existing independent demand plan 
  SELECT MATNR                                    " materiel 
         WERKS                                    " factory 
         BEDAE                                    " Type of demand 
         VERSB                                    " edition 
         PBDNR                                    " Demand planning 
    INTO TABLE GT_PBIM
    FROM PBIM
     FOR ALL ENTRIES IN LT_PBIM
   WHERE MATNR = LT_PBIM-MATNR
     AND WERKS = LT_PBIM-WERKS
     AND BEDAE = 'VSF'
     AND VERSB = LT_PBIM-VERSB
     AND PBDNR = LT_PBIM-PBDNR
     AND LOEVR <> 'D'.

*  Get the basic unit of material 
  SELECT MATNR
         MEINS
    INTO TABLE GT_MARA
    FROM MARA
     FOR ALL ENTRIES IN LT_PBIM
   WHERE MATNR = LT_PBIM-MATNR.

  SORT GT_PBIM BY MATNR ASCENDING
                  WERKS ASCENDING
                  BEDAE ASCENDING
                  VERSB ASCENDING
                  PBDNR ASCENDING.
  SORT GT_MARA BY MATNR ASCENDING.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ADD_FIELDCAT
*&---------------------------------------------------------------------*
*&  Add quantity field 
*&---------------------------------------------------------------------*
*&      --> UV_FIELDDESC    Field description 
*&      --> UV_FIELDNAME    Field name 
*&      --> UV_REF_TABLE    Refer to table 
*&      --> UV_REF_FIELD    Reference field 
*&      --> UV_COLPOS       Column position 
*&---------------------------------------------------------------------*
FORM FRM_ADD_FIELDCAT  USING    UV_FIELDDESC
                                UV_FIELDNAME
                                VALUE(UV_REF_TABLE)
                                VALUE(UV_REF_FIELD)
                                UV_COLPOS.

  GS_FIELDCAT-FIELDNAME = UV_FIELDNAME.
  GS_FIELDCAT-COL_POS   = UV_COLPOS.
  GS_FIELDCAT-REPTEXT   = UV_FIELDDESC.
  GS_FIELDCAT-SCRTEXT_L = UV_FIELDDESC.
  GS_FIELDCAT-SCRTEXT_M = UV_FIELDDESC.
  GS_FIELDCAT-SCRTEXT_S = UV_FIELDDESC.
  GS_FIELDCAT-REF_TABLE = UV_REF_TABLE.
  GS_FIELDCAT-REF_FIELD = UV_REF_FIELD.
  APPEND GS_FIELDCAT TO GT_FIELDCAT.
  CLEAR GS_FIELDCAT.
ENDFORM.

原网站

版权声明
本文为[DeveloperMrMeng]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/162/202206110049534303.html