KK~SAP

KK's Blog

  博客中心 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  39 随笔 :: 1 文章 :: 4 评论 :: 1 Trackbacks
Cached @ 2025/6/12 12:26:40Control ASP.skins_cogitation_controls_blogstats_ascx
<2025年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

留言簿(0)

随笔档案

文章档案

搜索

最新评论

  • 1. SAP资料下载
  • SAP下载网,
    SAP资料共享网站,完全免费
    资料全由网友共享,大家共享,大家下载
  • --SAP99
  • 2. re: 信用管理理论及其在SAP中的应用
  • Yeah. My MSN is nyf425@hotmail.com.
  • --nyf425
  • 3. about bapi
  • 1BAPI鐨勪紭鐐? bapi鏄潰鍚戝璞$殑璁捐; bapi鏄浐瀹氱殑,涓鑸笉鑳戒慨鏀? bapi鍙互琚玸ap鍐呴儴閮ㄤ欢鍜岄潪sap绋嬪簭浣跨敤; bapi鐨勬垚鍔熷拰閿欒淇℃伅濮嬬粓閫氳繃RETURN杩斿洖; ...
  • --Neosun.Digger.SAP
  • 4. re: 信用管理理论及其在SAP中的应用
  • That's great. It's really hard to accept the Credit Management concept and map with the SAP System in the detail. You gave me a big help. Do you have any IM account, such as MSN?
  • --Dave
  • 5. re: SAP名词解释
  • Clearly help to understand my confuse.
    Great
  • --柚子Nan

阅读排行榜

评论排行榜

Cached @ 2025/6/12 12:26:40Control ASP.skins_cogitation_controls_singlecolumn_ascx

2008年3月24日 #

DRP
DRP是配送需求计划(distribution requirement planning)的简称。它是流通领域中的一种物流技术,是MRP在流通领域应用的直接结果。它主要解决分销物资的供应计划和高度问题,达到保证有效地满足市场需要又使得配置费用最省的目的。 2.DRP的原理 DRP在两类企业中可以得到应用。一类是流通企业,如储运公司、配送中心、物流中心、流通中心等。这些企业的基本特征是,不一定搞销售,但一定有储存和运输的业务,它们的目标是在满足用户需要的原则下,追求有效利用资源(如车辆等),达到总费用既搞生产又搞流通,产品全部或一部分自己销售。企业中有流通部门承担分销业务,具体组织储、运、销活动。这两类企业的共同之处: (1)以满足社会需求为自己的宗旨; (2)依靠一定的物流能力(储、运、包装、搬运能力等)来满足社会的需求; (3)从制造企业或物资资源市场组织物资资源; DRP的原理如下图所示,输入三个文件,输出两个计划。 其中输入文件是: •社会需求文件,包括所有用户的订货单、提货单和供货合同,以及下属子公司、企业的订货单,此外还要进行市场预测,确定一部分需求量。所有需求按品种和需求时间进行统计,整理成社会需求文件; •库存文件,对自有库存物资进行统计表。以便针对社会需求量确定必要的进货量; •生产厂资源文件,包括可供应的物资品种和生产厂的地理位置等,地理位置和订货提前期有关。 其中输出计划是: •送货计划,对用户的送货计划,为了保证按时送达,要考虑作业时间和路程远近,提前一定时间开始作业,对于大批量需求可实行直送,而对于数量众多的小批量需求可以进行配送; •订货进货计划,是指从生产厂订货的计划,对于需求物资,如果仓库内无货或者库存不足,则需要向生产厂订货。当然,也要考虑一定的订货提前期。 以上两个文件是DRP的输出结果,是组织物流的指导文件。
posted @ 2008-03-24 09:53 nyf425 阅读(842) | 评论 (0)编辑 收藏

2008年2月1日 #

4、 见下图,上面的四行就是需要输入的参数,其中:

文本名 011000218’,为凭证号,对应name参数

语  言ZH,但是此处参数类型为C(1),不能直接使用SY-LANGU变量,根据系统配置不同,在我的系统中使用1,对应language参数,

标  识Z001,该标识由SAP系统配置而来,对应ID参数

文本对象VBBK,对应object参数

相对于Read_Text函数,有一个Save_Text正好是用来往系统中写文本字段,具体用户和Read_Text基本相似.

DATA: il_tline LIKE tline OCCURS 0 WITH HEADER LINE.

        vl_tdname LIKE thead-tdname.

CALL FUNCTION 'READ_TEXT'

        EXPORTING

          client                        = sy-mandt

          id                           = 'Z001'

          language                    = '1'

          name                        = vl_tdname

          object                        = 'VBBK'

*       ARCHIVE_HANDLE                = 0

*       LOCAL_CAT                     = ' '

*     IMPORTING

*       HEADER                        =

        TABLES

          lines                         = il_tline

       EXCEPTIONS

         id                            = 1

         language                      = 2

         name                          = 3

         not_found                     = 4

         object                        = 5

         reference_check               = 6

         wrong_access_to_archive       = 7

         OTHERS                        = 8

                .

      IF sy-subrc <> 0.

*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

      ENDIF.

posted @ 2008-02-01 12:05 nyf425 阅读(1459) | 评论 (0)编辑 收藏

2008年1月18日 #

1.使用二分法查询,提高查询内表数据速度
不推荐
Read table int_fligh with key airln = ‘LF’.
推荐
Read table int_fligh with key airln = ‘LF’ binary search.

2.两个内表添加使用批量增加代替逐行
不推荐
Loop at int_fligh1.
Append int_fligh1 to int_fligh2.
Endloop.
推荐
Append lines of int_fligh1 to int_fligh2.

3.使用FOR ALL Entries
不推荐
Loop at int_cntry. Select single * from zfligh into int_fligh where cntry = int_cntry-cntry. Append int_fligh. Endloop.
推荐
Select * from zfligh appending table int_fligh
For all entries in int_cntry
Where cntry = int_cntry-cntry.

posted @ 2008-01-18 13:06 nyf425 阅读(863) | 评论 (0)编辑 收藏

2008年1月10日 #

         在SAP系统中,有时候会有大段文本内容需要保存,例如:销售发货VL03N,在单据的概览中 ,有一个[文本]项,在此处可以填写单据的大段文本描述,那么该内容保存在哪里呢?

第一反应是找对应表的字段,那么你可能要失望了。在SAP系统中,可以供我们使用的数据库字段最大长度是255个文本字符(注:此处可能不正确),对于很长的文本肯定是不能直接保存到某个表的字段中的(注:至于具体保存在何处,还需要请教)。因此我们要使用系统函数Read_Text来进行读取,以下是该函数的调用方法:

DATA: il_tline LIKE tline OCCURS 0 WITH HEADER LINE.

        vl_tdname LIKE thead-tdname.

CALL FUNCTION 'READ_TEXT'

        EXPORTING

          client                        = sy-mandt

          id                           = 'Z001'

          language                     = '1'

          name                        = vl_tdname

          object                        = 'VBBK'

 

*       ARCHIVE_HANDLE                = 0

*       LOCAL_CAT                     = ' '

*     IMPORTING

*       HEADER                        =

        TABLES

          lines                         = il_tline

       EXCEPTIONS

         id                            = 1

         language                      = 2

         name                          = 3

         not_found                     = 4

         object                        = 5

         reference_check               = 6

         wrong_access_to_archive       = 7

         OTHERS                        = 8

                .

      IF sy-subrc <> 0.

*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

      ENDIF.

posted @ 2008-01-10 17:29 nyf425 阅读(1378) | 评论 (0)编辑 收藏

2008年1月7日 #

文件存在,路经,文件名,指定打开的文件,指定写入的文件。

对于文件的CHECK

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST

EXPORTING

FILE = LW_FILE

RECEIVING

RESULT = LW_RESULT

EXCEPTIONS

CNTL_ERROR = 1

ERROR_NO_GUI = 2

WRONG_PARAMETER = 3

NOT_SUPPORTED_BY_GUI = 4

OTHERS = 5.

方法调用是否成功判定:(例如:输入不合法)

IF SY-SUBRC <> 0.

SET CURSOR FIELD 'P_UPFILE'. "カーソルをセット

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

文件存在判定:

*----- チェック結果判定

IF LW_RESULT <> CNS_TRUE. "ファイル存在しない

SET CURSOR FIELD 'P_UPFILE'. "カーソルをセット

*----- MSG: アップロードファイル &1 は存在しません

MESSAGE E116(ZNKCC1) WITH P_UPFILE.

ENDIF.

分割文件路径和文件名:

CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'

EXPORTING

FULL_NAME = P_ERFILE

IMPORTING

STRIPPED_NAME = W_FILE “文件名

FILE_PATH = P_O_PATH “路径

EXCEPTIONS

X_ERROR = 1

OTHERS = 2.

对上面分割得到的路径进行检查:

CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_EXIST

EXPORTING

DIRECTORY = LW_PATH

RECEIVING

RESULT = LW_RESULT

EXCEPTIONS

CNTL_ERROR = 1

ERROR_NO_GUI = 2

WRONG_PARAMETER = 3

NOT_SUPPORTED_BY_GUI = 4

OTHERS = 5.

方法调用是否成功判定:(例如:输入不合法)

IF SY-SUBRC <> 0.

SET CURSOR FIELD 'P_ERFILE'. "カーソルをセット

MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

该路径目录存在判定:

*----- 結果情報判定

IF LW_RESULT <> CNS_TRUE. "パス存在しない時

SET CURSOR FIELD 'P_ERFILE'. "カーソルをセット

*----- MSG: エラーファイルのディレクトリ &1 は存在しません

MESSAGE E152(ZNKCC1) WITH P_I_PATH.

ENDIF.

************************************************************************************

文件的F4help

(在AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_UPFILE事件下)

指定要打开或者取得数据的文件地址:

*----- アップロードファイルの検索ヘルプ

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG

EXPORTING

WINDOW_TITLE = LW_TITLE "ファイル選択

CHANGING

FILE_TABLE = LTD_FILE

RC = LW_RETURN "リターン値

USER_ACTION = LW_ACTION "動作結果

EXCEPTIONS

FILE_OPEN_DIALOG_FAILED = 1

CNTL_ERROR = 2

ERROR_NO_GUI = 3

NOT_SUPPORTED_BY_GUI = 4

OTHERS = 5.

*----- リターンコード判定

IF SY-SUBRC <> 0. "メソッド失敗時

SET CURSOR FIELD 'P_UPFILE'. "カーソルをセット

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

RETURN.

ENDIF.

*----- 結果情報判定

IF LW_RETURN < 0.

RETURN. "選択画面へ戻る

ENDIF.

*----- 結果情報判定

IF LW_ACTION = 0.

*----- [選択ファイルテーブル]の1件目を[アップロードファイル名]設定

READ TABLE LTD_FILE INTO LTH_FILE INDEX 1.

*----- リターンコード判定

IF SY-SUBRC = 0.

P_UPFILE = LTH_FILE-FILENAME.

ENDIF.

ENDIF.

指定数据保存的文件地址:

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_ERFILE事件下。

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG

EXPORTING

WINDOW_TITLE = LW_TITLE "エラー出力ファイル選択

CHANGING

FILENAME = LW_FILENAME "ファイル名

PATH = LW_PATH "パース名

FULLPATH = LW_FULLPATH "ファイルパース名

USER_ACTION = LW_ACTION "動作結果

EXCEPTIONS

CNTL_ERROR = 1

ERROR_NO_GUI = 2

NOT_SUPPORTED_BY_GUI = 3

OTHERS = 4.

*----- リターンコード判定

IF SY-SUBRC <> 0. "CALL メソッド失敗時

SET CURSOR FIELD 'P_ERFILE'. "カーソルをセット

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

RETURN. "選択画面へ戻る

ENDIF.

*----- 結果情報判定

IF LW_ACTION = 0.

*----- [ファイルパース名]を[選択画面-エラーファイル名]に設定する

P_ERFILE = LW_FULLPATH.

ENDIF.

posted @ 2008-01-07 16:05 nyf425 阅读(1068) | 评论 (0)编辑 收藏

CALL FUNCTION 'FIRST_DAY_IN_PERIOD_GET'

CALL FUNCTION 'LAST_DAY_IN_PERIOD_GET'


以下是FI中用到的取得会计相关日期的两个通用模块:

* カレンダー年月日の取得

CALL FUNCTION 'FIRST_DAY_IN_PERIOD_GET'

EXPORTING

I_GJAHR = P_YEAR “会计年度

* I_MONMIT = “月後半の開始日

I_PERIV = LW_PERIV “会计期间版本

I_POPER = P_TOUKI “会計期間

IMPORTING

E_DATE = W_FIRST

EXCEPTIONS

INPUT_FALSE = 1

T009_NOTFOUND = 2

T009B_NOTFOUND = 3

OTHERS = 4

.

CALL FUNCTION 'LAST_DAY_IN_PERIOD_GET'

EXPORTING

I_GJAHR = P_YEAR

I_PERIV = LW_PERIV

I_POPER = P_TOUKI

IMPORTING

E_DATE = W_LAST

EXCEPTIONS

INPUT_FALSE = 1

T009_NOTFOUND = 2

T009B_NOTFOUND = 3

OTHERS = 4 .

参数说明:

I_GJAHR :会计年度 指定年份

I_MONMIT :月後半の開始日 设定一个期间是多少天

I_POPER :会計期間 指定期间个数(或指从会计期间开始日起,第多少个期间)

I_PERIV :会计期间版本 依国别不同而异,有以下取值:

posted @ 2008-01-07 16:05 nyf425 阅读(1040) | 评论 (0)编辑 收藏

写的很清晰~!
首先简单解释一下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

现在假想一种情境,来做一个演示的BDC程序。
由于业务上的需要,某公司打算将某些物料的描述都在后面加上指定的文本Group X,所以需要修改已经存在的物料数据,用T-code:MM02,

外部数据是TXT文本,记录有N条,如下:

Material NO. Description
6000-00001 XXXXXXX(Group A)
2098-00001 fdfladsfladfl(Group B )
2059-00009 dfdsfreddfalfasfa(Group A)
2003-00003 iadfdafdf,adfasf(Group D)
……
……
下面是“录”操作的过程,在命令栏里输入T-code :SHDB,进入如下屏幕:

点New Recodring,出现如下屏幕:

其中Recording 的名字是任意给的。MM02是需要录的事务代码。

按下“Start Recording”,就会进入“Change Material”,这时,以下的操作对于用户来说是一次普通修改物料描述操作,尽管系统在记录所有的操作。


输入一个物料后,点击“Select View(s)”



假设我们只选“Basic Data 1”和“Basic Data 1”
然后点击绿色的小勾“Enter”

我们在该物料后面添加一个“Group A”,描述改为:


……

然后点“SAVE”,保存这次修改。

现在SAP回到了SHDB,

先点“SAVE”,保存Recording :Ztest,然后点”Back”,返回SHDB的第一屏。

选中“Ztest”,然后点击“Program”,由SAP自动生成一个程序。


在上面的对话框中输入程序的名字(注意SAP的命名规范,Y或者Z开头),确认输入

再输入一些程序的属性信息如下:

点击“Source Code”,指定“Develop Class”等后,就可以进入ABAP Editor,产生如下代码:

report ZBDCTEST
no standard page heading line-size 255.

include bdcrecx1.

parameters: dataset(132) lower case.
*** DO NOT CHANGE - the generated data section - DO NOT CHANGE ***
*
* If it is nessesary to change the data section use the rules:
* 1.) Each definition of a field exists of two lines
* 2.) The first line shows exactly the comment
* '* data element: ' followed with the data element
* which describes the field.
* If you don't have a data element use the
* comment without a data element name
* 3.) The second line shows the fieldname of the
* structure, the fieldname must consist of
* a fieldname and optional the character '_' and
* three numbers and the field length in brackets
* 4.) Each field must be type C.
*
*** Generated data section with specific formatting - DO NOT CHANGE ***
data: begin of record,
* data element: MATNR
MATNR_001(018),
* data element: XFELD
KZSEL_01_002(001),
* data element: XFELD
KZSEL_02_003(001),
* data element: MAKTX
MAKTX_004(040),
* data element: MEINS
MEINS_005(003),
* data element: MTPOS_MARA
MTPOS_MARA_006(004),
* data element: GEWEI
GEWEI_007(003),
end of record.

*** End generated data section ***

start-of-selection.

perform open_dataset using dataset.
perform open_group.

do.

read dataset dataset into record.
if sy-subrc <> 0. exit. endif.

perform bdc_dynpro using 'SAPLMGMM' '0060'.
perform bdc_field using 'BDC_CURSOR'
'RMMG1-MATNR'.
perform bdc_field using 'BDC_OKCODE'
'=AUSW'.
perform bdc_field using 'RMMG1-MATNR'
record-MATNR_001.
perform bdc_dynpro using 'SAPLMGMM' '0070'.
perform bdc_field using 'BDC_CURSOR'
'MSICHTAUSW-DYTXT(02)'.
perform bdc_field using 'BDC_OKCODE'
'=ENTR'.
perform bdc_field using 'MSICHTAUSW-KZSEL(01)'
record-KZSEL_01_002.
perform bdc_field using 'MSICHTAUSW-KZSEL(02)'
record-KZSEL_02_003.
perform bdc_dynpro using 'SAPLMGMM' '4004'.
perform bdc_field using 'BDC_OKCODE'
'=BU'.
perform bdc_field using 'BDC_CURSOR'
'MAKT-MAKTX'.
perform bdc_field using 'MAKT-MAKTX'
record-MAKTX_004.
perform bdc_field using 'MARA-MEINS'
record-MEINS_005.
perform bdc_field using 'MARA-MTPOS_MARA'
record-MTPOS_MARA_006.
perform bdc_field using 'MARA-GEWEI'
record-GEWEI_007.
perform bdc_transaction using 'MM02'.

enddo.

perform close_group.
perform close_dataset using dataset.

上面的程序的主要逻辑为:

open dataset “读取外部数据源

do.“循环

perform 填充BDCDATA子程序
perform bdc_transcation

endo.

Close dataset.

注意上面的Include程序里有两个重要的form.

*-------------------------------------------------------------------*
* 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.

另外还有两个重要的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.

选取部分最关键(典型)的代码如下:

do.

read dataset dataset into record.“逐行读出txt文本中的记录,
请参:read dataset
if sy-subrc <> 0. exit. endif. “如出错就退出

以下执行子程序(粗斜体部分)

屏幕①
A、指定bdc_dynpro的实参,告知系统dialog程序名称:SAPLMGMM,及screen number:0060
perform bdc_dynpro using 'SAPLMGMM' '0060'.

B、指定bdc_field的实参,告知系统把光标放在哪个字段,这里是“RMMG1-MATNR,物料”
perform bdc_field using 'BDC_CURSOR'
'RMMG1-MATNR'.
C、告知系统ok_code是什么,也可以认为是去点哪个按钮,这里是左上角的“Select View(s)”
perform bdc_field using 'BDC_OKCODE'
'=AUSW'.
这里是通过read dataset 读取的外部的文件中的记录,record是一个用于临时保存数据的仅有一行的work area。程序在运行进,record-matnr_001应该是一个具体的物料代码。
perform bdc_field using 'RMMG1-MATNR'
record-MATNR_001.

屏幕②是类似的
perform bdc_dynpro using 'SAPLMGMM' '0070'.
perform bdc_field using 'BDC_CURSOR'
'MSICHTAUSW-DYTXT(02)'.
perform bdc_field using 'BDC_OKCODE'
'=ENTR'.
perform bdc_field using 'MSICHTAUSW-KZSEL(01)'
record-KZSEL_01_002.
perform bdc_field using 'MSICHTAUSW-KZSEL(02)'
record-KZSEL_02_003.

③同样先指定程序名称及屏幕号,然后指定光标位置,值,OK_Code
perform bdc_dynpro using 'SAPLMGMM' '4004'.
perform bdc_field using 'BDC_OKCODE'
'=BU'.
perform bdc_field using 'BDC_CURSOR'
'MAKT-MAKTX'.
perform bdc_field using 'MAKT-MAKTX'
record-MAKTX_004.
perform bdc_field using 'MARA-MEINS'
record-MEINS_005.
perform bdc_field using 'MARA-MTPOS_MARA'
record-MTPOS_MARA_006.
perform bdc_field using 'MARA-GEWEI'
record-GEWEI_007.

以上的步骤实际上在一个叫做bdcdata的internal table中填入了一些关于调用哪个程序(包括屏幕号码),在哪些字段中,填入什么值,点击什么按钮等信息。
下面的一个步骤才真正的向系统写入数据
call function 'BDC_Insert',建立session,一般是后台运行,能给出Log信息

call transaction不建立session,直接执行。
执行后返回的消息保存在messtab中。

perform bdc_transaction using 'MM02'.

enddo.

perform close_group.
perform close_dataset using dataset.



再给一个简明的非SAP自动生成的程序如下(旧版SAP31I),这个程序略去了读取外部数据的程序,没有用循环,只是用Matnr从屏幕上接收用户输入的一个物料。

REPORT ZBDC1 .

TABLES:MARA.

DATA:BEGIN OF BDCDATA OCCURS 0.
INCLUDE STRUCTURE BDCDATA.
DATA:END OF BDCDATA.

PARAMETERS:MATNR LIKE MARA-MATNR.
PARAMETERS:P_MODE TYPE C DEFAULT 'N'.

START-OF-SelectION.
PERform PROCESS_CC02.
PERform PROCESS_CC03.
PERform PROCESS_CC04.
PERform PROCESS_CC05.
CALL TRANSACTION 'MM02' USING BDCDATA MODE P_MODE Update 'S'.
END-OF-SelectION.

form PROCESS_CC02.
PERform BDC_DYNPRO USING 'SAPLMGMM' '0060'.
PERform BDC_FIELD USING 'BDC_OKCODE' '/00'.
PERform BDC_FIELD USING 'RMMG1-MATNR' MATNR.
ENDform. "process_cc02

form PROCESS_CC03.
PERform BDC_DYNPRO USING 'SAPLMGMM' '0070'.
PERform BDC_FIELD USING 'BDC_OKCODE' 'ENTR'.
PERform BDC_FIELD USING 'MSICHTAUSW-KZSEL(11)' 'X'.
ENDform. "process_cc03

form PROCESS_CC04.
PERform BDC_DYNPRO USING 'SAPLMGMM' '0080'.
PERform BDC_FIELD USING 'BDC_OKCODE' 'ENTR'.
PERform BDC_FIELD USING 'RMMG1-WERKS' 'TH10'.
ENDform. "process_cc04

form PROCESS_CC05.
PERform BDC_DYNPRO USING 'SAPLMGMM' '3000'.
PERform BDC_FIELD USING 'BDC_OKCODE' 'BU'.
ENDform. "process_cc05

form BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR BDCDATA.
BDCDATA-PROGRAM = PROGRAM.
BDCDATA-DYNPRO = DYNPRO.
BDCDATA-DYNBEGIN = 'X'.
APPEND BDCDATA.
ENDform.

form BDC_FIELD USING FNAM FVAL.
CLEAR BDCDATA.
BDCDATA-FNAM = FNAM.
BDCDATA-FVAL = FVAL.
APPEND BDCDATA.
ENDform.


总结一下:
对于一个BDC程序来说,

有两个固定的internal table 需要声明:bdcdata和messtab,名称可以变,但是声明时一定要
* Batchinputdata of single transaction
data: abc like bdcdata occurs 0 with header line.
* messages of call transaction
data: def like bdcmsgcoll occurs 0 with header line.
Like 后面的table type(这里是一个structure)是不能改变的。

有两个固定功能的form:bdc_dynapro和 bdc_field
名称同样是任意的,但是程序代码应该是相同的,

(强烈建议不要改动,因为会给自己添加麻烦)

另个还有一个Internal Table或者work area是用来放从外部读进来的数据的,结构应该和你的外部文件的有相关的字段结构。

一次读进全部的记录然后循环处理 loop at [internal table] …… process……endloop。
或者一条一条读进并处理,然后循环读下一条 do …… process…… enddo。

其中Process 分为两个部分:1.填充bdcdata表。
2.Call transaction or Call Function ‘BDC_Inser’返回消息放入Messtab.

另外有一个经验之谈:

1、录“操作”的时候,不要有“多余”的操作,(什么是多余的操作?自己思考吧)如果有,就重新录吧,不然这些操作也被记录下来,程序每次都要做一些不必要的动作。
2、尽量用鼠标去点击按钮,而不要只是敲“Enter”。
3、光标的位置一般也可以不指定,也就是perform bdc_field using ‘BDC_CURSOR’ ‘XXXX-XXXX’通常可以不用写。不过,据说有时候去了也会出问题,加上去就没了,这个我就不知道了。呵~
posted @ 2008-01-07 16:04 nyf425 阅读(1151) | 评论 (0)编辑 收藏

ABAP CHECKBOX 和LISTBOX使用指南

1.什么是checkbox

就是一个复选框,可以用like或者type来定义,为1个字符型变量。它是parameter的一个选项,parameter xxx as checkbox就可以在选择屏幕上显示一个复选框。

2.什么是listbox

就是一个下拉列表,你可以在这个列表中选择一条记录进行某种操作。也是parameter的一个选项,parameter xxx as listbox就可以在选择屏幕上显示一个下拉列表。

3.如何使用:

下面我们用一个程序来说明这两者的使用方法。

REPORT Z_TEXT

TYPE-POOLS: VRM . 存放combobox内容的type pool

DATA: NAME TYPE VRM_ID , “ list box的名称

LIST TYPE VRM_VALUES , “ list box的值

VALUE LIKE LINE OF LIST . “ list box的结构

*定义checkbox,指定command,为了能够响应选择屏幕中值的改变

PARAMETERS: P_CB1 TYPE C AS CHECKBOX DEFAULT 'X' USER-COMMAND CHECK,

P_CB2 TYPE C AS CHECKBOX DEFAULT 'X' USER-COMMAND CHECK.

*定义listbox,必须指定visible length

PARAMETERS: P_LIST1(10) TYPE C AS LISTBOX

VISIBLE LENGTH 15 ,

P_LIST2(20) TYPE C AS LISTBOX

VISIBLE LENGTH 25 .

*开始执行

AT SELECTION-SCREEN OUTPUT .

*--〉选择1而没有选择2

IF P_CB1 = 'X' AND P_CB2 = ''.

*---〉向listbox里面添加值

REFRESH LIST .

VALUE-KEY = '1111111111' . 这个就是变量P_LIST的值

VALUE-TEXT = '1111111111' . 这个是text

APPEND VALUE TO LIST .

VALUE-KEY = '2222222222' .

VALUE-TEXT = '2222222222' .

APPEND VALUE TO LIST .

VALUE-KEY = '3333333333' .

VALUE-TEXT = '3333333333' .

APPEND VALUE TO LIST .

*---〉调用函数显示listbox里面的值

CALL FUNCTION 'VRM_SET_VALUES'

EXPORTING

ID = 'P_LIST1'

VALUES = LIST.

*---〉把第二个listbox的值清空,并且不能输入

CLEAR P_LIST2 .

LOOP AT SCREEN .

IF SCREEN-NAME = 'P_LIST2' .

SCREEN-INPUT = 0 .

MODIFY SCREEN .

ENDIF .

ENDLOOP .

*--〉选择2,没有选择1,同上

ELSEIF P_CB2 = 'X' AND P_CB1 = ''.

REFRESH LIST .

VALUE-KEY = 'AAAAAAAAAAAAAAAAAAAA' .

VALUE-TEXT = 'AAAAAAAAAAAAAAAAAAAA' .

APPEND VALUE TO LIST .

VALUE-KEY = 'BBBBBBBBBBBBBBBBBBBB' .

VALUE-TEXT = 'BBBBBBBBBBBBBBBBBBBB' .

APPEND VALUE TO LIST .

VALUE-KEY = 'CCCCCCCCCCCCCCCCCCCC' .

VALUE-TEXT = 'CCCCCCCCCCCCCCCCCCCC' .

APPEND VALUE TO LIST .

APPEND VALUE TO LIST .

CALL FUNCTION 'VRM_SET_VALUES'

EXPORTING

ID = 'P_LIST2'

VALUES = LIST.

*---〉清空listbox 1的值

CLEAR P_LIST1 .

LOOP AT SCREEN .

IF SCREEN-NAME = 'P_LIST1' .

SCREEN-INPUT = 0 .

MODIFY SCREEN .

ENDIF .

ENDLOOP .

*--〉都没有选择,都清空且不能输入

ELSEIF P_CB1 = '' AND P_CB2 = '' .

CLEAR: P_LIST1,P_LIST2 .

LOOP AT SCREEN .

IF SCREEN-NAME = 'P_LIST1' .

SCREEN-INPUT = 0 .

MODIFY SCREEN .

ENDIF .

ENDLOOP .

LOOP AT SCREEN .

IF SCREEN-NAME = 'P_LIST2' .

SCREEN-INPUT = 0 .

MODIFY SCREEN .

ENDIF .

ENDLOOP .

*--〉都选,执行

ELSEIF P_CB1 = 'X' AND P_CB2 = 'X' .

REFRESH LIST .

VALUE-KEY = '1111111111' .

VALUE-TEXT = '1111111111' .

APPEND VALUE TO LIST .

VALUE-KEY = '2222222222' .

VALUE-TEXT = '2222222222' .

APPEND VALUE TO LIST .

VALUE-KEY = '3333333333' .

VALUE-TEXT = '3333333333' .

APPEND VALUE TO LIST .

CALL FUNCTION 'VRM_SET_VALUES'

EXPORTING

ID = 'P_LIST1'

VALUES = LIST.

REFRESH LIST .

VALUE-KEY = 'AAAAAAAAAAAAAAAAAAAA' .

VALUE-TEXT = 'AAAAAAAAAAAAAAAAAAAA' .

APPEND VALUE TO LIST .

VALUE-KEY = 'BBBBBBBBBBBBBBBBBBBB' .

VALUE-TEXT = 'BBBBBBBBBBBBBBBBBBBB' .

APPEND VALUE TO LIST .

VALUE-KEY = 'CCCCCCCCCCCCCCCCCCCC' .

VALUE-TEXT = 'CCCCCCCCCCCCCCCCCCCC' .

APPEND VALUE TO LIST .

CALL FUNCTION 'VRM_SET_VALUES'

EXPORTING

ID = 'P_LIST2'

VALUES = LIST.

ENDIF .

START-OF-SELECTION .

*--〉输出到第二屏幕看看

WRITE: P_LIST1 ,/ P_LIST2 .

posted @ 2008-01-07 16:04 nyf425 阅读(1229) | 评论 (0)编辑 收藏

1, 首先对要上传的文件进行存在检查。

(在AT SELECTION-SCREEN事件下完成

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST

EXPORTING

FILE = LW_FILE

RECEIVING

RESULT = LW_RESULT

EXCEPTIONS

CNTL_ERROR = 1

ERROR_NO_GUI = 2

WRONG_PARAMETER = 3

NOT_SUPPORTED_BY_GUI = 4

OTHERS = 5.

IF SY-SUBRC <> 0.

SET CURSOR FIELD 'P_UPFILE'. "カーソルをセット

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

*----- チェック結果判定

IF LW_RESULT <> CNS_TRUE. "ファイル存在しない

SET CURSOR FIELD 'P_UPFILE'. "カーソルをセット

*----- MSG: アップロードファイル &1 は存在しません

MESSAGE E116(ZNKCC1) WITH P_UPFILE.

ENDIF.

2, 对于指定下载到本地的文件,首先,将屏幕上输入的路径和文件名分隔开来,(在AT SELECTION-SCREEN事件下完成

*----- CALL 汎用モジュール

CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'

EXPORTING

FULL_NAME = P_ERFILE

IMPORTING

STRIPPED_NAME = W_FILE

FILE_PATH = P_O_PATH

EXCEPTIONS

X_ERROR = 1

OTHERS = 2.

IF SY-SUBRC <> 0.

SET CURSOR FIELD 'P_ERFILE'. "カーソルをセット

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

其次,检查分隔得到的文件路径(路径是否存在)。(在AT SELECTION-SCREEN事件下完成

CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_EXIST

EXPORTING

DIRECTORY = LW_PATH

RECEIVING

RESULT = LW_RESULT

EXCEPTIONS

CNTL_ERROR = 1

ERROR_NO_GUI = 2

WRONG_PARAMETER = 3

NOT_SUPPORTED_BY_GUI = 4

OTHERS = 5.

IF SY-SUBRC <> 0.

SET CURSOR FIELD 'P_ERFILE'. "カーソルをセット

MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

3, 实现对上传文件的检索帮助。

(在AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_UPFILE.事件下完成

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG

EXPORTING

WINDOW_TITLE = LW_TITLE "ファイル選択

CHANGING

FILE_TABLE = LTD_FILE

RC = LW_RETURN "リターン値

USER_ACTION = LW_ACTION "動作結果

EXCEPTIONS

FILE_OPEN_DIALOG_FAILED = 1

CNTL_ERROR = 2

ERROR_NO_GUI = 3

NOT_SUPPORTED_BY_GUI = 4

OTHERS = 5.

*----- リターンコード判定

IF SY-SUBRC <> 0. "メソッド失敗時

SET CURSOR FIELD 'P_UPFILE'. "カーソルをセット

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

RETURN.

ENDIF.

*----- 結果情報判定

IF LW_RETURN < 0.

RETURN. "選択画面へ戻る

ENDIF.

*----- 結果情報判定

IF LW_ACTION = 0.

*----- [選択ファイルテーブル]の1件目を[アップロードファイル名]設定

READ TABLE LTD_FILE INTO LTH_FILE INDEX 1.

*----- リターンコード判定

IF SY-SUBRC = 0.

P_UPFILE = LTH_FILE-FILENAME.

ENDIF.

ENDIF.

4, 对下载的文件的检索帮助的实现同3

5, 对下载的文件是保存帮助处理。

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG

EXPORTING

WINDOW_TITLE = LW_TITLE "エラー出力ファイル選択

CHANGING

FILENAME = LW_FILENAME "ファイル名

PATH = LW_PATH "パース名

FULLPATH = LW_FULLPATH "ファイルパース名

USER_ACTION = LW_ACTION "動作結果

EXCEPTIONS

CNTL_ERROR = 1

ERROR_NO_GUI = 2

NOT_SUPPORTED_BY_GUI = 3

OTHERS = 4.

*----- リターンコード判定

IF SY-SUBRC <> 0. "CALL メソッド失敗時

SET CURSOR FIELD 'P_ERFILE'. "カーソルをセット

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

RETURN. "選択画面へ戻る

ENDIF.

*----- 結果情報判定

IF LW_ACTION = 0.

*----- [ファイルパース名]を[選択画面-エラーファイル名]に設定する

P_ERFILE = LW_FULLPATH.

ENDIF.

6.另外的情况,屏幕上输入下载文件指定路径和文件名后,先检查该文件是否存在,如果存在,则需要弹出对话框,提醒用户是否覆盖原文件。

(在AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_DOFILE.事件下完成

*----- エラーファイルの存在チェック

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST

EXPORTING

FILE = LW_FILE "ファイル

RECEIVING

RESULT = LW_RESULT "チェック結果

EXCEPTIONS

CNTL_ERROR = 1

ERROR_NO_GUI = 2

WRONG_PARAMETER = 3

NOT_SUPPORTED_BY_GUI = 4

OTHERS = 5.

*----- リターンコード判定

IF SY-SUBRC <> 0. "CALL メソッド失敗時

SET CURSOR FIELD 'P_ERFILE'. "カーソルをセット

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

提示是否覆盖原文件

*----- CALL 汎用モジュール

CALL FUNCTION 'POPUP_TO_CONFIRM'

EXPORTING

TITLEBAR = TEXT-006 "確認

TEXT_QUESTION = TEXT-007 "質問テキスト

TEXT_BUTTON_1 = TEXT-008 "はい

TEXT_BUTTON_2 = TEXT-009 "いいえ

DEFAULT_BUTTON = '1' "カーソル位置

DISPLAY_CANCEL_BUTTON = 'X' "取消押ボタン

START_COLUMN = 25 "POPUP の開始列

START_ROW = 6 "POPUP の開始行

IMPORTING

ANSWER = LW_ANSWER "リターンコード

EXCEPTIONS

TEXT_NOT_FOUND = 1

OTHERS = 2.

*----- リターンコード判定

IF SY-SUBRC <> 0. "CALLモジュール失敗時

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

LEAVE LIST-PROCESSING.

ENDIF.

*----- 結果情報判定

IF LW_ANSWER = '2' "いいえOR中止ボタン押下

OR LW_ANSWER = 'A'.

LEAVE LIST-PROCESSING. "選択画面へ戻る

ENDIF.

示例:

REPORT ZLEI_FILE_CHECK.

*----------------------------------------------------------------------*

* WORKS

*----------------------------------------------------------------------*

DATA:

W_FILE TYPE STRING. "ファイル名

*----------------------------------------------------------------------*

* CONSTANTS

*----------------------------------------------------------------------*

CONSTANTS:

CNS_TRUE(1) TYPE C VALUE 'X'. "TRUE

*----------------------------------------------------------------------*

* PARAMETERS

*----------------------------------------------------------------------*

PARAMETERS:

P_UPFILE LIKE RLGRAP-FILENAME, "Upload file

P_ERFILE LIKE RLGRAP-FILENAME. "Download file

*----------------------------------------------------------------------*

* AT SELECTION-SCREEN

*----------------------------------------------------------------------*

AT SELECTION-SCREEN.

*----- アップロードファイルの存在チェック

PERFORM FRM_CHECK_UPFILE_EXIST.

*----- エラーファイルのチェック

PERFORM FRM_CHECK_ERFILE.

*----------------------------------------------------------------------*

* AT SELECTION-SCREEN ON VALUE-REQUEST

*----------------------------------------------------------------------*

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_UPFILE.

*----- アップロードファイルの検索ヘルプ

PERFORM FRM_SEARCH_UPFILE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_ERFILE.

*----- エラー出力ファイルの検索ヘルプ

PERFORM FRM_SAVE_ERFILE.

*&---------------------------------------------------------------------*

*& Form FRM_CHECK_UPFILE_NAME

*&---------------------------------------------------------------------*

* アップロードファイルの存在チェック

*----------------------------------------------------------------------*

FORM FRM_CHECK_UPFILE_EXIST.

DATA:

LW_FILE TYPE STRING, "ファイル

LW_RESULT TYPE C. "チェック結果

LW_FILE = P_UPFILE.

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST

EXPORTING

FILE = LW_FILE

RECEIVING

RESULT = LW_RESULT

EXCEPTIONS

CNTL_ERROR = 1

ERROR_NO_GUI = 2

WRONG_PARAMETER = 3

NOT_SUPPORTED_BY_GUI = 4

OTHERS = 5.

IF SY-SUBRC <> 0.

SET CURSOR FIELD 'P_UPFILE'. "カーソルをセット

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

*----- チェック結果判定

IF LW_RESULT <> CNS_TRUE. "ファイル存在しない

SET CURSOR FIELD 'P_UPFILE'. "カーソルをセット

*----- MSG: アップロードファイル &1 は存在しません

MESSAGE E116(ZNKCC1) WITH P_UPFILE.

ENDIF.

ENDFORM. " FRM_CHECK_UPFILE_EXIST

*&---------------------------------------------------------------------*

*& Form FRM_CHECK_ERFILE

*&---------------------------------------------------------------------*

* エラーファイルのチェック

*----------------------------------------------------------------------*

FORM FRM_CHECK_ERFILE.

DATA:

LW_PATH TYPE RLGRAP-FILENAME. "パス

*----- エラーファイルの切りのチェック

PERFORM FRM_SPLIT_ERFILE_PATH CHANGING LW_PATH.

*----- エラーファイルのパスのチェック

PERFORM FRM_CHECK_DIRECTORY_EXIST USING LW_PATH.

*----- エラーファイルの存在のチェック

PERFORM FRM_CHECK_ERFILE_EXIST.

ENDFORM. " FRM_CHECK_ERFILE

*&---------------------------------------------------------------------*

*& Form FRM_SPLIT_ERFILE_PATH

*&---------------------------------------------------------------------*

* エラーファイルの切りのチェック

*----------------------------------------------------------------------*

* <-- P_O_PATH パス(CHANGINGパラメータ)

*----------------------------------------------------------------------*

FORM FRM_SPLIT_ERFILE_PATH CHANGING P_O_PATH TYPE RLGRAP-FILENAME.

*----- CALL 汎用モジュール

CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'

EXPORTING

FULL_NAME = P_ERFILE

IMPORTING

STRIPPED_NAME = W_FILE

FILE_PATH = P_O_PATH

EXCEPTIONS

X_ERROR = 1

OTHERS = 2.

IF SY-SUBRC <> 0.

SET CURSOR FIELD 'P_ERFILE'. "カーソルをセット

*----- システムメッセージ出力

MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

ENDFORM. " FRM_SPLIT_ERFILE_PATH

*&---------------------------------------------------------------------*

*& Form FRM_CHECK_DIRECTORY_EXIST

*&---------------------------------------------------------------------*

* エラーファイルのパスのチェック

*----------------------------------------------------------------------*

* --> P_I_PATH パス(USINGパラメータ)

*----------------------------------------------------------------------*

FORM FRM_CHECK_DIRECTORY_EXIST USING P_I_PATH TYPE RLGRAP-FILENAME.

DATA:

LW_RESULT TYPE C, "チェック結果

LW_PATH TYPE STRING. "ファイル

LW_PATH = P_I_PATH.

CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_EXIST

EXPORTING

DIRECTORY = LW_PATH

RECEIVING

RESULT = LW_RESULT

EXCEPTIONS

CNTL_ERROR = 1

ERROR_NO_GUI = 2

WRONG_PARAMETER = 3

NOT_SUPPORTED_BY_GUI = 4

OTHERS = 5.

IF SY-SUBRC <> 0.

posted @ 2008-01-07 16:03 nyf425 阅读(1543) | 评论 (0)编辑 收藏

BAPI的简单实现步骤(转)
一,创建Function Module

1,在SE11,创建需要的structure

2,在SE80,建Function group

3,在SE37,创建Function Module

Note:一个Function Group只能包含一个BAPI;参数传值;必须有有一个BAPIRETURN类型的EXPORT参数

二,封装

1,在SWO1,建Object Type

2,把Function Module作为一个Method加入,utilities->API Methods->Add Method

3release ObjectModule。使在BAPI Browser 中可以看到。也就是外部能够调用。

三,调用

1,如在另一系统中用ABAP调用,先在SM59中建RFC联到有BAPIR/3(ZGOGO)

SE38的程序中调用,Call Function "ZBAPIXXXXX" DESTINATION ZGOGO EXPORTING ...

2,如用JAVA调用

引入包;(不一定要用IBM的)

import com.sap.rfc.*;

import com.sap.rfc.exception.*;

import com.ibm.sap.bapi.*;

import com.ibm.sap.bapi.generated.*;

建立连接;调用。。。(See CALL_BAPI.java

posted @ 2008-01-07 16:03 nyf425 阅读(916) | 评论 (0)编辑 收藏