Definizione di una tabella a lunghezza variabile con la clausola OCCURS DEPENDING

In COBOL è possibile usare la sintassi SI VERIFICA A SECONDA DELLA Sintassi per definire una tabella a lunghezza variabile in una dichiarazione di dati. L'archiviazione per una tabella a lunghezza variabile è dinamica, a seconda del valore nella variabile dell'identificatore di lunghezza. La quantità di dati passata dipende anche dal valore nella variabile dell'identificatore di lunghezza: viene inviato o ricevuto solo il numero di elementi specificati. La variabile dell'identificatore di lunghezza per una tabella a lunghezza variabile deve essere un tipo numerico e la relativa direzione deve corrispondere alla direzione della tabella a lunghezza variabile che controlla.

Quando si importa COBOL in Project TI (Transaction Integrator) e si specificano tabelle a lunghezza variabile come set di recordset, le tabelle a lunghezza variabile diventano automaticamente matrici o oggetti recordset le cui dimensioni sono limitate da un altro parametro. L'identificatore di lunghezza viene esposto sul lato Automazione come parametro e deve essere impostato correttamente quando il parametro viene inviato all'applicazione host.

Per indicare manualmente che un parametro in un metodo è l'identificatore di lunghezza per una matrice, definire prima il parametro dell'identificatore di lunghezza e quindi definire il parametro array o recordset:

Nella classe di proprietà del parametro da definire come matrice ODO, usare il Designer per selezionare la proprietà Is Array. Dopo aver selezionato IsArray , le dimensioni della matrice e si verifica a seconda della proprietà diventano disponibili. Definire le dimensioni della matrice usando la proprietà Array Dimension . Assegnare l'indice ODO al parametro definito come matrice ODO. Selezionare l'indice espandendo la proprietà Si verifica a seconda.

È anche possibile indicare manualmente che un parametro in un metodo è l'identificatore di lunghezza per un parametro recordset.

Seguire la stessa procedura definita in precedenza; tuttavia, modificare il tipo di dati del parametro da un tipo di dati semplice a un recordset.

Il codice COBOL seguente mostra una tabella a lunghezza variabile:

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

Di seguito è riportato il metodo creato quando viene importato il COBOL precedente:

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

Di seguito è riportato un esempio di codice Microsoft® Visual Basic® che chiama un metodo importato:

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