前言
这篇文章会持续更新,先 点赞 关注 收藏
制作不易 谢谢🤞
这篇文章会持续更新,先 点赞 关注 收藏
制作不易 谢谢🤞
这篇文章会持续更新,先 点赞 关注 收藏
制作不易 谢谢🤞
这篇文章给大家介绍一下我们 >ABAP 在日常开发中最常用到的一些函数。在SAP中是有大量的标准函数的,涉及面很广很多。其实BAPI也是函数但是这篇文章不会记录介绍,只会持续更新记录我们在ABAP中常用的标准函数 例如对数据的操作转化、日期时间相关、数据属性定义获取 、上载下载、。。。。等等之类的标准函数。下面的提及记录的函数都会给出相应简单的小案例。我会对这些记录的函数 进行划分整理,大家有想查阅的直接查看目录定位到对应位置点击即可。
一、日期 时间 相关
这个标题下面的之介绍日期时间相关操作的函数。
a.
两个日期之间相隔多少 月
MONTHS_BETWEEN_TWO_DATES 可以计两个日期之间相隔了多少月,如果需要更详细的日期计算可以再看看下面的函数。
1.代码示例
我们下面的示例给了两个日期,20240606 和 20230606 相差了12个月计算结果是没问题的。
DATA lv_date1 TYPE DATS VALUE '20240606'.
DATA lv_date2 TYPE DATS VALUE '20230606'.
DATA lv_subdate TYPE string.
CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
EXPORTING
i_datum_bis = lv_date1
i_datum_von = lv_date2
* i_kz_incl_bis = 'X'
IMPORTING
E_MONATE = lv_subdate.
WRITE lv_subdate.
2.注意事项
这个函数其实很简单传两个 YYYYMMDD 的日期就可以计算两个日期之间的月份数。但是还有一个参数 i_kz_incl_bis 需要我们注意一下。这个可以参数控制是否包括结束日期(即第二个日期)在内
, 第二个日期必须满足一个月才会计算进去,下面我们有个日期是 20240630 这个 30 已经满足一个月了当我们 i_kz_incl_bis 参数设置为 X 的时候就会多计算一个月也就是 13 个月。当不传这个值的话计算结果依然是 12 个月。
DATA lv_date1 TYPE DATS VALUE '20240630'.
DATA lv_date2 TYPE DATS VALUE '20230606'.
DATA lv_subdate TYPE string.
CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
EXPORTING
i_datum_bis = lv_date1
i_datum_von = lv_date2
i_kz_incl_bis = 'X'
IMPORTING
E_MONATE = lv_subdate.
WRITE lv_subdate.
b.
两个日期之间相隔多少 天、周、月、年
HR_99S_INTERVAL_BETWEEN_DATES
1.代码示例
直接Copy下面代码 自己根据自己的需求舍去参数就行了。代码中都有详细注解,并且我也附上了断点查看运行结果。
值得注意的是这个tab_mode 入参 我看了源代码 这玩意好像没啥用了。
"入参
DATA begda TYPE sy-datum VALUE '20240606'."开始日期
DATA endda TYPE sy-datum VALUE '20240906'."结束日期
*DATA begda TYPE sy-datum VALUE '20240601'."开始日期
*DATA endda TYPE sy-datum VALUE '20240731'."结束日期
"出参
DATA days TYPE i ."相隔几天
DATA c_weeks TYPE i ."相隔几周
DATA weeks TYPE string."相隔几周(精确值 例如 1.3周 0.5个月)
DATA c_months TYPE i ."相隔几个月 以月为单位 例如20240601-20240731相隔1个月
DATA d_months TYPE i ."相隔几个月 (以30天为单位) 例如20240601-20240731相隔2个月
DATA months TYPE string."相隔几个月(精确值 例如 2.5个月 1.3个月)
DATA c_years TYPE i ."相隔几年
DATA years TYPE string."相隔几年(精确值 例如 0.5年 0.25年)
DATA month_tab TYPE p99sg_month_tab."内表:相隔每月的起始日期和截至日期 相隔月数大于1这个内表才有值
CALL FUNCTION 'HR_99S_INTERVAL_BETWEEN_DATES'
EXPORTING
begda = begda
endda = endda
* tab_mode = 'X'"没啥用了,本来好像是控制 month_tab 是否返回每月的详细信息的
iv_leap_year_mode = 'X'"是否考虑闰年
IMPORTING
days = days
c_weeks = c_weeks
c_months = c_months
c_years = c_years
weeks = weeks
months = months
years = years
d_months = d_months
month_tab = month_tab.
c.
某个日期 加 或 减 指定 年份、月份、天数 后 得到的日期
RP_CALC_DATE_IN_INTERVAL
1.代码示例
我想知道 2024-06-06 这个日期 加 1个月 之后的日期是多少。需要注意的是尽管你只是增加月份但是天数和年份也必须传参,传0就行了。
DATA res_date TYPE dats.
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
date = '20240606'"基准日期
days = '0' "增加或减少的天数
months = '1' "增加或减少的月份
signum = '+' "传 + 或 -
years = '0' "增加或减少的年份
IMPORTING
calc_date = res_date. "增加或减少得到的日期
WRITE / res_date. "20240706
2.项目案例
有时候会限制用户日期查询范围,可以按照如下图所示使用该函数。
FORM frm_check_date .
CLEAR : gv_date.
IF s_date-high IS INITIAL.
MESSAGE : '查询日期区间必输,请检查。' TYPE 'E'.
ELSE.
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
date = s_date-high
days = '0'
months = '12'
signum = '-'
years = '0'
IMPORTING
calc_date = gv_date.
IF s_date-low < gv_date.
MESSAGE : '查询日期区间查过一年,请检查。' TYPE 'E'.
ENDIF.
ENDIF.
ENDFORM. " AUTHORITY_CHECK_DATE
二、数据 操作 转化 加密
步骤二介绍
a.
增加 去除 前导零
1.代码示例
这里不做演示了,笔者另外一篇文章有这个函数的介绍。链接在下方,具体位置在 操作 数据 >>> 增加 去除 前导零
SAP ABAP常用语法 关键字详解 (超级全面)
b.
将 数值类型 负号 提前
1.代码示例
CLOI_PUT_SIGN_IN_FRONT 可以将负号提前 但是被操作的数值得是字符类型。
DATA lv_num1 TYPE I VALUE -2.
DATA lv_res TYPE string.
lv_res = lv_num1."先把要符号提前的数值转为字符类型
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = lv_res. "调用函数转化
"打印结果
WRITE / lv_num1.
WRITE / lv_res.
2.效果展示
负号提前也可以用ALV设置表头的 fieldcat 那个内表中的 ls_fcat-edit_mask字段 可以创建一个 CONVERSION_EXIT_< edit_mask字段名>_OUTPUT 函数格式化数值将负号提前再显示出来。
3.步骤二 a 3
pass
c.
数据加密 MD5 加密
MD5加密 我下面介绍两个函数,分别为 MD5_CALCULATE_HASH_FOR_CHAR 和 CALCULATE_HASH_FOR_CHAR 。他俩的主要区别是前者仅支持 MD5 算法。后者有一个参数可以控制支持多种哈希算法,如 MD5, SHA1, SHA256 等。当你明确知道只需要 MD5 算法时,可以使用前者,当你需要支持不同的哈希算法或可能在将来更改哈希算法时,使用这个通用的函数更为灵活。如果后者函数中的ALG 参数设置为 MD5 的话这两函数效果是一样的。
1.代码示例
我直接把两个函数写在一起了,让他们加密相同的值看结果就行了
DATA lv_text TYPE string. "被加密的数据
DATA lv_hashvalue TYPE hash160. "第一个函数返回值
DATA lv_md5hash TYPE md5_fields-hash."第二个函数返回值
lv_text = 'Hello World'."被加密的数据赋值
CALL FUNCTION 'CALCULATE_HASH_FOR_CHAR'
EXPORTING
alg = 'MD5' " 可以更改为 'SHA1', 'SHA256' 等
data = lv_text
IMPORTING
hash = lv_hashvalue.
CALL FUNCTION 'MD5_CALCULATE_HASH_FOR_CHAR'
EXPORTING
data = lv_text
IMPORTING
hash = lv_md5hash.
WRITE: / '第一个函数:', lv_hashvalue.
WRITE: / '第二个函数:', lv_md5hash.
2.运行效果
运行效果两个函数加密同样的数值 结果是一样的因为使用了同样的加密算法。
3.注意事项
CALCULATE_HASH_FOR_CHAR 返回的加密结果是有多种的 根据需求取就行了一般就用的是第一个。
D.
ASCII 码互转
1.10进制 转 ASCII
函数:SMO5_GET_ASCII_VALUE
2.ASCII 转 10进制
类:CL_ABAP_CONV_OUT_CE
DATA(lv_value) = cl_abap_conv_out_ce=>uccpi( 'A' ) .
WRITE lv_value. "结果为65
三、获取 属性 定义 读取 数据
步骤二介绍
a.
获取函数的 出参 入参 定义
RFC_GET_FUNCTION_INTERFACE 可以获取函数的出参入参定义。
1.代码示例
xxx
2.注意事项
xxx
四、其他
步骤二介绍
a.
在当前窗口显示处理进度 SAPGUI_PROGRESS_INDICATOR
这个函数可以在GUI的左下角显示文本 以及 进度圈,它很简单只有两个参数 PERCENTAGE 参数必须大于等于0 小于等于100,设置这个参数的话就会显示一个进度圈 不设置也可以,TEXT 参数就是你要显示的文本了。这个函数可以提升用户体验,尤其是在一些批量导入或者是耗时比较久的程序。可以避免用户以为程序卡住了。
REPORT zglyntest03.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 0
TEXT = '处理进度0%'.
WAIT UP TO 1 SECONDS.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 20
TEXT = '处理进度20%'.
WAIT UP TO 1 SECONDS.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 40
TEXT = '处理进度40%'.
WAIT UP TO 1 SECONDS.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 60
TEXT = '处理进度60%'.
WAIT UP TO 1 SECONDS.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 80
TEXT = '处理进度80%'.
WAIT UP TO 1 SECONDS.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 100
TEXT = '处理进度100%'.
不显示进度圈👇
显示进度圈👇
a.
根据日志号读取日志 SLG1
五、PP 常用
步骤二介绍
a.
展BOM清单 计算数量 CS_BOM_EXPL_MAT_V2
1.此函数的作用
这个函数可以返回对应物料的所有BOM组件,例如生产一个汽车 需要1个发动机、1个车架、4个轮子、50张皮革,那么你调用了这个函数之后就可以获得这些BOM组件。那么给你返回这些BOM的数量是由你生产几辆汽车决定的,例如你给这个函数传入我需要生产5辆汽车那么 函数就会给你返回 4行数据,第一行是发动机所需的数量 5个,第二行是车架所需的数量 5个,第三行是轮子所需的数量20个,第四行是皮革所需的张数250张。这就是这个函数的主要作用
2.使用方法 参数详解
这个函数的参数非常多 这里我们先介绍常用的用法,后续慢慢的补充更多的参数用法。
首先这个函数有以下必填的参数,如果这些参数有缺少是会出不来数据的。
↓ 导入参数
MTNRV:这个参数就是你要展开的物料,按照我们上面举的例子就是展开汽车这个物料。
WERKS:每个工厂的BOM可能不一样 所以我们需要传入对应工厂
DATUV:有效起始日期,没有特殊情况一般用当天日期就行,例如你2025年02月24日 之前你汽车这个物料对应BOM没有摄像头,但是2025年02月24日 你给后续生产的汽车加装了摄像头这个物料,那么当你这个参数传入小于2025年02月24日 它返回的参数中不会有 摄像头这个BOM的。
CAPID:应用领域,这个参数会影响 BOM 的展开方式,尤其是在有效性和 BOM 替代项选择方面。有以下常用值👇 我们要选择适合当前业务的值。
常用值 | 对应场景 |
---|---|
PP01 | (生产计划): 最常用于与生产相关的 BOM 展开,例如在生产订单或 MRP 中。 |
SD01 | (销售和分销): 用于销售 BOM。 |
CS01 | (成本核算): 用于成本计算目的。 |
LO01 | (库存管理): 用于库存转移或与库存相关的 BOM 展开。 |
3.尝试调用
这只是简单的尝试调用,这个函数返回的数据字段还是非常多的,功能也很强大 更多的用法我们逐一来介绍。想复制代码再往下看。
4.计算BOM所需数量
我们上面简单调用可以看到BOM返回的数量是和CS03查看的数量是一样的 但是当我们要计算成品数据量不一样的话需要用到以下参数。
↓ 导入参数
EMENG:基本数量 指定执行 BOM 展开的抬头物料的 基本数量。此数量用于缩放组件数量。也就是是我们最开始举例造汽车的例子 这个基本数量是5就是造5辆汽车需要对应的BOM数量,这个基本数量是1就是造1辆汽车需要对应的BOM数量了。
AUSKZ:计算BOM耗损,函数里面的描述是 把废料考虑在内,也就是说如果这个参数设置为X那么会把BOM损耗的数量也算进去,举例 造一个汽车需要50张皮革 但是实际在制造的过程中可能有几张因为各种原因报废了 这几张就是损耗,所以我们实际造一辆汽车可能需要55张皮革,那么这个参数设置为X造1辆汽车需要55张皮革 造2辆汽车需要110张皮革。
DATA lt_stb TYPE TABLE OF stpox.
DATA lt_matcat TYPE TABLE OF cscmat.
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = 'PP01' "应用领域 必填
datuv = sy-datum "有效起始日期 必填
mtnrv = 'KD000798J0001001' "展开的物料 必填
werks = '6510' "对应工厂 必填
emeng = 5 "基本数量 选填
auskz = 'X' "计算损耗 选填
TABLES
stb = lt_stb
matcat = lt_matcat
EXCEPTIONS
alt_not_found = 1
call_invalid = 2
material_not_found = 3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
conversion_error = 8
OTHERS = 9.
IF sy-subrc <> 0.
* IMPLEMENT SUITABLE ERROR HANDLING HERE
ENDIF.
↑ 导入参数
pass:
↓↑表入表出
pass:
NED、总结
以上就是今天要讲的内容,本文仅仅简单介绍了 SAP ABAP 一些常用实用的函数,感觉这篇文章自己有学到东西或者在今后的工作中能派上用场,可以点赞收藏支持!!!制作不易非常感谢,当然如果有说错或者不好的地方还望大家提出来见谅,欢迎大家评论指出不好的地方。谢谢!