背景
我在视图集群中连接了几个用于维护的表(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,然后再返回以更新内部表值?
答案 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是 - 或包含 - 字符串,引用类型或内部表, 这些组件的类型和位置必须完全匹配。 否则,将发生运行时错误。