move

EGL move 语句以下列三种方式中的任何一种复制数据。第一种选择是逐个字节复制数据;第二种选择(称为按名称)将数据从一个结构中的命名字段复制至另一个结构中的同名字段;第三种选择(称为按位置)将一个结构中每个字段的数据复制至另一个结构中处于同等位置的字段。

下列一般规则适用:
  • 如果源值是下列其中之一,则缺省选择是逐个字节复制数据:
    • 基本变量
    • 固定结构中的字段
    • 文字
    • 常量

    否则,缺省选择是按名称复制数据。

  • 对于 move,将检查字段与字段间的兼容性。move 语句截断、填充和类型转换的规则与 assignment 语句相同,但是它们的整体行为不同。
  • 当使用动态数组时,最后一个元素由数组的当前大小确定。move 语句决不会将元素添加至数组;要扩展动态数组,使用特定于数组的函数 appendElement 或 appendAll,如数组中所述。

move 语句的语法图

通过参考下列类别,可以很好地理解该语句:

byName
在指定 byName 时,数据将从源中的每个字段写至目标中的同名字段。操作按照各个字段在源中的顺序进行。

源和目标可为如下所示:

source
下列其中一项:
  • 固定记录的动态数组;但仅当目标不是记录时,该数组才有效
  • 记录
  • 固定记录
  • 带有子结构的结构字段
  • 带有子结构的结构字段数组;但仅当目标不是记录时,此数组才有效
  • dataTable
  • 表单

名称为星号(*)的固定结构字段不是作为源字段提供的,但该字段的子结构中的所有命名字段都可用。

target
下列其中一项:
  • 固定记录的动态数组;但仅当源不是记录时,此数组才有效
  • 记录
  • 固定记录
  • 带有子结构的结构字段
  • 带有子结构的结构字段数组;但仅当源不是记录时,此数组才有效
  • dataTable
  • 表单
示例语句如下所示:
  move myRecord01 to myRecord02 byName;
在下列任何情况下,该操作无效:
  • 源中的两个或多个字段具有相同名称;
  • 目标中的两个或多个字段具有相同名称;
  • 源字段是多维结构字段数组或其容器是数组的一维结构字段数组;或者
  • 目标字段是多维结构字段数组或其容器是数组的一维结构字段数组。
在下列情况下,该操作有效:
  • 在很简单的情况下,源是固定结构但它本身不是数组元素,目标也是一样。下列规则适用:
    • 如果未调用任何数组,则源结构中的每个下级字段的值将复制至目标结构中的同名字段。
    • 如果结构字段数组将复制至结构字段数组,则该操作被视为全部移动
      • 源字段的元素将复制至目标字段的连续元素
      • 如果源数组的元素少于目标数组的元素,则在复制源数组的最后一个元素后处理会停止
  • 在另一情况下,源或目标是记录。源中的字段将被指定给目标中的同名字段。
  • 较复杂的情况用示例介绍。源是包含 10 个固定记录的数组,每个固定记录包括下列结构字段:
      10 empnum  CHAR(3);
      10 empname CHAR(20); 
    目标是包括下列结构字段的固定结构:
      10 empnum CHAR(3)[10];
      10 empname CHAR(20)[10];

    该操作将第一个固定记录中的字段 empnum 的值复制至结构字段数组 empnum 的第一个元素;将第一个固定记录中的字段 empname 的值复制至结构字段数组 empname 的第一个元素;并且对源数组中的每个固定记录执行同样的操作。

    如果源是具有类似如下的子结构的单个固定记录,则会进行等效的操作:
      10 mySubStructure[10]
        15 empnum  CHAR(3);
        15 empname CHAR(20);    
  • 最后,考虑源是包括下列结构字段的固定记录的情况:
      10 empnum  CHAR(3);
      10 empname CHAR(20)[10]; 
    目标是具有以下子结构的表单、固定记录或结构字段:
      10 empnum char(3)[10];
      10 empname char(20);

    将字段 empnum 的值从源复制至目标中的 empnum 的第一个元素;将 empname 的第一个元素的值从源复制至目标中的字段 empname。

byPosition
byPosition 的用途是将一个结构中每个字段的数据复制至另一个结构中同等位置的字段。

源和目标可为如下所示:

source
下列其中一项:
  • 固定记录的动态数组;但仅当目标不是记录时,该数组才有效
  • 记录
  • 固定记录
  • 带有子结构的结构字段
  • 带有子结构的结构字段数组;但仅当目标不是记录时,此数组才有效
  • dataTable
  • 表单
target
下列其中一项:
  • 固定记录的动态数组;但仅当源不是记录时,此数组才有效
  • 记录
  • 固定记录
  • 带有子结构的结构字段
  • 带有子结构的结构字段数组;但仅当源不是记录时,此数组才有效
  • dataTable
  • 表单

在记录与固定结构间移动数据时,只考虑固定结构的顶层字段。在两个固定结构间移动数据时,只考虑每个结构的最底层(叶)字段。

如果源或目标字段是多维结构字段数组或其容器是数组的一维结构字段数组,则该操作无效。

在下列情况下,该操作有效:
  • 在很简单的情况下,源是固定结构但它本身不是数组元素,目标也是一样。下列规则适用:
    • 如果未调用任何数组,则源结构中的每个叶字段的值将复制至目标结构中相应位置的叶字段。
    • 如果结构字段数组将复制至结构字段数组,则该操作被视为全部移动
      • 源字段的元素将复制至目标字段的连续元素
      • 如果源数组的元素少于目标数组的元素,则在复制源数组的最后一个元素后处理会停止
  • 在另一情况下,源或目标是记录。源的顶层或叶字段(根据源类型)将指定给目标中的顶层或叶字段(根据目标类型)。
  • 较复杂的情况用示例介绍。源是包含 10 个固定记录的数组,每个固定记录包括下列结构字段:
      10 empnum  CHAR(3);
      10 empname CHAR(20); 
    目标是包括下列结构字段的固定结构:
      10 empnum CHAR(3)[10];
      10 empname CHAR(20)[10];

    该操作将第一个固定记录中的字段 empnum 的值复制至结构字段数组 empnum 的第一个元素;将第一个固定记录中的字段 empname 的值复制至结构字段数组 empname 的第一个元素;并且对源数组中的每个固定记录执行同样的操作。

    如果源是具有类似如下的子结构的单个固定记录,则会进行等效的操作:
      10 mySubStructure[10]
        15 empnum  CHAR(3);
        15 empname CHAR(20);    
  • 最后,考虑源是包括下列结构字段的固定记录的情况:
      10 empnum  CHAR(3);
      10 empname CHAR(20)[10]; 
    目标是具有以下子结构的表单、固定记录或结构字段:
      10 empnum char(3)[10];
      10 empname char(20);

    将字段 empnum 的值从源复制至目标中的 empnum 的第一个元素;将 empname 的第一个元素的值从源复制至目标中的字段 empname。

for all
for all 的用途是对目标数组中的所有元素赋值。

源和目标可为如下所示:

source
下列其中一项:
  • 记录、固定记录或基本变量的动态数组
  • 记录
  • 固定记录
  • 带有子结构或不带子结构的结构字段
  • 带有子结构或不带子结构的结构字段数组
  • 基本变量
  • 文字或常量
target
下列其中一项:
  • 记录、固定记录或基本变量的动态数组
  • 带有子结构或不带子结构的结构字段数组
  • 动态数组或结构字段数组的元素

此情况下的 move 语句相当于多个 assignment 语句(每个目标数组元素一个赋值语句),如果尝试赋值无效,则可能会发生错误。有关有效性的详细信息,请参阅赋值

如果源或目标元素具有固定结构,则 move 语句会将该结构视作类型为 CHAR 的字段,除非结构的顶层指定了另一基本类型。在使用 for all 时,move 语句不考虑子结构。

如果源是数组的元素,则源将被视作一个数组,其中的指定元素是第一个元素,先前的元素将被忽略。

如果源是数组或数组的元素,则源数组的每个连续元素将复制至目标数组中按顺序进行的下一个元素。目标数组或源数组可能较长,在另一数组中具有匹配元素的最后一个元素中的数据复制完毕后,操作就结束了。

如果源既不是数组也不是数组元素,则该操作会使用源值来初始化目标数组的每个元素。

for count
for count 的用途是对目标数组中的元素的顺序子集赋值。示例如下所示:
  • 下面的语句将“abc”移至目标中的元素 7、8 和 9。
      move "abc" to target[7] for 3
  • 下面的语句将元素 2、3 和 4 从源移至目标中的元素 7、8 和 9。
      move source[2] to target[7] for 3

在下列情况下,该操作有效:

  • 如果源既不是数组也不是数组元素,则该操作会使用源值来初始化目标数组的元素。
  • 如果源是数组,则该数组的第一个元素将是要复制的一组元素中的第一项。如果源是数组的元素,则该元素将是要复制的一组元素中的第一项。
  • 如果目标是数组,则该数组的第一个元素将是要接收数据的一组元素中的第一项。如果目标是数组的元素,则该元素将是要接收数据的一组元素中的第一项。
count 值指示要接收数据的目标元素的数目。该值可以是下列其中任何一项:
  • 整数文字
  • 解析为整数的变量
  • 数字表达式,但并非函数调用

move 语句相当于多个 assignment 语句(每个目标数组元素一个赋值语句),如果尝试赋值无效,则可能会发生错误。有关有效性的详细信息,请参阅赋值

如果源或目标元素具有内部结构,则 move 语句会将该结构视作类型为 CHAR 的字段,除非该结构的顶层指定了另一基本类型。在使用 for count 时,move 语句不考虑子结构。

当源和目标都是数组时,其中一个数组可能较长,当下面两个事件中的任何一个事件发生之后,操作就会结束:
  • 在请求执行该操作的最后元素之间复制了数据;或者
  • 在另一数组中具有匹配元素的最后一个元素中的数据复制完毕。
如果源不是数组,则下面两个事件中的任何一个事件发生之后,操作就会结束:
  • 数据被复制至请求执行该操作的最后一个元素;或者
  • 数据被复制至数组中的最后一个元素。

如果源是记录数组(或数组元素),则目标必须是记录数组。如果源是基本变量数组(或数组元素),则目标必须是基本变量数组或结构字段数组。如果源是结构字段数组(或数组元素),则目标必须是基本变量数组或结构字段数组。

相关参考
数组
赋值

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.