ABAP 笔录
- 格式:doc
- 大小:61.00 KB
- 文档页数:4
abapBDC录屏这里是做了一个BDC录屏后的文件批处理的示例,实际操作中可以把最底下的FORM FRM_GET_DATA .里的代码换成文件上传的方式达到自动化具体参照CALL FUNCTION 'GUI_UPLOAD'的写法。
REPORT ZTEST_BDC.*----------------------------------------------------------------------** データ型宣言(TYPES)*----------------------------------------------------------------------*TYPES: BEGIN OF TY_LFA1,LIFNR TYPE LIFNR,KTOKK TYPE KTOKK,LAND1 TYPE LAND1_GP,NAME1 TYPE NAME1_GP,SORTL TYPE SORTL,END OF TY_LFA1,TY_T_LFA1 TYPE STANDARD TABLE OF TY_LFA1.*----------------------------------------------------------------------** 構造体宣言*----------------------------------------------------------------------*DATA:IW_LFA1 TYPE TY_LFA1,IW_BDCDATA TYPE BDCDATA,IW_CTU_PARAMS TYPE CTU_PARAMS,S_MESSTAB TYPE BDCMSGCOLL.*----------------------------------------------------------------------** 内部テーブル宣言*----------------------------------------------------------------------*DATA:IT_LFA1 TYPE STANDARD TABLE OF TY_LFA1,IT_BDCDATA TYPE STANDARD TABLE OF BDCDATA,IT_MESSTAB TYPE STANDARD TABLE OF BDCMSGCOLL.*----------------------------------------------------------------------* * INITIALIZATION*----------------------------------------------------------------------* INITIALIZATION.*----------------------------------------------------------------------* * AT SELECTION-SCREEN*----------------------------------------------------------------------* AT SELECTION-SCREEN.*----------------------------------------------------------------------* * START-OF-SELECTION*----------------------------------------------------------------------* START-OF-SELECTION.IF SY-BATCH = 'X'. "后台?ELSE. "前台?ENDIF.PERFORM FRM_GET_DATA.PERFORM FRM_SET_BDCDATA.*&---------------------------------------------------------------------* *& Form FRM_SET_BDCDATA*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * --> p1 text* <-- p2 text*----------------------------------------------------------------------* FORM FRM_SET_BDCDATA .LOOP AT IT_LFA1 INTO IW_LFA1.CLEAR: IT_BDCDATA ,IT_MESSTAB.PERFORM FRM_BDC_DYNPRO USING'SAPMF02K''0100'. PERFORM FRM_BDC_FIELD USING'BDC_CURSOR''RF02K-KTOKK'. PERFORM FRM_BDC_FIELD USING'RF02K-LIFNR' IW_LFA1-LIFNR. PERFORM FRM_BDC_FIELD USING'RF02K-KTOKK' IW_LFA1-KTOKK. * PERFORM FRM_BDC_FIELD USING 'RF02K-LIFNR' '00000103'.* PERFORM FRM_BDC_FIELD USING 'RF02K-KTOKK' '0001'. PERFORM FRM_BDC_FIELD USING'BDC_OKCODE''/00'.PERFORM FRM_BDC_DYNPRO USING'SAPMF02K''0110'. PERFORM FRM_BDC_FIELD USING'BDC_CURSOR''LFA1-LAND1'. PERFORM FRM_BDC_FIELD USING'LFA1-NAME1' IW_LFA1-NAME1. PERFORM FRM_BDC_FIELD USING'LFA1-SORTL' IW_LFA1-SORTL. PERFORM FRM_BDC_FIELD USING'LFA1-LAND1''JP'. PERFORM FRM_BDC_FIELD USING'BDC_OKCODE''/00'.PERFORM FRM_BDC_DYNPRO USING'SAPMF02K''0120'. PERFORM FRM_BDC_FIELD USING'BDC_CURSOR''LFA1-KUNNR'.PERFORM FRM_BDC_FIELD USING'BDC_OKCODE''/00'.PERFORM FRM_BDC_DYNPRO USING'SAPMF02K''0130'. PERFORM FRM_BDC_FIELD USING'BDC_CURSOR''LFBK-BANKS(01)'.PERFORM FRM_BDC_FIELD USING'BDC_OKCODE''=ENTR'.PERFORM FRM_BDC_DYNPRO USING'SAPMF02K''0380'. PERFORM FRM_BDC_FIELD USING'BDC_CURSOR''KNVK-NAMEV(01)'.PERFORM FRM_BDC_FIELD USING'BDC_OKCODE''=ENTR'.PERFORM FRM_CALL_BDC .ENDLOOP.ENDFORM. " FRM_SET_BDCDATA*----------------------------------------------------------------------** END-OF-SELECTION*----------------------------------------------------------------------*END-OF-SELECTION.*&---------------------------------------------------------------------**& Form FRM_CALL_BDC*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM FRM_CALL_BDC .DATA WK_MSG(200) TYPE C.IW_CTU_PARAMS-DISMODE = 'N'.IW_CTU_PARAMS-NOBINPT = 'A'.IW_CTU_PARAMS-UPDMODE = 'A'.CALL TRANSACTION'XK01'USING IT_BDCDATAOPTIONS FROM IW_CTU_PARAMSMESSAGES INTO IT_MESSTAB.LOOP AT IT_MESSTAB INTO S_MESSTAB.MESSAGE ID S_MESSTAB-MSGID TYPE S_MESSTAB-MSGTYP NUMBER S_MESSTAB-MSGNR WITH S_MESSTAB-MSGV1 S_MESSTAB-MSGV2 S_MESSTAB-MSGV3 S_MESSTAB-MSGV4 INTO WK_ MSG.WRITE / WK_MSG.ENDLOOP.ENDFORM. " FRM_CALL_BDC*&---------------------------------------------------------------------**& Form FRM_BDC_DYNPRO*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->P_0062 text* -->P_0063 text*----------------------------------------------------------------------*FORM FRM_BDC_DYNPRO USING I_PROGRAM TYPE BDCDATA-PROGRAM I_DYNPRO TYPE BDCDATA-DYNPRO.CLEAR IW_BDCDATA.IW_BDCDATA-PROGRAM = I_PROGRAM .IW_BDCDATA-DYNPRO = I_DYNPRO.IW_BDCDATA-DYNBEGIN = 'X'.APPEND IW_BDCDATA TO IT_BDCDATA.ENDFORM. " FRM_BDC_DYNPRO*&---------------------------------------------------------------------**& Form FRM_BDC_FIELD*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->P_0067 text* -->P_0068 text*----------------------------------------------------------------------*FORM FRM_BDC_FIELD USING I_FNAM TYPE BDCDATA-FNAMI_FVAL TYPE ANY.CLEAR IW_BDCDATA.IW_BDCDATA-FNAM = I_FNAM..IW_BDCDATA-FVAL = I_FVAL.APPEND IW_BDCDATA TO IT_BDCDATA.ENDFORM. " FRM_BDC_FIELD*&---------------------------------------------------------------------* *& Form FRM_GET_DATA*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * --> p1 text* <-- p2 text*----------------------------------------------------------------------* FORM FRM_GET_DATA .IW_LFA1-LIFNR = '19022'.IW_LFA1-KTOKK = '0001'.IW_LFA1-LAND1 = 'JP'.IW_LFA1-NAME1 = 'RISTECH006'.IW_LFA1-SORTL = 'RIS'.APPEND IW_LFA1 TO IT_LFA1.IW_LFA1-LIFNR = '19023'.IW_LFA1-KTOKK = '0001'.IW_LFA1-LAND1 = 'JP'.IW_LFA1-NAME1 = 'RISTECH007'.IW_LFA1-SORTL = 'RIS'.APPEND IW_LFA1 TO IT_LFA1.ENDFORM. " FRM_GET_DATA。
在网上遇到一些有关ABAP的培训笔记,感觉整理的还可以,把它整理在些,如果有时需要,也可以参考,从现在开始,我决定扎实写两年ABAP程序,从程序中体会流程,从流程体会编程思想,以真正提高自己的的逻辑思维能,这也是我学技术最后几年,我后慢慢从技术过到业务流珵。
Select语句的使用关键字into后可以加structure(结构体), internal table(内表) 和field list(字段列表) Authority 权限程序员可以根据权限对象创建权限实例而basic 负责将权限分配给其他用户At selection-screen在选择屏幕中输入值后,点击屏幕左上角的运行按钮或按回车键时,可以对输入的数据进行有效性校验.重点: at selection-screen 最大的作用是检查当前用户是否具有对输入数据进行操作的权限程序中第一个事件块是load-of-program 也可以附加使用initialization但是不能只程序中事件的启动顺序1. Load-of-program2. (Initialization) (optional event block 可选事件块)3. At selection-screen4. Start-of-selection (default event block 缺省事件块)5. At line-selection注意:当程序中没有指定任何事件块时, 系统默认为start-of-selection事件用户双击basic list screen的一条数据时,系统从隐藏域中查找相应的数据.并将数据回传给全局变量中去.当双击一条数据的时候sy-lsind + 1当没找到at line-selection事件块时,sy-lsind又自动减1Selection screen选择屏幕选择屏幕的属性1. Input help 输入帮助Possible entries help 可输入值帮助2. Value entry 定制字段可选择范围3. Type checksMultilingual capacity 多语言4. Variants 变式变式的创建1. 将选择屏幕中的输入域填写完毕2. 将其保存为变式1) 输入变式名2) 输入变式描述3) 为变式设定相关属性注意:一定要将屏幕中的值填写完毕以后再保存变式变式的特点1. 可以简化输入2. 可以用于后台自动运行程序, 而不需要用户自己输入值重点: variant 变式是client-specifc client依赖的.Seletion screen 选择屏幕定义选择屏幕上的字段有两种方式1. single value input单值输入选择屏幕, 使用parameters 关键字定义.2. multiple value input 多值输入选择屏幕,使用select-options 关键字定义parameters功能: 用户可以通过选择屏幕输入查询条件对数据库进行访问.使用parameters 定义选择屏幕的两点限制1. 变量名的字数长度不可以超过8个字符.2. 给定义的时候赋值需要用关键字default 而不能用value定义语法: parameters <变量名> type <类型>.注:如果使用data element定义变量,则该变量也具有语义意义.Selction screen 的执行顺序:1. 程序启动时,触发load-of-program 事件.2. 显示层弹出屏幕3. 用户输入值并确定屏幕后,触发start-of-selection事件4. 输入的值被传到内存中,进一步处理执行顺序实例:Parameters pa_carr type spfli-carrid.Load-of-program.Pa_carr = ‘LH’.Start-of-selection.Pa_carr=’DL’.Write pa_carr.屏幕弹出时, 输入域中为LH , 确定屏幕后, 显示值为DL.Value Sets(SELECT-OPTIONS) 多值输入屏幕Parameters 与select-options 的区别1. parameters 定义的变量是不可分解的变量2. select-options ,表面上定义的是一个字段, 实际上定义的是字段取值范围的内表select-options功能:根据用户输入的value range 取值范围到数据库中查找符合范围的数据Select-options 定义的内表重要: Select-options 内表具有表头行该内表有4个字段1. Sign 符号标示取值: I (included 被包含) , E (excluded 不被包含).2. Option 操作取值: BT(between 在范围之间) , EQ(equal 等于)3. Low 最小值取值: 用户输入的最小值4. High 最大值取值: 用户输入的最大值当屏幕弹出后, 点击mulitple selction按钮可以加入其他选择范围范围包括1. single value include 单值包含2. range inculde 范围包含3. single value exclude 单值不包含4. range exculde 范围不包含select-options 运行原理1. 程序运行后, select-options创建的内表中没有数据2. 屏幕弹出后,用户输入数据3. 此时,系统将字段范围保存到该内表中4. 用户确定屏幕后,系统将内表中的信息翻译成对应的native SQL5. 数据库将符合用户输入范围的数据返回给用户注意:使用loop at 循环一个带有head line 的内表, 不需要加[].Selction screen events 选择屏幕事件事件启动流程1. 程序启动后,触发load-of-program或initialization 事件对变量进行初始化2. 如果有parameters 或select-options屏幕变量,则会弹出选择屏幕3. 用户输入值后,点击回车或运行(F8)(有区别,见下文) 完成屏幕输入4. 如果程序中有at selection-screen 事件的话, 这时它就会被触发,它的功能是对用户输入的值进行校验, 而最主要的功能是,判断用户是否具有对该数据进行操作的权限.5. 当校验成功后, start-of-selection 别触发.并显示Basic list screen6. 双击其中一条数据, 则会触发at line-selection……..重点: 回车和运行(F8)的区别1. 回车: 仅仅具有校验功能, 无论校验成功与否, 程序都不会往下执行2. 运行(F8): 校验成功后程序才能往下运行, 如果校验失败,程序无法继续运行注意: at selection screen 的主要功能是authority check 权限校验, 如果校验失败,则应该生成一个E (error)类型的message 以通知用户校验失败.User Dialog screen 用户会话屏幕(或称为Dynpro Screen ,standard screen)Dynpro screen 功能: 用户可以通过屏幕录入或修改数据Dynpro screen 参数1. Attributes屏幕属性: screen number short text next screen screen type2. Layout 屏幕布局: 屏幕属性的摆放顺序3. Element list 元素列表: 所有元素的集合4. Flow control 控制流程: flow logic 流逻辑(dynpro screen PBO 和PAI事件中所调用的module模块).Dypro screen Attributes属性1. Screen number: 屏幕编号3位2. short text : 屏幕描述3. Nex screen: 下一屏幕编号, 当该屏幕结束后所执行的屏幕, 编号为0时, 程序将会在调用屏幕的语句后继续运行.4. Screen type :屏幕类型normal一般屏幕,subscreen子屏幕,modal dialog box 模态窗口Dypro screen 运行流程1. 使用call screen 100(屏幕编码), 调用一个屏幕2. 屏幕弹出之前, 启动PBO事件3. 用户在屏幕输入值并确定后,输入的值会被传入到内存变量当中4. 当屏幕关闭时,PAI事件触发5. PAI结束以后, 程序将会根据该屏幕的next screen 跳到下一屏幕6. 当next screen 为本屏幕的编号, 则需要使用自定义按钮退出屏幕,否则会出现屏幕死循环现象.PBO module: PBO 事件对应的模块PAI module. PAI 事件对应的模块Next screen 的配置1. 静态配置: 通过dynpro screen 自身属性配置next screen2. 动态配置: 在程序的PAI事件中使用关键字SET screen 200(下一屏幕编号)定义下一屏幕, 当PAI运行到该语句时, 该屏幕的静态配置则会被动态配置所覆盖使用T CODE 运行屏幕功能: 使用T CODE可以使ABAP以外的配置人员在work bench 以外运行屏幕.Dynrpo screen 在程序中可以使用的位置1. 触发Start-of-selection,生成basic list screen2. 双击单条数据3. 触发at line-selection 事件4. 在这个事件中call screen 100.5. 弹出dynpro screen, 用户输入相关值6. 点击save 保存到数据库,点击back 返回到basic list screenScreen painter 屏幕绘制器功能:专门绘制ABAP屏幕的程序,可以绘制dynpro screen注意:必须在安装GUI的时候选择并安装.可以通过screen 屏幕上的LAYOUT 键,可以进入screen painter ,通过Graphical layout editor 布局编辑器对布局进行编辑Dynpro Screen 具体操作1. 根据spfli-carrid字段建立paramters选择屏幕2. 根据spfli 建立结构体变量wa_spfli3. 在start-of-selection事件中打印Basic list screen屏幕4. 在at line-selection 事件中call screen 1005. 建立屏幕100 , 填写描述和next screen6. 通过screen painter 编辑screen 100的布局7. 通过字典库结构体sdyn_conn 在屏幕上批量加入字段8. 创建两个push button,名字分别为SAVE 和BACK ,描述以及Fcode 都于按钮名相同9. 在屏幕的Element list 选项卡中, 在最后一行添加字段OK_CODE10. 保存屏幕并激活11. 在程序中声明变量OK_CODE与屏幕字段相对应, 注: TYPE ok_code LIKE sy-ucomm.12. 在屏幕Flow logic 选项卡中打开PBO注释中的module ,并且将module创建在主程序内13. 在主程序中创建结构体变量sdyn_conn, 使内存中的字段变量能够与屏幕中的字段同名对应注:TABLES sdyn_conn14. 在PBO module中, 首先清空OK_CODE 通过hide area隐藏域回传的字段到数据库中查找相应的数据,并将数据传递到sdyn_conn结构体变量中.15. 打开PAI module的注释并将module创建到主程序中.16. 对OK_CODE进行CASE判断,如果为SAVE则提示message信息,如果为BACK,则通过关键字SET SCREEN <屏幕编号> 跳转到指定的屏幕中去17. 保存整个程序并激活.重点:在PBO事件中第一步一定要清空OK_CODE (CLEAR ok_code)1. 假如ok_code没有清空.2. 当用户第一次进入屏幕并点击保存按钮时(例如:SAVE),这时ok_code 的值为SAVE,3. 当用户第二次进入屏幕时, 由于ok_code没有被清空,所以ok_code依然为SAVE,4. 当屏幕数据还没有输入完整时, 用户可能会通过点击push button 以外的方式结束屏幕.5. 这时,程序触发PAI事件, 而PAI事件会进入CASE 中的WHEN ‘SAVE’语句, 此时很可能对数据库产生误操作.6. 所以,PBO中一定要清空ok_code 以避免以上情况暂时消息:可以使用message ‘hello’ type ‘I’.Global modularization 全局模块化Function module : 属于repositiry 中对对象, 封装了最为常用的代码.Fuction group1. 是多个function module的集合2. 拥有组内所有module 可以共享的对象Function group 工作原理:1. 当一个Function group中某一个Function module,被程序第一次调用的时候2. Function group 中所有的组成部分(包括共享对象和modual) 都会被调入内存.3. 当第二个程序再一次调用group中的module 时, 就可以直接从内存中调用module 了4. 当程序完成并不再使用module时, funtion group就会在内存中被清除注意:Function group不能太大,粒度不适合过大. 每一次调用,都会将group所有部分调入到内存, 如果过大,则会降低系统运行效率.Function group 共享性如果group 中的一个module 修改了group 中的属性, 那么当组内的module再次访问该属性时,显示的属性就是已经修改后的属性Function group 需要通过接口来调用Function moduleFucntion module 类型1. normal Fucntion module 一般类型2. Remote-enabled module 可被远程调用类型3. Update module 更新类型Function module interface 参数1. Import 输入参数2. Export 输出参数3. Changing 更改参数重要: 声明module 时, 参数要以module 内部为参照体, 进来的数据为import , 出去的数据为export.而当程序调用module时, 则需要以程序内部为参照体, 出去的数据为export, 进来的的数据为inport注意:Import 和export 参数都是可选的, 也可以设定为pass value值传, 缺省以及推荐传送方式是引用传. 由于调用module 时, 需要调用group的整个数据, 数据量较大, 所以选择引用传能提高效率.Function module 的创建1. 右键package--- create ----function group 创建function group 注意: function group 不能重名2. 在function group下创建function module3. 设定fuction module interface 参数4. 在source code 中写入执行的代码5. 建立程序调用function module6. 点击Pattern 按钮, 在CALL FUNCTION 选项中输入module名,确定7. 修改参数值注意: 一定要将程序中的参数与module中的参数相对应8. 当function 调用成功后, 系统变量sy-subrc = 0.Classes and Objects 类和对象ABAP 可以创建一个引用类型的数据类型DATA ref1 TYPE REF TO class. 注:Class是数据类型DATA ref2 TYPE REF TO class.定义两个能指向class 的指针CREATE OBJECT ref1CREATE OBJECT 相当于java 中的new方法的调用CALL METHOD ref1 -> meth1 (方法名)EXPORTINGIMPORTINGEXCEPTIONS面向对象中封装了很多组件1. 一个BOR business object repositiry 包含多个BO business object2. 一个商业对象business object 包含多个BAPI Business APIBAPI: 属于全局调用的方法,业务层的函数Standardlized BAPIs ---标准化的BAPIs1. GetList2. GetDetail3. Create Change, Delete Cancel4. Addlem RemoveItem.BAPI 就是function module , 相当于business function moduleCalling programs调用程序程序之间的调用.Insertion(谦让式)当程序A调用程序B时, 程序B占据栈顶,程序A压在下面, 当程序B执行完毕后,程序A继续执行Restart(抢占式)当程序A调用程序B时,程序A在栈顶被移出而被程序B所占据程序调用语句:在程序中使用submit关键字调用下一个程序1) Submit prog_name_2 (restart)2) Submit prog_name_2 and return (insertion)3) Submit prog_name_2 via selection-screen and return (insertion)via selection-screen作用: 如果程序2中有选择屏幕,则程序2被调用时会弹出屏幕RestartLeave to transaction <T-code>: 功能相当于输入”/n<T-code>”,当程序执行该语句时,该程序就会在内存被清空,接着转到相应的TCODE程序中去insertioncall transaction <T_CODE> [and skip first screen 忽略被调用程序的第一个屏幕]执行下一个程序, 当前程序会被压到栈的下一个位置而不会被清空重点: and skip first screen 忽略被调用程序的第一个屏幕,但是PBO 和PAI 的Module还会被执行.Memory management内存管理重要:当R/3 用户登陆系统的时候, 整个系统环境被称作user terminal session.其中包含:1. Internal session. 程序执行窗口2. External session. 用户的窗口Session流程1. 用户登陆系统时的系统环境为terminal session2. 此时系统开辟了一个External session,用户可以自主创建, 重要:最大数为63. 当一个程序运行的时候,该程序所占的区域为internal session, 相当于程序的内存区域Memory1. ABAP memory 属于一个External session 的内存区域2. SAP memory 属于一个terminal session 的内存区域在一个External session中, 程序A将数据存放至ABAP memory中, 程序B可以从中取出存放的数据.在同一个terminal session(同一个操作用户)的前提下, 程序A数据存放到SAP memory中, 程序B可以共享内存中的数据.在同一个External session 中, (External session相当于一个堆栈)Insertion程序A 调用程序B , 程序B 调用程序C此时internal session 从上到下的位置为C – B -- ARestart程序A 调用程序B, 程序A会在栈顶被拿掉, 被程序B占据位置注意: 例如,在restart情况下,堆栈中已经有程序A , B, C 三个程序, C在栈顶, 此时程序C调用了使用程序D所创建的TCODE,此时程序D将占据整个窗口, 与此同时,堆栈将全部被清空,ABAP memory也会被clear.。
ABAP笔记:BDC完整版例⼦BDC(batch data communication)是SAP常⽤的⼀种数据传输⽅法。
⽤于⼀些数据量⼤,但是对速度⼜要求不⾼的数据传输。
在实施中,很多开发顾问都忽略了BDC的⽇志和出错管理。
这给⽤户在使⽤中带来了很⼤的不便。
⽐如:哪些数据是成功⽣成的,哪些是失败的?那些失败的,原因的是什么?程序问题还是数据问题?我觉得,既然是要做⼀套程序,那就应该尽可能地为客户考虑,减少⽇后的维护量。
对于BDC程序来讲,⽇志和出错管理应该是必备的。
下⾯讲⼀下,BDC的两种通⽤写法。
1. Call Transaction: 顾名思义,就是直接调⽤BDC进⾏数据批量导⼊。
优点:⽅便快捷,程序处理⽅便。
缺点:⽇志管理能⼒差,需⾃⼰建透明表来维护数据。
我只是把它⽤作测试⽤途,不做正式使⽤。
2. BDC Insert:这是⼀种不直接运⾏,⽽是将BDC程序⽣成session,间接运⾏的⼀种⽅法。
优点:通过T-code SM35可以进⾏运⾏管理及⽇志管理,⽅便查错。
缺点:相对⽅法1来说实现起来⽐较繁琐。
我主要是⽤这种⽅法来实现BDC功能。
下⾯主要来谈⼀下BDC Insert这种⽅法。
1. 需要在程序中调⽤ function 'BDC_INSERT'来把BDCDATA⽣成SESSION.2. 程序RSBDCSUB是执⾏SESSION的专⽤程序,要建⽴相应的VARIANT,后续建⽴JOB中使⽤3. 建⽴BATCH JOB来定期执⾏RSBDCSUB,从⽽实现,SESSION⾃动执⾏的⽬的4. 当然,不使⽤程序RSBDCSUB和JOB,每次⼿⼯在SM35中执⾏SESSION也是可以的下⾯是我写的⼀个实例:*----------------------------------------------------------------------** Program Name: Z_KEVIN_ADV_BDC* Project : N/A* Author : Kevin.Zhang* Date : 2007.1.1* Module : N/A* Description : Advanced BDC**** Special features: N/A***----------------------------------------------------------------------** Modifications:* Author Date Commented as Description*----------- -------- ----------- ----------------------------------***----------------------------------------------------------------------*REPORT Z_KEVIN_ADV_BDC.*$*$----------------------------------------------------------------$*$**$*$ Global Types, Data Statements, Ranges, Constants $*$**$*$----------------------------------------------------------------$*$**-----------------------------------------------------------------------* Tables*-----------------------------------------------------------------------TABLES: COAS, CEPC.*-----------------------------------------------------------------------* Internal Tables and Work Areas*-----------------------------------------------------------------------DATA: BEGIN OF GT_TABLE OCCURS 0, "internal order tableAUART LIKE AUFK-AUART, "order typeAUFNR LIKE AUFK-AUFNR, "order numberKTEXT LIKE AUFK-KTEXT, "descriptionBUKRS LIKE AUFK-BUKRS, "company codeGSBER LIKE AUFK-GSBER, "business areaPRCTR LIKE AUFK-PRCTR, "profit centerFUNCA LIKE AUFK-FUNC_AREA, "function areaEND OF GT_TABLE.DATA: BEGIN OF GT_EXISTS OCCURS 0. "existed IOINCLUDE STRUCTURE GT_TABLE.DATA: END OF GT_EXISTS.DATA: BEGIN OF GT_PRFT_CNTR OCCURS 0."the profit center not existing IOINCLUDE STRUCTURE GT_TABLE.DATA: END OF GT_PRFT_CNTR.DATA: BEGIN OF GT_SUBMIT OCCURS 0. "the submitted IOINCLUDE STRUCTURE GT_TABLE.DATA: END OF GT_SUBMIT.DATA: BEGIN OF GT_BDCDATA OCCURS 0. "BDC DATAINCLUDE STRUCTURE BDCDATA.DATA: END OF GT_BDCDATA.DATA: BEGIN OF GT_MESSTAB OCCURS 10. "message tableINCLUDE STRUCTURE BDCMSGCOLL.DATA: END OF GT_MESSTAB.DATA: GT_IMESG LIKE MESG OCCURS 0 WITH HEADER LINE.*-----------------------------------------------------------------------* Variables*-----------------------------------------------------------------------DATA: GV_GROUP(12) TYPE C VALUE 'INTERNAL_ORD', "BDC NameGV_USER(12) TYPE C, "BDC UserGV_KEEP(1) TYPE C VALUE 'X', " ' '=Delete,'X'=keep after processingGV_HOLDDATE LIKE SY-DATUM. "DateDATA: GV_FLAG(1) TYPE C,GV_LIN TYPE I. "number of ordersDATA: GV_C170(170),GV_C_ULINE(50) VALUE '__________________________________________________'. *$*$----------------------------------------------------------------$*$**$*$ Selection Screen $*$**$*$----------------------------------------------------------------$*$**-----------------------------------------------------------------------* Selection Screen*-----------------------------------------------------------------------PARAMETERS: BDCTYPE(1) TYPE C DEFAULT 'B' NO-DISPLAY,BDCMODE LIKE BDCRUN-BDC_AMODUS DEFAULT 'A' NO-DISPLAY. SELECTION-SCREEN COMMENT 10(70) TEXT-001.PARAMETERS: IN_FILE(128) DEFAULT 'C:/TEMP/*.txt'.SELECTION-SCREEN SKIP 1.*-----------------------------------------------------------------------* At Selection Screen*-----------------------------------------------------------------------*--------- AT SELECTION-SCREEN ON VALUE-REQUEST ----------AT SELECTION-SCREEN ON VALUE-REQUEST FOR IN_FILE.CALL FUNCTION 'WS_FILENAME_GET'EXPORTINGDEF_FILENAME = '*.txt'DEF_PATH = 'C:/DATA'MASK = ',All Files,*.*,Text Files,*.txt;*.doc.'MODE = 'O'TITLE = 'Please choose file to use 'IMPORTINGFILENAME = IN_FILEEXCEPTIONSINV_WINSYS = 1NO_BATCH = 2SELECTION_CANCEL = 3SELECTION_ERROR = 4OTHERS = 5.*$*$----------------------------------------------------------------$*$**$*$ Main Program $*$**$*$----------------------------------------------------------------$*$**--------- START-OF-SELECTION ----------START-OF-SELECTION.REFRESH GT_TABLE.* Uploading the data which will be inserted into the internal tableCALL FUNCTION 'WS_UPLOAD'EXPORTINGFILENAME = IN_FILEFILETYPE = 'DAT'TABLESDATA_TAB = GT_TABLEEXCEPTIONSCONVERSION_ERROR = 1FILE_OPEN_ERROR = 2FILE_READ_ERROR = 3INVALID_TABLE_WIDTH = 4INVALID_TYPE = 5NO_BATCH = 6UNKNOWN_ERROR = 7OTHERS = 8.IF SY-SUBRC <> 0.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000''Unable to upload input file 'IN_FILE '' ''.ENDIF.SORT GT_TABLE BY AUFNR GSBER DESCENDING.DELETE ADJACENT DUPLICATES FROM GT_TABLE COMPARING AUFNR. PERFORM OPEN_GROUP.PERFORM FILL_BDC_DATA.PERFORM BDC_CLOSE_GROUP.PERFORM WRITE_REPORT.*--------- END-OF-SELECTION ----------*$*$----------------------------------------------------------------$*$**$*$ Subroutines $*$**$*$----------------------------------------------------------------$*$**&---------------------------------------------------------------------**& Form OPEN_GROUP*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM OPEN_GROUP.GV_USER = SY-UNAME.CALL FUNCTION 'BDC_OPEN_GROUP'EXPORTINGCLIENT = SY-MANDTGROUP = GV_GROUPHOLDDATE = GV_HOLDDATEKEEP = GV_KEEPUSER = GV_USER.IF SY-SUBRC <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ENDIF.ENDFORM. " OPEN_GROUP*&---------------------------------------------------------------------**& Form FILL_BDC_DATA*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM FILL_BDC_DATA.CLEAR GT_TABLE.LOOP AT GT_TABLE.CLEAR GT_MESSTAB.CLEAR GT_BDCDATA.REFRESH GT_BDCDATA.REFRESH GT_MESSTAB.CLEAR GV_FLAG.* Check if Profit Center exists.SELECT SINGLE * FROM CEPCWHERE PRCTR = GT_TABLE-PRCTR.IF SY-SUBRC <> 0.CLEAR GT_PRFT_CNTR.MOVE-CORRESPONDING GT_TABLE TO GT_PRFT_CNTR.APPEND GT_PRFT_CNTR.GV_FLAG = 'X'.ENDIF.* check if Internal Order has already been created.SELECT SINGLE * FROM COASWHERE AUFNR = GT_TABLE-AUFNR.IF SY-SUBRC = 0.CLEAR GT_EXISTS.MOVE-CORRESPONDING GT_TABLE TO GT_EXISTS.APPEND GT_EXISTS.GV_FLAG = 'X'.ENDIF.IF GV_FLAG <> 'X'.PERFORM BDCDATA USING: 'X' 'SAPMKAUF' '0100', "order type' ' 'COAS-AUART' GT_TABLE-AUART,' ' 'BDC_OKCODE' '=KOKR'.PERFORM BDCDATA USING: 'X' 'SAPLSPO4' '0300', "control area' ' 'SVALD-VALUE(01)' '1000',' ' 'BDC_OKCODE' '=FURT'.PERFORM BDCDATA USING: 'X' 'SAPMKAUF' '0100', "ok code' ' 'BDC_OKCODE' '/00'.PERFORM BDCDATA USING: 'X' 'SAPMKAUF' '0600', "order master data ' ' 'COAS-AUFNR' GT_TABLE-AUFNR,' ' 'COAS-KTEXT' GT_TABLE-KTEXT,' ' 'COAS-BUKRS' GT_TABLE-BUKRS,' ' 'COAS-GSBER' GT_TABLE-GSBER,' ' 'COAS-PRCTR' GT_TABLE-PRCTR,' ' 'COAS-FUNC_AREA' GT_TABLE-FUNCA,' ' 'BDC_OKCODE' '=SICH'.* PERFORM CALL_TRANSACTION. "for test purposePERFORM BDC_INSERT.MOVE-CORRESPONDING GT_TABLE TO GT_SUBMIT.APPEND GT_SUBMIT.ENDIF.ENDLOOP.ENDFORM. " FILL_BDC_DATA*&---------------------------------------------------------------------**& Form BDC_INSERT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM BDC_INSERT.CALL FUNCTION 'BDC_INSERT'EXPORTINGTCODE = 'KO01'TABLESDYNPROTAB = GT_BDCDATA.IF SY-SUBRC <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ENDIF.ENDFORM. " BDC_INSERT*&---------------------------------------------------------------------**& Form BDC_CLOSE_GROUP*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM BDC_CLOSE_GROUP.CALL FUNCTION 'BDC_CLOSE_GROUP'.IF SY-SUBRC <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.ENDFORM. " BDC_CLOSE_GROUP*&---------------------------------------------------------------------**& Form CALL_TRANSACTION*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM CALL_TRANSACTION.CALL TRANSACTION 'KO01' USING GT_BDCDATA MODE BDCMODEMESSAGES INTO GT_MESSTAB.* IF SYST-SUBRC <> 0.* CALL FUNCTION 'WRITE_MESSAGE'* EXPORTING* MSGID = SY-MSGID* MSGNO = SY-MSGNO* MSGTY = SY-MSGTY* MSGV1 = SY-MSGV1* MSGV2 = SY-MSGV2* MSGV3 = SY-MSGV3* MSGV4 = SY-MSGV4* MSGV5 = ' '* IMPORTING* ERROR = ERROR* MESSG = MESSG* MSGLN = MSGLN.ENDFORM. " CALL_TRANSACTION*&---------------------------------------------------------------------**& Form BDCDATA*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->P_0310 text* -->P_0311 text*----------------------------------------------------------------------*FORM BDCDATA USING P_BEGIN P_FIELD1 P_FIELD2. CLEAR GT_BDCDATA.CASE P_BEGIN.WHEN 'X'.GT_BDCDATA-PROGRAM = P_FIELD1.GT_BDCDATA-DYNPRO = P_FIELD2.GT_BDCDATA-DYNBEGIN = 'X'.WHEN SPACE.GT_BDCDATA-FNAM = P_FIELD1.GT_BDCDATA-FVAL = P_FIELD2.ENDCASE.APPEND GT_BDCDATA.ENDFORM. " BDCDATA*&---------------------------------------------------------------------**& Form WRITE_REPORT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM WRITE_REPORT.DESCRIBE TABLE GT_EXISTS LINES GV_LIN.IF GV_LIN >= 1.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000''The following Internal Orders already exist.' '' '' ''. PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GV_C_ULINE '' '' ''.LOOP AT GT_EXISTS.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GT_EXISTS-AUFNR '' '' ''. ENDLOOP.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GV_C_ULINE '' '' ''.ENDIF.DESCRIBE TABLE GT_PRFT_CNTR LINES GV_LIN.IF GV_LIN >= 1.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000''The following Profit centers do not exist.' '' '' ''. PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GV_C_ULINE '' '' ''.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000''Internal Order Profit Center.' '' '' ''.LOOP AT GT_PRFT_CNTR.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GT_PRFT_CNTR-AUFNRGT_PRFT_CNTR-PRCTR '' ''. ENDLOOP.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GV_C_ULINE '' '' ''.ENDIF.DESCRIBE TABLE GT_SUBMIT LINES GV_LIN.IF GV_LIN >= 1.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000''BDC was created for the following Internal Orders.''' '' ''.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GV_C_ULINE '' '' ''.LOOP AT GT_SUBMIT.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GT_SUBMIT-AUFNR '' '' ''. ENDLOOP.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GV_C_ULINE '' '' ''.ENDIF.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000''The following Internal Orders have no Business Area.''' '' ''.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GV_C_ULINE '' '' ''.DELETE GT_TABLE WHERE NOT GSBER = ' '.LOOP AT GT_TABLE.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GT_TABLE-AUFNR '' '' ''. ENDLOOP.PERFORM COLLECT_MESSAGES USING 'Z3' 'I' '000'GV_C_ULINE '' '' ''.ENDFORM. " WRITE_REPORT*&---------------------------------------------------------------------**& Form COLLECT_MESSAGES*&---------------------------------------------------------------------** Collects messgaes into rep tree table and writes them to * screen for regular reporting*----------------------------------------------------------------------** -->P_MSGID message id* -->P_MSGTY messgae type* -->P_MSGNR msg number* -->P_MSG1 text 1* -->P_MSG2 text 2* -->P_MSG3 text 3* -->P_MSG4 text 4*----------------------------------------------------------------------*FORM COLLECT_MESSAGES USING P_MSGIDP_MSGTYP_MSGNRP_MSGV1P_MSGV2P_MSGV3P_MSGV4.CLEAR GT_IMESG.GT_IMESG-ARBGB = P_MSGID.GT_IMESG-MSGTY = P_MSGTY.GT_IMESG-TXTNR = P_MSGNR.GT_IMESG-MSGV1+0(2) = '@ '.GT_IMESG-MSGV1+2(48) = P_MSGV1.GT_IMESG-MSGV2 = P_MSGV2.GT_IMESG-MSGV3 = P_MSGV3.GT_IMESG-MSGV4 = P_MSGV4.APPEND GT_IMESG.CONCATENATE P_MSGV1 P_MSGV2 P_MSGV3 P_MSGV4 INTO GV_C170 SEPARATED BY SPACE.WRITE:/ GV_C170.ENDFORM. " collect_messages。
如何设置字段串和使用字段串?DATA: BEGIN OF ADDRESS,NAME(20) TYPE C,STREET(20) TYPE C,NUMBER TYPE P,POSTCODE(5) TYPE N,CITY(20) TYPE C,END OF ADDRESS.该示例定义了一个长度为73的字段串ADDRESS。
可以通过ADDRESS-NAME、ADDRESS-STREET等定址组件。
可以将长字段串的声明收集在包括程序中。
但是,如果频繁使用该数据结构,则最好将它们保存在ABAP/4词典中。
13.LIKE参数,语法如下:DATA LIKE .利用LIKE参数,可以将已定义数据对象的数据类型分配给变量。
LIKE参数常用于附属字段以临时保存数据库字段的内容。
如果更改数据库字段的属性,则系统自动改写备份字段的属性。
可将任何数据对象用于。
利用LIKE参数,可以引用在ABAP/4词典中声明的数据对象的数据类型。
如: DATA NUMBER_1 TYPE P.DATA NUMBER_2 LIKE NUMBER_1.DATA MYNAME LIKE SY-UNAME.14.STATICS 语句:如果要在过程的运行时间之外仍保留某变量的数值,可以在该过程中利用STATICS语句定义该变量。
STATICS语句是DATA语句的变异。
语法如下: STATICS [] [] [].要在过程中将字段串定义为静态有效,请写:STATICS: BEGIN OF ,,..............END OF .15.TABLES语句:TABLES利用TABLES语句,可以创建称为表工作区的数据对象。
表工作区是参考ABAP/4词典对象的字段串。
是ABAP/4词典对象的名称,同时也是创建的表工作区的名称。
表工作区组件的顺序和名称与在ABAP/4词典中声明的对象相同。
要在ABAP/4词典中创建对象,步骤:Tools->ABAP Workbench->Development->ABAP Dictionary。
ABAP笔记1. ABAP(Advanced Business Application Programming):是一种易于访问数据库的高级开发语言。
它以开发报表为主,主要用于开发符合项目及运维人员要求的CBO(Customer Bolt On,客户自己追加开发的)程序。
之所以说它是一种高级语言,是因为ABAP语言不仅能从数据库中取出简单的数据,而且首次出现了程序和数据库逻辑清晰结合的上层数据库结构(LDB).2.SAP方法论(流程):项目准备(要件定义)、蓝图设计(基本设计和详细设计)、系统实现(实施开发,运用ABAP语言)、最后准备(程序测试和数据导入)、上线支持(运维和人员培训)。
3.SAP经典三层架构:一台数据库服务器(RDBMS)、一台或多台应用软件服务器以及任意数量的呈现服务器(前端客户)。
(1)呈现服务器:展示在屏幕上,所有的系统反馈以及操作指令都在展示层上呈现。
指令发给应用服务器。
(2)应用服务器:所有的业务层都在应用服务器上,是SAP程序实际执行的应用层,是ABAP的操作基础。
(3)数据库:应用服务器产生的数据都存储在关系数据库中。
系统在程序开始后,会把所有程序上下文(即相关应用环境)从知识库中读到应用服务器上。
包括:存储变量和复杂对象的内存区,用户会话的屏幕信息,ABAP程序块等。
4.ABAP常用工具:ALV、smartform、dialog、5.SAP界面简洁:菜单栏、标准工具栏(有命令域、后退、保存)、标题、应用工具栏(各种功能按钮)。
6.查找某一个T-CODE的路径的事务代码:SEARCH_SAP_MENU7.SE80对象导航器,可以查询/创建package/程序/本地对象等,SE38编辑/修改程序、程序属性等,SE91消息维护与查询,8.SAP每完成一步都会有消息提示,在系统中消息有四个要素:语言代码、消息类、消息序列号、消息文本。
程序中消息类型共有6种:A(异常,终止当前事务)、E(错误,需要重新输入正确的内容才可进行后续操作)、I(信息提示框,回车后可以继续处理)、S(成功,)、W(警告,可更改内容或者直接回车)、X(系统错误,荡机时出现)。
ABAP 数据类型内置数据类型,abap内置数据类型是指SAP运行时系统提供给程序的数据类型,它们在SAP内核中定义,可以直接使用.文本类型C类型Data v1 (10) type c. 声明长度为10的字符串Data v2 (1)type c.Data v2 type c. 1位是默认的,什么都不写也是1Data v2. C是默认的数据类型什么都不写也是 type c.以上三条语句一样的效果v 1 = ‘ abc’. “进行赋值N类型和C类型类似,但是只能存储数字,比如员工号码,手机号码,房间号,主要用于不能进行运算的数字Data v1 (10)type n. “声明长度为10的数字”V1 = ‘####1数字类型小数字符要用’’包围V2 = ‘2 . 3’.日期类型d, 是一个8位的字符串 YYYYMMDD时间类型t,是一个6位字符串 HHMMSSData v1 type d.Data v2 type t.V1 = ‘20151231’V2 = ‘153001’这些内置类型只要分为两类:C,N,T,D,I,F,P,X定义的对象长度在运行期间不能改变,因此这八种类型称为定长类型。
而String , Xstring生成的数据对象其长度无需指定,且在程序运行过程中可以随意改变,因而称为长度可变的数据类型. C,N,P,X 四种数据类型需要在程序里编码指定其长度,而T,D,I,F 不能也不需要指定长度,其使用的就是其默认长度. C,N,T,D 通称为字符类型,有类似的操作处理。
如果程序里不声明具体的类型,那么系统默认的类型是C如: data: g_type.那么g_type就被定义为长度是1的 c 类型变量.I,P,F 通称为数值类型,均可用于算数运算。
I 类型可用于计数器,索引值等。
自定义数据类型abap中使用types 语句定义数据类型,使用data语句声明变量,一般自定义数据类型用ty开头。
系统内置数据对象基本都是SY开头,有上百个.输出字符串data : v1 (20) type c.data : v2 (10) type c.v1 = ‘ 12345667’v2 = ‘9876543’write : v1 , v2 .这里 V1 定义了长度20 所以 12345667后面跟了补全的空格他是根据你定义的数据长度显示输出的,不是自动调整输出长度的。
目录1. 报表知识 (6)1.1基础知识 (6)1.1.1报表事件,有哪些? (6)1.1.2报表选择画面 (7)1.2ALV报表 (8)1.2.1ALV报表实现的流程 (8)1.2.2显示ALV常用的两个FM (8)1.2.3如何设置ALV中的热键 (8)1.2.4ALV显示中的小计 (8)1.2.5FM ALV 和 OO ALV的比较 (8)1.3WRITE LIST (8)2. 数据库知识 (9)2.1基础知识 (9)2.1.1 ABAP数据字典有哪些对象或元素? (9)2.1.2 据库提交确认和数据库回滚取消语句 (9)2.1.3 什么是LUW (9)2.1.4简述modify 、insert、update对数据库表做操作时的影响 (9)2.1.5 要描述域、数据元素、表字段之间的关系 (9)2.1.6数据字典有几种缓冲方式,适用范围? (9)2.2ABAP和数据库 (10)2.2.1 ABAP 数据表的主索引是什么?索引的好处与坏处?与建索引的注意事项! (10)2.2.2 ABAP透明表有哪几种数据类(data class)?对数据的存储有什么影响? (10)2.2.3 SAP中有几种表,他们的区别是什么? (10)2.2.4什么是簇表(cluster table)?举出知道的簇表。
(10)2.2.5找数据库表,有哪些常用的方法。
(10)2.2.6如何建立数据库锁对象,激活锁对象产生的Function Module的名字为什么,在何处查看锁表的情况? (10)2.2.7更新 FM 分为 V1 和 V2,那么首先会执行哪一种更新类型呢?每种类型又是以哪种模式(异步、同步或本地)执行的呢? (11)2.2.7使用OPEN SQL注意原则 (11)2.3与表相关 (11)2.3.1 MM模块有哪些常用表格 (11)2.3.2 HR模块知识:HR里面存储HR主数据主要用到了哪些表? (11)2.3.3 HR模块知识:HR程序在开发中常用的两个逻辑数据库是什么?分别对其进行描述 12 2.3.4 HR模块知识:HR模块里面,如何修改HR的信息类型,具体如何实现 (12)2.3.5财务模块:财务模块开发中常用的表有哪些,简单举例说明: (12)2.3.6PM 常用的TABLE (12)2.3.6inner join 与 left-outer join的区别? (13)3. 权限相关 (14)3.1什么是权限对象(Authorization Objects)?在 ABAP 程序中使用哪条语句进行授权检查? (14)3.2与权限对象有关的事务代码有哪些? (14)4. DIALOG (15)4.1DIALOG 中的几个事件 (15)4.2何在TABLE CONTROL中实现选中一行或多行的效果 (15)4.3DIALOG 开发的常用几个控件是什么? (15)5. BDC (16)5.1BDC录屏的事务代码 (16)5.2BDC与BAPI之间的区别 (16)5.3BDC录屏的注意事项 (16)5.4谈谈BDC的运行模式和更新模式 (16)6. 增强 (17)6.1什么叫增强?有哪些方式进行增强? (17)6.1.1 User EXIT (17)6.1.2 Customer exit (17)6.1.3 BADI (17)6.1.4 Enhancement Spot (17)6.2如何建立增强? (17)6.3与增强相关的事务代码有哪些 (18)6.4如何进行数据库表字段的增强?Append和Include的方式有何区别? (18)7. SMARTFORMS (19)7.1谈谈SmartForm中,Template和Table表格的区别 (19)7.2SMART FORM如何实现公司LOG打印,其步骤是什么? (19)7.3smartform 中如何控制段落、单个字符输出格式? (19)8. RFC和BAPI (20)8.1 RFC (20)8.1.1什么是RFC,有哪些通信模式? (20)8.1.2 RFC中涉及到常用的事务代码有哪些? (20)8.1.3根据调用方式的不同,RFC接口提供了什么样的服务? (20)8.1.4RFC接口的具体功能包括哪些? (20)8.1.5在通过CALL FUNCTION语句进行远程功能调用的基本模式有哪些 (20)8.1.6怎么创建一个支持远程调用的RFC (21)8.1.7怎么调用一个SAP标准RFC (21)8.1.8怎样建立RFC程序?RFC程序传递的参数都是传递值还是引用?如何建立函数组? 21 8.1.9怎么来维护这个DESTINATION(远程目标) (21)8.2 BAPI (21)8.2.1什么是BAPI?你使用过哪些BAPI实现什么功能? (21)8.2.2什么是业务对象类型?它包含哪些主件? (21)8.2.3如何创建一个BAPI? (22)8.2.4编写BAPI的注意事项有哪些? (22)8.2.5谈谈与BAPI相关的事务代码。
ABAP学习笔记--数据查询语句SELECTc通常使用Open SQL的数据查询语句SELECT将数据库条目选择到内存。
一.SELECT语句:1)SELECT用于确定读取数据表中的哪些字段;2)FROM子句用于确定从哪些内表或者视图中读取数据;3)INTO用于确定将数据读取到程序内的哪些数据对象;4)WHERE 用于限定选择条件;SELECT select_clause FROM from_clause INTO into_clause WHERE where_clause.在传统的ABAP语言中,如果使用TABLES语句声明表工作区,则可省略INTO子句(此方法已经被ABAP Object禁用)除以上4种外还有:GROUP BY:用于将一组数据条目压缩为一个单行作为选择最终结果;HAVING:用于限定ORDER BY子句子数据目组的选择条件;ORDER BY:用于限定行排序;SELECT整体语法结构:SELECT <result> FROM <source> INTO <target> [WHERE <condition>] [GROUP BY <fields>] [HAVING <cond>] [ORDER BY <fields>].二.选择单行数据:如果只需要选取一个结果数据行,系统在数据库种找到第一个符合条件的数据条目时,就停止查询。
单行选择需要在SELECT中使用SINGLE关键字,且INTO自居的结构必须为扁平结构:SELECT SINGLE <RESULT> INTO <target> FROM <source> ...如果系统找到一个完全符合指定条件的行,SY-SUBRC返回0,否则返回4。
1.选择全部字段一般不需要指明所有字段,而是在SELECT后用"*"符号,其中INTO语句种的目标对象最好与FROM种的类型相同。
ABAP笔记工作进程分类Dialog Work Process ,Update Work Process,Background Work Process,Enqueue Work Process,Spool Work ProcessR/3 application programs run within the R/3 Basis system on the work processes of application servers.work process containsABAP contains a special set of commands called OPEN SQL. This allowsyou to read from and write to the database regardless of the database you are using.每个屏幕都有一个mask,可以自己设置。
屏幕有两类事件:the Process Before Output (PBO) event is processed. When the user interacts with the screen, the Process After Input (PAI) event is processed. Each screen is linked to a single PBO processing block and a single PAI processing block. The PAI of a screen and the PBO of the subsequent screen together form a dialog step in the application program.The screen language is a special subset of ABAP, and contains only a few keywords.The most importantscreen keywords are MODULE, FIELD, CHAIN, and LOOP.Their only funciton is to link theprocessing logic to the flow logic, that is, to call modules in the processing logic, and control datatransfer between the screen and the ABAP program, for example, by checking fields.Each ABAP program consists of the following two parts:Declaration Part for Global Data, Classes and Selection ScreensThe following program types are relevant to application programming:Type 1we refer to type 1 programs asexecutable programs.Type Mit can only be controlled usingscreen flow logic. You must start them using a transaction code,You can start type J programs using a transaction codeABAP programs with type M contain the dialog modules belonging to the various screens. Type FType F programs are containers for function modules, and cannot be started using a transaction code or by entering their name directly.Type F programs are known as function groups.Type KThey are containers for global classes in ABAP ObjectsType K programs are known as classdefinitions.Type JThey are containers for global interface in ABAP ObjectsType J programs are known asinterface definitions.Type SType S programs are known as subroutine pools.Type IType I programs - called includesProcessing Blocks in ABAP ProgramsDialog ModulesYou call dialog modules from the screen flow logic (screen command MODULE).You can write a dialog module in an ABAP program for each state (PBO, PAI; user input) of any of the screens belonging to it. The interaction between the flow logic and the screen is controlled by a dialog processor.ABAP StatementsThe source code of an ABAP program consists of comments and ABAP statements. ABAP statements use ABAP data types and objects.The different statement categories are as follows:Declarative StatementsExamples of declarative keywords:TYPES, DATA, TABLESModularization StatementsThese statements define the processing blocks in an ABAP program.The modularization keywords can be further divided into:Event KeywordsAT SELECTION SCREEN, START-OF-SELECTION, AT USER-COMMANDDefining keywordsFORM ..... ENDFORM, FUNCTION ... ENDFUNCTION,MODULE ... ENDMODULEControl StatementsYou use these statements to control the flow of an ABAP program within a processing block according to certain conditions.IF, WHILE, CASECall StatementsPERFORM, CALL, SET USER-COMMAND, SUBMIT, LEAVE TOOperational StatementsWRITE, MOVE, ADDDatabase StatementsThese statements use the database interface to access the tables in the central database system. There are two kinds of database statement in ABAP: Open SQL and Native SQL. Open SQLOpen SQL is a subset of the standard SQL92 language. It contains only Data Manipulation Language (DML) statements,Open SQL contains all of the DMLfunctions from SQL92 that are common to all of the database systems supported by SAP. It alsocontains a few SAP-specific functions.Native SQLIt allows you to take advantage of all of your database’s characteristics inyour programs.Data Types and ObjectsABAP statements access these contents by addressing the name of the data object.Each ABAP data object has a set of technical attributes, The technical attributes of a data object are: Data type, field length, and number of decimal places.P57。
ABAP重点记录:透明表:在数据库服务器上物理的存储数据记录, 可以被ABAP程序访问,是所有控制字段的集合A 应用表 (主数据和业务数据)C 定制表, 仅由消费者维护, 非SAP输入L 存储当前数据表,传送空闲G 定制表, 不受 SAP 更新影响, 只 INS 全部E 控制表,SAP和用户有分开的关键字范围S 系统表, 只被SAP维护, 修改=调整W 系统表,内容可运输通过各个TR对象视图:是一组透明表在特定关系下的映射,可以被SQL程序访问,是事先已经运行过的SQL 的结果,无真实存储物理表,物化视图是提前执行SQL,真实存储在物理表中库:在表中抽取一部分,建立一个个性化的库数据元素:用二维表格形式来表示事物及其之间的关系,字段名、字段的数据类型合起来称为数据元素结构:是数据类型的定义在数据库服务器上没有物理的存储空间,也不能被ABAP程序访问内表多行,结构一行,簇表不能做内联接关键字是一组在表中可以唯一确定这条记录的字段,不能为空Database views :和数据库的视图形同,连接条件是必须自定义. Projection views: 用于屏蔽一些字段(一般用于保护数据时使用). Help views: 该类视图可以用搜索帮助的"selection method"中使用,参与连接表必须存在外键. Maintenance views:允许你进行对几个表的数据进行修改,参与连接表必须存在外键,他们的连接条件是不能自定义的;Append Views:这种视图主要用于增强;在四种类型视图只有Database views是通过inner join来建立.其他类型的视图使用的outer join 语句建立的ABAP改一个程序要用一个用户,不同用户改相同程序会生成不同的请求号内表关键字可以重复,内表做运算,是暂存表配置和程序跨CLIENT,业务数据不跨CLIENT语言代码ZH数据库中保存的1,要用1数据超过100万条不能用selectSLICENSE - Administer SAP Licenses 使用SAP Keygen算号GS01 - 创建集GS02 - 更改集GS03 - 显示集GS04 - 删除集SE81 - 应用层次SE30 - ABAP 对象运行时间分析SM50 - 工作进程概述SM36-定义后台jobSM37 - 作业选择概览SM38 - 队列维护事务SE93 - 维护事务代码(根据描述查事务码)/H调试权限SMARTFORMS - SAP Smart FormsSE54 - 生成表格视图SM31 - 调用诸如 SM30 的视图维护SE84根据结构查表或者ST05进行跟踪SE85根据字段查表SM58 - 异步 RFC 错误日志SCEM - CATT - EMSE80 - 对象浏览器(可建开发类)SM59 - RFC 目的(显示/维护)SE43 - 可用Tcode层次树SE09 -释放本地产生的传输请求SE91 - 消息维护CT04 - 特性管理CL02 - 分类管理ST22查看转储错误分析(短存储)OSS1-连接SAP OSSSPRO_ADMIN -定制项目管理SEARCH_SAP_MENU 在 SAP 菜单中查找SQ01 - SAP 查询: 维护查询用SQ01名称ZFIAP003创建,建立功能区选表LFA1供应商一般数据表格,msert table建立关联,LFA1、LFB1、LFBK、BAKA,用户组分配ZFISLOF,环境-查询,设计表格显示内容,ZFIAP004,点创建,显示功能区,调用功能区ZFIAP003。
ABAP 开发 笔录
事务代码:SE11 ABAP 字典
功能: 创建表、视图、数据类型、域
视图:把两个表内容显示在一起
事务代码:SE16 添加表内容
事务代码:SM31 一次增加多个表内容
事务代码:SE80 创建开发类
事务代码:SE38 ABAP 编辑器
ABAP 开发程序编写
ABAP 语句:
定义常量数据类型
C . 字符串
N 数字
I 整数 P 定义小数位数的数字 D 日期 “00000000”
T 时间 “000000”
F
X 例:data m1(10) type C. data m2 like zwanyan-NAME.
例:
例:tables :zwanyan.
select-options age for zwanyan-age default '10' to '60'.
创建录入框,从**至**
说明:先定义表,再选择表中字段从上下限选择。
常量赋值
** = ‘***’.
例:m1 = '12'.
m1 = m1*2.
输出
write:/(*) **.
例:write:/ m1.
write
转到选择文本定义成中文显示名称
例1:
data c type i.
parameter a type i default '1'. parameter b type i default '2'.
c = a + b.
if a > b.
write:/ c.
else.
write:/'3个数中第二大的是:',b. endif.
case a.
when '123'.
write:/ 'ok'.
when others.
write:/ 'not ok'.
endcase.
事务代码:SE91 维护消息类
例:
REPORT ZWY_5 MESSAGE-ID ZWY_1.
parameter a type i default '1'. parameter b type i default '2'.
tables:zwanyan.
select-options name for zwanyan-name.
MESSAGE i000.
data c type i.
data d like zwanyan-name.
c = a + b.
write:/ c.
write:/ d.
SAP程序消息类型有下列几种.
I:信息窗口W:警告E:错误S:成功A:终止程序或Tcode X:未知. Array
最多输入4个&,赋变量值,
SE90:根据消息号显示消息
熟悉几个名词:
1开发类(Development Class).
开发类可简单理解为逻辑上相关的一组ABAP对象,在将来传输时将使用同一传输层.实际上开发类本身也可看做是一个ABAP对象,可使用SE80建立.
$TMP是本地开发类,属于此开发类的任何ABAP对象(包括自定义的表,编写的程序等都只能在Client做测试用而不能被传输到其他Client.
包现在被用来代退开发类.
2.包(Package)
相关的ABAP对象被组合在一个包内,SE16:TADIR可看到被分配到某包的所有的ABAP对象,包决定了这些对象的传输层.
所有的包被存在表TDEVC中,建立包可使用SE80或直接使用SM30:V_TDEVC.
包作为开发类的退代和前身有这么几个加强特征.
1.包可嵌套使用(这点类似Java package)
2.包类可包含最多本包中可见的对象,这些对象在包外不可见
这点类似私有对象(Private object),在OOP中也很常见.
3.包可为包接口定义使用访问授权.
4.通常自定义包必须是Y或Z前坠,这点和其他ABAP对象相同(包其实也可看做ABAP
对象).其他一些包前坠A-S, U-X表示SAP标准包,T私有测试包,$本地临时包,/***名字空间前坠.
3.传输层(Transport Layer)
传输层决定包内对象是分配给本地还是可产生传输请求.
通常,开发系统都被分配了一个标准的传输层,当包被建立时,.它就被分配了一个标准传输层.包内对象也立即自动获得相关传输属性.
相关IMG配置使用的是标准的传输层.
通常由basis使用Tcode STMS配置传输管理系统维护传输曾和路由.
图2.13-1,显示的是从DVU开发的程序传输到QAS和PRD的传输路由,在图中程序在DVU server的client 210,100开发后被传输到QAS Client 310测试,成功后被分别传入PRD Client 800,810和820 .
4、传输请求
程序是究竟保存在server的什么地方?程序是如何在不同client和server之间进行传输的?要明白这问题,首先让我们看看什么是传输程序和传输控制程序.
传输控制程序TP和R3TRANS传输程序,R3TRANS被用来实现SAP各Client间的数据传输和不同版本迁移,TP传输控制程序根据传输参数(Transport Profile)调用R3TRANS传输程序.
BDC
Recordion:
T-code:SHDB
BDC程序内表:BDCDATA
CURUPLOAD 数据导入函数
LOOP AT 循环。