如何将ABAP中日期格式从2020.11.20转换为11/2020?
解决方案:将日期格式转换为月/年(11/2020)
你的核心问题在于内表字段EDATU是日期类型(DATS),直接赋值字符串格式的"MM/YYYY"会被SAP自动按日期规则校验,导致无效值无法正常存储或显示。以下是几种可行的实现方法:
方法1:新增字符串字段存储格式化后的值(最直观)
在自定义结构中添加字符串字段,专门用于存储月/年格式的结果,避免日期类型的限制:
修改代码步骤:
- 更新内表结构,新增字符串字段:
TYPES: BEGIN OF IT_STR, EDATU TYPE VBEP-EDATU, " 保留原日期字段(可选,若不需要可删除) EDATU_MON_YEAR TYPE STRING, " 存储格式化后的月/年 VBELN TYPE VBEP-VBELN, END OF IT_STR.
- 循环内表时,使用
WRITE TO语句格式化日期:
LOOP AT IT_FINAL ASSIGNING <F_DAT>. " 自动将日期转换为MM/YYYY格式 WRITE <F_DAT>-EDATU TO <F_DAT>-EDATU_MON_YEAR MM/YYYY. ENDLOOP.
- 在SALV中隐藏原日期列(如果不需要显示):
GR_COLUMNS = GR_TABLE->GET_COLUMNS( ). GR_COLUMNS->GET_COLUMN( 'EDATU' )->SET_VISIBLE( IF_SALV_C_BOOL_SAP=>FALSE ).
方法2:将字段改为字符串类型并正确转换
若不想新增字段,可直接将EDATU设为字符串类型,但需注意SELECT时的转换逻辑:
修改代码步骤:
- 调整结构中EDATU的类型为字符串:
TYPES: BEGIN OF IT_STR, EDATU TYPE STRING, VBELN TYPE VBEP-VBELN, END OF IT_STR.
- 查询时将日期字段转换为字符串(避免自动格式问题):
SELECT CAST(EDATU AS CHAR(8)) AS EDATU, VBELN FROM VBEP INTO TABLE IT_FINAL UP TO 10 ROWS.
- 循环拼接月/年格式:
LOOP AT IT_FINAL ASSIGNING <F_DAT>. " 从YYYYMMDD格式的字符串中截取月和年,拼接为MM/YYYY <F_DAT>-EDATU = <F_DAT>-EDATU+4(2) && '/' && <F_DAT>-EDATU(4). ENDLOOP.
方法3:直接在SALV中设置列的输出格式(无需修改数据)
如果只是显示需求,无需修改内表数据,直接通过SALV配置列的显示格式即可:
修改代码步骤:
保留原内表结构和查询逻辑,在获取列对象后设置输出格式:
GR_COLUMNS = GR_TABLE->GET_COLUMNS( ). " 对日期字段设置MM/YYYY的显示格式 GR_COLUMNS->GET_COLUMN( 'EDATU' )->SET_OUTPUT_FORMAT( 'MM/YYYY' ).
这种方法最简洁,不需要循环处理数据,由SALV自动完成格式转换。
内容的提问来源于stack exchange,提问作者SALTZZZZ
相关产品推荐
相关产品推荐

