Maurice's blog - 因为专注,所以专业...
自我介绍
切换风格
订阅我的Blog
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
博客统计...
网站链接...
资源
===========================================================
abap 示范实例
===========================================================

abap 示范实例 超好的东东---申明:这文章不是我写的

在这里我给初学者示范一个实例,讲讲abap开发报表的简单过程。程序的正确与
否我们不与讨论,我们只关心这个程序的编写过程。
首先,在任何程序的开始阶段,我们都要确定将会用到的表。我们所讲的这个程序
是查询采购订单是否完成的。将会用到以下三个表:EKKO,EKPO,EKET。
程序的开头为:
REPORT TEST.
TABLES: EKKO,EKET,EKPO.
现在我们已经定义了所要用到的表,接下来的工作就是定义内表和数据。内表是
用来存储我们从上述三个表中查询到的数据。相关定义如下:
DATA: BEGIN OF ITAB OCCURS 0,
EBELN LIKE EKKO-EBELN,
MENGE LIKE EKPO-MENGE,
WEMNG LIKE EKET-WEMNG,
END OF ITAB.
现在我们已经定义完了内表ITAB。接着我们该定义数据了。数据就像C语言里的
常量。其相关定义如下:
DATA: MATNR LIKE EKPO-MATNR,
MENGE LIKE EKPO-MENGE,
WEMNG LIKE EKET-WEMNG,
EBELN LIKE EKPO-EBELN.
到这里我们已经把程序里要用到的数据和内表都定义好了。接着我们要做的工作
就是选择屏幕。所谓选择屏幕是指程序运行时,你要从屏幕上输入的内容。比如
说一个程序运行时,你输入一个物料号,就可以得到该物料的当前的库存数,那
你就要编写一个屏幕以供查询者输入查询的条件。其相关定义如下:
Select-OPTIONS: EBELN1 FOR EKKO-EBELN,
BEDAT FOR EKKO-BEDAT,
EKGRP FOR EKKO-EKGRP.
PARAMETERS: R1 RADIOBUTTON GROUP RADI,
R2 RADIOBUTTON GROUP RADI,
R3 RADIOBUTTON GROUP RADI.
现在我们已经完成了程序的前期准备,接着就开始真正的到表里查询我们需要的
相关数据了。其代码如下:
Select K~EBELN
INTO CORRESPONDING FIELDS OF TABLE ITAB
FROM EKKO AS K
Where K~EBELN IN EBELN1
AND K~BEDAT IN BEDAT
AND K~EKGRP IN EKGRP.

LOOP AT ITAB.
Select SUM( MENGE ) INTO ITAB-MENGE
FROM EKPO
Where EBELN EQ ITAB-EBELN.
MODIFY ITAB.
ENDLOOP.

LOOP AT ITAB.
Select SUM( WEMNG ) INTO ITAB-WEMNG
FROM EKET
Where EBELN EQ ITAB-EBELN.
MODIFY ITAB.
ENDLOOP.
然后我们需要定义输出界面。把我们查询到的数据输出时要有一个输出的格式,
这样大家看起来才会方便。代码如下:
TOP-OF-PAGE .
WRITE: /'采购凭证号',22 '物料号码',
47 '采购订单数量',77 '收到货物数量',
95 '完成标志'.
ULINE AT /1(130).
END-OF-PAGE .

START-OF-SelectION.
最后就是把我们查到的数据输出了。其实我举的这个程序到这一步时穿插了
一些查询,所以比较长。代码如下:
IF R1 = 'X'.
LOOP AT ITAB.
Select S~MATNR S~MENGE P~WEMNG S~EBELN
INTO (MATNR, MENGE, WEMNG, EBELN)
FROM EKPO AS S INNER JOIN EKET AS P
ON S~EBELP = P~EBELP AND S~EBELN = P~EBELN
Where S~EBELN = ITAB-EBELN.
IF ITAB-MENGE > ITAB-WEMNG.
WRITE: /2 EBELN,23 MATNR,41 MENGE,
71 WEMNG,97 '否'.
ULINE AT /1(130).
CLEAR: EBELN,MATNR,MENGE,WEMNG.
ENDIF.
ENDSelect.
ENDLOOP.

ELSEIF R2 = 'X'.
LOOP AT ITAB.
Select S~MATNR S~MENGE P~WEMNG S~EBELN
INTO (MATNR, MENGE, WEMNG, EBELN)
FROM EKPO AS S INNER JOIN EKET AS P
ON S~EBELP = P~EBELP AND S~EBELN = P~EBELN
Where S~EBELN = ITAB-EBELN.
IF ITAB-MENGE <= ITAB-WEMNG.
WRITE: /2 EBELN,23 MATNR,41 MENGE,
71 WEMNG,97 '是'.
ULINE AT /1(130).
CLEAR: EBELN,MATNR,MENGE,WEMNG.
ENDIF.
ENDSelect.
ENDLOOP.

ELSE.
LOOP AT ITAB.

Select S~MATNR S~MENGE P~WEMNG S~EBELN
INTO (MATNR, MENGE, WEMNG, EBELN)
FROM EKPO AS S INNER JOIN EKET AS P
ON S~EBELP = P~EBELP AND S~EBELN = P~EBELN
Where S~EBELN = ITAB-EBELN.
IF ITAB-MENGE > ITAB-WEMNG.
WRITE: /2 EBELN, 23 MATNR,41 MENGE,
71 WEMNG,97 '否'.
ULINE AT /1(130).
CLEAR: EBELN,MATNR,MENGE,WEMNG.
ENDIF.
ENDSelect.
ENDLOOP.
ENDIF.

LOOP AT ITAB.
IF R3 = 'X' AND ITAB-MENGE <= ITAB-WEMNG.
Select S~MATNR S~MENGE P~WEMNG S~EBELN
INTO (MATNR, MENGE, WEMNG, EBELN)
FROM EKPO AS S INNER JOIN EKET AS P
ON S~EBELP = P~EBELP AND S~EBELN = P~EBELN
Where S~EBELN = ITAB-EBELN.
WRITE: /2 EBELN,23 MATNR,41 MENGE,
71 WEMNG,97 '是'.
ULINE AT /1(130).
CLEAR: EBELN,MATNR,MENGE,WEMNG.
ENDSelect.
ENDIF.
ENDLOOP.
这时程序就结束了。其实举这个例子是想让大家知道ABAP开发报表的一个常规
流程,并不是讲什么技巧之类的,希望能对初学者有点用。


qiujun 发表于:2007.10.31 08:22 ::分类: ( ABAP ) ::阅读:(579次) :: 评论 (0) :: 引用 (0)
===========================================================
SAP技术概述(三转)
===========================================================
ESA (Enterprise Service Architecture)

ESA (Enterprise Service Architecture)

简单的说, ESA是SAP 基于SOA(Service Oriented Architecture)的概念。主要目的通过WebService, 进一步提高SAP各业务系统间的统一性, 可重用性,建议更方便的业务流程开发模式。主要手段为

建立以Service为中心的开发模式. 因为service相对于组建或者其他软件封装技术来说, 有耦合度低,跨Internet, 范围更广, 跨平台, 粒度更自由等优点。

在web service的基础上, 建立统一的service infrastructure(就是后面说到的ESI).

建立所谓“模式-驱动”的开发模式。 其实, 我的理解是,在强大的Service Infrastructure基础上, 有统一的数据类型来描述数据,有Business Object来封装逻辑, 有UI pattern来封装UI, 有了这些,就可以用一个简单的设计工具, 就可以快速的描述数据, 拼装业务逻辑,建立UI, 这就是使所谓的“模式-驱动”的开发模式,成为现实。这里指的开发, 不是简单应用的开发,而是业务流程的开发。这各设计工具, 就是Visual Composure.

先介绍几个概念:

Service:

Service就是SOA中的service概念. 它提供了企业的某个业务功能.

ESA中有三种Service:

Core Service: 提供对Business Object的直接访问, 如retrieve, access, action...

Compound Service: 由对多个core service的call组成.

Enterprise Service: 也是一种compound service, 但是它是组成Business Process的直接service. 它提供企业的关键业务功能.

Business Object:

BO可以看作是Service的实现. Service的定义和其实现无关. SAP在ESA中主要用BO实现 Service的功能.

BO是结构化的. 每个BO之间由Association连接.但是只有一个root node.

一个BO可以有多个service interface, 一个service interface由多个operation组成

BO定义了一组Attribute和Operation. 每个BO都由一个Business Object provider class 实现, 它实现了一组Generic Interface.

BO的attirbute的type必须是Global Data Types(GDT)

Global Data Type

要统一service interface的定义, 就必须统一数据类型.

Business Process:

LDU(Logical Deployment Unit)

一个LDU由一组语义相关的componenet组成, 为了可以简单的activate/deactive一个业务功能.s

Process Agent:

提供Message-Based的LDU之间的通信.

下图是ESA实现:

ESI(Enterprise Service Infrastructure) 为ESA的实现提供了基于Web Service的统一的Service定义。使“模式驱动”的开发成为可能。这种设计由需求开始, 定义服务, 服务驱动实现.

下图显示了ESA的开发模式:

ESI由三部分组成:

ESD: Enterprise Service Designtime: 提供ESI的设计时的支持。包括三个项目:

ESR(Enterprise Service Repository), 包括ES Object, Modelling, ESR Framework

ES Java Tools, 包括Repository Browser, Service and Consumer Definition Editor, Service Configuration and Consumer configuration Editor, Proxy Generation.

ES ABAP Tools: 包括Repository Browser, Service and Consumer Definition Editor, Proxy Generation

ESF: Enterprise Service Framework, 提供了ESI的运行实现。(应该叫做Enterprise Server Engine)

ESF Runtime Architecture,如图:

ESP: Enterprise Service Protocol: 定义所有ESI的协议


qiujun 发表于:2007.10.25 08:02 ::分类: ( SAP Overview ) ::阅读:(444次) :: 评论 (0) :: 引用 (0)
===========================================================
利用Visual Basic开发SAP接口程序初探-RFC
===========================================================

  SAP R/3系统是业界最先进、最稳定的ERP系统,国际和国内大型企业采用该系统的比例遥遥领先于其它ERP系统的总和。SAP R/3内建了二次开发平台,使用的开发语言叫做ABAP,是一种类似于COBOL的编程语言。ABAP在报表输出方面功能相对较弱(只能按行打印在屏幕上或者导出到Excel中处理),所以日常工作中经常需要在外部开发程序。通过程序接口自动读取SAP R/3的数据表(视图),在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。

  SAP R/3的接口方式主要有RFC、IDOC、BAPI三种,本文要介绍的是相对比较简单的RFC(Romote Function Call,远程函数调用)。SAP系统RFC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。下面是RFC调用的模型:

  本文主要不是讨论SAP R/3函数的开发,因为使用SAP的公司一般都有专门的ABAP开发人员。大家如果有机会接触ABAP平台,可以通过事务代码SE37进入ABAP开发平台的"函数编制器"进行函数开发测试。


  下面主要以VB为例介绍一下SAP接口RFC的开发思路。在SAP客户端SAP Gui Client安装的时候,注意选择安装附带的SDK包(最保险是选择完全安装)。RFC接口程序开发,主要用的是"SAP.Functions"这个控件,通过控件在外部程序模拟SAP Gui Client的用户登录和函数调用,然后返回函数的值。请看下面的程序片段和重点注解(尤其是test_Click()):

Private Sub Command1_Click()
 ' 定义R/3用户名和密码变量(用户名应由SAP管理员开运行函数的权限)
 Dim logname As String * 22, password As String * 22
 Call logonr3(logname, password) ' 调用SAP登录界面程序
 If logflag Then ' 调用生产、开发系统开关
  StatusBar1.Visible = True
  StatusBar1.SimpleText = "正在登录SAP R/3系统..."
  Dim R3AppServer As String, R3Client As String, R3SystemNo As String
  If Form2.opPRD.Value Then
   ' 以下服务器参数请根据客户配置情况更改
   R3AppServer = "10.3.1.4" ' 生产系统服务器IP
   R3Client = "800"     '生产系统集团代码
   R3SystemNo = "00" '生产系统号
  Else
   R3AppServer = "10.3.3.1" ' 开发系统服务器IP
   R3Client = "101"
   R3SystemNo = "00"
  End If
  Unload Form2 ' 释放 Form2 , 所有控件及值不可用
  Set Functions = CreateObject("Sap.Functions") ' 创建RFC的本地对象
  Set Connect = Functions.Connection ' 设置连接
  Connect.ApplicationServer = R3AppServer ' 赋值服务器IP
  Connect.Client = R3Client ' 赋值SAP集团代码
  Connect.Language = "ZH" ' 置SAP系统界面中文
  Connect.User = Trim(logname) ' 赋值SAP登录用户名
  Connect.password = Trim(password) ' 赋值SAP登录用户密码
  Connect.SystemNumber = R3SystemNo ' 赋值SAP系统号
  If Not Connect.Logon(0, True) Then ' 软件登录SAP并判断
   MsgBox "登录SAP R/3失败,请重新登录!", vbOKOnly + vbExclamation, "系统提示"
   Command1.SetFocus
  Else ' 登录SAP成功
   Command1.Enabled = False
   Command2.Enabled = True
   test.Enabled = True
  End If

  StatusBar1.SimpleText = ""
  StatusBar1.Visible = False
 End If
End Sub

Private Sub Command2_Click() ' 注销SAP登录
 Connect.LogOff
 Command2.Enabled = False
 Command1.Enabled = True
 test.Enabled = False
End Sub

Private Sub Command3_Click() ' 退出SAP接口演示程序
 If Form1.Command2.Enabled Then
  MsgBox "退出前请断开SAP R/3系统!", vbOKOnly + vbInformation, "系统提示"
 Else
  End
 End If
End Sub

Private Sub Form_Load()
 Command2.Enabled = False
 test.Enabled = False
 logoflag = False
End Sub

Private Sub test_Click() ' SAP RFC远程调用处理主演示
 Dim GetCustomers As Object
 Dim Customers As Object
 Dim i As Integer
  ' 通过RFC接口远程运行SAP内部函数RFC_CUSTOMER_GET
 ' 赋要调用的SAP内建函数名
 Set GetCustomers = Functions.Add("RFC_CUSTOMER_GET")

 GetCustomers.Exports("KUNNR") = "0000000103" ' 向函数入口赋值(客户代码)
 ' 向函数入口赋查询表名称
 Set Customers = GetCustomers.Tables("CUSTOMER_T")

 If GetCustomers.Call Then ' 调用成功遍历显示客户所有信息条目
  For i = 1 To Customers.rowcount
   MsgBox Customers(i, "KUNNR")
  Next i
 Else
  MsgBox " 搜索出错! 出错信息: " + GetCustomers.Exception
 End If
End Sub
  

SAP的RFC调用是其接口技术中最简单和易用的一种方式,该方式开发比较简便,特别适合于外部报表开发,但对于大数据量的查询效率相对较低。大家在熟练掌握后,可以进一步学习高级的IDOC和BAPI接口开发技术。

  • 来源:天极网
 查看全文
qiujun 发表于:2007.10.24 11:42 ::分类: ( ABAP ) ::阅读:(469次) :: 评论 (0) :: 引用 (0)
===========================================================
SAP技术概述(二转)
===========================================================
NetWeaver
刚刚提到, NetWeaver是取代SAP Basis的新一代技术平台(TP). 简单说, NetWeaver体现了在2000年到目前为止的以Java/SOA为主要商务应用实现技术的时代里, SAP在技术上与业界技术的整合.
它主要是在J2ee application server和ABAP application Server的基础上提供了统一的技术基础设施. 除了J2EE以外, NetWeaver还提供了WebDynpro和Portal作为 Web 开发的基础设施, 用户管理, 和.NET 或其他J2EE平台的集成, 于R/3的连接, ESA的实现等等.
所有开发都在NetWeaver Studio中进行.NetWeaver Studio是基于Eclipse 的开发环境.
下面这张图描述了NetWeaver技术平台的主要功能:


这张图显示了NetWeaver的最基本组件. 事实上整个NetWeaver几乎涵盖了所有电子商务会用到的技术, 下面简单列一下主要的部分:
 查看全文
qiujun 发表于:2007.10.24 11:18 ::分类: ( SAP Overview ) ::阅读:(500次) :: 评论 (0) :: 引用 (0)
===========================================================
SAP技术概述(一转)
===========================================================
前言:
很早就想写一点关于SAP的技术方面的文章, 但是一直不得闲, 也不知道该从哪里下手. SAP除了OS几乎生产了所有软件和solution, 并且不断在适应和加入业界的新技术, 调整自己原有的技术, 所以用一个大的概念来概括SAP的架构是很难的, 这也是为什么SAP的诸多概念, 比如mySAP, NetWeaver, ESA, AP, TP, BPP等等, 经常让人confuse的原因. 这些概念, 都有他的核心思想, 或者说核心动力, 但是, 他们不是一个产品, 而是一个概念, 所以他们的边界是无法弄的很清楚的, 不可避免, 他们之间会有Overlap. 比如DataArchiving, 它是一项负责保存应用数据的技术, 最早是在ABAP上实现的, 但是在SAP J2EE中也有实现, 所以, 它既属于NetWeaver, 也属于mySAP. 无论是mySAP, 还是NetWeaver, 他们都不是代表一项技术, 而都是代表以一组概念为核心的一整套概念.
所以我想, 一个好的办法是从SAP的技术发展历史开始讲. 讲得不对请多指教.
SAP发展历史
1972年, 五名IBM的经理人和consultant(看来工程师是永远写程序的命)离开了IBM, 在德国曼海母创建了他们自己的公司, 这就是SAP(是德文系统,应用和数据处理产品的缩写. 德国公司的名字永远这么朴素直接). (2002年4月1日是SAP 30周年纪念日)
他们创建SAP的原因是, 当时他们发现自己的客户正在自行开发类似的程序来处理业务流程. 于是他们意识到他们可以提供可重用的标准化的系统, 来集成和实现用户的业务流程, 并且, 重要的一点是他们认为电脑现实器为普及作为业务流程的关键点. 当时没有微机, 计算机最多仅有500k内存. 有趣的是, 苹果公司于同年成立.
SAP的第一个产品是一个自动化财务和交易程序.命名RF, 就是后来的R/1. (值得敬佩的是, 他们的产品是利用晚上和周末开发出来的, 而我用了6年证明, 这几乎是不可能的 :P )
1976年, SAP 迁到现在的总部所在地Walldorf.
1979年, SAP推出用于大型机的R/2.
1988年, SAP在德国上市.
1992年, SAP推出了著名的R/3. 基于C/S 模式, 统一的图形界面, 兼容关系数据库, 可以运行在WindowsNT等多种平台和计算上等先进的特性, 使SAP成为世界领先的系统提供商.
但是, 至此SAP的所有应用都是独立的, 仅仅是client加上DataBase.
1996年, 随着互联网的迅猛发展, SAP推出了支持Internet的新版R/3 3.1
1998年, 退出全新CRM和SCM解决方案.
1999年, SAP 推出所谓的mySAP Business Suit. 这其实又是新版的R/3, 但是它的应用已经不是孤立的, 它支持全面的协同的的电子商务和ERP解决方案.
现在的SAP, 是员工超过30000, 实验室分布全球的世界第三大独立软件供应商. 提供超过21个行业,13个跨行业的解决方案, 拥有18000多家客户, 5000个系统安装点, 并已进入中小型企业市场. 技术上, SAP 有自己的商业开发语言(ABAP), 有自己的application Server, 自己的开发平台. SAP几乎可以提供除OS外所有基础软件和解决方案. 其实, netweaver或mySAP的概念对我们了解SAP的技术而言并不重要, 因为SAP的技术几乎概括一切, SAP的整个架构就是一个现代IT的领先技术架构的实现. 无论mySAP 还是NetWeaver, 还是AP/TP/BPP, 都是SAP为了适应更先进技术, 而发起的对SAP总体技术框架的改造运动.
通过mySAP, SAP 实现了更方便, 更容易沟通的系统框架, 通过NetWeaver04, SAP成功的把它以前的所有技术和业务逻辑通过和J2EE平台集成而开放出来. 通过NetWeaver05 和AP/BPP/TP/ESA, SAP实现更高程度的技术/业务分离(TP/AP), 更好的业务封装(AP), 更方便的顶层业务实现(BPP). R/3到底属于NetWeaver吗, 这个问题不重要, 可以属于也可以不属于, 你只要知道R/3的业务, 在新的web application 中可以依然被使用, 并且可以更好更漂亮更方便的被使用就可以了.
领先的平台提供者
SAP其实并不是现在才想做业务平台的领导者, 自他的ABAP出世, SAP一直就是世界最先进最主流的电子商务平台提供者. 只是现在, 特别是J2EE普及之后, 人们更多的认识到平台的重要性. SAP将围绕电子商业提供三种平台:
1. 技术平台 TP(Technical Platform)也就是所谓的NetWeaver.
它提供了所以技术基础设施. 他是J2EE的扩展, 它提供的内容远远超过J2EE的范畴. 他的架构同时也包括了基于ABAP vm 的应用服务器.
2. 应用平台 (AP)
NetWeaver虽然提供了技术平台, 但是, 要用他来实现一个企业的业务流程, 根本还是件极其复杂的事. 因此必须有离应用更近的平台, 提供基础业务设施的封装. 这就是所谓的AP (Application platform). 他是由SAP的ESA(Enterprise server architecture)来实现的. 简单的说, NetWeaver加上ESA, 就是AP, 他提供了一个实现基础业务逻辑的平台.
3. 业务流程平台(BPP)
这是一个面向业务流程的平台. 基础业务逻辑可以用AP实现, 通常SAP已经提供大量基于SAP系统的业务逻辑. 同时, 第三方也可能提供业务逻辑. BPP的开发人员只需要使用BPP的开发环境(Visual composure)去组装这些业务逻辑.
现在
下面我们分别来看每个概念
SAPBasis
应该是从R/3开始(有待考证), SAP的底层已经形成基于ABAP的一个应用平台. 有统一的数据设计方案(DDIC), 界面设计方案, 开发流程, 版本控制, 数据库连接, 进程管理, 共享内存管理, 事务管理等等.它为商务的应用的编写提供了可靠的技术支持.
简单的说R/3是一个基于ABAP虚机的,基于进程(进程间通过share memory通信)的, 基于数据库的,提供事物特性的简单应用服务器。这在当时,是极为先进的架构。也只有这种架构, 是的企业级的, 可灵活改造的,可高效管理的应用成为可能。
当NetWeaver出现后, SAPBasis被改造为NetWeaver中的ABAP Application server.
mySAP(mySAP.com)
1999年9月, CEO哈索.普拉特纳宣布以”开放和集成”为中心的mySAP.com的战略. 改造技术架构和方向, 统一和整合原有的系统, 推出mySAP协同化电子商务解决方案.
当时的背景是Internet 技术趋向成熟和普及. 独立的应用之间的交流和灵活性扩展性的问题显得异常突出。业界技术的发展使得开放接口,整合产品成为共识。因此SAP决定提供可剪裁的,高度集成和开放的系统。
主要手段为:
将R/3上的业务系统划分的更细更合理, 提供不同功能的组建和系统。数据类型是统一和跨系统的。SAP制定了一系列标准接口(如BAPI),让各种应用之间可以互相通信。开发Single Sign On 来简化Authentication等等。
这张图是当时定义的mySAP.COM
现在的mySAP Business Suit是一套协同化商务解决方案套件, 它包括:
mySAP CRM(Client Relationship Management)
mySAP SCM(Supply Chain Management)
mySAP PLM(Product Lifecycle Management)
mySAP SRM(Supplier Relationship Management)
mySAP ERP(Enterprise Resource Planning).
他们可以无缝的同其他系统集成.
mySAP ERP 又提供4套单独的解决方案:
mySAP ERP Financial
mySAP ERP Capital Management
mySAP ERP Operation
mySAP ERP Corporate Service.
下面这张图描绘了mySAP Business Suit的主要构件.
NetWeaver出现之前, mySAP的技术平台应该是SAPBasis.
如今的mySAP, 已经是基于NetWeaver了, 因为SAPBasis已经被改造为NetWeaver的一部分。NetWeaver是SAP的新一代技术平台.

qiujun 发表于:2007.10.23 17:02 ::分类: ( SAP Overview ) ::阅读:(659次) :: 评论 (0) :: 引用 (0)
===========================================================
根据事务代码找User exit
===========================================================

TABLES : tstc, "SAP Transaction Codes(SAP 事务代码)
tadir, "Directory of Repository Objects(资源库对象的目录)
modsapt, "SAP Enhancements - Short Texts(SAP增强-短文件)
modact, "Modifications(修正)
trdir, "System table TRDIR(系统表 TRDIR)
tfdir, "Function Module(功能模块)
enlfdir, "Additional Attributes for Function Modules(功能模块的附加属性)
tstct. "Transaction Code Texts(事务代码文本)

DATA : jtab LIKE tadir OCCURS 0 WITH HEADER LINE.
DATA : field1(30).
DATA : v_devclass LIKE tadir-devclass.

SELECTION-SCREEN BEGIN OF BLOCK a01 WITH FRAME TITLE text-001.
SELECTION-SCREEN SKIP.
PARAMETERS : p_tcode LIKE tstc-tcode OBLIGATORY.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK a01.


START-OF-SELECTION.
SELECT SINGLE * FROM tstc WHERE tcode EQ p_tcode.
IF sy-subrc EQ 0.
SELECT SINGLE * FROM tadir
WHERE pgmid = 'R3TR'
AND object = 'PROG'
AND obj_name = tstc-pgmna.

MOVE : tadir-devclass TO v_devclass.
IF sy-subrc NE 0.
SELECT SINGLE * FROM trdir
WHERE name = tstc-pgmna.
IF trdir-subc EQ 'F'.
SELECT SINGLE * FROM tfdir
WHERE pname = tstc-pgmna.
SELECT SINGLE * FROM enlfdir
WHERE funcname = tfdir-funcname.
SELECT SINGLE * FROM tadir
WHERE pgmid = 'R3TR'
AND object = 'FUGR'
AND obj_name = enlfdir-area.
MOVE : tadir-devclass TO v_devclass.
ENDIF.
ENDIF.

SELECT * FROM tadir
INTO TABLE jtab
WHERE pgmid = 'R3TR'
AND object = 'SMOD'
AND devclass = v_devclass.
SELECT SINGLE * FROM tstct
WHERE sprsl EQ sy-langu
AND tcode EQ p_tcode.

FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
WRITE:/(12) '事务代码 - ',
13(20) p_tcode,
34(10) '功能 - ' ,
45(50) tstct-ttext.
SKIP.
IF NOT jtab[] IS INITIAL.
WRITE:/(95) sy-uline.
FORMAT COLOR COL_HEADING INTENSIFIED ON.
WRITE:/1 sy-vline,
2 'Exit Name',
21 sy-vline ,
22 'Description',
95 sy-vline.
WRITE:/(95) sy-uline.

LOOP AT jtab.
SELECT SINGLE * FROM modsapt
WHERE sprsl = sy-langu AND
name = jtab-obj_name.
FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
WRITE:/1 sy-vline,
2 jtab-obj_name HOTSPOT ON,
21 sy-vline ,
22 modsapt-modtext,
95 sy-vline.
ENDLOOP.

WRITE:/(95) sy-uline.
DESCRIBE TABLE jtab.
SKIP.
FORMAT COLOR COL_TOTAL INTENSIFIED ON.
WRITE:/ '用户出口数量:' , sy-tfill.
ELSE.
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE:/(95) '此TCode没有用户出口!'.
ENDIF.
ELSE.
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE:/(95) '事务代码不存在!'.
ENDIF.

AT LINE-SELECTION.
GET CURSOR FIELD field1.
CHECK field1(4) EQ 'JTAB'.
SET PARAMETER ID 'MON' FIELD sy-lisel+1(10).
CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.


qiujun 发表于:2007.10.23 17:01 ::分类: ( ABAP ) ::阅读:(314次) :: 评论 (0) :: 引用 (0)
===========================================================
RFC 同步异步调用实例
===========================================================
CALL RFC synchronize and asychronize Examples

同步调用RFC 示例
*&---------------------------------------------------------------------*
*& Report sapbc415_rfcsync_s1 *
*& *
*&---------------------------------------------------------------------*

REPORT SAPBC415_RFCSYNC_S1 MESSAGE-ID BC415.

TABLES SPFLI.

PARAMETERS: ICARR LIKE SFLIGHT-CARRID DEFAULT 'LH',
ICONN LIKE SFLIGHT-CONNID DEFAULT '0400',
DEST LIKE RFCDES-RFCDEST DEFAULT 'NONE'.

DATA: SYSID LIKE SY-SYSID,
MESS(80).

CALL FUNCTION 'BC415_RFC_READ_SPFLI'
DESTINATION DEST
EXPORTING
CARRID = ICARR
CONNID = ICONN
IMPORTING
EX_SPFLI = SPFLI
SYS = SYSID
EXCEPTIONS
INVALID_DATA = 1
COMMUNICATION_FAILURE = 2 MESSAGE MESS
SYSTEM_FAILURE = 3 MESSAGE MESS.

CASE SY-SUBRC.
WHEN 1.
WRITE: / TEXT-001.
EXIT.
WHEN 2.
WRITE: / MESS.
EXIT.
WHEN 3.
WRITE: / MESS.
EXIT.
ENDCASE.

WRITE: / TEXT-004, SYSID COLOR 5.
SKIP.
WRITE: SPFLI-CARRID, SPFLI-CONNID, SPFLI-CITYFROM, SPFLI-CITYTO.

异步调用RFC示例
*&---------------------------------------------------------------------*
*& *
*& Report sapbc415_rfcasync_s1 *
*& *
*&---------------------------------------------------------------------*

REPORT SAPBC415_RFCASYNC_S1 MESSAGE-ID BC415.

TABLES SPFLI.

PARAMETERS: ICARR LIKE SFLIGHT-CARRID DEFAULT 'LH',
ICONN LIKE SFLIGHT-CONNID DEFAULT '0400',
DEST LIKE RFCDES-RFCDEST DEFAULT 'NONE'.

DATA: SYSID LIKE SY-SYSID,
MESS(80),
FLAG,
RETCODE LIKE SY-SUBRC.

CALL FUNCTION 'BC415_RFC_READ_SPFLI'
DESTINATION DEST
STARTING NEW TASK 'T1'
PERFORMING BACK ON END OF TASK
EXPORTING
CARRID = ICARR
CONNID = ICONN
EXCEPTIONS
COMMUNICATION_FAILURE = 2 MESSAGE MESS
SYSTEM_FAILURE = 3 MESSAGE MESS.

CASE SY-SUBRC.
WHEN 2.
WRITE: / MESS.
EXIT.
WHEN 3.
WRITE: / MESS.
EXIT.
ENDCASE.

WAIT UNTIL FLAG = 'X'.

CASE RETCODE.
WHEN 0.
WRITE: / TEXT-004, SYSID COLOR 5.
SKIP.
WRITE: SPFLI-CARRID, SPFLI-CONNID, SPFLI-CITYFROM, SPFLI-CITYTO.
WHEN 1.
WRITE: / TEXT-001, / TEXT-002.
WHEN 2 OR 3.
WRITE MESS.
ENDCASE.


*---------------------------------------------------------------------*
* FORM BACK *
*---------------------------------------------------------------------*
* --> T *
*---------------------------------------------------------------------*
FORM BACK USING T.

RECEIVE RESULTS FROM FUNCTION 'BC415_RFC_READ_SPFLI'
IMPORTING
EX_SPFLI = SPFLI
SYS = SYSID
EXCEPTIONS
INVALID_DATA = 1
COMMUNICATION_FAILURE = 2 MESSAGE MESS
SYSTEM_FAILURE = 3 MESSAGE MESS.

RETCODE = SY-SUBRC.

FLAG = 'X'.

ENDFORM.

RFC函数原型
FUNCTION BC415_RFC_READ_SPFLI.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(CARRID) LIKE SFLIGHT-CARRID OPTIONAL
*" VALUE(CONNID) LIKE SFLIGHT-CONNID OPTIONAL
*" EXPORTING
*" VALUE(EX_SPFLI) LIKE SPFLI STRUCTURE SPFLI
*" VALUE(SYS) LIKE SY-SYSID
*" EXCEPTIONS
*" INVALID_DATA
*"----------------------------------------------------------------------
SELECT SINGLE * FROM SPFLI INTO SPFLI_WORKAREA
WHERE CARRID = CARRID
AND CONNID = CONNID.
IF SY-SUBRC EQ 0.
EX_SPFLI = SPFLI_WORKAREA.
ELSE.
MESSAGE E007 RAISING INVALID_DATA.
ENDIF.
SYS = SY-SYSID.
ENDFUNCTION.


qiujun 发表于:2007.10.23 16:51 ::分类: ( ABAP ) ::阅读:(365次) :: 评论 (0) :: 引用 (0)
===========================================================
在updata物料主数据时,对相关VIEW的权限check方法.
===========================================================

Check for maintenance status (STATM) according to the mapping lists as below

View

Maintenance status(STATM)

Work scheduling

A

Accounting

B

Classification

C

MRP

D

Purchasing

E

Production resources/tools

F

Costing

G

Basic data

K

Storage

L

Forecasting

P

Quality management

Q

Warehouse management

S

Sales

V

Plant stocks

X

Storage location stocks

Z

for example:

AUTHORITY-CHECK OBJECT 'M_MATE_STA'
ID 'STATM' FIELD 'D'
ID 'ACTVT' FIELD '02'.
IF sy-subrc <> 0.
MESSAGE s398 WITH 'You have not authorization on MRP view!'.
STOP.
ENDIF.


qiujun 发表于:2007.10.23 13:39 ::分类: ( ABAP ) ::阅读:(256次) :: 评论 (0) :: 引用 (0)
===========================================================
精辟的英文
===========================================================

一篇转自my space的文章,看起来很精典。

* From see you one eye,I shit love you.
* 自从看到你的第一眼,我便爱上你。
* Your eyes close, I die; your eyes open, I come back to live.
* Your eyes close and open again and again, I die again and again.
* 妳的眼睛闭上,我就死了,你的眼睛打开,我又活过来,
* 妳的眼睛贬啊贬,我就死去活来?
* Maybe you do not remember me, no matter.
* When you carefully look at me, you will one see clock.
* 也许你不记得我,没有关系,当你仔细看着我,你就会一见钟情.


qiujun 发表于:2007.10.15 22:08 ::分类: ( 杂事、开心事 ) ::阅读:(2536次) :: 评论 (0) :: 引用 (0)
===========================================================
用BAPI_MATERIAL_SAVEDATA对MRP Controller(MM01的MRP1视图中)作change的方法
===========================================================

FORM change_mpr_controller .
DATA: st_headdata LIKE bapimathead ,
st_plantdata LIKE bapi_marc ,
st_plantdatax LIKE bapi_marcx ,
st_return LIKE bapiret2 .

LOOP AT it_tab.
CLEAR: st_headdata, st_plantdata, st_plantdatax, st_return.
st_headdata-material = it_tab-matnr .
st_headdata-mrp_view = 'X' .

st_plantdata-plant = it_tab-werks .
st_plantdata-mrp_ctrler = it_tab-new .

st_plantdatax-plant = it_tab-werks .
st_plantdatax-mrp_ctrler = 'X' .

* Call Function to change the MRP Controller.
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = st_headdata
plantdata = st_plantdata
plantdatax = st_plantdatax
IMPORTING
return = st_return.

IF st_return-type = 'E' OR st_return-type = 'A'.
CLEAR it_err.
MOVE-CORRESPONDING it_tab TO it_err .
it_err-errmg = st_return-message .
APPEND it_err.
CLEAR it_err.
DELETE it_tab INDEX sy-index.

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = '1'.
ENDIF.
ENDLOOP.

ENDFORM. " change_mpr_controller


qiujun 发表于:2007.10.15 07:45 ::分类: ( ABAP ) ::阅读:(494次) :: 评论 (0) :: 引用 (0)
===========================================================
使用VIEW_MAINTENANCE_CALL维护tableview
===========================================================

REPORT ztest.
TABLES t001b.
TYPES:
BEGIN OF ty_mkoar,
mkoar TYPE mkoar,
END OF ty_mkoar.

DATA: it_vimsellist TYPE TABLE OF vimsellist,
iw_vimsellist TYPE vimsellist,
it_vimexclfun TYPE TABLE OF vimexclfun,
iw_vimexclfun TYPE vimexclfun.
DATA: it_mkoar TYPE TABLE OF ty_mkoar,
iw_mkoar TYPE ty_mkoar.
DATA: w_flg TYPE c.

PARAMETERS p_bukrs TYPE t001b-bukrs.

SELECT-OPTIONS: s_mkoar FOR t001b-mkoar.

START-OF-SELECTION.

SELECT mkoar
INTO CORRESPONDING FIELDS OF TABLE it_mkoar
FROM t001b
WHERE mkoar IN s_mkoar.

*编辑过滤数据条件
iw_vimsellist-viewfield = 'BUKRS'.
iw_vimsellist-operator = 'EQ'.
iw_vimsellist-and_or = 'AND'.
iw_vimsellist-value = p_bukrs.
APPEND iw_vimsellist TO it_vimsellist.

LOOP AT it_mkoar INTO iw_mkoar.
iw_vimsellist-viewfield = 'MKOAR'.
iw_vimsellist-operator = 'EQ'.
iw_vimsellist-and_or = 'OR'.
iw_vimsellist-value = iw_mkoar-mkoar.
APPEND iw_vimsellist TO it_vimsellist.
CLEAR iw_mkoar.
ENDLOOP.
*屏蔽按钮(按T-CODE)
iw_vimexclfun-function = 'NEWL'.
APPEND iw_vimexclfun TO it_vimexclfun.
iw_vimexclfun-function = 'KOPE'.
APPEND iw_vimexclfun TO it_vimexclfun.
iw_vimexclfun-function = 'DELE'.
APPEND iw_vimexclfun TO it_vimexclfun.

CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'U'
view_name = 'V_T001B'
TABLES
dba_sellist = it_vimsellist
excl_cua_funct = it_vimexclfun
EXCEPTIONS
client_reference = 1
foreign_lock = 2
invalid_action = 3
no_clientindependent_auth = 4
no_database_function = 5
no_editor_function = 6
no_show_auth = 7
no_tvdir_entry = 8
no_upd_auth = 9
only_show_allowed = 10
system_failure = 11
unknown_field_in_dba_sellist = 12
view_not_found = 13
maintenance_prohibited = 14
OTHERS = 15.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.


qiujun 发表于:2007.10.05 10:16 ::分类: ( ABAP ) ::阅读:(301次) :: 评论 (0) :: 引用 (0)