科莱特教育

 找回密码
 立即注册
查看: 3816|回复: 0

ABAP开发总结

[复制链接]

17

主题

21

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2021-1-8 08:43:39 | 显示全部楼层 |阅读模式
--------------------一、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  .
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


QQ|科莱特教育

GMT, 2025-4-25 15:31 , Processed in 0.053935 second(s), 23 queries .

福州科莱特教育科技有限公司 版权所有 闽ICP备2021003729号-2

Copyright C 2018-2022 All Rights Reserved

快速回复 返回顶部 返回列表