在Unicode系统(和返回)中从Packed(8)类型转换为TMSTMP(DEC15)类型

时间:2013-06-10 03:08:40

标签: sap abap

背景

我在视图集群中连接了几个用于维护的表(SE54)。这些表中的每一个都具有标准的Created / Changed By / On字段。对于创建的数据更新,字段很简单,我在表维护生成器中使用事件05(在创建时)。对于违约变化的字段,它涉及更多一点。我必须使用事件01(保存之前),然后根据需要使用字段值更新表TOTAL[]EXTRACT[]

在SM30中维护表时,TOTAL[]EXTRACT[]的格式与我使用附加标志维护的视图相同,以确定所做的更改类型(更新/创建) /删除)

但是,在SM54中维护时(这是业务要求),TOTAL[]EXTRACT[]的格式只是字符行的内部表。

问题:

我可以弄清楚正在编辑的表的类型是什么。但是当我尝试将字符行移动到类型行时,我得到以下运行时错误:(取决于我如何移动/分配它)

ASSIGN_BASE_TOO_SHORT
UC_OBJECTS_NOT_CONVERTIBLE
UC_OBJECTS_NOT_CHAR

我的所有结构都采用以下格式:

*several generic (flat) types
CREATED    TYPE TMSTMP,  "not a flat type
CHANGED    TYPE TMSTMP,  "not a flat type
CREATED_BY TYPE ERNAM,
CHANGED_BY TYPE AENAM,

问题的根源是两个时间戳字段不是平面类型。我可以在字符行中看到,时间戳由8个字符表示。

编辑:只有在找到解决方案后才能将长度(8)字段标识为已打包。

我徒劳地尝试了以下方法:

"try the entire structure - which would be ideal
assign ls_table_line to <fs_of_the_correct_type> casting.  

"try isolating just the timestamp field(s)
assign <just_the_8char_representation> to <fs_of_type_tmpstmp> casting.

我在“仅限单一字段”选项上尝试了一些其他变体而没有运气。

我有什么想法可以从Character类型转换为类型TMSTMP,然后再返回以更新内部表值?

1 个答案:

答案 0 :(得分:3)

我发现以下作品:

而不是使用:

field-symbols: <structure> type ty_mystructure,
               <changed>   type tmstmp.

assign gv_sapsingle_line to <structure> casting. "causes a runtime error
assign gv_sap_p8_field   to <changed> casting.   "ditto

我用过这个:

field-symbols: <structure> type any,
               <changed>   type any.

assign gv_sapsingle_line to <structure> casting type ty_mystructure.
assign gv_sap_p8_field   to <changed> casting type ty_tmstmp.   

出于某种原因,我不喜欢我预定义字段符号。

我发现奇怪的是the documentation表示以下内容:

  

使用隐式类型声明进行投射提供字段符号   要么完全打字,要么有一个通用的内置ABAP类型 - C,   N,P或X - 您可以使用以下语句:

ASSIGN ... TO <FS> CASTING.
  

当系统访问字段符号时,内容为   已分配的数据对象被解释为与其具有相同的类型   场符号。

我只能假设我的结构不兼容(由于P8 - &gt; TMSTMP转换)

  

数据对象的长度和对齐方式必须为   与字段符号类型兼容。否则系统返回a   运行时错误。如果字段符号或数据的类型   object是 - 或包含 - 字符串,引用类型或内部表,   这些组件的类型和位置必须完全匹配。   否则,将发生运行时错误。