Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29034
  • 博文数量: 10
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-02 19:21
文章分类

全部博文(10)

文章存档

2008年(10)

我的朋友

分类:

2008-09-03 16:51:14

BDC   Summary

Batch Input是一种数据批量输入SAP系统的辅助程序, SAP系统的资料、格式可以通过Batch Input录入SAP系统

Batch Input的机制是模拟事务处理将数据录入R/3系统

Batch Input类似SAPCATT,控制性更好,处理能力更强.

首先简单解释一下BDCBatch 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 需要声明:bdcdatamesstab,名称可以变,但是声明时一定要
*       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.有两个固定功能的formbdc_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(4TYPE C,
     MATNR(18TYPE C,
     FLAG TYPE C,
     MSGTYP TYPE C,
     MESSAGE(100TYPE 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(100TYPE 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(100TYPE 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) |
0

上一篇:FI操作

下一篇:LSMW upload data

给主人留下些什么吧!~~