fc2ブログ

レコードセットの並び順でドツボにはまった!

顧客管理ソフト「T&A顧客管理」を開発中です。
完成したら、無料で配布します。

予期しない動きのせいで、丸1日ドツボにはまりました。
(ソフトを開発していると、よくあることなのですが・・・)

新しい顧客の登録テストを行っていましたが、登録出来ているはずなのに、アプリを再起動すると消えているのです。
しかし、元のデータベースのテーブルを確認すると、ちゃんと存在しているのです。

当然私のプログラムにバグがあるのだと思い、何度もチェックしましたが、分かりません。
その日は結局最後まで原因が分からず帰宅しました。
こういう時は自宅でも、このことが頭から離れません。
寝床に入ってからも、寝付くまでずっと考えていました。

翌朝、やっと原因に気づきました!
通常新規追加したデータは、テーブルの最後に追加され、実際にテーブルを見ると最後に存在しています。
それがフォームを再表示すると、最後に無いのです。
しかしそれは、消えたり読み込みできていなかった訳ではなく、別の場所(順番)に存在していたのです。

私のプログラムは、Microsoft Accessで作成しており、複数の作業者(PC)でデータを共有して作業をしやすいように、データベースとアプリは別にしており、ADO方式でデータベースと接続しています。
その場合、レコードセット(テーブルの複製みたいなもの)を作成してフォームと連結し、フォームからデータを追加したり更新したりできるようになります。

テーブルから作成されたレコードセットのデータの順番がテーブルの順番と変わるということは、まさか想像していませんでした。
因みにネットで検索しても、同様の情報は見つかりませんでした。
これはあくまでも私の推測ですが、今回の顧客テーブルの主キーのフィールドの型がオートナンバー型で、新しくデータを追加すると自動で連番が付与されます。
このテーブルの中のデータを削除した場合、その席が空席になり、レコードセット場合は新しいデータがその席に座らされるのだと思います。
もしかしたら、これはADOのバグかもしれません。

いずれにしても原因が分かり、やれやれです。
レコードセットをOpenする時に、主キーのフィールド(連番)順に並べ替えるようにプログラムを修正しました。

ソフトを開発していると、壁にぶち当たって時間が掛かることがよくありますが、一晩寝て頭をリセットすると解決することもよくあります。


スポンサーサイト



theme : プログラミング
genre : コンピュータ

accdeファイル作成で苦労した原因はACCESSのバグだった!

約1年半ぶりのブログ更新です。

AccessでのPC-POSレジ開発もいよいよ販売準備段階になっており、配布するためのaccdeファイルを作成しようとしていました。
まずは、セットアプリの「商品管理」の方を試しました。
すると、accdeファイルはエラーも無くすんなり作成できたのですが、起動するとデータベースに接続できていませんでした。
accdbファイルの場合はちゃんと接続できているのに何故か?例によってインターネット検索しました。
今回のアプリは、データベースにADOで接続する設計にしていますが、その場合、通常はADOライブラリの参照設定を追加してプログラミングしますが、見つかった情報によると、参照設定しない方法でコーディングしないとaccdeでは動かないらしいので、その部分を変更しました。
その結果、無事accdeでも動くようになりました。

それで次にPOSレジの方も同様に変更し、accdeを作成しましたが、今度はそれでもデータベースに接続できていませんでした。
仕方なくまたネットに頼り、3つくらいの方法が見つかったので、それを全て試しましたがだめでした。
自分なりに商品管理とPOSレジのコードを比較し、いろいろ変えてみましたが、だめでした。

困りました。ソフト開発をやっていると、いつも壁に突き当たります。その壁を乗り越えて、ソフトがうまく動いたときに得られる達成感が大きいので、この仕事が好きなのですが、壁を乗り越えられない間は、寝床に入っても考えることが多く、常に頭の中はそのことで一杯です。

自分の持っている知識と経験で解決できない時は、結局他人の知識・経験に頼らざるを得ません。なので、再度WEB検索です。
ネットで検索する場合、日本語の単語を入力して探すことが多いと思いますが、その場合、検索結果に出てくるサイトは基本的には日本国内のサイトです。所詮日本は小さい国で、日本国内の情報も「井の中の蛙」です。
英単語だけで検索すると、アメリカのサイトの情報がいろいろ出てきます。この時代便利なのは、英語のサイトでも自動翻訳してくれます。おかしな日本語訳も時々ありますが、だいたいは内容を理解できます。
やはり日本より人口も多くパソコンを使っている人も多く、Accessで開発している人も多いので、同様の問題で困っている人の質問サイトも多くありました。
日本のサイトで示されていることと同じ方法を示している人も多かったのですが、読んでいるうちに見つかった内容が、「空のSubルーチンを削除したら解決した」というもので、それをやって解決したので、お礼を書いている人が一杯いました。
そして私もそれをやりました。そうしたら何と、accdeでもちゃんと動きました!
何という解決法でしょう?Microsoftには「ええかげんにせえよ!」と言いたいです。

明らかにAccessのバグです。
私の開発環境は、Win7Pro x64 Office 2010 Pro x86で、サービスパックも適用しています。
販売用は、Win10Pro x64 Office 2019 Proなので、Access 2019でもAccdeを作成してみましたが、だめだったので、このバグは現在も残っているバグだと思われますが、日本でももっと騒がれてもよさそうな問題のはずなのに、日本のサイトには一つも無かったことが逆に不思議でした。それだけAccessで開発している人が減ったということでしょうか。

何はともあれ、大きな壁をまた一つ乗り越えられ、ほっとしました。

theme : プログラミング
genre : コンピュータ

タブコントロールでキー入力イベントが発生しない!?

商品管理ソフトではタブコントールを使って、[商品検索]画面と[新規入力]画面を切り替えています。
[商品検索]で検索キーワードを入力し[検索実行]ボタンをクリックすると検索結果を表示できます。
ただここでも、マウスを使わずキー入力で検索実行できた方が早いので、ショートカットキーを設定しようとしました。
しかしここで問題発生です。

フォームの[キーボードイベント取得]を「はい」に設定してあるのですが、キー入力イベントが発生しないのです。
見落としがないか何度もコードをチェックしましたが、ありません。
そこでいつものようにWEBを探したところ、同じ問題を指摘している記事がひとつだけ見つかりました。
Microsoftフォーラムでの質問で、どうもAccess 2010ではこの問題が起こり、2007では起こらない模様です。
私の開発環境も2010です。
しかし結局、解決方法は載っていませんでした。

しかたがないので、他の方法で目的を達成することを考えることにしました。

検索タブの中の一部のテキストボックスでは、数字しか入力を受け付けないようにKeyPressイベント・プロシージャを使っており、同じ機能を別モジュールでもよく使うので、標準モジュールに記述し呼び出していますが、ちゃんと機能していました。
ということは、標準モジュールを使い関数的に作ればうまくいくかもしれないと思い、やってみたら正解でした。

theme : プログラミング
genre : コンピュータ

開いたフォームがアクティブにならない

現在運用中のPOSレジソフトを少し変更することにしました。
従来は、販売処理完了後メッセージボックスを表示させ、確認後レジ画面を初期化していたのですが、
メッセージボックスは小さくて目立たないので、新しくフォームを作りそこにお釣りを表示させることにしました。

それ自体簡単なことなのですが、問題が発生しました。
メッセージボックスの時はそれがアクティブになっていたのに、フォームに変えたらアクティブにならないのです。
アクティブだとキー入力を受け付けますが、そうでないと受け付けず、マウス・クリックが必要となるのです。
レジ処理はできるだけ迅速に行う必要があり、できるだけマウスを使わずにキー操作でできるように設計しています。
だからまずいのです。

VBAからではなく単純にフォームを開くと、当然ですがそのフォームがアクティブになります。
メインフォームのVBAからそのフォームを開くとアクティブにはならないのです。

いろいろ試行錯誤し考えた結果、フォームを開く元のイベントがGotFocusだったからということに気づきました。
メイン・フォームのコントロールがフォーカスを取得したときのイベント・プロシージャで他のフォームを開いてもフォーカスは移るはずがありません。

ということで、別のイベント(キー入力)プロシージャに処理を移し、そこから開くようにしたらアクティブになりました。
私よりも上級のプログラマーなら当たり前の話かもしれませんが、意外な落とし穴でした。
何より私は、独学・自己流プログラマーなもんで...
何事も経験が重要ですね~

theme : プログラミング
genre : コンピュータ

アプリ独自リボンを追加

「Access VBA リボン カスタマイズ」等のキーワードで私もいろいろ調べましたが、あまり分かりやすいサイトは見つかりませんでした。
そこで、備忘録を兼ねて解説したいと思います。

「リボン」は、Office 2007から採用されたもので、従来のサブメニューとツールバーを合体させたものです。
私も含めOfficeを2003以前から使われていた人は、2007でこのリボンに変わり、自分が使いたい機能がどこに行ってしまったのか分からず、苦労された方も多いのではないでしょうか。(私もそうでした)

前回の記事で紹介した「商品管理」アプリにも独自リボンを追加しています。
独自リボン

まず、USysRibbonsというシステムテーブルを作成します。
システムテーブルは普段非表示になっているので、表示させる必要があります。
この部分の詳しい手順は、マイクロソフトの「リボンをカスタマイズする」にあります。

次に、このテーブルのRibbonXMLフィールドにXML文を記述します。
先述のサイトにもある程度XML文についての説明やサンプルがありますが、VBAモジュールとの対応などもっと詳しく説明した日本語サイトが無く、探していたら、英語サイトが見つかりました。

文全体がcustomUIタグでくくられ、その子供がribbonタグで、その子供がtabsタグで、その中にtab id、group id、button idタグが入れ子になっています。
tab idタグのlabel=で指定している文字列が新しいタブの名前です。
私のソフトでは、「マスター管理」と「設定」がそれになります。
タブの中を仕切ってグループを複数作れます。
group idタグのlabel=の部分がグループ名となります。
「マスター管理」タブの中に「仕入先」と「商品分類」のグループを作りました。
button idタグの中のlabel=がボタン名で、imageMso=がアイコンの名前(種類)です。
そしてbutton id=で指定されている文字列が、VBAの標準モジュールのMyButtonCallbackOnActionプロシージャの中で記述されているSelect Case文の各Caseで指定されている文字列と対応します。
ボタンをクリックするとそのCaseの命令が実行されるわけです。
従ってtab id、group id、button idに重複は許されません。

最後にアイコンの名前ですが、何でもよいわけではなく、存在するアイコンの名前を指定する必要があります。
2007 Office System Add-In: Icons Galleryからダウンロードし実行すると、C:\2007 Office System Developer Resources\2007OfficeIconsGalleryにOffice2007IconsGallery.xlsmが作成されます。
そのExcelファイルを開き、開発タブをクリックするとGallery 1~9までのアイコンがあります。1~3までは普通サイズ、4以降はスモールサイズのアイコンです。
好きなアイコンをマウスポイントするとそのアイコンの名称が表示されるので、それを先のXML文のimageMso=で指定します。

以上で一応完成ですが、補足情報として、VBAのコードを実行させるのではなくOffice標準のコマンドを実行させたい場合は、
2007 Office System Document: Lists of Control IDsからダウンロードし展開すると、複数のExcelファイルができますが、AccessRibbonControls.xlsxを開くと英語ですが各コマンドの記述法が表になっています。
(やはりソフト開発にはある程度の英語力が必要ですね)

theme : プログラミング
genre : コンピュータ

プロフィール

tasys

Author:tasys
FC2ブログへようこそ!

カレンダー
プルダウン 降順 昇順 年別

09月 | 2023年10月 | 11月
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 31 - - - -


最新記事
最新コメント
カテゴリ
天気予報

-天気予報コム- -FC2-
フリーエリア
検索フォーム
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード