OCCURS DEPENDING 句を使用して可変長テーブルを定義する

COBOL では、OCCURS DEPENDING ON 構文を使用して、データ宣言で可変長テーブルを定義できます。 可変長テーブルのストレージは、長さ指定子変数の値に応じて動的です。 渡されるデータの量は、length 指定子変数の値にも依存します。指定された要素の数のみが送受信されます。 可変長テーブルの長さ指定子変数は数値型である必要があり、その方向は、制御する可変長テーブルの方向と一致する必要があります。

トランザクション インテグレーター (TI) プロジェクトに COBOL をインポートし、可変長テーブルをレコードセットとして指定すると、可変長テーブルは、別のパラメーターによってサイズが制限されている配列またはレコードセット オブジェクトになります。 長さ指定子はパラメーターとして Automation 側で公開され、パラメーターがホスト アプリケーションに送信されるときに正しく設定する必要があります。

メソッド内のパラメーターが配列の長さ指定子であることを手動で示すには、まず length 指定子パラメーターを定義してから、配列または recordset パラメーターを定義します。

ODO 配列として定義するパラメーター プロパティ クラスで、Designerを使用して Is Array プロパティを選択します。 IsArray を選択すると、プロパティに応じて [配列ディメンション] と [発生] が使用可能になります。 Array Dimensions プロパティを使用して 、配列のディメンションを 定義します。 ODO 配列として定義されているパラメーターに ODO インデックスを割り当てます。 [ Occurs depending on]\(発生する\) プロパティを展開して、インデックスを選択します。

また、メソッド内のパラメーターがレコードセット パラメーターの長さ指定子であることを手動で指定することもできます。

前に定義したのと同じ手順に従います。ただし、パラメーターのデータ型を単純なデータ型からレコードセットに変更します。

次の 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