背景:
我有几个表连接在视图集群 (SE54( 中进行维护。 其中每个表都有标准的"创建者/更改者/打开"字段。 对于创建的数据,更新字段很容易,我在表维护生成器中使用事件 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.
我已经尝试了"仅单个字段"选项的其他一些变体,但没有运气。
有什么想法,我如何从字符类型转换为 TMSTMP 类型,然后再返回以更新内部表值?
我发现以下工作:
而不是使用:
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.
出于某种原因,它不喜欢我预定义了字段符号。
我觉得这很奇怪,因为文档如下:
使用隐式类型声明进行强制转换 前提是字段符号为 完全类型化或具有通用内置 ABAP 类型 – C 之一, N、P 或 X – 您可以使用以下语句:
ASSIGN ... TO <FS> CASTING.
当系统访问字段符号时,内容 分配的数据对象被解释为与 字段符号。
我只能假设我的结构不兼容(由于 P8 -> TMSTMP 转换(
数据对象的长度和对齐方式必须 与字段符号类型兼容。否则,系统将返回 运行时错误。如果字段符号或数据的类型 对象是 - 或包含 - 字符串,引用类型或内部表, 这些组件的类型和位置必须完全匹配。 否则,将发生运行时错误。