SAP ABAP SMARTFORMS画面上显示字符的长度问题研究

文章描述了一个在SMARTOFMRS中遇到的字符显示问题,通过测试发现不同字符类型的长度差异导致字符截断。作者提供了一个计算可视范围长度的代码逻辑,以确保正确显示各种字符组合。
摘要由CSDN通过智能技术生成

我们开发SMARTOFMRS经常需要显示字符,有小写字母,大写字母,汉字,还有一些其他字符,收到用户一个BUG,说字符显示不全,我看了一下显示的是大写字母,但是超出了显示范围,我就意识到SMARTFORMS的每种字符的长度是不一样的,然后我就做一个测试程序测试一下看看,如下测试程序

看上图,可知正常显示30个小写字母的长度,只能显示27个数字,22个大写字母,15个中文字符,还有其他特殊字符如“!”就更多了。所以问题就找到了,正常一行显示132个英文字母是没问题的,但是里面夹杂了大写字母,所以就超过了SMARTFORMS的可显示范围,导致字符被截断。

这样的话,我们可以写一个长度转换的代码逻辑,实现效果就是,30个小写字母的可视长度最多可装27个数字,22个大写字母,15个汉字或其他特殊字符。

计算可视范围长度的代码如下,US_STR是输入字符串,US_LEN是输出可视长度

FORM FRM_GETSTRLEN USING US_STR US_LEN.

  US_LEN = 0.
  DATA LV_SHUZI TYPE CHAR30.
  LV_SHUZI = '0123456789'.
  DATA LV_DAXIE TYPE CHAR30.
  LV_DAXIE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ'.
  DATA LV_XIAOX TYPE CHAR30.
  LV_XIAOX = 'abcdefghijklmnopqrstuvwxyzäöüß'.
  DATA LV_LEN TYPE I.
  LV_LEN = STRLEN( US_STR ).
  DATA LV_CHAR TYPE CHAR1.
  DATA LV_INDEX TYPE I.
  LV_INDEX = 0.
  WHILE LV_INDEX < LV_LEN.
    LV_CHAR = US_STR+LV_INDEX(1).
    DATA LEN_VIS TYPE I.
    CLEAR LEN_VIS.
    CALL FUNCTION 'NLS_VISUAL_CHARLEN' "判断是否是汉字
      EXPORTING
        STR        = LV_CHAR
      IMPORTING
        LEN_VISUAL = LEN_VIS.

    IF LV_SHUZI CS LV_CHAR.
      US_LEN = US_LEN + '1.111'.
    ELSEIF LV_DAXIE CS LV_CHAR.
      US_LEN = US_LEN + '1.364'.
    ELSEIF LV_XIAOX CS LV_CHAR.
      US_LEN = US_LEN + '1'.
    ELSEIF LEN_VIS > 1.
      US_LEN = US_LEN + '2'. "汉字占两个长度
    ELSE.
      US_LEN = US_LEN + '1'.
    ENDIF.
    LV_INDEX = LV_INDEX + 1.
  ENDWHILE.

ENDFORM.

这个只能估算一行可以显示多少字符量,实际使用过程中我们还需要预留多一行的给备用,防止字符串截断。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值