SAP ABAP 常用实用函数(不收藏会后悔)


前言

      这篇文章会持续更新,先 点赞 关注 收藏 制作不易 谢谢🤞
      这篇文章会持续更新,先 点赞 关注 收藏 制作不易 谢谢🤞
      这篇文章会持续更新,先 点赞 关注 收藏 制作不易 谢谢🤞

      这篇文章给大家介绍一下我们 >ABAP 在日常开发中最常用到的一些函数。在SAP中是有大量的标准函数的,涉及面很广很多。其实BAPI也是函数但是这篇文章不会记录介绍,只会持续更新记录我们在ABAP中常用的标准函数 例如对数据的操作转化、日期时间相关、数据属性定义获取 、上载下载、。。。。等等之类的标准函数。下面的提及记录的函数都会给出相应简单的小案例。我会对这些记录的函数 进行划分整理,大家有想查阅的直接查看目录定位到对应位置点击即可。


一、日期 时间 相关

          这个标题下面的之介绍日期时间相关操作的函数。

            a.两个日期之间相隔多少 月

                      MONTHS_BETWEEN_TWO_DATES 可以计两个日期之间相隔了多少月,如果需要更详细的日期计算可以再看看下面的函数。
                       1.代码示例
                            我们下面的示例给了两个日期,2024060620230606 相差了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.30.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.50.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_CHARCALCULATE_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 一些常用实用的函数,感觉这篇文章自己有学到东西或者在今后的工作中能派上用场,可以点赞收藏支持!!!制作不易非常感谢,当然如果有说错或者不好的地方还望大家提出来见谅,欢迎大家评论指出不好的地方。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao贱贱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值