忍者ブログ
全くIT系ではない製造業の社員がイントラ上でColdFusionと格闘。システム構築を外部委託するとき「できればColdFusionでお願いします」と頼むのだが・・・・
[1] [2] [3] [4] [5]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

テクノラティ(technorati)で被リンク検索するといつも、
「申し訳ございません。ただいまシステムが大変混み合っております。
お手数ですがしばらくお待ちになってからもう一度お試し下さい。 」
となる。

そういうもんかね?

さて、

ColdFusionでFlashGridの最後です。
Inser / Delete / Update の処理部分。

====================================
<!---登録・修正処理ここから--->
<cfif IsDefined("form.gridupdate") is True>
<cfoutput>
 <cfloop index="i" from="1" to="#ArrayLen(form.newsgrid.rowstatus.action)#"><!---この配列に 'U' 'I' 'D' が入ってる--->
  <cfswitch expression="#form.newsgrid.rowstatus.action[i]#">
  <cfcase value="U"><!---Updateの場合--->
   <cfquery datasource="etc" name="updategrid">
    UPDATE #TABLENAME# SET
    LNO = #form.newsgrid.lno[i]# , SINBUN = '#form.newsgrid.sinbun[i]#' ,
    KEYWORD = '#form.newsgrid.keyword[i]#' , TITLE = '#form.newsgrid.title[i]#'
    WHERE SEQ = #FORM.NEWSGRID.SEQ[i]#
   </cfquery>
  </cfcase>
  <cfcase value="D"><!---Deleteの場合--->
  <!---deleteじゃなく、フラグ立てる(DEL_F = 1)--->
  <!---ひとつのレコードをINSERT-DELETEした場合、SEQが無いので消せないので困るぞ対応--->
  <cfif form.newsgrid.original.seq[i] gt 0><cfset seq = form.newsgrid.original.seq[i]><cfelse><cfset seq = 0></cfif>
   <cfquery datasource="etc" name="delgrid">
    UPDATE #TABLENAME# SET
    DEL_F = 1
    WHERE SEQ = #SEQ#
   </cfquery>
  </cfcase>
  <cfcase value="I"><!---Insertの場合--->
   <!---ナンバー入れなかった場合はORA-が出るのでゼロ入れとく--->
   <cfif form.newsgrid.lno[i] is ''><cfset lno = 0><cfelse><cfset lno = form.newsgrid.lno[i]></cfif>
   <!---ナンバーに全角文字入れちゃうかも知れないので変換しとく。一応。つーかFlash側でvalidateしたいもんだ。--->
   <cfset lno = replacelist(lno,'1,2,3,4,5,6,7,8,9,0','1,2,3,4,5,6,7,8,9,0')>
   <cfquery datasource="etc" name="insgrid"><!--- SEQには自動でシーケンス番号入れる。じゃないと修正とか削除がタイヘン! --->
    INSERT INTO #TABLENAME#
    (HIDUKE , SINBUN , KEYWORD , TITLE , LNO , SEQ , DEL_F)
    VALUES
    ('#FORM.SELECTDAY#' , '#FORM.NEWSGRID.SINBUN[i]#' , '#FORM.NEWSGRID.KEYWORD[i]#' , '#FORM.NEWSGRID.TITLE[i]#' , #lno# , EI_NEWS_SEQ.NEXTVAL , 0)
   </cfquery>
  </cfcase>
  </cfswitch>
 </cfloop>
 </cfoutput>
</cfif>
<!---登録修正処理ここまで--->
===============================================

ってことで、UPDATEは問題ないですね。そのまんま。

DELETEはホントに消すんじゃなく、フラグにしています。

INSERTはOracleのシーケンスを使って連番をつけています。
あと、<CFGRID>でvalidate(入力チェック)するやり方がわからなかったので、こっちでやってます。
#replacelist( )# は、よく使いますね~。

最終形は以下。

PR

亀田興毅、あれで勝ったんですかね・・・
試合終了直後から、試合を放送したTBSに対し、視聴者からの抗議が殺到。8月2日の午後7時30分から翌日、3日の午後9時までで6万件近くに上った。・・・・って、文句言う先間違ってると思う。

さて、

<cfif ポストがある?>
ポストがあったときの処理
</cfif>
<body>
あとは共通の表示処理。
</body>

の、ポストがあったときの処理の部分です。

まずは、<cfgrid>でポストすると、どんなデーターがポストされるのかを知らなければいけません。
どうやらマニュアルには載ってないみたいです。

載ってなければ実際にやってみて調べるわけですが、こんな時に使うのがデバッグタグ。
<cfdump>(→LiveDocs)ですね。

<cfif IsDefined("form.gridupdate") is True>
  <cfdump var="#form#">
</cfif>

これで、formでpostされた内容が表示されます。
こんな感じ。
dump_form1.gifformの全内容が表示されます。

これは、一行追加して、一ヶ所修正して、一行削除したときのformの内容です。

<cfdump>は、構造体や配列やxml、クエリーまで わかりやすく表にしてダンプしてくれるので重宝します。

見ると、構造体と配列で構成されていることがわかります。

ポイントは、

dump_form2.gif

この部分。

newsgrid.rowstats.actionの配列に
I:insert
D:delete
U:update
の種別が書かれています。

ここを見て、InsertするかDeleteするかUpdateするかが解ります。

実際はこのように判別させています。

 <cfloop index="i" from="1" to="#ArrayLen(form.newsgrid.rowstatus.action)#"><!---この配列に 'U' 'I' 'D' が入ってる--->
  <cfswitch expression="#form.newsgrid.rowstatus.action[i]#">
   <cfcase value="U"><!---Updateの処理--->  </cfcase>
   <cfcase value="D"><!---Deleteの場合--->  </cfcase>
   <cfcase value="I"><!---Insertの場合--->  </cfcase>
  </cfswitch>
 </cfloop>

何件修正されたかを#ArrayLen(form.nesgrid.rowstatus.action)# で取って(配列の個数)、Loopで回しています。
<cfswitch>で "U" "D" "T" のそれぞれの処理に振るわけです。

あとはSQLを書けばいいですね。


自分自身にポストする処理について。
更新や追加を行った後、結果を再度表示するような場合に、自分自身にポストする方法をよく使います。

流れとしては、

<cfif ポストがある?>
ポストがあったときの処理
</cfif>
<body>
あとは共通の表示処理。
</body>


といった感じで、<cfif>を最初に入れるだけです。
具体的には、

============ news_summary.cfm =============
<!---ヘッダーやら何やら--->

<cfif IsDefined("form.gridupdate") is True>
    <!--- データーベース処理 --->
</cfif>


<!--- 以下共通処理 --->
<cfparam name="form.selectday" default="#dateformat(now(),'yyyy/mm/dd')#">

<cfquery datasource="etc" name="portalnews">
    SELECT
    HIDUKE , SINBUN , KEYWORD , TITLE , LNO , SEQ
    FROM #tablename#
    WHERE HIDUKE = '#form.selectday#' AND DEL_F <> 1 ORDER BY LNO
</cfquery>

<!--- ここから表示 --->
<body>
<cfoutput>

<cfform format="flash" action="news_summary.cfm" style="border-style:solid; font-size:14px" timeout="60" height="650">
    <cfformitem type="text" style="color:##CC3300; font-weight:bold ">#form.selectday#</cfformitem>
    <cfgrid format="flash" name="newsgrid" query="portalnews" selectmode="edit" rowheaders="no" insert="yes" height="500" delete="yes">
        <cfgridcolumn name="lno" width="30" type="numeric" header="No" >
        <cfgridcolumn name="sinbun" width="50" header="新聞名">
        <cfgridcolumn name="keyword" width="100" header="見出し">
        <cfgridcolumn name="title" header="サマリー">
        <cfgridcolumn name="SEQ" display="no">
    </cfgrid>
    <cfinput name="selectday" type="hidden" value="#form.selectday#">
    <cfinput type="submit" name="gridupdate" value="登録・更新">
</cfform>

</cfoutput>
</body>

======================================================

#IsDefined(   )# (→LiveDocs)は、変数の存在を確認する関数で、よく使いますね。
この場合は、Form変数があるかどうかを確認しています。Form変数があるなら、データがPOSTされたということになります。

似たようなところで、<CFPARAM> (→LiveDocs) タグがあります。
こいつは、変数が存在してなければデフォルトを設定してくれるタグです。そして、FormでPOSTされていなくても値を設定できる唯一(たぶん)の方法です。
※<cfset form.hogehoge = "ほげ?"> はエラーになる。

ということで、データーベースから記事を抜き出すときの日付を<CFPARAM>で設定しています。

実際のDB処理は次回ってことで。

GoogleEarthでDash村が見つかっちゃったようですね。
住所ではなく緯度経度が出回ってます。
あの企画もそろそろ終わりになるんでしょうかね。

さて、

FlashGridの続きです。
生成されたFlashの中で、追加したり削除したり編集したりはできるようになりました。
ユーザーインターフェースとしては出来たようなもんです。

ただし、そのユーザーのブラウザの中にあるFlashだけの世界です。別の言い方をすれば、エクセルに記入しただけで保存してない状態です。
ですから、保存しなければ意味がありません。この場合は、当然データーベースに保存することになります。

保存といっても相手はデーターベースなわけですから、ファイルを保存するようにはいかず、各行についてそれぞれ、INSERT / DELETE / UPDATE の何れかのSQLを発行する必要があります。
それを一発でやってくれる、 <CFGRIDUPDATE>→LiveDocs) というタグがあります。
<cfgridupdate grid = "グリッド名" dataSource = "データソース名" tableName = "テーブル名">
とするだけで、INSERT / UPDATE / DELETE を全部一気にやってくれます。

「おぉ、こりゃええ!」と思ったのですが・・・・・イマイチ使えません。

どの辺がイマイチかというと、グリッドに表示されていないフィールドを扱えないという点が致命的。
<cfgridcolumn display="no"> となっているとSQLに含まれない模様。

それから、<input type="hidden" value="デフォルト値だよ"> みたいな事ができない。

あと、DBに主キーが必要。これはデーターベースがOracleの時に困ります。Oracleには主キーを自動採番してくれるようなカウンタアップ型のフィールド型がありません。(9iには。10gにはあるのかな?)Oracleの場合ならシーケンスを定義して、それを使うのが普通ですがcfgridupdate で指定することはできません。
最後の手段はOracleのトリガーを使って採番・・・・・( ̄~ ̄;)ウーン・・・

ということで、<cfgridupdate>を使って更新するのはあきらめた次第です。

<cfform format="flash" action="news_summary.cfm" style="border-style:solid; font-size:14px" timeout="60" height="650">
 <cfformitem type="text" style="color:##CC3300; font-weight:bold ">#form.selectday#</cfformitem>
  <cfgrid format="flash" name="newsgrid" query="portalnews" selectmode="edit" rowheaders="no" insert="yes" height="500" delete="yes">
   <cfgridcolumn name="lno" width="30" type="numeric" header="No" >
   <cfgridcolumn name="sinbun" width="50" header="新聞名">
   <cfgridcolumn name="keyword" width="100" header="見出し">
   <cfgridcolumn name="title" header="サマリー">
   <cfgridcolumn name="SEQ" display="no">
  </cfgrid>
  <cfinput name="selectday" type="hidden" value="#form.selectday#">
  <cfinput type="submit" name="gridupdate" value="登録・更新">

</cfform>

前回から増えたのは、太字の部分。最後が登録・更新ボタンになります。
ボタンを押すと、<cfform action= >に指定されている、 news_summary.cfm に対してポストします。

このnews_summary.cfm ですが、実はこれ、自分自身です。
更新や追加を行った後、結果を再度表示するような場合に、自分自身にポストする方法をよく使います。

次はこいつのデーターベース処理についてですね。

金正日の第四夫人、キム・オク氏。ニュースで「さん」呼びされてたりすると、キム「おくさん」
漢字で書くと、 「金玉」。 (*´ー`) フッ
マスコミは意識的に「金オク」って書いてるな。
たまに金玉と漢字で書いた記事を見つけると、やはり読んでておかしくなる。
==================
女性秘書の金玉さんを事実上の・・・・。金玉さんの存在は、既に・・・・。金総書記が自らの秘書である金玉さんを、・・・・。金玉さんは1964年生まれ。金玉さんについての情報は極めて少ないが、・・・・。
==================

さて、

前回はcfgridで表示だけ でした。表示だけといっても、セル幅を変えたり、ソートしたりできるので、それだけで使えるといえば使えますね。

今回は更新のためのボタンをつけます。

<cfform format="flash" action="news_summary.cfm" style="border-style:solid; font-size:14px" timeout="60" height="350">
<cfgrid format="flash" name="newsgrid" query="portalnews" rowheaders="no" height="300" selectmode="edit" insert="yes" delete="yes">
<cfgridcolumn name="lno" width="30" type="numeric" header="No" >
<cfgridcolumn name="sinbun" width="50" header="新聞名">
<cfgridcolumn name="keyword" width="100" header="見出し">
<cfgridcolumn name="title" header="サマリー">
<cfgridcolumn name="SEQ" display="no">
</cfgrid>
</cfform>

<cfgrid>タグのパラメータに、selectmode="edit" insert="yes" delete="yes" を加えるとinsertボタンとdeleteボタンが追加され、行単位で追加削除ができるようになります。
selectmode="edit"とすると、セル選択時にカーソルが表示され、編集可能になります。selectmode="edit"でなければ、insert delete のボタンを表示することができません。

こんな感じになります。

insert/deleteは、データーベースに対して行っているわけではありません。
あくまで、Flashの中でのみ、「表面的に」行われています。
データーベースに対して更新をかけるには、Flash上でinsert/deleteを行ってから「がさっと」更新することになります。
次回はその辺を。
ブログ内検索
プロフィール
HN:
CFIF
性別:
男性
自己紹介:
もっと日本でもColdFusionが広まって欲しいです。

情報通信を生業としない企業の、システム系でもない普通の社員なので、 ColdFusionは独学。参考書が少ないのがツライです・・・・なんだかんだ、ColdFusion4.xのシリウス時代から7年くらいのおつきあい?リンコムNextのソースが教科書かも。

外注するときはよく「できればColdFusionで・・・・」とお願いするのですが、ほとんどの場合「えっ!?」と驚かれてしまい、「SEのアサインが・・・」などと営業さんが困ってしまうことが多くて悲しいです。
ちょっとしたものなら自分でシステム構築しちゃいますが、一人でやるには時間が足りませんね・・・

FlashRemotingとかもやりますが、Flexには手を出してません。
と、最初の頃書きましたが、ついにFlexに手を出しました。Flex1.5はイマイチわかりませんでしたが、Flex2は別物ですね。これで6万円でイインデスカ?
そしてFlex2とColdFusionの組み合わせなら無敵な気がしますよ。ほんとに。
最新トラックバック
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
なかのひと
忍者ブログ [PR]