このチュートリアルでは、Web ページの作成方法と、この Web ページを既存の COBOL プログラムと相互に動作させる方法を示します。Web ページはマネージ COBOL で生成されます。Web ページは、.NET データ型を COBOL データ形式にマッピングするための中間プログラムを呼び出します。中間プログラムは、ビジネス ロジックを実行するための既存の COBOL プログラムを呼び出します。
この Web サイトには、次の 3 つのプログラムがあります。
このチュートリアルの前提条件として、次のように WinBook サンプルの一部である BookWrapper プロジェクトと LegacyBook プロジェクトをビルドしておく必要があります。
ビルドにより、WinBook ソリューションの bin サブフォルダーに BookWrapper.dll および LegacyBook.dll という 2 つのバイナリが作成されます。
WebBook Web サイトが作成され、ソリューション エクスプローラーに表示されます。この Web サイトの構成は次のとおりです。
ソリューション エクスプローラーには、Web サイトがプロジェクトと同様に表示されますが、Web サイトはプロジェクトではありません。Web サイトを簡単にパブリッシュできるようにするためのディレクトリです。詳細は、Visual Studio のヘルプ トピック「.NET開発\Webアプリケーション (ASP.NET)」などを参照してください。このチュートリアルでは、その他の相違点を示します。次の違いがあります。
ここでは、フォームをペイントします。生成されたコードを確認することもできます。フォームのペイントの基本情報については、「チュートリアル:.NET マネージCOBOLの開発」を参照してください。
プロパティを表示するには、ラベルをクリックしてから [プロパティ] ペインを表示します。該当するプロパティまでスクロールして編集します。
次に、ボタン クリックに対応するコードを追加する必要があります。このコードでは、レガシー COBOL プログラムを呼び出して、返された情報をフォームに入力する必要があります。
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.
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 でこの変換が行われるので、このプログラムをソリューションに追加する必要があります。
次に、ラッパー コードを呼び出し、my-book に関連する最後の赤い波線を消去するために、フォームにコードを追加する必要があります。
01 my-book type BookWrapper.Book.
<!--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>
Web.config ファイルで、</configSections> 行の直後に次のテキストを追加します。
<appSettings /> <MicroFocus.COBOL.Application> <Switches/> <Environment> <add key="dd_bookfile" value="MyPath\bookfile.dat"/> </Environment> </MicroFocus.COBOL.Application>
MyPath は、サンプル内の \Forms\WinBook\WinFormBook\bin\Debug サブフォルダーにあるデータ ファイル bookfile.dat へのフル パスです。
この book.cbl プログラムは、Micro Focus 製品に長らく同梱されているデモ プログラムです。このデモ プログラムは、手続き型 COBOL で作成されています。このプログラムによって、ブック レコードを含む索引付きファイルを読み書きします。
このソリューションでは、Book デモ プログラムを変更しないで、マネージ コードとして再コンパイルします。プログラムを再コンパイルすることにより、クラスとして公開し、そのメイン エントリ ポイントを静的メソッドとして公開します。
このプログラムの連絡節では、データが PIC X などの標準 COBOL 形式で定義されています。そのため、COBOL 以外のクライアント プログラムでは、これらのデータ形式を認識できません。クライアント プログラムと通信するためには、これらの形式を .NET と互換性がある型にマッピングする必要があります。このマッピングは、中間プログラム BookWrapper.cbl によって行われます。
クライアント Web フォーム Default.aspx.cbl は、COBOL として生成されます。ユーザーはこのフォームにデータを入力し、そこで戻りデータを受け取ります。クライアント フォームでは、次の処理が実行されます。
BookWrapper.cbl プログラムは、既存の COBOL プログラム book.cbl と Web フォームとの間の中間プログラムとして機能します。この中間プログラムにより、既存の COBOL を変更する必要がなくなります。
ここで重要な点は、複数の言語を使用する場合、互換性がある型を使用することです。Web フォームではデータを .NET 型として格納しますが、Book プログラムではデータを COBOL 形式と見なします。
BookWrapper プログラムの目的は、COBOL の PICTURE を .NET System.Strings にマッピングすることです。このプログラムは、Web フォームからデータを System.Strings として受け取り、標準の COBOL データ形式にマッピングしてから既存の Book プログラムに渡します。
作業場所節では、コピーブックを使用してブック レコードのデータ項目を次のように宣言しています。
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".
次の property メソッドでは、book-details レコードへのポインターを受け取ります。
property-id BookDetails pointer. getter. set property-value to address of book-details end property.
method-id Read static. local-storage section. 01 file-status pic xx. procedure division using by value stockno-in as string returning myBook as type BookWrapper.Book. set myBook to new BookWrapper.Book() set myBook::StockNumber to stockno-in call "BookLegacy" using by value readRecord by value myBook::BookDetails by reference file-status invoke self:RaiseExceptionIfError(file-status) goback. end method.
procedure division using ...
クライアント フォームから渡される、.NET の System.String である stockno-in が記述されています。返される Book クラスのインスタンスも記述されています。BookWrapper.cbl では、新規の .NET 型である Book が定義されています。Book は、任意の .NET 言語で書かれたプログラムで使用できます。
set myBook to new BookWrapper.Book()
set mybook::StockNumber
.NET の System.String (stockno-in) からデータを受け取り、myBook の StockNumber プロパティとして格納します。このプロパティは、コピーブックで Picture 文字列として宣言されており、データは標準の COBOL データ形式として book-stockno に格納されます。COBOL コンパイラは、データを .NET 文字列から COBOL の USAGE DISPLAY 項目 (pic x) に暗黙的に変換します。
call BookLegacy using ...
レガシー プログラム book.cbl を呼び出します。book.cbl プログラムに、myBook の「BookDetails」プロパティを渡します。BookWrapper.cbl のコードを見ると、BookDetails は book-rec-net.cpy で定義された BookRecord 構造体へのポインターを渡すことがわかります。この構造体は古い book-rec.cpy の構造体と一致します。したがって、従来の Book プログラムが見るのは、参照によって渡されるブック レコードです。これは想定通りの動作です。Book は、このレコードから在庫番号を読み取って、索引付きファイルから対象のレコードを読み取り、このレコードの他のフィールドにそのデータを書き込みます。
invoke self:RaiseExceptionIfError(file-status)
ファイルの読み取りで返されたファイルのステータスを確認します。エラーがあった場合には、.NET 例外が発生します。例外は、エラー状態を通知するための標準の .NET メカニズムです。