第16回 私は初心者です?「6.プログラムは完成したものの」
|
|
16−6 プログラムは完成したものの
なるほどなぁ。 ほとんど部分は真似すれば良さそうというか、ほとんど出来ちゃっているようなもんだけど、作り込んでみるか。 まず、データベースを最初に作っておくんだな。Startupに書けば良いのか。
Sub Project_Startup()
Dim Db as Database
Dim res as Integer
Dim i as Integer
Dim strKey as String
res=DbOpen(Db,"MyShopDb",0)
If res<>0 And res<>3 Then
res=DbCreate(Db,"MyShopDb",0,"MySp")
Else
res=DbClose(Db)
End If
End Sub
それで、Popupのリストに店の情報を・・・って、データベースに店の名前が入っているんだから、ここから取り出せば良いじゃん! あれ?インデックスって、どうやって取り出すんだろう? キーモードのデータベースってのは、インデックスを指定してデータを読み込んだりする訳だろ?DbRead()じゃデータが読めるだけで、インデックスは読めないんだよな。どうするんだ・・・? と、そういう場合は、次のようにノンキーモードを使います。 キーモードとノンキーモードの境界線は、実は曖昧なんですが、とりあえず、インデックスは、ノンキーモードで取り出すことが出来ると覚えておいて損はありません。
Dim i as Integer
Dim strKey as String
Popup1004.Clear
res=DbOpen(Db,"MyShopDb",0)
If res=0 Then
For i=1 to DbGetNoRecs(Db)
res=DbPosition(Db,i,0)
res=DbGet(Db,strKey)
Popup1004.Add strKey
Next
End If
res=DbClose(Db)
わ、びっくりした!って、割り込みかよ。 でも、なるほど、こうやればインデックスの一覧を取り出せるわけだな。 これで、Popupのリストが作られるって事だな。 ええ、確かに動作はそうですが、Startupにこの処理を入れるのは感心しません。 え?何で?最初に一覧表を作っておけば良いんじゃないの? でも、今回は、お店の情報を追加しますよね? ということは、途中でPopupのリストに追加される可能性がありませんか? ああ、確かにそうです。追加したら、一覧も更新しなきゃ。 ですね。そう考えれば、最初の起動時にも、登録した後でも共通に使えるような場所にこのコードは入れるべきなんです。 それは、共通の関数とかサブルーチンという奴ですか? いえ、それも1つの正解ですが、こういうのは、FormのAfter()に入れてしまうのが正解です。 登録画面をどう作られるか分かりませんが、同じForm内で登録しても、別のFormを作っても、RedrawコマンドかNextForm(NextScreen)を使って、そのFormを呼べば、必ずFromのAfter()は通りますよね。 もちろん、最初の起動時にも通りますから、一石二鳥ということです。 ははぁ、なるほど… 理解できたのは、半分くらいだけど、とりあえず、FormのAfter()に入れれば良いってことか。 黙って従っておくか。
Sub Form1003_After()
Dim Db as Database
Dim res as Integer
Dim i as Integer
Dim strKey as String
Popup1004.Clear
Field1006.Text=""
res=DbOpen(Db,"MyShopDb",0)
If res=0 Then
For i=1 to DbGetNoRecs(Db)
res=DbPosition(Db,i,0)
res=DbGet(Db,strKey)
Popup1004.Add strKey
Next
End If
res=DbClose(Db)
End Sub
んで、Popupから店の名前を選択した時に、店の情報を表示するのは、基本にあった、データベースを読むって奴だな。 開いて、読んで、閉じて、って基本だから、これで良いのか。
Sub object1004()
Dim Db as Database
Dim res as Integer
Dim strKey as String
Dim strMess as String
strMess=""
strKey=Popup1004.Itemtext(Popup1004.Selected)
res=DbOpen(Db,"MyShopDb",0)
res=DbRead(Db,strKey,strMess)
Field1006.Text=strMess
res=DbClose(Db)
End Sub
試そうにも、データがないから、早いところ登録機能を作らなきゃな。 店の名前とかを入力しなきゃならんから、この画面じゃ無理だな。新しく、別の画面を用意するか。 登録が終了したら自動的に元のフォームに戻った方が良いのか?いや、連続して登録したい場合があるから、戻るボタンをつけた方が楽かな。とりあえず、戻るボタンにするか。 こんな画面でどうだ。 ![]() で、フィールドに入れた文字と内容を登録するから、データベースの書き込みだな。 実際に自分でやろうと思うと、どこから手をつければ良いか迷うなぁ とりあえず、前のページのサンプルプログラムを真似してみませんか? ふーむ、なるほど。習い事って感じだな、こりゃ。 前のページのプログラムは、
Dim strMessage as string
strInfo="独特な風味の肉汁が溢れるギョウザが特徴" + Chr(10) + "商店街北" + Chr(10) + "定休日:火曜"
res=DbInsert(Db,"AB飯店",strInfo)
If res=0 Then
strMessage="店の情報を追加しました。"
Else
res=DbUpdate(Db,"AB飯店",strInfo)
strMessage="店の情報を更新しました。"
End if
MsgBox strMessage
これをそのまま真似る、って、これは説明用に省略されている部分が結構ありそうだな。 まず、インデックスは、入力した店名になるから、こちらも変数に入れておくか。 ま、店の情報は、そのまま真似するとしよう。
Dim Db as Database
Dim res as integer
Dim strMessage as string
Dim strInfo as string
Dim strIndex as as string
strIndex = Field1011.Text
strInfo = Field1013.Text
res=DbOpen(Db,"MyShopDb",0)
res=DbInsert(Db, strIndex, strInfo)
If res=0 Then
strMessage="店の情報を追加しました。"
Else
res=DbUpdate(Db, strIndex, strInfo)
strMessage="店の情報を更新しました。"
End if
res=DbClose(Db)
MsgBox strMessage
なんだ、思ったより簡単だな。 でも、最低限のエラーチェックはした方が良いですね・・・ 例えば、フィールドに何も入っていなかったら、空文字で登録しちゃうことになりますから。 少なくとも、こんな感じにした方が親切じゃないでしょうか?
Dim Db as Database
Dim res as integer
Dim strMessage as string
Dim strInfo as string
Dim strIndex as as string
strIndex = Field1011.Text
strInfo = Field1013.Text
If strIndex<>"" and strInfo<>"" Then
res=DbOpen(Db,"MyShopDb",0)
res=DbInsert(Db, strIndex, strInfo)
If res=0 Then
strMessage="店の情報を追加しました。"
Else
res=DbUpdate(Db, strIndex, strInfo)
strMessage="店の情報を更新しました。"
End if
res=DbClose(Db)
MsgBox strMessage
End If
なるほど。確かに親切だ。 それと、店の情報が追加できない時、強制的にDbUpdateで更新していますけど、ホントにいいんですか? と思いますが・・・? このままだと、同じ名前の店があっても、勝手に上書きされちゃいませんか? あ、そうか。 同じ名前の店だってあるかもしれないか。 恐らく、他にも、使っていくうちに不便だと思う部分はあるはずです。 ま、プログラムを読み解くのも1つの修行でしょうから、適当に手を加えたソースを差し上げますね。 これが正解というわけではありませんが、紙面の都合もあることですので、この辺で後はよろしく〜
Dim Db as Database
Dim res as integer
Dim strMessage as string
Dim strInfo as string
Dim strIndex as string
Dim intOK as integer
strIndex = Field1011.Text
strInfo = Field1013.Text
If strIndex<>"" and strInfo<>"" Then
intOK=0
strMessage=""
res=DbOpen(Db,"MyShopDb",0)
res=DbInsert(Db, strIndex, strInfo)
If res=0 Then
strMessage="店の情報を追加しました。"
intOK=1
Else
res=Alert("二重登録?","同じ名前の店が存在する可能性があります。上書きしますか?",1,"はい","いいえ")
If res=0 Then
res=DbUpdate(Db, strIndex, strInfo)
If res=0 Then
strMessage="店の情報を更新しました。"
intOK=1
Else
strMessage="更新できませんでした。エラーコード=" + str(res)
End If
Else
strMessage="とりあえず何もしませんでした。"
End if
End if
res=DbClose(Db)
MsgBox strMessage
If intOK=1 Then
Field1011.Text=""
Field1013.Text=""
End if
End If
あ、行っちゃった・・・って言うか、勝手に来て勝手に行っちゃった・・・ どちらにしても、最後は作ってもらっちゃったな。 とは言っても、大筋は変わらないから、何となくこのプログラムの言いたい事は理解できるぞ。 ふーむ、こういう細かいことに気づくか気づかないか、その辺りが、親切なプログラムかどうかを決めるんだなぁ。納得納得。 後は、戻るボタンに元のフォームへ戻る処理を書けばOKか。 あっ! FormのAfterで、Popupリストの処理をさせた理由がわかったぞ! こうなることを考えて作ったんか!?うううむ、奥が深いなぁ・・・ ま、何はともあれ、最初はむつかしそうだなんて思って、尻込みしてたデータベースも、使ってみればそれほど難しくもないか。ま、不恰好なプログラムだけど、記念すべき第一号、これで食べ歩きが一段と楽しくなりそうだ。 使いにくいところは、自分で直せばいいし。まさに、My Palmwareの醍醐味ってヤツか。 ◆◆◆◆◆◆◆◆◆ 「センパーイ、ボクも買いましたよ。CLIEってやつを。」 「それは、TJ25だな。」 「ええ、軽くて安かったんで買っちゃいました。早速ですが、センパイのお店情報下さい。」 「え?」 「ビームってので、プログラムが送れるんでしょう?」 「お、そうかそうか。んじゃ、こっち向けてみな。」 「はい。」 ・・・・・・・・ 「何だか、ビーム中には息を止めちゃうって言うけど、本当だな。」 「ですね。」 「ランタイムも送ったから、これで動くはずだ。」 「ありがとうございま〜す。ってあれ?店の情報が1つもありませんよ。」 「そんなはずはないんだけどなぁ。」 「でも、ほら。」 「本当だ。ちょっと待てよ・・・」 何でビームされないんだろう。データがないって事は、データベースは送られないのか? ん?確か、データベースファイルは、プログラムとは別のファイルの筈だよなぁ。もしかしたら。 「もう一回、ビームするぞ。」 「は、はい。」 「Filezってアプリで、データベースのファイルだけ直接送ればいい筈だ。」 ・・・・・・・ 「どうだ?」 「あ、出ました、店の名前が出ました〜!センパイすごいです。」 「いや、こっちも勉強になるよ。何しろビームは初めてだからな。」 「そうなんですか?」 「ああ、オレの周りでPalmを持っているのは、オマエさんだけだからな。」 「へぇ。そういうモンなんですか。」 ◆◆◆◆◆◆◆◆◆ 「センパーイ、新しい店の情報、仕入れましたよ。」 「お、見つけてきたのか。」 「ハイ。これ、Filezって奴でビームすれば、センパイも使えるんですよね?」 「物覚えが良いなぁ。じゃ、早速。」 ・・・・・・・・ 「受け入れますか、はい、はい、っと。 これか。へぇ、変わったモノを食べさせる店だなぁ。行ってみないと想像がつかないや。」 「でしょお?ボクなんか、行ってもよくわからなかったですもん。」 「あれ、ちょっと待てよ、オレが最近登録した店が消えてるな・・・」 「変ですね?」 「・・・ああ!そうか、データベースファイルを直接ビームしたから、上書きされちゃったんだな。」 「なるほど。でも、確認のメッセージって出ませんでした?」 「いや、オレのはメッセージが英語版だから、ついつい読まずにOKをタップしちゃったものでな。」 「納得です。でも、不便ですね。」 「そうだな、せっかく、互いの情報が交換できるってのにな。」 「意外と使えませんね。」 「いや、何か方法があるはずだ。少しずつ考えれば、何とか解決できる筈さ。」 「期待してますよ〜。」 |
第16回 私は初心者です?「6.プログラムは完成したものの」
|