BDC using Session Method
By Kumar Saurabh, Yash Technologies
When SAP is implemented, we need Data to
be migrated from non-SAP system i.e. Legacy
system to SAP system. One way of doing this is BDC (Batch Data Communication).
Requirement: - For Developing BDC using
Session Method we need Recording & flat file in which data is stored. Flat
file can be Text file or Excel File.
In Session Method following function
Modules are used.
1. BDC_OPEN_GROUP.2. BDC_INSERT.3. BDC_CLOSE_GROUP.
In BDC
we use structure BDCDATA for Batch
Input, Which has following components.
PROGRAM - BDC module poolDYNPRO- BDC Screen numberDYNBEGIN- BDC screen startFNAM- Field nameFVAL- BDC field value
A BDCDATA structure can
contain the batch input data for only a single run of a transaction
Lets for the sake of convenience our
flat file looks like this.
(If you are using the same file for
practice make sure you remove the above two heading rows.)
From above flat file we came to know
about the structure of the internal table in which data will be uploaded.
DATA:
BEGIN OF fs_field,
bsart TYPE eban-bsart, ” Document Type.
matnr TYPE eban-matnr, " Material Number.
menge TYPE eban-menge, " Quantity Requested.
werks TYPE eban-werks, " Plant.
END OF fs_field.
BEGIN OF fs_field,
bsart TYPE eban-bsart, ” Document Type.
matnr TYPE eban-matnr, " Material Number.
menge TYPE eban-menge, " Quantity Requested.
werks TYPE eban-werks, " Plant.
END OF fs_field.
Recoding is done in Transacton – SHDB
.
Here we have done Recording for the
transaction- ME51 .
The Recording which you get will be in
following format.
Now
go to Abap Editor (SE38).
Do the following
coding.
*Input Path
PARAMETERS:
p_file TYPE rlgrap-filename. " File Path
* Structure Decleration
DATA :
BEGIN OF fs_field,
bsart TYPE eban-bsart, " Document Type.
matnr TYPE eban-matnr, " Material Number.
menge TYPE eban-menge, " Quantity Requested.
werks TYPE eban-werks, " Plant.
END OF fs_field.
*Internal table decleration
DATA:
t_field LIKE TABLE OF fs_field,
t_bdcdata LIKE TABLE OF bdcdata.
DATA:
fs_bdcdata LIKE LINE OF t_bdcdata, ”Structure type of bdcdata
w_str TYPE string.
* Data decleration
DATA:
wa_path TYPE string ,
wa_error TYPE string,
wa_cnt TYPE i,
w_mode TYPE c,
wa_cnt1(2) TYPE n,
it_output type table of ty_s_error,
wa_output like line of it_output.
* Opening window for path selection
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = ' '
IMPORTING
file_name = p_file.
TYPES:
fs_struct(4096) TYPE c OCCURS 0 .
DATA:
w_struct TYPE fs_struct.
* Uploading excel file.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_field_seperator = 'X'
* I_LINE_HEADER =
i_tab_raw_data = w_struct
i_filename = p_file
TABLES
i_tab_converted_data = t_field
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.
ENDIF.
PERFORM open_group .
LOOP AT t_field INTO fs_field.
REFRESH: t_bdcdata.
CLEAR : fs_bdcdata.
PERFORM populate_bdcdata.
PERFORM insert_data.
ENDLOOP. " LOOP AT t_f..
* Function to close BDC group.
PERFORM close_group.
*&---------------------------------------------------------------------*
*& Form open_group
*&---------------------------------------------------------------------*
* Function to open BDC
*----------------------------------------------------------------------*
FORM open_group.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
* CLIENT = SY-MANDT
* DEST = FILLER8
group = 'YH1610'
* HOLDDATE = FILLER8
keep = 'X'
user = sy-uname
* RECORD = FILLER1
* PROG = SY-CPROG
* DCPFM = '%'
* DATFM = '%'
* IMPORTING
* QID =
EXCEPTIONS
client_invalid = 1
destination_invalid = 2
group_invalid = 3
group_is_locked = 4
holddate_invalid = 5
internal_error = 6
queue_error = 7
running = 8
system_lock_error = 9
user_invalid = 10
OTHERS = 11
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
WRITE :/ 'Group Open' .
ENDIF. " IF sy-subrc <>
ENDFORM. " Open_group
*&---------------------------------------------------------------------*
*& Form POPULATE_BDCDATA
*&---------------------------------------------------------------------*
* Function to populate data
*----------------------------------------------------------------------*
FORM populate_bdcdata .
PERFORM :
fill_bdc_data USING 'SAPMM06B' '0100' 'X' ' ' ' ',
fill_bdc_data USING '' '' '' 'EBAN-BSART' fs_field-bsart, " Document Type.
fill_bdc_data USING '' '' '' 'BDC_OKCODE' '/00', " Enter.
fill_bdc_data USING 'SAPMM06B' '0106' 'X' ' ' ' ',
fill_bdc_data USING '' '' '' 'EBAN-MATNR(01)' fs_field-matnr, " Material Number.
fill_bdc_data USING '' '' '' 'EBAN-MENGE(01)' fs_field-menge, " Quantity Requested.
fill_bdc_data USING '' '' '' 'EBAN-WERKS(01)' fs_field-werks, " Plant.
fill_bdc_data USING '' '' '' 'BDC_OKCODE' '/00', " Enter.
fill_bdc_data USING 'SAPMM06B' '0102' 'X' '' '' ,
fill_bdc_data USING '' '' '' 'BDC_OKCODE' '=BU'. " Save.
ENDFORM. " POPULATE_BDCDATA
*&---------------------------------------------------------------------*
*& Form FILL_BDC_DATA
*&---------------------------------------------------------------------*
* Function to populate data
*----------------------------------------------------------------------*
* -->VALUE(P_PROGRAM) Program name
* -->VALUE(P_DYNPRO) screen no
* -->VALUE(P_BEGIN) screen start
* -->VALUE(P_FIELD) field name
* -->VALUE(P_VALUE) field value
*----------------------------------------------------------------------*
FORM fill_bdc_data USING value(p_program)
value(p_dynpro)
value(p_begin)
value(p_field)
value(p_value).
CLEAR fs_bdcdata.
IF p_begin = 'X'.
*" Screen Values.
fs_bdcdata-program = p_program. " program name
fs_bdcdata-dynpro = p_dynpro. " screen no
fs_bdcdata-dynbegin = p_begin. " screen start
APPEND fs_bdcdata TO t_bdcdata.
ELSE.
*" Filed Values.
CLEAR fs_bdcdata.
fs_bdcdata-fnam = p_field. " Field name
fs_bdcdata-fval = p_value. " Field value
CONDENSE fs_bdcdata-fval.
APPEND fs_bdcdata TO t_bdcdata.
ENDIF. " IF P_BEGIN = 'X'
ENDFORM. " FILL_BDC_DATA
*&---------------------------------------------------------------------*
*& Form INSERT_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM insert_data .
*Data decleration
DATA:
t_msg TYPE TABLE OF bdcmsgcoll, " Collecting messages
w_msg TYPE bdcmsgcoll,
w_msg1(51).
CALL FUNCTION 'BDC_INSERT'
EXPORTING
tcode = 'ME51'
* POST_LOCAL = NOVBLOCAL
* PRINTING = NOPRINT
* SIMUBATCH = ' '
* CTUPARAMS = ' '
TABLES
dynprotab = t_bdcdata
EXCEPTIONS
internal_error = 1
not_open = 2
queue_error = 3
tcode_invalid = 4
printing_invalid = 5
posting_invalid = 6
OTHERS = 7
.
IF sy-subrc <> 0.
* Error Found
WRITE : / 'DATA Not INSERTED'.
ELSE.
WRITE : / 'DATA INSERTED'.
ENDIF . " IF sy-subr
ENDFORM. " INSERT_DATA
*&---------------------------------------------------------------------*
*& Form CLOSE_GROUP
*&---------------------------------------------------------------------*
* Function to close BDC group
*----------------------------------------------------------------------*
FORM close_group .
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
not_open = 1
queue_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE 'UNABLE TO CLOSE BDC SESSION !' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF. " IF sy-subrc ..
WRITE : / 'CLOSED SESSION'.
ENDFORM. " CLOSE_GROUP
PARAMETERS:
p_file TYPE rlgrap-filename. " File Path
* Structure Decleration
DATA :
BEGIN OF fs_field,
bsart TYPE eban-bsart, " Document Type.
matnr TYPE eban-matnr, " Material Number.
menge TYPE eban-menge, " Quantity Requested.
werks TYPE eban-werks, " Plant.
END OF fs_field.
*Internal table decleration
DATA:
t_field LIKE TABLE OF fs_field,
t_bdcdata LIKE TABLE OF bdcdata.
DATA:
fs_bdcdata LIKE LINE OF t_bdcdata, ”Structure type of bdcdata
w_str TYPE string.
* Data decleration
DATA:
wa_path TYPE string ,
wa_error TYPE string,
wa_cnt TYPE i,
w_mode TYPE c,
wa_cnt1(2) TYPE n,
it_output type table of ty_s_error,
wa_output like line of it_output.
* Opening window for path selection
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = ' '
IMPORTING
file_name = p_file.
TYPES:
fs_struct(4096) TYPE c OCCURS 0 .
DATA:
w_struct TYPE fs_struct.
* Uploading excel file.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_field_seperator = 'X'
* I_LINE_HEADER =
i_tab_raw_data = w_struct
i_filename = p_file
TABLES
i_tab_converted_data = t_field
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.
ENDIF.
PERFORM open_group .
LOOP AT t_field INTO fs_field.
REFRESH: t_bdcdata.
CLEAR : fs_bdcdata.
PERFORM populate_bdcdata.
PERFORM insert_data.
ENDLOOP. " LOOP AT t_f..
* Function to close BDC group.
PERFORM close_group.
*&---------------------------------------------------------------------*
*& Form open_group
*&---------------------------------------------------------------------*
* Function to open BDC
*----------------------------------------------------------------------*
FORM open_group.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
* CLIENT = SY-MANDT
* DEST = FILLER8
group = 'YH1610'
* HOLDDATE = FILLER8
keep = 'X'
user = sy-uname
* RECORD = FILLER1
* PROG = SY-CPROG
* DCPFM = '%'
* DATFM = '%'
* IMPORTING
* QID =
EXCEPTIONS
client_invalid = 1
destination_invalid = 2
group_invalid = 3
group_is_locked = 4
holddate_invalid = 5
internal_error = 6
queue_error = 7
running = 8
system_lock_error = 9
user_invalid = 10
OTHERS = 11
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
WRITE :/ 'Group Open' .
ENDIF. " IF sy-subrc <>
ENDFORM. " Open_group
*&---------------------------------------------------------------------*
*& Form POPULATE_BDCDATA
*&---------------------------------------------------------------------*
* Function to populate data
*----------------------------------------------------------------------*
FORM populate_bdcdata .
PERFORM :
fill_bdc_data USING 'SAPMM06B' '0100' 'X' ' ' ' ',
fill_bdc_data USING '' '' '' 'EBAN-BSART' fs_field-bsart, " Document Type.
fill_bdc_data USING '' '' '' 'BDC_OKCODE' '/00', " Enter.
fill_bdc_data USING 'SAPMM06B' '0106' 'X' ' ' ' ',
fill_bdc_data USING '' '' '' 'EBAN-MATNR(01)' fs_field-matnr, " Material Number.
fill_bdc_data USING '' '' '' 'EBAN-MENGE(01)' fs_field-menge, " Quantity Requested.
fill_bdc_data USING '' '' '' 'EBAN-WERKS(01)' fs_field-werks, " Plant.
fill_bdc_data USING '' '' '' 'BDC_OKCODE' '/00', " Enter.
fill_bdc_data USING 'SAPMM06B' '0102' 'X' '' '' ,
fill_bdc_data USING '' '' '' 'BDC_OKCODE' '=BU'. " Save.
ENDFORM. " POPULATE_BDCDATA
*&---------------------------------------------------------------------*
*& Form FILL_BDC_DATA
*&---------------------------------------------------------------------*
* Function to populate data
*----------------------------------------------------------------------*
* -->VALUE(P_PROGRAM) Program name
* -->VALUE(P_DYNPRO) screen no
* -->VALUE(P_BEGIN) screen start
* -->VALUE(P_FIELD) field name
* -->VALUE(P_VALUE) field value
*----------------------------------------------------------------------*
FORM fill_bdc_data USING value(p_program)
value(p_dynpro)
value(p_begin)
value(p_field)
value(p_value).
CLEAR fs_bdcdata.
IF p_begin = 'X'.
*" Screen Values.
fs_bdcdata-program = p_program. " program name
fs_bdcdata-dynpro = p_dynpro. " screen no
fs_bdcdata-dynbegin = p_begin. " screen start
APPEND fs_bdcdata TO t_bdcdata.
ELSE.
*" Filed Values.
CLEAR fs_bdcdata.
fs_bdcdata-fnam = p_field. " Field name
fs_bdcdata-fval = p_value. " Field value
CONDENSE fs_bdcdata-fval.
APPEND fs_bdcdata TO t_bdcdata.
ENDIF. " IF P_BEGIN = 'X'
ENDFORM. " FILL_BDC_DATA
*&---------------------------------------------------------------------*
*& Form INSERT_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM insert_data .
*Data decleration
DATA:
t_msg TYPE TABLE OF bdcmsgcoll, " Collecting messages
w_msg TYPE bdcmsgcoll,
w_msg1(51).
CALL FUNCTION 'BDC_INSERT'
EXPORTING
tcode = 'ME51'
* POST_LOCAL = NOVBLOCAL
* PRINTING = NOPRINT
* SIMUBATCH = ' '
* CTUPARAMS = ' '
TABLES
dynprotab = t_bdcdata
EXCEPTIONS
internal_error = 1
not_open = 2
queue_error = 3
tcode_invalid = 4
printing_invalid = 5
posting_invalid = 6
OTHERS = 7
.
IF sy-subrc <> 0.
* Error Found
WRITE : / 'DATA Not INSERTED'.
ELSE.
WRITE : / 'DATA INSERTED'.
ENDIF . " IF sy-subr
ENDFORM. " INSERT_DATA
*&---------------------------------------------------------------------*
*& Form CLOSE_GROUP
*&---------------------------------------------------------------------*
* Function to close BDC group
*----------------------------------------------------------------------*
FORM close_group .
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
not_open = 1
queue_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE 'UNABLE TO CLOSE BDC SESSION !' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF. " IF sy-subrc ..
WRITE : / 'CLOSED SESSION'.
ENDFORM. " CLOSE_GROUP
No comments:
Post a Comment