类型通用表的LOOP/READ字段符号分配字段符号行为

2020-09-22 12:46发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好


我注意到ABAP的一种举动使我感到惊讶,但我对此一无所获。


当我尝试通过分配内联声明字段符号的LOOP或READ访问分配给通用类型标准表类型的字段符号的内部表的表行时,即使 表为空,将(未知)存储区分配给字段符号。


SY-SUBRC正确设置为4,但是字段符号已分配。

我写了一个演示程序来说明这一点。

报告zffs_test。

 类型:开始于ty_table,
          TYPE I,
        ty_table的结尾。

 ty_table的数据gt_table TYPE STANDARD TABLE。

 数据子类型C长度1。

 字段符号: TYPE STANDARD TABLE,
                 TYPE任意,
                 TYPE任意。

 选择开始。

 *将GT_TABLE分配给通用表类型的字段符号
   将gt_table分配到。

 *示例1。  1-回路ITAB。  2- INLINE声明的字段符号。
 *结果:SY-SUBRC =4。未分配字段sybol。 好。
   在gt_table ASSIGNING FIELD-SYMBOL()处循环播放。
   结局。

   subrc = sy-subrc。

   写:"示例1-循环1"。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:'从来没有按预期写过'。
   其他。

     写:'未分配,按预期方式。
   万一。

 *示例2。  1-循环AT 。  2-先前声明的字段符号。
 *结果:SY-SUBRC =4。未分配字段sybol。 好。
   循环分配。
   结局。

   subrc = sy-subrc。

   跳跃。
   写:/"示例2-循环2"。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:'从来没有按预期写过'。
   其他。

     写:'未分配,按预期方式。
   万一。

 *示例3。  1-循环AT 。  2- INLINE声明的字段符号。
 *结果:SY-SUBRC =4。分配了字段sybol。 挪威克朗
   在分配字段符号()上循环。
   结局。

   subrc = sy-subrc。

   跳跃。
   写:/" Example3-Loop 3"。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:"已分配!"。
   万一。

 *示例4。  1-阅读表ITAB。  2- INLINE声明的字段符号。
 *结果:SY-SUBRC =4。未分配字段sybol。 好。
   读取表gt_table ASSIGNING FIELD-SYMBOL()索引1。

   subrc = sy-subrc。

   跳跃。
   写:/'Example4-读1'。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:'从来没有按预期写过'。

   其他。

     写:'未分配,按预期方式。
   万一。

 *示例5。  1-循环AT 。  2-先前声明的字段符号。
 *结果:SY-SUBRC =4。未分配字段sybol。 好。
   读取表分配索引1。

   subrc = sy-subrc。

   跳跃。
   写:/'Example5-Read 2'。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:'从来没有按预期写过'。

   其他。

     写:'未分配,按预期方式。
   万一。

 *示例6。  1-循环AT 。  2-先前声明的字段符号。
 *结果:SY-SUBRC =4。未分配字段sybol。 好。
   读取表分配字段符号()索引1。

   subrc = sy-subrc。

   跳跃。
   写:/'Example6-Read 3'。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:"已分配!"。
   ENDIF。

输出:

在调试器中,您可以看到将分配给内联声明的字段符号时,该字段符号将自动在第一条语句中分配。

文档说:

"如果分配成功,则sy-subrc设置为0; 如果没有,则设置为4。"

是的,那会发生什么。 虽然:

"如果分配不成功,则字段符号将保持其先前状态。 因此仅在动态ASSIGN中评估谓词表达式 IS ASSIGNED是不够的。 sy-subrc也需要检查。"

先前未声明的字段符号的先前状态实际上是未分配的,但是已声明内联声明的字段符号的先前状态。

如果有人对此有所了解,我将不胜感激。


谢谢。

Update1:​​给出更多示例。 输出已给出。

(9.7 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好


我注意到ABAP的一种举动使我感到惊讶,但我对此一无所获。


当我尝试通过分配内联声明字段符号的LOOP或READ访问分配给通用类型标准表类型的字段符号的内部表的表行时,即使 表为空,将(未知)存储区分配给字段符号。


SY-SUBRC正确设置为4,但是字段符号已分配。

我写了一个演示程序来说明这一点。

报告zffs_test。

 类型:开始于ty_table,
          TYPE I,
        ty_table的结尾。

 ty_table的数据gt_table TYPE STANDARD TABLE。

 数据子类型C长度1。

 字段符号: TYPE STANDARD TABLE,
                 TYPE任意,
                 TYPE任意。

 选择开始。

 *将GT_TABLE分配给通用表类型的字段符号
   将gt_table分配到。

 *示例1。  1-回路ITAB。  2- INLINE声明的字段符号。
 *结果:SY-SUBRC =4。未分配字段sybol。 好。
   在gt_table ASSIGNING FIELD-SYMBOL()处循环播放。
   结局。

   subrc = sy-subrc。

   写:"示例1-循环1"。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:'从来没有按预期写过'。
   其他。

     写:'未分配,按预期方式。
   万一。

 *示例2。  1-循环AT 。  2-先前声明的字段符号。
 *结果:SY-SUBRC =4。未分配字段sybol。 好。
   循环分配。
   结局。

   subrc = sy-subrc。

   跳跃。
   写:/"示例2-循环2"。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:'从来没有按预期写过'。
   其他。

     写:'未分配,按预期方式。
   万一。

 *示例3。  1-循环AT 。  2- INLINE声明的字段符号。
 *结果:SY-SUBRC =4。分配了字段sybol。 挪威克朗
   在分配字段符号()上循环。
   结局。

   subrc = sy-subrc。

   跳跃。
   写:/" Example3-Loop 3"。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:"已分配!"。
   万一。

 *示例4。  1-阅读表ITAB。  2- INLINE声明的字段符号。
 *结果:SY-SUBRC =4。未分配字段sybol。 好。
   读取表gt_table ASSIGNING FIELD-SYMBOL()索引1。

   subrc = sy-subrc。

   跳跃。
   写:/'Example4-读1'。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:'从来没有按预期写过'。

   其他。

     写:'未分配,按预期方式。
   万一。

 *示例5。  1-循环AT 。  2-先前声明的字段符号。
 *结果:SY-SUBRC =4。未分配字段sybol。 好。
   读取表分配索引1。

   subrc = sy-subrc。

   跳跃。
   写:/'Example5-Read 2'。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:'从来没有按预期写过'。

   其他。

     写:'未分配,按预期方式。
   万一。

 *示例6。  1-循环AT 。  2-先前声明的字段符号。
 *结果:SY-SUBRC =4。未分配字段sybol。 好。
   读取表分配字段符号()索引1。

   subrc = sy-subrc。

   跳跃。
   写:/'Example6-Read 3'。
   写:/'SY-SUBRC =',subrc NO-GAP,'。'  。

   如果已分配。

     写:"已分配!"。
   ENDIF。

输出:

在调试器中,您可以看到将分配给内联声明的字段符号时,该字段符号将自动在第一条语句中分配。

文档说:

"如果分配成功,则sy-subrc设置为0; 如果没有,则设置为4。"

是的,那会发生什么。 虽然:

"如果分配不成功,则字段符号将保持其先前状态。 因此仅在动态ASSIGN中评估谓词表达式 IS ASSIGNED是不够的。 sy-subrc也需要检查。"

先前未声明的字段符号的先前状态实际上是未分配的,但是已声明内联声明的字段符号的先前状态。

如果有人对此有所了解,我将不胜感激。


谢谢。

Update1:​​给出更多示例。 输出已给出。

(9.7 kB)
付费偷看设置
发送

一周热门 更多>