Definición de una tabla de longitud variable con la cláusula OCCURS DEPENDING

En COBOL, puede usar la sintaxis OCCURS DEPENDING ON para definir una tabla de longitud variable en una declaración de datos. El almacenamiento de una tabla de longitud variable es dinámico, dependiendo del valor de la variable de especificador de longitud. La cantidad de datos pasados también depende del valor de la variable de especificador de longitud: solo se envía o recibe el número de elementos especificados. La variable de especificador de longitud de una tabla de longitud variable debe ser un tipo numérico y su dirección debe coincidir con la dirección de la tabla de longitud variable que controla.

Cuando se importa COBOL en el integrador de transacciones (TI) Project y se especifican tablas de longitud variable como conjuntos de registros, las tablas de longitud variable se convierten automáticamente en matrices u objetos de conjunto de registros cuyo tamaño está limitado por otro parámetro. El especificador de longitud se expone en el lado de Automation como un parámetro y debe establecerse correctamente cuando el parámetro se envía a la aplicación host.

Para indicar manualmente que un parámetro de un método es el especificador de longitud de una matriz, defina primero el parámetro de especificador de longitud y, a continuación, defina la matriz o el parámetro de conjunto de registros:

En la clase de propiedad de parámetro que se va a definir como una matriz ODO, use el Diseñador para seleccionar la propiedad Is Array . Después de seleccionar IsArray , las dimensiones de matriz y Se produce en función de la propiedad estarán disponibles. Defina las dimensiones de la matriz mediante la propiedad Dimensiones de matriz. Asigne el índice de ODO al parámetro definido como la matriz ODO. Seleccione el índice expandiendo la propiedad Se produce en función de.

También puede indicar manualmente que un parámetro de un método es el especificador de longitud de un parámetro de conjunto de registros.

Siga los mismos pasos que se definieron anteriormente; sin embargo, cambie el tipo de datos del parámetro de un tipo de datos simple a un conjunto de registros.

El código COBOL siguiente muestra una tabla de longitud variable:

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).  
  

El siguiente es el método que se crea cuando se importa el COBOL anterior:

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

A continuación se muestra un ejemplo de código® Visual Basic ® Microsoft que llama a un método importado:

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