用 OCCURS DEPENDING 子句定义不定长表

在 COBOL 中,可以使用 OCCURS DEPENDING ON 语法在数据声明中定义可变长度表。 可变长度表的存储是动态的,具体取决于长度说明符变量中的值。 传递的数据量还取决于长度说明符变量中的值:仅发送或接收指定的元素数。 可变长度表的长度说明符变量必须是数值类型,其方向必须与它所控制的可变长度表的方向匹配。

将 COBOL 导入事务集成商 (TI) Project,并将可变长度表指定为记录集时,可变长度表将自动成为大小受另一个参数限制的数组或记录集对象。 长度说明符作为参数在自动化端公开,在将参数发送到主机应用程序时必须正确设置。

若要手动指示方法中的参数是数组的长度说明符,请首先定义长度说明符参数,然后定义数组或记录集参数:

在要定义为 ODO 数组的参数属性类中,使用 Designer 选择 Is Array 属性。 选择 IsArray 后, “数组维度 ”和 “发生取决于” 属性变为可用。 使用 Array Dimensions 属性定义数组的维度 。 将 ODO 索引分配给定义为 ODO 数组的参数。 通过展开属性“ 发生取决于”来选择索引。

还可以手动指示方法中的参数是记录集参数的长度说明符。

按照前面定义的相同步骤操作;但是,请将 参数的数据类型从简单数据类型更改为记录集。

以下 COBOL 代码显示了一个长度可变的表:

01 CUSTOMER-DATA.  
   05 CUSTOMER-NUMBER                 PIC 9(9).  
   05 LAST-NAME                       PIC X(20).  
   05 FIRST-NAME                      PIC X(20).  
   05 INVOICE-COUNT                   PIC 9(7) COMP-3.  
   05 INVOICES OCCURS 50 TIMES DEPENDING ON INVOICE-COUNT.  
      10 INVOICE-NUMBER               PIC 9(10).  
      10 INVOICE-DATE                 PIC 9(7) COMP-3.  
      10 INVOICE-AMOUNT               PIC S9(13)V9(2) COMP-3.  
      10 INVOICE-DESCRIPTION          PIC X(40).  
  

下面是导入上一个 COBOL 时创建的方法:

SendInvoices(lCustomerNo As Long, strLastName As String, strFirstName As String _  
    , lcInvoices As Long) As Object  
  

下面是调用导入方法的 Microsoft® Visual Basic® 代码示例:

Dim objCustomer As Object   'Uses late binding  
Dim objInvoices As ADODB.Recordset  
Dim lCustomerNumber As Long  
Dim iRow As Integer  
Dim iCol As Integer  
Dim strLastName As String  
Dim strFirstName As String  
  
'create an instance of the invoicing object  
On Error GoTo ErrorHandler1  
Set objCustomer = CreateObject("Customer.Invoicing.1")  
  
lCustomerNumber = CLng(txtCustomerNumber)  
  
'invoke the GetInvoices method  
On Error GoTo ErrorHandler2  
Set objInvoices = objCustomer.GetInvoices(lCustomerNumber _  
    , strLastName, strFirstName)  
'  
' Transfer the Recordset data to a variant array in a single operation.  
' This is efficient, but may not be suitable for larger Recordsets.  
'  
Dim Data As Variant  
  
Data = objInvoices.GetRows  
grdInvoices.Rows = UBound(Data, 2) + 1  
grdInvoices.Cols = UBound(Data, 1) + 1