2007/05/04

[coldfusion]form変数からqueryを作る。

先輩社員から教えていただいて、大変重宝している技。

しばしばあることなのですが、cfqueryでクエリーを発行し、画面に表示した後、画面上で何かしらの動作(チェックボックスにチェックをいれたり、ラジオボタンを選択したりした後など。)して、submitした後、遷移先のページでform変数を表示したい場合、一回、coldfusionでform変数からクエリーを作ってから表示する場合があります。

例えば、submitした後、各form変数の構造体が下のような形であるとします。

<CFSET Form.Name = "Taro">
<CFSET Form.BirthDay = "19821123">
<CFSET Form.BloodType = "O">
<CFSET Form.Address = "TOKYO">
<CFSET Form.E_MailAddress = "hoge1+test@gmail.com">
<CFSET Form.Sex = "M">
<CFSET Form.CellPhone_Number = "090-****-****">

で、この後、queryNewを作って何もないクエリーを生成し、カラム名を追加していきます。

<CFSET Q_Main = QueryNew("")>
<CFSET col_list = "">
<CFSET col_list = ListAppend(col_list,"Name")> <!--- 名前 --->
<CFSET col_list = ListAppend(col_list,"BirthDay")> <!--- 生年月日 --->
<CFSET col_list = ListAppend(col_list,"BloodType")> <!--- 血液型 --->
<CFSET col_list = ListAppend(col_list,"Address")> <!--- 住所 --->
<CFSET col_list = ListAppend(col_list,"E_MailAddress")> <!--- emailアドレス --->
<CFSET col_list = ListAppend(col_list,"Sex")> <!--- 性別 --->
<CFSET col_list = ListAppend(col_list,"CellPhone_Number")> <!--- 携帯電話番号 --->
<CFSET Q_Main = QueryNew("#col_list#")>

追加した後、空のレコードを生成し、listループで、フィールドに値をセットします。

<CFSET QueryAddRow(Q_Main)>
<CFLOOP INDEX="col" LIST="#Q_Main.columnlist#">
  <CFSET QuerySetCell(Q_Main, "#col#", Evaluate("Form.#col#"))>
</CFLOOP>

するとあ~~~ら不思議、cfqueryで、ループをまわすことができます。

<CFOUTPUT>
  <TABLE border="1">
    <TR>
      <TD>Name</TD>
      <TD>BirthDay</TD>
      <TD>BloodType</TD>
      <TD>Address</TD>
      <TD>E_MailAddress</TD>
      <TD>Sex</TD>
      <TD>CellPhone_Number</TD>
    </TR>
    <TR>
      <CFLOOP query="Q_Main">
        <TD>#Name#</TD>
        <TD>#BirthDay#</TD>
        <TD>#BloodType#</TD>
        <TD>#Address#</TD>
        <TD>#E_MailAddress#</TD>
        <TD>#Sex#</TD>
        <TD>#CellPhone_Number#</TD>
      </CFLOOP>
    </TR>
  </TABLE>
</CFOUTPUT>

実行結果は、下のようになります。

NameBirthDayBloodTypeAddressE_MailAddressSexCellPhone_Number
Taro19821123OTOKYOhoge1+test@gmail.comM090-****-****

まるでselect文から取得したような気持ちで使うことができるでめっちゃ重宝しています。

今までの流れをまとめました。

<CFSET Form.Name = "Taro">
<CFSET Form.BirthDay = "19821123">
<CFSET Form.BloodType = "O">
<CFSET Form.Address = "TOKYO">
<CFSET Form.E_MailAddress = "hoge1+test@gmail.com">
<CFSET Form.Sex = "M">
<CFSET Form.CellPhone_Number = "090-****-****">

<CFSET Q_Main = QueryNew("")>
<CFSET col_list = "">
<CFSET col_list = ListAppend(col_list,"Name")> <!--- 名前 --->
<CFSET col_list = ListAppend(col_list,"BirthDay")> <!--- 生年月日 --->
<CFSET col_list = ListAppend(col_list,"BloodType")> <!--- 血液型 --->
<CFSET col_list = ListAppend(col_list,"Address")> <!--- 住所 --->
<CFSET col_list = ListAppend(col_list,"E_MailAddress")> <!--- emailアドレス --->
<CFSET col_list = ListAppend(col_list,"Sex")> <!--- 性別 --->
<CFSET col_list = ListAppend(col_list,"CellPhone_Number")> <!--- 携帯電話番号 --->
<CFSET Q_Main = QueryNew("#col_list#")>
<CFSET QueryAddRow(Q_Main)>

<CFLOOP INDEX="col" LIST="#Q_Main.columnlist#">
  <CFSET QuerySetCell(Q_Main, "#col#", Evaluate("Form.#col#"))>
</CFLOOP>

<CFOUTPUT>
  <TABLE border="1">
    <TR>
      <TD>Name</TD>
      <TD>BirthDay</TD>
      <TD>BloodType</TD>
      <TD>Address</TD>
      <TD>E_MailAddress</TD>
      <TD>Sex</TD>
      <TD>CellPhone_Number</TD>
    </TR>
    <TR>
      <CFLOOP query="Q_Main">
        <TD>#Name#</TD>
        <TD>#BirthDay#</TD>
        <TD>#BloodType#</TD>
        <TD>#Address#</TD>
        <TD>#E_MailAddress#</TD>
        <TD>#Sex#</TD>
        <TD>#CellPhone_Number#</TD>
      </CFLOOP>
    </TR>
  </TABLE>
</CFOUTPUT>

0 コメント:

コメントを投稿