☆ Amigo databaseを用いたWEBデータベース 

 20年以上温めてきた構想を、ついに現実のものとする日が近づきつつあります。

database.jpg

 農作物に発生する病害虫被害について、その原因を突き止める診断・同定作業には大変な手間と忍耐を要します。高度な知識・技術と豊富な経験が必要とされるため、これまで多くの方が事例集を欲しながらも、なかなか手が付けられませんでした。そこで、農作物被害の背景や診断過程といった、ありのままの全容をWEB上で公開するという、大胆な事例データベースを開発することこそが、私が以前から温めていた構想でした。

 WEBデータベースのような動的コンテンツには、CGI(common gateway interface)という仕組みが必要ですが、そのためには、CGIスクリプトというプログラムとその設置を許可するサーバーが必要です。

 素人でも、柔軟かつ高度なスクリプトが書ける無料ソフトは数少なく、結局たどり着くのが、Amigo databaseと言われています。そして、CGIを許可する容量無制限の無料レンタルサーバーも極めて少ないのです。

 さて、作業はまだ途中です。業務にきちんと取り込んでいけるよう、来年度に向けて一つずつ課題をクリアしていきたいと思います。

☆ findfirst 該当事例の検索

2、3日悩んでいたエラー処理が無事解決しました。

コンピュータのプログラミングって、ボーリングと同じで、ストライクを取るより、レアケースのスプリットの方が難しいんですよね。。。

seisekimenu.jpg

つまり、順当な手順で処理している分には、きわめて単純な処理の流れなのですが、エラーは珍しい操作の場合にこそ起こりうるわけで、そこまで想定して対応するかどうかでプログラムの難易度も変わっちゃうんですよね。

該当者jpg

今回のケースでは、該当者がいない事を想定していないプログラムだったので、いない場合の回避ルーチン(バイパス)を設けます。

レコードセットに対し、Findfirstで該当レコードを検索し、If rs.NoMatchで分岐処理すればいいことはすぐ分かったのですが、Findfirstメソッドが有効なのは、レコードセットをダイナセットもしくはスナップショットで開く場合だそうです。

dbOpentable ではなく、dbOpenDynaset に書き換えたらうまくいきました。

☆ 学籍簿管理システム

私が、リレーショナルデータベースACCESSのプログラミングコードVBA(Visual Basic for Applications )を用い、1997年から1年以上をかけて開発した○○県○○大学校の学籍簿管理プログラムは、1999年度から12年間稼働し続けました。

20121023.jpg

2000年春に私が異動して去った時には、まだ90%程度の完成度にすぎなかったこのプログラムは、後任とさらにその後任の2名によって地道にバージョンアップされ、プログラマーとしては全くの素人に過ぎなかった私の、無謀とも思えたチャレンジは、思いも寄らない形で、カリキュラムを支え続けました。

常に心の中に、「あのプログラムはどうなったのかな?」との思いがありました。とうの昔に忘れ去られていたと思っていたのに、12年ぶりに再会したプログラムは、今年の春まで稼働し続けていたそうです。しかし、今年度の新入生からのコース制そのものの大幅な変更によって、停止を余儀なくされていました。

誰がこのプログラムを最初に作ったのか、わからなくなっていたそうなのです。涙が出るほどうれしかったとともに、これは、運命の再会に違いないと思いました。

中のコードを読み解いていくと、当時のことが鮮明によみがえってきます。業務の合間をぬって、新しいカリキュラムに対応すべく、大幅改修にチャレンジすることとしました。

☆ 更新時の確認処理 (BeforeUpdate)

新規データの追加や既存データの修正など、データを更新する際、うっかりミスで、間違ったデータを入力してしまったりすることがあります。

そこで、入力処理をするユーザーに、データの更新をするかどうか確認を促し、更新しない場合は、書き換えしないで元のデータのままするか、更新する場合は変更したデータを保存する分岐処理をすることが重要です。

フォームの更新前イベントに以下のようなコードを記述します。

なお、「vbCrLf」は、改行を指示する定義語です。

Private Sub Form_BeforeUpdate(Cancel As Integer)

Dim Ret As Integer
Ret = MsgBox("データが更新されています。保存しますか?" _
& vbCrLf & "" & vbCrLf & "は い → データを更新(修正・新規追加)し、保存します。" _
& vbCrLf & "い い え → データを更新(修正・新規追加)せずに、変更前のデータにします。" _
& vbCrLf & "キャンセル → 編集画面に戻ります。", vbYesNoCancel, "データ更新の確認です")

Select Case Ret
 Case vbCancel
 Cancel = True
 Case vbNo
 Me.Undo
End Select

End Sub

FI2620380_1E.jpg

☆ 単語検索(あいまい検索)

住所録において、分野別の検索、単語検索、チェックを付けた物のみの3つの条件を順列組み合わせで使用し、検索する方法です。

ここでは、単語(キーワード)を含むレコードを検索する部分を表示しておきます。

単語検索のボタンをクリックすると、条件入力用のポップアップフォームが開きます。

Private Sub cmd_lookup_Click()

If Me.cmd_lookup.Caption = "検索解除" Then
 If Me.cmd_class.Caption = "分野選択" Then
 If Me.cmd_confirm.Caption = "チェックのみ" Then
 DoCmd.ShowAllRecords
 Else
 DoCmd.ApplyFilter , "check_box = on"
 End If
 Else
 If Me.cmd_confirm.Caption = "チェックのみ" Then
 DoCmd.ApplyFilter , Me.txt_choice_class
 Else
 DoCmd.ApplyFilter , "(" & Me.txt_choice_class & ") And " & "check_box = on"
 End If
 End If
 Me.cmd_lookup.ForeColor = 16711680
 Me.cmd_lookup.Caption = "単語検索"
 Me.cmd_lookup.ControlTipText = "入力した単語を含むレコードを絞り込みます"
 Me.cmd_lookup.StatusBarText = "入力した単語を含むレコードを絞り込みます"
 Me.txt_keyward.Value = ""

Else

 DoCmd.OpenForm "frm_lookup", , , , , , 1

End If

End Sub


FI2620374_1E.jpg

条件入力された単語を含むレコードを、抽出します。
抽出後は、元の単語検索ボタンが検索解除ボタンとして赤く表示されます。

もちろん、検索解除ボタンに変身しましたので、ココをクリックすると、全てのレコードが表示されます。

また、右隣の分野別ボタンやチェックのみボタンを使えば、更に、絞り込むことが出来ます。

Private Sub cmd_lookup_start_Click()
On Error GoTo Err_cmd_lookup_start_Click

If IsNull(Me.txt_name1) Then
 MsgBox ("入力して下さい")
 Me!txt_name1.SetFocus
Else
 Dim db As Database
 Dim rs As Recordset
 Set db = CurrentDb
 Set rs = db.OpenRecordset("tbl_address", dbOpenDynaset)

 rs.FindFirst "name1 like '" & "*" & Me.txt_name1 & "*" & "'"

 If rs.NoMatch Then
 MsgBox ("該当するレコードはありません")
 Else
 Me.Visible = False
 Screen.ActiveForm!name1.SetFocus
 Screen.ActiveForm!txt_keyward.Value = Me.txt_name
 If Screen.ActiveForm!cmd_class.Caption = "分野選択" Then
 If Me.OpenArgs = 1 Then
 If Screen.ActiveForm!cmd_confirm.Caption = "チェックのみ" Then

 DoCmd.ApplyFilter , "name1 like '" & "*" & Screen.ActiveForm!txt_keyward & "*" & "'"
 Else

 DoCmd.ApplyFilter , "name1 like '" & "*" & Screen.ActiveForm!txt_keyward & "*" & "' And " & "check_box = on"
 End If

 Else
 DoCmd.ApplyFilter , "name1 like '" & "*" & Screen.ActiveForm!txt_keyward & "*" & "'"
 End If

 Else

 If Me.OpenArgs = 1 Then

 If Screen.ActiveForm!cmd_confirm.Caption = "チェックのみ" Then
 DoCmd.ApplyFilter , "name1 like '" & "*" & Screen.ActiveForm!txt_keyward & "*" & "' and (" & Screen.ActiveForm!txt_choice_class & ")"

 Else
 DoCmd.ApplyFilter , "name1 like '" & "*" & Screen.ActiveForm!txt_keyward & "*" & "' and (" & Screen.ActiveForm!txt_choice_class & ") and check_box = on"
 End If

 Else
 DoCmd.ApplyFilter , "name1 like '" & "*" & Screen.ActiveForm!txt_keyward & "*" & "' and (" & Screen.ActiveForm!txt_choice_class & ")"
 End If

 End If

 Screen.ActiveForm!cmd_lookup.Caption = "検索解除"
 Screen.ActiveForm!cmd_lookup.ForeColor = 255
 Screen.ActiveForm!cmd_lookup.ControlTipText = "検索(絞り込み)を解除します"
 Screen.ActiveForm!cmd_lookup.StatusBarText = "検索(絞り込み)を解除します"

 DoCmd.Close acForm, "frm_lookup"
 Screen.ActiveForm!cmd_lookup.SetFocus

 End If

End If

Exit_cmd_lookup_start_Click:
 Exit Sub

Err_cmd_lookup_start_Click:
 MsgBox Err.Description
 Resume Exit_cmd_lookup_start_Click

End Sub

FI2620374_2E.jpg

☆ ACCESS DAO(データ・アクセス・オブジェクト)

データベースとは、必要なときに必要な情報だけを抽出出来ることが最も重要なわけで、この「検索機能」こそがデータベースの心臓部になります。

具体的には、ユーザーに検索条件(または抽出条件)の入力を促し、当該データを単票か帳票の形式でデータ表示する・・・という手順になります。

写真には、入力条件を入れる白抜きのテキストボックスが一つしかありませんが、通常は複数の項目が任意に入れられるようにしておくのが便利でしょう。

例えば3項目であれば、無・無・有~有・有・有の7通りの組み合わせになるので、コード自体はかなり複雑になりますが・・・。(無・無・無だと、一つ以上条件を入力して下さいのエラーメッセージ表示を行う。)

しかし、もし、肝心の該当データがない場合は、フォームを開かずにしたいものです。
つまり、事前に該当データがあるかどうかを判別する必要があります。

そこで、一連のレコードセットを準備して該当データを探し出すという作業を、パソコンのメモリー上で瞬時に行ってしまうわけです。あった場合だけ次の処理に移行。

このようにデータそのものを直接扱うことが出来るのが、DAO(データアクセスオブジェクト)です。

DAOが扱えるようになると、プログラムの流れを作るのも、かなり楽になります。反面、なかなか理解するまで時間がかかるものなのですが・・・・。


FI2620336_1E.jpg

画面の「コード」は、ポップアップ表示された検索条件入力フォームの「検索」(開始)ボタンをクリックした際に実行されるクリックイベントです。

プログラムの大筋は、それほど複雑ではないのですが、前述のように、テキストボックスに何も入力しないまま「検索」を実行すると、入力を促すエラーメッセージを表記させるなど、細かい気配りが必要になってきます。さらには、マウスをそのボタン上にあわせただけで、ヒントテキストが表示されるようにしたり、いろいろと細かい設定が出来るんですね。(これは、DAOとは別の話ですが・・・)

「’」以降の緑色の文章は解説ですが、どんなサンプルコードを見ても、全ての行に書いてある事例はほとんど無いと思います。

だからVBA初心者は苦労するんですよね~・・・(私もそうでした)

FI2620336_2E.jpg

☆ ACCESS レポートをデザインビューで開く

住所録データベースなどにおいて、郵送のために封筒にダイレクト印刷をする場合があります。

しかし、プリンターを変えたり、封筒の印字枠が変わった場合などは、デザインを変えなければなりません。

微妙なずれであれば、余白ミリ数の設定で修正するプログラムで対処できますが、レポートをデザインビューで開いて修正した方が、大幅な変更にも対処できます。

写真は、レポートをデザインビューで開いた状態です。


FI2620322_1E.jpg

2枚目の写真は、VBAで記述したプログラムです。

レポートをデザインビューで開くと、OepenArgsの引き渡しや、様々な制御ができません。

そこで、まず、ポップアップフォームを開いてから、レポートをデザインビューで開き、画面いっぱいに表示されるよう、Docmd.maximizeを実行します。


FI2620322_2E.jpg

このポップアップフォームは、レポートに先だって開くため、レポートの裏側に隠れる形になります。

このポップアップフォームを閉じる操作を加えることで、不可視にしていたメインメニューを再度表示させる、つまり、ポップアップであるメインフォームに戻れるようにします。


FI2620322_3E.jpg

こちらは、封筒のサイズを選ぶ画面です。

定形の角形2号・長形3号・長形40号の差出人の有無と、ラベルが選択できます。
FI2620322_4E.jpg

[More...]

☆ 1200通の通知発送!

5月29日に本格施行されるある制度を知って頂くため、急遽、1200通もの通知を出す事になりました。

こんな時のためにこそ、リレーショナルデータベース「ACCESS」を用い、VBAでプログラミングした「宛名印刷システム」が役に立ちます。

レーザープリンター2台に、インクジェットプリンター1台の計3台であっという間に封筒にダイレクト印刷できました。

滞りなく無事印刷できましたが、何かあったときのために、ID番号を印刷しておきました。もし、途中で印刷が出来なかった場合は、抜け落ちたID番号を確認し、追加印刷すればいいからです。


☆ 一年を振り返って(リレーショナルデータベースACCESS)

ライフワークとなった感のある「データベースアプリケーションソフト開発」ということで、これまた、細く長く取り組んでいく「趣味?」の一つが、マイクロソフトのリレーショナルデータベースソフトACCESSのVBA(Visual Basic for Aapplications)によるプログラミングです。

 17年度は、「宛名印刷システム」と「○○使用履歴集計システム」の2本を完成できたし、多少は業務改善に役立ちそうです。

 情報をデータベース化し活用する事の意義は、多くの方にも何となく理解されているとは思いますが、いざ、やってみようとなるとなかなか敷居が高いのも事実。

 まして、アプリケーション開発となると難しいイメージがつきまといますが、わかってくるととても面白い・・・。時として手段が目的になってしまいそうな気もしますが、業務改善にどう役立てていくかを見据えながら進めていくと、プログラム開発も夢のある作業になります。

 よ~し、エキスパート目指してがんばるど~!

☆ おすすめサイト「魔法使いの開発工房」

データベースソフトと言えば、なんと言ってもマイクロソフトのACCESSですね。

 ACCESSに関するサイトはそれこそ無数にありますが、超初心者にも分かりやすく大変人気のあるサイトがこの「魔法使いの開発工房」です。

 もっと前から知っていたら、もう少し楽に習得できたかな・・・。

 管理人「ニキータ」さんのコメントには、しみじみと共感出来る部分が多いです。

 サイト全体に渡ってニキータさんの優しさがにじみ出ているのですが、あえて、数少ない「きびしい」コメント部分を引用してみます。

<<わたしはms-excelとms-accessを比較するのは嫌いです。無意味だと思ってます。「excel覚えたから次access~」と言う人も嫌いかも。>>

とか、

<<わたしは、データベースっていうものは、その会社の資産だと思ってます。 ms-accessを使うためにデータベースを作ろうとしてしまうと、多分、accessは、いつまでたっても不便でわかりにくいものだと思う。 会社の資産を管理するための仕組みを、ms-accessで作ろうとしているのです。 どんな小さなものでも、どうでもいい(とご本人が言う)ものでも、たった1件の情報でも、会社の資産です。 その自覚を持つことができない人は、ms-accessを使う資格はないと思います。>>

 という言葉は、漠然とした「憧れ」だけでは、データベースの製作は上手くいかないということを的確に表現しているなぁと思います。

 私も、リレーショナルデータベースだからこそ出来るであろう「業務改善」に、ささやかな「夢」を抱きながら、何年もかけて独学でデータベースとAccessのVBAを学んできました。だから、上記の言葉の意味が実感として理解できます。

 リレーショナルデータベースは確かに難しいです。 でもやはり、ニキータさんが言うとおり、誰でも「魔法使い」になれるんですよ。その気になればね。

[魔法使いの開発工房]


☆ Access VBAによる検索

百数十カ所の資材系の使用履歴を集計するため、データベースシステムを開発しました。

 期間や、使用資材名、等々、単独~複数の条件で絞り込み(フィルタリング)が出来るよう、条件入力フォームを作製し、VBAでプログラムを記述しました。


以下、コマンド行です。

Dim str1, str2, str3, str4, str5, str12345 As String
Dim strSQL As String
str1 = IIf(IsNull(txt_startDate), 0, 1) ''' 以下同様
str12345 = str1 & str2 & str3 & str4 & str5

If str12345 = "00000" Then
 MsgBox "一つ以上条件を入力して下さい", vbOKOnly, "確認"
 Me!txt_startDate.SetFocus

Else
 If Not IsNull(txt_startDate) Then
 strSQL = "[年月日] >= " & "#" & Format(txt_startDate, "yyyy/mm/dd") & "#" & ""
 End If

 If Not IsNull(Me.txt_endDate) Then
 If strSQL = "" Then
 strSQL = "[年月日] <= " & "#" & Format(txt_endDate, "yyyy/mm/dd") & "#" & ""
 Else
 strSQL = strSQL & " and [年月日] <= " & "#" & Format(txt_endDate, "yyyy/mm/dd") & "#" & ""

 End If
 End If

''' 以下、条件入力のテキストボックス毎に同様の記述

FI2380781_0E.jpg

Me.Visible = False
 DoCmd.ApplyFilter , strSQL

 If Screen.ActiveForm.Recordset.RecordCount = 0 Then
 MsgBox ("該当するレコードはありません")
 End If
End I

FI2380781_1E.jpg

☆ ACCESS トグルボタンの活用法! (VBAは楽し!)

かつては、ビジネスソフトの3種の神器といわれた「ワープロ、表計算、リレーショナルデータベース」ですが、関数や、せいぜいマクロで十分に役に立つ表計算ソフトと違って、データベースを使いこなすのは容易ではありません。

 マイクロソフトACCESSの場合、専用プログラミング言語「VBA:Visual Basic for Apprication」を駆使してアプリケーションソフト開発までたどり着かないと、使い勝っては良くないんですね・・・。

 画像は、住所録管理や宛名印刷ができるシステムとして構築したアプリのトップメニュー画面です。


FI2152384_0E.jpg

住所録の中から、特定の分野だけを抜き出して表示したい事ってありますね。そんなときには、通常、チェックボックスやトグルボタンでグループを指定するのが便利です。

 しかし、トグルボタンは、オプショングループ化されたグループ内で一つだけが押下されるのが通常です。 複数選択するためにはどうしたらいいか・・・。チェックボックスは、ここでは使いたくないし・・・。

 そこで、オプショングループ内のトグルボタンを1つとし、オプショングループそのものを多数作ることにしました。数は30個ありますが、現在登録されている分野だけを表示させるという優れもの・・・。

 for next構文で、いったん全てのボタンのvisible(可視)をFalse(非表示)にし、登録されているものだけTrueにするのです。もちろん、Tabstopも同様。

 クリックイベントで、IF文を用い、Optionvalueやforecolorを交互に変更します。そして、フォームに非表示のテキストボックスを作っておいて、そこにトグルスイッチから得られたvalueを代入させるわけ。


FI2152384_1E.jpg

分野選択フォーム(画面)の非表示テキストボックスに代入した、データは、フォームを閉じずに非表示にすることで、別のフォームから参照できるようにしておきます。

 作業の流れは、メインメニュー → 分野の選択 → 住所録一覧表示 → 封筒の選択 → 印刷設定画面 → 印刷実行という流れになります。

このとき、フォームを開く時の「OpenArgs」によって、必要な情報を受け渡していきます。

FI2152384_2E.jpg

☆ 裏技! データベースの市町村名変更方法

業務などで、住所録をACCESS等で作成している方は多いでしょう。ところが、市町村合併に伴う住所変更は頭の痛いところです。番地まで一つのフィールドで管理しているとお手上げ状態。しかも、町村は郡名の記入が有ったり無かったりで統一が取れていない・・・。

 でも、そんなときはテーブルをテキストファイルでエクスポートし、一太郎等のワープロソフトで読み込んで、「検索・置換」を行います。(6/8追記 : Exelに置換機能があるため、わざわざ一太郎にする必要は無いとのことです)

 まず、郡名町村名を、新しい市名に置換します。次に変換されなかった町村名だけのデータを新しい市名に置換します。注意点は、住所以外のフィールドの固有名称に、市町村名が含まれている場合、変換されてしまう危険性がある点ですね。ただし、市・町・村まで含まれる固有名称は少ないでしょう。

置換できたら、インポートでテーブルに変換します。念のため、元のテーブルは残しておきましょう。古いテーブルの名称を変更し、新しいテーブルは名称を引き継ぎます。そうすることでフォーム等のデータ元は新しいテーブルの方で参照されます。

(追記:確認したら、ExelにもACCESSにも、置換機能はありました・・・恥)

 データベースの設計は最初が肝心です。根本的には、郵便番号と番地の二つの項目だけで管理していた方が楽ですね。郵便番号から、最新の町名や字名までは表示・印字出来るからです。

 注)追記、郵便番号だけではどうやら上手く管理出来なさそうです。Hiyohiyoさんからの情報

[More...]

カレンダー


03月 | 2017年04月 | 05月
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

月別 降順 昇順 年別


最新コメント

カテゴリ

  • 模型等創作(1093)
  • オーディオ・ビジュアル(240)
  • 映画・音楽評(420)
  • 書籍紹介(222)
  • 写真(168)
  • 日曜大工(119)
  • 農と自然(304)
  • 車・バイク(152)
  • プログラミング(13)
  • その他(408)
  • 未分類(0)

最新記事

最新トラックバック

検索フォーム

プロフィール

RX5

Author:RX5
「いつかは・・・」が口癖になっていませんか? その「いつか」は、なかなか来ないものです。まずは、一歩を踏み出しましょう!

リンク

RSSリンクの表示

ブロとも申請フォーム

QRコード

QRコード

カウンター

Copyright © RX5