ABAP笔记1

1.  基本数据类型:
    C : 1~65535 byte,默认长度为1,初始值为space,字符串编辑不允许换行
    D : 日期型,8byte 默认值‘00000000’,最大 9999/12/31
    T :时间型,6byte 默认值 ‘000000’
    N:数值组成的字符串型,1-65535byte,默认每个位上都是'0',设定前置0时很方便,能计算,但是不能参与负数计算
    I  :整型,-2^31~2^31-1,默认值为0
    F :浮点型,8byte,默认0,可精确到小数点后17位,若为小数,则用引号,几乎不使用,一般用P类型
    X :  十六进制,1-65535byte,若值是字母,必须大写,在写文件时,字符串换行
    P :  packed数,1-16byte,默认值为0,赋值需加引号,赋值长度 = 定义长 * 2 - 1
          若L_NUM(3) TYPE  P decimals 2,则长度为 3 * 2 - 1 = 5,即小数个位为2,整数位为3。
          最多有14位小数位,则最多整数位=2*16-1-14=17位。若小数位超出长度,则按四舍五入去掉多余,若整数位超出长度则程序报错        
2.  定义时Type 跟 LIKE 区别:
     TYPE 后跟类型,8种基本类型或数据元素
     LIKE 后跟变量,或数据库字段名,如T001-BUKRS
3.  SY-INDEX 系统计数器   SY-DBCNT 符合条件条目数  SY-SUBRC 返回成功值为0
     SY-UNAME login账号  SY-DATUM 系统日期            SY-UZEIT   系统时间
     SY-TCODE 目前的transaction code                          SY-INDEX 系统计数器,双重循环时,各循环里面的SY-INDEX会自动变化
     SY-TABIX 内表索引,在loop循环中用SY-TABIX
4.  WRITE和WRITE:/ 区别,后者会换行
5.  文档查看  T-CODE : ABAPDOCU 
     新建数据库表T-CODE : SE11
     向数据库表中插入数据 : SE16
     修改数据表数据:SE16N
     创建T-CODE : SE93
     创建JOB: SM36
     创建MESSAGE : SE91
6.  MESSAGE ID 'ZD' TYPE 'S' NUMBER 002.
7.  REFRESH 一般用来清除内部表内容  FREE释放内表内存,不清空header line
8.  CLEAR REC 清除记录中 HEADER LINE 内容
     CLEAR TAB 清除内表中HEADER LINE内容,若没有HEADER LINE ,则清除内表内容
     CLEAR TAB[]表示清除内表内容
9.  DESCRIBE TABLE TAB LINES L_LINE 获取内表中有多少条数据
10. ALV或者GRID形式显示设置:设置->用户参数->选择目标
11. ASCENDING 升序   DESCENDING 降序
12. leave会强行中止程序,一般在REPORT程序中不使用,仅在画面程序(dynpro)使用
13. SELECT-OPTIONS 定义选择条件时不能用TYPE,只能用for,后面跟变量。
      是一个自带headerline的特殊内表,表中各项目含义如下:
        sign : I - 满足指定条件   E-不满足指定条件
    option : EQ - 等于             BT - 在此范围之间
         low : 最小值          high : 最大值
14. INSERT YTESTAB01 FROM TABLE TAB_YTAB [ACCEPTING DUPLICATE KEYS](接受复数项的插入).
15. COMMIT WORK 事务的提交   ROLLBACK WORK 事务的回滚
16. MODIFY 语句是insert和update语句的结合体,若modify的对象数据在数据库里存在,就做update;
      如果不存在,就做insert。缺点:会导致数据库的情况不明,也会增加调试过程不变,不推荐使用。
17. 上锁与解锁:为了防止多个用户同时操作同一数据,造成混乱
      (1) se11新建一个锁,命名规则:EZ + 表名 + L1
      (2) 保存并激活之后会生成两个函数,一个上锁: ENQUEUE_+<锁名>,一个解锁: DEQUEUE_+<锁名>
      (3) 在程序中使用锁用 CALL FUNCTION 的形式,如果锁函数 exporting部分全部注释掉则是对整个表上锁,
           上锁有失败判断,解锁没有
      (4) 解锁必须在COMMIT之后做,在事务提交或回滚之后才可以解锁。在sap中,锁是通过对象控制,是一个
           排他对象,跟数据库没有直接关系。
      (5) 在同一进程里可以对一个表多次上锁,用DEQUEUE_ALL可解除所有锁
        
18. 下载函数:GUI_DOWNLOAD   上传函数:GUI_UPLOAD
19. FIELD-SYMBOLS类似于指针,一般不推荐使用
      定义: FIELD-SYMBOLS   <FS>     "定义完后不能直接使用,需用ASSIGN命令分配
      ASSIGN  L_ABC  TO  <FS>.  分配之后用UNASSIGN解除指针
20. JOB程序是后台执行程序的一种方式,一般设定在晚上,可以指定每月或每天执行
      创建JOB T-CODE: SM36
21. 数据库操作绝对不能用SQL代码修改标准表数据
22. 三种内表及其优缺点:
      标准表:每行对应逻辑索引SY-TABIX ,访问时间跟数据量相关,可通过索引或关键字访问;不限制,功能强大,用处广
      排序表:有索引但总是按关键字升序排列后再存储,二分查找,速度快,适用于须排序的内表,主要通过关键字访问,
                    不用append,用insert追加数据。        
23. 哈希表:查询快,插入慢。适用于数据量大,不重复,只需使用关键字访问的内表。
24. 内表与工作区的区别: 内表和工作区都是用来存放数据的,内表可以有多行数据,工作区只能有一行。程序对内表的操作
      不能直接进行,需通过工作区。有时在定义内表时会定义一个同名工作区,即表头行,但在操作时容易搞混,分不清是对
      工作区进行操作还是对内表进行操作,所以不建议定义内表时定义表头行。也会通过在内表名的后面添加[ ]来表示内表。
25. 使用TYPES定义的时结构,若将TYPES改为DATA,则定义的是工作区,结构是一种类型,用来作为数据类型的参照,
      工作区和内表是具有类似结构类型的变量。
26. DATA与TYPES,TYPE 与 LIKE的区别
      types定义的是结构,需用DATA实例化后才可以使用。
      data是用来实例化变量的,DATA直接定义的结构体对象可以是结构,也可以是工作区
      type后跟随的只能是类型,如8种基本类型,域或数据元素,通过type定义的内表只能间接拥有被参照结构类型的元素结构,
              结构类型不能作为内表的工作区,只有结构体对象才可以
      like后面可以跟实例对象,参照结构类型生成内表时可以用like也可以用type(也就是types定义的结构),参照结构体对象
            生成内表时(即用data定义的结构)只能用like不能用type,因为结构体对象不是类型,只是一种实例对象。
27. Bit与Byte
      bit是计算机存储数据最小的单位,为二进制中的一个位数,值‘0’或‘1’。
      byte是计算机存储容量的基本单位,一个字节由8位二进制数组成,一个字节可以表示一个数据,也可以表示一个英文字母
              两个字节可以表示一个汉字,1byte=8bit
28. Concatenate A B into C,会自动清空字符串后面的空白字符,前面的保留
29. 调试程序:F5单步执行  F6跳过函数    F7从当前函数退出  F8执行
30. 常量定义:constants 为了对应多语言系统,一般不直接使用Constants定义汉字常量,而使用text symbol。
31. 尽量不直接使用data定义结构,建议先用TYPE定义,然后再用DATA定义一个变量,因为TYPE定义的是类型,
      类型不能直接使用,能避免意想不到的错误书写。
32. 参数定义:
      (1) parameters指令                     (2)default 可选参数设定初始值
      (3) lower case初始值保持小写     (4)obligatory必填项目
      (5) as checkbox 复选框形式        (6)select distinct 去重
33. (1)簇表(cluster table)是多个透明表的集合,将所有表的主键和非主键字段集合起来放到一个字段,在SAP database中是以表簇
      的结构形式存在的,簇表可存储大量相关的数据,由于它结构复杂不直接存在DB中,所以每查一条数据,DB就要去同步多个表
      的数据再组成一条数据传回给SAP,所以直接查簇表数据会非常慢。
      对于簇表:不能使用select distinct语法;不能使用native SQL;不能使用order by语法; 不能再追加创建索引
      (2)存贮表(pools table):用来放置控制流程数据(屏幕参数,程序参数,临时数据),簇表由若干大表组成,存贮表由许多小表组成。
      (3)透明表(tranparent table): 每个透明表再数据库中有一个相应的物理表,数据存储在透明表中。
34. EXIT跳出循环,CONTINUE,跳过continue之后的语句,开始下一循环;varying,DO循环里面,类似于指针的处理。
35. ABAP程序块结构
      (1)INITIALIZATION 块,在画面显示之前做初期处理
      (2)AT SELECTION-SCREEN OUTPUT 每次选择屏幕有改变(或按了enter键之后)运行, 选择屏幕PBO
      (3)AT SELECTION-SCREEN 选择屏幕PAI(输入数据之后),点击执行按钮时触发,此时如果界面有操作则跳到(2),无操作则跳到(4) 
      (4)START-OF-SELECTION 选择开始事件,选择屏幕处理结束后,点击执行时触发
      (5)END-OF-SELECTION 选择结束事件,在所有逻辑数据库处理结束后触发,一般用于输出列表信息
36. MESSAGE处理(se91)
      消息类型:       A->对话框,中止,用户必须重启事务
                     崩溃  X->退出,与消息A类似,但带有程序崩溃
                   感叹号 E->错误,处理受到干扰,用户必须修正输入条目
                   感叹号 W->警告,处理受到干扰,用户可以修正输入条目
                   弹出框 I->信息,处理收到干扰,用户消息确认后仍会继续
                    打钩   S->成功,会在下一屏幕上显示相关信息
      直接显示常量消息:MESSAGE 'AAAA' TYPE 'A'.
      静态指定消息内容:MESSAGE S002(00).
      自定义MESSAGE显示:MESSAGE ID 'ZD' TYPE 'S' NUMBER 002.
      用的多的显示方法:MESSAGE S005(YMESS) WITH 'HELLO'.
37. 在INITIALIZATION块,除了S类型,程序都会中止;如果一个程序MESSAGE ID比较统一,可以写在REPORT头上;
      MESSAGE一般在AT SELECTION-SCREEN块对输入的内容作检查
38. 如需终止程序,可在START-OF-SELECTION块里面用STOP命令
      STOP命令,中止START-OF-SELECTION的其他处理,跳而执行END-OF-SELECTION处理
      LEAVE命令,不再去执行END-OF-SELECTION处理,直接停止程序   LEAVE LIST-PROCESSING
39. USER-COMMAND命令,主要实现事件触发的动作,如双击一行报表数据,跳到物料界面
      将先执行AT SELECTION-SCREEN块,然后执行AT SELECTION-SCREEN OUT块
      USER-COMMAND事件不可以截取,仅仅作为刷新屏幕作用
40. SET CURSOR FIELD 'P_BUKRS' 将光标设在指定参数位置
41. ABAP类型格式:数字一般自动右对齐,可通过程序设成左对齐  LEFT-JUSTIFIED.
      对日期类型,系统会自动判断格式是否正确
42. 内表的定义
      (1)先定义一个结构
      (2)根据结构,定义一个RECORD类型
      (3)定义表 DATA TAB TYPE TABLE OF TYP_HELP (根据结构定义)
                      DATA TAB1 LIKE TABLE OF REC. (根据RECORD定义,推荐)
           APPEND往数据库追加数据,自动加到内表的最后一行
           DATA TAB LIKE TABLE OF REC WITH HEADER LINE. 使用HEADER LINE在代码编写会显得简单一些,但容易造成操作上误差
           没有表头的内表需通过RECORD追加一行数据,APPEND REC TO TAB
           有表头的内表可直接追加数据。 APPEND TAB2或APPEND TAB1 TO TAB2.
       (4)将一个内表中所有的数据追加到另一个内表:APPEND LINES OF TAB TO TAB2.
       (5)将一个内表某一范围数据追加到另一内表:APPEND LINES OF TAB  FROM 2 TO 3 TO TAB2.
       (6)COLLECT-用collect语句将record A 中数据往内表B中加,若A中非数值字段在内表B中不存在,则将A追加到B;
           若A中非数值字段在B中存在,则将A中数值字段累加进内表B,若有多条,则加至第一条。
       (7)INSERT可指定INDEX插入,INSERT REC INTO TABLE TAB.  插入最后一条
                                                      INSERT REC INTO TAB INDEX 2.
                                                      INSERT LINES OF ITAB1 FROM 2 TO 3 INTO TABLE ITAB2.
       (8)用loop循环,将内表数据取出,可在循环时加条件,直接加WHERE条件即可。
           LOOP AT TABLE INTO REC. (WHERE DATA > 200)
                WRITE:/ SY-TABIX(内表索引值), REC-KEY, REC-DATA.
           ENDLOOP.
43. 找数据可以通过loop结果判断数据是否存在,也可通过read查找,但是read只能找一条
      READ TABLE TAB INTO REC INDEX 2. "找出第二条数据
                                                    WITH KEY DATA = 200          "根据条件查询,无需and
                                                                     KEY1 = 'ABC' TRANSPORTING KEY1. “只读取key1返回,不读data
      READ TABLE TAB TRANSPORTING NO FIELDS WITH KEY KEY1 = 'ABC'. "判断数据是否存在,无需返回值。 SY-SUBRC = 0.
44. MODIFY 修改成功SY-SUBRC返回0.
      按照index更新内表数据:MODIFY TAB FROM REC INDEX 2.
      循环里面的更新index可以省略:modify tab from rec.
      指定更新项目:modify tab from rec transporting data[这里只能是关键字] (where ...)
45. DELETE 可以指定INDEX或者WHERE条件
      DELETE TAB INDEX 2.  "删除第二条数据
      DELETE TAB FROM 2 TO 4.  "删除第二至第四条数据
      DELETE TAB WHERE DATA < 500. "删除data列小于500的数据
46. SORT排序
      不指定按升序排序(ascending),可指定降序排序(descending)
      SORT TAB BY DATA.   "升序
      SORT TAB BY KEY1 DESCENGDING
                             DATA DESCENDING.  "指定降序
      SORT MAN1 BY HIGH WEIGHT DESCENDING.  "只有WEIGHT字段降序,其他升序
      SORT MAN1 DESCENDING BY HIGH WEIGHT.  "BY后面所有字段都降序
47. 性能优化,使用ABAP 'SORT' 取代 ‘ORDER BY’
      order by 命令是在数据库服务器上执行的,而sort语句是在应用服务器上执行的,可以将数据读取到内表中,然后使用
      sort命令将结果排序,取代在select语句中使用order by命令,因为应用服务器上执行速度要比数据库服务器快。sort可动态排序
48. AT  ---SAP循环的特殊控制,使用前必须排序
      (1) AT NEW,当关键字段的值首次出现时进行处理,使用前必须排序。在AT NEW 和 ENDAT 之间只能看见关键字段之前的内容,
      所以若需要使用AT NEW 与 END AT之间的非关键字段值,须在AT之前做备份。
      DATA REC2 LIKE REC.
            LOOP AT TAB INTO REC.
                 REC2 = REC.
                 AT NEW KEY1.
                     WRITE:/ REC-KEY1,REC2-DATA.
                 ENDAT.
            ENDLOOP.
     注:如果存在KEY1,KEY2的场合,AT NEW指定的KEY2时,则KEY2往前的值发生变化就处理。
     (2) AT END OF,使用前排序
          LOOP AT TAB INTO REC.
               AT END OF KEY1.
                   SUM.
                   WRITE:/ REC-KEY1, REC-DATA.
               ENDAT.
          ENDLOOP.
          一组数据发生变化的最后进行处理,一般用在累计的时候,SUM之后,自动累加。
49. 过程 --- FORM.
      过程FORM以FORM开始,以END FORM结束,调用过程通过PERFORM.
      FORM的参数类型可以定义也可以不定义,若没有定义,运行时参数自动与外面的定义一致,若定义了参数类型,若内外类型不一致,
      编译会不通过。FORM,FUNCTION中的TABLES参数,TYPE 与 LIKE后面只能接标准内表类型,如果要使用排序内表或者哈希内表,则
      只能用USING与CHANGING方式来代替。
50. USING : 引用(地址)传递,直接引用原值,在子例程中只要形参被修改,原值就会被修改
      VALUE() : 值传递,将参数值复制另一份至内存地址,子程序中形参值的改变不会影响实参
      不希望外面发生变化的时候,用值传递VALUE(),一般建议值传递,CHANGING时值传递,可不加VALUE().
      FORM FRM_ADD USING A1 TYPE I    "using可换成changing
                                               B1 TYPE I
                                               C1 TYPE I.   "C1前可用changing加强程序可读性
           C1 = A1 + B1.
      ENDFORM.
      PERFORM FRM_ADD USING A1 B1 C1.
     
     TABLES,用的很少,内表可以作为参数传递,表传递参数在FORM里定义的时候,用STRUCTURE定义,表传递的时候不存在值传递
      还是地址传递,一定会反映到外面。
      DATA : BEGIN OF STAFF OCCURS 0,
                       NAME(10) TYPE C,
                   END OF STAFF.
      STAFF-NAME = 'JACK'.
      APPEND STAFF.
      PERFORM U TABLES STAFF.
      FORM U TABLES X STRUCTURE STAFF.
           WRITE:/ X-NAME.
      ENDFORM.
 
 
 
 
 
 
 
 
 

 

posted on 2018-09-09 16:33  阳光旅人  阅读(894)  评论(0编辑  收藏  举报

导航