ABAP项目砖家之旅-基础篇
前言
作为一个IT搬砖人,搬了十年的砖。回顾起来,只要公司项目要求换新砖就要短期搬得起来的生活不容易,于是从c#到.net到java,身边人专门做一门语言的成了专家,我们跟项目做的杂的也不能输,不能成为专家也要成为“砖家”搬的容易点。这里一一分享下转做ABAP项目如何短期成为“砖家”的经验,希望对大家项目临时搬砖有帮助
一、ABAP简介
Advanced Business Application Programming,俗称ABAP。SAP二次开发的一门语言,对比之前学过的C# java等,个人感觉类似JAVA多一点。项目中主要用来做人力、财务、供应链、销售分销等模块的报表、表单、屏幕增强和接口等开发。其他文科生写语言介绍就不重复写了,毕竟项目不太相关,大家吹水需要的话可以问度娘。
二、ABAP开发工具
1.SAPgui
sapGUI有较多的开发工具,其中最常用的有:
SE11——数据结构创建事务代码
SE38——abap程序编辑工具
SE80——类似资源管理器,里面可以查看所有的ABAP开发对象,并可以修改和新建开发等
ST22——查看ABAP dump,罪证储存场所
当然还有后台job日志等后面介绍到再说
2.eclipse和HANA studio
想直接贴网址…
eclipse下载abap工具插件,然后使用sap账号建立连接(跟GUI连接一样),最后使用ABAP开发视图来开发abap代码。不太好用,不是hana可以忽略。这里不介绍
三、相关搬砖经验
项目过程其实较少系统培训,一般都是乙方顾问丢一份资料过来,然后做些语法培训和简单代码注释讲解,最后提供些网址论坛什么的让参与项目的新手去边了解边接任务来熟悉。
个人经验来说:
1.必须还是熟悉语法
所有开发语言都有共性,拿到资料有经验的开发者一般都会想:
(1)变量怎么定义
TYPES:定义类型
DATA: 定义变量
range:abap特殊区间,结构为 SIGN OPTION LOW HIGH
TABLE:内表,sap内存表,这个是比较重要的变量
like type :指定变量的类型,如定义内表后面可以指定table of ,如定义工作区则接line of等
field-symbol:定义指针,一般循环时候使用,loop asign
来一个定义内表的范例:
*1.通过类型定义内表
types:begin of ty_header,
sign type char1,
option type char2,
low type char10,
heigh type char10,
endof ty_header.
data:gt_header type ty_header occurs 0 ."使用自定义的内表类型type作为结果,直接定义内表
*2.直接定义等同于下面的快速定义方法:
data:begin of lt_header occurs 0,"occurs指针容量,0表示无限制
sign type char1,
option type char2,
low type char10,
heigh type char10,
endof lt_header.
*3.直接参考数据表建立内表
tables:mara."引入mara物料基础资料表
data lt_mara type table of mara with head line ."是否带表头,带表头在循环时候不需要工作区,但性能慢点
*4.定义工作区方便loop时候存一行数据
data:wa_header like line of lt_header .
*5.指针的定义
field-symbol:<fs> like line of lt_header .
(2)循环、条件语句怎么写
常用的循环LOOP…ENDLOOP. FOR whilt
常用条件:IF…ELSEIF…ELSE.ENDIF.
*接上面的定义
wa_head-sign = 'I'.
wa_head-option = 'EQ'.
wa_head-low = '8888888888' .
wa_head-high = ''.
append wa_head to lt_header
wa_head-sign = 'I'.
wa_head-option = 'EQ'.
wa_head-low = '9999999999' .
wa_head-high = ''.
append wa_head to lt_header
loop at lt_header .
write:'low :',lt_header-low ,/. "/表示换行
endloop.
(3)控件怎么使用
ABAP控件不多,主要有工具栏、select-OPTION 类定义的搜索条件类控件和SCREEN类控件
*1. block line 等selection-screen屏幕块
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE TEXT-t05 ..
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 5.
PARAMETERS:p_srqr TYPE c RADIOBUTTON GROUP rad2 MODIF ID rpt.
SELECTION-SCREEN COMMENT 45(10) TEXT-p13 FOR FIELD p_srqr MODIF ID rpt.
SELECTION-SCREEN POSITION 10.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK blk.
SELECTION-SCREEN BEGIN OF BLOCK blks WITH FRAME TITLE TEXT-t02.
SELECT-OPTIONS:
s_zxszz FOR ztsd_zt_header-zxszz, "销售组织
s_status FOR ztsd_zt_header-zsapclzt NO INTERVALS NO-EXTENSION MODIF ID dtl,
s_hzstat FOR ztsd_hz_header-zsapclzt NO INTERVALS NO-EXTENSION MODIF ID pst,
SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS:
s_zcjrq FOR ztsd_hz_header-zcjrq OBLIGATORY DEFAULT sy-datlo.
SELECTION-SCREEN END OF BLOCK blks.
*2.按钮
SELECTION-SCREEN PUSHBUTTON /1(82) psb_alv USER-COMMAND psbcom.
SELECTION-SCREEN PUSHBUTTON /1(82) psb_proj USER-COMMAND PSBCOM2.
SELECTION-SCREEN PUSHBUTTON /1(82) psb_tr USER-COMMAND PSBCOM3.
*3.按键等方法
FORM init_selscreen. "INITIALIZATION."(初始化) 执行,只能用于报表,赋值
MOVE 'alv报表分析界面' TO psb_alv.
MOVE 'abap项目开发清单' TO psb_proj.
MOVE 'abap开发TR一览' TO psb_tr.
ENDFORM.
FORM action_of_selscreen.
IF SSCRFIELDS-ucomm EQ 'PSBCOM' . "选择屏幕自定义按键
PERFORM get_maindataforalv.
CALL SCREEN 9020.
ELSEIF SSCRFIELDS-ucomm EQ 'PSBCOM2'.
CALL TRANSACTION 'ZRICEF'.
ELSEIF SSCRFIELDS-ucomm EQ 'PSBCOM3'.
CALL TRANSACTION 'ZXQBG_TR'.
ELSE.
ENDIF.
ENDFORM.
FORM frm_modify_sel_screen . "根据相关参数设置屏幕块是否可见
LOOP AT SCREEN.
IF screen-group1 = 'FCN' "屏幕有三组,可以定义
AND ( gv_pcode = 'RPT' OR gv_pcode = 'ARCH' ).
screen-active = 0.
ENDIF.
IF screen-group1 = 'RPT'
AND ( gv_pcode = 'FCN' OR gv_pcode = 'ARCH' ).
screen-active = 0.
ENDIF.
ENDLOOP.
ENDFORM.
FORM frm_tcode ."通过T-CODE判断
IF sy-tcode = 'ZFIR010'.
gv_pcode = 'RPT'.
SET TITLEBAR '1000_RPT'.
ELSEIF sy-tcode = 'ZFID010'.
gv_pcode = 'FCN'.
SET TITLEBAR '1000_FCN'.
ELSEIF sy-tcode = 'ZFID010_ARCHIVE'.
gv_pcode = 'ARCH'.
SET TITLEBAR '1000_ARCH'.
ENDIF.
ENDFORM.
(4)数据库数据如何提取和展示
abap有opensql作为sql语言,语法类似sql,但有很多细节,可以作为另一个章节讲了。
(5)abap程序的事件
*1.屏幕screen控件的事件
*PBO 状态 初始化界面 alv数据output到屏幕
PROCESS BEFORE OUTPUT."pbo事件
MODULE INI_TABLE.
MODULE STATUS_9200. "会提示生成,添加按钮,把备注的SET 代码设置生效 ,双击生成状态,最后在pai ucomm写入方法即可
*PAI
PROCESS AFTER INPUT. "PAI事件
***1.表头
CHAIN .
FIELD ZTRE_YZ_HEADER-ZYZMS MODULE CHECK_YZMS ON INPUT.
"on input 只要输入就可以校验,可以校验表头单个控件
ENDCHAIN.
***2.表行项目
LOOP AT gt_main.
CHAIN.
FIELD gt_main-字段 MODULE check_字段 ON requested .
MODULE check_字段 ON CHAIN-INPUT."输入任意值符合条件都检测
MODULE check_字段 ON INPUT-REQUEST."输入任意值改变都检测
ENDCHAIN.
ENDLOOP.
MODULE USER_COMMAND_9020.
MODULE CANCEL AT EXIT-COMMAND. "删除命令,优先屏幕必填 共用的
PROCESS ON VALUE-REQUEST. "F4值 POV事件
FIELD 字段 MODULE f4_value_字段.
PROCESS ON HELP-REQUEST. "POH事件
FIELD 字段 MODULE f1_value_字段. "F1帮助值略
MODULE f4_value_zkfry INPUT.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' "F4函数
EXPORTING
retfield = 'ZNAME'
dynpprog = 'ZDMD001'
dynpnr = '9100'
dynprofield = 'ZTDM_KFJD_MAIN-ZKFRY'
value_org = 'S'
TABLES
value_tab = gt_lxfs
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDMODULE.
MODULE USER_COMMAND_9020 INPUT.
CASE SY-UCOMM.
WHEN '&EXIT'.
CLEAR sy-ucomm.
LEAVE PROGRAM.
...
ENDCASE.
ENDMODULE.
MODULE CANCEL INPUT. "AT USER-EXIT COMMAND 在屏幕设置的必填等PBO标准执行模块之前执行,优先度最高
CASE sy-ucomm .
WHEN 'BACK' .
PERFORM get_maindata .
LEAVE TO SCREEN 0 .
WHEN 'UP' OR 'EXIT' .
leave PROGRAM.
WHEN 'ADDUSER'.
IF sy-mandt ne '200'.
MESSAGE '检测到客户端不是200,请在200维护内外开发员联系方式' TYPE 'W'.
*MESSAGE w000(zmsg) WITH '填入的资产号不正确,请检查' DISPLAY LIKE 'E'.
ENDIF.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'A'
EXPORTING
TCODE = 'ZXQBG_USER'.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
MODULE check_字段 INPUT.
...
IF iv_anln1 IS NOT INITIAL.
MESSAGE w000(zmsg) WITH '填入的资产号不正确,请检查' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
****PAI: FIELD ZFIR002_PRC_CF-VALUE MODULE zmd_pov ON REQUEST .
MODULE ZMD_POV INPUT.
IF ZFIR002_PRC_CF-VALUE EQ 'RC' OR ZFIR002_PRC_CF-VALUE EQ 'DD' OR ZFIR002_PRC_CF-VALUE EQ 'ACCT'.
LOOP AT SCREEN.
IF screen-name eq 'ZFIR002_PRC_CF-PAQJ'.
screen-input = '1' ."0代表不能输入 1代表可以输入!
ENDIF.
MODIFY SCREEN.
ENDLOOP.
MESSAGE '选择单值可以填写区间和单值条件' type 'W' .
ELSE.
MESSAGE '选择汇总字段只能支持单值条件,请不要填写区间条件' type 'W' .
ENDIF.
ENDMODULE.
ENDMODULE.
*2.report类abap程序的事件:
SELECTION-SREEN OUT ."控件操作/填写时候执行
INITIALIZATION."初始化,类似onload
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_S1-low.*另一种POH和POH在main的写法 点击F4后执行
AT SELECTION-SCREEN ON HELP-REQUEST FOR S_S1-low."点击F1后执行
START-OF-SELECTION. "开始点击F8(F8代表执行按键)
END-OF-SELECTION. "操作F8后执行
在这个基础上其实可以对比自己之前学的java等,找一篇别人总结出来的语法进行对比。这样容易快速入手,否则花了几个月看了整本书,估计项目都做完了。
2.复制粘贴写注释
没错,就是要把别人的代码复制过来,关键是自己要在别人的基础上写代码注释,这样才能熟悉,不然难以理解,每次都只能复制
3.代码摘录和分片段
在复制粘贴的基础上,做好注释,然后分解代码片段,单独保存起来,下次使用时候,如果打不出来,可以保存到sap的模式中,直接在模式里面选择该代码片段。
总结
先说这么多,得空整理下之前项目文档和代码片段放上来。下一篇应该先介绍下ABAP语法语句等