Bdc subroutines ?
Hi team,
I have a simple doubt in BDC , after recording the transaction i am copying all the perform statements into a seperate
program , now my doubt is how to get or create a ' FORM' statement in the BDC for the corresponding perform
statement ?
Hi,
If u double click on subroutine it create a form <form name>
then u add u r code.
ex :
FORM bdc_dynpro USING program dynpro.
CLEAR t_bdcdata.
t_bdcdata-program = program.
t_bdcdata-dynpro = dynpro.
t_bdcdata-dynbegin = 'X'.
APPEND t_bdcdata.
ENDFORM.
Regards,
Narasimha
Similar Messages
-
Is there a bapi for confirming quantity on schedule line?
Does anyone know of a BAPI for confirming the quantity on a sales order schedule line?
Thank you,
JustinI was not able to get either of these to do what I needed, so I just wrote a BDC subroutine to confirm the quantity.
Thanks for your input! -
Hey Experts,
What will have more impact during an upgrade, a Custom infotype ( where we have created the infotype 100% and the screen and everything is custom) or
An enhacement to an existing infotype?
I personally feel it will be the enhancements to the Existing infotype but the impact is more in terms of integration with the standard functionality but does it really impact during upgrades I am not sure
Can you please let me know on this at the earliest as this is quite Urgent.......
Thanks,
KKHi,
Even the infotype enhancements will not have an impact during the upgrade because they are enhancements(SAP Recommended) and not core modifications.
You may face some problems in the BDC recordings that call the infotype screens. Since the screen numbers and screen-field names tend to change from one version to another.
Focus will be on the BDC subroutines that are used in your reports and module pool programs.
Hope this helps you.
Regards,
Subbu. -
Unable to run BDC due to start-of-selection
Hi Experts,
I am running BDC for ROH type.
The data is in the excel file so I am performing the below operation.
In the BDC recording before perform open group there is "START-OF-SELECTION" and I also have a START-OF-SELECTION for excel uploading now how wud both would go together..
My requirement is to select the file through F4 then choose BDC type session or call transaction
and upload the data
Since I have 2 start-of-selection nothing happens after F8.
Help is really appreciated and rewarded.
Selection-screen begin of block b1 with frame title text-001.
parameter: f_name type rlgrap-filename default 'D:\Cost_element_KS06.xls'.
parameter : p_begcol type i default 1 no-display,
p_begrow type i default 2 no-display,
p_endcol type i default 8 no-display,
p_endrow type i default 46 no-display.
selection-screen end of block b1.
at selection-screen on value-request for f_name.
perform f_get_file using f_name.
start-of-selection.
perform f_xls_itab using f_name changing it_excel.
perform f_move_data.
include bdcrecx1.
start-of-selection.
perform open_group.
loop at t_ks06 to wa.
" Here I have the BDC recording recorderd through SHDB for ROH
endloop.
perform close_group.
Ranjith N.Hi Avinash,
I have made the following modification but stil the same.
report ZNRD_BDC_UPD_COSTELEMENT
no standard page heading line-size 255.
* Declaring work area and internal tables
data : begin of t_ks06 occurs 0,
KOKRS type KOKRS, " Controlling area
KSTAR type KSTAR, " Cost element
DATAB type DATAB, " Valid from date
DATBI type DATBI, " Valid to date
KTEXT type KTEXT, " Name
LTEXT type LTEXT, " Description
KATYP type KATYP, " Cost element cat
KOSTL type KOSTL, " Cost center
end of t_ks06.
data : wa like line of t_ks06.
data : it_excel type alsmex_tabline occurs 0 with header line.
*data : flg_mv(1) type n value 0. " Flag to check data Moved.
selection-screen begin of block b1 with frame title text-001.
parameter: f_name type rlgrap-filename default 'C:\Documents and Settings\Administrator\Desktop\Project_data\Cost_element_KS06.xls'.
parameter : p_begcol type i default 1 no-display,
p_begrow type i default 2 no-display,
p_endcol type i default 8 no-display,
p_endrow type i default 46 no-display.
selection-screen end of block b1.
" Iam performing all subroutines under at selection-screen and under start-of-selection Iam calling the bdc
but still nothing happens. please help
at selection-screen on value-request for f_name.
perform f_get_file using f_name.
perform f_xls_itab using f_name changing it_excel.
perform f_move_data.
*perform f_display_data.
start-of-selection.
perform open_group.
loop at t_ks06 to wa.
perform bdc_dynpro using 'SAPLKMA4' '0200'.
perform bdc_field using 'BDC_CURSOR'
'CSKBZ-KOKRS'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'CSKBZ-KOKRS'
wa-KOKRS.
perform bdc_field using 'CSKBZ-KSTAR'
wa-KSTAR.
perform bdc_field using 'CSKBZ-DATAB_ANFO'
wa-DATAB.
perform bdc_field using 'CSKBZ-DATBI_ANFO'
wa-DATBI.
perform bdc_dynpro using 'SAPLKMA4' '0299'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'BDC_CURSOR'
'CSKBZ-EIGEN'.
perform bdc_field using 'CSKBZ-KTEXT'
wa-KTEXT.
perform bdc_field using 'CSKBZ-LTEXT'
wa-LTEXT.
perform bdc_field using 'CSKBZ-KATYP'
wa-KATYP.
perform bdc_dynpro using 'SAPLKMA4' '0299'.
perform bdc_field using 'BDC_OKCODE'
'=VKON'.
perform bdc_field using 'BDC_CURSOR'
'CSKBZ-KTEXT'.
perform bdc_field using 'CSKBZ-KTEXT'
wa-KTEXT.
perform bdc_field using 'CSKBZ-LTEXT'
wa-LTEXT.
perform bdc_field using 'CSKBZ-KATYP'
wa-KATYP.
perform bdc_dynpro using 'SAPLKMA4' '0299'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'BDC_CURSOR'
'CSKBZ-KOSTL'.
perform bdc_field using 'CSKBZ-KOSTL'
wa-KOSTL.
perform bdc_dynpro using 'SAPLKMA4' '0299'.
perform bdc_field using 'BDC_OKCODE'
'=BU'.
perform bdc_field using 'BDC_CURSOR'
'CSKBZ-KOSTL'.
perform bdc_field using 'CSKBZ-KOSTL'
wa-KOSTL.
perform bdc_transaction using 'KA06'.
endloop.
perform close_group.
include bdcrecx1.
*& Form f_get_file
* text
* -->P_FILE_NAM text
form f_get_file using p_file_nam.
call function 'KD_GET_FILENAME_ON_F4'
exporting
program_name = syst-repid
dynpro_number = syst-dynnr
* FIELD_NAME = ' '
* STATIC = ' '
* MASK = ' '
changing
file_name = f_name
exceptions
mask_too_long = 1
others = 2.
endform. " f_get_file
*& Form f_xls_itab
* text
* -->P_FILE_NAM text
* <--P_IT_EXCEL text
form f_xls_itab using p_file_nam changing p_it_excel.
call function 'ALSM_EXCEL_TO_INTERNAL_TABLE'
exporting
filename = f_name
i_begin_col = p_begcol
i_begin_row = p_begrow
i_end_col = p_endcol
i_end_row = p_endrow
tables
intern = it_excel
exceptions
inconsistent_parameters = 1
upload_ole = 2
others = 3.
endform. " f_xls_itab
*& Form f_move_data
* text
* --> p1 text
* <-- p2 text
form f_move_data.
data : lv_index type i.
field-symbols <fs>.
* Sorting the internal table
sort it_excel by row col.
clear it_excel.
loop at it_excel.
move it_excel-col to lv_index.
* Assigning each record to the internal table row.
assign component lv_index of structure wa to <fs>.
* Assigning the field value to a field symbol
move it_excel-value to <fs>.
at end of row.
append wa to t_ks06.
* flg_mv = 1.
clear wa.
endat.
endloop.
endform. " f_move_data
*& Form f_display_data
* text
* --> p1 text
* <-- p2 text
form f_display_data.
write:/1 sy-uline(140).
write:/1 sy-vline, 'Cont area', " Controlling area
16 sy-vline, 'Cost ele', " Cost element
31 sy-vline, 'Valid from', " Valid from date
46 sy-vline, 'Valid to ' , " Valid to date
61 sy-vline, 'Name', "Cost element cat
76 sy-vline, 'Description', " Cost center
101 sy-vline, 'Cost ele cat', " Cost element cat
126 sy-vline, 'Cost center', " Cost center
140 sy-vline.
write:/1 sy-uline(140).
skip 1.
clear wa.
loop at t_ks06 into wa.
write:/2 sy-uline(139).
write:/2 sy-vline, wa-KOKRS, " Controlling area
16 sy-vline, wa-KSTAR, " Cost element
31 sy-vline, wa-DATAB, " Valid from date
46 sy-vline, wa-DATBI, " Valid to date
61 sy-vline, wa-KTEXT, " Name
76 sy-vline, wa-LTEXT, " Description
101 sy-vline, wa-KATYP, " Cost element cat
120 sy-vline, wa-KOSTL, " Cost center
140 sy-vline.
endloop.
endform. " f_display_data
Regards,
Ranjith -
hi gurus,
i have a problem in bdc programm there is 3 screen using transaction f-27
there is two amount field as(wrbtr,wrbtr2)
two screen are run fine but the 3 screen does't take data automatically from flat file plz help me its urgent see my codes and give me solution.
TYPES: BEGIN OF it_output,
bldat(10) TYPE C, "Document Date
blart TYPE bkpf-blart, "Document Type
bukrs TYPE bkpf-bukrs, "Company Code
budat(10) TYPE C, "Posting Date
monat TYPE bkpf-monat, "Period
waers TYPE bkpf-waers, "Currency
xblnr TYPE bkpf-xblnr, "Reference Field
docid TYPE fs006-docid, "Document ID
newbs TYPE rf05a-newbs, "Posting Key
newko TYPE rf05a-newko, "Account Code
wrbtr(16) TYPE C, "Amount in Document currency
zfbdt(10) TYPE C, "Baseline Date
newbs2 TYPE rf05a-newbs, "Account Key2
newko2 TYPE rf05a-newko, "Account code2
wrbtr2(16) TYPE C, "Amount2
END OF it_output.
DATA lt_output TYPE it_output OCCURS 0 WITH HEADER LINE.
DATA it_bdc LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA it_messtab LIKE bdcmsgcoll OCCURS 1 WITH HEADER LINE.
D A T A *
DATA: message TYPE string.
DATA: p_file1 type string.
S E L E C T - O P T I O N S / P A R A M E T E R S *
SELECTION-SCREEN BEGIN OF BLOCK block0 WITH FRAME.
PARAMETERS : p_file LIKE rlgrap-filename OBLIGATORY.
SELECTION-SCREEN END OF BLOCK block0.
A T S E L E C T I O N - S C R E E N *
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
EXPORTING
static = 'X'
mask = space
CHANGING
file_name = p_file.
S T A R T - O F - S E L E C T I O N
START-OF-SELECTION.
PERFORM upload.
PERFORM bdc.
PERFORM write_message.
*& Form bdc
text
FORM bdc.
LOOP AT lt_output.
READ TABLE lt_output INDEX 1.
PERFORM bdc_dynpro USING 'SAPMF05A' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR' 'RF05A-NEWKO'.
PERFORM bdc_field USING 'BDC_OKCODE' '/00'.
PERFORM bdc_field USING 'BKPF-BLDAT' lt_output-bldat.
PERFORM bdc_field USING 'BKPF-BLART' lt_output-blart.
PERFORM bdc_field USING 'BKPF-BUKRS' lt_output-bukrs.
PERFORM bdc_field USING 'BKPF-BUDAT' lt_output-budat.
PERFORM bdc_field USING 'BKPF-MONAT' lt_output-monat.
PERFORM bdc_field USING 'BKPF-WAERS' lt_output-waers.
PERFORM bdc_field USING 'BKPF-XBLNR' lt_output-xblnr.
PERFORM bdc_field USING 'FS006-DOCID' lt_output-docid.
PERFORM bdc_field USING 'RF05A-NEWBS' lt_output-newbs.
PERFORM bdc_field USING 'RF05A-NEWKO' lt_output-newko.
PERFORM bdc_dynpro USING 'SAPMF05A' '0302'.
PERFORM bdc_field USING 'BDC_CURSOR' 'RF05A-NEWKO'.
PERFORM bdc_field USING 'BDC_OKCODE' '/00'.
PERFORM bdc_field USING 'BSEG-WRBTR' lt_output-wrbtr.
PERFORM bdc_field USING 'BSEG-ZFBDT' lt_output-zfbdt.
PERFORM bdc_field USING 'RF05A-NEWBS' lt_output-newbs2."newbs2
PERFORM bdc_field USING 'RF05A-NEWKO' lt_output-newko2."newko2
PERFORM bdc_dynpro USING 'SAPMF05A' '0301'.
PERFORM bdc_field USING 'BDC_CURSOR' 'BSEG-WRBTR'.
PERFORM bdc_field USING 'BDC_OKCODE' '=BU'.
PERFORM bdc_field USING 'BSEG-WRBTR' lt_output-wrbtr2."wrbtr2
PERFORM bdc_field USING 'BSEG-MWSKZ' '**'.
PERFORM bdc_field USING 'BSEG-ZTERM' 'C007'.
PERFORM bdc_field USING 'BSEG-ZBD1T' '7'.
CALL TRANSACTION 'F-27' USING it_bdc mode 'A'
MESSAGES INTO it_messtab.
CLEAR it_bdc. REFRESH it_bdc.
ENDLOOP.
ENDFORM. "bdc
*& Form write_message
text
FORM write_message.
LOOP AT it_messtab .
CLEAR message.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = sy-msgid
lang = 'EN'
no = sy-msgno
v1 = sy-msgv1
v2 = sy-msgv2
v3 = sy-msgv3
v4 = sy-msgv4
IMPORTING
msg = message.
CASE it_messtab-msgtyp.
WHEN 'S'.
WRITE:/ message.
CLEAR message.
WHEN 'E'.
FORMAT COLOR 6 ON.
WRITE:/ message.
CLEAR message.
ENDCASE.
ENDLOOP.
ENDFORM. "write_message
FORM BDC_DYNPRO *
--> PROGRAM *
--> DYNPRO *
FORM bdc_dynpro USING program dynpro.
it_bdc-program = program.
it_bdc-dynpro = dynpro.
it_bdc-dynbegin = 'X'.
APPEND it_bdc.
CLEAR it_bdc.
ENDFORM. "BDC_DYNPRO
FORM *
FORM bdc_field USING fnam fval.
it_bdc-fnam = fnam.
it_bdc-fval = fval.
APPEND it_bdc.
CLEAR it_bdc.
ENDFORM. "BDC_FIELD
*& Form upload
text
--> p1 text
<-- p2 text
FORM upload .
p_file1 = p_file.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = p_file1
FILETYPE = 'DAT'
tables
data_tab = lt_output
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " upload
i am also send u my flat file the client says that in amount filed of 3rd screen we will give the * asterick or other amount plz take it.
thank
plz help me.
jay
Edited by: jayant kumar on Apr 30, 2008 12:42 PMhi jayant,
Declare '**' as a character constant and pass this constant to the Subroutine.
data : c_astrick type char2 value '**'.
PERFORM bdc_field USING 'BSEG-MWSKZ c_astrick.
Reward points if it is helpful.
Regards,
srilatha. -
How to create bdc for fbs1 using both call transaction and session
Hi Friends,
i have one problem with tcode FBS1, i need to create a bdc program for both call transaction and session method using subroutine.
first call transaction needs to execute if there is an error sesion has to execute. if u have code please forward.
thanks in advance.
chandramouli pothuguntawhere as in call transaction we can do error handling explictly.those errors are stored in one file .this file will send to the error log(session method),i.e session log.
in the above case we use both call transaction n session method at time in one program.sample code is below ,go through it .
data : begin of itxk01 occurs 0,
end of itxk01.
data : bdcdata like itbdcdata occurs 0 with header line.
data : itbdcmsgcoll like itbdcmsgcoll occurs 0 with header line,
itxk01 like itxk01-dup occurs 0 with header line.
call gui-upload.
loop at itxk01.
refresh itxk01.
perform bdc-dynpr0 using 'prg' 'scr'
perform bdc-dynfld using fnam fval
call transaction 'xk01' using bdcdata mode 'a' update 's' messages into itbdcmsgcoll.
if sy-subrc ne 0.
append itxk01 into itxk01-dup.
endif.
endloop.
if not itxk01-dup[] is initial.
refresh itck01.
call bdc_open_group
itxk01 = itxk01-dup.
loop at itxk01.
refresh itxk01.
perform bdc-dynpr0 using 'prg' 'scr'
perform bdc-dynfld using fnam fval
call bdc-insert.
endloop.
call bdc-close-group.
form bdc-dynpr0 using pr sc
endform .
form bdc-field using fnam faval
endform.
this will help u.
reward points for me
kiran -
How to use bdc code in a report for save button
hi to all can anybody please give some hints that how can i place the BDC code for the save button to pass the values from the editable grid to the standard table here i am sending my code .please advice me.
Moderator Message: Please post only relevant portions of your code. There is a 2,500 character per post limit.
here the second grid is editable.and i have to make changes in the second grid and save it to the standard tables. please advice me resma
Edited by: kishan P on Sep 13, 2010 3:59 PMHi,
I have done that many times. Create a button in the toolbar,say 'SAVE'. Write the code in the subroutine user command.For example :
*& Form USER_COMMAND
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
DATA : REF_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: L_VALID TYPE C.
*Code to reflect the changes done in the internal table
IF REF_GRID IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = REF_GRID.
ENDIF.
IF NOT REF_GRID IS INITIAL.
CALL METHOD REF_GRID->CHECK_CHANGED_DATA
IMPORTING
E_VALID = L_VALID.
ENDIF.
CASE SY-UCOMM.
WHEN 'SAVE'.
PERFORM BDC."Write all you BDC code in this subroutine
ENDCASE.
ENDFORM.
Hope this will help.
Thanks & Regards,
Rock. -
How to get the Number of lines displayed in table control in bdc
Hi,
when we write a bdc for a standard transaction, if we encounter a table control, we fill the values for each record like field(01), and the second record field(02) .......and so on..
if only 3 records are displayed in the screen and if we have 5 records to be filled in the table control, how to write the logic for that?
how to track of how many lines are getting displayed in the table control .. again it depends on the screen resolution i think..
useful answers will be rewarded
shekharHi,
Here is the solution code for this :-
data for controlling paging on screen 0102
DATA: W_MAXLINES(2) TYPE N,
W_NEXT_LINE(3) TYPE N,
W_PAGE(1), "y = page forward, n otherwise
W_SCRLEN(2) TYPE I,
W_SCRLINE(2) TYPE I.
DATA: BEGIN OF W_HDR.
INCLUDE STRUCTURE D020S.
DATA: END OF W_HDR.
DATA: BEGIN OF W_FLD OCCURS 100.
INCLUDE STRUCTURE D021S.
DATA: END OF W_FLD.
DATA: BEGIN OF W_LOG OCCURS 20.
INCLUDE STRUCTURE D022S.
DATA: END OF W_LOG.
DATA: BEGIN OF W_MC OCCURS 20.
INCLUDE STRUCTURE D023S.
DATA: END OF W_MC.
DATA: BEGIN OF W_DYNPRONAME,
PROGRAM(8) VALUE 'SAPMM60X',
DYNPRO(4) VALUE '0102',
END OF W_DYNPRONAME.
FORM GET_MAX_LINES.
set w_maxlines to the number of var-loop occurrences on the screen so
that we know when to page forward on screen 0102
also initialise w_next_line to zero for GET_NEXT_LINE
this subroutine caters for all cases - including screens without loops
CLEAR: W_MAXLINES,
W_NEXT_LINE.
IMPORT DYNPRO W_HDR
W_FLD
W_LOG
W_MC
ID W_DYNPRONAME.
LOOP AT W_FLD WHERE LTYP EQ 'L'.
MOVE W_FLD-LINE TO W_SCRLINE. "first var-loop line
MOVE W_FLD-LBLK TO W_SCRLEN. "depth of loop block
EXIT.
ENDLOOP.
IF SY-SUBRC EQ 0
AND W_SCRLEN NE 0.
sy-srows = total no of lines on screen
w_scrline = actual first line of loop so that
w_scrline - 1 = number of heading lines (before loop)
4 = no of lines at top of screen - command line, pushbuttons, 2 ulines
3 = no of lines after loop - uline & Page count
w_scrlen = no of lines in loop block
w_maxlines = sy-srows - ( wscrline - 1 ) - 4 - 3
and then 1 less but not sure why!
W_MAXLINES = SY-SROWS - W_SCRLINE - 1 - 4 - 3.
W_MAXLINES = W_MAXLINES - 1.
W_MAXLINES = W_MAXLINES DIV W_SCRLEN.
ELSE.
MOVE 99 TO W_MAXLINES. "this required if no screen loop
ENDIF.
ENDFORM.
FORM GET_NEXT_LINE.
set w_page if page forward is required
W_NEXT_LINE = W_NEXT_LINE + 1.
IF W_NEXT_LINE GT W_MAXLINES.
W_NEXT_LINE = 1.
W_PAGE = 'Y'.
ELSE.
W_PAGE = 'N'.
ENDIF.
ENDFORM.
Hope it helps.
reward if helpful.
Regards,
Sipra -
Error in BDC for Infotype 0589
Hi friends,
I have developed a BDC program for Infotype 0589. After executing the program to upload data from file, I am getting error message: Field Q0589-ANZHL(7) input value is longer than screen field
Here I am adding my Sample code also.
REPORT ZTEST_0589.
PARAMETERS :
p_file TYPE rlgrap-filename. " Accepts File Name
*" Type declarations...................................................
TYPES :
BEGIN OF type_s_it0589,
pernr TYPE rp50g-pernr, " Personnel Number
inftyp TYPE rp50g-choic, " Infotype
begda TYPE p0589-begda, " Begin Date
endda TYPE p0589-endda, " End Date
lga01 TYPE q0589-lgart,
betrg01 TYPE q0589-betrg,
anzhl01 TYPE q0589-anzhl,
lga02 TYPE q0589-lgart,
betrg02 TYPE q0589-betrg,
anzhl02 TYPE q0589-anzhl,
lga03 TYPE q0589-lgart,
betrg03 TYPE q0589-betrg,
anzhl03 TYPE q0589-anzhl,
lga04 TYPE q0589-lgart,
betrg04 TYPE q0589-betrg,
anzhl04 TYPE q0589-anzhl,
lga05 TYPE q0589-lgart,
betrg05 TYPE q0589-betrg,
anzhl05 TYPE q0589-anzhl,
lga06 TYPE q0589-lgart,
betrg06 TYPE q0589-betrg,
anzhl06 TYPE q0589-anzhl,
lga07 TYPE q0589-lgart,
betrg07 TYPE q0589-betrg,
anzhl07 TYPE q0589-anzhl,
lga08 TYPE q0589-lgart,
betrg08 TYPE q0589-betrg,
anzhl08 TYPE q0589-anzhl,
END OF type_s_it0589.
Work variables
DATA:
w_file TYPE string, " File Name
w_betrg(50) TYPE c, " Proposed Contribution
w_anzhl(50) TYPE c, " Actual Contribution
w_count(2) TYPE n, " Counter
w_year(4) TYPE n, " Year
w_month(2) TYPE n, " Month
w_day(2) TYPE n, " Day
w_date(10) TYPE c, " Date
w_wage(50) TYPE c, " wage
w_waget(50) TYPE c, " wage type
w_curr(12) TYPE c, " Currency
w_tabrows LIKE sy-srows VALUE 7, " Table Control rows
w_update TYPE i, " Number of Updated Records
w_failed TYPE i, " Number of Failed Records
w_0589_lines TYPE i, " Number of Records in File
w_text TYPE string. " CheckBox for considering
" Actual Contributions
Structure to hold File Data *
DATA :
fs_it0589 TYPE type_s_it0589.
Structure to hold Batch input: New table field structure *
DATA :
fs_bdcdata TYPE bdcdata.
Structure to hold Messages in the SAP System *
DATA :
fs_messages TYPE bdcmsgcoll.
Structure to hold Personnel Number, Message Type & Message Text *
DATA:
BEGIN OF fs_log,
pernr TYPE rp50g-pernr,
msgtxt(200) TYPE c,
msgtyp TYPE c,
END OF fs_log.
Structure to hold Parameter string for runtime of CALL TRANSACTION *
DATA :
fs_opt TYPE ctu_params.
Internal Table to hold File Data *
DATA :
t_it0589 LIKE
STANDARD TABLE
OF fs_it0589.
Internal Table to hold Batch input: New table field structure *
DATA :
t_bdcdata TYPE
STANDARD TABLE
OF bdcdata.
Internal Table to hold Messages in the SAP System *
DATA:
t_messages TYPE TABLE OF bdcmsgcoll.
Internal Table to hold Personnel Number, Message Type & Message Text*
DATA:
t_log LIKE
STANDARD TABLE
OF fs_log.
FORM validate .
IF p_file IS INITIAL.
MESSAGE e005(zvalid).
ENDIF. " IF P_FILE IS INITIAL.
MOVE p_file TO w_file.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = w_file
filetype = 'ASC'
has_field_separator = 'X'
dat_mode = 'X'
TABLES
data_tab = t_it0589
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
IF t_it0589 IS INITIAL.
MESSAGE e006(zvalid).
ENDIF. " IF T_IT0589 IS INITIAL
ENDFORM. " FORM VALIDATE
FORM f4_help .
CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = p_file.
ENDFORM. " FORM F4_HELP
*& Form FILL_BDCDATA
FORM fill_bdcdata .
DESCRIBE TABLE t_it0589 LINES w_0589_lines.
LOOP AT t_it0589 INTO fs_it0589.
REFRESH t_bdcdata.
REFRESH t_messages.
PERFORM bdc_dynpro USING 'SAPMP50A' '1000'.
PERFORM bdc_field USING 'RP50G-PERNR'
fs_it0589-pernr.
w_year = fs_it0589-begda+0(4).
w_month = fs_it0589-begda+4(2).
w_day = fs_it0589-begda+6(2).
CONCATENATE w_day w_month w_year INTO w_date
SEPARATED BY '.'.
PERFORM bdc_field USING 'RP50G-BEGDA'
w_date.
w_year = fs_it0589-endda+0(4).
w_month = fs_it0589-endda+4(2).
w_day = fs_it0589-endda+6(2).
CONCATENATE w_day w_month w_year INTO w_date
SEPARATED BY '.'.
PERFORM bdc_field USING 'RP50G-ENDDA'
w_date.
PERFORM bdc_field USING 'RP50G-CHOIC'
fs_it0589-inftyp.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_dynpro USING 'SAPMP50A' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=INS'.
PERFORM bdc_dynpro USING 'MP058900' '2000'.
1st Row...............................................................
ADD 1 TO w_count.
MOVE fs_it0589-lga01 TO w_wage.
PERFORM bdc_field USING 'Q0589-LGART(01)'
w_wage.
MOVE fs_it0589-betrg01 TO w_curr.
PERFORM bdc_field USING 'Q0589-BETRG(01)'
w_curr.
MOVE fs_it0589-anzhl01 TO w_curr.
PERFORM bdc_field USING 'Q0589-ANZHL(01)'
w_curr.
2nd Row...............................................................
3rd Row...............................................................
4th Row...............................................................
5th Row...............................................................
6th Row...............................................................
ADD 1 TO w_count.
IF w_count > w_tabrows .
w_count = 1.
PERFORM bdc_field USING 'BDC_OKCODE'
'P+' .
PERFORM bdc_dynpro USING 'MP058900' '2000'.
ENDIF. " IF W_COUNT > W_TABROWS
MOVE fs_it0589-lga06 TO w_curr.
CONCATENATE 'Q0589-LGART(' w_count ')' INTO w_wage.
PERFORM bdc_field USING w_wage
w_curr.
MOVE fs_it0589-betrg06 TO w_curr.
CONCATENATE 'Q0589-BETRG(' w_count ')' INTO w_betrg.
PERFORM bdc_field USING w_betrg
w_curr.
MOVE fs_it0589-anzhl06 TO w_curr.
CONCATENATE 'Q0589-ANZHL(' w_count ')' INTO w_anzhl.
PERFORM bdc_field USING w_anzhl
w_curr.
7th Row...............................................................
ADD 1 TO w_count.
IF w_count > w_tabrows .
w_count = 1.
PERFORM bdc_field USING 'BDC_OKCODE'
'P+' .
PERFORM bdc_dynpro USING 'MP058900' '2000'.
ENDIF. " IF W_COUNT > W_TABROWS
MOVE fs_it0589-lga07 TO w_curr.
CONCATENATE 'Q0589-LGART(' w_count ')' INTO w_wage.
PERFORM bdc_field USING w_wage
w_curr.
MOVE fs_it0589-betrg07 TO w_curr.
CONCATENATE 'Q0589-BETRG(' w_count ')' INTO w_betrg.
PERFORM bdc_field USING w_betrg
w_curr.
MOVE fs_it0589-anzhl07 TO w_curr.
CONCATENATE 'Q0589-ANZHL(' w_count ')' INTO w_anzhl.
PERFORM bdc_field USING w_anzhl
w_curr.
*- -- Same upto 15 rows.......
Save..................................................................
PERFORM bdc_field USING 'BDC_OKCODE'
'=UPD'.
Back..................................................................
PERFORM bdc_dynpro USING 'MP058900' '2000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/EBCK'.
w_count = 0.
CALL TRANSACTION 'PA30' USING t_bdcdata
OPTIONS FROM fs_opt
MESSAGES INTO t_messages.
LOOP AT t_messages INTO fs_messages.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = fs_messages-msgid
lang = sy-langu
no = fs_messages-msgnr
v1 = fs_messages-msgv1
v2 = fs_messages-msgv2
v3 = fs_messages-msgv3
v4 = fs_messages-msgv4
IMPORTING
msg = fs_log-msgtxt
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF. " IF SY-SUBRC NE 0
MOVE fs_it0589-pernr TO fs_log-pernr.
MOVE fs_messages-msgtyp TO fs_log-msgtyp.
APPEND fs_log TO t_log.
CLEAR fs_log.
IF fs_messages-msgtyp EQ 'S'
AND fs_messages-msgnr EQ '102'.
ADD 1 TO w_update.
ELSEIF fs_messages-msgtyp EQ 'S'
AND fs_messages-msgnr EQ '015'
OR fs_messages-msgtyp EQ 'E'.
ADD 1 TO w_failed.
ENDIF. " IF FS_MESSAGES-MSGTYP EQ 'S'
ENDLOOP. " LOOP AT T_MESSAGES
ENDLOOP. " LOOP AT T_IT0585
WRITE :/ 'Number of Records Fetched from file'(001),
50 w_0589_lines COLOR 1,
/ 'Number of Records Updated into the database'(002),
50 w_update COLOR 1,
/ 'Number of Records Failed to update into database'(003),
50 w_failed COLOR 6 .
SKIP 3.
WRITE :/ 'Detailed Log.....'(004).
SKIP 1.
LOOP AT t_log INTO fs_log.
AT NEW pernr.
WRITE :/ fs_log-pernr COLOR 1.
ENDAT. " AT NEW PERNR
IF fs_log-msgtyp = 'E'.
WRITE :15 fs_log-msgtxt COLOR 6 INVERSE ON.
ELSE.
WRITE :15 fs_log-msgtxt.
ENDIF. " IF FS_LOG-MSGTYP = 'E'
ENDLOOP. " LOOP AT T_LOG INTO FS_LOG
ENDFORM. " FORM FILL_BDCDATA
*& Form BDC_DYNPRO
This subroutine starts new screen *
There are no interface parameters to be passed to this subroutine. *
FORM bdc_dynpro USING program dynpro.
CLEAR fs_bdcdata.
fs_bdcdata-program = program.
fs_bdcdata-dynpro = dynpro.
fs_bdcdata-dynbegin = 'X'.
APPEND fs_bdcdata TO t_bdcdata.
ENDFORM. " FORM BDC_DYNPRO
*& Form BDC_FIELD
This subroutine inserts field *
There are no interface parameters to be passed to this subroutine. *
FORM bdc_field USING fnam fval.
CLEAR fs_bdcdata.
fs_bdcdata-fnam = fnam.
fs_bdcdata-fval = fval.
APPEND fs_bdcdata TO t_bdcdata.
ENDFORM. " FORM BDC_FIELD
Thanks,
Ziad khanHi Amit,
Thaks for reply. Amit, I am new to ABAP-HR so i dont know how to use FM "HR_MAINTAIN_MASTERDATA".
Can u please explain in detail.
Thanks
Ziad -
hi alll
1. i have written below coding for vendor master update. i have two records in text file, in that first record not updated. while updating its shows error. but second record updated. how can i solve. plse help me
2. I want to show the error message or i want to print how can i do it
REPORT ZVENTESTBDC.
data : begin of it_xk01 occurs 0,
LIFNR(10) type c,
BUKRS(4) type c,
EKORG(4) type c,
KTOKK(4) type c,
NAME1(30) type c,
SORT1(10) type c,
LAND1(3) type c,
AKONT(10) type c,
FDGRV(10) type c,
WAERS(3) type c,
end of it_xk01.
DATA : IT_BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE,
IT_BDCMSGCOLL LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = 'C:\Documents and Settings\entegall\Desktop\vendor.txt'
FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = 'X'
HEADER_LENGTH = 0
READ_BY_LINE = 'X'
DAT_MODE = ' '
CODEPAGE = ' '
IGNORE_CERR = ABAP_TRUE
REPLACEMENT = '#'
CHECK_BOM = ' '
VIRUS_SCAN_PROFILE =
NO_AUTH_CHECK = ' '
IMPORTING
FILELENGTH =
HEADER =
TABLES
DATA_TAB = it_xk01.
loop at it_xk01.
refresh it_bdcdata.
perform open_group.
perform bdc_dynpro using 'SAPMF02K' '0100'.
perform bdc_field using 'BDC_CURSOR'
'RF02K-REF_LIFNR'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'RF02K-LIFNR'
it_xk01-lifnr.
perform bdc_field using 'RF02K-BUKRS'
IT_XK01-BUKRS.
perform bdc_field using 'RF02K-EKORG'
IT_XK01-EKORG.
perform bdc_field using 'RF02K-KTOKK'
IT_XK01-KTOKK.
perform bdc_dynpro using 'SAPMF02K' '0110'.
perform bdc_field using 'BDC_CURSOR'
'LFA1-LAND1'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'LFA1-NAME1'
IT_XK01-NAME1.
perform bdc_field using 'LFA1-SORTL'
IT_XK01-SORT1.
perform bdc_field using 'LFA1-NAME2'
perform bdc_field using 'LFA1-LAND1'
IT_XK01-LAND1.
perform bdc_dynpro using 'SAPMF02K' '0120'.
perform bdc_field using 'BDC_CURSOR'
'LFA1-KUNNR'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_dynpro using 'SAPMF02K' '0130'.
perform bdc_field using 'BDC_CURSOR'
'LFBK-BANKS(01)'.
perform bdc_field using 'BDC_OKCODE'
'=ENTR'.
perform bdc_dynpro using 'SAPMF02K' '0210'.
perform bdc_field using 'BDC_CURSOR'
'LFB1-FDGRV'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'LFB1-AKONT'
IT_XK01-AKONT.
perform bdc_field using 'LFB1-FDGRV'
IT_XK01-FDGRV.
perform bdc_dynpro using 'SAPMF02K' '0215'.
perform bdc_field using 'BDC_CURSOR'
'LFB1-ZTERM'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_dynpro using 'SAPMF02K' '0220'.
perform bdc_field using 'BDC_CURSOR'
'LFB5-MAHNA'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_dynpro using 'SAPMF02K' '0310'.
perform bdc_field using 'BDC_CURSOR'
'LFM1-WAERS'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'LFM1-WAERS'
IT_XK01-WAERS.
perform bdc_dynpro using 'SAPMF02K' '0320'.
perform bdc_field using 'BDC_CURSOR'
'RF02K-LIFNR'.
perform bdc_field using 'BDC_OKCODE'
'=UPDA'.
*perform bdc_transaction using 'XK01' using IT_BDCDATA mode 'A' UPDATE 'S'
CALL TRANSACTION 'XK01' USING IT_BDCDATA
MODE 'A'
UPDATE 'S' MESSAGES INTO IT_BDCMSGCOLL.
*perform close_group.
endloop.
FORM BDC_DYNPRO USING PROG SCR.
CLEAR IT_BDCDATA.
IT_BDCDATA-PROGRAM = PROG.
IT_BDCDATA-DYNPRO = SCR.
IT_BDCDATA-DYNBEGIN = 'X'.
APPEND IT_BDCDATA.
ENDFORM.
FORM BDC_FIELD USING FNAM FVAL.
CLEAR IT_BDCDATA.
IT_BDCDATA-FNAM = FNAM.
IT_BDCDATA-FVAL = FVAL.
APPEND IT_BDCDATA.
ENDFORM.go through this porgarm u will get the clear picture about down loading the error msg.
PROGRAM ID : ZSD_CONDREC_DISCOUNT_ZSWD
DESCRIPTION : BDC PROGRAM TO UPLOAD CONDITION RECORDS FOR Discount
TRANSACTION : VK11
CONDITION TYPE : ZSWD(Key combination 3)
VERSION : 1.0
Text Elements
001 : Select Options
002 : C:\SD\Error\Discount-ZSWD
003 : Error Download Path
004 : C:\SD\Error\Discount-ZSWD - DDMMYYYY HH:MM:SS.txt
REPORT ZSD_CONDREC_DISCOUNT_ZSWD
MESSAGE-ID 00.
*include bdcrecx1.
TABLES : t100.
Internal table declaration *
DATA : BEGIN OF it_price OCCURS 0,
index(4), "Index
kschl(4), "Condition type
vkorg(4), "Sales organization
vtweg(2), "distribution channel
spart(2), "Division
matnr(18), "Material no
kbetr(11), "Rate
konwa(5), "Rate unit (currency or percentage)
kmein(3), "Condition unit
krech(1), "Calculation type for condition
datab(10), "Validity start date
datbi(10), "Validity end date
er_message(100),
END OF it_price.
Internal table to get the error data *
DATA : it_error LIKE it_price OCCURS 0 WITH HEADER LINE.
DATA : bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA : i_msgtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
Internal table to find the error from the legacy data *
DATA : BEGIN OF it_erfind OCCURS 0,
index(4), "Index
er_message(100), "For Error Message
END OF it_erfind.
Variables declaration *
DATA : g_message(200),
time(10),
date(10) ,
v_error_filename LIKE rlgrap-filename.
date = sy-datum.
time = sy-uzeit.
Initialization
INITIALIZATION.
Generating Error file name with date and time.
PERFORM make_file_name.
Selection Screen *
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETER: p_file LIKE ibipparms-path OBLIGATORY.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(30) text-003.
SELECTION-SCREEN COMMENT 33(79) text-004.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN:END OF BLOCK b1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file .
PERFORM get_filename.
Start of selection
START-OF-SELECTION.
PERFORM upload_data.
PERFORM fill_data.
END-OF-SELECTION.
*& Form fill_data
text
FORM fill_data.
LOOP AT it_price.
*Start of Screen 1
PERFORM bdc_dynpro USING 'SAPMV13A' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RV13A-KSCHL'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ANTA'.
PERFORM bdc_field USING 'RV13A-KSCHL'
it_price-kschl.
Key Combination: Sales org / Dist. channel / Division / Material
PERFORM bdc_dynpro USING 'SAPLV14A' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RV130-SELKZ(03)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=WEIT'.
PERFORM bdc_field USING 'RV130-SELKZ(03)'
'X'.
*Start of Screen 2
PERFORM bdc_dynpro USING 'SAPMV13A' '1800'.
PERFORM bdc_field USING 'KOMG-VKORG'
it_price-vkorg.
PERFORM bdc_field USING 'KOMG-VTWEG'
it_price-vtweg.
PERFORM bdc_field USING 'KOMG-SPART'
it_price-spart.
PERFORM bdc_field USING 'KOMG-MATNR(01)'
it_price-matnr.
PERFORM bdc_field USING 'KONP-KBETR(01)'
it_price-kbetr.
PERFORM bdc_field USING 'KONP-KONWA(01)'
it_price-konwa.
PERFORM bdc_field USING 'KONP-KMEIN(01)'
it_price-kmein.
PERFORM bdc_field USING 'RV13A-KRECH(01)'
it_price-krech.
PERFORM bdc_field USING 'RV13A-DATAB(01)'
it_price-datab.
PERFORM bdc_field USING 'RV13A-DATBI(01)'
it_price-datbi.
perform bdc_dynpro using 'SAPMV13A' '1821'.
perform bdc_field using 'BDC_CURSOR'
'KOMG-MATNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=SICH'. "Save the entry
PERFORM bdc_transaction TABLES i_msgtab USING 'VK11' 'N' 'L'.
*To fetch the error message from the standard error table
SELECT SINGLE * FROM t100 WHERE sprsl = 'E'
AND arbgb = sy-msgid
AND msgnr = sy-msgno.
g_message = t100-text.
*subroutine to change the error message for every document number
PERFORM replace_parameters USING sy-msgv1
sy-msgv2
sy-msgv3
sy-msgv4
CHANGING g_message.
WRITE: / 'System variables:'.
SKIP.
WRITE: / ' Sy-msgty:', sy-msgty.
WRITE: / ' Sy-msgid:', sy-msgid.
WRITE: / ' Sy-msgno:', sy-msgno.
WRITE: / ' Sy-msgv1:', sy-msgv1.
WRITE: / ' Sy-msgv2:', sy-msgv2.
WRITE: / ' Sy-msgv3:', sy-msgv3.
WRITE: / ' Sy-msgv4:', sy-msgv4.
SKIP.
WRITE: / 'Message:'.
SKIP.
WRITE: / sy-msgty, g_message.
*To find out the error in the legacy data if there is anything and pass
*the document no with error message to the seperate internal table
*called it_erfind
IF sy-msgty = 'E'.
it_erfind-index = it_price-index.
it_erfind-er_message = g_message.
APPEND it_erfind.
ENDIF.
*Finally we are segregating the error and downloading the error data.
AT LAST.
*To segregate the error
PERFORM segregate_error.
*To download the error from it_error internal table with err mesg
PERFORM error_download.
PERFORM display_message.
ENDAT.
ENDLOOP.
perform close_group.
CLEAR it_price.
ENDFORM. "fill_data
*Subrotine to replace the parameters
FORM replace_parameters USING p_par_1 p_par_2 p_par_3
p_par_4 CHANGING p_message.
erst mal pruefen, ob numerierte Parameter verwendet wurden
DO.
REPLACE '&1' WITH p_par_1 INTO p_message.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ENDDO.
DO.
REPLACE '&2' WITH p_par_2 INTO p_message.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ENDDO.
DO.
REPLACE '&3' WITH p_par_3 INTO p_message.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ENDDO.
DO.
REPLACE '&4' WITH p_par_4 INTO p_message.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ENDDO.
falls keine numerierten Parameter vorh., ersetzen wie gehabt
REPLACE '&' WITH p_par_1 INTO p_message.
CONDENSE p_message.
IF sy-subrc EQ 0.
REPLACE '&' WITH p_par_2 INTO p_message.
CONDENSE p_message.
IF sy-subrc EQ 0.
REPLACE '&' WITH p_par_3 INTO p_message.
CONDENSE p_message.
IF sy-subrc EQ 0.
REPLACE '&' WITH p_par_4 INTO p_message.
CONDENSE p_message.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. "REPLACE_PARAMETERS
*Subroutine to segregate the error data from the legacy data
FORM segregate_error.
LOOP AT it_erfind.
LOOP AT it_price WHERE index = it_erfind-index.
MOVE-CORRESPONDING it_price TO it_error.
it_error-er_message = it_erfind-er_message.
APPEND it_error.
ENDLOOP.
ENDLOOP.
ENDFORM. "segregate_error
*Subroutine to download the error data from the it_error table.
FORM error_download.
IF it_error[] IS NOT INITIAL.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
codepage = 'IBM'
filename = v_error_filename
filetype = 'DAT'
TABLES
data_tab = it_error.
ENDIF.
ENDFORM. "error_download
Start new screen *
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM. "BDC_DYNPRO
Insert field *
FORM bdc_field USING fnam fval.
IF FVAL <> NODATA.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDIF.
ENDFORM. "BDC_FIELD
*& Form bdc_transaction
text
-->MESSTAB text
-->TCODE text
-->CTUMODE text
-->CUPDATE text
FORM bdc_transaction TABLES messtab USING tcode ctumode cupdate .
CALL TRANSACTION tcode USING bdcdata
MODE ctumode
UPDATE cupdate
MESSAGES INTO messtab.
REFRESH bdcdata.
CLEAR bdcdata.
ENDFORM. " bdc_transaction
Uploading data file to internal table. *
FORM upload_data.
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
filename = p_file
CODEPAGE = 'IBM '
filetype = 'DAT'
TABLES
data_tab = it_price
EXCEPTIONS
conversion_error = 1
invalid_table_width = 2
invalid_type = 3
no_batch = 4
unknown_error = 5
gui_refuse_filetransfer = 6
OTHERS = 7.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "upload_data
*& Form display_message
FORM display_message .
IF it_error[] IS INITIAL.
MESSAGE i019(zmsg). "Success
ELSE.
MESSAGE e020(zmsg). "Failed
ENDIF.
ENDFORM. " display_message
*& Form get_filename
text
--> p1 text
<-- p2 text
FORM get_filename .
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
FIELD_NAME = p_file
IMPORTING
file_name = p_file .
IF sy-subrc NE 0 .
WRITE : / 'Enter File Name'.
ENDIF.
ENDFORM. " get_filename
*& Form make_file_name
FORM make_file_name .
WRITE sy-datum TO date MM/DD/YYYY.
WRITE sy-uzeit TO time USING EDIT MASK ' __ __ __'.
CONCATENATE text-002 date time '.txt'
INTO v_error_filename.
ENDFORM. " make_file_name
regards
prabhu -
Call function '' in update task - code inside is BDC
hi to all,
in using call function '' in update task
the code inside is bdc. is this possible?
my scenario is from VA01 then post billing to VF01,
i am using user-exit MV45AFZZ in subroutine userexit_save_document.
i need to post billing after va01 save.
thanks to all.To debug in the update task, you have to set that option on in the debugger.
If the user exit runs in the update task, then you must have something like: CALL FUNCTION MODULE my_fm_to_do_BDC STARTING NEW TASK. ( This function module should wait until the SD is created. You might want to check in a loop, with a WAIT command. Once it is created, then you start your BDC and CALL TRANSACTION. ) This is NOT an update function module. It may need to be RFC enabled - I'm not certain at the moment.
If the user exit doesn't run in the update task, you need to create, and call from the user exit, an update function module that calls your function module "my_fm_to_do_BDC" STARTING NEW TASK.
The attribute "collective run", which is V3, means that the update task won't run that function module until a regularly scheduled job on the application server runs. For processing to run during the rest of the SD save, you must use V1 (could be run in any order with other V1s) or V2 (Will run after V1, but in any order with other V2s). Typically, I use V2 for this kind of task.
matt -
How can we use TABLE CONTROL in BDC and WORK FLOW of ABAP.
how can we use TABLE CONTROL in BDC and WORK FLOW of ABAP.?
please explain the important questions.How to deal with table control / step loop in BDC
Steploop and table contol is inevitable in certain transactions. When we run BDC for such transactions, we will face the situation: how many visible lines of steploop/tablecontrol are on the screen? Although we can always find certain method to deal with it, such as function code 'NP', 'POPO', considering some extreme situation: there is only one line visible one the screen, our BDC program should display an error message. (See transaction 'ME21', we you resize your screen to let only one row visible, you can not enter mutiple lines on this screen even you use 'NP')
Now with the help of Poonam on sapfans.com developement forum, I find a method with which we can determine the number of visible lines on Transaction Screen from our Calling BDC program. Maybe it is useless to you, but I think it will give your some idea.
Demo ABAP code has two purposes:
1. how to determine number of visible lines and how to calculte page number;
(the 'calpage' routine has been modify to meet general purpose usage)
2. using field symbol in BDC program, please pay special attention to the difference in Static ASSIGN and Dynamic ASSIGN.
Now I begin to describe the step to implement my method:
(I use transaction 'ME21', screen 121 for sample,
the method using is Call Transation Using..)
Step1: go to screen painter to display the screen 121, then we can count the fixed line on this screen, there is 7 lines above the steploop and 2 lines below the steploop, so there are total 9 fixed lines on this screen. This means except these 9 lines, all the other line is for step loop. Then have a look at steploop itselp, one entry of it will occupy two lines.
(Be careful, for table control, the head and the bottom scroll bar will possess another two fixed lines, and there is a maximum number for table line)
Now we have : FixedLine = 9
LoopLine = 2(for table control, LoopLine is always equal to 1)
Step2: go to transaction itself(ME21) to see how it roll page, in ME21, the first line of new page is always occupied by the last line of last page, so it begin with index '02', but in some other case, fisrt line is empty and ready for input.
Now we have: FirstLine = 0
or FirstLine = 1 ( in our case, FirstLine is 1 because the first line of new page is fulfilled)
Step3: write a subroutine calcalculating number of pages
(here, the name of actual parameter is the same as formal parameter)
global data: FixedLine type i, " number of fixed line on a certain screen
LoopLine type i, " the number of lines occupied by one steploop item
FirstLine type i, " possbile value 0 or 1, 0 stand for the first line of new " scrolling screen is empty, otherwise is 1
Dataline type i, " number of items you will use in BDC, using DESCRIBE to get
pageno type i, " you need to scroll screen how many times.
line type i, " number of lines appears on the screen.
index(2) type N, " the screen index for certain item
begin type i, " from parameter of loop
end type i. " to parameter of loop
*in code sample, the DataTable-linindex stands for the table index number of this line
form calpage using FixedLine type i (see step 1)
LoopLine type i (see step 1)
FirstLine type i (see step 2)
DataLine type i ( this is the item number you will enter in transaction)
changing pageno type i (return the number of page, depends on run-time visible line in table control/ Step Loop)
changing line type i.(visible lines one the screen)
data: midd type i,
vline type i, "visible lines
if DataLine eq 0.
Message eXXX.
endif.
vline = ( sy-srows - FixedLine ) div LoopLine.
*for table control, you should compare vline with maximum line of
*table control, then take the small one that is min(vline, maximum)
*here only illustrate step loop
if FirstLine eq 0.
pageno = DataLine div vline.
if pageno eq 0.
pageno = pageno + 1.
endif.
elseif FirstLine eq 1.
pageno = ( DataLine - 1 ) div ( vline - 1 ) + 1.
midd = ( DataLine - 1 ) mod ( vline - 1).
if midd = 0 and DataLine gt 1.
pageno = pageno - 1.
endif.
endif.
line = vline.
endform.
Step4 write a subroutine to calculate the line index for each item.
form calindex using Line type i (visible lines on the screen)
FirstLine type i(see step 2)
LineIndex type i(item index)
changing Index type n. (index on the screen)
if FirstLine = 0.
index = LineIndex mod Line.
if index = '00'.
index = Line.
endif.
elseif FirstLine = 1.
index = LineIndex mod ( Line - 1 ).
if ( index between 1 and 0 ) and LineIndex gt 1.
index = index + Line - 1.
endif.
if Line = 2.
index = index + Line - 1.
endif.
endif.
endform.
Step5 write a subroutine to calculate the loop range.
form calrange using Line type i ( visible lines on the screen)
DataLine type i
FirstLine type i
loopindex like sy-index
changing begin type i
end type i.
If FirstLine = 0.
if loopindex = 1.
begin = 1.
if DataLine <= Line.
end = DataLine.
else.
end = Line.
endif.
elseif loopindex gt 1.
begin = Line * ( loopindex - 1 ) + 1.
end = Line * loopindex.
if end gt DataLine.
end = DataLine.
endif.
endif.
elseif FirstLine = 1.
if loopindex = 1.
begin = 1.
if DataLine <= Line.
end = DataLine.
else.
end = Line.
endif.
elseif loop index gt 1.
begin = ( Line - 1 ) * ( loopindex - 1 ) + 2.
end = ( Line - 1 ) * ( loopindex - 1 ) + Line.
if end gt DataLine.
end = DataLine.
endif.
endif.
endif.
endform.
Step6 using field sysbol in your BDC, for example: in ME21, but you should calculate each item will correponding to which index in steploop/Table Control
form creat_bdc.
field-symbols: <material>, <quan>, <indicator>.
data: name1(14) value 'EKPO-EMATN(XX)',
name2(14) value 'EKPO-MENGE(XX)',
name3(15) value 'RM06E-SELKZ(XX)'.
assign: name1 to <material>,
name2 to <quan>,
name3 to <indicator>.
do pageno times.
if sy-index gt 1
*insert scroll page ok_code"
endif.
perform calrange using Line DataLine FirstLine sy-index
changing begin end.
loop at DataTable from begin to end.
perform calindex using Line FirstLine DataTable-LineIndex changing Index.
name1+11(2) = Index.
name2+11(2) = Index.
name3+12(2) = Index.
perform bdcfield using <material> DataTable-matnr.
perform bdcfield using <quan> DataTable-menge.
perform bdcfield using <indicator> DataTable-indicator.
endloop.
enddo.
An example abap program of handling Table Control during bdc programming.
REPORT zmm_bdcp_purchaseorderkb02
NO STANDARD PAGE HEADING LINE-SIZE 255.
Declaring internal tables *
*-----Declaring line structure
DATA : BEGIN OF it_dummy OCCURS 0,
dummy(255) TYPE c,
END OF it_dummy.
*-----Internal table for line items
DATA : BEGIN OF it_idata OCCURS 0,
ematn(18), "Material Number.
menge(13), "Qyantity.
netpr(11), "Net Price.
werks(4), "Plant.
ebelp(5), "Item Number.
END OF it_idata.
*-----Deep structure for header data and line items
DATA : BEGIN OF it_me21 OCCURS 0,
lifnr(10), "Vendor A/c No.
bsart(4), "A/c Type.
bedat(8), "Date of creation of PO.
ekorg(4), "Purchasing Organisation.
ekgrp(3), "Purchasing Group.
x_data LIKE TABLE OF it_idata,
END OF it_me21.
DATA : x_idata LIKE LINE OF it_idata.
DATA : v_delimit VALUE ','.
DATA : v_indx(3) TYPE n.
DATA : v_fnam(30) TYPE c.
DATA : v_count TYPE n.
DATA : v_ne TYPE i.
DATA : v_ns TYPE i.
*include bdcrecx1.
INCLUDE zmm_incl_purchaseorderkb01.
Search help for file *
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
IMPORTING
file_name = p_file.
START-OF-SELECTION.
To upload the data into line structure *
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
filename = p_file
filetype = 'DAT'
TABLES
data_tab = it_dummy.
Processing the data from line structure to internal tables *
REFRESH:it_me21.
CLEAR :it_me21.
LOOP AT it_dummy.
IF it_dummy-dummy+0(01) = 'H'.
v_indx = v_indx + 1.
CLEAR it_idata.
REFRESH it_idata.
CLEAR it_me21-x_data.
REFRESH it_me21-x_data.
SHIFT it_dummy.
SPLIT it_dummy AT v_delimit INTO it_me21-lifnr
it_me21-bsart
it_me21-bedat
it_me21-ekorg
it_me21-ekgrp.
APPEND it_me21.
ELSEIF it_dummy-dummy+0(01) = 'L'.
SHIFT it_dummy.
SPLIT it_dummy AT v_delimit INTO it_idata-ematn
it_idata-menge
it_idata-netpr
it_idata-werks
it_idata-ebelp.
APPEND it_idata TO it_me21-x_data.
MODIFY it_me21 INDEX v_indx.
ENDIF.
ENDLOOP.
To open the group *
PERFORM open_group.
To populate the bdcdata table for header data *
LOOP AT it_me21.
v_count = v_count + 1.
REFRESH it_bdcdata.
PERFORM subr_bdc_table USING: 'X' 'SAPMM06E' '0100',
' ' 'BDC_CURSOR' 'EKKO-LIFNR',
' ' 'BDC_OKCODE' '/00',
' ' 'EKKO-LIFNR' it_me21-lifnr,
' ' 'RM06E-BSART' it_me21-bsart,
' ' 'RM06E-BEDAT' it_me21-bedat,
' ' 'EKKO-EKORG' it_me21-ekorg,
' ' 'EKKO-EKGRP' it_me21-ekgrp,
' ' 'RM06E-LPEIN' 'T'.
PERFORM subr_bdc_table USING: 'X' 'SAPMM06E' '0120',
' ' 'BDC_CURSOR' 'RM06E-EBELP',
' ' 'BDC_OKCODE' '/00'.
MOVE 1 TO v_indx.
*-----To populate the bdcdata table for line item data
LOOP AT it_me21-x_data INTO x_idata.
CONCATENATE 'EKPO-EMATN(' v_indx ')' INTO v_fnam.
PERFORM subr_bdc_table USING ' ' v_fnam x_idata-ematn.
CONCATENATE 'EKPO-MENGE(' v_indx ')' INTO v_fnam.
PERFORM subr_bdc_table USING ' ' v_fnam x_idata-menge.
CONCATENATE 'EKPO-NETPR(' v_indx ')' INTO v_fnam.
PERFORM subr_bdc_table USING ' ' v_fnam x_idata-netpr.
CONCATENATE 'EKPO-WERKS(' v_indx ')' INTO v_fnam.
PERFORM subr_bdc_table USING ' ' v_fnam x_idata-werks.
v_indx = v_indx + 1.
PERFORM subr_bdc_table USING: 'X' 'SAPMM06E' '0120',
' ' 'BDC_CURSOR' 'RM06E-EBELP',
' ' 'BDC_OKCODE' '/00'.
ENDLOOP.
PERFORM subr_bdc_table USING: 'X' 'SAPMM06E' '0120',
' ' 'BDC_CURSOR' 'RM06E-EBELP',
' ' 'BDC_OKCODE' '=BU'.
PERFORM bdc_transaction USING 'ME21'.
ENDLOOP.
PERFORM close_group.
End of selection event *
END-OF-SELECTION.
IF session NE 'X'.
*-----To display the successful records
WRITE :/10 text-001. "Sucess records
WRITE :/10 SY-ULINE(20).
SKIP.
IF it_sucess IS INITIAL.
WRITE :/ text-002.
ELSE.
WRITE :/ text-008, "Total number of Succesful records
35 v_ns.
SKIP.
WRITE:/ text-003, "Vendor Number
17 text-004, "Record number
30 text-005. "Message
ENDIF.
LOOP AT it_sucess.
WRITE:/4 it_sucess-lifnr,
17 it_sucess-tabix CENTERED,
30 it_sucess-sucess_rec.
ENDLOOP.
SKIP.
*-----To display the erroneous records
WRITE:/10 text-006. "Error Records
WRITE:/10 SY-ULINE(17).
SKIP.
IF it_error IS INITIAL.
WRITE:/ text-007. "No error records
ELSE.
WRITE:/ text-009, "Total number of erroneous records
35 v_ne.
SKIP.
WRITE:/ text-003, "Vendor Number
17 text-004, "Record number
30 text-005. "Message
ENDIF.
LOOP AT it_error.
WRITE:/4 it_error-lifnr,
17 it_error-tabix CENTERED,
30 it_error-error_rec.
ENDLOOP.
REFRESH it_sucess.
REFRESH it_error.
ENDIF.
CODE IN INCLUDE.
Include ZMM_INCL_PURCHASEORDERKB01
DATA: it_BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
DATA: it_MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
DATA: E_GROUP_OPENED.
*-----Internal table to store sucess records
DATA:BEGIN OF it_sucess OCCURS 0,
msgtyp(1) TYPE c,
lifnr LIKE ekko-lifnr,
tabix LIKE sy-tabix,
sucess_rec(125),
END OF it_sucess.
DATA: g_mess(125) type c.
*-----Internal table to store error records
DATA:BEGIN OF it_error OCCURS 0,
msgtyp(1) TYPE c,
lifnr LIKE ekko-lifnr,
tabix LIKE sy-tabix,
error_rec(125),
END OF it_error.
Selection screen
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS session RADIOBUTTON GROUP ctu. "create session
SELECTION-SCREEN COMMENT 3(20) text-s07 FOR FIELD session.
SELECTION-SCREEN POSITION 45.
PARAMETERS ctu RADIOBUTTON GROUP ctu. "call transaction
SELECTION-SCREEN COMMENT 48(20) text-s08 FOR FIELD ctu.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 3(20) text-s01 FOR FIELD group.
SELECTION-SCREEN POSITION 25.
PARAMETERS group(12). "group name of session
SELECTION-SCREEN COMMENT 48(20) text-s05 FOR FIELD ctumode.
SELECTION-SCREEN POSITION 70.
PARAMETERS ctumode LIKE ctu_params-dismode DEFAULT 'N'.
"A: show all dynpros
"E: show dynpro on error only
"N: do not display dynpro
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 48(20) text-s06 FOR FIELD cupdate.
SELECTION-SCREEN POSITION 70.
PARAMETERS cupdate LIKE ctu_params-updmode DEFAULT 'L'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 3(20) text-s03 FOR FIELD keep.
SELECTION-SCREEN POSITION 25.
PARAMETERS: keep AS CHECKBOX. "' ' = delete session if finished
"'X' = keep session if finished
SELECTION-SCREEN COMMENT 48(20) text-s09 FOR FIELD e_group.
SELECTION-SCREEN POSITION 70.
PARAMETERS e_group(12). "group name of error-session
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 51(17) text-s03 FOR FIELD e_keep.
SELECTION-SCREEN POSITION 70.
PARAMETERS: e_keep AS CHECKBOX. "' ' = delete session if finished
"'X' = keep session if finished
SELECTION-SCREEN END OF LINE.
PARAMETERS:p_file LIKE rlgrap-filename.
at selection screen *
AT SELECTION-SCREEN.
group and user must be filled for create session
IF SESSION = 'X' AND
GROUP = SPACE. "OR USER = SPACE.
MESSAGE E613(MS).
ENDIF.
create batchinput session *
FORM OPEN_GROUP.
IF SESSION = 'X'.
SKIP.
WRITE: /(20) 'Create group'(I01), GROUP.
SKIP.
*----open batchinput group
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = GROUP
USER = sy-uname.
WRITE:/(30) 'BDC_OPEN_GROUP'(I02),
(12) 'returncode:'(I05),
SY-SUBRC.
ENDIF.
ENDFORM. "OPEN_GROUP
end batchinput session *
FORM CLOSE_GROUP.
IF SESSION = 'X'.
*------close batchinput group
CALL FUNCTION 'BDC_CLOSE_GROUP'.
WRITE: /(30) 'BDC_CLOSE_GROUP'(I04),
(12) 'returncode:'(I05),
SY-SUBRC.
ELSE.
IF E_GROUP_OPENED = 'X'.
CALL FUNCTION 'BDC_CLOSE_GROUP'.
WRITE: /.
WRITE: /(30) 'Fehlermappe wurde erzeugt'(I06).
ENDIF.
ENDIF.
ENDFORM. "CLOSE_GROUP
Start new transaction according to parameters *
FORM BDC_TRANSACTION USING TCODE TYPE ANY.
DATA: L_SUBRC LIKE SY-SUBRC.
*------batch input session
IF SESSION = 'X'.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = TCODE
TABLES
DYNPROTAB = it_BDCDATA.
WRITE: / 'BDC_INSERT'(I03),
TCODE,
'returncode:'(I05),
SY-SUBRC,
'RECORD:',
SY-INDEX.
ELSE.
REFRESH it_MESSTAB.
CALL TRANSACTION TCODE USING it_BDCDATA
MODE CTUMODE
UPDATE CUPDATE
MESSAGES INTO it_MESSTAB.
L_SUBRC = SY-SUBRC.
WRITE: / 'CALL_TRANSACTION',
TCODE,
'returncode:'(I05),
L_SUBRC,
'RECORD:',
SY-INDEX.
ENDIF.
Message handling for Call Transaction *
perform subr_mess_hand using g_mess.
*-----Erzeugen fehlermappe
IF L_SUBRC <> 0 AND E_GROUP <> SPACE.
IF E_GROUP_OPENED = ' '.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = E_GROUP
USER = sy-uname
KEEP = E_KEEP.
E_GROUP_OPENED = 'X'.
ENDIF.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = TCODE
TABLES
DYNPROTAB = it_BDCDATA.
ENDIF.
REFRESH it_BDCDATA.
ENDFORM. "BDC_TRANSACTION
Form subr_bdc_table *
text
-->P_0220 text *
-->P_0221 text *
-->P_0222 text *
FORM subr_bdc_table USING VALUE(P_0220) TYPE ANY
VALUE(P_0221) TYPE ANY
VALUE(P_0222) TYPE ANY.
CLEAR it_bdcdata.
IF P_0220 = ' '.
CLEAR it_bdcdata.
it_bdcdata-fnam = P_0221.
it_bdcdata-fval = P_0222.
APPEND it_bdcdata.
ELSE.
it_bdcdata-dynbegin = P_0220.
it_bdcdata-program = P_0221.
it_bdcdata-dynpro = P_0222.
APPEND it_bdcdata.
ENDIF.
ENDFORM. " subr_bdc_table
Form subr_mess_hand *
text *
-->P_G_MESS text *
FORM subr_mess_hand USING P_G_MESS TYPE ANY.
LOOP AT IT_MESSTAB.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
ID = it_messtab-msgid
LANG = it_messtab-msgspra
NO = it_messtab-msgnr
v1 = it_messtab-msgv1
v2 = it_messtab-msgv2
IMPORTING
MSG = P_G_MESS
EXCEPTIONS
OTHERS = 0.
CASE it_messtab-msgtyp.
when 'E'.
it_error-error_rec = P_G_MESS.
it_error-lifnr = it_me21-lifnr.
it_error-tabix = v_count.
APPEND IT_ERROR.
when 'S'.
it_sucess-sucess_rec = P_G_MESS.
it_sucess-lifnr = it_me21-lifnr.
it_sucess-tabix = v_count.
APPEND IT_SUCESS.
endcase.
ENDLOOP.
Describe table it_sucess lines v_ns.
Describe table it_error lines v_ne.
ENDFORM. " subr_mess_hand
Also refer
http://sap.ittoolbox.com/groups/technical-functional/sap-dev/bdc-table-control-668404
and
http://www.sap-img.com/abap/bdc-example-using-table-control-in-bdc.htm
Regards,
srinivas
<b>*reward for useful answers*</b> -
HR Abap ques - Process Dynamic Actions in BDC mode
Hi friends.
We are using HR_INFOTYPE_OPERATION to update some infotypes. The problem is that dynamic action does not get triggered as SY-BINPT = 'X' when we use this FM or BDC to update.
Now, is there any workaround so that we can process dynamic actions via our program?
Can somehow we call the subroutine DYN_ACTION from our program? Can the values of PSAVE etc be availabe in our program?
Has someone done it before -> calling Dyn actions from your program?
Thanks in adv!One more input -> I tried to include the MPPDAT00 in my main program and then call DYN_MEASURE in program <MPxxxx00>. But the values of PSAVE, DYNMEAS, etc don't seem to be there still.
-
Error in bdc upgrade from 4.6c to ecc 5.0
I have written a BDC which will update the data in FB01. Now this BDC was running well until we upgraded to ECC 5.0.
Now it is giving me a formating error in the purchasing document number and the field is taking / when it is empty and this is telling me 'formating error'.
I am not sure if this is the error but i need to know better. Can someone help?'/' is the character passed by default into the bdc when it doesnt find any entry for a particular field. All you need to do is specify the value of field NODATA as space instead of '/'.
You can see this field populated in the BDCFIELD subroutine.
Sudha -
What is the exact way of doing BDC ?????
I know when the input is minimal we have to use CALL TRANSACTION method in BDC and when we have batch of input files we have to use BDC Recording.
My question is what is the exact way of doing BDC.
Could any one please tell me the exact way of doing BDC Recording Process.
I appreciate your help.
Thanks for your Time.
Shiv.Hello Sivaramu,
Call transcation can handle only one Trasaction(Tcode).
Session method can handle multiple transcations.
Before getting started with the Recording process...we have to know the transcation code. We do recording to record the screen number, screen values, Button values(OK codes) ...etc
For example...while recording we create a record using some t-code (Say MM01) ...Now, we will create a materail master record using the Recording process.
Let us see the process of recoding a single record with MM01 using SHDB(A tool used to record the details of T-code)
Go through these steps for recording by using SHDB.
How to use recording :
Go to SHDB
--> Click on New Recording
--> Provide any name in Recording , For ex: Z_CHAITU
--> Provide the Transaction name as MM01
--> Select the update mode as Synchrounous or Asynchrounus method
--> Click on Start Recording button.
--> It will display MM01 screen .type the appropriate
information in it.
--> Type the Material no as : 4567E (Any no, But there should b 1 Character in it)
--> Type Checmical Industry in INDUSTRY SECTOR
--> Type COUPONS in MATERIAL TYPE
--> Now click on Select Views button.
--> Select BASIC DATA 1
--> Click on Ok button
--> Under Basic data tab under Material, it will display the Material number.
--> Type the short description and Provide EA as Base Unit Of Measure
--> CLICK ON BACK AND IT WILL ASK U TO SAVE THE DATA, CLICK ON YES
--> Again click on Back, it will ask if u wish to save the changes to record entries.
-> Click on Yes
--> Now, u will be in Initial screen
--> Select the record and Click on Program button
--> Now, provide any program name
--> Now, select Transfer from recording
--> Click on Tick mark
--> Give some short description
--> Type as Executable
--> Click on Source Code button
--> Automatically the code will appear in SE 38 program.
U can try these steps with any T-code by knowing the Mandatory fields in it.
---> *Now by following all the above steps ur done with the recording process to create a single record in MAterail master (MM01). Now, we use the same recording process and put this recording under Loop in report program.*
So that, it will follow the same steps automatically to create materail master records from the flat file. If you have 10 records in flat file(Note pad) then it will do the same process for 10 times to upload 10 records from the flat file using the recoding process that we have done by using the SHDB
If you want then i will provide you with the sample program to upload the data for MK01 using Call transcation and Session method.
Call transcation method for MK01:
U can try these steps with any T-code by knowing the Mandatory fields in it.
& TITLE : BDC FOR MK01
*& DESCR : UPLOAD THE DATA THROUGH FLAT FILE
*& TRANSPORT : DOLK901203
*& VERSION : V1
*& DATE : 17th , JAN , 2008
report Z24_BDC_MK01
no standard page heading line-size 255.
*& DECLARATIONS OF STRUCTURE FOR MK01
TYPES : BEGIN OF TY_MK01 ,
KTOKK TYPE RF02K-KTOKK ,
NAME1 TYPE LFA1-NAME1 ,
SORTL TYPE LFA1-SORTL ,
PSTLZ TYPE LFA1-PSTLZ ,
LAND1 TYPE LFA1-LAND1 ,
END OF TY_MK01 .
*& DECLARATION OF INTERNAL TABLE
DATA : T_MK01 TYPE STANDARD TABLE OF TY_MK01 INITIAL SIZE 0 ,
T_BDCDATA TYPE STANDARD TABLE OF BDCDATA INITIAL SIZE 0 ,
T_BDCMSGCOLL TYPE STANDARD TABLE OF BDCMSGCOLL INITIAL SIZE 0 ,
T_ERROR TYPE STANDARD TABLE OF TY_MK01 INITIAL SIZE 0 ,
*& DECLARATION OF WORK AREA
W_MK01 TYPE TY_MK01 ,
W_BDCDATA TYPE BDCDATA ,
W_BDCMSGCOLL TYPE BDCMSGCOLL .
*& DECLARATION OF SELECTION SCREEN
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME .
PARAMETERS : P_FILE TYPE FILENAME .
SELECTION-SCREEN END OF BLOCK B1 .
*& DECLARATION OF START-OF-SELECTION
START-OF-SELECTION .
PERFORM SUB_UPLOAD_DATA .
PERFORM SUB_POPULATE_BDC .
PERFORM SUB_ERROR_REC .
*include bdcrecx1.
*& Form SUB_UPLOAD_DATA
text
form SUB_UPLOAD_DATA .
DATA : L_FILE TYPE STRING .
L_FILE = P_FILE .
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = L_FILE
HAS_FIELD_SEPARATOR = 'X'
tables
data_tab = T_MK01 .
endform. " SUB_UPLOAD_DATA
*& Form SUB_POPULATE_BDC
text
form SUB_POPULATE_BDC .
LOOP AT T_MK01 INTO W_MK01 .
DATA : L_MSG TYPE STRING .
REFRESH T_BDCDATA .
perform bdc_dynpro using 'SAPMF02K' '0107'.
perform bdc_field using 'BDC_CURSOR'
'RF02K-KTOKK'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'RF02K-KTOKK'
W_MK01-KTOKK.
perform bdc_dynpro using 'SAPMF02K' '0110'.
perform bdc_field using 'BDC_CURSOR'
'LFA1-LAND1'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'LFA1-NAME1'
W_MK01-NAME1.
perform bdc_field using 'LFA1-SORTL'
W_MK01-SORTL.
perform bdc_field using 'LFA1-PSTLZ'
W_MK01-PSTLZ.
perform bdc_field using 'LFA1-LAND1'
W_MK01-LAND1.
perform bdc_dynpro using 'SAPMF02K' '0120'.
perform bdc_field using 'BDC_CURSOR'
'LFA1-KUNNR'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_dynpro using 'SAPMF02K' '0130'.
perform bdc_field using 'BDC_CURSOR'
'RF02K-LIFNR'.
perform bdc_field using 'BDC_OKCODE'
'=ENTR'.
perform bdc_dynpro using 'SAPLSPO1' '0300'.
perform bdc_field using 'BDC_OKCODE'
'=YES'.
CALL TRANSACTION 'MK01' USING T_BDCDATA MODE 'N' MESSAGES INTO T_BDCMSGCOLL .
IF SY-SUBRC <> 0 .
APPEND W_MK01 TO T_ERROR .
ENDIF .
CLEAR W_BDCMSGCOLL .
READ TABLE T_BDCMSGCOLL INTO W_BDCMSGCOLL INDEX 1 .
CLEAR L_MSG .
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
ID = W_BDCMSGCOLL-MSGID
LANG = SY-LANGU
NO = W_BDCMSGCOLL-MSGNR
V1 = W_BDCMSGCOLL-MSGV1
V2 = W_BDCMSGCOLL-MSGV2
V3 = W_BDCMSGCOLL-MSGV3
V4 = W_BDCMSGCOLL-MSGV4
IMPORTING
MSG = L_MSG
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2
IF sy-subrc = 0.
WRITE : / 'MESSAGE FOR ' , W_MK01-KTOKK ,'-------' , L_MSG .
ENDIF.
ENDLOOP .
endform. " SUB_POPULATE_BDC
Start new screen *
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR W_BDCDATA.
W_BDCDATA-PROGRAM = PROGRAM.
W_BDCDATA-DYNPRO = DYNPRO.
W_BDCDATA-DYNBEGIN = 'X'.
APPEND W_BDCDATA TO T_BDCDATA .
ENDFORM.
Insert field *
FORM BDC_FIELD USING FNAM FVAL.
CLEAR W_BDCDATA.
W_BDCDATA-FNAM = FNAM.
W_BDCDATA-FVAL = FVAL.
APPEND W_BDCDATA TO T_BDCDATA .
ENDFORM.
*& Form SUB_ERROR_REC
text
--> p1 text
<-- p2 text
form SUB_ERROR_REC .
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = 'C:/ERRORS OF MK01.TXT'
WRITE_FIELD_SEPARATOR = 'X'
tables
data_tab = T_ERROR .
endform. " SUB_ERROR_REC
Session Method for MK01:
*& PURPOSE : This BDC report is used to upload all the vendor master
*& data in to SAP using SESSION METHOD with handling the errors
report Y035_SESSION_METHOD
no standard page heading line-size 255.
*& Structure declaration
*Structure Declaration for source internal table
TYPES : BEGIN OF TY_UPLOAD,
LIFNR TYPE RF02K-LIFNR,
EKORG TYPE RF02K-EKORG,
KTOKK TYPE RF02K-KTOKK,
NAME1 TYPE LFA1-NAME1,
SORTL TYPE LFA1-SORTL,
LAND1 TYPE LFA1-LAND1,
SPRAS TYPE LFA1-SPRAS,
WAERS TYPE LFM1-WAERS,
END OF TY_UPLOAD.
*& Internal Table declaration
*Internal Table Declaration for source table
DATA : T_UPLOAD TYPE STANDARD TABLE OF TY_UPLOAD INITIAL SIZE 0,
*Internal Table Declaration for bdcdata
T_BDCDATA TYPE STANDARD TABLE OF BDCDATA INITIAL SIZE 0,
*Internal table declaration for BDCMSGCOLL (To handle the errors)
T_BDCMSG TYPE STANDARD TABLE OF BDCMSGCOLL,
*Internal table declaration for reprocess the errors
T_ERRORS TYPE STANDARD TABLE OF TY_UPLOAD INITIAL SIZE 0,
*& Workarea declaration
*Work area delaration for source table
W_UPLOAD TYPE TY_UPLOAD,
*Work area delaration for bdcdata
W_BDCDATA TYPE BDCDATA,
*Work area delaration for BDCMSGCOLL
W_BDCMSG TYPE BDCMSGCOLL.
*& Selection screen declaration
*Selection Screen declaration
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERS : P_FLNAME TYPE FILENAME.
SELECTION-SCREEN END OF BLOCK B1.
*& Start of selection declaration
*Start of selection declaration
START-OF-SELECTION.
*Upload the data
PERFORM SUB_UPLOAD_DATA.
*Populate the BDC data
PERFORM SUB_POPULATE_BDC.
*Process the error records
PERFORM SUB_ERROR_RECORD.
*include bdcrecx1.
*& Form SUB_UPLOAD_DATA
This subroutine is used to upload the data
FORM SUB_UPLOAD_DATA .
DATA : L_FLNAME TYPE STRING.
L_FLNAME = P_FLNAME.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = L_FLNAME
FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = 'X'
TABLES
DATA_TAB = T_UPLOAD.
ENDFORM. " SUB_UPLOAD_DATA
*& Form SUB_POPULATE_BDC
This subroutine is used to populate the BDC data
FORM SUB_POPULATE_BDC .
DATA : L_MSG TYPE STRING.
*To oper a sesion in SE35
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = 'MAMA_SESSION'
USER = SY-UNAME
KEEP = 'X'
HOLDDATE = '20080129'
PROG = SY-CPROG.
LOOP AT T_UPLOAD INTO W_UPLOAD.
REFRESH T_BDCDATA.
perform bdc_dynpro using 'SAPMF02K' '0107'.
perform bdc_field using 'BDC_CURSOR' 'RF02K-KTOKK'.
perform bdc_field using 'BDC_OKCODE' '/00'.
perform bdc_field using 'RF02K-LIFNR' W_UPLOAD-LIFNR.
perform bdc_field using 'RF02K-EKORG' W_UPLOAD-EKORG.
perform bdc_field using 'RF02K-KTOKK' W_UPLOAD-KTOKK.
perform bdc_dynpro using 'SAPMF02K' '0110'.
perform bdc_field using 'BDC_CURSOR' 'LFA1-SPRAS'.
perform bdc_field using 'BDC_OKCODE' '/00'.
perform bdc_field using 'LFA1-NAME1' W_UPLOAD-NAME1.
perform bdc_field using 'LFA1-SORTL' W_UPLOAD-SORTL.
perform bdc_field using 'LFA1-LAND1' W_UPLOAD-LAND1.
perform bdc_field using 'LFA1-SPRAS' W_UPLOAD-SPRAS.
perform bdc_dynpro using 'SAPMF02K' '0120'.
perform bdc_field using 'BDC_CURSOR' 'LFA1-KUNNR'.
perform bdc_field using 'BDC_OKCODE' '/00'.
perform bdc_dynpro using 'SAPMF02K' '0310'.
perform bdc_field using 'BDC_CURSOR' 'LFM1-WAERS'.
perform bdc_field using 'BDC_OKCODE' '/00'.
perform bdc_field using 'LFM1-WAERS' W_UPLOAD-WAERS.
perform bdc_dynpro using 'SAPMF02K' '0320'.
perform bdc_field using 'BDC_CURSOR' 'RF02K-LIFNR'.
perform bdc_field using 'BDC_OKCODE' '=ENTR'.
perform bdc_dynpro using 'SAPLSPO1' '0300'.
perform bdc_field using 'BDC_OKCODE' '=YES'.
*Transfer data to the session
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'MK01'
TABLES
dynprotab = T_BDCDATA.
ENDLOOP.
*To close the session
CALL FUNCTION 'BDC_CLOSE_GROUP'.
ENDFORM. " SUB_POPULATE_BDC
Start new screen *
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR W_BDCDATA.
W_BDCDATA-PROGRAM = PROGRAM.
W_BDCDATA-DYNPRO = DYNPRO.
W_BDCDATA-DYNBEGIN = 'X'.
APPEND W_BDCDATA TO T_BDCDATA.
ENDFORM.
Insert field *
FORM BDC_FIELD USING FNAM FVAL.
CLEAR W_BDCDATA.
W_BDCDATA-FNAM = FNAM.
W_BDCDATA-FVAL = FVAL.
APPEND W_BDCDATA TO T_BDCDATA.
ENDFORM.
*& Form SUB_ERROR_RECORD
This subroutine is used to process the error records
in to a file T_ERRORS
FORM SUB_ERROR_RECORD .
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
FILENAME = 'C:\MAMA_ERRORS.TXT'
WRITE_FIELD_SEPARATOR = 'X'
TABLES
DATA_TAB = T_ERRORS.
ENDFORM. " SUB_ERROR_RECORD
Hope the Explonation and information I had provided will resolve your issue.
Reward points if information is very Helpful.
Have a great day!
Regards,
Krishna Chaitanya
Edited by: Krishna Chaitanya on Apr 7, 2008 4:59 AM
Maybe you are looking for
-
Issues Starting iTunes...
My iTunes and Quicktime utilities will not open - they crash almost immediately upon clicking the icons. I have uninstalled and then re-installed both the current and previous versions of iTunes, and nothing has fixed the issue. This is the error for
-
What's the best Java Editor?
Right now I'm using JCreator. I've tried JBuilder, but it keeps crashing on my machine and it runs damn slow... Is there a better editor out there that shows your errors clearer and stuff?
-
Anybody use Drop Drawers application as well as Logic on their computer? If so, has it ever caused problems? Thanks Ed Dual 2.3 Ghz PPC G5 Mac OS X (10.4.9)
-
ITunes/iPod/USB problem after installing AVG 8.0 Antivirus
Hi, I have recently installed AVG 8.0 as a replacement to my pevious Antivirus software. I now seem to have some kind of a problem with 'disappearing' USB attached storage. The first problem I had, was that my Walkman was no longer recognised. I reso
-
OWSM, Digest Passwords and Authentication Using Gateway or Agent
I want to send username, and passwords in digest mode to a web service's agent or gateway and authenticate the user. In basic mode(plain text) I use extract credentials, WS-BASIC and use LDAP Authenticate as a further step. What should I do in Digest