ABAP ALV输出前面空格

Posted 狗尾巴草_lan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABAP ALV输出前面空格相关的知识,希望对你有一定的参考价值。

背景介绍:

这部分内容纯粹是为了凑字数,比较啰嗦,可以忽略。

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

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

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

自建表中数据

ALV报表查询结果

解决过程:

此部分也是为了凑字数,并有自吹自擂嫌疑。

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

辛弃疾说:“众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。"当我蓦然回首时,没有发现美人,却发现了SE16查看表数据也是用的ALV格式,而且能够显示前导空格。所以接下来又到了我展示高超Debug技术的时刻了。

调试发现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.

以上是关于ABAP ALV输出前面空格的主要内容,如果未能解决你的问题,请参考以下文章

ABAP ALV输出前面空格

abap语言的alv程序中,如何控制单元格的零显示空

ABAP ALV控件的使用

怎么用ABAP 代码判断,,某程序的某个屏幕上,输出了 ALV 且 计算 输出ALV 的内表有 多少个字段?

[ABAP]求助 关于READ_TEXT函数以及ALV的问题

abap中如何去掉字符串前导0