5.思ったより簡単にデータベースが使えるんなら、作ってみましょうか  その2

●データを書き込む前に…

「じゃあ、次は書き込みの処理をしますね。この部分のコードは次の・・・」
「あの、ちょっと待って下さい。」
「はい?」
「今更で恥ずかしい質問なんですけど、データベースって結局どんなものですか?」
「ぐはっ!それは難しい質問ですね。」
「今までの講座などで、いわゆる一般のデータベースとは違うらしいぞ、ってことは理解しているつもりですが、では、実際にPalmのデータベースって、どういうモノなのか、今一つ、ピンとこなくて。」
「なるほど。確かに、そういう意味では、今から扱うものがどんなイメージか掴んでおくのは悪くないですね。」
「お手数かけますが、書き込み処理の前に、こちらを教えて下さい。」
「わかりました。」
「でも、難しいんでしょうか?この講座の3回分くらいに及ぶような・・・」
「いえ、そんなことないですよ。まず、これが、データベースファイルです。」

「は?箱?」

「で、これが、データベースの1件のデータです。」

「へ?」

「データベースにデータが入っている、というのは、こんな状態になります。」

「はぁ?」
「これがデータベースなんですよ。簡単でしょ。」
「あ、あの〜、箱とカードですよね。」
「ええ、NS Basicで扱うデータベースは、このようなイメージで捉えておいて大丈夫です。で、この1枚のカードですけどね・・・」
「ま、待って下さい。順を追ってお願いします。」
「いえいえ、ひとまず、黙って聞いていてください。」
「はい・・・」
「えっと、まず、1件のデータは1枚のカードと考えることができます。見出しがついて、情報が書き込めるような。図書館などで書籍目録に使われているような、そんな情報カードをイメージして下さい。最近は、オンライン検索がメインかもしれませんけど。」

「この1枚のカードが、1つのデータベースの記録単で、難しい言葉ではレコードといいます。このレコードが集まったのがデータベースを入れる箱、つまりDbCreate()で作られるデータベースファイルという事です。」
「あ、なるほど!前回は空箱を作っていたんですね。」
「はい正解。カードを保存するために、ひとまず、空箱を用意したことになります。」
「では、そのカードの情報を読んだり、書き込んだりするのがデータベースの操作なんですね。」
「ええ。イメージを掴むために、もう少し正確にお話しましょう。」
「はい。」

「データベースの操作には、次のような種類があります。

  • 新規追加
  • 修正
  • 削除

このうち、修正と削除については『どのカードに対して?』という事を指定しなければなりません。そこで『検索』という操作がここに加わって、合計で4種類の操作があることになります。」
「書き込む、直す、消す、探す、ですね。」
「まず、『新規追加』ですが、これは、新しいカードを用意して、箱に追加することに相当します。」
「ふむふむ」

「一方、既に、箱の中にあるカードに手を加える場合は『修正』で、カードを捨てることが『削除』になります。どちらの場合も、見出しを頼りに、操作の対象となるカードを特定します。」

「なるほど、それが検索ですね。」
「はい。この検索、正しくは『探してくれる機能』ですけど、もう少し詳しく説明したいと思います。」
「お願いします。」
「実際のカード、つまり1つのレコードは、見出しと本文を持っていますけど『探してくれる機能』は、見出しか見ないんです。」

「じゃあ、本文に書かれた内容から検索する事はできないんですか?」
「ごめんなさい。ちょっと語弊があります。検索する機能が用意されているのは見出しの部分に対してだけ、なんです。」
「はぁ?」
「つまり、見出しの部分を検索する命令語や機能は用意されていて、NS Basicから簡単に使えるんですが、そうでない部分は、自分で検索するプログラムを作る必要があるんです。」
「・・・じゃぁ、出来ることは出来るんですね?」
「ええ、一応出来ます。でも、命令語を利用すれば、たくさんのカードの中から、該当するカードを瞬時に探してくれますけど、そうじゃない部分を検索する場合、1枚1枚カードを見ていかなければならないんです。」
「ああ、速度が遅いんですね。」
「ついでに、それは自分で作らないといけませんしね。」
「ありゃりゃ、じゃ、あまり実用的ではないということですか?」
「そうですね。できる限り、見出しで検索できるように考えるのが賢い方法でしょう。ひとまず、こんな説明でよかったですか?」
「はい。わかりました。一つ、気づいたことがありますよ。」
「ん?なんですか?」
「この空箱はフタ付きの箱ですね。データベースは、DbOpen()で開いておかないと使えない、でしょ?」
「あはは、よい例えですね。1本とられました(笑)」


●さあ、書き込もう

  Dim res as Integer
  Dim strKey as String
  Dim strData as String
  Dim Db as Database
  Dim D1 as Date
  Dim D2 as Time

  res=Alert("確認","書き込んでも良い?",1,"よい","やだ")

  If res=0 Then
    strData=Trim(Field1004.text)

    If Len(strData)=0 Then
      res=Alert("エラー","内容がないよう〜!!",3,"すんません")
    Else

      D1=ToDay()
      D2=Now()

      strKey=Str(D1)+" "+Str(D2)

      res=DbOpen(Db,"PHS04DB",0)
      res=DbInsert(Db,strKey,strData)
      res=DbClose(Db)

      res=Alert("完了","書き込みましたよん。",0,"了解")

      Field1004.text=""
    End If

  End If

「さて、書き込みは『書き込む』ボタンにこんなコードを書いてみました。」
「ちょっと長いですね。」
「ええ、実際に書き込む部分より、どちらかといえば、確認用のダイアログが多いですね。」
「最初の『書き込んでも良い?』って部分ですね。これは MsgBox()じゃないんですね。」
「ええ、何か帰ってくる値が欲しい時は、表示するだけの MsgBox()では役不足なんです。そういう場合、このAlert()を使います。最初の1行を例にとって見れば、使い方がなんとなくわかるでしょ?」


res=Alert("確認","書き込んでも良い?",1,"よい","やだ")

「えっと、ダイアログのタイトル、本文、ボタンですね。おや?途中の数字は何ですか?」
「これはアイコンの種類を表します。次の値で指定して、目的に応じて使い分けます。」

アイコンタイプ主な用途
0情報
1確認
2警告
3エラー

「なるほど〜、確認だから『?』マークですね。」
「そういう事です。そして、Alert()では押されたボタンの番号が返ってきます。」
「番号というと?」
「指定したボタンの番号です。1番目が『よい』2番目が『やだ』にしてありますよね、ここで返ってくる値は・・・」
「あ、『よい』なら1、『やだ』なら2ですね!」
「ふふふ、そう来ると思っていました。このAlert()では、1番目のボタンでは0、2番目では1が返ってきます。1つ引いた値ですね(笑)」
「あ、だから、最初のIfが『If res=0』なんですね。納得納得。次の『strData=』なんとか、ってのは何ですか?」
「これは、書き込む内容を変数に入れているんです。Field1004に書き込まれた文字列は、

  strData = Field1004.text

とすることで変数strDataに代入できます。これは、空魚屋さんのHello,world!で登場していますね。」
「あ、ホントだ

  Field1.text = "Hello, World!"

ですね。代入は右から左でしたっけ、だから、左側に入るんですね。なるほど。」
「そうです。ちなみに、textというのは、Fieldの1つの属性を表します。難しい言葉でプロパティと言います。」
「プロパティ?・・・あ、パソコンの設定に登場する奴ですね。属性・・・ですか。」
「ええ、属性です。textプロパティは、そのFieldに入力されている文字列を表します。」
「属性といっても、一方では参照できて、一方では代入できる、面白いですね。」
「確かにそうですね。今回は、書いてある文字列が欲しいですから、こういう形にしたんです。」
「更に、Trim()というのがありますね。」
「Trim()は、前後の空白を削除してくれる関数なんです。今回の日記アプリでは、本文の前後に空白は要らないでしょ?」
「あ、便利なものがあるんですね。」
「写真なんかの位置を調整するトリミングって言葉の『トリム』です。切って整形する、という意味合いだそうです。」
「ははぁ、余分な空白を切りとって、整形ですか。」
「その他に、前の空白だけを削除するLTrim()と、後ろの空白を削除するRTrim()もありますよ。ただし、半角スペースだけですから、注意して下さい。」
「はい。」
「その次は、取り出したLen()という関数で、文字列情報の長さを調べています。Len(strData)=0だったら、何も入力されていない、という事ですね。」
「へぇ、何も入力されてない状態・・・あ、間違って書き込みボタンを押しても、書き込みされないですね。」
「そういう事です。無駄に、空白だらけのカードが増えても仕方がないでしょう。」
「なるほど。よく考えてありますね。」
「あはは、適当に作っているようで、意外と考えているものですよ。」
「奥深そう。で、次は、Elseですね。これは、前回覚えました、If Then と Else です。ここでは、Len()が 0じゃなかったら、なので、何か入力されている時ですね!」
「はい正解。何か書かれていれば、書き込みの処理を行います。」
「今回は、見出しに『日付』と『時間』を足したものを使うことにしました。例えば『2002/05/31 10:15:30』のような形式です。」
「えらく細かいですね。日記なら日付だけで結構です。秒単位の時間まで要りませんよ。」
「いえ、データベースの見出しは、重複できないんです。」
「え?重複できないんですか。」
「ええ。だから、1日の出来事を思いついたときに記録するためには、時間の情報まで入れた方が使いやすいんです。」
「はぁ〜、よく考えてありますね。感心します。」
「いえいえ、身についてしまうんですよ。慣れですね。で、この日付と時間ですけど、今日の日付と、今の時刻がわかる関数が用意されています。『ToDay()』と『Now()』です。」
「うぷぷ、そのまんまですね(笑)」
「ええ、英単語ですからね(笑)。これを変数に代入します。」
「こんなものまで、変数に入れられるんですか?」
「はい。NS Basicでは、日付型と時刻型の2つが用意されています。」
「変数も箱で例えましたよね。箱が好きですね。」
「ははは。コンピュータがメモリーの集まりですから『入れモノ=箱』で説明しやすいんですね。さて、面白いのは、この日付と時刻、単純に文字列に変換すると、そのまま『2002/05/31』や『10:15:30』という文字列になるんですよ。」
「・・・どこが面白いんですか?」
「普通は、コンピュータ内の日付は『ある特定の日付を基準』として、経過した秒を考えているんですよ。」
「へぇ〜、何月何日、っていうわけじゃないんですね。」
「ええ、ちなみに、1904年1月1日の午前0時からの経過秒になるんです。」
「そりゃまた、昔のお話ですね。秒数って・・・」
「でも、これをStr()という関数で文字列に変換すると、秒ではなくて、年月日の形式になって返ってくるんですね。」
「・・・ふ〜ん」
「あ、適当に返事しましたね。ま、いいでしょう。要するに、

      D1=ToDay()
      D2=Now()

      strKey=Str(D1)+" "+Str(D2)

これだけで、書き込んだ日付と時刻をまとめた文字列ができる、ってことです。」
「ん?文字列って足し算できるんですか?」
「ええ、足し算だけできます。」
「なるほど。でも、どうして文字列にしたんですか?日付型や時刻型そのままでもいいんじゃないですか?」
「まぁ出来ないことはないんですが、文字列のほうが取扱いが容易なので、そうしています。」
「そういうモノなんですか?」
「そんなモノです。」
「わかったようなわからないような・・・次は、DbOpen()ですね。表紙を開いているんですね。あ、箱だからフタかな。」
「どちらでもよいですが、このDbOpen()はデータベースを操作する時のお約束でしたね。そして、次が書き込みです。

      res=DbInsert(Db,strKey,strData)

DbOpen()でデータベースを開いた後は、その時指定したDatabase型の変数は、こうやって操作の対象に使います。」
「確かに、DbOpen()は具体的なデータベースのファイル名が入っていたのに、こちらにはないですね。」
「ええ、そうです。この例だと『Db』という変数が、開いたデータベースファイルを表しているんです。」
「そうか、操作する箱が決まったら、名前は考える必要ないですね。」
「まぁ、そういうことですね。そしで、書き込みですが『変数』『見出し』『本文』を指定して書き込みます。」
「新しいカードに記入して、箱に入れているんですね。」
「そうです。そして書き込んだら、フタを閉じる。」
「DbClose()でデータベースを閉じるんですね。今回は、前回みたいにデータベースのエラーチェックは無いんですか?」
「これでエラーが出るようなら、ファイルが壊れているでしょうから、思い切って省略してみました。」
「手抜きですか?確か、見出しは重複してはダメなんですよね。重複していたらエラーになるんでしょ?」
「はい、一応エラーになります。」
「えっと、日付と時刻を見出しにしましたから、1秒以内に再度書き込みをしたら、同じ時間が出来ますよね?」
「鋭い!」
「あ、何だか1本取った気がして嬉しいです〜!勝ち負けで言うところの勝ちですね。」
「でも、そういう事態も考えてあるんですよ。」
「へ?」
「書き込んだ後に、Alert()が表示されますよね。『書き込みましたよん。』って。」
「はい。ありがちなダイアログですが、ありますね。」
「この画面が出たら、まず『了解』をタップするまで次に進まないでしょう?」
「そうか・・・でも『了解』を素早くタップして、次に書き込みをしたら1秒以内でいけそうですよ。」
「でもね、次に

      Field1004.text=""

ってあるでしょ?Field1004に書いてある内容をクリアしちゃうんですよ。」
「何もない文字を代入するとクリアなんですね。でも、クリアって一瞬ですよね。すぐに書き込みボタンをタップすれば・・・」
「それはどうでしょうか。何も入力していない日記は保存できましたか?」
「ああ!Len()でチェックしていましたね。何か1文字でも入れないと、先に進めない!」
「そうです。ついでに、書き込む前に『書き込んでも良い?』と確認しますから、いくらなんでも1秒以内に再書込みは出来ないでしょう。」
「参りました〜。ホントによく考えてありますね。ここまで考えているとは・・・本当に、私でもプログラムが作れるようになるでしょうか?ちょっと不安になってきました。」
「大丈夫です。少しずつ慣れていけば、パターンやコツがわかるようになりますからね。」
「ひとまず、信じることにします。」
「はい、じゃ、今回は書き込みができましたので、次回は、これらの情報を読み出すことにしましょう。」
「わかりました。」



copyright(C)2002 Hacker Dude-san all rights reserved.