EGL 中的赋值兼容性

赋值兼容性规则(如后所述)在下列情况下适用:
赋值兼容性基于以下类型划分:
赋值兼容性规则如下所示:

在数字类型之间赋值

可以将任何数字类型(包括 NUMC 和 PACF)的值赋予具有任何数字类型和大小的字段,并且 EGL 会执行必需的转换来以目标格式保留数据。

根据需要添加或截断无意义的零。值的整数部分中的开头的零是没有意义的,就像值的小数部分中的结尾数字。

对于任何数字类型,可以使用系统变量 sysVar.overflowIndicator 来测试赋值或算术计算是否导致了算术溢出,并且可以设置系统变量 VGVar.handleOverflow 来指定此类溢出的后果。

如果发生了算术溢出,则目标字段中的值不会更改。如果未发生算术溢出,则根据目标字段的声明来调整赋予目标字段的值。

假定正在将类型为 NUM 的字段复制至另一个字段并且源字段的运行时值为 108.314:
  • 如果目标字段允许 7 位数并且有 1 位为小数,则目标字段接收值 000108.3,且不会检测到数字溢出。(不会将小数值中的精度丢失认为是溢出。)
  • 如果目标字段允许 4 位数并且有 2 位为小数,则会检测到数字溢出并且目标字段中的值不会更改

对定点类型的字段指定浮点值(类型 FLOAT 或 SMALLFLOAT)时,必要时目标值会被截断。如果源值为 108.357 并且定点目标有一个小数位(如目标接收到 108.3),将出现这种情况。

其它交叉类型赋值

有关其它交叉类型赋值的详细信息如下所示:
  • 仅当源声明未包含小数位时,将类型为 NUM 的值赋予类型为 CHAR 的目标才有效。此运算等同于 CHAR 至 CHAR 的赋值。
    例如,如果源长度为 4 并且值为 21,则其内容等同于“0021”,并且长度不匹配不会导致错误状态:
    • 如果目标的长度为 5,则该值是作为“0021 ”(在右边添加了一个单字节空格)存储的
    • 如果目标的长度为 3,则该值是作为“002”(在右边截断了一位)存储的

    如果类型为 NUM 的值是负数并且被赋予类型为 CHAR 的值,则复制到字段中的最后一个字节是不可打印字符。

  • 仅在下列情况下,将类型为 CHAR 的值赋予类型为 NUM 的目标才有效:
    • 源(字段或文本表达式)包含数字,并且未包含其它字符
    • 目标声明没有小数位

    此运算等同于 NUM 至 NUM 的赋值。

    例如,如果源长度为 4 并且值为“0021”,则内容等同于数字 21,下列示例显示了长度不匹配的结果:
    • 如果目标的长度为 5,则该值是作为 00021(在左边填充了数字零)存储的
    • 如果目标的长度为 3,则该值是作为 021(截断了非有效数字)存储的
    • 如果目标的长度为 1,则该值将存储为 1
  • 可以通过两个步骤来完成从类型为 NUMC 的值到类型为 CHAR 的目标的赋值,如果值为正数,则会除去符号:
    1. 将 NUMC 值赋予类型为 NUM 的目标
    2. 将 NUM 值赋予类型为 CHAR 的目标

    如果类型为 NUMC 的目标的值是负数,则复制到类型为 CHAR 的目标中的最后一个字节是不可打印字符。

  • 仅当源中的字符位于十六进制数字(0-9、A-F 和 a-f)范围内时,将类型为 CHAR 的值赋予类型为HEX 的目标才有效。
  • 将类型为 HEX 的值赋予类型为 CHAR 的目标会将数字和大写字母(A-F)存储在目标中。
  • 将类型为 MONEY 的值赋予类型为 CHAR 的目标是无效的。将 MONEY 转换为 CHAR 的最好办法是使用系统函数 strLib.formatNumber
  • 仅当源值是符合掩码 yyyyMMdd 的有效日期时,将类型为 NUM 或 CHAR 的值赋予类型为 DATE 的目标才有效,有关详细信息,请参阅主题 DATE
  • 仅当源值是符合掩码 hhmmss 的有效时间时,将类型为 NUM 或 CHAR 的值赋予类型为 TIME 的目标才有效,有关详细信息,请参阅主题 TIME
  • 仅当源值是符合 TIMESTAMP 字段的掩码的有效时间戳记时,将类型为 CHAR 的值赋予类型为 TIMESTAMP 的目标才有效。下面是一个示例:
       // NOT valid because February 30 is not a valid date
       myTS timestamp("yyyyMMdd"); 
       myTS = "20050230";
    如果完整掩码的开头缺少字符(例如,如果掩码为“dd”),则 EGL 假定高级字符(在此情况下为“yyyyMM”)表示当前时刻以符合机器时钟。下列语句导致二月份出现运行时错误:
       // NOT valid if run in February
       myTS timestamp("dd"); 
       myTS = "30";
  • 将类型为 TIME 或 DATE 的值赋予类型为 NUM 的目标相当于将类型为 NUM 的值赋予类型为 NUM 的目标。
  • 将类型为 TIME、DATE 或 TIMESTAMP 的值赋予类型为 CHAR 的目标相当于将类型为 CHAR 的值赋予类型为 CHAR 的目标。

字符类型的填充和截断

如果目标具有非 STRING 字符类型(包括 DBCHAR 和 HEX),并具有多于存储源值所需的空间,则 EGL 会在右边填充数据:
  • 使用单字节空格来填充类型为 CHAR 或 MBCHAR 的目标
  • 使用双字节空格来填充类型为 DBCHAR 的目标
  • 使用 Unicode 双字节空格来填充类型为 UNICODE 的目标
  • 使用二进制零来填充类型为 HEX 的目标,例如,这表示源值“0A”在双字节目标中将存储为“0A00”而不是存储为“000A”
如果字符类型的目标空间不足以存储源值,则 EGL 会截断右边的值。不会发出错误信号。下列情形下可能会发生特殊情况:
  • 运行时平台支持 EBCDIC 字符集
  • 赋值语句将类型为 MBCHAR 的文字或类型为 MBCHAR 的项复制至类型为 MBCHAR 的较短项
  • 逐字节截断将会除去最后的 Shift-in 字符或分割 DBCHAR 字符

在这种情况下,EGL 会按需要截断字符以确保目标项包含类型为 MBCHAR 的有效字符串,然后添加结束单字节空格(如果必要的话)。

时间戳记之间的赋值

如果将类型为 TIMESTAMP 的项赋予另一个类型为 TIMESTAMP 的字段,则下列规则适用:
  • 如果源字段的掩码缺少目标字段所需的相对高级的条目,将在赋值时根据机器上的时钟指定这些目标条目,如下列示例所示:
    •   sourceTimeStamp timestamp ("MMdd");
      	 targetTimeStamp timestamp ("yyyyMMdd");
      	
      	 sourceTimeStamp = "1201";
      
        // if this code runs in 2004, the next statement
        // assigns 20041201 to targetTimeStamp
      	 targetTimeStamp = sourceTimeStamp; 
    •   sourceTimeStamp02 timestamp ("ssff");
        targetTimeStamp02 timestamp ("mmssff");
      	
      	 sourceTimeStamp02 = "3201";
      
        // the next assignment includes the minute
        // that is current when the assignment statement runs
        targetTimeStamp02 = sourceTimeStamp02;
    • 如果源项的掩码缺少目标字段所需的相对低级的条目,将对这些目标条目指定最低有效值,如下列示例所示:
      • sourceTimeStamp timestamp ("yyyyMM");
        targetTimeStamp timestamp ("yyyyMMdd");
        
        sourceTimeStamp = "200412";
        
        // regardless of the day, the next statement
        // assigns 20041201 to targetTimeStamp
        targetTimeStamp = sourceTimeStamp; 
      • sourceTimeStamp02 timestamp ("hh");
        targetTimeStamp02 timestamp ("hhmm");
        
        sourceTimeStamp02 = "11";
        
        // regardless of the minute, the next statement
        // assigns 1100 to targetTimeStamp02
        targetTimeStamp02 = sourceTimeStamp02;

赋值给具有子结构的字段或从具有子结构的字段进行赋值

可以将具有子结构的字段赋予不具有子结构的字段,反之亦然,并且可以在两个具有子结构的字段之间进行赋值。例如,假定名为 myNummyRecord 的变量基于下列部件:

  DataItem myNumPart
    NUM(12)
  end
    
  Record myRecordPart type basicRecord
    10 topMost CHAR(4);
      20 next01 HEX(4);
      20 next02 HEX(4);
  end
    

在数学系统变量的外部,将类型为 HEX 的值赋予类型为 NUM 的项无效;但由于 topMost 的类型为 CHAR,所以格式为 myNum = topMost 的赋值有效。一般来说,赋值语句中的字段的基本类型控制赋值,并且不考虑下级项的基本类型。

缺省情况下,具有子结构的项的基本类型为 CHAR。如果将数据赋予具有子结构的字段或从具有子结构的字段进行数据赋值,并且在声明时未指定另一基本类型,则先前对类型为 CHAR 的字段描述的规则在赋值期间生效。

固定记录的赋值

一条固定记录至另一条固定记录的赋值等同于将一个类型为 CHAR 的具有子结构的项赋予另一个类型为 CHAR 的具有子结构的项。长度不匹配会导致在接收到的值右边添加单字节空格或从接收到的值右边除去单字节字符。赋值不考虑下级结构字段的基本类型。

存在以下例外:
  • 可以将记录的内容赋予记录,或赋予类型为 CHAR、HEX 或 MBCHAR 的字段,但是不能赋予任何其它类型的字段
  • 记录可以从记录中、从字符串文字中或从 CHAR、HEX 或 MBCHAR 类型的字段中接收数据,但是不能从数字文字中或从除 CHAR、HEX 或 MBCHAR 以外的类型的字段中接收数据

最后,如果将 SQL 记录赋予具有另一类型的记录或者将具有另一类型的记录赋予 SQL 记录,则必须确保非 SQL 记录有空间来存放每个结构字段前面的四字节区域。

相关概念
PageHandler

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