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 且 计算 输出ALV 的内表有 多少个字段?