COBOL では、OCCURS DEPENDING ON 構文を使用して、データ宣言で可変長テーブルを定義できます。 可変長テーブルのストレージは、長さ指定子変数の値に応じて動的です。 渡されるデータの量は、長さ指定子変数の値にも依存します。指定された要素の数のみが送受信されます。 可変長テーブルの長さ指定子変数は数値型である必要があり、その方向は、制御する可変長テーブルの方向と一致する必要があります。
COBOL をトランザクション インテグレーター (TI) プロジェクトにインポートし、可変長テーブルをレコードセットとして指定すると、可変長テーブルは、別のパラメーターによってサイズが制限されている配列またはレコードセット オブジェクトになります。 長さ指定子はオートメーション側でパラメーターとして公開され、パラメーターがホスト アプリケーションに送信されるときに正しく設定する必要があります。
メソッドのパラメーターが配列の長さ指定子であることを手動で指定するには、まず長さ指定子パラメーターを定義してから、配列またはレコードセット パラメーターを定義します。
ODO 配列として定義するパラメーター プロパティ クラスで、デザイナーを使用して 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