ABAP - 变量杂例2

** 不同类型变量间的赋值与比较 -->数据转换
** 不同的数据类型的变量之间赋值或比较,会自动进行类型的转换;
** SAP变量数据类型的自动转换:
** 不同变量数据类型值比较时,由数据类型和数据类型的优先级决定
**    1.如果一个变量是I类型,则另一个变量转换为类型I
**    2.如果一个变量是P类型,则另一个变量转换为类型P.
**    3.如果一个变量是D类型,则另一个变量转换为类型D.
**    4.如果一个变量是N类型,另一个变量类型是C或X,则两个变量都转换成P类型
**    5.如果一个变量类型是C,另一个变量类型是X,则X类型转换为类型C.
**    即C类型变量和N类型变量比较或赋值时 两个变量类型都会转换成P类型
**      N类型变量和P类型变量或I类型变量比较或赋值时会向上类型转换成P类型或I类型
**      P类型变量和I类型变量比较或赋值时 P类型转换成I类型
** 注意:这里的类型转换仅仅是在SAP编译器在编译指令时把变量存储的值的类型做了转换
**      变量本身类型不变.
** 转换过程遵照固定的规则,如C类型的变量赋值给N类型的变量,只有数字字符被传递,其他忽略
** C类型的变量不能直接赋值给I类型的变量,需要C->N->I.
** char10是系统内置的数据类型 表示长度为10位长度C类型
DATA lv_char01   TYPE char10 VALUE 'ABCDE12345'.
DATA lv_char02   TYPE char10 VALUE '1234567890'.
DATA lv_char03   TYPE char10 .
DATA lv_num(10)  TYPE n.

DATA lv_int01(10) TYPE i.
** int2是系统内置的数据类型 表示长度为5位的数据整数 每一位占据两个字节
DATA lv_int02     TYPE int2.

lv_num   = lv_char02.
lv_int01 = lv_num.
WRITE:/ 'LV_NUM:',lv_num.
WRITE:/ 'LV_INT:',lv_int01.

** LV_INT2 = LV_CHAR. 会报错类型不匹配
lv_num   = lv_char01.
lv_int02 = lv_num.
WRITE:/ 'LV_NUM:',lv_num.
WRITE:/ 'LV_INT:',lv_int02.

** I类型的变量可以直接赋值给C类型的变量
lv_char03 = lv_int02.
WRITE:/ 'LV_CHAR03',lv_char03.

** 算术运算符 ( + - * / DIV MOD DIV等效于 '/' )
DATA lv_char04 TYPE c LENGTH 3 VALUE '999'.
DATA lv_char05 TYPE c LENGTH 3 VALUE '888'.
DATA lv_char06 TYPE c LENGTH 3.
DATA lv_num03(3) TYPE n.
DATA lv_int03(3) TYPE i.
DATA lv_p03(3)   TYPE p.
DATA lv_f03      TYPE f.
** 加法和减法运算类似 注意接收变量长度
lv_char06 = lv_char04 - lv_char05.
lv_num03  = lv_char04 - lv_char05.
lv_int03  = lv_char04 - lv_char05.
lv_p03    = lv_char04 - lv_char05.
lv_f03    = lv_char04 - lv_char05.
WRITE:/ 'LV_CHAR06:',lv_char06.
WRITE:/ 'LV_NUM03:',lv_num03.
WRITE:/ 'LV_INT03:',lv_int03.
WRITE:/ 'LV_P03:',  lv_p03.
WRITE:/ 'LV_F03:',  lv_f03.

DATA lv_num04(3) TYPE n.
DATA lv_int04(3) TYPE i.
DATA lv_p04      TYPE p DECIMALS 2.
DATA lv_f04      TYPE f.

** N和I类型的变量 不会接收小数
lv_num04 = lv_char04 / '3.3'.
lv_int04 = lv_char04 / '3.3'.
** 除法(div /)
lv_p04   = lv_char05 / '4.4'.
lv_f04   = lv_char05 / 4.
WRITE:/ 'LV_NUM04:',lv_num04.
WRITE:/ 'LV_INT03:',lv_int04.
WRITE:/ 'LV_P04:',  lv_p04.
WRITE:/ 'LV_F04:',  lv_f04.

DATA lv_num05(3) TYPE n.
DATA lv_int05(3) TYPE i.
DATA lv_p05      TYPE p DECIMALS 2.
DATA lv_f05      TYPE f.

**MOD 取余运算符
lv_num05 = 10 MOD 3.
lv_int05 = 8 MOD 2.
**SKIP SAP内置函数 跳一行
SKIP.
WRITE:/ 'LV_NUM05:',lv_num05.
WRITE:/ 'LV_INT05:',lv_int05.

**乘法 *
lv_p05 = 10 * '0.22'.
lv_f05 = '3.3' * 5.
WRITE:/ 'LV_P05:',lv_p05.
WRITE:/ 'LV_F05:',lv_f05.
SKIP.
** 在SAP中可以用(Add  To 、Subtract from、Multiply by、Divide by)表示+ - * /
DATA lv_int06(4) TYPE i VALUE 8.
DATA lv_int07(4) TYPE i VALUE 2.
WRITE:/ 'LV_INT06初始值:.',lv_int06.
** 等效于8 + 4
ADD 4 TO lv_int06.
WRITE:/ 'ADD 4 TO LV_INT06,LV_INT06:',lv_int06.
** 等效于12 - 2
SUBTRACT lv_int07 FROM lv_int06.
WRITE:/ 'SUBTRACT LV_INT06 FROM LV_INT07:',lv_int06.
** 等效于 10 * 3
MULTIPLY lv_int06 BY 3.
WRITE:/ 'MULTIPLY LV_INT06 BY LV_INT07:',lv_int06.
** 等效于 30 DIV 6 或者 24 / 6
DIVIDE lv_int06 BY 6.
WRITE:/ 'DIVIDE LV_INT06 BY 6:',lv_int06.
SKIP.

** 比较运算符
** 等于:  = 或 EQ
** 不等于:<> 或 >< 或 NE
** 大于:   > 或 Gt
** 小于:   < 或 Lt
** 大于等于 >= 或 GE
** 小于等于 <= 或 LE
** a1 BetWEEN a2 AND a3 检查a1是否在a2和a3之间(包括)。
** 是初始值 IS INITIAL  如果变量的内容没有改变,并且它已被自动赋予其初始值,则条件为真。
** 不是初始值IS NOT INITIAL判断条件和IS INITIAL相反 即变量的初始值



** 比较运算符可以结合逻辑运算符使用
** 这两种运算符 一般单配条件判断语句使用

** 以 > 为例 其他运算符可以自己尝试写一下 动手才是最好的老师
** 除了Between And、IS INITIAL、IS NOT INITIAL
IF 3 > 2.
** 如果3>2这个入口条件为真 就会执行 IF ...ENDIF.里面的语句
  WRITE: /'3确实大于2'.
ENDIF.

** a1 BetWEEN a2 AND a3 是  等效于a2 <= a1 <= 13 相当于数学的[]
IF 8 BETWEEN 6 AND 9.
  WRITE: /'8确实在[6-9]区间内'.
ENDIF.

IF 6 BETWEEN 6 AND 9.
  WRITE: /'6确实在[6-9]区间内'.
ENDIF.

**IS INITIAL IS NOT INITIAL 变量的比较运算符
DATA lv_kk01 TYPE c LENGTH 4.
IF lv_kk01 IS INITIAL.
  WRITE:/ '变量只是声明 并没赋值'.
ENDIF.
lv_kk01 = '8801'.
IF lv_kk01 IS NOT INITIAL.
  WRITE:/ '变量已声明 并且已赋值'.
ENDIF.
SKIP.

** 逻辑运算符 [与(adn) 或(or) 非(not)]
** OR 当条件入口中的判断条件中至少一个为真时 就会进入IF ENDIF 执行WRITE语句
** 3>1为真 7<9为真 8>10为假 条件判断为:真 OR 真 OR 假
IF 3 > 1 OR 7 < 9 OR 8 > 10.
  WRITE: /'嘿嘿,至少有一个为真,我进来辣。'.
ENDIF.
** AND 当条件入口中的判断条件中必须全部为真时 才会进入IF ENDIF 执行WRITE语句
** 2>1为真 7<8为真 6>5为真 条件判断为:真 AND 真 AND 真
IF 2 > 1 AND 7 < 8 AND 6 > 5.
  WRITE:/'哈哈,全都是真的'.
ENDIF.
** NOT 否定入口条件的真假
** 1>2 为假 加了NOT 判定条件为真.
IF NOT 1 > 2.
  WRITE:/'真真假假,傻傻分不清楚'.
ENDIF.

SKIP.
** 按位运算符 日常开发中几乎不用
** BIT-NOT
** BIT-AND
** BIT-XOR
** BIT-OR

** 常用的算术运算函数
** ABS   返回变量的绝对值
** SIGN  返回变量的的符号:正数返回1,0返回0,负数返回-1
** CEIL  如果变量的值带有小数 则向上取整
** FLOOR 如果变量的值带有小数 则向下取整
** TRUNC 返回输入参数的整数部分
** FRAC  返回输入参数的小数部分
** STRLEN 获取字符串长度函数 只能是C N D T Stirng

DATA lv_kk02 TYPE p LENGTH 4 DECIMALS 2 VALUE '-8889.50'.
WRITE:/ 'lv_kk02调用ABS函数的返回值', ABS( lv_kk02 ).
WRITE:/ 'lv_kk02调用SIGN函数的返回值', SIGN( lv_kk02 ).
WRITE:/ 'lv_kk02调用CEIL函数的返回值', CEIL( lv_kk02 ).
WRITE:/ 'lv_kk02调用FLOOR函数的返回值', FLOOR( lv_kk02 ).
WRITE:/ 'lv_kk02调用TRUNC函数的返回值', TRUNC( lv_kk02 ).
WRITE:/ 'lv_kk02调用FRAC函数的返回值', FRAC( lv_kk02 ).
WRITE:/ '123456调用STRLEN函数的返回值', STRLEN( '123456   ' ).
SKIP.
** 字符串运算符
** CO(仅包含)       检查A是否仅由B中的字符组成       A和B比较的时候区分大小写 区分尾部空格
** CN(不仅包含)     检查A是否不仅由B中的字符组成     A和B比较的时候区分大小写 区分尾部空格
** CA(包含任何)     检查A是否包含B中的任一字符       A和B比较的时候区分大小写 区分尾部空格
** NA(不包含任何)   检查A是否不包含B中的任一字符     A和B比较的时候区分大小写 区分尾部空格
** CS(包含字符串)   检查A是否包含B中的全部字符       A和B比较的时候不区分大小写 不区分尾部空格
** NS(不包含字符串) 检查A是否不包含B中的全部字符     A和B比较的时候不区分大小写 不区分尾部空格
** CP(符合模式)     检查A是否符合B的模式             A和B比较的时候不区分大小写 不区分尾部空格
** NP(不符合模式)   检查A是否不符合B的模式           A和B比较的时候不区分大小写 不区分尾部空格
DATA:s1      TYPE string,
     s2      TYPE string,
     lv_flag TYPE abap_bool.
s1 = `abc哈哈`.
s2 = `abc哈哈abc`.
** S1 CO S2,S1的'abc哈哈'是否可以在S2中找到 xsdbool(条件为真返回 abap_true 为假返回abap_false)。
lv_flag =  xsdbool( s1 CO s2 ). "为真
IF lv_flag = abap_true.
  WRITE:/ 'S1 CO S2为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 CO S2为假'.
ENDIF.

** 清空lv_flag,s1,s2的内容 回到变量初始定义的状态
CLEAR:lv_flag,s1,s2.
s1 = `abc哈哈abcd`.
s2 = `abc哈哈abc`.
** S1 CN S2, S1中有d S2中没有 即S1不包含于S2
lv_flag =  xsdbool( s1 CN s2 ). "为真
IF lv_flag = abap_true.
  WRITE:/ 'S1 CN S2为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 CN S2为假'.
ENDIF.

** 清空lv_flag,s1,s2的内容 回到变量初始定义的状态
CLEAR:lv_flag,s1,s2.
s1 = `abcd`.
s2 = `e`.
** S1 CN S2, S1中的字符至少可以在S2中找到一个
lv_flag =  xsdbool( s1 CA s2 ). "为假
IF lv_flag = abap_true.
  WRITE:/ 'S1 CA S2为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 CA S2为假'.
ENDIF.

** 清空lv_flag,s1,s2的内容 回到变量初始定义的状态
CLEAR:lv_flag,s1,s2.
s1 = `abcd`.
s2 = `e`.
** S1 NA S2, S1不包含S2的任意一个字符
lv_flag =  xsdbool( s1 NA s2 ). "为假
IF lv_flag = abap_true.
  WRITE:/ 'S1 NA S2为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 NA S2为假'.
ENDIF.

** 清空lv_flag,s1,s2的内容 回到变量初始定义的状态
CLEAR:lv_flag,s1,s2.
s1 = `abap`.
s2 = `abp`.
** S1 CS S2, S1中可以找到连续完整的跟S2一样的字符
lv_flag =  xsdbool( s1 CS s2 ). "为真
IF lv_flag = abap_true.
  WRITE:/ 'S1 CS S2为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 CS S2为假'.
ENDIF.

** 清空lv_flag,s1,s2的内容 回到变量初始定义的状态
CLEAR:lv_flag,s1,s2.
s1 = `abpa`.
s2 = `abp`.
** S1 CS S2, S1中找不到连续完整的跟S2一样的字符
lv_flag =  xsdbool( s1 NS s2 ). "为真
IF lv_flag = abap_true.
  WRITE:/ 'S1 NS S2为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 NS S2为假'.
ENDIF.

** 清空lv_flag,s1,s2的内容 回到变量初始定义的状态
CLEAR:lv_flag,s1,s2.
s1 = `abc`.
** *匹配多个字符
** +匹配一个字符
** #字符操作中的转义符
** S1 CP S2, S1符合 某种模式
lv_flag =  xsdbool( s1 CP 'a*' ). "为真
IF lv_flag = abap_true.
  WRITE:/ 'S1 CP a*模式为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 CP a*模式为假'.
ENDIF.

lv_flag =  xsdbool( s1 CP 'a++' ). "为真
IF lv_flag = abap_true.
  WRITE:/ 'S1 CP a++模式为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 CP a++模式为假'.
ENDIF.

** 如果需要区分大小写、(+ - * /)、和空格,则需要通过#号进行转译
s2 = `abC`.
lv_flag =  xsdbool( s2 CP 'ab#C' ). "要求ab为小写 C为大写 为真
IF lv_flag = abap_true.
  WRITE:/ 'S2 CP ab#C模式为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 CP ab#C模式为假'.
ENDIF.

s2 = `a+b-Cde`.
** 要求a后面的第一个字符为+号 +号后以为为任意一个字符 第四位为-号第五位C为大写 C后面的为任意字符
lv_flag = xsdbool( s2 CP 'a#++#-#C*').
IF lv_flag = abap_true.
  WRITE:/ 'S2 CP a#++#-#C*模式为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 CP a#++#-#C*模式为假'.
ENDIF.

s2 = 'a  '.
** 匹配空格
lv_flag = xsdbool( s2 CP 'a# ').  "要求a后面一位是空格 b后面一位是空格
IF lv_flag = abap_true.
  WRITE:/ 'S2 CP a# b# 模式为真'.
ELSEIF lv_flag = abap_false.
  WRITE:/ 'S1 CP a# b# 模式为假'.
ENDIF.

** NP和CP用法一样 不同的是

你可能感兴趣的:(ABAP)