第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.プログラムは完成したものの」