What are the differences between “TYPE” and “LIKE” keyword?

When doing Code Inspector Check for an ABAP program, an error message is given to indicate that using TYPE instead of LIKE while declaring variables and tables. is there any difference between "TYPE " and "LIKE" keyword?

There is no difference between "TYPE" and "LIKE" keyword in the aspect of performance. Most of the time it depends on your coding habits.

When "TYPE" is used, a data element, a domain, a component of a structure/ transparent table, a structure , a transparent table or a table type follows. However, when "LIKE" is used, a flat structure must be followed. You cannot use internal tables, strings, references or structures as components.

TYPES dtype

If a data type type or a data object dobj is specified, dtype assumes all the properties of the specified data type or data object. type can be a non-generic type from the ABAP Dictionary, to which in particular the structure of a database table also belongs, or it can be a public type of a global class or a non-generic data type of the same program that has already been defined by TYPES. dobj can be a data object visible at this point that has already been declared. Within a procedure, generically typed formal parameters cannot be specified for dobj.

If a reference is made to a data type in the ABAP Dictionary, its primary components are converted to predefined ABAP types according to the table of predefined types in the ABAP Dictionary.

The data objects that you can reference with LIKE include the public attributes of global classes, as well as the data objects of the program itself.

How to display sub-totals in ALV Grid List?

Assume that you are using REUSE_ALV_GRID_DISPLAY function.
In order to make it happen, you need to setup the following two parameters:
it_fieldcat-do_sum = ‘X’.  " Which columns are going to have a summary number.
it_sort-subtot    = ‘X’.  " Which columns are the factors of Sub-total summary numbers.

ABAP Collect应用

语法:COLLECT [<wa> INTO] <itab>.

Collect 的用法与Append基本一样,不同之处在于,Append会把工作区数据附加在内表最后一行,而Collect则会判断所有非数字字段,即非P,I,N类型字段,将工作区数据的数字字段累加至与非数字字段完全相同的内表中的数据行。

例如:
DATA: BEGIN OF ITAB OCCURS 3,
         COLUMN1(3) TYPE C,
         COLUMN2(2) TYPE N,
         COLUMN3     TYPE I,
      END OF ITAB.
ITAB-COLUMN1 = ‘abc’. ITAB-COLUMN2 = ’12’. ITAB-COLUMN3 = 3.
COLLECT ITAB.
WRITE / SY-TABIX.
ITAB-COLUMN1 = ‘def’. ITAB-COLUMN2 = ’34’. ITAB-COLUMN3 = 5.
COLLECT ITAB.
WRITE / SY-TABIX.
ITAB-COLUMN1 = ‘abc’. ITAB-COLUMN2 = ’12’. ITAB-COLUMN3 = 7.
COLLECT ITAB.
WRITE / SY-TABIX.
LOOP AT ITAB.
   WRITE: / ITAB-COLUMN1, ITAB-COLUMN2, ITAB-COLUMN3.
ENDLOOP.

结果如下:
         1
         2
         1
abc 12           10
def 34            5

ABAP Describe Field应用

DESCRIBE 语句一共有三类用法,先简述一下 DESCRIBE FIELD的用法:
Field Properties 1. DESCRIBE FIELD …
Properties of an Internal Table 2. DESCRIBE TABLE …
Distance Between Two Fields 3. DESCRIBE DISTANCE …

Field Properties
作用:对一个Elementary data的属性进行描述,就是说可以通过这条语句知道某一个data的类型、长度、小数点、输出长度等信息。语法如下。
DESCRIBE FIELD dobj
   [TYPE typ [COMPONENTS com]]
   [LENGTH ilen IN { BYTE | CHARACTER } MODE]
   [DECIMALS dec]
   [OUTPUT-LENGTH olen]
   [HELP-ID hlp]
   [EDIT MASK mask].
1. … TYPE typ [COMPONENTS com]
DESCRIBE FIELD data1 TYPE typ1 COMPONENTS com1.
运行结果是data1的类型被存储在typ1变量里,com1则存放了data1里面有几个子元素。
2. … LENGTH ilen IN { BYTE | CHARACTER } MODE
DESCRIBE FIELD data1 LENGTH ilen IN BYTE CHARACTER MODE.
运行的结果是data1定义的长度存在了ilen里。
3. … DECIMALS dec
DESCRIBE FIELD data1 DECIMALS dec.
运行的结果是如果data1是小数,dec则存放了小数点后的位数。
4. … OUTPUT-LENGTH olen
DESCRIBE FIELD data1 OUTPUT-LENGTH olen.
运行的结果是data1的输出长度存在了olen里。
5. … HELP-ID hlp
DESCRIBE FIELD carrid HELP-ID hlp.
如果data1是由ABAP Dictionary 里的data element决定,data1的数据类型就会被存放在 hlp里。
6. … EDIT MASK mask
DATA: time     TYPE s_fltime,
       seconds TYPE i,
       msk     TYPE string.
DESCRIBE FIELD time EDIT MASK msk.
seconds = 333.
WRITE seconds USING EDIT MASK msk.

转载:hi.baidu.com/%CD%F8%D0%A1%D3%E3/blog/item/583323e9614a163ab80e2d10.html

SAP ABAP编程开发语言入门

1. 什么是ABAP?

      Advanced business applicationprogram = ABAP (高级业务应用程序开发工具)目前最新版本是ABAP/4。一般说来,我们可以理解ABAP为一种开发语言,仅应用于SAP R/3系统内部,作为二次开发的最主要工具,也是所有SAP R/3应用的基础。但是ABAP从严格意义来讲,并不仅仅是开发语言,ABAP是一套完整的C/S结构的应用程序开发框架,包括服务器端的运行时环境,客户端的交互界面以及ABAP开发工作中所需的一切开发工具,SAP R/3系统中绝大部分应用程序都是通过ABAP进行二次开发,并且SAP R/3系统中已经包含了大量可以复用的函数和标准程序。

abap-1-1

ABAP程序组成结构

      SAP公司最初开发ABAP/4语言仅为内部使用,为应用程序员提供优化的工作环境。经过不断的改进和修改以满足商业领域的需要。现在, ABAP/4 已成为SAP开发所有自己的应用程序的仅有工具,并且在实施过程中,也由实施方的开发人员为客户提供定制化开发,以满足个性化需求。

      ABAP/4 是第四代支持结构化程序设计的语言。它与JAVA, C#一样,包含控制结构和模块化概念。同时,它也支持面向对象的程序设计方法,这就为ABAP的应用开发开拓了更广阔的空间。不仅如此,它还可以和其他编程语言的集成应用,如VB,JAVA,C/C++等。ABAP与VB累死,具有解释执行的特点,但是ABAP又同时与JAVA等相同,具有编译后生成编译过对象的特点,其编译的结果将缓存在数据库中,多次执行时提高性能。

2. ABAP可以做什么?

      ABAP可以用来编写报表程序,用于集中展现综合或明细的业务数据
      ABAP可以用来编写表单打印,用于套打格式纸张或打印单据
      ABAP可以用来编写用户交互程序,用户可以通过屏幕、控件实现业务功能操作
      ABAP可以用来编写接口程序,本地数据或外部系统数据可通过接口交换
      ABAP是SAP R/3系统中最重要的开发工具, R/3系统中各个模块的应用系统都是ABAP开发的,因此在SAP R/3系统中,ABAP就是神。

3. 什么人使用ABAP开发?

      SAP ERP实施项目中,开发人员根据用户的需求开发程序满足其业务需要,对于标准模块中的程序,在其无法满足用户需求的情况下,开发人员也将对其进行修改。ABAP开发人员通常被称为:SAP ERP开发顾问。

4. 如何学习ABAP?

      参加SAP、企业内部或第三方提供的认证培训或技术培训
      购买ABAP开发指南类的书籍自学
      从网上下载电子图书(质量参差不齐,最好的还是官方的培训教材的PDF版)

SAP 程序设计

推荐1《SAP程序设计》

实战SAP程序开发

推荐2《实战SAP程序开发》

abap-1-2

推荐3《BC400~BC480系列教程》(SAP官方)

Requirements Management(需求管理)

需求管理的目的是管理一个项目中的需求并且鉴别需求、计划与产品之间的差异。需求管理实践包括变革管理(Change Management)和可追溯性(Traceability)两个方面。[1]

介绍(Introduction)

    需求管理包含关于权衡(Balance)、沟通(Communication)与调整(Adjustment)的一切内容。为了避免需求分析中一个类超越自身而覆盖了另一个类的功能,团队中成员之间始终如一(Constant)的沟通指关重要。例如,在内部应用的软件开发中,业务需求往往强烈到可能因此而忽略了用户需求,或让人认为在创建用例的时候,用户需求已经了解清楚了。

可追溯性(Traceability)

    需求的可追溯性与需求的全程文档相关。若要达到可追溯性的要求,我们应当保证可以追踪到最初的原始需求以及每一次需求的变更都被记录下来。甚至应当将保证在软件系统完成部署并投入使用之后产生的需求具有追踪的可能。[2]

    需求来自不同的源头,如业务中购买产品的用户、市场经理和实际用户。这些人对软件产品有不同的要求。使用需求可追溯性原则可以保证实现的功能可以被对应到需求分析时需要此功能的个人或是组织。这种方法可以在开发过程中用于区分需求的优先级,判断对于某用户需求的价值。在部署之后当对用户调查(User Study)发现某个功能未被使用时,这种方法还可以帮助我们找到原先该功能需求被列入开发计划的原因。

开发中的阶段(Stages of Development)

    在开发过程的每个阶段中,都有一些关键的需求管理活动和方法。假设我们使用一个五阶段的开发流程:调研(Investigation), 可行性分析(Feasibility),设计(Design),开发与测试(Construction and Test)和发布(Release)。

调研(Investigation)

    调研时,最初的需求是来自用户(Users)、公司(Business)、开发团队(Development)的。我们要在这三个方面问一些同样的问题:如目标是什么,有什么限制,正在使用的工具或流程等。只有当这些需求非常清晰了,我们才能开始功能需求分析地工作。

    这里提一点需要注意的地方:不管开发团队多么努力,在项目的初始阶段,需求都无法被完整的定义出来。一些需求会改变,可能是很简单的原因:不想做了,或者是项目组内部或外部的力量影响。因此,一开始的时候,团队成员必须就适应性是成功的重要因素这一点,在思想和行动上达成一致。

    分析阶段(Analysis Stage)的交付件是一个得到所有团队成员认可的需求文档。在后续阶段中最为激烈的开发阶段,这份文档被用于指导开发,避免功能范围扩张(Scope creep)或不必要的变更。随着系统开发的进展,每一个新的功能都将极大的增加新的可能性,因此需求说明(Requirements specification) 将把控方向,将团队共识固定在原有的意见上,并允许团队对范围变更进行受控的讨论(Controlled discussion)。

    当大多数开发组织仍然仅仅使用文档管理需求的时候,一些人已经开始使用软件工具管理需求基线(Requirements baseline)。这些工具使用数据库管理需求,并具有自动追溯(如:链接需求的父子关系、需求与测试用例的对应关系等)、需求基线的建立、版本控制和变革管理的功能。通常这种工具具有导出的功能,可以将需求信息导出到标准文档。

    可行性分析(Feasibilty)

可行性分析阶段,需求成本(Cost)明确下来。For user requirements, the current cost of work is compared to the future projected costs once the new system is in place.(未翻译) 我们此时应该问这样的问题:“什么样的数据错误增加我们的成本?”,或者“当前操作界面上操作错误(Operator Error)的成本是多少?”确实,新软件的需求常常由公司财务部门的人发现的这些问题而引发。

    业务上的成本应包括诸如此类的问题:“哪个部门的预算为这个项目支付费用?”“市场对于新软件产品应用的预期回报率是多少?”“开发一个新的、易用的系统,我们可以在培训和支持上减少成本而产生的内生投资回报率是多少?”

    技术上的成本与软件开发和硬件成本相关。“我们有没有合适的人选进行开发?”“Do we need new equipment to support expanded software roles?”(未翻译)最后的这个问题是非常重要的一类。开发团队必须调查清楚这种最新的自动化工具是否能提供足够的处理能力,将用户的工作转移到系统上,从而节省人的时间(People time)。

    这些问题也指出了需求管理中的一个基本点。人和工具组成一套系统,这种情况在以电脑或电脑软件为工具的情况下非常重要。人的大脑擅长于并行处理和通过部分数据判断趋势。而CPU则擅长于串行处理并且进行精确的数学运算。因此对软件项目进行需求管理的总体目标就应该是保证自动化的工作被分配到合适的处理器上。例如:“不要让用户记住他在软件的哪个界面上,而是让软件随时告诉用户正在系统的那个地方。”或者“不要让用户在两个界面上输入相同的数据,而要让系统保存数据,并在第二个屏幕中自动填充。”

    可行性分析阶段的交付件是预算(Budget)和项目计划(Schedule for the project)。

设计(Design)

    假设我们已经精确估算了成本并且具有足够大的利润空间,项目可以推荐到设计阶段。在设计阶段,需求管理的主要工作是比对设计的结果与需求文档,以保证正在进行的工作没有超出范围。同样,适应性是成功的至关重要的因素。有一个关于项目进行中范围变更比较成功的故事。在二十世纪八十年代初期,福特汽车的设计师认为在八十年代末期,汽油的价格将达到每加仑3.18美元。但是在Ford Taurus的设计过程中,汽油价格确围绕在1.5美元每加仑波动。设计师们决定如果汽油价格持续保持较低的水平,他们可以设计一款更大、更舒适并且更强大的汽车。当这款车在全国发售的时候创下了销售记录,主要原因就是其宽大的车身和舒适的驾驶体验。

    然而在大多数情况下,如此程度的背离原始需求会导致问题。因此需求文档成为帮助团队在设计时考虑变更非常重要的工具。

开发与测试(Construction and Test)

    在开发与测试的阶段,需求管理的主要工作是要保证工作和成本控制在计划与预算中,于是出现了一些工具实现这一需求。一个在这一阶段主要的工具是原型开发和迭代测试。对于软件应用程序,在软件还在架构的时候,用户界面就可以以纸面的形式呈现给潜在的用户,并进行测试。这些测试的结果将被记录在用户界面设计意见中并在界面设计的时候提交设计团队。这样做可以节省他们的时间并且让工作更容易开展。

版本管理(Release)

    你可能认为在产品发布的时候,需求管理就结束了。这样理解并不准确。从这一点开始,与用户接受性(Application’s acceptability)相关的数据需要被收集起来,可以在一个版本调研阶段使用。因此,这一过程又开始了。

工具(Tools)

    目前市场上已经有桌面和基于Web的需求管理工具。

INCOSE maintains a database of project tools including Requirements management tools

    建模语言(Modeling Language)

系统工程建模语言SysML包含了需求图表的定义,开发人员可以以图形的方式组织、管理和追踪需求。  

    参考(Reference)

  1. Pressman, Scott. Software Engineering: A Practitioner’s Approach. Sixth Edition, International, p 180. McGraw-Hill Education 2005
  2. Gotel, O., Finkelstein, A. An Analysis of the Requirements Traceability Problem Proc. of First International Conference on Requirements Engineering, 1994, pages 94-101

    原文:http://www.wiki.cn/wiki/Requirements_management

     翻译:Alex

ALM(application lifecycle management)应用程序生命周期管理

  Application lifecycle management (ALM) 就是 应用程序生命周期管理,以下简称ALM。

    ALM 的关注点在于将软件交付的全部过程看做一个连续的、可重复的过程:定义、设计、开发、测试、部署和管理。过程中的每个部分都需要认真对待,进行监控。

好处(Benifits)

    ALM应用的支持者们认为

  • 提高生产率,整个团队共享开发和部署的最佳实践(Best Practices)过程,而开发人员则只需要关注具体的业务需求(Business Requirement)
  • 提高质量,是最终交付的应用程序满足用户的期望(Expectation)
  • 打破合作过程中的壁垒,是信息流(Information flow)通畅(smooth)
  • 通过简化的集成方案加速(Accelerate)开发
  • 使设计与应用程序保持同步从而降低维护时间(Maintenance time)
  • 使发生在技能(Skill)、流程(Process)、技术(Technology)方面的投资最大化
  • 通过降低组装与修改程序所需时间提高应用程序应对业务变更的灵活性

原则(Principles)

    ALM应用的原则是一个成熟的开发规范中必不可少的部分。经验丰富的开发团队通过应用这些原则来保证他们的产品质量。ALM应用涉及到软件开发项目中多个部分的工作:

  • 项目管理(Project Management)
  • 项目追踪(Project Tracking)
  • 需求计划(Requirements Planning)
  • 设计与开发(Design and Development)
  • 质量保证(Quality Assurance)
  • 版本管理(Release Management)

历史(History)、支持者(Proponents)和先驱(Precursors)

    在应用程序开发过程的不断演变中,越来越多的工具出现在我们面前。最初的时候,人们使用一些单独的开发工具开发软件,那个时代,一些简单的软件集合被松散的集成在一起。现在,我们有了更先进、更综合的生命周期管理工具,这些新的工具集成度很高,并且为ALM过程中各个角色提供了扩展的余地。最近的一项创新是围绕ALM 2.0的一些讨论,它们描述了一个可以满足目前大多数开发社区的应用程序开发基础框架结构。[1]

    由于软件开发的复杂度(Complexity)和混合度(Sophistication)的增长,现在已经有很多工具软件与之相配合。最初以版本控制软件为核心的工具集合已经向外扩展到更多方面。然而,至今仍然没有一个定义ALM工具范围的行业标准,而ALM应用翻盖的清单却越来越长,通常人们接受的清单如下:

  • 需求可视化(Requirements Visualization)
  • 需求管理(Requirements Management)
  • 建模(Modelling)
  • 设计(Design)
  • 项目管理(Project Management)
  • 变革管理(Change Management)
  • 配置管理(Configuration Management)
  • 编译管理(Build Management)
  • 测试(Testing)
  • 版本管理(Release Management)
  • 部署(Deployment)
  • 监控与报告(Monitoring and Reporting)

    集成开发环境(Integrated Development Environment, IDE)正在进化,开发这些工具的厂商正在逐步将它们的产品集成到IDE中。而IDE也不再仅仅是编写纯代码的工具,具备了涉及到架构、部署、管理等开发周期中的阶段:应用程序生命周期。这些IDE的特征就是通过面向普通用户的界面和接口、元数据模型和流程引擎,允许ALM团队成员使用标准的架构核技术进行沟通,如UML。

    [1] The Changing Face of Application Lifecycle Management by Carey Schwaber, Forrester Research, Inc. August 2006.

    原文http://en.wikipedia.org/wiki/Application_Lifecycle_Management

翻译:Alex

SAP ABAP程序优化方法

关于SQL语句的性能
作者:神话 日期:2005-11-22
字体大小: 小 中 大

DATA: BEGIN OF it_mara OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF it_mara.
第一种写法:
Select matnr
INTO it_mara
FROM mara.
APPEND it_mara.
ENDSelect.
第二种写法(high performace):
Select matnr
INTO TABLE it_mara
FROM mara.
==========================================
DATA: BEGIN OF it_mara OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF it_mara.
DATA: BEGIN OF it_makt OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF it_makt.
第一种写法:
LOOP AT it_mara.
Select SINGLE maktx
INTO it_mara-maktx
FROM makt
Where matnr = it_mara-matnr AND
spras = sy-langu.
MODIFY it_mara TRANSPORTING maktx.
ENDLOOP.
第二种写法(high performace)
Select matnr maktx
INTO TABLE it_makt
FROM makt
FOR ALL ENTRIES IN it_mara
Where matnr = it_mara-matnr and
spras = sy-langu.
=========================================

1 数据——>工作区,工作区——>内表,
2 数据——>内表
很明显少了一个过程 效率自然高了 如果数据量越大,效果是可想而知的
=========================================
1 每遍历内表一下 都要select一下 select 本身就是循环 循环套循环 时间消耗度是n*n
2select出已经存在内表中的所有满足条件的值 不敢说时间消耗度是n*n 但至少时间上大大地打了一下折

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

http://www.itpub.net/488487,2.html (from itpub 作者:tzhueng)

前一阵子刚好调整了公司自行开发的ABAP,列出一些我的经验:

1.首先是找出有问题的程序:
一般查询程序执行时间只要超过100秒(这是观察SAP标准程序的效率值)以上这些程序就是要Tune的可以透过T-CODE:SM50 或 T-CODE:SM37 去找资料,分析在线或是背景执行有哪些ABAP 很慢

2.程序效能分析
T-CODE:SE30 程序执行时间分析,找出程序慢的部份,执行完程序可以区分三个阶段的执行时间:
ABAP、Database、System,这三个部份对效能的优先级为Database -> System -> ABAP
要依序排除程序这些部份的问题。一般建议上线前Basis 一定要先审核这个数据是OK才让该ABAP
上线,否则一上线会拖垮整个主机效能反而更麻烦。

3.Database 效能分析
一般来说自行开发的程序大部份对数据库的有效率存去都会忽略,这部份可以透过检查索引、调整程
式语法改善,在SE30分析程序可以看出哪些Table花费的成本最高,针对程序中这些SQL语法进行检查:
首先要检查索引,程序中的Where字段在Table index是有满足,如果没有Index,就要评估该报表
执行频率,如果很高就要建一个索引(T-CODE:SE11)给它用,否则就应排背景于非上班时间执行。

可以透过 ST05 去追踪SQL Performance,如此可以看到程序中SQL使用的,有时Table明明有可以
符合 SQL 使用的Index可是程序还是不依该Index Query Data,这是系统判断错误,这时可以使用
数据库特有的语法指定Index执行。

Oracle 指定Index 的范例语法为:
SELECT carrid connid cityfrom
FROM spfli INTO (xcarrid, xconnid, xcityfrom)
WHERE carrid = ‘LH ‘ AND cityfrom = ‘FRANKFURT’
%_HINTS ORACLE ‘INDEX("SPFLI" "SPFLI~001")’.
^^^^^ ^^^^^^^^^
Table Index ID

4.系统资源的控制
当DB的问题处理完成后,就要注意程序对系统资源使用的控制了,ABAP中不能无限制的使用系统内存,有些大量耗用内存的程序是可以透过程序技巧调整的,还有就是用完了要清。

5.心得:目前大部份自行开发的部份都是上面的问题,调整完后,就很少有ABAP会对主机造成负担,希望上列的处理步骤可以协助大家。

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

http://www.itpub.net/showthread.php?s=&threadid=376666

(from itpub 作者:jumpwater)

ABAP开发注意:SELECT-ENDSELECT尽量不要用,至少不要滥用

ABAP中支持一种SELECT-ENDSELECT的结构,就是可以在SELECT中对取得的每一行数据可以先放入一个行结构中,再做处理。
初看似乎觉得蛮有用的,的确这个结构本身就是为了方便处理数据的。但是,如果你滥用了这种结构,那么会严重影响程序性能。
我接触过的一个报表程序就是用了这种结构,结果系统运行半年后,这张报表就不能用,原因是什么呢?就是因为数据量大了之后,在SELECT和END SELECT之间做处理的时间会很长,从而导致数据库端因为连接超时而断开。
由此可以判断,SELECT-END SELECT语句在整个过程中是保持数据库连接的,对数据库绝对是个负担。
所以,在大数据量处理的报表中,不能用SELECT-END SELECT这种写法。
经过调整后,那张报表速度有所提高,至少不会被数据库踢掉了。

(kingrule)provide/endprovide 是对内表的数据再次进行操作,下面是一个使用的例子:
DATA: BEGIN OF SE OCCURS 3,
FROM TYPE D,
TO TYPE D,
NAME(15) TYPE C,
AGE TYPE I,
END OF SE,

BEGIN OF PR OCCURS 4,
START TYPE D,
END TYPE D,
PRICE TYPE I,
NAME(10) TYPE C,
END OF PR,

BEGIN OF SH OCCURS 2,
CLOSED TYPE D,
STR(20) TYPE C,
OPENED TYPE D,
END OF SH VALID BETWEEN OPENED AND CLOSED,

BEGIN TYPE D VALUE ‘19910701’,
END TYPE D VALUE ‘19921001’.

SE-FROM = ‘19910801’. SE-TO = ‘19910930’.
SE-NAME = ‘Shorty’. SE-AGE = 19. APPEND SE.
SE-FROM = ‘19911005’. SE-TO = ‘19920315’.
SE-NAME = ‘Snowman’. SE-AGE = 35. APPEND SE.
SE-FROM = ‘19920318’. SE-TO = ‘19921231’.
SE-NAME = ‘Tom’. SE-AGE = 25. APPEND SE.

PR-START = ‘19910901’. PR-END = ‘19911130’.
PR-NAME = ‘Car’. PR-PRICE = 30000. APPEND PR.
PR-START = ‘19911201’. PR-END = ‘19920315’.
PR-NAME = ‘Wood’. PR-PRICE = 10. APPEND PR.
PR-START = ‘19920318’. PR-END = ‘19920801’.
PR-NAME = ‘TV’. PR-PRICE = 1000. APPEND PR.
PR-START = ‘19920802’. PR-END = ‘19921031’.
PR-NAME = ‘Medal’. PR-PRICE = 5000. APPEND PR.

SH-CLOSED = ‘19920315’. SH-STR = ‘Gold Avenue’.
SH-OPENED = ‘19910801’. APPEND SH.
SH-CLOSED = ‘19921031’. SH-STR = ‘Wall Street’.
SH-OPENED = ‘19920318’. APPEND SH.

PROVIDE NAME AGE FROM SE
NAME FROM PR
* FROM SH
BETWEEN BEGIN AND END.

ENDPROVIDE.

(jumpwater)楼上的用法偶不知道唉,学习ING
可是似乎你是对内表进行操作么

(xiamingkang)支持楼上所说,一开始看ABAP语法是就觉得这种做法会影响性能。以下是我的见解,不知对不对:
SELECT – ENDSELECT 其实相当于在一个LOOP中反复查询,从所周知,在SELECT语句中条件越多查询性能越差,而且数据量越大,速度越慢,暂不谈断开链接的问题,光是查询时若数据量在几百MB或GB数量级,光使用SELECT就要花费大量的时间,后台数据库SQL2000(本人搞这玩意的),在查询时就需要耗时,虽然SAP有自己的OPEN SQL,但处理时也必须将OPEN SQL语句转换成SQL2000认识的语句才能在SQL2000上执行。
所以建议大家在使用时正如 kingrule 所讲的,建一内表,先将需要的数据INTO,再进行处理,这样在大数量级的处理上就有明显的性能优势。

(kingrule)SELECT — ENDSELECT . 这个用法其实是把数据放在一个结构中,然后通过循环使用的。但是使用内表后,那相当于是放在一个缓存中,然后在这个开辟的缓存空间中再次进行循环使用,这样,就可以减少搜索数据的时间,当然,要使用内表里面的数据(我指的是需要使用每一行数据),还是要通过LOOP — ENDLOOP.来操作的,不过,你可以在LOOP 前,做一个 SORT ITAB BY KEY1的操作,而且在LOOP AT ITAB WHERE 条件,还可以这种用法,真的是很好用的。

SELECT — ENDSELECT.的方法,是针对透明表进行操作的, PROVIDE —- ENDPROVIDE.是针对内表进行操作的,这是两个不同的用法。

(jumpwater)减少对数据库的操作是ABAP开发需要注意的地方,SAP发明出了内表并且有那么多操作内表的语句,目的恐怕就是想避免频繁的数据库访问吧。

用SE38编辑程序时,可以通过Environment-Examples-Performance Examples看到有很多性能优化的资料,针对常用的语句进行了对比分析,作为ABAPer应该好好看看。

SAP编程ABAP/4系统字段

SY-SUBRC:语句执行后的返回值,0表示成功
SY-DATUM:当前服务器日期
SY-UZEIT:当前服务器时间
SY-ULINE:255长度的水平线
SY-VLINE:垂直线
SY-INDEX:循环说执行的次数
SY-TABIX:内表循环的次数
SY-DYNNR:当前Screen号
SY-MANDT:当前登录的Client号
SY-STEPL:返回当前操作的屏幕行号(Table Control)
SY-LOOPC:当前表格控件在屏幕中的总行数(Table Control)
SY-UCOMM:PAI所出发的功能代码
SY-DYNNR:当前屏幕号
SY-MSGID:Message Class
SY-MSGNR:Message Number
SY-MSGTY:Message Type
SY-MSGV1~4:Message Variant
SY-LINCT:REPROT语句中设定的LINE-COUNT
SY-LINSZ:REPROT语句中设定的LINE-SIZE
SY-SROWS:当前窗口的列表行数
SY-SCOLS:当前窗口的列表栏目数
SY-PAGNO:当前页的页码
SY-LINNO:当前选定行的行号
SY-COLNO:当前选定列的列号
SY-LSIND:当前列表索引,第一级列表为1
SY-LILLI:选择某行时光标行位置
SY-CUROW:选择某行时光标列位置