Table key 由三部分构成 1. Components:组成key的字段 2. Sequence:字段顺序 3. Unique/non-unique是否具有唯一性 Data itab type table of [内表类型]. 没有语法错误,只是意义完全不同 注意:相当于定义了一个一位数组 每一个元素都是一个内表元素. 访问物理表 1. 根据 物理表 所对应的 透明表 建立 结构体 或者 内表 2. 单条数据访问 需要使用建立的结构体进行操作 3. 多条数据访问 使用建立的内表进行操作 通过一个内表变量 ,建立与内表line type类型相同的结构体wa Data wa like line of itab. 根据内表变量定义 Data wa type line of <内表类型>. 根据内表类型定义 读取数据库表 Select <result> from <table> which table Into <target> whereto Where<condition> which line 需要声明一个 结构体 或 内表 单条记录 into 到结构体. 多条记录 into 到内表. Reading by single record access 读取单条记录 对于java 来说, sql 和java 互不相干. Java执行的SQL并非java元素, sql对于java来说只是简单的字符串. Abap中的open sql 是abap中的一部分. OpenSQL 是基于sql的拓展 只读一条记录时, 一定要加single关键字 Select single * From scarr Into wa_scarr Where carrid = pa_car. 重点:无论查询结果有多少条, single读取只返回第一条记录. Left justified 从左到右匹配. 概念:根据字段在表中的顺序,对where条件中的字段进行从左到右排序 Where语句中的条件顺序 会影响查询性能, 要遵循从左到右匹配查询. 多表查询 1. 先根据多张表中所需的字段建立结构体. 2. 通过这个结构体对数据进行操作 3. 要使用 corresponding fields of 对字段赋值进行匹配操作. 注意:不使用corresponding 不会出异常 ,但拷贝结果不一定会正确 多条记录读取 Select carrid connid fldate ….. Endselect. 当数据库操作执行完毕, 要根据 sy-subrc 判断操作是否成功. 0 成功 非0 失败 数据库查询小节 数据库查询分两种 1. 单条 select single 2. 多条 select …. Endselect , array fetch. 多条记录查询 1. Select .. endselect:逐条读取 稳定,但速度较慢 2. Array fetch:把符合查询条件的 记录一次性插入到内表中 速度快, 但不稳定(当内存不足或数据过大时,会导致内存溢出) 运行机制:例如查询10条记录,大小10k a) 使用select--endselect方式访问, 会访问10次,每次访问1k, b) Array fetch 将数据看成一整个数据. 一次性放入到内表中 Into clause 对同名并且类型相同的字段进行拷贝 需要使用corresponding fields of,虽然速度较慢,但较稳定 名字相同 类型不同, 则拷贝不会成功. 对于 client-specific 表的查询 client-specific 表中的第一个主键字段为mandt,作用是标识client 该查询分为两种情况 1. 默认情况查询client-specific表 2. 通过特定的mandt查询client-specific 默认情况查询 查询条件中 没有 mandt字段 Select ….. from spfli Where (mandt = ‘100’ )carrid > ‘LH’. 底层默认在where中加入了 mandt字段作为查询条件, 而此时的mandt的值为当前操作 该程序的client的值 注: 使用这种查询方法,不同的client运行该程序 会极大可能的产生不同运行结果 通过特定的mandt查询client-specific 指定特定 mandt Select * from spfli Client specified Into .. Where mandt in (401,402) 注意:mandt一定写在第一位 And carrid EQ ‘AA’. 使用特定的mandt , 系统将通过该特定mandt 进行数据访问, 返回结果与client无关 Secondary index 第二索引 索引优点:加快数据库查询速度 劣势:索引仅对数据查询有利, 对update语句(例如:删除,插入)会降低其效率. 注意: 索引并不是越多越好,适当的索引可以加快查询效率 索引分为两类 1. 第一索引(物理索引 或者 主索引) 该索引是基于数据库表主键所包含的所有字段创建的,有且只有一个, 当主键 被创建时 , 主索引就会被系统自动创建 2. 第二索引 根据主键之外的字段所创建的索引,可以包含多字段主键的其中之一或多个作为第 二索引,但不能包含主键的所有字段. 注意:第二索引的数量应该适当,不应太多. 索引机制 在索引创建的时候,系统会自动创建相应的索引表 例如: 1) 一个表中的前2个字段为主键, 2) 此时系统会创建一个3个字段的索引表 3) 其中包括 两个主键字段 和一个 index字段(为了根据主键定位对应的表数据) 4) 创建的索引表与数据表拥有相同的数据条数 写查询语句的时候 where 条件语句要遵循 left justified 机制 从左到右写入索引字段 Database optimizer 数据库优化器 它会根据查询操作,选择出最佳的查询方案. Authorization checks 权限检查 运行流程: 1) 用户在选择屏幕上输入查询条件 例如:AA 2) 用户确定输入 3) 在数据库查询之前,ABAP程序会到数据库查看当前用户的用户主数据,查看用户是否具有对该数据进行操作的权限, 如果有 sy-subrc = 0 , 如果没有权限 sy-subrc = 4 , 检查失败 sy-subrc = 8. Authorization objects and authorizations.权限对象 和 权限 权限查询流程 1) 查看用户是否又有相应权限 2) 当具有查询的权限时就在if语句中对该表进行相应操作 3) 如果没有权限 就通过屏幕提示给用户 Authorization_check object: s_carrid 包含两个字段 1. Carrid: 用来指定carrid的值 2. Actvt: activities 可操作的权限类型 Actvt 可取的值: 1. Create = 01 是否有创建的权限 2. Change = 02 修改权限 3. Display = 03 查看权限 一个权限对象可以生成多个权限 carrid : * Actvt : 03 用户对所有航空公司编码所对应的数据具有查看权限 carrid : Hl Actvt : 02 该用户可以对HL航空公司对应的数据可以更改. Authority-check Object ‘S_CARRID’ ID ‘CARRID’ field ‘LH’ ID ‘ACTVT’ field ‘02’. (查看数据库的二维表,查看权限是否存在,然后返回给sy-subrc) If sy-subrc NE 0. <statement> Endif. Dummy:当忽略字段的值时,可以使用dummy Authority-check object ‘S_CARRID’ ID ‘CARRID’ DUMMY ID ‘ACTVT’ field ‘02’. 插入权限检查 点击pattern 在authority_check 中输入 s_carrid Reading Linkable database tables读取多表连接 对于对表的访问有两种方式 1. 静态连接:从多中取出所需字段, 根据提取的字段创建 视图 2. 动态连接:在abap中使用连接语句对多表连接并读取 表连接分类 1. 内连接 inner join 2. 外连接 outer join (包含:左外连接 右外连接 注:ABAP不支持右外连接) 内连接: inner join 例如: 对两个表进行内连接, 将两个表中符合连接条件的记录的字段合并为一条记录, 相当于把这些符合条件的记录又重新组成了一个新表. SELECT … FROM spfli INNER JOIN scarr ON spfli~carrid = scarr~carrid Where… 注:由于多表中可能出现重复字段, 索引因该使用 <表名>~<字段名> 进行区分 外连接:outer join 左外连接: 例如: 两张表进行外连接, 一张为左表, 另一个为右表 当进行左外连接时, 无论左表是否符合连接条件,它的字段都会在新集合中, 而右表只有符合连接条件,字段才会被插入到新集合中 右外连接(abap不支持): 与左连接顺序相反, BAPI :business API 可以理解为 abap的方法 封装了select语句,可以直接使用 Logical database 逻辑数据库 不是物理数据库 ,而是ABAP程序, 可以充当数据库使用 警告:对数据库进行插入,更新,删除,修改 是很危险的.所以推荐初学者只进行查询操作 subroutines子程序 功能:封装了程序中经常使用的代码,可以简化代码量.(相当与其他语言的 方法) 子程序的定义 定义子程序interface 1. 参数个数 2. 参数类型 形式参数与实际参数 1) 形式参数: 子程序定义中的参数 2) 实际参数: 调用子程序时的参数 形式参数的三种方式 1. Call-by-value 值传 2. Call-by-reference 引用传 3. Call-by-value-and-result 值传并带有返回值 Call-by-value 值传类型 1. 变量首先进行自身拷贝 2. 拷贝变量被传到子程序中 3. 子程序对拷贝变量的修改不会关系到原变量的变化. Call-by-reference 引用传 1. 该传递会将变量的内存地址传送至子程序中 2. 子程序会直接操作内存,所以源变量也会随之改变 Call-by-value-and-result 值传并带有返回值 1. 与值传相同,首先变量自身拷贝,并将拷贝变量传送到子程序中 2. 子程序对拷贝变量修改完毕后,会将该拷贝变量重新覆盖回源变量中去 注意:修改的值不一定每一次都返回成功.当出现异常错误时,拷贝变量将可能不会返回. 子程序的声明 在形式参数中: USING Value(<参数名>) 值传 CHANGING value(<参数名>) 值传带有返回值 USING (推荐:内表形参使用) / CHANGING <参数名> 引用传 子程序定义时的参数类型: 1. 简单类型: 一般类型(不可分解) 2. 复合类型: 内表类型 形参的简单类型 1. 指定类型: 例 USING value(f_1) TYPE i. 2. 任意类型: 该形参可匹配任何类型 例:USING value(f_1) TYPE ANY. (不推荐, 运行过程中很可能出现类型不一致的运行错误) 形参的复合类型 重点:复合类型形参必须为特定类型,以访问内部的字段. 复合类型的形参 推荐使用 call-reference 引用传作为传递类型. 例: 使用内表作为形参, 当调用子程序 并传递 内表参数的时候,由于内表数据量相对较大,使用值传 或值传带返回值都会对内表变量进行拷贝, 这样会降低运行效率. 所以使用引用传 可以避免拷贝过程 以 提高效率. 但是引用传会使内表被修改. 因此推荐 将该引用传 参数 写在 USING 关键字后,以提醒编程人员不要轻易修改. 重点: 在子程序中定义的变量,只有在子程序中才有效 而在主程序中的变量,子程序依然可以调用,但不推荐,因为这样可能会导致程序出现错误,所以在使用子程序时要传入相应参数 子程序的调用 1. 将子程序从导航中托到主程序中 2. 使用 pattern 的 perform选项调用子程序 Abap runtime system 运行环境 Abap程序是若干处理得块的集合 代码块分类 1. Event block事件块 2. subroutines子程序 3. module 块 Load-of-program 程序启动时被调用 一个报表的运行 1. 首先执行load-of-program或initialization. 2. 推出选择屏幕 3. 用户确定屏幕以后,启动start-of-selection事件 4. 通过列表缓冲区,运行环境把列表返回给用户 注意:Load-of-program 和 start-of-selection 有且只能触发一次. 重点: 事件块的特点 1. 通过关键字开始 2. 事件块的开始意味着上一个事件块的结束 3. 每一个事件块执行不同的任务 4. 事件块的执行是有顺序的,虽然在编写上没有要求,但建议按照顺序编写 5. 标准的事件块 Initialization 只能在可执行程序中初始化程序 创建报表必须使用start-of-selection事件块 List attributes 报表功能: 可以被打印 可以格式化输出(不通的货币和长度单位) 输出日期格式 根据登陆语言选择特定语言 生成一个屏幕 列表屏幕的标准功能 Back /exit /cancel Scroll Print Fine Save 一个列表拥有一个list header 和四个 column header. Multilingual capability多语言编程 Text-ccc(三位数字) 1. Write text-001. 2. 双击 text-001 进行创建. 3. Goto- translate 4. 修改翻译语言 5. 使用相应的登陆语言登陆,就会输出相应语言 Write语句会将数据写到缓冲区 1. 用select 语句取出数据 2. 每write一次就会把数据放到缓冲区中 3. 当start-of-selection 结束后, 运行环境将会把所有的write skip uline数据全部推到屏幕上 Detail list At line-selection事件 1. 在list screen中, 双击记录或者单击并按F2键 会出发at line-selection事件 2. 通过该事件,可以生成下一级的报表,通过该报表还可以再生成下一级报表, 每一个屏幕都有一个编号. Start-of-selection 所生成的屏幕叫做 basic list screen 其编号为0, 而后所生成的屏幕的编号为依次加1. 重要: 最大屏幕号为 20, 最多有21层 除了第一层在start-of-selection 其他的屏幕都在at line-selection后生成 Sy-lsind 列表屏幕的索引编号 lsind = list index 在detail list使用back按钮 ,可以跳到上一级屏幕 重要:当双击list 的数据后, 系统首先将sy-lsind 加1 然后再触发at line-selection 用array fetch 很难做双击后的list Hide area 隐藏域 Hide area隐藏域是系统运行环境中的一张内表. 其中包含3个字段 1. Line : 标示行号 2. Field name: 字段名 3. Value : 字段的值 隐藏域的使用 1. 通过 select …endselect 对数据库进行循环查询, 2. 通过 write 语句, 打印出basic list screen 中的列表信息 3. 通过 hide 语句, 将指定的字段,存放到隐藏域中 4. Basic list screen 生成后,用户双击信息行,触发at line-selection 事件, 5. 此时,系统将根据该信息行到隐藏域中查找相应字段 6. 最后将该字段返回给对应的全局变量的字段中去, 以便于在下一个detail list 中继续使用
转载:http://blog.sina.com.cn/s/blog_5cdacb630100ce92.html