ABAP开发总结

--------------------一、RANGE使用注意事项:-------------------------------------
1.range 语句在SQL 中一般用IN, 不用等于。
2.EQ(等于)/LE(小于等于)/GE(大于等于)
3. 使用前清空表头和表体。( CLEAR:emp,emp[])
*"单值
*CLEAR G_ranges[].
*G_ranges-sign = 'I'.
*G_ranges-option = 'EQ'.
*G_ranges-low = 'AA'.
*APPEND G_ranges.


"区间
CLEAR g_ranges[].
g_ranges-sign = 'I'.
g_ranges-option = 'BT'.
g_ranges-low = 'AA'.
g_ranges-high = 'HH'.
APPEND g_ranges.


*选项介绍:
*1.SIGN  值为 I 和 E 。 I是包含, E是排除, 一般使用I。
*2.OPTION 如果HIGH 为空 ,为单值选择 。有 EQ、NE、GT、LE、LT等逻辑操作  对于*的  CP包含  NP是排除
*                  如果HIGH 不为空 为区间选择 有BT,NB可选
*3.LOW     低值
*4.HIGH    高值




------------------------二、有无HEADER LINE的内表的区别:-------------------------------------
*对于有HEADER LINE的内表,可以通过填充HEADER LINE数据后或通过 外部Work Area 向内表存储空间中追加数据。
*对于没有HEADER LINE的内表,只能通过 外部Work Area来传递数据:


TABLES: employee.
 
TYPES: BEGIN OF emp,
    id  LIKE employee-id,
    name1   LIKE employee-name1,
    country LIKE employee-country,
       END OF emp.
 
* 有 HEADER LINE 的内表
DATA: emptab  TYPE STANDARD TABLE OF emp INITIAL SIZE 10 WITH HEADER LINE.
 
* 没有 HEADER LINE 的内表
DATA: emptab2 TYPE STANDARD TABLE OF emp INITIAL SIZE 10,        
 
* Work Area
      emptab_wa TYPE emp.                                                                          
 
SELECT * FROM employee.
 
    MOVE-CORRESPONDING employee TO emptab.
    APPEND emptab.
 
    MOVE-CORRESPONDING employee TO emptab_wa.
    APPEND emptab_wa TO emptab2.
 
ENDSELECT.




------------------------------------三、FOR ALL ENTRIES IN 的用法:-------------------------------------
SELECT F1 F2 .. Fn INTO IT_TAB(插入的子表) FROM MSEG 
  FOR ALL ENTRIES IN IT_TAB2(主表数据)
  WHERE Fi = IT_TAB2-Fi(主表条件)
    AND Fj = IT_TAB2-Fj(主表条件)


*多条数据的查询,避免了使用LOOP....AT.

1. IT_TAB2需要排序,并删除重复数据 


2. IT_TAB2数据两很大时,会降低效率 


3. 使用FOR ALL ENTRIES IN 时,from 的表要把主键都写在select后。
   如果主键没有全部加到WHERE条件后,FOR ALL ENTRIES IN 会自动删除重复行,造成数据丢失。
   INTO CORRESPONDING FIELDS OF TABLE 后的这个表中不含这字段就行了。


4. 在ABAP开发中,对于不能使用join的聚集表或者需要使用SELECT 的内表
 ,我们一般使用for all entries in 语句将该表与内表串联,查询出需要的数据,
 例如:BSEG聚集表为例.
 
 
  


  DATA:  SUPPLIER_IN  TYPE ZMM_STRUC_SUPPLIER_01.[声明传入数据类型]
   
  DATA:  SUPPLIER_RETURN  TYPE ZMM_INT_SUPPLIER_RETURN.[声明传出数据类型]
 
  PERFORM FRM_DESERIALIZE USING   SUPPLIER_IN.[反序列化 将jason转换为OBJECT类型入参]
 ( /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON   = REQUEST
                                 ASSOC_ARRAYS     = ABAP_TRUE
                                 ASSOC_ARRAYS_OPT = ABAP_TRUE
                                 PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE
                                 CHANGING DATA    =  SUPPLIER_IN ).
 
 PERFORM FRM_GET_SUPPLIER_ASSESSMENT USING ZNUM   SUPPLIER_IN  CHANGING RETURN SUPPLIER_RETURN.[传入传出数据处理]
 
 PERFORM FRM_DESERIALIZE USING   SUPPLIER_IN.[序列化操作,object格式转换成jason格式]
 (  
  ASSIGN SUPPLIER_RETURN[] TO <FS>.
 IF <FS> IS ASSIGNED.
    RESPONSE = /UI2/CL_JSON=>SERIALIZE( DATA             = <FS>
                                        ASSOC_ARRAYS     = ABAP_TRUE
                                        ASSOC_ARRAYS_OPT = ABAP_TRUE
                                       ).
    RESPONSE = '{"RESPONSE":' && RESPONSE && '}'.
    UNASSIGN <FS>.)


------------------EXCEL 宏代码-------------------------------------
Sub copy(rg As String)
'
' copy Sheet2选中行到Sheet1
'
'
    Sheets("Sheet2").Select
    Sheet2.Rows("1:25").Select
    Selection.copy
    Sheets("Sheet1").Select
    Sheet1.Range(rg).Select
    Sheet1.Paste
    'Selection.Insert Shift:=xlDown
End Sub


------------------SAP删除数据表中的数据-------------------------------------


方法一:ABAP语言中OPEN SQL 有从数据库中删除记录的语句。故可采用此方法来编写程序删除数据表中的记录。
此方法不够直接,存在风险,对有些不易取到的数据,可能不太有效。


方法二:使用事务码-SE16N;
输入自己要修改的表名,回车,然后输入事务码-&sap_edit来激活编辑状态。回车,点击运行,即可进行修改。
此方法好像不能修改主键,所以使用范围比较小。 


方法三:使用事务码-SE16;
使用事务码SE38打开程序LSETBF01,查找字符‘SHOW’设置断点。
使用事务码SE16打开要修改的数据表。输入事务码’/H‘ 激活调试模式,查出要删除的数据。点击查看按钮,
进入调试环境,程序停在CODE处,双击CODE 修改其值为'DELE',然后点击运行进入下一屏幕,点击删除数据即可。
删除以后点下一条,可以删除其它选中的记录。
此方法,比较冒险,少用。


 
-----------------------------------------------  


 
 ABAP中加上前导零、去除前导零的function module


*加上p_in的前导零


  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = p_in
    IMPORTING
      output = p_in.
 CONVERSION_EXIT_MATN1_INPUT


*去除p_out的前导零


  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
    EXPORTING
      input  = p_out
    IMPORTING
     output = p_out.
 
   
*四舍五入法
   CALL FUNCTION 'HR_NZ_ROUNDING_DECIMALS'
  EXPORTING
    VALUE_IN                 = L_DATA1
    CONV_DEC                 = 0      " 设置保留几位小数
  IMPORTING
    VALUE_OUT                = L_DATA1
  EXCEPTIONS
    no_rounding_required     = 1
    decimals_greater_than_10 = 2
    rounding_error           = 3
    OTHERS                   = 4.
 
*ABAP 动态查询条件  select* from  table where().


REPORT demo_select_dynamic_conditions .
DATA: cond(72) TYPE c,
      itab LIKE TABLE OF cond.
PARAMETERS: city1(10) TYPE c, city2(10) TYPE c.
DATA wa TYPE spfli-cityfrom.
CONCATENATE 'CITYFROM = ''' city1 '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'OR CITYFROM = ''' city2 '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'OR CITYFROM = ''' 'BERLIN' '''' INTO cond.
APPEND cond TO itab.
LOOP AT itab INTO cond.
  WRITE cond.
ENDLOOP.
SKIP.
SELECT  cityfrom
  INTO  wa
  FROM  spfli
  WHERE (itab).
  WRITE / wa.
ENDSELECT.


 


//保护EXCEL 不被修改内容
  LS_OPTIONS-PROTECT_DOCUMENT = ''.


//   获取当前月份第一天.
 CONCATENATE sy-datum+0(6) '01' INTO g_first   
//   获取当前月份最后一天.
DATA: date TYPE vtbbewe-dvalut,
      flag TYPE trff_flg,
      days TYPE trff_type_n_2,
      g_first   TYPE  sy-datum.


CALL FUNCTION 'FIMA_DATE_CREATE'
  EXPORTING
    i_date                  = '20140101' "输入日期
    i_flg_end_of_month      = ' '
    i_years                 = 2       "两年后的日期. 即输入日期的年加2所得日期,可为负数,表示前两年
    i_months                = 1       "一个月后的日期.即输入日期的月加1所得日期,可为负数,表示前一个月
    i_days                  = 23      "23天后的日期。可为负数,表示23天前的日期
    i_calendar_days         = 10      "10天后的日历。同I_DAYS参数。
    i_set_last_day_of_month = 'X'     "返回的日期为当前月份的最后一天
  IMPORTING
    e_date                  = date    "返回的日期为当前月份的最后一天
    e_flg_end_of_month      = flag    "如果输入参数I_SET_LAST_DAY_OF_MONTH设置’X’了,则返回值为’X’。
    e_days_of_i_date        = days.   "返回输入日期的i_calendar_days字段与I_DAYS字段的和。
WRITE : days, flag,date  .


  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值