仕入先コードテキストボックスからのフォーカスアウト
次に、仕入先コードテキストボックスからフォーカスアウトした際に、仕入先名をセットする方法に関して説明します。
import mx.data.components.WebServiceConnector; var shiiresakiCdListener:Object = new Object(); shiiresakiCdListener.result = function(evt:Object) { // (1) textboxShiiresakiMei.text = evt.target.results.shiiresaki_mei; }; // (2) var shiiresaki_cdConn:WebServiceConnector = new WebServiceConnector(); shiiresaki_cdConn.addEventListener("result", shiiresakiCdListener); shiiresaki_cdConn.WSDLURL = "http://localhost:3000/mst_shiiresaki_service/wsdl"; shiiresaki_cdConn.operation = "FindByShiiresakiCd"; shiiresakiCdListener.focusOut = function() { trace("今、フォーカスアウトしました。" + textboxShiiresakiCd.text); // (3) shiiresaki_cdConn.params = [textboxShiiresakiCd.text]; shiiresaki_cdConn.trigger(); } textboxShiiresakiCd.addEventListener("focusOut", shiiresakiCdListener);
(2)にて、仕入先コードテキストボックスからフォーカスアウトした際に、呼び出すWebサービスの設定を行っています。
(3)では、引数に仕入先コードを設定し、trigger
にてWebサービスを呼び出しています。
Webサービスを呼び出し結果を受け取った後、(1)で取得した仕入先名を画面上のテキストボックスに設定しています。
品目マスタを登録する方法
画面に入力された情報を品目マスタに登録する方法に関して、説明します。
品目マスタの準備
まず、品目マスタをデータベース上に作成します。
class CreateMstHinmoku < ActiveRecord::Migration def self.up # 品目マスタ create_table :mst_hinmokus do |t| t.column :hinmei , :string, :limit=>64 t.column :zaishitsu, :string, :limit=>64 t.column :kikaku , :string, :limit=>64 t.column :buhin_shikibetsu_id, :integer, :limit=>11 t.column :tehai_kubun_id , :integer, :limit=>11 t.column :zaiko_kubun_id , :integer, :limit=>11 t.column :shikyu_kubun_id , :integer, :limit=>11 t.column :pass_flag , :string , :limit=>1 t.column :tenkai_stop , :string , :limit=>1 t.column :kit_kubun , :string , :limit=>1 t.column :shiiresaki_cd , :string , :limit=>10 t.column :shiiresaki_mei , :string , :limit=>255 t.column :shiire_keiyaku_tanka, :integer, :limit=>11 t.column :keiyaku_date , :datetime t.column :shiire_ruikei , :integer, :limit=>11 end end def self.down drop_table :mst_hinmokus end end
上記のスクリプトを作成し、rake
コマンドにてデータベース上に仕入先マスタを作成します。
rake db:migrate
品目モデルクラスの作成
次に、品目マスタのモデルクラスを作成します。Ruby on Rails 2.0 のActiveRecord
クラスを継承した単純なクラスです。
class MstHinmoku < ActiveRecord::Base end
品目マスタをメンテナンスするWebサービスの作成
次に、品目マスタをメンテナンスするWebサービスを「MstWebServiceGenerator」により生成します。
integer
やdatetim
などのデータ型に対応するため、生成したクラスを修正します。
module XmlrpcStruct class MstHinmoku < ActionWebService::Struct member :id, :integer member :hinmei , :string member :zaishitsu, :string member :kikaku , :string member :buhin_shikibetsu_id, :integer member :tehai_kubun_id , :integer member :zaiko_kubun_id , :integer member :shikyu_kubun_id , :integer member :pass_flag , :string member :tenkai_stop, :string member :kit_kubun , :string member :shiiresaki_cd , :string member :shiiresaki_mei, :string member :shiire_keiyaku_tanka, :integer member :keiyaku_date , :datetime member :shiire_ruikei , :integer end end class MstHinmokuServiceApi < ActionWebService::API::Base api_method :find_all, :returns => [[MstHinmoku]] api_method :create, :expects=>[{:arg_mst_hinmoku=>XmlrpcStruct::MstHinmoku}], :returns=>[:string] api_method :update, :expects=>[{:arg_mst_hinmoku=>XmlrpcStruct::MstHinmoku}], :returns=>[:string] api_method :destroy, :expects=>[{:arg_mst_hinmoku=>XmlrpcStruct::MstHinmoku}], :returns=>[:string] end
データ型の作成
品目マスタの情報をActionWebServiceに対して引数として与えるためには、そのデータ型をActionScriptで用意する必要があります。
class MstHinmoku { public var id:Number; public var hinmei:String; public var zaishitsu:String; public var kikaku:String; public var buhin_shikibetsu_id:Number; public var tehai_kubun_id:Number; public var zaiko_kubun_id:Number; public var shikyu_kubun_id:Number; public var pass_flag:String; public var tenkai_stop:String; public var kit_kubun:String; public var shiiresaki_cd:String; public var shiiresaki_mei:String; public var shiire_keiyaku_tanka:Number; public var keiyaku_date:Date; public var shiire_ruikei:Number; }
ActionScript側のMstHinmoku
とRuby on Rails ActionWebService側のMstHinmoku
で、表3のような対応に基づき暗黙の型変換が行われ、Webサービスに対してデータを渡すことができます。
ActionScript | Ruby on Rails |
Number | integer |
String | string |
Date | datetime |
データ型のインポート方法
作成したデータ型をFlashの画面から利用するために、インポートする必要があります。まず、[挿入]メニューから新規シンボルを選択します。
次に、図9に示される画面で、[名前]に「MstHinmoku」を入力し、[ActionScriptに書き出し]と[最初のフレームに書き出し]にチェックし[OK]ボタンを押下することで、MstHinmoku
のデータ型が使用できるようになります。
ActionWebServiceによる品目マスタの登録
最後に、ActionWebServiceを呼び出して、品目マスタを登録します。
import mx.data.components.WebServiceConnector; var torokuAfterListener:Object = new Object(); // (1) torokuAfterListener.result = function(evt:Object) { trace("登録できました。"); labelMessage.text = evt.target.results; }; // (2) torokuAfterListener.status = function(stat:Object) { if (stat.code == "WebServiceFault"){ trace(stat.data.faultcode); trace(stat.data.faultstring); trace(stat.data.detail); } }; var torokuListener:Object = new Object(); torokuListener.click = function(eventObj:Object) { var hinmoku:MstHinmoku = new MstHinmoku(); // (3) hinmoku.id = 1; hinmoku.hinmei = textboxHinmei.text; hinmoku.zaishitsu = textboxZaishitsu.text; hinmoku.kikaku = textboxKikaku.text; // (4) hinmoku.buhin_shikibetsu_id = comboboxBuhinShikibetsu.selectedItem.data; hinmoku.tehai_kubun_id = comboboxTehaiKubun.selectedItem.data; hinmoku.zaiko_kubun_id = comboboxZaikoKubun.selectedItem.data; hinmoku.shikyu_kubun_id = comboboxShikyuKubun.selectedItem.data; // (5) if (checkboxPassFlag.selected) { hinmoku.pass_flag = "1"; } else { hinmoku.pass_flag = "0"; } if (checkboxTenkaiFlag.selected) { hinmoku.tenkai_stop = "1"; } else { hinmoku.tenkai_stop = "0"; } if (checkboxKitKubun.selected) { hinmoku.kit_kubun = "1"; } else { hinmoku.kit_kubun = "0"; } hinmoku.shiiresaki_cd = textboxShiiresakiCd.text; hinmoku.shiiresaki_mei = textboxShiiresakiMei.text; // (6) if (textboxShiireKeiyakuTanka.text.length > 0) { hinmou.shiire_keiyaku_tanka = parseInt(textboxShiireKeiyakuTanka.text); } else { hinmoku.shiire_keiyaku_tanka = 0; } // (7) hinmoku.keiyaku_date = new Date(); if (textboxShiireKeiyakuDate.text.length == 10) { trace(textboxShiireKeiyakuDate.text.substring(0,4)); trace(textboxShiireKeiyakuDate.text.substring(5,7)); trace(textboxShiireKeiyakuDate.text.substring(8,10)); hinmoku.keiyaku_date.setFullYear(parseInt(textboxShiireKeiyakuDate.text.substring(0,4))); hinmoku.keiyaku_date.setMonth(parseInt(textboxShiireKeiyakuDate.text.substring(5,7))-1); hinmoku.keiyaku_date.setDate(parseInt(textboxShiireKeiyakuDate.text.substring(8,10))); trace(hinmoku.keiyaku_date.getFullYear()); trace(hinmoku.keiyaku_date.getMonth()); trace(hinmoku.keiyaku_date.getDate()); } if (textboxShiireRuikei.text.length > 0) { hinmoku.shiire_ruikei = parseInt(textboxShiireRuikei.text); } else { hinmoku.shiire_ruikei = 0; } // (8) var torokuConn:WebServiceConnector = new WebServiceConnector(); torokuConn.addEventListener("result", torokuAfterListener); torokuConn.addEventListener("status", torokuAfterListener); torokuConn.WSDLURL = "http://localhost:3000/mst_hinmoku_service/wsdl"; torokuConn.operation = "Create"; torokuConn.params = [hinmoku]; trace("これから登録します。"); torokuConn.trigger(); trace("登録後"); }; buttonToroku.addEventListener("click", torokuListener);
(1)にて、Webサービスの呼び出しが成功した場合の処理を記述します。
(2)にて、Webサービスの呼び出しが失敗した場合の処理を記述します。faultcode
およびfaultstring
、detail
により、失敗した原因を判断できます。
(3)以降のコードにて、Webサービスに送るためのデータであるhinmoku
に画面の情報をセットしています。
(4)では、コンボボックスで選択されているデータをselectedItem.data
に取得できるので、その値をセットしています。
(5)では、selected
プロパティによりチェックボックスがチェックされているかどうかを判断できるので、チェックされている場合は1
をセットします。
(6)では、仕入契約単価が整数型なので、テキストボックスの内容をparseInt
により整数へ変換しています。
(7)では、仕入契約日付テキストボックスに「YYYY/MM/DD」のようなデータが入っていると仮定して、テキストボックスの内容を日付型へ変換し、その値をhinmoku.keiyaku_date
にセットしています。
(8)では、Webサービスの引数にMstHinmoku
型のデータをセットし、Webサービスを呼び出すことで、画面上のデータを品目マスタに登録しています。