SAP ABAP 输出结果带有空格

文章讲述了在SAP系统中,ALV(AcceleratedListViewer)在默认情况下不显示字段的前导空格。作者通过研究发现,可以通过设置ALV的参数IT_FIELDCAT中的PARAMETER0为X来显示前导空格。对于不同类型的ALV,如OOALV和SALV,文章提供了相应的解决方案,包括使用CL_GUI_ALV_GRID和CL_SALV_COLUMN类的相关方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:

字段内容前增加空格,需使用全角空格,使用半角空格时,ALV显示无效,空格无法显示,

全角与半角的切换方法:shift+空格切换,

如下的标记部分,要想通过ALV显示空格,表里需存储为全角空格。

 或者

展示结果:

 

方法二:

一般情况下SAP这边填写内容不会以空格开头,此次需求是EDI平台将客户的叫料计划传到SAP生成销售计划协议计划行,其中有一些客户特定信息需要存下以便后面交货生成ASN信息回传给客户,因为没有SAP前台字段,所以存在自建表中。

其中有个信息“EDI客户件号”客户填写时候会以空格开头,并且中间还可能出现空格或者连续空格。

ALV如果不特别设置参数,默认中间空格会显示,而开头空格不会显示。

自建表中数据

ALV报表查询结果 

 

翻遍ALV常用传入参数类型LVC_S_LAYO和LVC_S_FCAT都没有发现描述与此问题相关的参数。

发现了SE16查看表数据也是用的ALV格式,而且能够显示前导空格。

 调试发现SE16查看数据调用的是ALV函数REUSE_ALV_GRID_DISPLAY

查看传入参数IS_LAYOUT并未发现异样,查看传入参数IT_FIELDCAT,看到PARAMETER0打上了“X"。

 

解决方法:

将ALV传入参数IT_FIELDCAT里的PARAMETER0设为“X",即可输出前导空格。这时候我不反对大家尽情吐槽SAP的晦涩难懂。

 

如果是OO ALV,使用了类CL_GUI_ALV_GRID,则调用方法SET_TABLE_FOR_FIRST_DISPLAY时将参数IT_FIELDCATALOG里的PARAMETER0设为“X"。

如果是SALV,使用了类CL_SALV_TABLE,则可以调用类CL_SALV_COLUMN的方法SET_LEADING_SPACES实现,参考如下
 

*SALV相关参数
DATA: GR_TABLE     TYPE REF TO CL_SALV_TABLE,
      GR_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS_LIST,
      GR_DISPLAY   TYPE REF TO CL_SALV_DISPLAY_SETTINGS,
      GR_COLUMNS   TYPE REF TO CL_SALV_COLUMNS_TABLE,
      GR_COLUMN    TYPE REF TO CL_SALV_COLUMN_TABLE.
 
FORM FRM_SALV.
  DATA: LX_MSG TYPE REF TO CX_SALV_MSG.
  DATA: LV_TITLE TYPE LVC_TITLE,
        LV_CONT  TYPE I,
        LV_CONTT TYPE LVC_TITLE.
 
  ASSIGN GR_DATA->* TO <GT_DYN>.
 
  TRY .
      CL_SALV_TABLE=>FACTORY( IMPORTING R_SALV_TABLE = GR_TABLE CHANGING T_TABLE = <GT_DYN> ).
    CATCH CX_SALV_MSG INTO LX_MSG.
      GV_MESSAGE = LX_MSG->GET_TEXT( ).
      MESSAGE GV_MESSAGE TYPE 'E'.
      RETURN.
  ENDTRY.
 
  LV_CONT = LINES( <GT_DYN>[] ).
  LV_CONTT = LV_CONT.
  CONDENSE LV_CONTT NO-GAPS.
  CONCATENATE '总计共' LV_CONTT  '条数据' INTO LV_TITLE.
  CONDENSE LV_TITLE NO-GAPS.
 
  GR_FUNCTIONS = GR_TABLE->GET_FUNCTIONS( ).
  GR_FUNCTIONS->SET_ALL( ABAP_TRUE ).
  GR_DISPLAY = GR_TABLE->GET_DISPLAY_SETTINGS( ).
*  gr_display->set_striped_pattern( cl_salv_display_settings=>true ).
  GR_DISPLAY->SET_LIST_HEADER( EXPORTING VALUE = LV_TITLE ).
  GR_COLUMNS = GR_TABLE->GET_COLUMNS( ).
  TRY.
      LOOP AT GR_COLUMNS->GET( ) INTO DATA(LR_COLUMNS).
        IF LR_COLUMNS-COLUMNNAME = 'MESG'.
          GR_COLUMN ?= GR_COLUMNS->GET_COLUMN( LR_COLUMNS-COLUMNNAME ).
          GR_COLUMN->SET_OUTPUT_LENGTH( VALUE = |50|  ).
        ELSEIF LR_COLUMNS-COLUMNNAME = 'ICON'.
          GR_COLUMN ?= GR_COLUMNS->GET_COLUMN( LR_COLUMNS-COLUMNNAME ).
          GR_COLUMN->SET_OUTPUT_LENGTH( VALUE = |5|  ).
          GR_COLUMN->SET_ALIGNMENT( VALUE = IF_SALV_C_ALIGNMENT=>CENTERED ).
        ELSE.
          GR_COLUMN ?= GR_COLUMNS->GET_COLUMN( LR_COLUMNS-COLUMNNAME ).
          IF SY-TCODE <> 'ZFI001'.
            GR_COLUMN->SET_OUTPUT_LENGTH( VALUE = |20|  ).
          ELSE.
            GR_COLUMN->SET_OPTIMIZED( VALUE = 'X').
          ENDIF.
          GR_COLUMN->SET_ALIGNMENT( VALUE = IF_SALV_C_ALIGNMENT=>LEFT ).
          GR_COLUMN->SET_LEADING_SPACES( VALUE = 'X' ).
          CLEAR GS_ZTAB0002.
          READ TABLE GT_ZTAB0002 INTO GS_ZTAB0002
            WITH KEY FNAME = LR_COLUMNS-COLUMNNAME.
          IF SY-SUBRC = 0.
            GR_COLUMN->SET_LONG_TEXT( GS_ZTAB0002-TEXT_L ).
            GR_COLUMN->SET_MEDIUM_TEXT( GS_ZTAB0002-TEXT_M ).
            GR_COLUMN->SET_SHORT_TEXT( GS_ZTAB0002-TEXT_S ).
 
          ENDIF.
        ENDIF.
      ENDLOOP.
    CATCH CX_SALV_NOT_FOUND.
  ENDTRY.
  "IF SY-BATCH IS INITIAL.
    TRY.
        GR_TABLE->SET_SCREEN_STATUS(
          PFSTATUS      = 'ZCMRP001_STATUS'
          REPORT        = SY-REPID
          SET_FUNCTIONS = GR_TABLE->C_FUNCTIONS_ALL ).
      CATCH CX_SALV_MSG.
    ENDTRY.
    DATA(GR_EVENT) =  GR_TABLE->GET_EVENT( ).
    CREATE OBJECT EVENT_HANDLER.
    SET HANDLER EVENT_HANDLER->ON_USER_COMMAND  FOR GR_EVENT.
 " ENDIF.
  GR_TABLE->DISPLAY( ).
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值