BDC Summary
Batch Input是一种数据批量输入SAP系统的辅助程序, SAP系统的资料、格式可以通过Batch Input录入SAP系统
Batch Input的机制是模拟事务处理将数据录入R/3系统
Batch Input类似SAP的CATT,控制性更好,处理能力更强.
首先简单解释一下BDC(Batch Data Conversion):
在SAP系统里,由于某种原因,可能需要重复输入数据,(数据不同,但是操作是相同的,典型的情形就是切换系统的时候,旧系统的数据需要导入SAP),大致过程不外乎是这样: 输入一个t-code,
进入一个某个屏幕,然后输入一个值(有时还要加上一些附加的checkbox选项等),点执行或者确定按钮,
进入另一个屏幕,在某些字段输入值(也可能是标注checkbox选中或者不选中)或者修改这些字段里的值。
然后按“Eneter”……
最后按“SAVE”……,
一条记录完成了,继续下一条,如此循环。
SAP通过一个特殊的程序(T-code:SHDB)把用户的一次业务操作的所有过程记录下来。
从用户输入transaction code(事务代码),点下“Start Recording”开始,对于用户的来说是一次普通的业务操作,但是SAP却在记录:
1.光标放到哪个字段,(在程序中不用改变)
2.填入了什么值,(变量,循环中的Internal Table 某个字段)
3.点击了什么按钮(在程序中不用改变)
本次操作的作为一个“代表”,是一个“模板”,告诉SAP系统以怎样的方式来执行程序,也就是用计算机的语言来描述如果手工操作的话应该是怎样的一个过程。
用BDC技术编程时,有以下几个步骤:
1.把外部的数据源(Txt,Excel等)用读进internal table或者用do enddo循环。
2.在循环里,把用SHDB记录的步骤重复执行N次,(N = Dialog屏幕数量)这时实际上并没行完成数据的入,系统只是在“填表”,填一个叫做“BDCData”的Internal Table。
填完bdcdata以后,用call transaction ‘XXXX’ using bdc……这个命令来真正的commit动作或者call function 'BDC_Insert'在建立一个session。并把执行的结果返回给messtab这个Internal Table
注意:有两个重要的子程序和TABLE必须要声明
1.有两个固定的internal table 需要声明:bdcdata和messtab,名称可以变,但是声明时一定要
* Batchinputdata of single transaction
data: bdcdata like bdcdata occurs 0 with header line.
* messages of call transaction
data: messtab like bdcmsgcoll occurs 0 with header line.
Like 后面的table type(这里是一个structure)是不能改变的。
BDCDATA的结构:
Field Name |
Type |
Length |
Description |
PROGRAM |
CHAR |
8 |
Module poll |
DYNPRO |
NUMC |
4 |
DYNAPRO number |
DYNBEGIN |
CHAR |
1 |
Starting a DYNPRO |
FNAM |
CHAR |
35 |
Field name |
FVAL |
CHAR |
80 |
Field value |
2.有两个固定功能的form:bdc_dynapro和 bdc_field
名称同样是任意的,但是程序代码应该是相同的。
*-------------------------------------------------------------------*
* 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.
最后调用事务
CALL TRANSACTION
USING TABLE>
MODE MODE>
UPDATE
MESSAGES INTO .
MODE DISPLAY MODE
The processing mode can take the following values:
'A' Display screen
'E' Display only if an error occurs
'N' Do not display
'P' Do not display; debugging possible
If the MODE addition is omitted, then the processing mode is 'A'.
If a screen is displayed in processing mode 'E' because the system reached the end of the BDC data, the system automatically switches to processing mode 'A'.
If breakpoints are set in a transaction tcod called using the CALL TRANSACTION tcod USING itab variant, these are not actually reached in 'N' mode. The system tries to insert data in the Debugger screen; the call ends with SY-SUBRC = 1001 and the message "Batch input data is not available for screen SAPMSSY3 0131" (S 00 344).
Conversely, in 'P' mode, transaction screens are processed in the background (as in 'N' mode) and debugging is possible.
UPDATE
The update mode f specifies the type of update. It can take the following values:
'A' (asynchronous update continue processing when update is completed)
'S' (ssynchronous update continue processing immediately )
'L' (local update)
If the UPDATE addition is omitted, the update mode is 'A'.
For example:
***********************************************************************
**Program name: Z_MI01
**Description : Create Physical Inventory Document
**Date/Autohr : 2008-08-27/DAVIDZHANG
************************************************************************
** M O D I F I C A T I O N L O G
************************************************************************
** ChangeDate Programmer Request Description
** ========== ========== ========== =========================
************************************************************************
REPORT Z_MI01
NO STANDARD PAGE HEADING
LINE-SIZE 120
LINE-COUNT 90.
*** Global Data declear
INCLUDE Z_MI01TOP.
INCLUDE Z_MI01F01.
*======================================================================*
* Selection Screen Events
*======================================================================*
*** maintain selection screen output
AT SELECTION-SCREEN OUTPUT.
*** F4 value help
AT SELECTION-SCREEN ON VALUE-REQUEST for P_UPFILE.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
FILE_NAME = P_UPFILE.
*** check input data
AT SELECTION-SCREEN.
*AT SELECTION-SCREEN ON .
*AT SELECTION-SCREEN ON BLOCK <>.
****CHECK ON SELECT SCREEN INPUT
*======================================================================*
* Report Events
*======================================================================*
*** initial data
INITIALIZATION.
*** prepare report data
START-OF-SELECTION.
PERFORM getdata.
PERFORM bdcdata.
PERFORM alvdisplay.
*** output report
END-OF-SELECTION.
*======================================================================*
* List Events
*======================================================================*
*** page header
TOP-OF-PAGE.
*** page header after first list
TOP-OF-PAGE DURING LINE-SELECTION.
*** page footer
END-OF-PAGE.
*** when double click
AT LINE-SELECTION.
*** when click some icon (function code)
*at user-command.
*&---------------------------------------------------------------------*
*& Include Z_MI01TOP
*&---------------------------------------------------------------------*
TYPE-POOLS: truxs.
TABLES:MARD,IKPF,ISEG.
DATA: it_raw TYPE truxs_t_text_data.
PARAMETERS:P_UPFILE TYPE RLGRAP-FILENAME OBLIGATORY,
p_mode TYPE c DEFAULT 'N' OBLIGATORY,
P_BLDAT TYPE IKPF-BLDAT DEFAULT SY-DATUM,
P_GIDAT TYPE IKPF-GIDAT DEFAULT SY-DATUM,
P_WERKS TYPE IKPF-WERKS DEFAULT '6000',
P_SOBKZ TYPE IKPF-SOBKZ.
DATA:i_bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA:BEGIN OF IT_UPFILE OCCURS 0,
LGORT(4) TYPE C,
MATNR(18) TYPE C,
FLAG TYPE C,
MSGTYP TYPE C,
MESSAGE(100) TYPE C,
END OF IT_UPFILE.
*DATA:IT_IKPF LIKE IT_UPFILE OCCURS 0 WITH HEADER LINE.
DATA:BEGIN OF IT_IKPF OCCURS 0,
LGORT TYPE MARD-LGORT,
MATNR TYPE MARD-MATNR,
MSGTYP TYPE C,
MESSAGE(100) TYPE C,
END OF IT_IKPF.
DATA:BEGIN OF IT_IKPF1 OCCURS 0,
LGORT TYPE MARD-LGORT,
FLAG TYPE C,
MATNR TYPE MARD-MATNR,
MSGTYP TYPE C,
MESSAGE(100) TYPE C,
END OF IT_IKPF1.
TYPE-POOLS: slis.
DATA: it_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
lt_sort TYPE slis_t_sortinfo_alv WITH HEADER LINE,
it_events TYPE slis_t_event,
lt_event_exit TYPE slis_t_event_exit,
ls_event_exit TYPE slis_event_exit,
pt_top_of_page TYPE slis_t_listheader,
gs_print TYPE slis_print_alv,
gs_layout TYPE slis_layout_alv .
DATA:INDEX_NUM TYPE I.
*&---------------------------------------------------------------------*
*& Include Z_MI01F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
FORM getdata .
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
i_line_header = 'X'
i_tab_raw_data = it_raw
i_filename = p_upfile
TABLES
i_tab_converted_data = it_upfile[]
EXCEPTIONS
conversion_failed = 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.
DATA:MATNR TYPE MARD-MATNR,
LGORT TYPE MARD-LGORT.
SORT it_upfile ASCENDING by LGORT MATNR.
DELETE ADJACENT DUPLICATES FROM it_upfile.
LOOP AT IT_UPFILE.
INDEX_NUM = SY-TABIX.
SELECT SINGLE LGORT
INTO LGORT
FROM T001L
WHERE WERKS = P_WERKS
AND LGORT = IT_UPFILE-LGORT.
IF SY-SUBRC <> 0.
it_upfile-FLAG = 'X'.
it_upfile-MSGTYP = 'W'.
it_upfile-MESSAGE = 'The location is not exist in this plant!'.
MODIFY it_upfile INDEX INDEX_NUM.
ELSE.
SELECT SINGLE MATNR
INTO MATNR
FROM MARA
WHERE MATNR = it_upfile-MATNR.
IF SY-SUBRC <> 0.
it_upfile-FLAG = 'X'.
it_upfile-MSGTYP = 'W'.
it_upfile-MESSAGE = 'The Material is not exist!'.
MODIFY it_upfile INDEX INDEX_NUM.
ELSE.
SELECT SINGLE MATNR
INTO MATNR
FROM MARD
WHERE WERKS = P_WERKS
AND LGORT = it_upfile-LGORT
AND MATNR = it_upfile-MATNR.
IF SY-SUBRC <> 0.
it_upfile-FLAG = 'X'.
it_upfile-MSGTYP = 'W'.
it_upfile-MESSAGE = 'The Material is not exist in this location!'.
MODIFY it_upfile INDEX INDEX_NUM.
ELSE.
SELECT SINGLE MATNR
INTO MATNR
FROM ISEG
WHERE MATNR = it_upfile-MATNR
AND WERKS = P_WERKS
AND LGORT = it_upfile-LGORT.
IF SY-SUBRC = 0.
it_upfile-FLAG = 'X'.
it_upfile-MSGTYP = 'W'.
CONCATENATE 'Physical inventory for' P_WERKS ',' it_upfile-LGORT
',' it_upfile-MATNR ',is already active' INTO it_upfile-MESSAGE.
MODIFY it_upfile INDEX INDEX_NUM.
ELSE.
MOVE-CORRESPONDING it_upfile TO IT_IKPF.
APPEND IT_IKPF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
SORT it_upfile ASCENDING BY LGORT MATNR.
SORT IT_IKPF ASCENDING BY LGORT MATNR.
ENDFORM. " getdata
*&---------------------------------------------------------------------*
*& Form bdcdata
*&---------------------------------------------------------------------*
FORM bdcdata .
LOOP AT IT_IKPF." WHERE FLAG = '' .
AT END OF LGORT."FLAG.
INDEX_NUM = SY-TABIX.
READ TABLE IT_IKPF INDEX SY-TABIX.
perform bdc_dynpro using 'SAPMM07I' '0700'.
perform bdc_field using 'BDC_OKCODE' '/00'.
perform bdc_field using 'RM07I-BLDAT' P_BLDAT.
perform bdc_field using 'RM07I-GIDAT' P_GIDAT.
perform bdc_field using 'IKPF-WERKS' P_WERKS.
perform bdc_field using 'IKPF-LGORT' IT_IKPF-LGORT.
perform bdc_field using 'IKPF-SOBKZ' P_SOBKZ.
perform bdc_field using 'RM07I-XLVOCA' 'X'.
LOOP AT IT_UPFILE WHERE LGORT = IT_IKPF-LGORT and FLAG = ''.
perform bdc_dynpro using 'SAPMM07I' '0721'.
perform bdc_field using 'BDC_OKCODE' '/00'.
perform bdc_field using 'ISEG-MATNR(01)' IT_UPFILE-MATNR.
ENDLOOP.
perform bdc_dynpro using 'SAPMM07I' '0721'.
perform bdc_field using 'BDC_OKCODE' '=BU'.
CALL TRANSACTION 'MI01' USING I_BDCDATA
MODE P_MODE
UPDATE 'S'
MESSAGES INTO MESSTAB.
LOOP AT MESSTAB.
IT_UPFILE-MSGTYP = MESSTAB-msgtyp.
MESSAGE ID messtab-msgid TYPE messtab-msgtyp NUMBER messtab-msgnr
WITH messtab-msgv1 messtab-msgv2 messtab-msgv3 messtab-msgv4
INTO IT_UPFILE-message.
MODIFY IT_UPFILE TRANSPORTING MSGTYP MESSAGE
WHERE MSGTYP = '' AND MESSAGE = '' AND LGORT = IT_IKPF-LGORT.
ENDLOOP.
CLEAR: I_BDCDATA,I_BDCDATA[],MESSTAB,MESSTAB[].
ENDAT.
ENDLOOP.
ENDFORM. " bdcdata
*&---------------------------------------------------------------------*
*& Form bdc_dynpro
*&---------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR i_bdcdata.
i_bdcdata-program = program.
i_bdcdata-dynpro = dynpro.
i_bdcdata-dynbegin = 'X'.
APPEND i_bdcdata.
ENDFORM. " bdc_dynpro
*&---------------------------------------------------------------------*
*& Form bdc_field
*&---------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
CLEAR i_bdcdata.
i_bdcdata-fnam = fnam.
i_bdcdata-fval = fval.
APPEND i_bdcdata.
ENDFORM. " bdc_field
*&---------------------------------------------------------------------*
*& Form alvdisplay
*&---------------------------------------------------------------------*
FORM alvdisplay .
LOOP AT it_upfile.
MOVE-CORRESPONDING it_upfile TO IT_IKPF1.
APPEND IT_IKPF1.
ENDLOOP.
SORT IT_IKPF1 ASCENDING BY LGORT FLAG.
PERFORM prepare_alv_field.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-cprog
it_fieldcat = it_fieldcat[]
i_save = 'A'
* is_layout = gs_layout
is_print = gs_print
TABLES
t_outtab = IT_IKPF1
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " alvdisplay
*&---------------------------------------------------------------------*
*& Form prepare_alv_field
*&---------------------------------------------------------------------*
FORM prepare_alv_field .
DEFINE m_fieldcat.
it_fieldcat-fieldname = &1.
it_fieldcat-reptext_ddic = &2.
it_fieldcat-emphasize = &3.
it_fieldcat-edit = &4.
it_fieldcat-outputlen = &5.
append it_fieldcat.
END-OF-DEFINITION.
m_fieldcat 'LGORT' 'Storage location' '' '' '18'.
m_fieldcat 'MATNR' 'Material' '' '' '18'.
m_fieldcat 'MSGTYP' 'Message type' '' '' '18'.
m_fieldcat 'MESSAGE' 'Message' '' '' '60'.
ENDFORM. " prepare_alv_field
更多详情请点击
阅读(1366) | 评论(0) | 转发(0) |