Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3154315
  • 博文数量: 238
  • 博客积分: 864
  • 博客等级: 军士长
  • 技术积分: 2940
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-08 23:01
个人简介

Mobile: 135 8576 5961 / WeChat: IM_WILLIAM_C / Mail: william.chen.cn@outlook.com /

文章分类

全部博文(238)

文章存档

2018年(2)

2016年(35)

2015年(47)

2014年(104)

2013年(38)

2012年(12)

分类: IT业界

2014-07-05 21:37:02

SAP PO相关打印编程
 1.PO打印

通常企业打印PO有两种方式,一是套打(由印刷厂商印制好一式多联的格式以备打印的PO送给相关部门,比如采购部,供应商,财务部,仓库等保存),另一种就是直接打印在A4纸上.不管哪种方式,可直接写一个外挂程序或使用SAP配置来打印,谁优谁劣无可非议只要能正确将东西打印出来就行.
在打印报表的问题上我个人很喜欢Crystal report因为能很容易定义所需要的各种复杂格式,遗憾的是SAP系统似乎要装插件才支持Crystal report.
使用外挂程序或配置,就要使用到所谓的Form(SAPscript)或Smartform,当然另外一种方法就是使用OLE to Excel,在Excel定义好格式然后填充数据.
好了,下面就PO打印配置谈谈如何设置PO打印.
PO打印设置难吗?显然是非常容易的,从某种意义上讲,你不做任何配置实际SAP已经提供了default的output NEU打印PO了.
让我们看看图1.(Tcode:ME21N|ME22N)

[1]首先必须让此PO输出一个所谓的Message,在此此message是print output .
[2]打印预览
按Messages进入图2.

[1]按Communication method进入图3. 
[2]Processing log你能看到调用的程序名称如是打印能看到产生的Spool no.号(有一种case是系统hang up了上万个打印请求结果造成Spool buffer溢出,所以basis有必要定期去清理下)
SAP默认是使用程序SAPFM06P的子程序ENTRY_NEU处理打印message的,这在配置中可做适当更改如果有需要的话,毕竟SAP是程序堆起来的改改是很正常的.
[3]进去后Requested processing栏位的Dispatch time选 4 Send immediately就表示立即发送消息.
[4]通常如需要重新打印,可选择一已经存在的Output 后再按它copy一个.当然也可使用ME9F重打.
[5]NEU是打印PO,SAP default的,接下来会告诉如何自定义output type. 为什么需要自定义output type?是在一个大集团公司,可能存在有各种PO的打印格式并且可能需要各种不同的语言版本.
[6]在此选1 print output,你也可看到Message实际上可发送到printer, Fax,Mail, EDI和触发PO的workflow事件等,举个简单的例子,供应商要求建立PO后立即自动将PO数据EDI到他们的系统就可配置EDI Message ,关于EDI有专门解剖的一刀.
[7]Partner,SAP经常有sold-to,ship-to,billing-to伙伴,VN是vendor.
[8]这个语言在一些跨国集团可能用的上,假设公司间的transfer order格式相同,但是希望法国公司打印的是法文,德国打印的是德文,中国是中文,美国是英文,要么你为每种语言版本定义一个output type要么就在程序中判断这个语言字段,而后者可能更好些,因为你只要使用SO10定义标准文本就行.
让我们切换到图3.
[1]Tcode:SAPD可设置打印机
[2]立即打印出来
[3]你还可使用别的Form(通常不能在此使用smartform,除非你大肆修改后台配置)

大家可能对PO打印已有了初步了解,是的,不管是套打还是打印在A4上,都是可通过PO的message来完成的.
(1)PO header及其Item文本设置
IMG Path:Materials Management->Purchasing->Purchase Order
如图

[1]定义Header text type.

如上图,如企业需要可以增加自己的header text type,这些 text type在建立PO时可看到如图5.
[2]我们看看SAP default的header text type 06.如下图. 1表示取文本的顺序. 2表示文本能否被Fix(修理修改),空和*表示能修改,空表示修改Source object不会影响到PO text,*表示修改文本立即自动反映到PO text, N表示文本从source object自动取得不能修改.在下面将进一不描述.

[3]定义item text type.
[4]如下图,是text type 03的设置,1表示取数据顺序,Seq.为0似乎是表示不用它,特别要强调以下这个No.加前坠将会成为文本ID标识. 2.表示数据源,从图中我们能看到PO的Materiap PO text文本取数据先从物料主数据的basic data text中读取(在basic data 1视图进去维护),然后是读取Purchase order text(物料主数据专门有一个View)的数据,就是说你建立PO line text 03将自动从物料主数据将这些东西抓过来3.表示文本能否被更改.

当定义好Header 和line Text type后,在建立PO时我们就能在这些文本中填写数据.如图5,可能企业需要在PO中加入各种类型文本,并且这些文本可能被随时更改,这种情况下我想使用固定程序恐怕相当麻烦.
就需要使用相关配置,然后在程序中调用这些文本.

1根据欧美的相关合同法,PO上通常需要打印T&C(Terms*Condition),以便万一有经济纠纷时可参照当时打印出的文本条款,很明显,T&C是针对不同的Vendor是经常被修改的.另外PO上的运输方式也可能经常变更,这种复杂的业务使用文本就可解决.
2 让我们更深入了解下PO文本的保存情况,在SAP中,大多数的文本比如PO,SO,Billing等各种相关文本都保存在STXH,STXL中,我们根据一定规则将它读出来,这些规则在稍后会继续细讲,回答那个Fix 标识.N表示从source object抓出来后你不能再做修改,因此从文本STXH,STXL表中By PO item是查不到数据的,*表示文本抓出来你还能修改,当自动抓取数你去做更改后才会保存早STXH,STXL中, By PO item可以读取,这样在编程序就必须注意首先根据PO item读数据如没读到再到物料主数据中去找. 详细请看SAP文本.
(2)PO Message配置

[1]应该不会这么快就忘记建立PO header/Line text type的Seq. no.加上F前坠就是Text ID ,这步通常是不用做的除非你使用SAP标准的,因为PO将使用

[2]分配Form和相关Output程序给PO,在第[3]步讨论,因为在定义PO output type时包括了这部分的配置.
[3]打开Output control发现配置和MM/SD的定价条件相似,是的,所谓的condition技术用在在Message output,MM/SD Pricing,FI Tax IMG等,而且他们共享了很多配置表,我想SAP是因为他们逻辑上相似所以将他们组织在一起. 通常的情况下是比如要设置PO一建立好就自动打印,否则就需要想第一步更改PO哪些重要字段后会自动重打PO,兼于篇幅,在此就不讨论了,这个问题留给读者自己去考虑,在这里只讨论如何Copy出新的output type .因为用户可能需求不同的打印格式.
一.新增Output type Message .
IMG Path:Output Control->Message Types->Define Message Types for Purchase Order.

如图6.
[1]Copy All data from NEU to ZUSA.
[2]Output type可用在Print, Fax,EDI等上.
[3]Output调用的程序,默认是SAPFM06P
[4]使用的子程序,默认是ENTRY_NEU
[5]打印调用的FORM
[6]在此我加了个Smartform,很明显默认是不会认Smartform的,除非你将第3步的SAPFM06P Copy出(比如是ZSAPFM06P)再将ENTRY_NEU修改,这要费点事情,还是使用Form吧
二.Define (定义)Message Schema for Purchase Order
IMG Path:Output Control->Message Determination Schemas

[1]选定procedure RMBEF1.
[2]将ZUSA加上.
[3]特别要强调一下,关于这个requirement在MM/SD的pricing配置中将会重点介绍,这个将对应到一个子程序比如你可设置子程序返回值为True打印否则不打印.
使用Tcode VOFM>菜单Requirements->output control|OMFT|V/27可自定义requirements,简单理解就是Control message,只有需求满足才输出消息.
三.建立条件记录MN04
OK,是否现在就可使用这个output type了呢?回答是不能的,我们想象SD pricing后台配好了你要还使用VK11呀,同样,你必须使用MN04为此output type建立一条件记录.

这些基础工作都搞定了,下面来吹下如何coding …Coding是TMD世界上最无聊的工作之一,Salary有低,,哎….
To be continued .
….改天继续将所有的打印给屠宰一遍.
(3)物料主数据文本
BADI也是enhancemnet的一种,可以在SE19中建立自定义的Implementation name激活系统自带的badis,系统的badis可以在SE18中看。这个东东很好玩哟,要不要我教你玩呀?
SE75可看到所有的相关文本.

物料主数据中有很多Text(文本),比如有两个视图Purchase order text和Sales text,在basic data1视图中单击Basic data text按钮或直接点击Additional data按钮能看见
Basic data text和Inspection text两tab页,在此可写入一些相关信息,这些信息没别的,就是将来可用在打印PO或SO上而已(更详细请看MM相关单据打印).
如图3.2.3-1,在purchase order text中保存了9行数据,每行使用回车键分开.

当物料保存时,SE16检查STXH和STXL, 图3.2.3-2是STXL表的结果,注意画红圈的字段,数据以binary格式保存在STXL字段CLUSTR里.
1.其实STXL就是一个所谓的簇式数据库(一个有特定结构的透明表),详情请看第一篇的第12节簇数据库和逻辑数据库.
2.注意簇数据库和簇表的区别.簇数据库(ABAP层的概念)是透明表对应一个SAP系统用的数据库的一个物理表,


REPORT  ZMATTXT  .
data: itab_head like thead ,
      itab_line like tline occurs 0 with header line .
CALL FUNCTION 'READ_TEXT'
  EXPORTING
***ID: 1.BSET:Purchase Order Text(物料视图)
***    2.GRUN:Basic Data Text(从additional data按钮进去)
***    3.PRUE:Inspection Text
***    4.0001:Sales Text
    ID                           = 'BEST'
    LANGUAGE                     = SY-LANGU
***对1.2.3是Name就是mat. no.
***4sales text对应的name是Mat. no+sales org.+dist.chann.
    NAME                         = 'SL62ABPLS49H1535'
***1.2.3是MATERIAL,4是MVKE.
    OBJECT                       = 'MATERIAL'
IMPORTING
   HEADER                        = itab_head
  TABLES
    LINES                        = itab_line
EXCEPTIONS
   ID                            = 1
   LANGUAGE                      = 2
   NAME                          = 3
   NOT_FOUND                     = 4
   OBJECT                        = 5
   REFERENCE_CHECK               = 6
   WRONG_ACCESS_TO_ARCHIVE       = 7
   OTHERS                        = 8 .
*check sy-subrc eq 0 .
***此例是读出materail master data的purchase order text .
***PO text可有多行,使用Enter键分行,所以使用内表.   
Loop at itab_line.
   write :/ itab_line-tdformat,'|',itab_line-tdline.
endloop .

***下面是读出mat. master data的sales text的例子.
***注意NAME是物料(补满18位)+Sales org.+dist. chann.     
data: itab_sohead like thead ,
      itab_soline like tline occurs 0 with header line . 
CALL FUNCTION 'READ_TEXT'
  EXPORTING
    ID                           = '0001'
    LANGUAGE                     = SY-LANGU
    NAME                         = 'SL62ABPLS49H1535  510001'
    OBJECT                       = 'MVKE' "Sales text是MVKE
IMPORTING
   HEADER                        = itab_sohead
  TABLES
    LINES                        = itab_soline
EXCEPTIONS
   ID                            = 1
   LANGUAGE                      = 2
   NAME                          = 3
   NOT_FOUND                     = 4
   OBJECT                        = 5
   REFERENCE_CHECK               = 6
   WRONG_ACCESS_TO_ARCHIVE       = 7
   OTHERS                        = 8 .
Loop at itab_soline.
   write :/ itab_soline-tdformat,'|',itab_soline-tdline.
endloop .  

阅读(10324) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~