EGL 源格式的库部件

可以在 EGL 文件中声明库部件,EGL 源格式对该部件作了描述。

以下是库部件的一个示例:
Library CustomerLib3

	// Use declarations
	Use StatusLib;
	
	// Data Declarations
	exceptionId ExceptionId ;
	
	// Retrieve one customer for an email
	//   In: customer, with emailAddress set
	//   Out: customer, status
	Function getCustomerByEmail ( customer CustomerForEmail, status int )
		status = StatusLib.success;
		try
			get customer ;
		onException
			exceptionId = "getCustomerByEmail" ;
			status = sqlCode ;
		end
		commit();
	end	
	
	// Retrieve one customer for a customer ID
	//   In: customer, with customer ID set
	//   Out: customer, status
	Function getCustomerByCustomerId ( customer Customer, status int )
		status = StatusLib.success;
		try
			get customer ;
		onException
			exceptionId = "getCustomerByCusomerId" ;
			status = sqlCode ;
		end
		commit();
	end	
	
	// Retrieve multiple customers for an email
	//   In: startId
	//   Out: customers, status
	Function getCustomersByCustomerId
( startId CustomerId, customers Customer[], status int )
		status = StatusLib.success;
		try
			get customers usingKeys startId ;
		onException
			exceptionId = "getCustomerForEmail" ;
			status = sqlCode ;
		end
		commit();
	end	
	
end

库部件的图如下所示:


库部件的语法图
Library libraryPartName ... end
将部件标识为库部件并指定名称。如果未设置 alias 属性(如后文所述),则生成的库的名称是 libraryPartName

有关其它规则,请参阅命名约定

type basicLibrary, type nativeLibrary
指示库类型:
  • 基本库(类型为 basicLibrary)包含运行时在其它 EGL 逻辑中使用的用 EGL 编写的函数和值;有关详细信息,请参阅类型为 basicLibrary 的库部件
  • 本机库(类型为 nativeLibrary)充当外部 DLL 的接口;有关详细信息,请参阅类型为 nativeLibrary 的库部件

在缺省情况下,该库的类型为 basicLibrary。

libraryProperties
库属性如下所示:
  • alias
  • allowUnqualifiedItemReferences
  • callingConvention(仅在类型为 nativeLibrary 的库中可用)
  • dllName(仅在类型为 nativeLibrary 的库中可用)
  • handleHardIOErrors
  • includeReferencedFunctions
  • localSQLScope
  • messageTablePrefix
  • throwNrfEofExceptions

所有属性都是可选的:

  • alias = "alias" 标识合并到生成的输出的名称中的字符串。如果未设置 alias 属性,则会使用程序部件名。
  • allowUnqualifiedItemReferences = noallowUnqualifiedItemReferences = yes 指定是否允许代码引用结构项但却不包括 container(它是存放结构项的数据表、记录或表单)的名称。例如,请参照以下记录部件:
      Record aRecordPart type basicRecord
        10 myItem01 CHAR(5);
        10 myItem02 CHAR(5);
      end
    以下变量基于该部件:
      myRecord aRecordPart;
    如果接受 allowUnqualifiedItemReferences 的缺省值(no),则在引用 myItem01 时必须指定记录名,如以下赋值所示:
      myValue = myRecord.myItem01;
    然而,如果将属性 allowUnqualifiedItemReferences 设置为 yes,则无需指定记录名:
      myValue = myItem01;

    建议您接受缺省值,这样有助于实现最佳实践。通过指定容器名,可以减少对阅读代码的人以及对 EGL 造成的歧义。

    EGL 使用一组规则来确定变量名或项名所引用的内存区域。有关详细信息,请参阅对变量和常量的引用

  • 在类型为 nativeLibrary 中使用时,callingConvention = I4GL 指定 EGL 运行时在两种代码之间传递数据的方式:
    • 调用库函数的 EGL 代码;以及
    • 要访问的 DLL 中的函数。

    现在对 callingConvention 可用的唯一值是 I4GL。有关其它详细信息,请参阅类型为 nativeLibrary 的库部件

  • 在类型为 nativeLibrary 的库中使用时,dllName 指定 DLL 名称,这是最终名称;在部署时不能覆盖它。如果未对库属性 dllName 指定值,则必须在 Java™ 运行时属性 vgj.defaultI4GLNativeLibrary 中指定 DLL 名称。

    有关其它详细信息,请参阅类型为 nativeLibrary 的库部件

  • handleHardIOErrors = yes, handleHardIOErrors = no 设置系统变量 VGVar.handleHardIOErrors 的缺省值。该变量控制在 try 块中的 I/O 操作发生硬错误后程序是否继续运行。该属性的缺省值为 yes,它将该变量设置为 1。

    有关其它详细信息,请参阅 VGVar.handleHardIOErrors异常处理

  • includeReferencedFunctions = noincludeReferencedFunctions= yes 指示库是否包含既不在库中也不在当前库所访问的库中的每个函数的副本。缺省值为 no,这表示如果将作为此库一部分的所有函数都位于此库中,则可以忽略此属性。

    如果该库正在使用不在库中的共享函数,则仅当将属性 includeReferencedFunctions 设置为 yes 时才有可能进行生成。

  • localSQLScope = yes, localSQLScope = no 指示在程序和 pageHandler 调用期间,SQL 结果集和预编译语句的标识对于库代码是不是局部的(缺省情况下是局部的)。如果接受值 yes,则表示不同程序可独立使用相同的标识,并且使用该库的程序或 pageHandler 可独立地使用在该库中使用的相同标识。

    如果指定 no,则标识在整个运行单元中共享。在调用库中的 SQL 语句时创建的标识在调用该库的其它代码中是可用的,尽管其它代码可使用 localSQLScope = yes 来阻止访问这些标识。而且,该库可以引用在调用程序或 pageHandler 中创建的标识,但仅当与 SQL 有关的语句已经在其它代码中运行并且其它代码没有阻止访问时才会如此。

    共享 SQL 标识的影响如下所示:
    • 可以在一个代码中打开某个结果集并从另一个代码中获取该结果集中的行
    • 可以在一个代码中预编译某个 SQL 语句并且在另一个代码中运行该语句

    在任一情况下,在程序或 pageHandler 访问该库时可用的标识在同一程序或 pageHandler 访问同一个库中的同一函数或另一函数时也是可用的。

  • msgTablePrefix = "prefix" 指定用作消息表的数据表的名称中的第一个到第四个字符。(消息表可供作为库函数输出的表单使用。)名称中的其它字符与 EGL 源格式的 DataTable 部件中列示的其中一个本地语言代码相对应。
  • throwNrfEofExceptions = no, throwNrfEofExceptions = yes 指定软错误是否导致抛出异常。缺省值为 no。有关背景知识信息,请参阅异常处理
useDeclaration
提供对数据表或库的更简便的访问,并且是访问表单组中的表单所需的。有关详细信息,请参阅使用声明
private
指示变量、常量或函数在库外部不可用。如果省略术语 private,则变量、常量或函数都是可用的。

不能对类型为 nativeLibrary 的库中的函数指定 private

dataItemName
数据项的名称。有关命名规则,请参阅命名约定
primitiveType
数据项的基本类型或者(对于数组)数组元素的基本类型。
length
参数的长度或者(对于数组)数组元素的长度。此长度是一个整数,它表示由 dataItemName 或(对于数组)dynamicArrayName 引用的内存区域中的字符或数字的数量。
decimals
对于数字类型,可以指定 decimals,它是用来表示小数点后的位数的整数。最大小数位数是以下两个数字中较小的那一个:18 或声明为 length 的位数。小数点不与数据存储在一起。
"dateTimeMask"
对于 TIMESTAMP 和 INTERVAL 类型,可指定“dateTimeMask”,它会赋予日期时间值中的给定位置特别的意义(如“年份位”)。掩码不会与数据存储在一起。
dataItemPartName
对程序可见的 dataItem 部件的名称。有关可视性的详细信息,请参阅对部件的引用

该部件作为格式模型,如 Typedef 所述。

recordName
记录的名称。有关命名规则,请参阅命名约定
recordPartName
对程序可见的记录部件的名称。有关可视性的详细信息,请参阅对部件的引用

该部件作为格式模型,如 Typedef 所述。

constantName literal
常量的名称和值。值是加引号的字符串或数字。有关命名规则,请参阅命名约定
itemProperty
特定于项的“属性-值”对,如 EGL 属性与覆盖概述中所述。
recordProperty
特定于记录的“属性-值”对。有关可用属性的详细信息,请参阅您感兴趣的记录类型的相关主题。

基本记录不具有属性。

itemName
要覆盖其属性的记录项的名称。请参阅 EGL 属性与覆盖概述
arrayName
记录或数据项的动态或静态数组的名称。如果使用此选项,则右边的其它符号(dataItemPartNameprimitiveType 等等)是指数组的每个元素。
size
数组中的元素数目。如果指定元素数目,则数组是静态的;否则,数组是动态的。
functionPart
一个函数。在函数中,没有任何参数可以具有松散类型。有关详细信息,请参阅 EGL 源格式的函数部件
使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.