Chinaunix首页 | 论坛 | 博客
  • 博客访问: 347882
  • 博文数量: 25
  • 博客积分: 3011
  • 博客等级: 中校
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-28 13:22
个人简介

生命在于折腾

文章分类

全部博文(25)

文章存档

2015年(1)

2011年(3)

2010年(4)

2009年(17)

我的朋友

分类: 敏捷开发

2009-07-13 14:40:09

在系统中,我们经常可以看到EDI方式的输出,与打印输出类似。下面我们基于文章"IDOC实例,Outbound IDOC"的基础上,简单讲解这种方式的IDOC输出。
 
1,创建一个function:Y_IDOC_PO_SEND.
这是我们的Outbound Funtion Module,用来创建IDOC的内容。同样的,该函数的接口都是标准的。
下面将要介绍的tcode WE41中可以查看系统已有的同类函数,可以参照设置我们的函数接口。然后写入如下代码:
 
  DATA: ls_pohead TYPE ypohead,
        ls_poitem TYPE ypoitem,
        ls_ekko TYPE ekko,
        lt_ekpo TYPE TABLE OF ekpo WITH HEADER LINE.
 
* control_record_out
  CLEAR control_record_out.
  MOVE control_record_in TO control_record_out.
* control_record_out-mestyp = 'YPO'. "Message Type
* control_record_out-idoctp = 'YPOIDOC'. "IDOC Type
  control_record_out-direct = '1'.
  control_record_out-serial = sy-datum.
  control_record_out-serial+8 = sy-uzeit.
 
* Read from ekko/ekpo
  CLEAR ls_ekko.
  SELECT SINGLE *
    INTO ls_ekko
    FROM ekko
    WHERE ebeln = object-objky(10) "采购单号
    AND   loekz = space.
  IF sy-subrc <> 0.
    RAISE error_message_received.
  ENDIF.
  REFRESH lt_ekpo.
  SELECT *
    INTO TABLE lt_ekpo
    FROM ekpo
    WHERE ebeln = ls_ekko-ebeln
    AND   loekz = space.
 
* INT_EDIDD
  CLEAR int_edidd.
  int_edidd-docnum = control_record_out-docnum.
  int_edidd-segnam = 'YPOHEAD'."结点名称
  int_edidd-dtint2 = 0.
  CLEAR ls_pohead.
  ls_pohead-ebeln = ls_ekko-ebeln.
  ls_pohead-bukrs = ls_ekko-bukrs.
  ls_pohead-bedat = ls_ekko-bedat.
  int_edidd-sdata = ls_pohead. "结点内容
  APPEND int_edidd.
  LOOP AT lt_ekpo.
    CLEAR int_edidd.
    int_edidd-docnum = control_record_out-docnum.
    int_edidd-segnam = 'YPOITEM'.
    int_edidd-dtint2 = 0.
    CLEAR ls_poitem.
    ls_poitem-ebeln = lt_ekpo-ebeln.
    ls_poitem-ebelp = lt_ekpo-ebelp.
    ls_poitem-matnr = lt_ekpo-matnr.
    ls_poitem-menge = lt_ekpo-menge.
    ls_poitem-meins = lt_ekpo-meins.
    int_edidd-sdata = ls_poitem.
    APPEND int_edidd.
  ENDLOOP.
 
2,WE41, 创建Outbound Process Code
进入编辑状态后,选择“添加新条目”按钮,创建YPOSEND,对应于新建的Y_IDOC_PO_SEND。
选中下面的Process with ALE Service,代表创建Outbound IDOC后自动发送给接收方。
 
3,NACE/NACO,创建我们的输出类型
创建一个EDI类型的输出,Program填写RSNASTED,Form Routine填写EDI_PROCESSING。
当然我们也可以在这里找一个已有的EDI输出类型做测试,比如Application EF下的XX01。
 
4,WE20设置Partner Profile.
前两篇文章中,我们并没有要求填写Partner function,不过这次必须填写了。
Partner function是从属于partner type下面的,这个逻辑关系在表TPAR中体现。
假设我们选中partner type=LS,Partner function=LS。其维护与之前的类似,点击加号添加一个Outbound Parameter,步骤与之前类似,不过必须记得在Message Control中添加一行,Application=EF,Message Type=XX01,Process code为YPOSEND。这里EF和XX01与上面NACO中的定义对应。
 
5,发送IDOC
事实上,我们已经定义完毕了,可以维护某采购订单的输出类型来发送IDOC了。
为了大家能更好的理解,我们来模仿这个输出过程。创建新程序,写入:
 
TABLES: nast.
DATA: rcode TYPE i.

CLEAR nast.
nast-kappl = 'EF'.
nast-objky = '4014000182'. "采购单号
nast-kschl = 'XX01'.
nast-parnr = 'I02LS'. "Partner number
nast-parvw = 'LS'. "Partner function
PERFORM edi_processing(rsnasted) USING rcode 'X'.
IF rcode IS INITIAL.
  COMMIT WORK. "发送IDOC到接收方
ENDIF.
 
上面的方法并不会在NAST留下输出记录。如果您希望能在NAST中留下一条记录,则应该这样:
TABLES: nast.
DATA: rcode TYPE i.

CLEAR nast.
nast-kappl = 'EF'.
nast-objky = '4014000182'.
nast-kschl = 'XX01'.
nast-parnr = 'I02LS'.
nast-parvw = 'LS'.
nast-spras = sy-langu.
nast-erdat = sy-datum.
nast-eruhr = sy-uzeit.
nast-nacha = '6'. "EDI
nast-anzal = 0.
nast-usnam = sy-uname.
PERFORM einzelnachricht(rsnast00) USING rcode.
IF rcode IS INITIAL.
  COMMIT WORK. "发送IDOC到接收方
ENDIF.
 
下面这种方式同样可用于触发其他方式的输出类型,比如打印输出。
 
阅读(9931) | 评论(14) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-09-20 01:03:32

今天才把这个练习做完,有了点感觉,再把书看一遍估计能有更多的收获,再次谢谢阿甘哥!

chinaunix网友2009-07-14 22:18:06

very good 继续推陈出新~~

chinaunix网友2009-07-14 16:25:21

看来已经坚持写了,加油哦,写得不错

chinaunix网友2009-07-13 16:13:02

甘哥好帅!!

chinaunix网友2009-07-13 15:32:38

阿甘出品,必属精品!