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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

java学习,进阶,提升

http://how2j.cn/k/hutool/hutool-brief/1930.html?p=73689

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop