ABAP report常用的一些语句用法(包括字符串操作,变量动态操作)(持续更新)

1、计算内表的长度:

      LEN  TYPE N,

      DESCRIBE TABLE   IT_BKPF   LINES   LEN.       后面除了可以接LINES显示条数,还可以接KIND,显示内表的属性,还有OCCURS,显示内表的初始memory

      读取内表的列数:


2、删除内表的重复条数:

      SORT I_KUNNR BY KUNNR.

      DELETE   ADJACENT    DUPLICATES     FROM      I_KUNNR.         

      这个语句使用之前要对内表按关键字排序,然后后面还可以加  COMPARING ALL FIELDS  所有字段必须一样。还可以COMPARING f1 f2,f1和f2字段必须一样,如果没有comparing 关键字,则标准关键字段必须一样,在定义这个内表的时候要声明标准关键字段,不然默认是全部。


3、对内表的数据进行累加或者更新:

     LOOP AT LT_ALV.
          COLLECT LT_ALV INTO LT_ALV1.   
    ENDLOOP.

    这其中LT_ALV1必须是哈续表,还要定义key,定义如下:

    DATALT_ALV1 LIKE HASHED TABLE OF YT_ALV WITH UNIQUE KEY BUKRS GJAHR MONTH GSBER KUNNR WITH HEADER LINE.

    而且还要把这个数据转换到普通内表里面,因为这个HASHED,没法做APPEND还要modify等操作,如果后续有这些操作的话就需要把数据转移到普通内表里:

     LOOP AT LT_ALV1 INTO WA_ALV.
           APPEND WA_ALV TO GT_ALV.
     ENDLOOP.


     LOOP AT IT_ALV1 INTO WA_ALV.

            MODIFY IT_ALV1 FROM WA_ALV TRANSPORTING BUKRS.          这个地方只能放到LOOP里面进行MODIFY FROM.

     ENDLOOP.

     如果不放到LOOP里面,可以直接MODIFY带表头的内表。


4、Read table 使用二分法前要按key值升序排序,或者是默认就行了:

      SORT GT_ALV BY BUKRS GSBER GJAHR KUNNR.

      READ TABLE GT_ALV BINARY SEARCH  WITH KEY
                BUKRS WA_ZSTATEMENT-BUKRS
                GSBER WA_ZSTATEMENT-GSBER
                GJAHR WA_ZSTATEMENT-GJAHR
                KUNNR WA_ZSTATEMENT-KUNNR.

 

      排序的问题:    

              SORT LT_VBFA DESCENDING BY ERDAT ERZET.     这样表示按后面两个字段降序排列

              SORT LT_VBFA  BY ERDAT ERZET DESCENDING.     这样表示按ERDAT升序,ERZET降序


5、读取字符串里面的某个片段:SEARCH

      L_MONTH P_BUDAT+4(2).      读取P_BUDAT里面的第四位开始的两个字段:例如P_BUDAT = 'abcdefg'   那么L_MONTH = ‘ef’。

      还可以配合一些读取的语句,例如,我不知道是从第四位开始,我要去读取,cd后面的两位,但是我不知道cd是第几位,也不确定,所以要用到下面的语句:

      SEARCH    P_BUDAT      FOR    'cd'.  然后系统变量SY-FDPOS就为4,把它赋值给LEN。

      L_MONTH =  P_BUDAT +LEN(2)


6、MODIFY更新内表的某些字段:

     MODIFY IT_BSEG FROM WA_BSEG TRANSPORTING DMBTR WRBTR.(但是这个必须要在LOOP IT_BSEG里面,不然会dump)

没有LOOP里面的内表,只是read table之后怎么更新一个字段(LV_INDEX为读取内标的sy-tabix):

      MODIFY IT_BSEGINDEXLV_INDEX FROM WA_BSEG TRANSPORTING DMBTR WRBTR.

     MODIFY还可以从一个内表里面进行MODIFY:

     MODIFY ZCO_SPC_CB FROM TABLE IT_CO_SPC_CB.但是不会重复更新内表里面的重复条目到表里面。

     MODIFY数据库表不需要commit work

     


7、MOVE corresponding 只能用于将一个结构的数据放到另一个结构的对应字段,只能存一行数据。

      注意这个MOVE corresponding的语句,只会把相同字段的内容放到目标结构,(还有这个语句会比move慢)例如:

      源结构 s1 的字段有:key1 key2 value1 value2 valuem valuen
      源结构 s2 的字段有:key1 key2 value3 value4 valuem valuen
      目标结构 t1 的字段有:key1 key2 value1 value2 value3 value4 valuem valuen
则在:
MOVE-CORRESPONDING s1 TO t1. 
... 
MOVE-CORRESPONDING s2 TO t1.
的语句块之后,

      t1 的 key1 key2 value3 value4 valuem valuen 的值都是来自 s2 的,但是 value1 value2 则依旧保留了来自 s1 的值

还有下面这些语句:

      MOVE to把源的值赋值到目标

      WRITE TO 把源的格式赋值的目标


8、取一个金额值的小数位:

     L_PWRBTR wa_BSEG-WRBTR.
     L_PWRBTR FRACl_pwrbtr ).


9、常用的字符串操作:(其它一些目前不常用的暂不做介绍)

      获得字符串的长度 STRLEN,用法:     N = STRLEN ( STRING )。    注意空格,不然会报错。

      拆分字符串SPLIT,用法:     

      替换字符内容REPLACE,用法:           REPLACE '.xlsx' WITH  '' INTO P_TABLE.

                                                              REPLACE all OCCURRENCES OF '&1' in ls_str_line-low with ls_table-table_name.

      TRANSFER,用法:

      移动字符串SHIFT用法:                       LEFT:向左移动<n>位置,右边用<n>个空格填充(默认设置)。
                                                                  RIGHT:向右移动<n> 位置,左边用<n>个空格填充。
                                                                  CIRCULAR:向左移动<n>位置,以便左边<n>个字符出现在右边。

      去掉字符串CONDENSE用法:              condense   string.            删除前导空格,左对齐。NO-GAPS,去除所有空格。

      合并字符串CONCATENATE的用法:     CONCATENATE TEXT-033 SHEET_NAME INTO L_MSG SEPARATED BY SPACE.



10、特殊字符串的应用

        SAP有很多标准的特殊字符串,它保存在一个CLASS里面,CL_ABAP_CHAR_UTILITIES,里面的Attributes有定义好的常量特殊字符串,可以通过下面这个方式使用:

        DATA: crlf(2) TYPE c.
        crlf = cl_ABAP_char_utilities=cr_lf.  (这个是里面的一个回车换行的常量)

                 cl_abap_char_utilities=>horizontal_tab   (tab键)


11、删除字符串的其中一个字符:

        删除首个和最后一个字符:

                                 先通过SHIFT,进行左右移位,然后再通过CONDENSE去删除空格。

                                 SHIFT wa_bseg-kunnr by 1 PLACES RIGHT.
                                 CONDENSE wa_bseg-kunnr. 

       删除特定位置的字符:删除第N个位置的M个字符

                                 REPLACE wa_bseg-kunnr+N(M) WITH ' ' INTO wa_bseg-kunnr.
                                 CONDENSE wa_bseg-kunnr.



12、日期转换成一些特殊格式:(TCURR-GDATU)

        DATAfkdat1 LIKE vbrk-fkdat.
        l_fkdat '20140301'.
        CONVERT DATE l_fkdat INTO INVERTED-DATE fkdat1.           结果为:79859698

        



13、把整个内表的值追加到另一内表(两内表结构一致)

        APPEND LINES OF IT_UPLOAD1 TO IT_UPLOAD.


14、读取内表的每一列的字段以及它的值(动态内表的实现):




15、ASSIGN COMPONENT L_INDEX OF STRUCTURE <DYN_WA> TO <COM_UPLOAD>的用法:(当你需要读取一个内表或者structure的每一个字段的时候可以用到这个语句

      先assign  STRUCTRUE to  <DYN_WA>.

      然后L_INDEX为这个内表的第几个字段,当执行上面那个语句之后,<COM_UPLOAD>为那个字段,如果给它赋值之后,那么<DYN_WA> 对应的字段就会有值。




16、LOOP AT...ASSIGNING ...,可以直接修改后面的指针,不用重新modify。



17、LOOP AT... 从第N条开始读:

        LOOP AT ... FROM  N.



18、LOOP AT ... ASSIGNING <FIELD-SIMPLE指针>,然后在LOOP里面可以直接修改指针的字段的值,就不用使用MODIFY去更新了,节省时间。



19、日期转换方法:

        (1)2014.06.01或者是2014-06-01,2014/06/01转换成标准的20140601的方法:

                  l_value '2014.06.30'.
                  REPLACE '.' WITH '' INTO L_Value.
                  REPLACE '.' WITH '' INTO L_Value.
                  CONDENSE l_value NO-GAPS.



20、LOOP 内表A,同时LOOP里面READ TABLE 内表A:

       例如内表A,LOOP到了第3条数据,READ TABLE的时候是从低4条开始读的。



21、把字符串按要求分开,SPLIT。

        <SAME>2<SAME><S>4<S>

        SPLIT I_LOGIC AT '<SAME>' INTO STR1 STR2 STR3.
        LS_N STR2.
        SPLIT I_LOGIC AT '<S>' INTO STR1 STR2 STR3.
        LS_M STR2.



22、延时语句:

WAIT UP TO p_wait SECONDS.


23、PERFORM 传参数,怎么写:

TYPESBEGIN OF TY_VBRK,
      VBELN LIKE VBRK-VBELN,
      END OF TY_VBRK,
      TYP_VBRK TYPE TABLE OF TY_VBRK.

DATA IT_VBRK  TYPE TYP_VBRK WITH HEADER LINE.

PERFORM GETHER_SO USING IT_VBRK[].

FORM GETHER_SO  USING       P_IT_VBRK  TYPE TYP_VBRK
                                             P_IT_VBFA  TYPE TYP_VBFA

ENDFORM.


24、更新数据库表():

成功的:

MODIFY ZBRGTSCOST FROM TABLE IT_ZBRGTSCOST_S.    "UPDATE Ztable

失败的:

UPDATE ZBTCP_MSG FROM WA_MSG.

更新一条的,指定某个字段

UPDATE ZSTATEMENT SET UM01S ZSTATITAB1-UM01S
                                          UM01H ZSTATITAB1-UM01H
                                          UM01U ZSTATITAB1-UM01U
                                          UMSAV ZSTATITAB1-UMSAV
                     WHERE KUNNR ZSTATITAB1-KUNNR
                       AND BUKRS ZSTATITAB1-BUKRS
                       AND GSBER ZSTATITAB1-GSBER
                       AND GJAHR ZSTATITAB1-GJAHR.


25、字符串类型的变量里面的数字和0之间的比较:

如果一个字符串的变量,当它的值是小于0.5,它在和0进行比较的时候就会把它当成0,当它大于0.5的时候,就不会把它认为是0。



26、有一些字段例如HTL01,HTL02.....HTL0N这种,怎么去读取呢:

FIELD-SYMBOLS<fs_01>.

DO l_time TIMES.                                    你需要读到的第N个字段。
    l_tabix l_tabix + 1.
    READ TABLE it_fields INDEX l_tabix.
    IF sy-subrc EQ 0.
      ASSIGN (it_fields-nameTO <fs_01>.
    ENDIF.
    pr_tslvt pr_tslvt + <fs_01>.
  ENDDO.



27、Message的写法:

MESSAGE 'THE Structure is different' TYPE 'E'.


28、如何判断某个值在一个区间里?


29、读取field字段的信息:




30、传入不知道类型的变量,如何创建类似的内表和structure

data:
        lit_table1       type ref to data,
        lwa_table       type ref to data。

field-symbols:
     <lit_table1>                   type standard table,
     <lfs_table1>                   type any.


create data lit_table1 like IT_ITAB1.             (IT_ITAB1是一个传入变量,你不知道类型,传入参考的是ANY或者是TABLE)

create data lwa_table like line of IT_ITAB1.


assign:
    lit_table1->to <lit_table1>,                   
    lwa_table->to <lfs_table1>,


得到的<lit_table1>就是和IT_ITAB1一样的内表,得到的<lfs_table1>是和IT_ITAB1的structure一样的structure。



31、根据传入的一个不知道类型的内表,去读取这个内表的structure,和每一个字段名

DATA:
      ld_struc_new  TYPE string,

      lo_tab_new         TYPE REF TO cl_abap_tabledescr,

      lo_strucdescr1      TYPE REF TO cl_abap_structdescr,

        lt_components_di1   TYPE cl_abap_structdescr=>component_table,

      wa_components_di1   TYPE LINE OF cl_abap_structdescr=>component_table,


*   Get RTTI of new itab
    lo_tab_new ?= cl_abap_typedescr=>describe_by_datait_itab1 ).
    lo_strucdescr1 ?= lo_tab_new->get_table_line_type).
    ld_struc_new lo_strucdescr1->get_relative_name).
    ld_tabname ld_struc_new.  

    lt_components_di1 lo_strucdescr1->get_components).                    这里的得到的就是内表IT_ITAB1的字段名,按顺序


32、根据输入的range去删除数据(range不好传参,而且筛选数据起来比较麻烦)

data:

    t_filter             type    CL_SALV_BS_FILTER=>YT_FILTER
    lt_field1           type     if_salv_bs=>t_type_field,

    lt_row             type      if_salv_bs=>t_type_row,

    ls_row_outside     TYPE LINE OF if_salv_bs=>t_type_row,
    lt_row_outside     type if_salv_bs=>t_type_row.


ls_field-fieldname         wa_components1-NAME.            这个地方放字段名

ls_field-s_dfies-fieldname wa_components1-NAME.


调用标准的方法得到筛选后的结果:

cl_salv_bs_filter=>apply(
    exporting
      t_field         lt_field1                                 内表it_itab1的所有字段
      t_input         it_itab1                                需要筛选数据的内表
    importing
      t_row                lt_row                             筛选结果,符合条件的
      t_row_outside   lt_row_outside               筛选结果,不符合条件的。
    changing
      t_filter        T_FILTER                               筛选条件
    exceptions
      no_filter_rules 1
      others          2
          ).

筛选条件是这样的:




结果是这样的:


然后你就可以根据你这个条数去删除数据了。



33、SUBMIT的用法:

DATA:
          rspar     TYPE TABLE OF rsparams,
          wa_rspar  LIKE LINE OF rspar.

SUBMIT demo_program_submit_rep
             VIA SELECTION-SCREEN                   这个就可以跳出选择屏幕
             WITH SELECTION-TABLE rspar         初始化选择屏幕的界面
             AND RETURN.


34、SORT TABLE WITH UNIQUE KEY的理解和常见问题:

yt_filter type sorted table of ys_filter with unique key fieldname .

这种table怎么去append数据。

像这种with unique key的表,就是,fieldname是唯一的,例如不可能两条数据,fieldname都是A。

然后在append的时候,一定要注意先把你的fieldname先排序,然后再append。例如先append A,再append B



35、判断某个值在选择屏幕的select-option或者是range里面。

rangesr_kunnr for bsid-kunnr.

r_kunnr-sign 'I'.
 r_kunnr-option 'EQ'.
 r_kunnr-low 'F'.
APPEND r_kunnr.
CLEAR R_KUNNR.

IF L_KUNNR IN r_KUNNR AND R_KUNNR[] IS NOT INITIAL.      要特别注意要判断是否为空
         CLEAR LT_DATA.
ENDIF.



36、计算结果去后面小数位2位,但是第三位往后只舍不入。

http://bbs.sapclub.cc/thread-282-1-1.html

其中涉及到四舍五入的有两个(可能还有更多):ROUND 和 HR_NZ_ROUNDING_DECIMALS
前者位于Basis功能开发包 SZME 里面,在标准中用于计量单位的计算;
后者主要用于HR模块,位于 PB43 开发包,处理HR模块中的主数据。

HR_NZ_ROUNDING_DECIMALS 函数可以直接输入数值,然后在 CONV_DEC 参数中输入需要保留的小数点即可输出。
ROUND 函数则有点灵活,可以通过 SIGN 参数( ‘+’,’-’ )控制向上取舍,或者向下取舍。

例如:
输入 88.54350 ,如果SIGN = ‘+’ ,保留2位小数,会得到: 88.55000;如果 SIGN = ‘-’,会得到:88.54000
输入 -88.54350,如果SIGN = ‘+’ ,保留2位小数,会得到: -88.54000;如果 SIGN = ‘-’,会得到:-88.55000



37、read table 后面的条件with key,一个字段要等于多个值,怎么弄?



38、查找字符串里面的某个字符,然后把数据分割开。

FIND ALL OCCURRENCES OF '|' IN gv_row RESULTS gtbl_match.





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值