‎2008 May 27 5:57 AM
f there is list processing in bdc then how to handle this .reply plz
‎2008 May 27 6:00 AM
Hi,
DESCRIPTION: BDC program for upload demand (BATCH SESSION - MD11)
Using excel sheet for data upload
YOURCODE:
&----
*& Report ZTBPP102 *
*& *
&----
*& Title: BDC program for upload demand (BATCH SESSION - MD11) *
*& *
&----
Essential Steps :
1. Read the data from excel file into ABAP internal table using
function module ALSM_EXCEL_TO_INTERNAL_TABLE
2. Store the data in internal table and do the validation
3. For valid data create a Batch session (MD11)
Insert data from the internal table into the batch
4. Once the batch is created the user needs to process the batch
by going through SM35
----
REPORT ztbpp102.
------------------- Start of Data Declaration -----------------------*
Constants
CONSTANTS: c_begcol TYPE i VALUE 1,
c_begrow TYPE i VALUE 1,
c_endcol TYPE i VALUE 100,
c_endrow TYPE i VALUE 32000,
c_x(1) TYPE c VALUE 'X'.
DATA : w_field(30),
Flag for data check status
w_invalid_data(1) TYPE c.
FIELD-SYMBOLS : <fs> TYPE ANY.
Internal Tables
The prefix 000n is becuase the colmn in alsmex_tabline isof data
type n withg length 4
TYPES: BEGIN OF ty_tab,
cell_0001 TYPE alsmex_tabline-value, "Plant
cell_0002 TYPE alsmex_tabline-value, "Material No
cell_0003 TYPE alsmex_tabline-value, "Order Start Date
cell_0004 TYPE alsmex_tabline-value, "Order finish Date
cell_0005 TYPE alsmex_tabline-value, "Quantity
cell_0006 TYPE alsmex_tabline-value, "Quantity unit DV1K905068
END OF ty_tab.
TYPES: BEGIN OF ty_error,
line TYPE string,
END OF ty_error.
TYPES: BEGIN OF ty_mara,
matnr TYPE mara-matnr,
END OF ty_mara.
TYPES: BEGIN OF ty_t001w,
werks TYPE t001w-werks,
END OF ty_t001w.
DATA: it_upload_data LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE,
it_tab TYPE STANDARD TABLE OF ty_tab,
wa_tab TYPE ty_tab,
Internal table for BDC
it_bdcdata TYPE STANDARD TABLE OF bdcdata,
*work area
wa_bdcdata TYPE bdcdata,
Internal table to store error
it_error TYPE STANDARD TABLE OF ty_error,
wa_error TYPE ty_error,
it_mara TYPE STANDARD TABLE OF ty_mara,
wa_mara TYPE ty_mara,
it_t001w TYPE STANDARD TABLE OF ty_t001w,
wa_t001w TYPE ty_t001w.
------------------- End of Data Declaration -----------------------*
----
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_file LIKE rlgrap-filename MEMORY ID m02,
p_sesson TYPE apqi-groupid DEFAULT 'DMND_UPLOAD'.
SELECTION-SCREEN: END OF BLOCK b1.
----
Event INITIALIZATION
INITIALIZATION.
CLEAR: w_invalid_data, w_field.
REFRESH: it_upload_data, it_tab, it_error, it_bdcdata, it_mara,
it_t001w.
----
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
Show the file selection dialog box
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
EXPORTING
mask = '(.xls)|.xls|(.)|.' "For excel
static = 'X'
CHANGING
file_name = p_file
EXCEPTIONS
mask_too_long = 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.
----
START-OF-SELECTION
START-OF-SELECTION.
Upload the excel data into the program
PERFORM upload_file.
Populate data in internal table it_tab from excel upload data
PERFORM populate_it_tab_from_excel.
Check the mandatory fields
PERFORM check_data.
When the dataset is valid proceed
IF w_invalid_data IS INITIAL.
Open the BDC session
PERFORM open_group.
Populate BDC table
PERFORM populate_bdc_session.
Close the BDC session
PERFORM close_group.
WRITE:/ 'Batch input session '(m01), p_sesson, ' created
successfully'(m02).
WRITE:/ 'Please process the session using transaction SM35'(m03).
ELSE.
WRITE:/ 'Error in Input Data :'(m04).
SKIP 1.
LOOP AT it_error INTO wa_error.
WRITE:/ wa_error-line.
ENDLOOP.
SKIP 1.
WRITE: 'Please correct error and try to upload again'(m05).
ENDIF.
&----
*& Form UPLOAD_FILE
&----
Upload the data from the excel file into ABAP internal table
----
FORM upload_file .
Upload the excel file in ABAP internal table
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = c_begcol
i_begin_row = c_begrow
i_end_col = c_endcol
i_end_row = c_endrow
TABLES
intern = it_upload_data
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE i999(zttl) WITH 'Error in uploading the file!'(m06).
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. " UPLOAD_FILE
&----
*& Form populate_it_tab_from_excel
&----
Populate data in internal table it_tab from excel upload data
----
FORM populate_it_tab_from_excel .
DATA: l_col_no TYPE alsmex_tabline-col.
Internal table it_upload_data store data in cellwise
with row, colmn and value
Change this data to a row-wise data and populate the table it_tab
SORT it_upload_data BY row col.
Delete the entries with row 0001 as those row has the colmn headings
DELETE it_upload_data WHERE row = '0001'.
Convert the excel data to row-wise data
LOOP AT it_upload_data.
l_col_no = it_upload_data-col.
CONCATENATE 'WA_TAB-cell_' l_col_no INTO w_field.
ASSIGN (w_field) TO <fs>.
IF sy-subrc = 0.
<fs> = it_upload_data-value.
ENDIF.
AT END OF row.
APPEND wa_tab TO it_tab.
CLEAR wa_tab.
ENDAT.
ENDLOOP.
IF it_tab[] IS INITIAL.
MESSAGE i999(zttl) WITH 'No record to upload!'(m07).
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. " populate_it_tab_from_excel
&----
*& Form check_data
&----
Do data validation
----
FORM check_data .
DATA: l_error TYPE string,
l_line_no(4) TYPE c,
l_it_tab_temp TYPE STANDARD TABLE OF ty_tab,
l_it_mara TYPE STANDARD TABLE OF ty_mara,
l_it_t001w TYPE STANDARD TABLE OF ty_t001w,
l_gsmng TYPE plaf-gsmng,
l_matnr TYPE plaf-matnr.
Select plant data from T001w
Cell_0001 is for plant
IF NOT it_tab[] IS INITIAL.
REFRESH l_it_tab_temp.
l_it_tab_temp[] = it_tab[].
SORT l_it_tab_temp BY cell_0001.
DELETE ADJACENT DUPLICATES FROM l_it_tab_temp COMPARING cell_0001.
LOOP AT l_it_tab_temp INTO wa_tab.
wa_t001w-werks = wa_tab-cell_0001.
TRANSLATE wa_t001w-werks TO UPPER CASE. "#EC TRANSLANG
APPEND wa_t001w TO l_it_t001w.
ENDLOOP.
IF NOT l_it_t001w[] IS INITIAL.
SELECT werks
FROM t001w
INTO TABLE it_t001w
FOR ALL ENTRIES IN l_it_t001w
WHERE werks = l_it_t001w-werks.
IF sy-subrc = 0.
SORT it_t001w BY werks.
ENDIF.
ENDIF.
ENDIF.
*Select data from Material master
IF NOT it_tab[] IS INITIAL.
REFRESH l_it_tab_temp.
l_it_tab_temp[] = it_tab[].
Cell 0002 is for material no
SORT l_it_tab_temp BY cell_0002.
DELETE ADJACENT DUPLICATES FROM l_it_tab_temp COMPARING cell_0002.
LOOP AT l_it_tab_temp INTO wa_tab.
call a conversion exit
CLEAR l_matnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = wa_tab-cell_0002
IMPORTING
output = l_matnr.
TRANSLATE l_matnr TO UPPER CASE. "#EC TRANSLANG
wa_mara-matnr = l_matnr.
APPEND wa_mara TO l_it_mara.
ENDLOOP.
IF NOT l_it_mara[] IS INITIAL.
SELECT matnr
FROM mara
INTO TABLE it_mara
FOR ALL ENTRIES IN l_it_mara
WHERE matnr = l_it_mara-matnr.
IF sy-subrc = 0.
SORT it_mara BY matnr.
ENDIF.
ENDIF.
ENDIF.
*Check on mandatory field
LOOP AT it_tab INTO wa_tab.
l_line_no = sy-tabix.
Increase the line no by 1 as the first row (have the heading)
is not considered
l_line_no = l_line_no + 1.
Check for plant (cell_0001)
IF wa_tab-cell_0001 IS INITIAL.
CLEAR: l_error, wa_error.
CONCATENATE text-m08 l_line_no ': Plant is mandatory'(m13)
INTO l_error SEPARATED BY space.
wa_error-line = l_error.
APPEND wa_error TO it_error.
w_invalid_data = c_x.
ELSE.
Check for valid plant
CLEAR wa_t001w.
TRANSLATE wa_tab-cell_0001 TO UPPER CASE. "#EC TRANSLANG
READ TABLE it_t001w INTO wa_t001w WITH KEY werks = wa_tab-cell_0001
BINARY SEARCH.
IF sy-subrc <> 0.
CLEAR: l_error, wa_error.
CONCATENATE text-m08 l_line_no ': Invalid plant '(m14)
wa_tab-cell_0001
INTO l_error SEPARATED BY space.
wa_error-line = l_error.
APPEND wa_error TO it_error.
w_invalid_data = c_x.
ENDIF.
ENDIF.
Check for material number (Cell_0002)
IF wa_tab-cell_0002 IS INITIAL.
CLEAR: l_error, wa_error.
CONCATENATE 'Line'(m08) l_line_no ': Material no is mandatory'(m11)
INTO l_error SEPARATED BY space.
wa_error-line = l_error.
APPEND wa_error TO it_error.
w_invalid_data = c_x.
ELSE.
Check for valid material
CLEAR wa_mara.
TRANSLATE wa_tab-cell_0002 TO UPPER CASE. "#EC TRANSLANG
READ TABLE it_mara INTO wa_mara WITH KEY matnr = wa_tab-cell_0002
BINARY SEARCH.
IF sy-subrc <> 0.
CLEAR: l_error, wa_error.
CONCATENATE text-m08 l_line_no ': Invalid Material no'(m12)
wa_tab-cell_0002
INTO l_error SEPARATED BY space.
wa_error-line = l_error.
APPEND wa_error TO it_error.
w_invalid_data = c_x.
ENDIF.
ENDIF.
Check for quantity (cell_0005)
IF wa_tab-cell_0005 IS INITIAL.
CLEAR: l_error, wa_error.
CONCATENATE text-m08 l_line_no ': Order quantity is mandatory'(m21)
INTO l_error SEPARATED BY space.
wa_error-line = l_error.
APPEND wa_error TO it_error.
w_invalid_data = c_x.
ELSE.
Check that quantity is a number
CLEAR: l_gsmng.
CATCH SYSTEM-EXCEPTIONS conversion_errors = 1.
l_gsmng = wa_tab-cell_0005.
IF l_gsmng = 0.
CLEAR: l_error, wa_error.
CONCATENATE 'Line'(m08) l_line_no ': Quantity cannot be zero'(m22)
INTO l_error SEPARATED BY space.
wa_error-line = l_error.
APPEND wa_error TO it_error.
w_invalid_data = c_x.
ENDIF.
ENDCATCH.
If there is a conversion error
IF sy-subrc = 1.
CLEAR: l_error, wa_error.
CONCATENATE 'Line'(m08) l_line_no ': Quantity'(m23)
wa_tab-cell_0005 'is not a number'(m24)
INTO l_error SEPARATED BY space.
wa_error-line = l_error.
APPEND wa_error TO it_error.
w_invalid_data = c_x.
ENDIF.
ENDIF.
Start of insert DV1K905068
IF wa_tab-cell_0006 IS INITIAL.
CLEAR: l_error, wa_error.
CONCATENATE text-m08 l_line_no ': Quantity unit is mandatory'(m25)
INTO l_error SEPARATED BY space.
wa_error-line = l_error.
APPEND wa_error TO it_error.
w_invalid_data = c_x.
ENDIF.
End of insert DV1K905068
Order finish date is mandatory (Cell_0004)
IF wa_tab-cell_0004 IS INITIAL.
CLEAR: l_error, wa_error.
CONCATENATE text-m08 l_line_no ': Order finish date is mandatory'(m15)
INTO l_error SEPARATED BY space.
wa_error-line = l_error.
APPEND wa_error TO it_error.
w_invalid_data = c_x.
ENDIF.
ENDLOOP.
ENDFORM. " check_data
&----
*& Form open_group
&----
Open the BDC session
----
FORM open_group .
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
client = sy-mandt
group = p_sesson
keep = c_x
user = sy-uname
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 i999(zttl) WITH 'Error in creating session'(m16).
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. " open_group
&----
*& Form close_group
&----
Close the BDC session
----
FORM close_group .
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
not_open = 1
queue_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE i999(zttl) WITH 'Error in closing session'(m17).
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. " close_group
&----
*& Form populate_bdc_session
&----
Populate the BDC table
----
FORM populate_bdc_session .
DATA: l_gsmng TYPE plaf-gsmng, "DV1K905068
l_meins_in TYPE mara-meins, "DV1K905068
l_matnr TYPE mara-matnr, "DV1K905068
l_string_gsmng TYPE string. "DV1K905068
LOOP AT it_tab INTO wa_tab.
REFRESH it_bdcdata.
CLEAR: wa_bdcdata.
First screen of transaction MD111
PERFORM bdc_dynpro USING 'SAPMM61P' '0100'.
Data fiels in screen 0100
PERFORM bdc_field USING 'BDC_CURSOR' 'RM61P-PASCH'.
PERFORM bdc_field USING 'BDC_OKCODE' '/00'.
Planned order profile is always LA
PERFORM bdc_field USING 'RM61P-PASCH' 'LA'.
Screen 2
PERFORM bdc_dynpro USING 'SAPLM61O' '0110'.
Data fiels in screen 0110
Start of change DV1K904978
PERFORM bdc_field USING 'BDC_OKCODE' '=TERM'.
PERFORM bdc_field USING 'BDC_OKCODE' '/00'.
End of change DV1K904978
Material no
PERFORM bdc_field USING 'PLAF-MATNR' wa_tab-cell_0002.
Plant
PERFORM bdc_field USING 'PLAF-PLWRK' wa_tab-cell_0001.
PERFORM bdc_field USING 'BDC_SUBSCR' 'SAPLM61O
0711INCLUDE1XX'.
PERFORM bdc_field USING 'BDC_SUBSCR' 'SAPLM61O
0802INCLUDE711_1'.
PERFORM bdc_field USING 'BDC_CURSOR' 'PLAF-PEDTR'.
Strat of change DV1K905068
Do a material unit conversion from given unit to kg
Use local variable as the fn module needs variable of
type meins
CLEAR: l_meins_in, l_matnr, l_gsmng, l_string_gsmng .
l_meins_in = wa_tab-cell_0006.
l_matnr = wa_tab-cell_0002.
Convert unit text to upper case
TRANSLATE l_matnr TO UPPER CASE. "#EC TRANSLANG
TRANSLATE l_meins_in TO UPPER CASE. "#EC TRANSLANG
Conversion exit on unit
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = l_meins_in
language = sy-langu
IMPORTING
output = l_meins_in
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
WRITE:/ 'Unit not maintained ', l_meins_in.
CONTINUE.
ENDIF.
Converting the amount
CATCH SYSTEM-EXCEPTIONS conversion_errors = 1.
l_gsmng = wa_tab-cell_0005.
ENDCATCH.
IF sy-subrc <> 0.
WRITE:/ 'Quantity is not in proper format ', wa_tab-cell_0005.
CONTINUE.
ENDIF.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
i_matnr = l_matnr
i_in_me = l_meins_in
i_out_me = 'KG'
i_menge = l_gsmng
IMPORTING
e_menge = l_gsmng
EXCEPTIONS
error_in_application = 1
error = 2
OTHERS = 3.
IF sy-subrc <> 0.
WRITE:/ 'Material Unit conversion not maintained for ',
wa_tab-cell_0002.
CONTINUE.
ELSE.
Assign to straig type variable as gsmng is packed and cannot be appended
directly to the BDC session
l_string_gsmng = l_gsmng.
ENDIF.
Quantity
PERFORM bdc_field USING 'PLAF-GSMNG' wa_tab-cell_0005.
PERFORM bdc_field USING 'PLAF-GSMNG' l_string_gsmng.
End of change DV1K905068
Order finish date
PERFORM bdc_field USING 'PLAF-PEDTR' wa_tab-cell_0004.
Order start date
PERFORM bdc_field USING 'PLAF-PSTTR' wa_tab-cell_0003.
PERFORM bdc_field USING 'BDC_SUBSCR' 'SAPLM61O
0810INCLUDE711_2'.
Screen 3
PERFORM bdc_dynpro USING 'SAPLM61O' '0110'.
Data fiels in screen 0110
PERFORM bdc_field USING 'BDC_CURSOR' 'PLAF-MATNR'.
PERFORM bdc_field USING 'BDC_OKCODE' 'HZPL'.
PERFORM bdc_field USING 'BDC_SUBSCR' 'SAPLM61O
0715INCLUDE1XX'.
*Transfer data to batch input by transaction
CALL FUNCTION 'BDC_INSERT'
EXPORTING
tcode = 'MD11'
TABLES
dynprotab = it_bdcdata
EXCEPTIONS
internal_error = 1
not_open = 2
queue_error = 3
tcode_invalid = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE i999(zttl) WITH 'Error in creating session'(m20).
LEAVE LIST-PROCESSING.
ENDIF.
ENDLOOP.
ENDFORM. " populate_bdc_session
&----
*& Form bdc_dynpro
&----
Populate the dynpros
----
-->P_pogram Progran name
-->P_dynpro Screen no
----
FORM bdc_dynpro USING p_program TYPE bdc_prog
p_dynpro TYPE bdc_dynr.
CLEAR wa_bdcdata.
wa_bdcdata-program = p_program.
wa_bdcdata-dynpro = p_dynpro.
wa_bdcdata-dynbegin = c_x.
APPEND wa_bdcdata TO it_bdcdata.
ENDFORM. " bdc_dynpro
&----
*& Form bdc_field
&----
text
----
-->P_fnam Field name
-->P_fval Field value
----
FORM bdc_field USING p_fnam TYPE fnam_____4
p_fval.
CLEAR wa_bdcdata.
wa_bdcdata-fnam = p_fnam.
wa_bdcdata-fval = p_fval.
APPEND wa_bdcdata TO it_bdcdata.
ENDFORM. " bdc_field
Regards,
Jagadish