チュートリアル: COBOLで Webフォームを作成する

このチュートリアルでは、付属する Book プログラムのような既存の COBOL プログラムと連動する Web ページを作成する方法を示します。

この章の内容

概要

このチュートリアルでは、Web ページの作成方法と、この Web ページを既存の COBOL プログラムと相互に動作させる方法を示します。Web ページはマネージ COBOL で生成されます。Web ページは、.NET データ型を COBOL データ形式にマッピングするための中間プログラムを呼び出します。中間プログラムは、ビジネスロジックを実行するための既存の COBOL プログラムを呼び出します。

この Web サイトには、次の3 つのプログラムがあります。

前提条件

このチュートリアルを始める前に、以下の手順に従って WinBook例題の一部として提供されている BookWrapper と LegacyBook プロジェクトをビルドしておく必要があります:

  1. Visual Studioを起動します。
  2. ファイル > 開く > プロジェクト/ソリューション をクリックします。
  3. samplesディレクトリ C:\Users\Public\Documents\Micro Focus\Visual COBOL 2010\Samples の下の \Forms\WinBook ブラウズします。
  4. .sln 拡張子のファイルを選択し案す。
  5. 開く をクリックします。
  6. ソリューションエクスプローラ内で WinBook ソリューションを右クリックし ソリューションのビルド を選択します。

これによって次の二つのバイナリ BookWrapper.dll および LegacyBook.dllbin サブフォルダに作成されます。

Web サイトの作成

最初に、Web サイトを作成します。次の手順を行います。

  1. Visual Studio を起動します。
  2. [ファイル] > [新規作成] > [Web サイト] をクリックして、新規の Web サイトを作成します。
  3. 「インストール済みのテンプレート」ペインで、「COBOL」をクリックします。
  4. 「インストール済みのテンプレート」ペインで、「.NET Framework 4」が選択されていることを確認します。
  5. ASP.NET Web Application」テンプレートを選択します。
  6. 場所」フィールドで、「ファイル システム」を選択し、このチュートリアルを置くディレクトリを参照して、ディレクトリ WebBook を指定します。
  7. [OK] をクリックします。

WebBook Web サイトが作成され、ソリューション エクスプローラに表示されます。この Web サイトの構成は次のとおりです。

ソリューション エクスプローラには、Web サイトがプロジェクトと似たように表示されますが、Web サイトはプロジェクトではありません。Web サイトを簡単にパブリッシュできるようにするためのディレクトリです。詳細は、Visual Studio のヘルプトピック 『.NET開発\Webアプリケーション (ASP.NET) 』などを参照してください。このチュートリアルでは、その他の相違点を示します。次の違いがあります。

フォームのペイントの開始

ここでは、フォームをペイントします。生成されたコードを確認することもできます。フォームのペイントについての基本情報は、『入門書』の『Visual Studio を使用した COBOL プログラム開発 』を参照してください。

  1. ソリューション エクスプローラで、[Default.aspx] を右クリックし、[デザイナの表示] をクリックして、空のフォームを表示します。
  2. フォーム上にラベルを 4 つ、テキストボックスを 3 つ、ボタンを 1 つ作成します。

    Web フォームのレイアウトは、テキストエディタや HTML の場合と同様で、空白文字や改行を使用して行います。

  3. コントロールをダブルクリックしないように注意して、コントロールのプロパティを編集します。ダブルクリックすると、コントロールのイベントが作成されますが、それは次の手順で行います。プロパティを編集して、次の値を設定します。
    コントロールID プロパティテキストプロパティ
    ラベルlabel1在庫番号
    テキストボックスtextBoxStockNo (大文字と小文字を区別します)(空白)
    ラベルlabel2タイトル
    テキストボックスtextBoxTitle (大文字と小文字を区別します)(空白)
    ラベルlabel3価格
    ラベルlabel4 (大文字と小文字を区別します)(空白)
    テキストボックスtextBoxPrice (大文字と小文字を区別します)(空白)
    ボタンbutton1 (大文字と小文字を区別します)検索

    プロパティを表示するには、ラベルを右クリックしてから [プロパティ] をクリックします。該当するプロパティまでスクロールして編集します。

  4. [検索] ボタンのクリックイベントを作成します。イベントを作成するには、ボタンをダブルクリックします。これにより、button1_Click というイベントが作成され、フォーム用に生成されたコードが表示されます。
  5. button1_Click メソッドのコードでは、まだ何も実行されません。手続き部は空です。さらにスクロールして、生成されたコードを確認できます。
  6. フォームは、[ビルド] > [ページのビルド] をクリックして、ビルドすることができます。エラーにはならないはずです。

クリックイベントの処理

次に、ボタンクリックに対応するコードを追加する必要があります。このコードでは、レガシー COBOL プログラムを呼び出して、返された情報をフォームに入力する必要があります。

  1. コードビューで、button1_Click メソッドを検索します。次のように、コードを更新します。
           method-id  button1_Click protected.
           local-storage section.
           01 input-string string.
           01 my-exception type System.Exception.
           procedure division using by value lnkSender as object lnkEvent as type System.EventArgs.
               set input-string to textBoxStockNo::Text
               try
                   set my-book to type BookWrapper.Book::Read(input-string)
                   invoke self::PopulateForm(my-book)
               catch my-exception
                   invoke self::DisplayException(my-exception)
               end-try
           end method.
  2. 一部の語句の下に、赤い波線が引かれます。これらは、バックグラウンドで行われている自動解析で生じた構文エラーを示しています。下線の引かれた語句の上にカーソルを移動すると、エラーについての情報がポップアップで表示されます。ステータスバーには、バックグラウンドの解析エラーの数が表示されます。
  3. 上記のコードで PopulateForm および Display Exception メソッドが起動されます。コードの button1_Click メソッドの後、end object 文の前に、次のメソッドを追加します。
           method-id  PopulateForm final private.
           procedure division using my-book as type BookWrapper.Book.
               if my-book<>null
                   set textBoxStockNo::Text      to my-book::StockNumber
                   set textBoxTitle::Text        to my-book::Title
                   set textBoxPrice::Text        to type System.Convert::ToString(my-book::RetailPrice)
               else
                   set textBoxStockNo::Text      to "****"
                   set textBoxTitle::Text        to "*************************************"
                   set textBoxPrice::Text        to "****"
               end-if
           end method.
    
           method-id DisplayException private.
           procedure division using by value lnkException as type System.Exception.
               set label4::Text to lnkException::Message
               set my-book to null
               invoke self::PopulateForm(my-book)
           end method.
    

レガシーコードとラッパーコードの追加

次に、ビジネスロジックが含まれている既存の COBOL コードを追加して、フォームで使用できるようにする必要があります。このコードは、book.cbl を含む LegacyBook プロジェクトにあります。

さらに、データを .NET 型から COBOL 形式に変換するためのラッパーコードが必要です。Web ページでは .NET データ型が使用されます。このチュートリアルでは、System.String オブジェクトがこれにあたります。Book プログラムは、PIC X や PIC 99V99 などの COBOL 形式を使用します。付属のプログラム BookWrapper.cbl でこの変換が行われるので、このプログラムをソリューションに追加する必要があります。

book.cblBookWrapper.cbl を追加するには、次の手順を行います。

  1. WebBook Web サイトの bin ディレクトリを作成します。bin を作成するには、ソリューション エクスプローラで Web サイトを右クリックして、[ASP.NET フォルダの追加] > [Bin] をクリックします。
  2. 付属の LegacyBookBookWrapper プログラムのプレビルドファイルを追加します。プレビルドファイルを追加するには、ソリューション エクスプローラの [Bin] を右クリックして、[既存項目の追加] をクリックし、Examples¥Visual Studio Integration¥Forms¥WebBook¥bin を参照します。ここにはビルド済みのファイルがあります。.dll ファイルを選択します。アプリケーションをデバッグする場合には、.pdb も選択します。これで、プログラムが Web サイトに追加されます。

レガシーコードへのアクセスの設定

次に、ラッパーコードを呼び出し、my-book に関連する最後の赤い波線を消去するために、フォームにコードを追加する必要があります。

  1. オブジェクトの作業場所節でデータ項目 my-book を次のように宣言します。
           01 my-book   type BookWrapper.Book.

    BookWrapper が宣言されたので、解析エラーがなくなります。エラーがある場合には、Examples¥Visual Studio Integration¥Forms¥WebBook にあるデモンストレーションと比較して、違いを確認します。

  2. Examples¥Visual Studio Integration¥BookData にある bookfile.* データファイルを指す環境変数を設定します。手順は次のとおりです。

    Web.config ファイルで、<configuration/> 行の直後に次のテキストを追加します。

    <!--The following code declares a section group for application configuration -->
      <configSections>
      <sectionGroup name="MicroFocus.COBOL.Application">
        <section name="Switches" type="System.Configuration.NameValueSectionHandler" />
        <section name="Environment" type="System.Configuration.NameValueSectionHandler" />
      </sectionGroup>
      <!--The following code declares a section group for run-time configuration -->
      <sectionGroup name="MicroFocus.COBOL.Runtime">
        <section name="Tunables" type="System.Configuration.NameValueSectionHandler" />
        <section name="Switches" type="System.Configuration.NameValueSectionHandler" />
      </sectionGroup>
    </configSections>
    
  3. Web.config ファイルで、次の構成節を追加します。
    <appSettings />
    <MicroFocus.COBOL.Application>
          <Switches/>
          <Environment>
             <add key="dd_bookfile" value="MyPath\bookfile.dat"/>
          </Environment>
       </MicroFocus.COBOL.Application>
    

アプリケーションの実行

これで、アプリケーションが実行可能な状態になります。

  1. Web サイトをビルドします。
  2. [デバッグ] > [デバッグなしで開始] をクリックします。
  3. 情報を入力し、[検索] ボタンを使用して動作を試験します。在庫番号 1111 と 2222 のデータが検索できます。

サンプルコードの確認

サンプルコードは、本 COBOL 開発システムの Examples¥Visual Studio Integration¥Forms ディレクトリにあります。

Legacy Book プログラム

この book.cbl プログラムは、Micro Focus 製品に数年間添付されている昔からのデモプログラムです。このデモプログラムは、手続き型 COBOL で作成されています。このプログラムによって、書籍レコードを含む索引ファイルを読み書きします。

このソリューションでは、Book デモプログラムを変更しないで、マネージ コードとして再コンパイルします。プログラムを再コンパイルすることにより、クラスとして公開し、そのメインエントリポイントを静的メソッドとして公開します。

このプログラムの連絡節では、データが PIC X などの標準 COBOL 形式で定義されています。そのため、COBOL 以外のクライアントプログラムでは、これらのデータ形式を認識できません。クライアントプログラムと通信するためには、これらの形式を .NET と互換性がある型にマッピングする必要があります。このマッピングは、中間プログラム BookWrapper.cbl によって行われます。

クライアント Web フォーム

クライアント Web フォーム Default.aspx.cbl は、COBOL として生成されます。ユーザはこのフォームにデータを入力し、そこで戻りデータを受け取ります。クライアントフォームでは、次の処理が実行されます。

  1. フォームのテキストボックスから、入力データを System.Strings として抽出します。
  2. BookWrapper を呼び出して、その文字列オブジェクトを渡します。
  3. System.Strings でフォームのテキストボックスにデータを出力します。

Book Wrapper プログラム

BookWrapper.cbl プログラムは、既存の COBOL プログラム book.cbl と Web フォームとの間の中間プログラムとして機能します。この中間プログラムにより、既存の COBOL を変更する必要がなくなります。

ここで重要な点は、複数の言語を使用する場合、互換性がある型を使用することです。Web フォームではデータを .NET 型として格納しますが、Book プログラムではデータを COBOL 形式と見なします。

BookWrapper プログラムの目的は、COBOL の PICTURE を .NET System.Strings にマッピングすることです。BookWrapper プログラムは、Web フォームからデータを System.Strings として受け取り、標準の COBOL データ形式にマッピングしてから既存の Book プログラムに渡します。

BookWrapper プログラムでは、次のように、クラス Book を宣言しています。

class-id. Book as "BookWrapper.Book"

オブジェクトの作業場所節では、コピーファイルを使用してブックレコードのデータ項目を次のように宣言しています。

        object.
        data division.
        working-storage section.
        copy "book-rec-dotnet.cpy" replacing == (prefix) == by == book ==.
    ...

コピーファイル book-rec-dotnet.cpy では、book-details レコードを宣言しています。ここで、book-title と book-stockno を COBOL の Picture 形式で宣言し、プロパティとしても宣言します。したがって、Getter/Setter メソッドを使用してこれらにアクセスできます。コピーファイルには、次の内容が記述されています。

    01 (prefix)-details.
      03 (prefix)-text-details.
    	    05 (prefix)-title  pic x(50) property as "Title".
      ...
      03 (prefix)-stockno pic x(4) property as "StockNumber".

次の get property メソッドでは、book-details レコードへのポインタを受け取ります。

        method-id. get property "BookDetails".
        procedure division returning bookDetailsAddress as pointer. 
            set bookDetailsAddress to address of book-details
            goback.
        end method.

Read メソッドは、次のように静的な節に記述されています。

       method-id Read. 
       local-storage section.
       01 file-status pic xx.
       procedure division using by value stockno-in as string
                          returning      myBook     as Book. 

           set myBook to new  Book()
           set myBook::StockNumber to stockno-in

           call BookLegacy using by value readRecord
                                   by value myBook::BookDetails
                                   by reference file-status       
            
           invoke RaiseExceptionIfError using file-status
           goback.
       end method.

詳細は次のとおりです。