740新语法

版权声明:本文为CSDN博主「王独秀儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_42959207/article/details/97015531

"1. @DATA(表名):自动创建内表

*SELECT vbeln , posnr , matnr

*  FROM vbap

*  INTO TABLE @DATA(lt_sales_order)

*  UP TO 100 ROWS.

"2. 读表lt_sales_order中的第20条数据到新建的变量ls_sales_order20中

*DATA(ls_sales_order20) = lt_sales_order[ 20 ].

"2.1 []中放条件

*DATA(ls_sales_order21) = lt_sales_order[ vbeln = '0000000031' ].

"3. 判断表lt_sales_order中vbeln = '0000000031'是否存在,存在打1

*IF line_exists( lt_sales_order[ vbeln = '0000000031' ] ).

*  WRITE:'1'.

*ENDIF.

"4. 获取index

*DATA(idx) = line_index( lt_sales_order[ vbeln = '0000000031' ] ).

*LOOP AT lt_sales_order into data(ls_sales_order1).

*

*ENDLOOP.

"5. 将C类型转换为xstring

*DATA text TYPE i VALUE 10.

*DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV string( text ) ).

"6. 利用value向结构体赋值

* TYPES:  BEGIN OF ty_columns1, "Simple structure

*                     cols1 TYPE i,

*                     cols2 TYPE i,

*                   END OF ty_columns1.

* TYPES:  BEGIN OF ty_columns2,  "Nested structure

*                     coln1 TYPE i,

*                     coln2 TYPE ty_columns1,

*                   END OF ty_columns2.

*DATA: struc_nest TYPE ty_columns2.

*struc_nest = VALUE #( coln1 = 1 coln2-cols1 = 1 coln2-cols2 = 2 ).

"7. 利用value向表赋值

*TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY.

*DATA itab TYPE t_itab.

*itab = VALUE #( ( 10 ) ( 1 ) ( 2 ) ).

"8. 利用value向表赋自定义范围值

*DATA itab TYPE RANGE OF i.

*

*itab = VALUE #( sign = 'I'  option = 'BT' ( low = 1  high = 10 )

*( low = 21 high = 30 )

*( low = 41 high = 50 )

*option = 'GE' ( low = 61 )  ).

"9. 将旧表(gt_ships)中的值根据条件(ls_ship–city)赋值到目标表(gt_citys)中

*DATA(gt_citys) = VALUE #( FOR ls_ship IN gt_ships ( ls_ship–city ) ).

"9.1 俩条件

*DATA(gt_citys) = VALUE ty_citys( FOR ls_ship IN gt_ships

*  WHERE ( route = 'R0001' ) ( ls_ship–city ) ).

"10. 循环执行col1 = j col2 = j + 1 col3 = j + 2,当j>40的时候停止循环

*DATA(gt_itab) = VALUE #( FOR j = 11 THEN j + 10 UNTIL j > 40

*      ( col1 = j col2 = j + 1 col3 = j + 2  )

*).

"11. 循环表gt_itab到结构体wa中 当F1 = 'XYZ'时 x加1 i为lv_lines的type

*DATA(lv_lines) = REDUCE i( INIT x = 0 FOR wa IN gt_itab

*  WHERE ( F1 = 'XYZ' ) NEXT x = x + 1 ).

"12. 循环表itab到结构体wa中 一共多少条 就累加多少次 求总条数

*DATA(lv_sum) = REDUCE i( INIT x = 0 FOR wa IN itab NEXT x = x + wa ).

"13. reduce中可以加until for迭代 相当于java或js中的for循环

"循环将n赋值给text然后再输出

*TYPES outref TYPE REF TO if_demo_output.

*DATA(output) = REDUCE outref( INIT out  = cl_demo_output=>new( )

*                              text = `Count up:`

*                              FOR n = 1 UNTIL n > 11

*                              NEXT out = out->write( text )

*                              text = |{ n }| ).

*output->display( ).

"14. 将ls_line1的内容移动到ls_line2,其中有一个匹配的列名。在没有初始化ls_line2的列。

*ls_line2 = CORRESPONDING #( ls_line1 ).

"15. 这将使用ls_line2的现有内容作为基础,并覆盖ls_line1中匹配的列。

*ls_line2 = CORRESPONDING #( BASE ( ls_line2 ) ls_line1 ).

"16. 将创建第三个新结构(ls_line3),它基于ls_line2,但是通过匹配覆盖了它

*DATA(ls_line3) = CORRESPONDING line2( BASE ( ls_line2 ) ls_line1 ).

"17. 映射允许您映射具有不同名称组件的字段,以符合数据传输的条件。

*   … MAPPING  t1 = s1 t2 = s2

"18. EXCEPT允许列出必须从数据传输中排除的字段

*… EXCEPT  {t1 t2 …}

"19. 字符串的宽度 布局方式(居中 居左 局右) 还有通过0来布局

*WRITE / |{ 'Left'     WIDTH = 20 ALIGN = LEFT   PAD = '0' }|.

*WRITE / |{ 'Centre'   WIDTH = 20 ALIGN = CENTER PAD = '0' }|.

*WRITE / |{ 'Right'    WIDTH = 20 ALIGN = RIGHT  PAD = '0' }|.

"20. 不改变大小写

*WRITE / |{ 'Text' CASE = (cl_abap_format=>c_raw) }|.

"变大写

*WRITE / |{ 'text' CASE = (cl_abap_format=>c_upper) }|.

"变小写

*WRITE / |{ 'TEXT' CASE = (cl_abap_format=>c_lower) }|.

"21. 去前导零

*DATA(lv_vbeln) = '0000012345'.

*WRITE / |{ lv_vbeln  ALPHA = OUT }|.

"22. 去后导零

*DATA(lv_vbeln1) = '0000012345000000'.

*WRITE / |{ lv_vbeln  ALPHA = IN }|.

"23. 转换时间格式

*WRITE / |{ sy-datum DATE = ISO }|. "2019-7-23

*WRITE / |{ sy-datum DATE = USER }|. "23.07.2019

*WRITE / |{ sy-datum }|. "20190723

"语言环境的格式化设置

*WRITE / |{ sy-datum DATE = ENVIRONMENT }|.

"24. 根据group by条件遍历,符合条件的自动归为一组,然后再遍历group 打印输出

*TYPES: BEGIN OF ty_employee,

*  name TYPE char30,

*  role    TYPE char30,

*  age    TYPE i,

*END OF ty_employee,

*ty_employee_t TYPE STANDARD TABLE OF ty_employee WITH KEY name.

*DATA(gt_employee) = VALUE ty_employee_t(

*( name = 'John'     role = 'ABAP guru'       age = 34 )

*( name = 'Alice'     role = 'FI Consultant'   age = 42 )

*( name = 'Barry'    role = 'ABAP guru'       age = 54 )

*( name = 'Mary'     role = 'FI Consultant'   age = 37 )

*( name = 'Arthur'   role = 'ABAP guru'       age = 34 )

*( name = 'Mandy'  role = 'SD Consultant'  age = 64 ) ).

*DATA: gv_tot_age TYPE i,

*      gv_avg_age TYPE decfloat34.

*"Loop with grouping on Role

*LOOP AT gt_employee INTO DATA(ls_employee)

*  GROUP BY ( role  = ls_employee-role

*                     size  = GROUP SIZE

*                     index = GROUP INDEX )

*  ASCENDING

*  ASSIGNING FIELD-SYMBOL(<group>).

*  CLEAR: gv_tot_age.

*  "Output info at group level

*  WRITE: / |Group: { <group>-index } Role: { <group>-role WIDTH = 15 }| & | Number in this role: { <group>-size }|.

*   "Loop at members of the group

*   LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_member>).

*      gv_tot_age = gv_tot_age + <ls_member>-age.

*      WRITE: /13 <ls_member>-name.

*   ENDLOOP.

*   "Average age

*   gv_avg_age = gv_tot_age / <group>-size.

*   WRITE: / |Average age: { gv_avg_age }|.

*   SKIP.

*ENDLOOP.

"将C类型转换为xstring

DATA text TYPE i value 10.

DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV string( text ) ).

"25. 根据key vbeln='0000000031' 读出表一条数据到表结构体中

TRY.

 DATA(ls_sales_order) = lt_sales_order[ vbeln = '0000000031' ].

*Success part

  CATCH cx_sy_itab_line_not_found.

*Failed part

ENDTRY.

"26. 根据index查出表中的一条数据

TRY.

 DATA(ls_sales_order2) = lt_sales_order[ 1 ].

*Success part

  CATCH cx_sy_itab_line_not_found.

*Failed part

ENDTRY.

"27. 定义字符串

DATA(lv_string) = 'My' && 'TEST' && 'DATA'.

DATA(lv_string_1) = |MY TEST DATA|.

DATA(lv_string_3) = 'DATA'.

DATA(lv_string2) = |MY TEST { lv_string_3 }|.

"28. 把表里的字符串连成一行,如果想用空格格开,要用``包裹

DATA: lt_table TYPE TABLE OF char100 WITH EMPTY KEY.

DATA: lv_string4 TYPE string.

APPEND 'THIS' TO lt_table.

APPEND 'IS' TO lt_table.

APPEND 'A' TO lt_table.

APPEND 'TEST' TO lt_table.

lv_string4 = concat_lines_of( table = lt_table sep = ` ` ) .

"29. 反转字符串

lv_string = reverse( lv_string ).

"30. 从左截取两位字符

DATA(lv_result_shift_1) = shift_left( val = 'ABCDEF' places = 2 ).

"31. 从左截取两位字符放在最后

DATA(lv_result_shift_2) = shift_left( val = 'ABCDEF' circular = 2 ).

"32. 从左截取sub的值,sub中的值必须从A开始,必须挨着:比如ABC 不可以AC

DATA(lv_result_shift_3) = shift_left( val = '000000000101010' sub = '0' ).

DATA(lv_result_shift_4) = shift_left( val = 'ABCEDF' sub = 'AB' ).

"33. 去前导零

DATA lv_string_11 TYPE char30 VALUE '00000000133123'.

SHIFT lv_string_11 LEFT DELETING LEADING '0'.

"34. 字符串截取

DATA(lv_result_sub_1) = substring( val = 'ABCDEFGH' off = 3 len = 4 )."从第三位开始,截取4位      DEFG

DATA(lv_result_sub_2) = substring_from( val = 'ABCDEFGH' sub = 'DEF')."从DEF开始截取直到最后     DEFGH

DATA(lv_result_sub_3) = substring_after( val = 'ABCDEFGH' sub = 'DEF')."从DEF开始截取DEF后面的   GH

DATA(lv_result_sub_4) = substring_before( val = 'ABCDEFGH' sub = 'DEF')."从DEF开始截取DEF前面的  ABC

DATA(lv_result_sub_5) = substring_to( val = 'ABCDEFGH' sub = 'D')."从左开始截取到D包括D          ABCD

————————————————

可以把这个程序稍微修改一下,使其符合MATLAB语法规范,例如改变变量名的命名方式、添加注释等。修改后的代码如下: function r = topsis(z) % TOPSIS算法 % 输入参数:z - 原始数据矩阵 % 输出参数:r - 排序结果 % 将原始数据进行规范化 A = formulation(z); % 指定权重向量 w = [ 1.004 0.886 0.812 0.691 0.740; 1.004 0.886 0.812 0.691 0.740; 1.004 0.886 0.812 0.691 0.740; 1.004 0.886 0.812 0.691 0.740 ]; A = w .* A; % 确定正负理想解 [x1, x2] = findidealpoints(A); % 计算距离 [d1, d2] = computingdistance(A, x1, x2); % 计算接近程度 c = computingdegree(d1, d2); % 排序 r = sorting(c); end function C = count_weight(B) % 计算加权矩阵 % 输入参数:B - 原始数据矩阵 % 输出参数:C - 加权矩阵 A = B; [n, m] = size(A); b = ones(n, m); % 对原始数据进行规范化 for j = 1:m b(:, j) = A(:, j) - max(A(:, j)); end b = b .^ 2; c = sum(1 ./ (sum(b))); % 计算权重向量 w = 1 ./ (c .* sum(b)); % 计算加权矩阵 for j = 1:m C(:, j) = B(:, j) * w(j); end end function c = computingdegree(d1, d2) % 计算接近程度 % 输入参数:d1 - 到正理想解的距离 % d2 - 到负理想解的距离 % 输出参数:c - 接近程度 n = size(d1, 2); c = zeros(1, n); for i = 1:n c(i) = d2(i) / (d1(i) + d2(i)); end end function [d1, d2] = computingdistance(z, x1, x2) % 计算距离 % 输入参数:z - 原始数据矩阵 % x1 - 正理想解 % x2 - 负理想解 % 输出参数:d1 - 到正理想解的距离 % d2 - 到负理想解的距离 [n, m] = size(z); for i = 1:n d1(i) = sqrt(sum((z(i, :) - x1) .^ 2)); d2(i) = sqrt(sum((z(i, :) - x2) .^ 2)); end end function A = formulation(z) % 将原始数据进行规范化 % 输入参数:z - 原始数据矩阵 % 输出参数:A - 规范化矩阵 [n, m] = size(z); for j = 1:m S = sqrt(sum(z(:, j) .^ 2)); for i = 1:n A(i, j) = z(i, j) / S; end end end function [x1, x2] = findidealpoints(A) % 确定正负理想解 % 输入参数:A - 规范化矩阵 % 输出参数:x1 - 正理想解 % x2 - 负理想解 [n, m] = size(A); for j = 1:m x1(j) = max(A(:, j)); x2(j) = min(A(:, j)); end end function r = sorting(c) % 对结果进行排序 % 输入参数:c - 接近程度 % 输出参数:r - 排序结果 [~, r] = sort(c, 'descend'); end 你可以直接复制这段代码并在MATLAB中运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值