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

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

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

メソッドのパラメーターが配列の長さ指定子である手動で指定するには、まず長さ指定子パラメーターを定義してから、配列またはレコードセット パラメーターを定義します。

ODO 配列として定義されるパラメーター プロパティ クラスで、デザイナーを使用して Is Array プロパティを選択 します。 IsArray を選択すると、プロパティに応じて配列ディメンションと Occurs が使用可能になります。 Array Dimensions プロパティを使用して、配列 の次元を定義 します。 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