背景介绍:
这部分内容纯粹是为了凑字数,比较啰嗦,可以忽略。
一般情况下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_ZTAB
0002.
-
READ
TABLE GT_ZTAB
0002
INTO GS_ZTAB
0002
-
WITH
KEY FNAME
= LR_COLUMNS-COLUMNNAME.
-
IF SY-SUBRC
=
0.
-
GR_
COLUMN-
>
SET_LONG_TEXT( GS_ZTAB
0002-TEXT_L ).
-
GR_
COLUMN-
>
SET_MEDIUM_TEXT( GS_ZTAB
0002-TEXT_M ).
-
GR_
COLUMN-
>
SET_SHORT_TEXT( GS_ZTAB
0002-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.