S4新语法

*构建工作区
GS_OUT = VALUE #( MATNR = '1000001'
                  MAKTX = '物料描述' ).

*构建内表
GT_OUT = VALUE #( ( MATNR = '1000001' MAKTX = '物料描述1'  )
                  ( MATNR = '1000002' MAKTX = '物料描述2'  ) ).
*构建Range
R_BLART[] = VALUE #( BASE GR_BLART[] ( SIGN = 'I' OPTION = 'EQ'  LOW = 'RE' )
                                        ( SIGN = 'I' OPTION = 'EQ'  LOW = 'UE' ) ).



*内表追加数据
GT_OUT = VALUE #( BASE GT_OUT (  MATNR = '1000003' MAKTX = '物料描述3' ) ).

*定义变量
DATA(LV_DATUM) = SY-DATUM.

*定义内表和工作区
DATA(LS_OUT) = GS_OUT.
DATA(LT_OUT) = GT_OUT.

**********************************内表操作
*替代MOVE-CORRESPONDING
GS_TMP = CORRESPONDING #( GS_OUT ).
GT_TMP = CORRESPONDING #( GT_OUT ).


*字段名相同赋值 并且指定字段复制到特定字段上
CLEAR GS_TMP.
GS_TMP = CORRESPONDING #( GS_OUT MAPPING MATNR = MAKTX ).


*EXCEPT时是将EXCEPT的字段置为空而不是不赋值
CLEAR GS_TMP.
GS_TMP = CORRESPONDING #( GS_OUT EXCEPT MAKTX ).

CLEAR GT_TMP.
GT_TMP = CORRESPONDING #( GT_OUT EXCEPT MAKTX ).


*找出满足条件的数据 使用操作符FILTER过滤
DATA  GT_FILTER TYPE HASHED TABLE OF TY_OUT
                  WITH UNIQUE KEY MATNR.
GT_FILTER = VALUE #( ( MATNR = '1000001' MAKTX = '物料描述1')
                     ( MATNR = '1000005' MAKTX = '物料描述5') ).

*找出GT_OUT在GT_FILTER里的
CLEAR GT_TMP.
GT_TMP = FILTER #( GT_OUT IN GT_FILTER WHERE MATNR = MATNR ) .


"找出GT_OUT不在GT_FILTER里的
CLEAR GT_TMP.
GT_TMP = FILTER #(  GT_OUT EXCEPT IN GT_FILTER WHERE MATNR = MATNR ) .


**判断某一行数据是否存在
IF LINE_EXISTS( GT_OUT[ 2 ] ).
MESSAGE 'OK' TYPE 'S'.
ENDIF.



"内表中符合条件的数据有几条
DATA(LV_LINE) = REDUCE I( INIT X = 0
                             FOR  GS_LINES IN GT_OUT WHERE ( MATNR = '1000001' )
                          NEXT X = X + 1 ).


**********************************SELECT新特性

DATA LV_MATNR TYPE MARA-MATNR.

*直接取数定义局部内表
SELECT MATNR,ERSDA,ERNAM,MTART,MATKL
  FROM MARA
  INTO TABLE @DATA(LT_MARA)
 WHERE MATNR = @LV_MATNR.

IF LT_MARA IS NOT INITIAL.
  SELECT MATNR, MAKTX
    FROM MAKT
    INTO TABLE @DATA(LT_MAKT)
    FOR ALL ENTRIES IN @LT_MARA
    WHERE MATNR = @LT_MARA-MATNR.
ENDIF.



*WITH 替换 FOR ALL ENTRY IN
CLEAR LT_MAKT.
WITH +DATA AS ( SELECT FROM MARA AS A
                       FIELDS A~MATNR
                       WHERE MATNR = '000000000000000104' )
SELECT FROM +DATA INNER JOIN MAKT AS B
ON +DATA~MATNR = B~MATNR
FIELDS B~MATNR,B~MAKTX
INTO TABLE @LT_MAKT
.


*SUBSTRING  SQL中截取字段任意长度 注意某些情况INTO需要写在SQL最后面 否则会报错
CLEAR LT_MARA.
SELECT SUBSTRING( MATNR,1,5 ) AS MATNR,ERSDA,ERNAM,MTART
  FROM MARA
 WHERE MATNR = @LV_MATNR
    INTO TABLE @LT_MARA.

*SQL中默认值
CLEAR LT_MARA.
SELECT MATNR,
       ERSDA,
   'Yangchao'AS ERNAM,
       MTART,
       MATKL
  FROM MARA
  INTO TABLE @LT_MARA
 WHERE MATNR =  '000000000000000104' .
 
 
 
 *拼接
DATA LV_STR TYPE STRING.
LV_STR = |{ '系统日期'}{ SY-DATUM }{ '系统时间'}{ SY-UZEIT }| .


*计算内表行数
*DATA(LV_LINES) = LINES( GT_OUT ).

*增加前导0  删除前导0
DATA LV_VBELN TYPE VBAK-VBELN VALUE '000010001'.

LV_VBELN = |{ LV_VBELN ALPHA = OUT }| .
LV_VBELN = |{ LV_VBELN ALPHA = IN }| .




DATA lv_str TYPE string.
TYPES:BEGIN OF ty_out,
        matnr TYPE mara-matnr,
        maktx TYPE makt-maktx,
        wesch TYPE mara-wesch,
        total TYPE mara-wesch,
      END OF ty_out.
DATA gt_out TYPE TABLE OF ty_out.

*替代IF判断 必须WHEN所有条件
lv_str = 'A'.
lv_str = COND #( WHEN lv_str IS INITIAL THEN 'A'
                 WHEN lv_str IS NOT INITIAL THEN 'B' ).

*SELECT 中使用Case WHEN 判断数据值
gt_out = VALUE #( ( matnr = '01' maktx = '描述1' wesch = 10 )
                  ( matnr = '01' maktx = '描述1' wesch = 10 )
                  ( matnr = '02' maktx = '描述2' wesch = 20 )  ).

SELECT matnr,
       maktx,
CASE WHEN matnr = '01' THEN wesch * -1 ELSE wesch END AS wesch
  FROM @gt_out AS z1
INTO TABLE @DATA(lt_case).

*按字段汇总数据
SELECT matnr,
       maktx,
  SUM( wesch ) AS wesch
  FROM @gt_out AS z2
  GROUP BY matnr,maktx
INTO TABLE @DATA(lt_sum).
SORT lt_sum BY matnr.


DATA lv_total TYPE mara-wesch.
lv_total = REDUCE #( INIT total TYPE bstme
                            FOR wa_out IN gt_out
                            NEXT total = total + wa_out-wesch ).



*根据物料汇总内表中相同的数据到某个字段
LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>).
  <fs_out>-total = REDUCE #( INIT total TYPE bstme
                              FOR wa_out IN gt_out
                              WHERE ( matnr = <fs_out>-matnr )
                              NEXT total = total + wa_out-wesch ).

ENDLOOP.

 

posted @ 2026-06-03 14:48  YangMeiko  阅读(14)  评论(0)    收藏  举报