先用shdb录一个 bdc程序(数据来源选from recording),然后做相应修改。其中的PERFORM bdc_field USING 'BDC_CURSOR' 'XXXXXXXX'语句是记录鼠标动作的,一般可以去掉。
对于带不定数目行项目的BDC程序,可以用下面方法实现。Header Key放在第一列,然后根据Header Key和行项目Key做sort,然后利用AT NEW语句……
例子:
????SRCE
REPORT zdcbom NO STANDARD PAGE HEADING LINE-SIZE 255.
DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE,
ai TYPE i VALUE 1.
DATA: fname(128) TYPE c, ftype(3), fsize TYPE i,cancel(1).
DATA: n TYPE i.
PARAMETERS:
pc_file1(128) TYPE c
DEFAULT 'C:/sapworkdir/data convertion/Cs01.txt',
* pc_file2(128) DEFAULT 'C:/sapworkdir/prog.txt' OBLIGATORY,
tra_code(5) TYPE c DEFAULT 'CS01',
err_type(1) DEFAULT 'A'.
* bdcgroup(12) OBLIGATORY.
*** Generated data section with specific formatting - DO NOT CHANGE ***
DATA: BEGIN OF record OCCURS 0,
* data element: MATNR
matnr_001(018), "
* data element: WERKS_D
werks_002(004), "
* data element: STLAN
stlan_003(001), "
* data element: DATUV
datuv_004(010),
* data element: BASMN
* bmeng_005(017),
* data element: STLST
* stlst_006(002),
* data element: SPOSN
posnr_010(004),
* data element: IDNRK
idnrk_02_007(018),
* data element: KMPMG
menge_02_008(018),
* data element: MEINS "Unit
MEINS(003),
* data element: POSTP
postp_02_009(001),
* data element: AUSCH "Component Scrap Qty
ausch(018),
END OF record.
*** End generated data section ***
END-OF-SELECTION.
CALL FUNCTION 'UPLOAD'
EXPORTING
filename = pc_file1
filetype = 'DAT'
item = 'load'
IMPORTING
filesize = fsize
act_filename = fname
act_filetype = ftype
cancel = cancel
TABLES
data_tab = record
EXCEPTIONS
conversion_error = 1
invalid_table_width = 2
invalid_type = 3
no_batch = 4
unknown_error = 5
gui_refuse_filetransfer = 6
OTHERS = 7.
*** End generated data section ***
* BREAK-POINT.
IF NOT cancel IS INITIAL.
WRITE: 'You cancel the program!'.
EXIT.
ENDIF.
DATA lin TYPE i.
DESCRIBE TABLE record LINES lin.
* perform open_group.
* LOOP AT record WHERE NOT werks_004 IS INITIAL .
LOOP AT record.
AT NEW datuv_004.
* BREAK-POINT.
PERFORM bdc_dynpro USING 'SAPLCSDI' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RC29N-DATUV'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENT1'.
PERFORM bdc_field USING 'RC29N-MATNR'
record-matnr_001.
PERFORM bdc_field USING 'RC29N-WERKS'
record-werks_002.
PERFORM bdc_field USING 'RC29N-STLAN'
record-stlan_003.
PERFORM bdc_field USING 'RC29N-DATUV'
record-datuv_004.
PERFORM bdc_dynpro USING 'SAPLCSDI' '0110'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=KDGS'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLCSDI'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RC29K-EXSTL'.
PERFORM bdc_dynpro USING 'SAPLCSDI' '0111'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RC29K-LABOR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=UEBP'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLCSDI'.
ENDAT.
* BREAK-POINT.
PERFORM bdc_dynpro USING 'SAPLCSDI' '0140'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RC29P-POSNR(02)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=FCNP'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLCSDI'.
*''''''''''''''''''
PERFORM bdc_dynpro USING 'SAPLCSDI' '0140'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RC29P-POSTP(02)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENT1'.
PERFORM bdc_field USING 'RC29P-POSNR(02)'
record-posnr_010.
PERFORM bdc_field USING 'RC29P-IDNRK(02)'
record-idnrk_02_007.
PERFORM bdc_field USING 'RC29P-MENGE(02)'
record-menge_02_008.
PERFORM bdc_field USING 'RC29P-MEINS(02)'
record-MEINS.
PERFORM bdc_field USING 'RC29P-POSTP(02)'
record-postp_02_009.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLCSDI'.
*''''''''''''''
PERFORM bdc_dynpro USING 'SAPLCSDI' '0130'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=WEIT'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLCSDI'.
PERFORM bdc_field USING 'RC29P-ausch'
record-ausch.
************'''''''''''''''''
PERFORM bdc_dynpro USING 'SAPLCSDI' '0131'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=WEIT'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RC29P-POTX1'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLCSDI'.
AT END OF datuv_004.
* BREAK-POINT.
PERFORM bdc_dynpro USING 'SAPLCSDI' '0140'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RC29P-POSTP(02)'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLCSDI'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=FCBU'.
PERFORM bdc_transaction.
WRITE: / ai,' '. " record-matnr_001.
ai = ai + 1.
CONTINUE.
ENDAT.
ENDLOOP.
* PERFORM close_group.
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
* if fval <> nodata.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
* endif.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form open_group
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
*FORM open_group.
* CALL FUNCTION 'BDC_OPEN_GROUP'
* EXPORTING
* client = sy-mandt
* group = bdcgroup
* user = sy-uname
* keep = 'X'
* EXCEPTIONS
* running = 1
* queue-error = 2
* client_invalid = 3
* group_invalid = 4.
* IF sy-subrc NE 0.
* WRITE: / 'Error calling function BDC_OPEN_GROUP ', sy-uzeit.
* EXIT.
* ENDIF.
*ENDFORM. " open_group
*&---------------------------------------------------------------------*
*& Form close_group
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM close_group.
CALL FUNCTION 'BDC_CLOSE_GROUP'.
IF sy-subrc NE 0.
WRITE: / 'Error calling function BDC_CLOSE_GROUP ', sy-uzeit.
EXIT.
ENDIF.
ENDFORM. " close_group
*&---------------------------------------------------------------------*
*& Form bdc_transaction
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM bdc_transaction.
CALL TRANSACTION tra_code USING bdcdata
MODE err_type.
REFRESH bdcdata.
ENDFORM. " bdc_transaction