SQLiteについてのイメージ

代表的な日本語プログラムでは各種データベースを扱うことが出来ます。今回は「なでしこ」「プルデル」の両方に梱包されているSQLiteについてのイメージを少し書きます。
SQLはデータベースを扱うために独立した言語で、使用しているプログラムの中からSQLを呼び出す形で指示を与えて使います。SQLは独立した言語なので是非覚えましょう。今回紹介するSQLiteはパソコン単体で使用することが出来るデータベースでSQLの入門学習に適しています。
今回は日本語プログラムを対象にしていますが、PHP等の他言語でも使い方は同じです。

(以前私が改造したサンプルプログラムはこちらを参考にしてください。)

ここでは表計算ソフトの画面コピーを使いながらイメージだけ掴んでください。SQLについてはネット上に詳細な解説が大量にあるのでそちらを参考になさってください。

プロデルにはサンプルが用意されています。プロデルを標準的にインストールをした場合、サンプルは「C:\Program Files (x86)\Produire\サンプル」フォルダの中にあります。

SQLのサンプルは「C:\Program Files (x86)\Produire\サンプル\データ操作\データベース」に存在しています。
SQLサンプルフォルダ

今回使用するサンプルプログラムは「プロデルでSQLite.rdr」です。
——————————ここから
1    //
2    //サンプルは「プロデルでSQLite.rdr」
3    //
4    //
5    // プロデルからSQLiteデータベースを操作する例 //
6    //SQLiteを利用するには、System.Data.SQLite.dllが必要です
7
8    「Produire.Data.SQLite.dll」を利用する
9    SQLiteというSQLiteデータベースを作る
10
11    SQLiteのデータソースを、「database.db」に変える
12    SQLiteへ接続する
13
14    テーブルを作成する
15
16    データを取得する
17    データを追加する
18    データを更新する
19    データを削除する
20
21    テーブルを破棄する
22
23    SQLiteから切断する
24
25
26
27    テーブルを、作成する手順
28         ーーテーブルの作成
29         SQLiteで「CREATE TABLE 楽曲 (
30              曲名 TEXT,
31              アーティスト TEXT,
32              アルバムID NUMBER);」を実行する
33    終わり
34
35    データを、取得する手順
36         ーーデータの取得
37         SQLiteから「SELECT 曲名,アーティスト FROM 楽曲」を取得して結果とする
38         「初期状態」として結果の内容を情報アイコンで表示する
39    終わり
40
41    データを、追加する手順
42         ーーデータの追加
43         SQL文は、「INSERT INTO 楽曲 (曲名,アーティスト) VALUES (?, ?)」
44         バインド値は、{「I am your singer」、「サザンオールスターズ」}
45         SQL文をバインド値としてSQLiteで実行して、件数1とする
46
47         バインド値は、{「勝手にシンドバット」、「サザンオールスターズ」}
48         SQL文をバインド値としてSQLiteで実行して、件数2とする
49
50         ーー内容の確認
51         SQLiteから「SELECT 曲名,アーティスト FROM 楽曲」を取得して、結果とする
52         「追加後」として「[件数1+件数2]件、追加しました。[改行][結果の内容]」を情報アイコンで表示する
53    終わり
54
55    データを、更新する手順
56         ーーデータの更新
57         SQL文は、「UPDATE 楽曲 SET 曲名=? WHERE 曲名=?」
58         バインド値は、{「I AM YOUR SINGER」、「I am your singer」}
59         SQL文をバインド値としてSQLiteで実行して、件数とする
60
61         ーー内容の確認
62         SQL文は、「SELECT 曲名,アーティスト FROM 楽曲 WHERE 曲名=?」
63         バインド値は、{「I AM YOUR SINGER」}
64         SQLiteからSQL文をバインド値として取得して、結果とする
65         「更新後」として「[件数]件、更新しました。[改行][結果の内容]」を情報アイコンで表示する
66    終わり
67
68    データを、削除する手順
69         ーーデータの削除
70         SQL文は、「DELETE FROM 楽曲 WHERE アーティスト=?」
71         バインド値は、{「サザンオールスターズ」}
72         SQL文をバインド値としてSQLiteで実行して、件数とする
73
74         ーー内容の確認
75         SQLiteから「SELECT 曲名,アーティスト FROM 楽曲」を取得して、結果とする
76         「削除後」として「[件数]件、削除しました。[改行][結果の内容]」を情報アイコンで表示する
77    終わり
78
79    テーブルを、破棄する手順
80         ーーテーブルの破棄
81         SQLiteで「DROP TABLE 楽曲
——————————ここまで

各行ごとに適当に解説

8行目 「Produire.Data.SQLite.dll」を利用する
頭のコメント欄に書いてあるように使用するDLLを指定します。
プログラム言語が、最初から使わないものを組み込んでおくとサイズばかり大きくなるために使用する時に呼び出す使い方をします。

9行目から12行目まではそのまま使用します。

9    SQLiteというSQLiteデータベースを作る
10
11    SQLiteのデータソースを、「database.db」に変える
12    SQLiteへ接続する

11行目の「database.db」の名前は分かりやすいものに変更してください。サンプルを動かす場合は、そのままでも構いません。(同じ名前のファイルが存在した場合エラーになります。)ここまでの作業を表計算ソフトに例えれば、表計算ソフトを起動するまでの手順です。

起動
表計算ソフトならこんな状態。

14    テーブルを作成する
テーブルを作成する手順(オブジェクト)を呼び出します。(27行目から33行まで)

27    テーブルを、作成する手順
28         ーーテーブルの作成
29         SQLiteでCREATE TABLE 楽曲 (
30              曲名 TEXT,
31              アーティスト TEXT,
32              アルバムID NUMBER);を実行する
33    終わり
テーブルを作る
表計算ソフトに例えるならこんな状態です。2行目は無視してください。

データベースに新しいテーブルと属性を指定します(表計算ソフトに例えるとシート名と各列名と列の属性を指定します。)

テーブル名 = シート名
項目名   = 列名

この列は後からでも増やしたり減らしたりすることが出来ます。ここではテーブルの中に3つの列を作成しました。1列目は「曲名」、2列目は「アーティスト」、3列目は「アルバムID」が作成されます。

16    データを取得する

楽曲テーブル(楽曲シート)が出来たのでデータを読み込みます。この段階ではデータは空です。

35    データを、取得する手順
36         ーーデータの取得
37         SQLiteから「SELECT 曲名,アーティスト FROM 楽曲」を取得して結果とする
38         「初期状態」として結果の内容を情報アイコンで表示する
39    終わり

データを取得
表計算ソフトなら色のついた部分に条件に合ったデータが読み込まれるイメージです。(今回の例では空です。)

17    データを追加する

楽曲テーブル(楽曲シート)にデータを追加します。

41    データを、追加する手順
42         ーーデータの追加
43         SQL文は、「INSERT INTO 楽曲 (曲名,アーティスト) VALUES (?, ?)」
44         バインド値は、{「I am your singer」、「サザンオールスターズ」}
45         SQL文をバインド値としてSQLiteで実行して、件数1とする

楽曲テーブルで設定した項目名「曲名」と「アーティスト」に追加するデータ(値)を入れます。

値1, 値2= VALUES (?, ?)

VALUES (?, ?)にバインド値を設定します。バインド値とは対応する値を割り当てることで、この場合(曲名、アーティスト)となります。追加する項目の数だけ()の中が増えます。

実際に追加するデータを44行目でバインド値を指定し、45行目でSQLに渡します。

追加
表計算ソフトならデータが追加されたイメージです。

46
47         バインド値は、{「勝手にシンドバット」、「サザンオールスターズ」}
48         SQL文をバインド値としてSQLiteで実行して、件数2とする

47行目で新たなバインド値を設定してデータを追加します。

2つ目追加

表計算ソフトならデータが更に追加されたイメージです。

50         ーー内容の確認
51         SQLiteから「SELECT 曲名,アーティスト FROM 楽曲」を取得して、結果とする

51行目で、曲名とアーティストを楽曲テーブルから読み込み、見つけたデータを「結果」にセットします

52         「追加後」として「[件数1+件数2]件、追加しました。[改行][結果の内容]」を情報アイコンで表示する
53    終わり

結果表示

結果の内容を画面に表示します。

55    データを、更新する手順

データの内容を変更する場合にデータの更新をする必要があります。

56         ーーデータの更新
57         SQL文は、「UPDATE 楽曲 SET 曲名=? WHERE 曲名=?」
58         バインド値は、{「I AM YOUR SINGER」、「I am your singer」}
59         SQL文をバインド値としてSQLiteで実行して、件数とする

57行目のUPDATEで 楽曲テーブルの中にある曲名を変更する指示をします。どんなデータを更新するのかはWHERE 曲名=?で指定します。

バインド値で「新しい値」、「古い値」を指定してSQLを実行します。

更新
表計算ソフトならこんな感じでしょうか?

SQL文として書くと次のような感じです。

  1. データベーのス(以下、DB)を最初に作り接続する。
  2. DBの中にテーブルを作る。
  3. DBの中にテーブルにデータを書き込む。
  4. DBの中にテーブルに入っているデータを変更する。
  5. DBの中にテーブルに入っているデータを削除する。
  6. DBの中にテーブルを破棄する。
  7. DBとの接続を切断する。

1.最初に「枠の名前.db」というデータを入れる枠(グループ)を作ります。平たく言えばグループ名ですね。(このサンプルでは「database.DB」)
これは只の枠(グループ)なので、実際データを入れる場所はテーブルとして枠(グループ)の中に別途に作成します。枠(グループ)の中には複数のテーブルを作ることが出来ます。通常は枠(グループ)を消すことは無いので最初に1度枠を作れば済みます。今から枠を使うよ!という合図が「接続する」の意味です。(あくまでも日本語プログラム向けに大胆に大雑把な説明です。)

2.実際にデータを入れる場所(テーブル)を作ります。
SQL文では以下のように書きます。
CREATE TABLE 楽曲 ( 曲名 TEXT, アーティスト TEXT,アルバムID NUMBER)

3.テーブルの中にデータを書き込みます。
SQL文では以下のように書きます。
INSERT INTO 楽曲 (曲名,アーティスト) VALUES (?, ?)
バインド値は、{「I am your singer」、「サザンオールスターズ」}

4.テーブルの中のデータを更新します。
SQL文では以下のように書きます。
UPDATE 楽曲 SET 曲名=? WHERE 曲名=?
バインド値は、{「I AM YOUR SINGER」、「I am your singer」}

5.テーブルの中のデータを削除します。
SQL文では以下のように書きます。
DELETE FROM 楽曲 WHERE アーティスト=?
バインド値は、{「サザンオールスターズ」

6.テーブルを破棄します。
SQL文では以下のように書きます。
DROP TABLE 楽曲

日本語プログラムについて

日本語プログラムはパソコンを使って(スマホ用は出来ない)プログラムを覚え始めるにはハードルが低い言語だと思っています。特にコンピューター言語に関する理解を深める時に、日本語で考えられることは重要な機会です。
(日本語プログラムには「なでしこ」「プロデル」「MIND」等があります。)

 

「なでしこ」はオフィス製品と連動させる時にはかなり強力です。表計算の入力や集計などを目的としているのであれば「なでしこ」のほうが向いているような気がします。日報入力のような業務をしているのであれば、便利につかえるのではないでしょうか。また、MS製品だけでなくOpenOffice.org系(OOO)とも連携しています。
ネットワークに資料が多いので安心して入門できます。

 

「プロデル」は、「なでしこ」よりもプログラム言語としての構造がしっかりしているようです。オブジェクト指向のプログラムを書くことが出来、MSオフィス製品との連携も出来るようです。
まだ学んでいる最中なので何とも言えないのですが、SQLについての取り扱いは「なでしこ」よりも「プロデル」のほうが分かりやすいかもしれません。また、他言語を意識しているらしく、プロデルは他言語に進むための最初のステップとして良い選択かと思います。

 

「MIND」は日本語プログラムとしては最も古いものです。約35年間バージョンを重ねてきて言語として完成されています。2017年の春に突然フリーになりました。それまでは有料でかなりお高かったのですがw。MINDの場合ネットワーク関係も含め大規模な開発まで出来ます。(スマホ関係の開発もアンドロイドなら可能。)
プログラムの能力は安定性も含めかなり高いのですがコンピュータの基本を知らないと難しいかも知れません。今まで有料だったために資料がネットに少ない(ほぼ無い)。他言語に詳しい人が導入するには良いのではないでしょうか?
MINDの場合、有料の講習があります。「Windows版」と「Linux版」があります。

先日の続き、表に出来ました

先日、「プロデルでこんな事を実現したい」と書いた。その後、プロデル開発者の「ゆうとさん」に同様の質問をさせていただいたところ、「データ表」を使う事で実現できるとのお返事をいただきました。
ゆうとさん、感謝!感謝!です。

そこで、こんなサンプルを作ってみました。

データ表

——————————ここから
//
// CSVファイルを読み込みデータ表として表示
//
//

データというデータ表を作る

メイン画面を表示する
待機する

メイン画面とは
ウィンドウを継承する

はじめの手順
初期化する
データ表を作ってデータとする
データへ「data.csv」から読み込む // 郵便番号データ

表部品1のデータ表をデータに変える // ここでデータ表にセット

終わり
初期化する手順
この内部領域大きさを{442、258}に変える
この内容を「表部品のテスト」に変える
このドラッグドロップを○に変える
ラベル1というラベルを作る
その内容を「ラベル1」に変える
その位置と大きさを{259、16、39、12}に変える
テキスト1というテキストを作る
その位置と大きさを{12、13、241、19}に変える
表部品1という表部品を作る
表部品1を初期化開始する
その位置と大きさを{12、38、418、208}に変える
その位置固定方向を「右+左+下+上」に変える
表部品1を初期化終了する
終わり

表部品1のセルがクリックされた時の手順
ラベル1の内容は、「[イベントの行],[イベントの列]を選択中」
テキスト1の内容は、表部品1の選択セルの内容
表部品1の選択行を表示。

終わり

テキスト1のキーが入力された時の手順
もしイベントのキー番号が13なら
表部品1の選択セルの内容は、テキスト1の内容
もし終わり

終わり
終わり
——————————ここまで

プロデルのデータ表とは何ぞな?

ところで、データ表に関する理解がまだ曖昧なので、自分が現在理解している範囲で書いてみた。間違っている可能性はあるが恐らくこのような感じ。
データ表イメージ

多分このような感じ、まだまだ色々なことが出来そうなのだけれど機能が多すぎて見つけ切れていない。

タブページのサンプルを修正してみた

プロデルのサンプルフォルダの中にあるサンプルには途中でエラーが発生するものがある。バージョンが上がることで動作が安定しなくなるのは一般的なので修正してみた。
今回の修正は一行のみ
タブページのサンプル

——————————ここから

ーータブページのサンプル
メイン画面を表示する
待機する

メイン画面とは
     ウィンドウを受け継ぐ

     はじめの手順
       初期化する
     終わり

     初期化する手順
     //この手順は自動生成されたものです
     //編集しないでください
          この内部領域大きさを{292,266}に変える
          この内容を「タブページのサンプル」に変える
          このドラッグドロップを○に変える
          この位置と大きさを{15,15,300,300}に変える
          挿入ボタンというボタンを作る
               その内容を「挿入」に変える
               その移動順を2に変える
               その位置と大きさを{205,12,75,23}に変える
          ラベル1というラベルを作る
               その内容を「タブを追加してください」に変える
               その移動順を3に変える
               その位置と大きさを{12,42,106,12}に変える
          タブフレーム1というタブフレームを作る
               その見出しサイズを{62,17}に変える
               その移動順を4に変える
               そのドラッグドロップを○に変える
               その位置と大きさを{12,57,268,197}に変える
          減らすボタンというボタンを作る
               その内容を「減らす」に変える
               その移動順を2に変える
               その位置と大きさを{93,12,75,23}に変える
          増やすボタンというボタンを作る
               その内容を「増やす」に変える
               その位置と大きさを{12,12,75,23}に変える
               その移動順を1に変える
     終わり

     タブフレーム1が選択された時の手順
          もしタブフレーム1の個数が0なら、抜ける
          ラベル1の内容は、「[タブフレーム1の選択タブの番号]番目が選択されました」
     終わり

     増やすボタンがクリックされた時の手順
          追加タブは、タブフレーム1へ「タブ」を追加したもの
          メモ部品は、追加タブへ文章テキストを作ったもの
          メモ部品の内容は、「メモです」
          メモ部品のドッキング方向を全体に変える
          もし減らすボタンの有効が×なら、減らすボタンの有効を○に変える。
     終わり

     減らすボタンがクリックされた時の手順
          もしタブフレーム1の個数が1以上なら
               タブフレーム1から(タブフレーム1の選択タブ)を消す
          もし終わり
          もしタブフレーム1の個数が0なら、減らすボタンの有効を×に変える。
     終わり

     挿入ボタンがクリックされた時の手順
          選択タブは、タブフレーム1の選択タブ
          もし選択タブが無なら、抜ける
          メモ部品は、選択タブの1番目
          メモ部品の内容は、「[メモ部品の内容][時刻]」

     終わり
終わり

—————————— ここまで

これが正解なのかはわからないけど、エラーを起こすことは無くなった。

修正して時刻が入るようになった

プロデルでファイルを読み表示

サンプルプログラムの順序が逆になってしまったが、プルデルで単純にファイルを読んで画面にテキスト領域に表示する方法を出していなかった。

ファイルを読む
ファイルを読み表示することが出来なければ何も先に進まないので書いておく

——————————ここから

//データを読み込む
データ表を作ってデータとする

データは、「data.csv」から読み込んだもの

メイン画面を表示する
待機する

メイン画面とは
ウィンドウを継承する
はじめの手順
初期化する
ーー貼り付けた部品に対する操作をここに書きます

テキスト領域1の内容を,データに変える

終わり
初期化する手順
ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
この内部領域大きさを{852,530}に変える
この内容を「メイン画面」に変える
ボタン1というボタンを作る //——————————– 終わり
その位置と大きさを{770,493,60,25}に変える
その内容を「終了」に変える
その移動順を1に変える
テキスト領域1というテキスト領域を作る
その位置と大きさを{29,23,801,450}に変える
終わり

ボタン1がクリックされた時の手順
終了する
終わり
終わり

——————————ここまで

こんな事をプロデルで実現したい

日本語プログラムには「プロデル」以外にも「なでしこ」や「MIND」がある。歴史が最も古い「MIND」が今年から無償となりもしかしたら今後話題になるかもしれない。

私は「なでしこ」を業務を簡略化するために数年前から使っているので思考ベースがどうしても「なでしこ」になってしまい。「なでしこ」にある機能を使いたい欲が出てくる。
プロデルで、このようなことを行いたいと考えている。

今回は「なでしこ」のサンプル

郵便番号のCSVファイルを読み、グリッド表示する

CSVファイルを読んでグリッドに表示
ぐりっとのターゲット行をクリックしたときにその内容を表示

このプログラムのサンプル

——————————ここから

##
## なでしこでCSVファイルを読みグリッドに表示する
##
「{デスクトップ}data.csv」を開いてCSV取得
住所に代入

#グリッドに表示してみる

郵便住所グリッドとはグリッド
郵便住所グリッドのアイテムは住所
そのダブルクリックした時は~
  それは郵便住所グリッドのテキスト
  A=それ\0,4
  B=それ\0,5
  「A={A}{~}B={B}」を言う

——————————ここまで

プロデルでCSVファイルを扱うとき

プロデルでCSVファイルを扱うときにデータ表というものがあり
私はデータ表=スープレッドシートの表だろうと自分勝手に考え、
自分なりの方法で色々とやってみたのだけど全く上手くいかない。
これでは自分が作りたいものが作れない・・困った

結局のところデータ表を一覧にして、レコード毎に取得すれば
出きることが分かったので、こんなサンプルを書いてみた。

データは郵便番号の東京都のデータを[data.csv]として使用した。

郵便番号データダウンロード – 日本郵便
www.post.japanpost.jp/zipcode/download.html
各種郵便番号データのダウンロードはこちらからどうぞ。

プロデルCSV読み込み01

レコード番号を入れてみる
CSVから読み取った

——————————ここから

/*
CSVファイルを読み込み検索した表示(画面)
*/

新しいウィンドウを表示する
待機する

新しいウィンドウとは
     ウィンドウを継承する
     はじめの手順
          初期化する
          ーー貼り付けた部品に対する操作をここに書きます
          //行番号=1
          データ表を作ってデータとする
          データへ「data.csv」から読み込む
          一覧は、データの一覧

     終わり
     初期化する手順
     ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
     この内部領域大きさを{470,434}に変える
     この内容を「メイン画面」に変える
     テキスト領域1というテキスト領域を作る
          その位置と大きさを{36,274,404,85}に変える
          その移動順を17に変える
     終了ボタン2というボタンを作る
          その位置と大きさを{373,386,67,25}に変える
          その内容を「終了」に変える
          その移動順を15に変える
     行番号というテキストを作る
          その位置と大きさを{162,37,60,19}に変える
          その移動順を8に変える
     検索ボタン1というボタンを作る
          その位置と大きさを{255,32,46,20}に変える
          その内容を「検索」に変える
          その移動順を7に変える
     ラベル1というラベルを作る
          その位置と大きさを{36,36,65,12}に変える
          その内容を「レコード番号」に変える
          その移動順を16に変える
     都道府県ラベルというラベルを作る
          その位置と大きさを{36,68,53,12}に変える
          その内容を「都道府県」に変える
          その移動順を1に変える
     住所ラベルというラベルを作る
          その位置と大きさを{36,96,29,12}に変える
          その内容を「住所」に変える
          その移動順を2に変える
     番地ラベルというラベルを作る
          その位置と大きさを{36,131,29,12}に変える
          その内容を「番地」に変える
          その移動順を3に変える
     都道府県かなラベル2というラベルを作る
          その位置と大きさを{36,165,73,12}に変える
          その内容を「都道府県かな」に変える
          その移動順を4に変える
     住所かなラベル2というラベルを作る
          その位置と大きさを{36,198,49,12}に変える
          その内容を「住所かな」に変える
          その移動順を5に変える
     番地ラベル2というラベルを作る
          その位置と大きさを{36,230,49,12}に変える
          その内容を「番地かな」に変える
          その移動順を6に変える
     テキスト1というテキストを作る
          その位置と大きさを{162,68,98,19}に変える
          その移動順を9に変える
     テキスト2というテキストを作る
          その位置と大きさを{162,96,279,19}に変える
          その移動順を10に変える
     テキスト3というテキストを作る
          その位置と大きさを{162,131,279,19}に変える
          その移動順を11に変える
     テキスト4というテキストを作る
          その位置と大きさを{162,165,98,19}に変える
          その移動順を12に変える
     テキスト5というテキストを作る
          その位置と大きさを{162,198,279,19}に変える
          その移動順を13に変える
     テキスト6というテキストを作る
          その位置と大きさを{162,230,279,19}に変える
          その移動順を14に変える
終わり

     検索ボタン1がクリックされた時の手順
          行番号1=行番号の内容
          行番号1の内容を表示する
          レコードは、一覧(行番号1)
          //レコードを報告する

          テキスト1の内容を「[レコード(7)]」に変える
          テキスト2の内容を「[レコード(8)]」に変える
          テキスト3の内容を「[レコード(9)]」に変える
          テキスト4の内容を「[レコード(4)]」に変える
          テキスト5の内容を「[レコード(5)]」に変える
          テキスト6の内容を「[レコード(6)]」に変える
          テキスト領域1の内容を「[レコード]」に変える

     終わり

終了ボタン2がクリックされた時の手順
          終了     
     終わり
終わり

-—————————ここまで

字を教えて欲しいといってきたので

4歳になる娘が、字を教えてほしいといってきたので、
どうせすぐ飽きるだろうと思いつつも、毎晩教えていた。

ある日、娘の通っている保育園の先生から電話があった。
「○○ちゃんから、神様に手紙を届けてほしいって言われたんです」
こっそりと中を読んでみたら、
「いいこにするので、ぱぱをかえしてください。おねがいします」
と書いてあったそうだ。
旦那は去年、交通事故で他界した。
字を覚えたかったのは、神様に手紙を書くためだったんだ・・・
受話器を持ったまま、私も先生も泣いてしまった。

「もう少ししたら、パパ戻って来るんだよ~」
最近、娘が明るい声を出す意味がこれでやっとつながった。

娘の心と、写真にしか残っていない旦那を思って涙が止まらない

VIPPERな俺 : たまには感動するコピペを貼らないか? (via picapixels)