SAP Inbound via EDI
目的
通过EDI传输外部数据(如客户数据),再根据内向处理(Inbound)自动生成所需要的资料(如销售订单)
当我们在接到某个外部数据时(在此文档中用建立销售订单为例子来演示),我们需要通过这个外部数据来建立相应的销售订单。
一般的操作,有以下两个方法
一是手工去操作
二是自动运行
在手工操作中,有以下几个TCODE或程序都可以实现
1、 TCODE: WE19
2、 TCODE:WE16
3、 程序: RSEINB00
其实操作方法都是类似,在此,我只演示一下WE19的操作。
常用的有两个,一是EXISTING IDOC,即表示你的IDOC已经产生了,你也许想再次执行这个IDOC
另一个就是我们要讲的 FILE AS TEMPLATE,即用文件做为一个模板去执行
如果你这样输入,再去执行
会发现系统有错误信息,你此时可能会说,绝对没道理,这个文件一定是存在的,也是可以打开的,肯定的,100%是SAP的BUG,哈哈,那么老兄,你就太主观了,太不了解SAP了。
原因我就不说,再看下一个操作先。
FILE AS TEMPLATE的完整内容是:
\\192.168.40.37\factory$\EDI\ErORDERS05MYW1000216.txt
你再试试
就成功了,原因何在?
就是这个FILE AS TEMPLATE一定要用这种网络格式。
到这个画面,我就不解释了,就表示这个文件已经执行了,你可以去产生INBOUND 所需要的东东了。
这就是所谓的手工操作,但是这里有一点要注意,这个执行后,是不会删除原始文件的。
而程序:RSEINB00是会删除原始文件的。具体你们可以去试了。
这个才是我们要说的重点。
如果自动运行?就是让系统隔一段时间去检查固定的INBOUND 目录中有没有文件存在,如果有的话,就要去自动生成INBOUND所需要的东东。
这个做法其实也有两个,一是去执行DOS命令,二是你写程序
DOS命令做法:
要执行此活动,需要来自 RFC 库的 STARTRFC.EXE 程序。STARTRFC.EXE 是标准 R/3 RFC SDK 命令文件,通过SAP 前端 (SAP GUI) 交付,通常位于文件夹 <sap 安装目录>\FrontEnd\SAPgui\rfcsdk\bin 下。如果在那找不到 R/3 RFC SDK,请参考 SAP Note 27517 或 413708 了解如何获取该文件。(或者在DVD的Misc文件夹下寻找该文件)
使用通过以下命令描述的登录参数和功能模块参数运行 STARTRFC:
startrfc <登录参数>
-F EDI_DATA_INCOMING
-E PATHNAME=<内向文件路径>
-E PORT=<端口名称>
登录参数
参数 |
值(示例) |
描述 |
-3 |
通过 RFC 登录到特定的 R/3 系统。‘–3’ 不准与 ‘-balanced’ 或 ‘-d’ 结合使用。 登录到特定的 R/3 系统意味着可以直接建立连接,通过直接的 IP 连接可访问目标 R/3 实例。因此,相关的参数是要连接的主机和要连接的系统编号。 |
|
-h <主机名称> |
应用程序服务器的主机名称。这是用下划线分隔的服务器名称的第一部分。此参数不区分大小写。 |
|
-balanced |
通过 RFC 使用负载平衡登录到 R/3 系统。‘–balanced’ 不准与 ‘-3’ 或 ‘-d’ 结合使用。 负载平衡连接的目的只是在一组 R/3 应用程序服务器之间负载平衡连续的连接。为此,需要通过消息服务器(中央 R/3 实例通讯处理)建立连接,以确定哪个 R/3 实例处理 RFC 调用。 此处的主要参数有消息服务器处理所依托的主机名称、R/3 中央实例的系统名称以及登录组,登录组指定可以从中选择 R/3 实例的应用程序服务器簇以满足请求。 |
|
-h <主机名称> |
消息服务器的主机名称。这是用下划线分隔的服务器名称的第一部分。此参数不区分大小写。 |
|
-s <系统名称> |
应用程序服务器的名称。系统名称为 3 个字母的文字。这是用下划线分隔的服务器名称的第二部分。此参数不区分大小写。 |
|
-g <组> |
应用程序服务器组的名称。缺省值为 ‘PUBLIC’。此参数区分大小写。 |
|
-u <SAP 用户> |
EDIUSER |
SAP 用户 考虑到安全原因,应该使用 CPI-C 用户,因为该用户类型不能用于对话框中。 该用户要求所有必需的权限。 |
-p <用户口令> |
PASSWORD |
用户口令。 输入以大写字母表示的口令。 |
-c <SAP 客户端> |
001 |
SAP 客户端(默认:000) |
-l |
DE |
SAP 系统语言(默认:EN) |
-t |
|
将日志数据记到当前目录的 dev_rfc 文件中。 |
当不用任何参数调用 STARTRFC.EXE 时,系统提供 STARTRFC.EXE 程序命令行参数的附加说明。附加参数包括调试支持、网关寻址和 SAPGUI 执行。
内向 IDoc 的功能模块参数
参数 |
值(示例) |
描述 |
-F <功能模块) |
EDI_DATA_INCOMING |
只有该功能模块读取 IDoc 文件! |
-E <PATHNAME=value> |
PATHNAME=<Inbound-file-path>/file name 示例:/usr/sap/<system name>/SYS/global/Inbound/kanterwang.txt |
包含 IDoc 的文件的目录和文件名称(最多 100 个字符) |
-E <PORT=value> |
PORT=<portname> 示例:YEDIFILE |
端口名称(外部系统的逻辑名称),如端口定义 WE21 中所定义的名称(最长 10 个字符) |
执行 startrfc 的示例:
startrfc –balanced -h <hostname> -s <system name> -g PUBLIC
-c <SAP client> -u <SAP user> -p <user password>
-F EDI_DATA_INCOMING
-E PATHNAME=/usr/sap/<system name>/SYS/global/Inbound
-E PORT=<portname>
如上述示例中给出的提示,请注意大写的命令,否则无法执行 startrfc。
如果出现以下错误消息,请按如下继续:
EDI: File ‘/usr/sap/<system name>/SYS/global/Inbound’ 不能再次被处理.
使用事务 WE08 从显示的表中删除此文件的内容,这些内容是在触发了先前相同名称的文件的内向处理时进行输入的,现在阻止再次触发相同文件的内向处理
你可能是这样输入
但是这样有一个大大的问题,就是每次只能处理一个TXT,咱们不可能这么笨,每次都去看是什么文件名,然后再去处理,要是真这样,不减薪或走人才怪。
因此,你可以借用DOS 命令
FORFILES -p <folder_path> -m * -c "startrfc -3 -d <sys_id>
-u <user> -p <password> -c <SAP client> -l <login_language>
-h <sap_host_name> -s <system_number> -F EDI_DATA_INCOMING
-E PORT=<edi_port> -E PATHNAME=\\<host>\<folder>\…\\@FILE"
我就顺便再弄一个贴,专门是这个FORFILES的命令详解吧。
另一个方法,就是咱们不用DOS,直接用程序搞定?这也行?就没什么不行?
正常情况下,很多人看了上面的命令,在写程序就会说,这很简单,不就是调用一个FUNCTION MODULE: EDI_DATA_INCOMING
我当初也是这样想,但实际上会碰到一些你想像不到的情况出现,给你们看看画面。
熟悉吧,如果你也是用这个FUNCTION的话,你不熟悉才怪。
当然,我比较笨,就这个我研究了一天,终于发现原来是有原因的,哈,自学就是这么困难。
好吧,废话少说,直接你们讲道理,不要告诉我,咱们是文化流氓,不讲道理的,那就大晕。
REPORT ZR_INBOUND_EDI.
DATA: L_DIRNAME LIKE EPSF-EPSDIRNAM,
L_FILEMASK LIKE EPSF-EPSFILNAM,
COMPLETE_FILENAME LIKE EDI_PATH-PTHNAM,
PORTNAME LIKE EDIPO-PORT.
TABLES:EDIDC.
DATA: IT_DIRLIST LIKE EPSFILI OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF IT_FILE OCCURS 0,
FILENAME(100),
END OF IT_FILE.
PARAMETERS: P_PATH LIKE EPSF-EPSDIRNAM DEFAULT ‘\\192.168.10.17\input$\’ OBLIGATORY.
START-OF-SELECTION.
PERFORM GET_FILE_LIST.
PERFORM EXEC_EDI.
*&———————————————————————*
*& Form GET_FILE_LIST
*&———————————————————————
* 得到目录下的所有文件
* text
*———————————————————————-*
FORM GET_FILE_LIST.
L_DIRNAME = P_PATH.
CLEAR: IT_DIRLIST,IT_FILE.
REFRESH: IT_DIRLIST,IT_FILE.
CALL FUNCTION ‘EPS_GET_DIRECTORY_LISTING’
EXPORTING
DIR_NAME = L_DIRNAME
TABLES
DIR_LIST = IT_DIRLIST
EXCEPTIONS
INVALID_EPS_SUBDIR = 1
SAPGPARAM_FAILED = 2
BUILD_DIRECTORY_FAILED = 3
NO_AUTHORIZATION = 4
READ_DIRECTORY_FAILED = 5
TOO_MANY_READ_ERRORS = 6
EMPTY_DIRECTORY_LIST = 7
OTHERS = 8
.
IF SY-SUBRC <> 0.
WRITE:’ DIRECTORY IS ERROR’.
ENDIF.
LOOP AT IT_DIRLIST.
CHECK IT_DIRLIST-NAME <> ‘.’ AND IT_DIRLIST-NAME <> ‘..’.
CONCATENATE L_DIRNAME IT_DIRLIST-NAME INTO IT_FILE-FILENAME.
APPEND IT_FILE.
ENDLOOP.
IF IT_FILE IS INITIAL.
WRITE:’ NO FILE IN DIRECTORY!!!’.
STOP.
ENDIF.
ENDFORM. "GET_FILE_LIST
*&———————————————————————*
*& Form EXEC_EDI
*&———————————————————————*
* text
*———————————————————————-*
FORM EXEC_EDI.
PORTNAME = ‘F000000001’.
LOOP AT IT_FILE.
* Assign values to an actual parameter
COMPLETE_FILENAME = IT_FILE-FILENAME.
* Call FM
* SET UPDATE TASK LOCAL.
* CALL FUNCTION ‘EDI_DATA_INCOMING’
* EXPORTING
* PATHNAME = COMPLETE_FILENAME
* PORT = PORTNAME
* EXCEPTIONS
* OTHERS = 1.
* 这里是重点,不能用EDI_DATA_INCOMING,而要用下面这个
CALL FUNCTION ‘IDOC_INBOUND_FROM_FILE’
EXPORTING
FILE_NAME = COMPLETE_FILENAME
PORT = PORTNAME
EXCEPTIONS
FILE_OPEN_FAILED = 1
MARKER_TO_BE_DELETED = 2
READ_FILE_FAILED = 3
IDOC_NOT_STORED = 4
FILE_DELETE_FAILED = 5
MARKER_MODIFY_FAILED = 6
EVENT_CREATE_FAILED = 7
FIRST_RECORD_INVALID = 8
INVALID_RECORD = 9
OTHERS = 10.
IF SY-SUBRC <> 0.
WRITE: / ‘Failed:’,COMPLETE_FILENAME.
ELSE.
WRITE: / ‘ EDI:’, SY-MSGV1,COMPLETE_FILENAME.
ENDIF.
ENDLOOP.
ENDFORM. "EXEC_EDI
至此,你应该明白吧?
其实在这里你有可能还会碰到一个问题,就是当你执行后,你去WE02中会发现这个IDOC是黄灯,并且有状态64?
那也好办,再继续看吧。
IDoc 的状态显示为 64 而不是预期的状态 53,这种情况是可能发生的。原因有以下几种:
· 如果安装指南中的维护自动定制工作流 这一步执行错误,因此不**内向 IDoc 的自动处理。
在这种情况下,建议重复安装指南中的上述步骤,重新运行本节检查内向 IDoc。否则,还可以通过事务 BD87 手动处理 IDoc,然后重新运行本节检查内向 IDoc。
· 可能会出现删除服务器上的内向文件的问题,这可能是网络问题或文件系统不直接位于应用程序服务器上所致。如果未删除内向文件,则无法自动处理 Idoc,用户需要手动删除内向文件并手动处理 Idoc。可以使用事务代码 AL11 检查内向文件是否仍然位于目录 DIR_GLOBAL 下。如果是,使用事务代码 BD87 进一步处理 IDOC。此外,可以使用事务代码 WE08 从服务器中手动删除文件。
Maintaining the Workflow for Automatic Customizing(维护自动定制工作流)
Use
In this step, you can finish the customizing for the workflow automatically. Workflow automatic customizing carries out the basic settings in the workflow required for IDoc processing. The workflow customizing settings made earlier are not overwritten.
The settings are not transported. This means that you also have to carry out this step in the productive system. The following steps are carried out within workflow automatic customizing:
– Configuration of a client-dependent RFC destination ("WORKFLOW_LOCAL_$<Client$>")
– Scheduling of a background job for deadline monitoring
– Setting of an active plan version
– Classification of single-step tasks as general tasks
– Maintenance of a system administrator for the workflow
Procedure
1. Access the activity using one of the following navigation options:
SAP ECC Menu |
Tools → Business Workflow → Development → Utilities → Automatic Workflow Customizing |
Transaction Code |
SWU3 |
2. On the screen Automatic Workflow Customizing, select Perform Automatic Workflow Customizing (F9) on the toolbar. Ignore any error message appearing on the screen.
3. Choose Back.
If you get an error message, such as RFC password must be synchronized, run the following activities to fix it. Otherwise, you can ignore the following steps for the remainder of this activity.
4. Create a user named WF-BATCH with transaction SU01.
5. On the screen User Maintenance: Initial Screen, enter the following:
Key field |
Value (description) |
User |
WF-BATCH |
6. Choose Create.
7. On the Maintain User screen, on the Address tab, enter the following:
Key field |
Value (description) |
Last Name |
WF-BATCH |
8. On the screen Maintain User, on the Logon data tab, enter the following:
Key field |
Value |
Description |
Initial password |
init |
You can use your own password here, but you need to enter the exact same password in the field Repeat password. |
Repeat password |
init |
|
User type |
System |
You must select the system user type here, since this user is only used by the system. |
9. On the screen Maintain User, in the Profile tab, enter the following two profiles:
SAP_ALL
SAP_NEW
10. Choose Save.
11. A message appears on the status bar: User WF-BATCH was saved.
12. To synchronize the RFC password, use transaction SWUB.
13. On the screen Configure Workflow RFC Destination, enter the following entry:
Key field |
Value |
Description |
RFC user |
WF-BATCH |
|
RFC password |
init |
Enter the same password you created for RFC user WF-BATCH |
14. Choose Synchronize Passwords on the application toolbar.
15. A message appears on the status bar: RFC destination password and user password synchronized successfully.
16. Restart the workflow automatic customizing. Follow the activities described in the section procedure above.
To make sure that automatic workflow customizing was successful, run the following activity:
17. Access the activity using the following navigation option:
Transaction Code |
SWU3 |
18. On the screen Automatic Workflow Customizing, expand item Maintain Runtime Environment.
19. Mark all entries below item Maintain Runtime Environment with a green check flag. If these selections are not available, re-run steps 1 through 3 of the procedure described above.
Result
The workflow has been customized for the runtime system.