和小白一起学ABAP – 10 SAP程序设计之 ABAP基础
2014-07-11 10:46
330 查看
写在前面:
人生本就是悲喜交加,而我们也总需不停的去尝试去突破,那怕奋斗的过程里常跌到灰头土脸撞至焦头烂额,但不论如何亦比坐以待毙怨天尤人强多了。生活怎可奢求一帆风顺呢,它本就是温水煮蛙慢慢荼毒,对人攻城略地的,若人意念不稳,便会被其凌驾,让其腐蚀。所以,行走于素锦阡陌,最是需坚定。
ABAP语言是真个SAP系统的基础开发工具和技术平台,专为各种商业应用的开发而设计,具有批数据处理、货币格式转换、用户界面设计以及多语言支持等特性。ABAP语言也在不断的发展,不仅包含了事件的驱动机制,模块化技术,还有完整的面向对象思想。
![](https://img-blog.csdn.net/20140711102455343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140711105544025?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这里想重点介绍一下SAP运行时内存的状况。相信了解了下面这张图,就会了解SAP在运行时的一个情况,对SAP程序有了一个微观上的了解。
![](https://img-blog.csdn.net/20140716205716156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140716205946000?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
再详细说明一下:
SAP运行时内存可以大致分为两部分:SAP内存和ABAP内存。其中SAP内存是所有会话都可以访问的内存区域,因此SAP的各个会话之间就可以通过SAP内存达到内存,实现数据的共享。ABAP内存中的数据只能供每个主会话使用,并且数据的存储顺序是按照程序的调用序列,以栈的形式存储,当被调用程序执行完成,进行出栈操作,返回被调用的程序。
这里说的主会话,是指用户用户和服务器之间的会话,当用户登录SAP系统,就建立了一个主会话,通过SAP GUI可以同时打开6个主会话,这6个主会话之间有各自的ABAP内存,几乎没有任何的联系。
内部会话是存在于主会话中,可以认为是可执行的程序,这部分可执行程序加载在ABAP内存中,一个主会话可以包含多个内部会话,但是只有当前的内部会话是活动的。
ABAP程序的调用序列分为两种情况:一种是新建的内部会话(被调用程序)会完全取代调用程序,及时被调用程序,执行完成,也不会返回调用程序。新建的内部会话会将原来会话的内存清楚,这种情况和其他编程语言有些不同。第二种情况就与其他编程语言一样,调用程序与被调用程序之间以栈的形式存放在内存中。
![](https://img-blog.csdn.net/20140716224337611?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
ABAP的数据类型可以分为三类:基本类型,复杂类型和引用类型。所谓的引用类型,是系统中没有定义的,需要开发人员在实际应用中自己定义,主要是指向其他对象的指针对象。
![](https://img-blog.csdn.net/20140711105704209?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140716222351884?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这里要明确数据类型和数据对象的区别:
数据对象是数据类型的实例,如果把数据类型比作汽车模型,那数据对象就是一个个根据这个模型生产出来的跑在马路上的真的汽车。、
上图已经能充分说明了数据类型和数据对象的区别,这里要说明的时数据对象可以基于匿名类型,比如定义10个长度的C类型,就属于匿名类型。
![](https://img-blog.csdn.net/20140716224641656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
上图已经能清晰的说明ABAP内置的基本数据类型。这里需要说明的是:
如果程序声明一个数据对象时,不指明其类型,则系统默认是C类型。
ABAP语言中不存在布尔类型数据,因此条件判断的功能往往是通过单字节C类型来完成。习惯上,如果条件满足赋值为‘X’。
值得说明的一点是,ABAP的日起类型很强大,比如,Java要判断某一年是否为闰年,需要一段复杂的逻辑处理,而在ABAP中,一句代码轻松搞定。这也侧面的反映了,ABAP作为一种商务上的语言,为商务逻辑处理提供了很大的方便。
![](https://img-blog.csdn.net/20140716225006566?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
在ABAP中使用Types语句定义内部数据类型,使用DATA语句声明变量,两个语句很类似,但是Types不能赋初始值。
这里要说明的是,我们在写代码的时候,良好的代码风格,不仅看起来舒服,日后他人或自己再回看自己代码的时候,也是一种享受。每个公司都有自己的一套代码风格和命名习惯,但是差距不大,有时候正式这些不起眼的细节,才能体现一个人的功力。
命名习惯:
数据类型或对象最多不能超过30个字节;
名称由数字,字母,下划线组成,第一个必须为字母,最好见名知意。
不能使用内置类型的名称和系统数据对象的名称。和系统的命名区别开来,否则,有时候出问题都不知道是怎么死的
![](https://img-blog.csdn.net/20140716224823421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
数据字典的作用范围要比通过Types定义的数据类型的范围要大得多。它能作用于整个SAP系统。
先来说明数据元素和域的区别:
数据元素是构成结构和表的基本组件
域,定义了数据元素的技术特性,如长度,小数位等。
数据字典中,每一个数据元素必须属于一个域。
数据字典中也定义了一些内置的数据类型,这些需要日常工作中基类,只有用到了,才印象深刻,这里只简单介绍几个
CUKY 货币代码,CURR 货币金额,ACCP 会计结算周期等等。
当然,我们也可以自己创建数据元素,事务代码 SE11,SE80.
![](https://img-blog.csdn.net/20140716225107203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图中已经描述的很清楚,这里说一下系统数据对象,比如Sy-datum 系统日期,sy-uzeit 系统时间等,不用声明,直接使用。
![](https://img-blog.csdn.net/20140717221149468?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这里有几点要说明:
ABAP语言中有两种赋值语句,Move和“=”,两种形式是完全等价的,对于结构体之间的赋值,若源结构与目标结构完全相同,则会把源结构的值直接复制到目标结构中,对于源结构和目标结构有部分相同的组件,此时可以使用Move-corresponding,此时只能在同名的组件间赋值。
ABAP语言中,除了时间类型D和T之间不能相互转换,其他类型都可以。这是其他高级语言不具备的,
在ABAP中,内表对象之间也可以赋值,但是要求源内表与目标内表之间的内表行是兼容的,对关键字行的重复性要求也要相同。
ABAP程序对空格都有着严格的要求,有时候一段代码怎么看都没有问题,这时候就要想,是不是某个位置没有空格,这一点在写代码的时候尤为注意。
ABAP的输出语句格式化输出有很多种形式,有时候我们没有办法记住所有的参数,这时候就可以调用系统的帮助,记住万能的F1哦。。。
ABAP中有一个IS操作符,使用方法,图中已经很明确的提出,这里不再复述。
![](https://img-blog.csdn.net/20140711105839978?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这里要说明的是:
ABAP的分支控制是IF...ENDIF,CASE...ENDCASE,并不是if...else,也没有switch。
ABAP的循环控制中,有一个系统字段sy-index是一直记录循环的次数,这个在其它语言中是没有的。
注意循环中止的三个关键词之间的区别。
![](https://img-blog.csdn.net/20140711110006480?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
ABAP中当不声明类型时,默认的就是字符类型,因此,处理字符型数据对ABAP尤为重要,字符串的连接,分割,查找字串,字串位移等等。
在连接字符串中CONCATENATE,有一个系统的字段记录连接状态,这个字段是sy-subrc,如果连接后的字符超出了长度的限制,此时返回值为4,否则返回0。
在字串的查找过程中,如果找到,sy-subrc返回0,sy-fdpos返回该字串的便宜位置,如果没找到,sy-subrc返回4.
![](https://img-blog.csdn.net/20140711110045464?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
内表,是一种强大的大批量数据管理形式,主要用在,当程序运行期间,存储多行具有相同数据结构的数据。
内表中使用with key来制定关键字,选项NON-UNIQUE| UNIQUE 来决定具有相同关键字的数据能否重复出现。
内表有三种类型以适用不同的业务场合,在使用时注意适用的条件。
对内表的操作分为:内表的行操作和整个内表操作两大类。
程序对内表的行操作不能直接进行,必须通过接口来传输,这个接口就是所谓的工作区。因此我们在定义内表的同时还要定义相同结构的工作区。当然,ABAP给提供了方便,在创建内表时,隐式的创建了一个同名的内表工作区,可以称为表头行。系统隐式的使用表投行作为工作区,并不是没有使用工作区,这一点要特别注意。因此为了保持程序的一致性,建议不要采用这种方式,建议声明结构相同的数据结构作为工作区。
在操作整个内表的时候,有一点需要提醒大家,排序是不稳定的,这意味着使用相同的关键字进行排序,可能会出现不同的结果。在排序的过程中,如果不指定,系统默认采取升序排列。
![](https://img-blog.csdn.net/20140711105826343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
动态数据对象与普通数据对象的最大区别是寻址方式的不同,普通数据对象是静态的通过该对象的名称来寻址,而动态数据对象只有在程序的运行过程中,才能知道数据对象的名称和属性,才能进行寻址。
![](https://img-blog.csdn.net/20140711110128474?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
模块化,是程序设计的一个重要的思想,这样做可以使程序结构清晰,易读,易维护,可是实现代码的复用,实现程序的封装。这与面向对象的思想是一致的。
这里有几点是要注意的:
子程序的定义使用FORM...ENDFORM,定义不能出现嵌套的情况。而且子程序通常都放在最后。
对于定义的局部数据,其作用范围仅为过程内部,过程结束,数据也被删除。对于全局的数据对象,如果局部的数据对象与其名称相同,则全局数据对象被屏蔽,全局对象可以在过程中使用,过程结束,数据也不会被删除。静态数据对象是在全局的范围中定义,它使用的场景是:如果子程序中定义的局部数据不想再程序结束时删除,这是就可以考虑静态数据对象。
在代码复用时,Include必须单独占一行,并且不能像DATA那样扩展到多行。
还可以使用宏,使用的方法和c语言类似,使用前必须进行声明。宏最多只能包含9个占位符,且宏不能调用自己。
![](https://img-blog.csdn.net/20140711110142888?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Rzb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
错误可以分为:语义和语法两大类,针对语法错误,我们可以使用语法扩展检查工具,事物代码为SLIN。我们在实际工作中,程序总是免不了的会dump,一旦出现这种情况,我们就可以借助SAP强大的short dump界面,来分析程序当掉的原因,这些dump信息会再sap系统中保存14天,可以使用事务代码ST22来查看。当然也可以通过keep功能来长期保存。后续,后面会专门有一篇内容,对程序的debug调试的介绍。
人生本就是悲喜交加,而我们也总需不停的去尝试去突破,那怕奋斗的过程里常跌到灰头土脸撞至焦头烂额,但不论如何亦比坐以待毙怨天尤人强多了。生活怎可奢求一帆风顺呢,它本就是温水煮蛙慢慢荼毒,对人攻城略地的,若人意念不稳,便会被其凌驾,让其腐蚀。所以,行走于素锦阡陌,最是需坚定。
ABAP语言是真个SAP系统的基础开发工具和技术平台,专为各种商业应用的开发而设计,具有批数据处理、货币格式转换、用户界面设计以及多语言支持等特性。ABAP语言也在不断的发展,不仅包含了事件的驱动机制,模块化技术,还有完整的面向对象思想。
1 语言概述
作为一种事件驱动语言,ABAP程序的源代码结构就包括数据定义和处理块两部分。数据定义部分包含整个程序中可见的全局数据类型和数据对象、选择屏幕元素以及ABAP Objects中自定义的类和接口;处理块是ABAP程序中的主要结构单元。每一个块都是一个独立的实体。处理块包括:事件块,对话模块和过程这里想重点介绍一下SAP运行时内存的状况。相信了解了下面这张图,就会了解SAP在运行时的一个情况,对SAP程序有了一个微观上的了解。
再详细说明一下:
SAP运行时内存可以大致分为两部分:SAP内存和ABAP内存。其中SAP内存是所有会话都可以访问的内存区域,因此SAP的各个会话之间就可以通过SAP内存达到内存,实现数据的共享。ABAP内存中的数据只能供每个主会话使用,并且数据的存储顺序是按照程序的调用序列,以栈的形式存储,当被调用程序执行完成,进行出栈操作,返回被调用的程序。
这里说的主会话,是指用户用户和服务器之间的会话,当用户登录SAP系统,就建立了一个主会话,通过SAP GUI可以同时打开6个主会话,这6个主会话之间有各自的ABAP内存,几乎没有任何的联系。
内部会话是存在于主会话中,可以认为是可执行的程序,这部分可执行程序加载在ABAP内存中,一个主会话可以包含多个内部会话,但是只有当前的内部会话是活动的。
ABAP程序的调用序列分为两种情况:一种是新建的内部会话(被调用程序)会完全取代调用程序,及时被调用程序,执行完成,也不会返回调用程序。新建的内部会话会将原来会话的内存清楚,这种情况和其他编程语言有些不同。第二种情况就与其他编程语言一样,调用程序与被调用程序之间以栈的形式存放在内存中。
ABAP的数据类型可以分为三类:基本类型,复杂类型和引用类型。所谓的引用类型,是系统中没有定义的,需要开发人员在实际应用中自己定义,主要是指向其他对象的指针对象。
2 数据定义
由于商业数据操作和显示上的需要,ABAP语言和其它语言比起来在定义方式和数据类型的体系上都要复杂一些。这里要明确数据类型和数据对象的区别:
数据对象是数据类型的实例,如果把数据类型比作汽车模型,那数据对象就是一个个根据这个模型生产出来的跑在马路上的真的汽车。、
上图已经能充分说明了数据类型和数据对象的区别,这里要说明的时数据对象可以基于匿名类型,比如定义10个长度的C类型,就属于匿名类型。
上图已经能清晰的说明ABAP内置的基本数据类型。这里需要说明的是:
如果程序声明一个数据对象时,不指明其类型,则系统默认是C类型。
ABAP语言中不存在布尔类型数据,因此条件判断的功能往往是通过单字节C类型来完成。习惯上,如果条件满足赋值为‘X’。
值得说明的一点是,ABAP的日起类型很强大,比如,Java要判断某一年是否为闰年,需要一段复杂的逻辑处理,而在ABAP中,一句代码轻松搞定。这也侧面的反映了,ABAP作为一种商务上的语言,为商务逻辑处理提供了很大的方便。
在ABAP中使用Types语句定义内部数据类型,使用DATA语句声明变量,两个语句很类似,但是Types不能赋初始值。
这里要说明的是,我们在写代码的时候,良好的代码风格,不仅看起来舒服,日后他人或自己再回看自己代码的时候,也是一种享受。每个公司都有自己的一套代码风格和命名习惯,但是差距不大,有时候正式这些不起眼的细节,才能体现一个人的功力。
命名习惯:
数据类型或对象最多不能超过30个字节;
名称由数字,字母,下划线组成,第一个必须为字母,最好见名知意。
不能使用内置类型的名称和系统数据对象的名称。和系统的命名区别开来,否则,有时候出问题都不知道是怎么死的
数据字典的作用范围要比通过Types定义的数据类型的范围要大得多。它能作用于整个SAP系统。
先来说明数据元素和域的区别:
数据元素是构成结构和表的基本组件
域,定义了数据元素的技术特性,如长度,小数位等。
数据字典中,每一个数据元素必须属于一个域。
数据字典中也定义了一些内置的数据类型,这些需要日常工作中基类,只有用到了,才印象深刻,这里只简单介绍几个
CUKY 货币代码,CURR 货币金额,ACCP 会计结算周期等等。
当然,我们也可以自己创建数据元素,事务代码 SE11,SE80.
图中已经描述的很清楚,这里说一下系统数据对象,比如Sy-datum 系统日期,sy-uzeit 系统时间等,不用声明,直接使用。
3 基本数据操作
这里有几点要说明:
ABAP语言中有两种赋值语句,Move和“=”,两种形式是完全等价的,对于结构体之间的赋值,若源结构与目标结构完全相同,则会把源结构的值直接复制到目标结构中,对于源结构和目标结构有部分相同的组件,此时可以使用Move-corresponding,此时只能在同名的组件间赋值。
ABAP语言中,除了时间类型D和T之间不能相互转换,其他类型都可以。这是其他高级语言不具备的,
在ABAP中,内表对象之间也可以赋值,但是要求源内表与目标内表之间的内表行是兼容的,对关键字行的重复性要求也要相同。
ABAP程序对空格都有着严格的要求,有时候一段代码怎么看都没有问题,这时候就要想,是不是某个位置没有空格,这一点在写代码的时候尤为注意。
ABAP的输出语句格式化输出有很多种形式,有时候我们没有办法记住所有的参数,这时候就可以调用系统的帮助,记住万能的F1哦。。。
ABAP中有一个IS操作符,使用方法,图中已经很明确的提出,这里不再复述。
4 结构控制
这里要说明的是:
ABAP的分支控制是IF...ENDIF,CASE...ENDCASE,并不是if...else,也没有switch。
ABAP的循环控制中,有一个系统字段sy-index是一直记录循环的次数,这个在其它语言中是没有的。
注意循环中止的三个关键词之间的区别。
5 处理字符数据
ABAP中当不声明类型时,默认的就是字符类型,因此,处理字符型数据对ABAP尤为重要,字符串的连接,分割,查找字串,字串位移等等。
在连接字符串中CONCATENATE,有一个系统的字段记录连接状态,这个字段是sy-subrc,如果连接后的字符超出了长度的限制,此时返回值为4,否则返回0。
在字串的查找过程中,如果找到,sy-subrc返回0,sy-fdpos返回该字串的便宜位置,如果没找到,sy-subrc返回4.
6 使用内表
内表,是一种强大的大批量数据管理形式,主要用在,当程序运行期间,存储多行具有相同数据结构的数据。
内表中使用with key来制定关键字,选项NON-UNIQUE| UNIQUE 来决定具有相同关键字的数据能否重复出现。
内表有三种类型以适用不同的业务场合,在使用时注意适用的条件。
对内表的操作分为:内表的行操作和整个内表操作两大类。
程序对内表的行操作不能直接进行,必须通过接口来传输,这个接口就是所谓的工作区。因此我们在定义内表的同时还要定义相同结构的工作区。当然,ABAP给提供了方便,在创建内表时,隐式的创建了一个同名的内表工作区,可以称为表头行。系统隐式的使用表投行作为工作区,并不是没有使用工作区,这一点要特别注意。因此为了保持程序的一致性,建议不要采用这种方式,建议声明结构相同的数据结构作为工作区。
在操作整个内表的时候,有一点需要提醒大家,排序是不稳定的,这意味着使用相同的关键字进行排序,可能会出现不同的结果。在排序的过程中,如果不指定,系统默认采取升序排列。
7 动态数据对象
动态数据对象与普通数据对象的最大区别是寻址方式的不同,普通数据对象是静态的通过该对象的名称来寻址,而动态数据对象只有在程序的运行过程中,才能知道数据对象的名称和属性,才能进行寻址。
8 模块化技术
模块化,是程序设计的一个重要的思想,这样做可以使程序结构清晰,易读,易维护,可是实现代码的复用,实现程序的封装。这与面向对象的思想是一致的。
这里有几点是要注意的:
子程序的定义使用FORM...ENDFORM,定义不能出现嵌套的情况。而且子程序通常都放在最后。
对于定义的局部数据,其作用范围仅为过程内部,过程结束,数据也被删除。对于全局的数据对象,如果局部的数据对象与其名称相同,则全局数据对象被屏蔽,全局对象可以在过程中使用,过程结束,数据也不会被删除。静态数据对象是在全局的范围中定义,它使用的场景是:如果子程序中定义的局部数据不想再程序结束时删除,这是就可以考虑静态数据对象。
在代码复用时,Include必须单独占一行,并且不能像DATA那样扩展到多行。
还可以使用宏,使用的方法和c语言类似,使用前必须进行声明。宏最多只能包含9个占位符,且宏不能调用自己。
9 错误处理
错误可以分为:语义和语法两大类,针对语法错误,我们可以使用语法扩展检查工具,事物代码为SLIN。我们在实际工作中,程序总是免不了的会dump,一旦出现这种情况,我们就可以借助SAP强大的short dump界面,来分析程序当掉的原因,这些dump信息会再sap系统中保存14天,可以使用事务代码ST22来查看。当然也可以通过keep功能来长期保存。后续,后面会专门有一篇内容,对程序的debug调试的介绍。
相关文章推荐
- 和小白一起学ABAP -- 8 SAP程序设计 之 sap基础知识
- 和小白一起学ABAP – 11 SAP程序设计之 ABAP对象
- 和小白一起学ABAP – 14 SAP程序设计之 报表生成工具
- 和小白一起学ABAP – 17 SAP程序设计之 应用事务开发
- 和小白一起学ABAP – 22 SAP程序设计之 商用文档设计
- 和小白一起学ABAP – 9 SAP程序设计之 系统开发语言
- 和小白一起学ABAP – 13 SAP程序设计之 创建企业报表
- 和小白一起学ABAP – 12 SAP程序设计之 数据库操作
- 和小白一起学ABAP -- 7 阅读经典之SAP程序设计
- 和小白一起学ABAP -- 2 关于 SAP 标准教程编号的说明
- 和小白一起学ABAP -- 3 SAP Tables
- ABAP--关于SAP Control Framework(入门GUI编程的不错的基础介绍)
- ABAP--关于SAP Control Framework(入门GUI编程的不错的基础介绍)
- 和小白一起学ABAP -- 1 SAP ABAP学习路线图
- 分支程序设计01 - 零基础入门学习C语言10
- ABAP--关于SAP Control Framework(入门GUI编程的不错的基础介绍)
- SAP ABAP基础知识自学笔记二
- SAP ABAP基础知识自学笔记一
- 和小白一起学ABAP -- 6 从菜鸟到大神
- ABAP--关于SAP Control Framework(入门GUI编程的不错的基础介绍)