ABAP实用新语法

  1. DATA(ls_data) = gt_data[ index ].
    使用此语法,可以省去read,直接读取指定行号的数据,但需要判断gt_data不是否有指定index行,需要catch 异常CX_SY_ITAB_LINE_NOT_FOUND异常,会直接dump.
  2. Line_exists
 IF line_exists( gt_data[ field1 = ' '  field2 = ' ' ] ). ENDIF.

使用此语法,可判断内表中行是否有满足条件的,无需LOOP判断,省去好多代码。
3. Select 内表
select 内表,可以i对内表使用sql的语法。例如:取内表某一列的最大值,就可以直接MAX,无需排序后,读第一行,
需要append a表 to B表时,但A表字段与B表字段数量不一致时,可以使用

   SELECT FROM @aAS a
          FIELDS field1
          APPENDING CORRESPONDING FIELDS OF TABLE @b.
  1. 前导0处理
 lv_field = |{ lv_field ALPHA = OUT }|.//去前导0
  lv_field = |{ lv_field ALPHA = IN }|.//加前导0
  1. Value
 lr_data[] = VALUE #( sign = 'I' option = 'BT' ( low = 1 high = 2 )
                                             ( low = 3 high = 4 )
                                             ( low = 4 high = 5 )
                               option = 'EQ' ( low = 6 ) ).

对range表赋值,非常简便。

lt_data[]  = value #( for wa in gt_data
										  where  ( field1 = '01' and field2 = '02 )   ( wa ) ).

赋值指定条件的数据
6.Group 分组循环

loop	at lt_data into data(ls_data) group by ( field = ls_data-field )
							 ascending  assigning field-symbol(<group>).
	loop	at group <group> assigning field-symbol(<fs>).
		
	end loop.
endloop.	

分组处理,不像at end of 那样需要调整字段顺序。
7. Replace

lv_string1 = 'statements'.
lv_string2 = 'asffasfa'..
write:  replace(    val = lv_string1
                    sub = 'sta'
                    case = abap_true
                    with = to_upper( lv_string2 ) "如果发现sta,用lv_char2的大写替换
                    occ = 2  )."如果occ为正,则从左边开始计数;如果occ为负,则从右数。值12....表示第一,第二,事件。取值为-1-2....表示最后一个,倒数第二个,。
  1. Conv
WRITE: |Converte Date: { CONV d( sy-datum + 7 ) DATE = USER } |."CONV conversion data type

转换为当前用户的日期格式
9. Case

    TRY.
        
      CATCH cx_root INTO DATA(exc).
        CASE TYPE OF exc.
          WHEN TYPE cx_sy_arithmetic_error.
            out->display( 'Arithmetic error' ).
          WHEN TYPE cx_sy_conversion_error.
            out->display( 'Conversion error' ).
          WHEN OTHERS.
            out->display( 'Other error' ).
        ENDCASE.
    ENDTRY.

抓异常,分异常类型报错
10. Conditional Operator
根据不同条件赋值,一般是写Case或If,下面这些可以在定义时赋值,并且在else中抓取异常

COND:

    DATA(time) = COND string(
          WHEN sy-timlo < '120000' THEN |{ sy-timlo TIME = ISO } AM|
          WHEN sy-timlo > '120000' THEN |{ CONV t( sy-timlo - 12 * 3600 ) TIME = ISO } PM|
          WHEN sy-timlo = '120000' THEN |High Noon|
          ELSE THROW cx_cant_be( ) ).

Switch:

  DATA(number) = SWITCH string( sy-index
                                WHEN 1 THEN 'one'
                                WHEN 2 THEN 'two'
                                WHEN 3 THEN 'three'
                                ELSE THROW cx_overflow( ) ).
  1. CORRESPONDING
Mapping:
lt_datax = CORRESPONDING #( lt_data MAPPING row = row1 ).
Except:
lt_datax = CORRESPONDING #( lt_data MAPPING row = row1 EXCEPT col  ).
lookup:
TYPES:BEGIN OF ty_data,
        row TYPE c,
        col TYPE c,
      END OF ty_data.
DATA:lt_data  TYPE STANDARD TABLE OF ty_data WITH NON-UNIQUE SORTED KEY mkey COMPONENTS row,
     lt_datax TYPE TABLE OF ty_data,
     lt_temp TYPE TABLE OF ty_data.
DATA:lv_str TYPE string.

lt_data = VALUE #(  ( row = '1' col = 'A' )
                    ( row = '2' col = 'B' ) ).
lt_datax = VALUE #( ( row = '1' col = '' )
                    ( row = '1' col = '' )
                    ( row = '2' col = '' ) ).
lt_datax = CORRESPONDING #( lt_datax FROM lt_data USING key mkey row = row EXCEPT row ).
输出结果:
ROW	COL
1	A
1	A
2	B
<think>好的,我需要帮助用户在ABAP中创建一个内部表ls_a,基于结构ls_bcb,并且包含GUEBG和GUEEN两个字段。根据提供的引用信息,特别是引用[1]提到的两种添加字段的方式,即使用APPEND结构或自定义INCLUDE,我需要考虑如何应用这些方法。 首先,用户提到要基于ls_bcb结构创建的内部表ls_a。这意味着ls_bcb可能是一个现有的结构或数据库表结构。根据ABAP语法,创建内部表通常需要指定行结构。所以,如果ls_bcb是一个结构,那么ls_a的行类型应该就是ls_bcb。但用户还要添加额外的字段GUEBG和GUEEN,这可能意味着需要扩展原有的结构。 引用[1]中提到,向表尾添加字段可以使用APPEND结构,而向任意位置添加字段则用自定义INCLUDE。因此,用户需要将这两个字段添加到ls_bcb结构中。不过,如果用户无法直接修改ls_bcb的结构,可能需要创建一个的结构,包含原有字段加上增的字段。 例如,可以创建一个的结构,比如zs_a,其中包含ls_bcb的所有字段,再加上GUEBG和GUEEN。然后基于这个结构定义内部表ls_a。不过,用户可能希望在不修改原结构的情况下动态添加字段,这在ABAP中可能需要使用APPEND结构或INCLUDE结构。 另外,引用[5]中提到在BAPI处理中,部分字段需要通过增强来处理,并且在结构中增加字段。这可能涉及到使用CL_ABAP_STRUCTDESCR来动态创建结构,或者使用INCLUDE STRUCTURE将现有结构包含到结构中,并添加额外的字段。 可能的步骤是: 1. 定义一个的结构类型,包含ls_bcb的所有字段以及GUEBG和GUEEN。 2. 使用INCLUDE STRUCTURE将ls_bcb包含到结构中,然后添加的字段。 3. 使用这个结构作为内部表ls_a的行类型。 或者,如果允许修改原结构,可以使用APPEND结构将字段添加到ls_bcb的末尾。但通常,直接修改原结构可能不可行,特别是在标准SAP系统中。 因此,正确的做法可能是创建一个的结构,例如: TYPES: BEGIN OF ts_a. INCLUDE TYPE ls_bcb. TYPES: GUEBG TYPE ..., GUEEN TYPE .... TYPES: END OF ts_a. 然后定义ls_a的类型为ts_a的表格。这样,内部表ls_a将包含ls_bcb的所有字段以及增的两个字段。 需要确认用户是否有权限修改原结构,或者是否需要动态添加字段。根据引用中的信息,使用INCLUDE结构是常见的方法,因此建议用户采用这种方式创建的结构并定义内部表。</think>在ABAP中创建包含指定字段的内部表$ls_a$,可通过以下两种方式实现: --- ### 方法1:使用`INCLUDE STRUCTURE`扩展结构 ```abap TYPES: BEGIN OF ts_a. INCLUDE TYPE ls_bcb. " 包含原结构所有字段 TYPES: GUEBG TYPE guebg_type, " 替换为GUEBG的实际数据类型 GUEEN TYPE gueen_type. " 替换为GUEEN的实际数据类型 TYPES: END OF ts_a. DATA: ls_a TYPE TABLE OF ts_a. " 定义基于结构的内部表 ``` --- ### 方法2:通过APPEND结构动态增强(需SAP系统配置) 1. **创建APPEND结构**:通过事务代码`SE11`,在结构$ZXX_BCB_APPEND$中添加字段$GUEBG$和$GUEEN$[^1] 2. **激活结构**:将APPEND结构附加到原结构$ls_bcb$的末尾 3. **定义内部表**: ```abap DATA: ls_a TYPE TABLE OF ls_bcb WITH APPEND STRUCTURE ZXX_BCB_APPEND. ``` --- ### 关键区别 | 方法 | 适用场景 | 字段位置 | 是否需要修改原结构 | |------|----------|----------|--------------------| | INCLUDE | 开发阶段自由扩展 | 任意位置 | 否,创建结构即可 | | APPEND | 标准表增强 | 仅尾部追加 | 需配置APPEND结构[^1] | ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值