ABAP—ALV 进阶:对展示数字要求负号提前、有千分符、有百分号

2024-05-08 04:20

本文主要是介绍ABAP—ALV 进阶:对展示数字要求负号提前、有千分符、有百分号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、负号提前

问题描述:SAP的数据,例如金额,为负数时,负号放在数值后面,不符合一般的负号在前的读数习惯,如何把负号放到数值前面?

解决办法:使用 'CLOI_PUT_SIGN_IN_FRONT'

CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
        CHANGING
          value = gs_out-menge.

注意这里要转换字符的值必须是字符类型,对外接口采用这种方式比较好用。

2、负号提前且有千分符

用户需求升级:金额 负号前置,并且加千分符。

展示效果如下:

解决办法:

参考:SAP 金额等负号提前问题_sap 负号提前-CSDN博客

操作步骤:

(1)SE37 ,命名规则如下,从Z001开始,这里Z001已用,故使用Z002。

(2)输入所属的函数组、描述、导入参数、导出参数。

(3)源代码如下,保存、激活。

FUNCTION conversion_exit_z002_output.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(INPUT)
*"  EXPORTING
*"     REFERENCE(OUTPUT)
*"----------------------------------------------------------------------DATA:output1(20),output2(20),outnum(16) TYPE p DECIMALS 2.IF input IS NOT INITIAL.outnum = input.IF input >= 0.WRITE outnum TO output1.ELSE.outnum = outnum * ( -1 ).WRITE outnum TO output1.CONCATENATE '-' output1 INTO output1.ENDIF.ELSEIF input = '0.00'.WRITE outnum TO output1.
*    CLEAR output1.ENDIF.CONDENSE output1 NO-GAPS.WRITE output1 TO output2 RIGHT-JUSTIFIED.output = output2.CLEAR : output2.
ENDFUNCTION.

(4)在设置对应的ALV格式时,针对金额添加字段类型'Z002',与上面函数命名里面的一致。

wa_fieldcat_lvc-EDIT_MASK = '==Z002'.

注意:设置负号提前类型的数据类型,不能设置为字符类型,需要设置为金额类型 CURR

详细如下:

FORM display_data .
* alv 显示定义DATA: wa_fieldcat_lvc TYPE lvc_s_fcat,i_fieldcat_lvc  TYPE lvc_t_fcat,i_layout_lvc    TYPE lvc_s_layo,i_grid_settings TYPE lvc_s_glay.DEFINE fill_alv.CLEAR  wa_fieldcat_lvc.wa_fieldcat_lvc-fieldname = &1.   "变量1 字段名wa_fieldcat_lvc-scrtext_l = &2 .  "变量2 字段编码wa_fieldcat_lvc-outputlen = &3 .  "变量3 字段描述wa_fieldcat_lvc-EDIT_MASK = &4.   "变量4 金额类型设置APPEND wa_fieldcat_lvc TO i_fieldcat_lvc .END-OF-DEFINITION.fill_alv 'NAME' '项目' '20'  '' .fill_alv 'HSLVT' '金额' '20' '==Z002' .i_grid_settings-edt_cll_cb = 'X'.          "退出可编辑单元格时回调i_layout_lvc-zebra        = 'X' .          " 使ALV界面呈现颜色交替i_layout_lvc-sel_mode     = 'A' .          " 选择模式,"A"在最左端有选择按钮i_layout_lvc-cwidth_opt   = 'X' .          " 自动优化列宽i_layout_lvc-detailinit   = 'X' .          " 是否出现细节屏幕i_layout_lvc-detailtitl   = '金额表' .     " 标题"i_layout_lvc-stylefname = 'CELLSTYLES'.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program       = sy-repid          " 当前程序i_callback_top_of_page   = 'TOP_OF_PAGE'i_callback_pf_status_set = 'SET_PF_STATUS'i_callback_user_command  = 'FRM_USER_COMMAND'i_grid_settings          = i_grid_settingsis_layout_lvc            = i_layout_lvc      " 属性内表it_fieldcat_lvc          = i_fieldcat_lvc[]  " 列明内表i_save                   = 'A'               " 是否保存布局TABLESt_outtab                 = gt_outEXCEPTIONSprogram_error            = 1OTHERS                   = 2.ENDFORM.                    " DISPLAY_DATA

3、显示百分号

用户需求再升级:对同比、环比数据,添加百分号。

要求效果如下:

解决办法1:直接加。当字符串处理。

DATA: ZTB(20),

            LZTB TYPE p DECIMALS 2.

LZTB = 0.02. "同比是为0.02

ZTB = | { LZTB * 100 } %|.

或者

ZTB = ( LZTB * 100 ) && '%'.

解决办法2:和上面将负号提前的方法类似,SE37创建'CONVERSION_EXIT_Z001_OUTPUT'.

(1)设置如下

(2)源代码如下:

FUNCTION conversion_exit_z001_output.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(INPUT)
*"  EXPORTING
*"     REFERENCE(OUTPUT)
*"----------------------------------------------------------------------DATA input1 TYPE p DECIMALS 1.data lv_outpt type char8.IF input > 0.input1 = input * 100.WRITE input1 TO lv_outpt.CONCATENATE lv_outpt '%' INTO   lv_outpt.output = lv_outpt.ELSE.output = lv_outpt.output = '0'.ENDIF.ENDFUNCTION.

(3)ALV设置,gt_fieldcat-EDIT_MASK = '==Z001'.

注意:设置有百分号类型的数据类型,不能设置为字符类型,需要设置为          TYPE p DECIMALS 2。

FORM display_data .
* alv 显示定义DATA: i_grid_settings TYPE lvc_s_glay,lt_fieldcat     TYPE slis_t_fieldcat_alv,lr_aggregations TYPE REF TO cl_salv_aggregations.DATA:gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,gs_layout   TYPE slis_layout_alv.* 自定义ALV 显示方式DEFINE fill_alv.clear gt_fieldcat.gt_fieldcat-fieldname = &1.  "变量1 字段名gt_fieldcat-seltext_m = &2 .  "变量2 字段描述gt_fieldcat-outputlen = &3 .  "变量2 字段描述gt_fieldcat-NO_ZERO = &4.gt_fieldcat-EDIT_MASK = &5.append gt_fieldcat.END-OF-DEFINITION.fill_alv 'MENGE1' '上月数量' '20' 'X' ''.fill_alv 'MENGE2' '本月数量' '20' 'X' ''.fill_alv 'BFB'    '环比'     '20' 'X' '==Z001'.LOOP AT gt_fieldcat.MODIFY gt_fieldcat.IF gt_fieldcat-fieldname = ' FLTIME'.gt_fieldcat-edit = 'X'.gt_fieldcat-outputlen = '50'.ENDIF.MODIFY gt_fieldcat.ENDLOOP.i_grid_settings-edt_cll_cb = 'X'. "退出可编辑单元格时回调gs_layout-zebra        = 'X'.gs_layout-colwidth_optimize = 'X'.gs_layout-box_fieldname = 'ZSEL'. "定义边框选中栏gs_layout-window_titlebar = '环比分析表'.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'EXPORTINGi_callback_program       = sy-repidi_callback_pf_status_set = 'SET_PF_STATUS'i_callback_user_command  = 'FRM_USER_COMMAND'i_grid_settings          = i_grid_settingsis_layout                = gs_layoutit_fieldcat              = gt_fieldcat[]it_sort                  = lt_sorti_save                   = 'A'TABLESt_outtab                 = gt_tabEXCEPTIONSprogram_error            = 1OTHERS                   = 2.ENDFORM.                    " DISPLAY_DATA

4、总结

ALV展示时,采用'CONVERSION_EXIT_Z****_OUTPUT'' 方式,在报表展示时可以重复使用。如果对外部接口使用,在代码中需要做相应的转换。

5、注意事项

定义数据类型时,需要注意,如果是CHAR类型,在判断的时候可能有如下问题。

DATA: INPUT(20).

input = 0.05.

IF  input > 0.

        A

ELSE input = 0.

        B

ELSE.

        C

ENDIF.

这里会直接跳到B。因为类型是CHAR类型,舍去了小数点之后的数字,效果和自动向下取整一样。如果字符类型和0进行比较,需要写成 IF  input = '0'.

数字进行比较的时候,需要设置数字类型、金额类型、p类型。

这篇关于ABAP—ALV 进阶:对展示数字要求负号提前、有千分符、有百分号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969294

相关文章

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis