ColdFusionカフェテリア
SAMURAIZ

 

サンプルシステムを作ってみましょう3

作成日: 2010年1月15日
作成者:ハイミン・エンタープライズ(株) 千葉 博胤
佐藤 弘一
最終更新日: 2010年1月15日

サンプルシステムを作ってみましょう3

 前回の第6回記事にて、プロジェクトの登録および、検索、修正機能を作りました。プロジェクトの中には様々な工程があります。今回は、その工程の情報を登録し、修正・削除する機能を作りたいと思います。
第6回で構築したプロジェクト登録・検索・修正機能と、今回の工程の登録・検索・修正機能は、基本的に同じ仕組みです。まったく同じ仕組みではつまらないので、検索結果の一覧を今回はFlashベースで作成してみました(前回はhtmlベース)。また、前回と重複するような説明は割愛いたします。

 

■コンポーネント

それでは、今回もまずはデータベースとの連携を行うcfc(ColdFusion Component)からプログラミングしていきましょう。
今回作成するのは、以下の6つです。
・工程一覧取得(getProcessList)
・工程情報取得(getProcess)
・プロジェクト情報取得(getProjectInCode)
・工程登録(insProcess)
・工程更新(updProcess)
・工程削除(delProcess)

 

[ processmng.cfc - getProcessList ](工程一覧取)
プロジェクトの検索後、工程一覧が表示されますが、その画面に表示する工程情報を取得します。
ごく単純なselect文です。プロジェクトコードを引数に、テーブルT_PROCESSから情報を取得します。
 
[ processmng.cfc - getProcess ](工程情報取得)
工程の変更画面に表示する工程情報を取得します。
ごく単純なselect文です。プロジェクトコード、工程コード、工程SEQを引数に、テーブルT_PROCESSから情報を取得します。
 
[ processmng.cfc - getProjectInCode ](プロジェクト情報取得)
工程一覧画面、工程登録・変更画面に表示するプロジェクト情報を取得します。
こちらも非常に単純なselect文です。プロジェクトコードを引数に、テーブルT_PROJECTから情報を取得します。
 
[ processmng.cfc - insProcess ](工程登録)
工程登録画面から入力された工程情報をデータベースに追加します。
こちらはちょっと注意が必要なので、コードで解説します。
テーブルT_PROCESSにデータをInsertするのですが、T_PROCESSには、PROCESS_SEQ(工程SEQ)というシーケンス番号を工程ごとに持っています。ですので、データをInsertする前に、T_PROCESSからプロジェクトコード、工程コードをキーに最新のシーケンス番号を取得します。
getPseqでテーブルT_PROCESSからPROCESS_SEQのMAX値を取得し、その取得値に+1してPROCESS_SEQを求めています。

<cffunction name="insProcess" access="public" output="false" returntype="void" >
    <cfargument name="project_cd" required="yes" type="string">
 
                    (中略)
 
    <cfquery name="getPseq" datasource="#Application.dsname#">
        SELECT IFNULL(MAX(CAST(process_seq AS signed)),0) AS SEQ
        FROM T_PROCESS
        WHERE PROJECT_CD = '#Arguments.project_cd#' AND
            PROCESS_CD = '#Arguments.process_cd#'

    </cfquery>
 
    <cfset Variables.newProcess_seq = getPseq.SEQ + 1>
 
    <cfquery name="qInsProcess" datasource="#Application.dsname#">
        Insert文
    </cfquery>
 
</cffunction>

 

[ processmng.cfc - updProcess ](工程更新)
画面から入力された工程情報をデータベースに更新します。
こちらも解説を入れます。
このケースでは、processmng.cfc内のupdProcessから、同じprocessmng.cfc内の別のファンクションgetProcessを呼んでいます。
通常、cfmファイルからcfcを呼ぶときは、以下のように、<cfobject>でコンポーネントのインスタンスを作成し、<cfinvoke>で実行します。

<cfobject component="pjmng.cmp.processmng" name="objProcessmng">
<cfinvoke component="#objProcessmng#" method="getProcess"
                returnvariable="retProcess">
 
                    (中略)
 
<cfinvoke>
 

ですが、今回は、同じcfc内にある別のファンクションを呼ぶので、
<cfobject>でインスタンスを作成する必要はありません(自分自身なので)。
そして、<cfinvoke>でcomponent属性にてそのインスタンスを指定する必要もありません。
記述は以下のようになります。

<cfinvoke method="getProcess" returnvariable="retProcess">
 
                    (中略)
 
<cfinvoke>

 
[ processmng.cfc - delProcess ](工程削除)
画面から選択された工程情報をデータベースから削除します。
プロジェクトコード、工程コード、工程SEQをキーにデータを物理削除します。

 

■工程登録

工程登録 - プロジェクト検索画面:[ processsearch01.cfm ]

工程の登録や変更・削除を行う前に、まずはどのプロジェクトの作業を行うかを決めなければいけません。プロジェクトの修正機能でも使用した、プロジェクト検索機能をここでも使います。
プロジェクト検索機能は、第6回記事で共通部品として作成しました。cmn_search.cfmですね。processsearch01.cfmでは、この共通部品をインクルードするのみです。そして、検索結果をprocesssearch02.cfmへ渡します。第6回記事の「プロジェクト検索 - 検索画面:[ pjsearch01.cfm ]」を参照してください。

 
工程登録 - プロジェクト検索結果画面:[ processsearch02.cfm ]

当画面では、プロジェクト検索結果を一覧表示します。前回の第6回記事で作成した、pjinfo.cfcのgetProjectを使用して、プロジェクト情報を取得します。
取得方法は以下のように、検索画面の顧客名とプロジェクト名を引数とします。

<cfobject component="pjmng.cmp.pjinfo" name="objPjinfo">
<cfinvoke component="#objPjinfo#" method="getProject" returnvariable="retProject">
    <cfinvokeargument name="customer_nm" value="#form.search_customer_nm#">
    <cfinvokeargument name="project_nm" value="#form.search_project_nm#">
</cfinvoke>

また、当画面の表示はFlashフォーマットを使用して表示しています。
Flashフォーマットは見栄えやユーザービリティはいいのですが、少し注意する点があるので解説します。
プロジェクト一覧画面から、選択したプロジェクトの工程一覧に遷移する必要がありますが、どのプロジェクトのボタンを押したのかを検知する必要があります。
通常のhtmlフォーマットであれば、JavaScriptを使って、引数にプロジェクトコードを渡しその引数をキーに工程一覧を表示することができます。
しかし、この画面はFlashフォーマットなのでJavaScriptが使用できません。そこで、今回は以下のようにAactionScriptのgetURL関数を使用してPOSTするよう実装しました。

<cfinput type="button" name="pjcd#PROJECT_CD#" id="list#currentrow#" value="工程"
        onClick="getURL('http://localhost/pjmng/processmng01.cfm?
                project_cd=#PROJECT_CD#')
">

 
 
工程登録 - 工程一覧画面:[ processmng01.cfm ]

工程一覧では、プロジェクト一覧で選択したプロジェクトのプロジェクトコードを引数に、processmng.cfcのgetProcessListを実行し、工程一覧を表示します。

<cfobject component="pjmng.cmp.processmng" name="objProcessmng">
<!--- 工程一覧取得 --->
<cfinvoke component="#objProcessmng#" method="getProcessList"
        returnvariable="retProcessList">
    <cfinvokeargument name="project_cd" value="#url.project_cd#">
</cfinvoke>

工程一覧画面の削除ボタンクリックによって削除処理を実行します。削除ボタン(Dボタン)をクリックした時は、processmng.cfcのdelProcessを実行するようにします。(削除画面は特に設けていません)
以下のように、ボタンのクリックイベントでActionScriptのgetURL関数を実行し、プロジェクトコード、工程コード、工程SEQとともに、del_flgをprocessmng01.cfm(当画面)に対しPOSTします。

<cfinput type="button" name="del#currentrow#" value="D" width="18"
        onClick="getURL('http://localhost/pjmng/processmng01.cfm?
            project_cd=#PROJECT_CD#&process_cd=#PROCESS_CD#&
            process_seq=#PROCESS_SEQ#&del_flg=1')
">

※表記の都合上、getURL関数内で改行しています。

POSTされ、url.del_flgが存在する場合は、削除を実行します。url.del_flgが存在するかどうかは、連載第2回のColdFusionの関数の紹介・後編で解説した、StructKeyExists関数を使用します。

<!--- 工程削除 --->
<cfif StructKeyExists(url,'del_flg')>
    <cfinvoke component="#objProcessmng#" method="delProcess">
        <cfinvokeargument name="project_cd" value="#url.project_cd#">
        <cfinvokeargument name="process_cd" value="#url.process_cd#">
        <cfinvokeargument name="process_seq" value="#url.process_seq#">
    </cfinvoke>
</cfif>

 
 
工程登録 - 工程登録・編集画面:[ processmng02.cfm ]

当画面では、工程の詳細を入力するフォームになります。入力フォーム自体は登録画面と編集画面で同一ですので、同じcfmファイルで共有します。
注意すべき点は、工程登録の場合と工程変更の場合で、画面の表示や制御が異なるため、その部分はロジックを if 文で分けています。
工程変更の場合は、url変数で工程コード、工程SEQが必ず渡ってくるので、これら2つの変数が存在する場合は工程変更処理、そうでない場合は、登録処理と判断しています。

<!--- 工程登録と工程編集それぞれの処理 --->
<cfif StructKeyExists(url,'process_cd') and StructKeyExists(url,'process_seq')>
 
    <!--- 工程情報取得 --->
    <cfinvoke component="#objProcessmng#" method="getProcess"
            returnvariable="retProcess">
        <cfinvokeargument name="project_cd" value="#url.project_cd#">
        <cfinvokeargument name="process_cd" value="#url.process_cd#">
        <cfinvokeargument name="process_seq" value="#url.process_seq#">
    
    <!--- DBから取得した工程情報をローカル変数にセットする --->
    <cfif retProcess.RecordCount NEQ 0>
        <cfset Variables.process_cd="#retProcess.PROCESS_CD#">
        <cfset Variables.function_nm="#retProcess.FUNCTION_NM#">
        <cfset Variables.exp_start_dt="#retProcess.EXPECTED_START#">
        <cfset Variables.exp_end_dt="#retProcess.EXPECTED_END#">
        <cfset Variables.act_start_dt="#retProcess.ACTUAL_START#">
        <cfset Variables.act_end_dt="#retProcess.ACTUAL_END#">
        <cfset Variables.emp_cd="#retProcess.EMPLOYEE_CD#">
        <cfset Variables.status_cd="#retProcess.STATUS_CD#">
        <cfset Variables.note="#retProcess.NOTES#">
    
 
    <!--- ボタンの表示名 --->
    <cfset Variables.buttonNm="更 新">
 
    <!--- URLパラメータ --->
    <cfset Variables.urlParam="?project_cd=#url.project_cd#&
                process_cd=#url.process_cd#&process_seq=#url.process_seq#
">
 
<cfelse>
 
    <!--- ボタンの表示名 --->
    <cfset Variables.buttonNm="登 録">
 
    <!--- URLパラメータ --->
    <cfset Variables.urlParam="?project_cd=#url.project_cd#">
 
</cfif>

 
 
工程登録 - 工程登録・編集完了画面:[ processmng03.cfm ]

最後に、工程登録画面、変更画面で入力した内容をデータベースに対して更新します。
こちらも、url変数で工程コードと工程SEQが存在すれば更新処理、そうでなければ登録処理を実行しています。実行した後、完了メッセージとともに工程一覧画面へ戻るためのボタンを配置しています。

 

■ダウンロード

第5回、第6回分のプログラムソースは以下からダウンロードして下さい。

  ファイル名 サイズ  
Download 32_source.zip 20kb プログラムソース

 

■さいごに

今回はプロジェクトにぶら下がる工程の登録・変更・削除を実装しました。だいぶシステムらしくなってきましたね。残すは後1機能。次回はマスタ管理機能の解説を行います。

ColdFusionの各種情報の配信


最新情報
■2017/6/26
『ColdFusion 実験室』
実験6

■2017/3/27
ColdFusion 2016 対応
インストール セットアップ情報
CFサーバーのインストール
CFビルダーのインストール

■2016/9/20
『ColdFusion 2016 リリース
Enterprise Edition 活用資料』
記事一覧

■2016/3/30
『ColdFusion 実験室』
実験4、実験5

■2015/8/10 〜
『ColdFusion クリニック』
記事一覧(随時更新中)

■2015/4/8
『JasperReportsによる帳票出力』
2. JasperReportsによる帳票出力【後編】

■2015/3/12
アップクロス株式会社
西元 貞昭様
『JasperReportsによる帳票出力』
1. JasperReportsによる帳票出力【前編】


■2015/2/25
『ColdFusionでエクセルを使いこなそう!』
4. 【上級】ColdFusionのエクセル機能を利用したPDF帳票の紹介

ColdFusionトレーニング


ColdFusionユーザーグループ
ColdFusionユーザーグループ
Copyright 2012 Samuraiz Corporation. All Rights Reserved.