入力漏れのエラー ~PowerBuilder 入門!!第 6 弾 (6)~
みなさん、こんにちは!
このブログは、「PowerBuilder ってなに?」、「PowerBuilder ってなにができるの?」という疑問に、IT 用語の解説もしつつ、簡単に分かりやすくお答えすることをモットーにしています。
気になる方はぜひ続きを見てみてくださいね。
キャラクター紹介
ねこぴ
PowerBuilder の日本語版オリジナルキャラクター。
(猫に見えるが) PowerBuilder の先生。
最近、かき氷の自家製シロップを製造中。
ちまき
PowerBuilder をこれから学びたい開発初心者。
最近、本格パスタにはまっている。
ある日の午後のこと・・・。
できたにゃー!
ココナッツナツメヤシシロップだにゃ。
カタカナ連続してますが美味しそうですね!
でも私のも見てください!ほらっ!おいしそうでしょ~!カルボナーラです。
美味しそうにゃ。(食べる)むむっ!これはシンプルだけどコクを感じるにゃ。
わいのシロップかき氷も食べてみるかにゃへへっ。
いただきまーす!かっらああああ!なんですかこれ?!
前回はデータウィンドウ内のデータ更新とその確認Part 2 の回でしたよね!(からあああい)
アジアのスパイシーさを引き出したオリジナルスパイスだにゃ。
今回は前回の続きで、記入漏れがあった場合にエラーを表示させるようにコードを記載するにゃ。
なんてもんくわしてんだよおおお
前回のブログでは「データ入力時の確認」について解説していきました。
今回は更新するデータについて項目の入力漏れがある場合に、エラーを表示する方法について説明していきます。
PowerBuilder って何なの?と思ったあなた!
PowerBuilder 入門ブログシリーズ第 1 弾をぜひご覧ください(^◇^)
PowerBuilder とは? ~PowerBuilder 入門!! 第 1 弾~
動画で分かりやすく PowerBuilder について知りたいなあという方は・・・
YouTube で PowerBuilder 入門シリーズの動画を公開中!なので要チェック★
最新の動画はこちらから!↓↓↓
復習です。いま住所録には 60 件分の個人データが登録されています。
前回は様々な関数を使用して 「入力項目に誤りがある場合にエラーを表示させる」
という方法について解説しました。
では今回は新規に行を追加した場合でも、その新規追加した行内の項目に入力漏れがあった場合にエラーが出るという感じにしたいと思います(`・ω・´)ゞ
以前は ItemChanged イベントに CHOOSE CASE を使用して電話番号と FAX 番号についてエラーが出るようにコードを記述しましたが、今回は「更新」ボタンをクリックした際に、エラー用のメッセージボックスを表示するようにしたいので、更新ボタンの clicked イベント に記載していきます。以下のコードをご覧ください。
//変数宣言 int li_nbr //数値型の入れ物 string ls_str //文字列型の入れ物 long ll_row //データウィンドウの行数 long ll_cnt //カウンタ //行数をセット ll_row = dw_list.RowCount() //カラムの開始行から最終行まで項目が空文字またはNULLかどうか確認 FOR ll_cnt = 1 TO ll_row li_nbr = dw_list.GetItemNumber(ll_cnt,"id")
IF string (li_nbr) = "" OR IsNull(li_nbr) THEN MessageBox("エラー", "IDが入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"last_name")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "名前が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"first_name")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "名字が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"zip")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "郵便番号が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"state")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "県名が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"phone")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "電話番号が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"fax")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "Fax番号が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"city")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "市区町村が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"title")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "タイトルが入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"street")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "市区町村以降が入力されていません。") EXIT END IF NEXT
そう!入力項目を全て確認していくためには、ループが肝になってきます。
では内容をより詳しく見ていきましょう!
まず、PowerBuilder でループはどのように書くのか・・・!ですが、メジャーなところでいうと FOR ~ NEXT 文になります。
以下の図をご覧ください。
CASE 文は前回使用しましたね。
今回は右側の FOR~NEXT 文による記述を使用しています。
FOR から NEXT の間までの部分に繰り返し実行する処理を書いていきます。
ではなぜ、ループ処理なのか?
それに関しては、次のメソッドの解説で分かります(^ω^)
しつこいと思いますが再度コードを表示します★
//変数宣言 int li_nbr //数値型の入れ物 string ls_str //文字列型の入れ物 long ll_row //データウィンドウの行数 long ll_cnt //カウンタ //行数をセット ll_row = dw_list.RowCount() //カラムの開始行から最終行まで項目が空文字またはNULLかどうか確認 FOR ll_cnt = 1 TO ll_row li_nbr = dw_list.GetItemNumber(ll_cnt,"id")
IF string (li_nbr) = "" OR IsNull(li_nbr) THEN MessageBox("エラー", "IDが入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"last_name")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "名前が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"first_name")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "名字が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"zip")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "郵便番号が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"state")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "県名が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"phone")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "電話番号が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"fax")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "Fax番号が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"city")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "市区町村が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"title")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "タイトルが入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"street")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "市区町村以降が入力されていません。") EXIT END IF NEXT
「なんや、GetItemNumber やら GetItemString って書いてあるけど、おたくら何?」
いいところに目をつけられましたな(^o^)丿
以下の構文って覚えてますか?
string ls_col_name//指定したカラムの位置の番号を取得 ls_col_name = dw_list.GetItemString(2,"phone") MessageBox("取得値", ls_col_name)
この構文は、たとえばウィンドウにボタンを設置し、そのボタンを押すとデータウィンドウに配置されているカラムに入力されている情報を引っ張ってメッセージで表示するというコードになります。
もし今このボタンを配置してアプリを実行すれば、住所録の 2 行目の電話番号が取得され 、以下のようにメッセージボックスに表示されるのです。
「あ!前のブログで見た!」という方!そう、以前のブログで紹介しています。
つまり上記の説明通りに行くと、GetItemString メソッドの第 1 引数 (現在 2 が入っている箇所)は、
String 型の値を取得したい行の番号が入ってくるわけですね!
GetItemNumber に関しても GetItemString と考え方は同じです。
違いとしては、Number 型の値を取得するか、String 型の値を取得するかどちらかになります。
また、カラムの項目 1 つずつに対して値が入力されているかを確認する必要があるので、コードのように、
各カラムに対して GetItemNumber または GetItemString を使って値を取得しています。
これらのメソッドを利用し、入力された値を取得してチェックをしていくわけですが・・・
複数の行が編集された場合や、多くの住所を新しく追加した場合、それらすべての行に対して入力された値のチェック処理を 1 行ずつ書いていくのは面倒ですよね。
だから、ループ処理で「最初の行から最後の行まで」全部の行をチェックしてしまおう! ということです。
しつこいと思いますが再度コードを表示します★(あれ、デジャビュ?)
//変数宣言 int li_nbr //数値型の入れ物 string ls_str //文字列型の入れ物 long ll_row //データウィンドウの行数 long ll_cnt //カウンタ //行数をセット ll_row = dw_list.RowCount() //カラムの開始行から最終行まで項目が空文字またはNULLかどうか確認 FOR ll_cnt = 1 TO ll_row li_nbr = dw_list.GetItemNumber(ll_cnt,"id")
IF string (li_nbr) = "" OR IsNull(li_nbr) THEN MessageBox("エラー", "IDが入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"last_name")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "名前が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"first_name")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "名字が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"zip")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "郵便番号が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"state")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "県名が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"phone")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "電話番号が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"fax")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "Fax番号が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"city")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "市区町村が入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"title")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "タイトルが入力されていません。") EXIT END IF ls_str = dw_list.GetItemString(ll_cnt,"street")
IF ls_str = "" OR IsNull(ls_str) THEN MessageBox("エラー", "市区町村以降が入力されていません。") EXIT END IF NEXT
あとは細かいところとして、ll_row = dw_list.RowCount() と記載されている個所ですが、
データウィンドウに表示されている行数を取得するコードになりますね。FOR ll_cnt = 1 TO ll_row にて 1 行目から ll_row に格納された「行数」、つまり最後の行番号までを順番にlong 型の変数 ll_cnt に入れているわけです。
そしてそれぞれ宣言されている string 型と integer 型の変数に、入力された値が代入されています。
次はその値が、空文字か Null じゃないかを判定する必要がありますね(/・ω・)/
入力された値が Null かチェックする場合は IsNull 関数を使用します。
IsNull 関数とは?
変数または式の値が null かどうかを調べる関数のこと。
書き方 : IsNull ( any )
any は変数または式を指定する。
ここでは取得した値が入った変数を Null かどうか確認しています。
あとは、取得した値がもし空文字、もしくは Null だった場合、MessageBox 関数でメッセージを表示します!
改めてここまで説明した処理内容をまとめると、1 行目から順番に各カラムの値を取得して、未入力 (Null もしくは空文字) かどうかをチェックし、もし未入力だった場合はエラーメッセージを表示してループを抜けるといった処理を最後の行まで繰り返しています。
では結果を見ていきましょう!
まずは、行追加ボタンをクリックして新しい行を追加し、何も入力せず「更新」をクリックすると・・・
エラーが出てきましたね!
次に「検索」を押して最後の行を新しく追加し、何も入力せず「更新」をクリックすると・・・
またまたエラーがきちんと出てきましたね!
ループでくるくる!!
1 つ 1 つ確認してますね。
そうだにゃ!
このように確認することで、項目の記入漏れを防げるにゃ。
- -GetItemNumber または GetItemString でカラムの値を取得する
- -IsNull 関数で値が Null かどうか調べることができる
PowerBuilder 入門ブログシリーズ、次回の内容はこちら↓↓
ユーザーオブジェクトとは? ~PowerBuilder 入門!!第 7 弾 (1)~
いかがでしたでしょうか?
より詳しく PowerBuilder に関してお知りになりたい方は、 Appeon 社の製品サイトをチェック!
「難しい言葉は簡単に、分かりやすく」をモットーに、今後も PowerBuilder についてお伝えしていきたいと思いますので、どうぞよろしくお願いします!