ABAP基础-动态数据对象

ABAP基础-动态数据对象,第1张

ABAP的动态数据对象包括字段符号(filed symbols)和数据引用(data reference)两种形式。

普通数据对象的寻址静态地通过该对象名称进行;而上述两种数据对象则只有在运行时,系统才知道该数据对象的名称和属性,并进行寻址。

在程序运行期内可将数据对象分配给字段符号。成功分配后,使用字段符号或其所代表数据对象本身,是没有任何区别的。换句话说,如果用赋值语句修改字段符号的值,字段符号所代表的数据对象本身的值也随之改变。

声明字段符号需使用 FIELD-SYMBOLS 语句,基本语法格式如下

FIELD-SYMBOLS <fs> [ TYPE type | LIKE dobj ]

声明字段符号时可以指定类型,该类型决定了运行时何种数据对象可以被分配给一个字段符号,此处可以指定一般性类型和完全限定类型,如果不指定类型,则系统默认该字段符号为一般性类型ANY。

字段符号声明之后,可以进行字段分配,所分配的数据对象应符合字段符号定义时的类型说明。字段符号可以反复进行分配,且分配方式有静态和动态之区分。

在将数据对象分配给字段符号的过程中,可以进行类型的强制转换,即所有数据对象都可以被视为一个特定类型。强制类型转换通过ASSIGN语句中的CASTING附加项指定,该选项的出现意味着可以将一个与字段符号指定类型不兼容的数据对象赋给字段符号。强制类型转换分为显式和隐式两种情况。

如果一个字段符号的类型是完全指定的,或者是ABAP内置类型C,N,P,X之一,可以使用下列格式实现隐式强制类型转换 ASSGIN f TO <fs> CASTING 当字段分配后,无论其原始数据对象类型如何,系统内表都按照字段符号定义类型对分配的数据对象进行处理。

程序中使用的所有数据对象均存储在运行时分配的内存中,每一个对象均对应有其起始的内存地址,该地址是由编译器分配的,一般不能被随意 *** 作。数据对象的内存地址也常常被称作引用。通常情况下,声明数据后,程序通过数据对象的名称对其进行 *** 作,然而有时也通过字段符号或者引用通过其他地址进行 *** 作。

在ABAP中,引用以数据引用和对象引用两种形式存在。

引用变量中包含地址引用,是指向其它数据对象的指针,其实际内容代表某数据对象的内存地址,在ABAP程序中是不可见的。引用类型定义和引用变量声明的语法格式如下:

TYPES t_dref TYPE REF TO DATA

DATA dref TYPE REF TO DATA

引用变量在ABAP作为结构类型的组件时可以被视为时普通基本类型,即引用变量可以作为复杂类型的结构组件或者独立出现。

引用变量声明时没有指向任何数据对象,因而也不能进行解除引用 *** 作。下述 *** 作可以使该引用对象指向实际的数据对象。

数据引用变量之间可以相互赋值,目标对象和源引用变量指向相同的数据对象,但不能将对象引用或非引用对象的值传递给引用变量。

所有通过DATA语句创建的数据对象都属于静态创建的数据对象,当程序开始运行时,这些变量已经存在。要在程序运行期间动态的创建对象,可通过数据引用变量进行。

CREATE DATA dref TYPE type | LIKE obj

该语句在运行期间内动态创建一个数据对象,同时引用变量dref指向这一对象。该对象没有名称,只能通过数据引用变量进行寻址,但在 *** 作该数据对象之前,需要通过字段符号解除引用。当没有任何数据引用变量指向该对象时,他将被sap中的垃圾收集装置从系统内存中删除。

在该语句中,必须指定数据类型。也可以通过变量动态的指定所创建的数据对象类型,这种指定类型的方式在所有ABAP语句中是唯一的。

CREATE DATA dref TYPE (name) 此处的变量name中包含具体的类型名称(如“C”)。

使用GET语句可以使一个引用变量获得已经存在的数据对象的地址引用。

GET REFERENCE OF obj INTO dref

其中obj可以是一个通过DATA语句定义的静态变量,也可以是指向某数据对象的字段符号。如果将引用变量指向一个过程内部的局域变量,则该变量在离开过程后将不能再使用,也不能进行解引用 *** 作。

解除引用是访问引用所指向的数据对象的前提,ABAP数据引用变量的解引用语法格式如下 ASSGIN dref-> TO <fs> [CASTING ]

该语句将数据引用变量dref指向的数据对象赋给字段符号,如果 *** 作成功,系统字段SY-SUBRC将返回0。系统将检查数据对象类型是否与字段符号声明类型相匹配,且该过程中可能出现强制类型转换。如果数据引用变量的值为初始值或者不正确,则无法进行解引用 *** 作,字段符号将保持原值不变,而系统字段SY-SUBRC将返回。对于动态创建的数据对象,解引用是获取其内容的唯一方式。

SAP系统(systemsandproctsindataprocessing),又称企业管理解决方案,其功能为:借助软件程序为企业定制并创建管理系统,对企业的人力资源、物流运输、销售服务、交易支付、产品规格及质量、生产活动、原材料采购、货物仓储及库存管理等全部经营活动与环节,实施监督、分析及管理,形成数据化的资源管理系统,为企业生产、决策、组织运营提供指导及依据,有利于企业财务管理质量的提升,有利于企业资金的合理分配。

SAP系统是一套企业资源管理软件系统,具有现代化、信息化、智能化的应用优势,能够为企业管理问题的解决提供参考意见,同时可以为企业发展做出系统规划,其在现代化商业发展中的应用也开始受到了诸多企业用户的青睐,其在企业信息化建设中的应用,更是能够简化企业管理流程,节约企业建设资源。

采用SAP系统后,与原有的传统财务管理模式相比,企业的财务管理机制得到了创新与提升,对财务管理部门工作人员的专业能力也提出了新的标准与要求,SAP系统的核算难度高、应用范围广,只有财务人员不断提高自身专业素养及工作能力,才能发挥出SAP系统在财务管理工作中的应用优势,降低和防范财务风险。

具体的可以在程序属性的程序类型选择列表里面看到,主要是下面这几类:

1、可执行程序 (stand-along program类型为 1) ,特点是可以直接执行,而无需事务码,这个也是一般报表开发最常用的程序类型。

2、为屏幕绘制器画出的屏幕所用的模块池 (module pool程序类型为 M) ,包含了来自业务的屏幕模块的处理步骤,它只能通过事务码或者菜单功能调用。

3、包含程序 (include program程序类型为 I) ,包含了不能独立运行的程序代码,也就是说,无论你是在 SE38 里用执行功能还是通过事务码或菜单调用,都无法打开一个包含程序。它们的作用主要是让程序变得清晰和可以被重用,在其他程序里,用 INCLUDE 语句可以把一个包含程序加到程序里。最终的效果相当于用被包含的程序里的全部内容替换调 INCLUDE 语句。

4、子程序 (subroutine pool程序类型为 S) ,这种类型的程序里只包含被外部 PERFORM 语句调用的程序块。也就是说,只包含形如 FORM ENDFORM 块的程序代码,从外部程序里,用 PERFORM IN PROGRAM [IF FOUND] 来调用。

5、函数组 (function group程序类型为 F) ,这类程序包含了函数模块。函数组和函数模块用函数制作器进行管理,事务码 SE37。在创建函数组和函数模块时,函数制作器把程序类型设置为 F。

6、接口池 (interface definitions程序类型为 J) 包含了接口。类和接口都在类制作器中管理,事务码 SE24。

7、类池 (class definitions程序类型为 K) ,包含了类。类和接口都在类制作器中管理,事务码 SE24。

可执行程序的特点是可以直接执行,而无需事务码,这个也是一般报表开发最常用的程序类型。我们可以在SE38中直接点击执行按钮或按F8键来运行一个可执行程序。

可执行程序包含一些预定义的过程块,比如、ATSELECTION-SCREEN、START-OF-SELECTION、END-OF-SELECTION等等,有一个后台系统程序会控制可执行程序,按照规定的顺序依次调用这些过程块。首先显示一个选择屏幕,最后输出一个列表。可执行程序还能指定一个逻辑数据库,逻辑数据库也是一种程序,它按照预定义好的数据库表结构,依次根据主键读取相关的业务数据,可以用SE36查看逻辑数据库。

首先,在测试环境直接修改东西是十分不妥贴的。要严格遵守开发环境开发然后传输到测试环境的方式。传输错误是因为你在测试环境修改了这个工作流,那么他就会被LOCK到了你产生的TransportRequest中,这样其他系统过来的TR就不能覆盖这个工作流了。你要么删掉现在在测试环境产生的TR或者将LOCK在TR中删除。

ABAP的一些特性。

1、ABAP/4 支持商业数据类型和 *** 作。您可以用特殊日期和时间字段进行计算。系统会自动执行必需的类型转换。

2、ABAP/4 报表程序用于分析数据库表中的数据。这种分析的结果可以显示在屏幕上或发送到打印机上。逻辑数据库支持报表程序。

3、ABAP/4 允许您定义和调用子程序。也可以调用其他程序的子程序。参数能够以各种方式从子程序传递或传递到子程序。

4、ABAP/4 包含一种特殊子程序,叫做功能模块。您可以在中央库中创建和维护功能模块。在调用程序和子程序之间功能模块有一个明确定义的数据接口。它们能够以调用程序的独立模式进行分别测试。

5、ABAP/4 包含一个叫 Open SQL 的SQL子集。用Open SQL,您可以读取和访问数据库表,与所用的数据库系统无关。

6、ABAP/4将对话程序组织为包含对话模块的模块池。每个动态程序(由一个屏幕及其流逻辑组成的“动态程序”)都基于一个ABAP/4 对话程序。流逻辑包含对 ABAP/4对话模块的调用。

ABAP的一些优点。

1、ABAP/4是面向对象语言。它支持封装性和继承性。封装性是面向对象的基础,而继承性则是建立在封装性基础上的重要特性。

2、ABAP/4具有事件驱动的特性。

3、ABAP/4和COBOL具有类似之处。

4、ABAP/4适合生成报表。

5、ABAP/4支持对数据库的 *** 作。

LSMW是SAP导入数据的一种工具,最大的好处就在于它的灵活性,举一个例子来说:不同的物料类型在主数据上有不同的字段,同一个字段有的物料类型上是隐藏的,有的必选的。这种场合用CATT或BATCHINPUT就有麻烦了。因为他们都只能根据制定好的画面来输入,如果你导入的数据没有这个值,那就会出错,我想这个观点你们都能理解的,那么怎么才能把数据导入呢?而不需要另外再创建更多的不同情况的catt和batchinput,那就是LSMW如:在某一个字段上进行编程,代码如下(这段代码是具有通用性的,你们只要在用的时候把字段名改一下就可以了:

IFNOTLINE_ITEM-MWSKZISINITIAL

BBSEG-MWSKZ=LINE_ITEM-MWSKZ

ENDIF

这句话的意思是:如果这个字段在我输入的文件中没有出现,那么就不要考虑导入这个字段。举一个财务凭证的例子。事务代码:fb01输入一张财务凭证。Debit:10010100---100现金科目,这个科目在screenlayout里只定义了显示profitcenter字段而不是成本中心字段。Credit:费用科目55010101---这个科目只定义了costcenter字段,而没有利润中心字段,这样的话,如果用batchinput录下来的其他类型的凭证,可能这两个字段都没有显示在输入凭证的画面,这样的话,如果用bi或CATT就会报错,说这两个字段找不到。明白了么?

局限在于,LSMW只能导入那些固定类型的主数据,比如,MATERIALMASTER,FINANCIALDOCUMENTGLACCOUNT等等,如果你自己创建了一个ABAP程序,是用来输入自己的一种主数据,那他就不能实现。不过我想,大多数我们需要导入的主数据已经被包含在这里边了。当然一批修改值他也可以办到。只要把默认的TRANSACTIONCODE改为你需要的就可以了。下面我就用图形的方式来STEPBYSTEP的教给大家如何 *** 作。我还是用财务凭证来给大家说明吧,因为财务凭证的描述性比较强。所需要的导入的文件格式我放在另外的一个文件中。

公用的一个内表只会绑定在1个CR上,比如CR A

你描述的CR B中也使用了该内表,

传输时应注意先传输CR A 再传输CR B

如果确实这样做的且传输CR时没有报错,

试着 REBUILD下,在se80中的fg或者Package上右键就能找到

如果再不行刷BUFFER

以上就是关于ABAP基础-动态数据对象全部的内容,包括:ABAP基础-动态数据对象、学习abap和sap和erp系统开发学习资料或视频、ABAP 程序有哪些类型等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9851584.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存