データの更新と更新特性 ~PowerBuilder 入門!!第 4 弾 (2)~
みなさん、こんにちは!
このブログは、「PowerBuilder ってなに?」、「PowerBuilder ってなにができるの?」という疑問に、IT 用語の解説もしつつ、簡単に分かりやすくお答えすることをモットーにしています。
気になる方はぜひ続きを見てみてくださいね。
キャラクター紹介
ねこぴ
PowerBuilder の新キャラクター?
(猫に見えるが) PowerBuilder の先生。
最近買ったホットサンドの機械が、何も挟めないただのパン焼き機だったことが判明した。
ちまき
PowerBuilder をこれから学びたい開発初心者。
最近韓国ドラマを一気見して気づいたら朝になっていることが多い。
ある日の午後のこと・・・。
気づいたらもう 3 月・・・
今年は花見できるかしら・・・
桜の下でわいわいしていた日々が懐かしいわ・・・
感傷に浸りすぎて語尾変わってますけど・・・
お花見いいですよね!
できたらどこに行きたいですか?
上野公園で国際交流している仲間たちとパーティーでもしたいにゃ。
ドイツ人の友達、中国人の友達、アイスランド人の友達、チリ人の友達・・・
みんな元気かにゃ・・・
データベースからデータを「検索」できるよう作業をしたにゃ。
今日はデータベースのデータを「更新」する部分をやっていくにゃ。
ではいきますよー!!
さて、第 4 弾のアプリ作成 2 回目です^^
どんなアプリだったかというと、人の名前や所属番号をデータベースから取得し、それを編集し、最後は更新ボタンをクリックしてデータベースに反映させるというものです。
検索ボタンを押して検索ができる設定まで終わっている方は下の画像まで進んでいるはずです。
(進んでます、、、かね?(^<^))
では、今から「更新」の処理を記載していきます。
ボタンの項目に関してですが、ボタンを右クリックすることで「スクリプト」という項目が出てきて、そこにコードを書きこめる仕組みでしたよね。
今の状態だとアプリが起動したままになっているので、コードは書けません。コードを書くためにアプリをいったん終わらせましょう。
アプリにある [閉じる] というボタンをクリックしたくなってきますが、ここをクリックしてもボタンに「ウィンドウを閉じる」などのスクリプトが書かれていないので、何も起こりません、っていってもたまに癖でクリックしてしまいます(≧ω・)
アプリの右上の×ボタンでアプリを閉じましょう。
そうすると、 PowerBuilder の IDE 上にまた戻ってきます。
では、 [更新] ボタンを右クリックして「スクリプト」を開いてみましょう。
そうすると、スクリプトビューの左上のリストに「cb_2」と表示されています。 [更新]ボタンのコントロールの名前が「cb_2」だったのでスクリプトを書く場所はここになります。
そもそも「更新」はどういう処理が行われるかというと、アプリを作成第 1 弾でも記載していますが、アプリを実行した後にデータウィンドウ上に表示されるデータに関して、現在の状態からの変更が必要な時に「更新」を行います。
たとえば、「Emp Lname」という列に記載のある 1 番上の「鈴木」さんが結婚して名字が「田中」さんになったとします。
その場合は、データを新しく更新しないといけませんよね?
ではまずは以下のコードを記載してみましょう。
Update 関数を使用しています。 Update 関数については以下のとおりです。
Update 関数とは?
データウィンドウ一覧上のデータを更新する関数のこと。データウィンドウオブジェクトに定義した更新特性にしたがってテーブルを更新する。
書き方 : データウィンドウ コントロール名. Update(accept, resetflg)
accept = 更新する前に AcceptText (入力の確定)を実行するかどうか(省略は可)
TRUE : 実行する(デフォルト)
FALSE : 実行しない
resetflg = 関数実行後に更新フラグをリセットするかどうか(省略は可)
TRUE : 実行する(デフォルト)
FALSE : 実行しない
※更新フラグとは、行やカラムに対する変更を判断するフラグで、このフラグによって Update 関数が生成する SQL が変わります。
まって、更新特性?入力の確定?更新フラグ?ついていけなーい!( ;∀;)って思った方!
大丈夫です!解説していきますね\(^o^)/
因みに、 PowerBuilder に限らない SQL 文もそうですが、update や insert 文などを発行しただけでは本来はデータベース内は更新されません。
確定させるために「Commit」という命令を実行する必要があります。 Commit は確定という意味です。つまりトランザクション(データベースで行われる一連の作業)で実行した SQL をすべて確定させるという意味合いになります。
例)COMMIT USING SQLCA;
「え、でも書いてないよ?」という方!そうなんです。 PowerBuilder は Commit 文を発行しなくてもデータベース接続に関するパラメーター(AutoCommit と CommitOnDisconnect など)を使用することで勝手に確定をしてくれる機能が備わっています。
AutoCommit と CommitOnDisconnect は、
第 3 弾のブログにて紹介していた「/*アプリケーション起動*/」の「接続情報の取得」コード部分に必要であれば記載されます。 AutoCommit と CommitOnDisconnect の詳細は以下の通りです。
SQLCA.AutoCommit = value
value が true の場合 : SQL 文が正しい場合、DBMS は Commit 文が発行されたかのように、データベースを直ちに更新します。
value が false の場合 : Update 関数を発行し、実行するとすべての値に対してコミットされます。特に AutoCommit に関して記載がない場合は、こちらがデフォルトになります。
CommitOnDisconnect = value
value が true の場合 : アプリケーションを終了したとき、またはコードで明示的に DISCONNECT 文が発行されたときに、コミットされていないデータベースの更新がすべてコミットされます。こちらがデフォルトになります。
value が false の場合 : アプリケーションを終了したとき、またはコードで明示的に DISCONNECT 文が発行されたときに、コミットされていないデータベースの更新がすべてロールバック(破棄)されます。
「Commit 文を書かなくてもいいなんて、便利やん!これ使おう!」といった感じですが、アプリが異常終了した際にも Commit 文が発行されるため、作成するアプリケーションに併せて利用を検討するようにしてください(^^)
では 1 度アプリケーションを実行し、データウィンドウの中のデータを変更後、更新してみましょうか!
では、パワーバーの [実行] ボタンをクリックしてみましょう。
アプリケーションが立ち上がるので、 [検索] ボタンをクリックしてみましょう。そうしますと、データベースの内容が表になって表示されます。これは前回と一緒ですね。
では次に、データウィンドウの項目「Emp_Lname」の 1 番上の「鈴木」を「田中」に変更してみましょう。
「鈴木」の部分をクリックするとフォーカスが当たるのでそのまま「田中」をタイプしてください。
ほ?書き換えができないんですけど・・・って方は
Yama-chan さんのブログで解決策が見つかるかも?
「書き換えできたよ!」って方は、そのまま下の [更新] ボタンをクリックしてみましょう。
「田中」に書き換えた部分がなんだかおとなしくなりました(語彙力)
なんと、これで更新は完了です!つまりデータベースのデータも「鈴木」から「田中」に置き換わったことになります。いったん、アプリケーションを×ボタンで閉じてしまいましょう。
次にシステムツリーからデータウィンドウオブジェクトを開いてみましょう。
そして、「プレビュー -d_adr_test」を見てください。1 番上の名前が「田中」に代わっています。このデータウィンドウに表示されている一覧が、アプリケーションを実行し検索ボタンをクリックした際に表示されるものです。
ここでも変更された内容が確認できるかと思います。
それでは次に更新特性についてです。
更新特性とは「こんな条件でデータウィンドウの中身を更新してね」という決まりです。設定箇所の開き方ですが、まずはデータウィンドウオブジェクトを開いている状態でメニューバーから「行」-「更新特性の指定」を開いてください。
すると以下のような「更新特性の指定」ウィンドウが開くと思います。
ここで更新する上での決まりごとを設定していくわけです。
・更新可能のチェックボックス・・・そもそも更新が可能かどうかを許可する箇所です。チェックが入っていれば、更新が可能。チェックを外すと更新ができなくなります。
・更新可能なテーブル・・・更新が可能であれば、どのテーブルに格納されている情報を更新してもいいかということですね。現在は「EMPLOYEE」のテーブルに載っている情報のみ扱っているので、自動的に「EMPLOYEE」が選択されています。
・Update / Delete キーの Where 句・・・デフォルトではキーカラムに設定されています。が、これは説明しますね(^^)/
・キーカラムの更新・・・キーカラムというのは、このキーだけで誰の何の情報か判別がつくというキーのことです。そのキーカラムが更新された場合に、 Delete して新しくカラムを Insert するか、 Update で変更するか決めるということです。といってもなんのこっちゃ分からないので説明します(^^)/
・更新可能なカラム・・・更新可能なカラムを選択します。
・固有キーカラム・・・こちらは該当するデータが唯一(1つだけ)となるように設定するものです。が、これも説明します(^^)/
・identity カラム・・・データベースにデータを追加(INSERT)したときに自動的に連番をカラムに設定する機能です。自動的に一意となる値を設定してくれるので便利ですが、そのように設定したカラムに対しては、勝手に値を設定したりすることはできません。「このカラムの値についてはデータベースの機能にお任せしますよ」と指示する機能だと思ってください。
上記 3 つを説明したいのですが、まずは固有キーカラムから説明したほうが分かりやすいので、これから説明していきますね(/・ω・)/
<固有キーカラムとは?>
データウィンドウを使った更新は、 Retrieve で検索したデータに対して行われます。
その処理の流れについては以下のとおりです。
- Retrieve メソッドによりデータベースからデータを検索(実は内部的に SQL の SELECT 文が発行されている)
- データウィンドウにデータを表示
- ユーザーがデータウィンドウのデータを変更
- Update メソッドにより変更されたデータに対応するデータをデータベースから特定して更新(実は内部的に SQL の UPDATE 文が発行されている)
実際はデータベースとデータウィンドウはダイレクトにつながっているわけではなく、データウィンドウに保持された情報から、どのデータが更新されたかを改めて探しに行っているのです。
どのような情報から特定しているかというと、「検索時のデータの内容」です。
たとえば下記のような生徒テーブル(A : クラス、B : 番号、C : 名前、D : 成績)があります。
データウィンドウ上で検索し、 1 組 3 番の「さとう」を「えのもと」に変更したとします。
そのとき、データベースでもともと「さとう」だったデータに対して更新処理が走るわけですが・・・、
UPDATE 生徒テーブル SET C = ‘えのもと’ WHERE C = ‘さとう’;
このような SQL では、 C (名前)が「さとう」であるすべてのデータが対象になり、 3 組 3 番の生徒も変更されてしまいます。
このため、一意となるキーが必要となるわけです。
このテーブルでは A と B の組み合わせです。これが「固有キーカラム」です。
この「固有キーカラム」を使って更新すると、下記のようになります。
UPDATE 生徒テーブル SET C = ‘えのもと’ WHERE A = 1 AND B = 3;
これで 1 件のみのデータ = 更新されたデータのみが更新されるという仕組みです。
なお、固有キーカラムはそのテーブルで唯一となればいいので、 1 つの場合もあるし、例のように複数の場合もあります。
おっと、Update/Delete キーの Where 句やキーカラムの更新について説明したかったのですが、もりもりもり太郎になってしまったので、ここらでいったん区切ります。
また次回説明をさせてくださいね☆
Update 関数・・・
深い、深すぎる!
緑茶の深みぐらい深いにゃ。
しかも Update 関数はすごいヤツなのでなんでかは下のブログを参考にするといいにゃ。
それでは、最後におさらいをしましょう。
- 結論
- Update 関数はデータベースと連携してデータを更新
- 基本的には Commit 文で確定し、AutoCommit と CommitOnDisconnect は必要に応じて利用
- 更新特性は更新する上での決まりごとを決める
- その中の固有キーカラムは 1 つのデータを判別できる要素の決定
いかがでしたでしょうか?
より詳しく PowerBuilder に関してお知りになりたい方は、 Appeon 社の製品サイトをチェックしてみてください。
さ・ら・に!! 今年 4 月に Japan IT Week 春 【第 31 回 ソフトウェア&アプリ開発展】に出展します!
春をイメージした、温かい色味のあるブース案を考えております。皆さん、よろしければぜひお越しください。
(ねこぴとちまきがいる・・・かも?)
「難しい言葉は簡単に、分かりやすく」をモットーに、今後も PowerBuilder についてお伝えしていきたいと思いますのでよろしくお願いします!