AccessとLinux

中小企業での販売管理プログラムの作成についての所感

accdbの64bit化その後

2017年01月28日 09時41分16秒 | Weblog
1月12日にOffice2016(64bit)をインストールして、 Office2007(32bit)から移行を始めた。
当初、半年はかかると思っていたが、来週(1月30日)には1台本稼働できそう。
今後、数年かけて移行する最初の1台になりそうだ。

コードの修正もDeclare文はOffice2007と互換性を持たせるためにVBA7定数を使った形に修正した。
それ以外はその場に応じて、バグ対応が必要。

実際、バグについては使いながら直していく他ないのだが、昨日は1度止まっただけで、これなら使えるのではという印象。

バグと思われる主なところはこんなところだ。
1.OLEオートメ-ションがらみのところ
今はOLEオートメーションなんて言わないのかもしれないが、AccessからWord中のテーブルを操作すると動作が変だったりする。Word中のテーブルはExcelになっているらしく、途中で止まるとWordとExcelのプロセスが残っている。
具体的にはWord中のテーブルの行を続けて削除すると列幅が変わってしまい、ページからはみ出してしまう。また、Excelプロセスが残ってしまうので、続けて同一文書を作成するとテーブル操作時、エラーになってしまう。
仕方ないので、行削除しなくても良いように修正した。

2.フォームのタブストップが変
タブストップの動作が少し変だと思う。フォームヘッダーから詳細部に移動しなかったりする。
フォームヘッダーの最後のテキストボックスから強制的に詳細部に移動するようにした。

3.IMEの動作が変
テキストボックスやコンボボックスのプロパティでIMEモードの設定ができるようになっているが、この動作が設定通りにならない。半角数字を入力するコンボボックスで、プロパティではIMEを「オフ」設定しているのに「ひらがな」になってしまう。仕方ないので「フォーカス取得時」にコードでIMEをオフするように修正した。

4.フォームを開くときに落ちてしまうことがある
これは再現性がないので、どういった場合に落ちるのかよくわからない。フォームを閉じて瞬時に別フォームを開くと落ちてしまうことがあったり、メニュー(初期画面)からフォームをクリックした瞬間に落ちてしまう場合もある。これについては対応の仕方が思いつかない。
とりあえず、Hiddenで開いているフォームを閉じる時に、Doeventsを入れてみたのだが、落ちる回数が減ったように思う。

(2017/2/11
単価の新規登録。
フォームの開け閉めが原因で止まってしまうのかと思っていた。実際のところ、Docmd.Closeした後、Doeventsとか入れてみたが、あまり状況は改善されなかった。相変わらず新規登録した直後にコマンドボタンを押しただけでAccessが落ちてしまう。
試しに、単価マスターテーブルのリンクを張り直してみた。
何とこれだけで落ちなくなった。あ~、良かった。
2017/2/13
だめだ、、やっぱり直ってない。)

5.帳票フォームでテキストボックスのコントロールソースに自作した関数を使っていると落ちる
これはレコード件数が多い時。具体的には得意先名を略名で表示させるのに「株式会社」を「(株)」に変換していて、標準モジュールで作成した関数を使ってコントロールソースに設定している。
それも最初は落ちないのだが、続けて開くと閉じる時(?)に落ちる。件数としては500件くらいだと思う。件数が少ないフォームの開け閉めではこんなことはない。
これは、得意先マスターに略名フィールドを追加してコントロールソースに関数を使わないようにして対応した。

後はバグではないのだが、一応、対応しなければならないこととして。

1.フォームの描画が正確になったので、WindowsXPではわからなかったコントロール配置のズレがはっきり分かるようになった。元々作り方が悪かったので、仕方なくコントロールの位置を修正していく。

2.当面、Office2007(32bit版)とOffice2016(64bit版)が共存するので、両方に対応していかなければならない。
64bit版を32bit版に移動すると「参照設定」が変わっているのでエラーになる。Office2016では「Word 16」「Excel 16」を参照しているが、Office2007では「Word 12」「Excel 12」に戻してやらなければならない。


今まで、WindowsXPにこだわっていたが、今回、Windows10をインストールしてみて、ハードの対応が本当に楽で、改めてWindowsのありがたみが分かった。
今、そうでもないのだが、Linuxだとイーサネットドライバーが対応しているかいつも不安だったり、オンボードのグラフィック対応も半ば最初からあきらめていた。
WindowsXPではSATAに対応していないし、USB3.0に対応していない。3Tバイトのハードディスクも基本的に対応していない。メモリーも4Gバイトまで。Windows10についてはそんなことは何一つ心配ない。機器を購入して対応していないということもありえない。まあ、安心この上ない。

ただ、今後、心配なのは以前、Windows7に移行しようとして、しばらく使っていると動作が非常に遅くなり、再びWindowsXPに戻してしまったことがあった。今回もこんなことになるのかもしれず、その点は非常に心配だ。
今回、気が付いたのだが、同様の症状が出ていたWindows7 PCが、いつの間にか速度が普通に戻っていて、しかも新規に購入したWindows10 PCより速かったりする。よく我慢して使っていたものだと思うが、どこかのupdateの時点で直ったのだと思う。

また、Windows10のライセンス認証。128G SSD☓2個でWindows10をインストールしたものの、128Gで十分収まりそうだったので、Dドライブとして認識されているSSDをはずすと、起動しなくなった。あまり画面を詳しく見なかったのだが、「機器構成を見直すか?」といったような画面が表示されて、面倒だったのでSSDをまた元に戻した。
SSD、1個はずしただけで、ライセンスの再認証が必要になるようなら、当然のことながら最初の機器構成はよく考えておかなければならないだろう。

(2017/2/27
128GbyteのSSDカード2枚で構成していたがブートパーティションを間違ってDドライブにインストールしてしまっていた。
ブートに必要なパーティションはWindows10のインストール時には見えるのだが、Windows10を起動してしまうと見えなくなってしまう。なのでインストール後、Dドライブにインストールされているとは気が付かなかった。
使用されていないと思っていたDドライブを外してみて起動できないことで、初めてDドライブにブートハーティションがインストールされてるのがわかった。
SSD 2枚構成にしてしまったためこのようなことになってしまったが、今後は256GbyteSSD 1枚構成にするつもりなのでこのようなことが起こらないものと思う。
ちゃんとブートパーティションをCドライブにインストールした別のPCでは2枚目のSSDを取り外しても何ら問題なかった。)

もう一つ、今回、Windows10(64bit版)をインストールしたのだが、これまで使っていた32bit版のアプリケーションがほぼ全て動作する。どうかするとWindows Vistaにインストールできなかった「筆まめVer.10」まで動作する。すごい! 
また、Officeの64bit版に移行することに決めた大きな理由の一つとして、続けて出荷案内書を印刷するとメモリーを使いきってしまい(リソースが解放されず)Accessそのものがエラーを吐いて止まったり、大量の月末請求書を一度に印刷すると、罫線だけの請求書が印刷されたりした。
これはAccessが使用済みのObjectを解放していないか、WindoswXPのメモリー管理がうまくいっていないのではないかと思っていた。64bitOSで32bit版Officeを使う時WOW64で動作するのを疑心暗鬼に思っていたが、特に心配することなく32bit版Officeに移行すればこの問題も解決していたのかもしれない。今となっては確認もできないのだが。
(2017/2/1 月末請求書の一括発行。64bit版だと1回で印刷できた。
また、出荷案内書を連続印刷しても、「メモリーを使いはたした!」という類のエラーは出なくなった。)

Postgresql ODBCドライバー。「psqlodbc 09 05 0400-x64」をインストールした。サーバーのバージョンは9.4。ODBCドライバーもバージョンを揃えて、「09 04」をインストールしようとしたが、Windows10(64bit)にはインストールできなかった。

これまで書いてきたのは販売管理プログラム(ファイルサイズ150Mバイト)だが、ODBCを使っていない給与計算ソフトについては今月、給与計算しただけだが、全く落ちない。Declareしたところもないのでコード修正もなかった。給与明細等の発行はいつも通り行えた。こちらについてはAccess 2016(64bit版)に変更したのも気がつかない。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

コードの継続性

2017年01月26日 07時08分14秒 | Weblog
しかしまあ、64bit版accdb、直し直ししながらでも何とか使えるようになった。考えてみると「すごいな!」と思う。Office97で開発し始めたのが2000年だった。それからもう16年経った。未だに使えるのだから。

販売管理プログラムを作成する時、一番継続性があるのはサーバーサイドスクリプトでクライアントをブラウザにするタイプかと思っていた。この形だととても作る自信がなかったので、あきらめたのだが、結局のところこの形もさして継続性は期待できなかったと思う。標準ブラウザがころころ変わって、とても16年継続して使うのは無理だったろう。
2000年当時はIEが一番メジャーで、当時のバージョンのIEは今、全く使われないし、サポートもされない。
これから作るにしてもサーバーサイドスクリプトの継続性は短いか、常にメンテナンスしなければならないと思う。

もう一つの候補は、VisualBasicだった。VBもOffice同様、Microsoftが絶対にサポートする環境のはずだったのだが、やはりこの16年の間に.NETに移行した。当時、VBでは伝票の印刷に別途OCXを購入しなければうまくいきそうになかった。自腹でOCXの購入は負担が大きかったので、この形も採用できなかった。今、考えると、VBにしなくて本当に良かったと思う。.NETに移行するということは全部作り直すことだから。
VBは結局exeファイルが実行できさえすればよいのだろうが、exeファイルならWindows10でも動作するだろう。一方、OfficeのVBAはユーザーが自分で作成して使うのが普通なので、VBAコードとしてサポートしなければならないところが、継続性の差になっていると思う。

結局、一番安上がりで、書くコードの量が少ないOffice VBAが一番、継続性があった。よく似たVBのような.NETへの大幅な変更といったようなことはなかった。mdbからaccdbに移行する時はレポートに何だか変な線が1本入っただけで、移行にそんなに苦労した記憶がない。今回64bit版に移行するのに苦労しているところだが、とりあえず多少直せば動くわけで、2000年当時に書いたコードがそのまま使える。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Access accdbファイルの64bit化

2017年01月19日 07時31分49秒 | Weblog
しかしまあ、びっくりするくらいよく落ちる。
Office2007(32bit版)accdbをOffice2016(64bit版)に移行しようとしているのだが、、、
一応、DeclareしたところはPtrSafeを付けて起動するようにはなったのだが、使ってみてビックリ!

元々この販売管理プログラムはOffice97 mdbで作成したものをOffice2007に移行する時、accdbに変換したものだ。今回、念願の64bit化。
まだ、あまり試していないのだが、あまりにもよく落ちるので、取り敢えず動作が変なところをメモ。

1. フォームを閉じる時、開く時に落ちる
データを登録してフォーム閉じるのだが、データは登録されているがフォームを閉じる際、落ちてしまう。また、落ちなくても即座に別フォームを開く時、いきなり落ちる。
別フォームを閉じないで最初のメニュー画面からそのフォームを開くと落ちない。
hiddenしているフォームを閉じて、同時に表示しているフォームを閉じる場合も落ちることがある。
どういった場合に落ちるのかよくわからない。
ただ、フォームを閉じて即時に別フォームを開こうとすると落ちるように思える。

2. Setfocusの動作変
別フォームからフォームを開いてコードでSetfocusできるのに、自フォームからSetfocusしようととするとエラーになる。
これがまたよくわからないのだが、フォームヘッダーでEnterしてもTABオーダーを無視して、詳細部にフォーカスが移動してしまったりする。
フォームヘッダーにある数個のテキストボックスを変更しないでEnterだけ入力すれば、TABオーダー通りにフォーカスされるのに、途中テキストボックスの内容を編集するとEnter入力後、詳細部にフォーカスが移動してしまう。このフォームは連結フォーム。

原因は全くわからない。おっそろしく不思議。
ちょっと試してみようと思うのは、Doeventsを入れたらどうなるか。
フォームを閉じる時、即座に続けて別フォームを開こうとすると落ちてしまうのは同期処理されていないのかと、思ってしまう。また、フォームを開いてSetfocusが通らないのも、フォームが開き終わる前にSetfocusしているのではないかと思えたりもする。
ネットで調べても、Accessで非同期処理というとクエリーが終了する前 に次の処理に入ってしまうといったことくらいで、フォームの開け閉めについての記事はないようなので本当に不思議だ。

(2017/1/25
Doeventsはあまり関係なさそう。むしろフォーム内のテキストボックスのコントロールソースに標準モジュールで定義した関数を使ってるとエラーになってしまう。得意先一覧の社名を省略名に変更する関数を使ってコントロールソースにしていると、何度かそのフォームを開け閉めしているとエラーになる。仕方ないので得意先マスターに予め省略した略名フィールドを追加した。)

(2017/1/30
やはりDoeventsを入れるのは有効だ。あるフォームから別フォームに移動して、テキストボックスでIMEを「オフ」に設定しているのに、「カナ」になってしまう。フォーム移動後、Doeventsを入れて、テキストボックスに移動、コードでIMEをオフにする。Doeventsを入れないとうまく動作しなかった。)

3.Word中の表の行をVBAから削除する場合。例えば4行不要な行を削除する場合、1回目の削除は成功するが、2回目削除すると全列幅が大きくなってしまう。
 
4.得意先一覧の社名などで標準モジュールで定義した関数を使用したコントロールソースを設定すると止まる場合がある。いつもではないところが不思議。(2017/1/25)

5.IME 入力モードの動作が変
「カナ」入力を指定していても、「英数」になったり、「オフ」になっていたりする。動作が不確実、はっきりした再現性がない。(2017/1/26)
コンボボックスにフォーカスが移動すると、IME入力モードが「オフ」に設定していても「ひらがな」になってしまう。
(2017/1/26)

6.テキストボックスの「境界線スタイル」の表示が変
「境界線スタイル」と「透明」にしていても「実線」表示される。
(2017/1/30)

7.一度フォーカスを失うと、その後、setfocusが通らない。
(2017/2/23)


64bit化への道は遠いなあ。

ーーーーーーーーーーーーーーーーーーーーーーーーーー
2017/1/24

あれから一週間、なんとなく落ち着いてきた。
もちろん「3」の場合は行削除しないようコードの修正もした。
また、tifをダブルクリックしてshellからois.exeで開いていたが、Windows10にはois.exeが含まれていないので、下記のようにした。

#If VBA7 Then
Shell "C:\Windows\System32\rundll32.exe " & """C:\Program Files\Windows Photo Viewer\PhotoViewer.dll"", ImageView_Fullscreen " & フルパスのファイル名, vbNormalFocus
#Else
Shell "OIS.EXE " & フルパスのファイル名, vbNormalFocus
#End If

もう直ぐ月末なので、月末請求書が一度に印刷できるか試してみる。


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Microsoft Officeの64bit化

2017年01月15日 09時08分16秒 | Weblog
64bitOSはもう一般的で、PC購入時にも特に指定しないかぎりは64bitOSになる。一方、Microsoft Officeの64bit版はまだまだ導入する時期ではないのかと思っていた。指定すれば64bit版Officeが選択できるとは言え、Microsoft自身が32bit版を推奨しているし、敢えて64bit版をインストールするのも気が進まなかった。
また、推奨されている32bit版は64bitOSではWOW64で動作するというのもいただけなかった。

最近、 WindowsXPがインストールできなくて、 VitualBoxを使ってそれなりに使える環境を整えたところだったが、32bit版Accessでは以前からかかえていた問題があった。
月末、請求書を一度に印刷すると、後半罫線だけになってしまい、3回に分けて印刷している。 また、 受注伝票を続けて印刷していると、「メモリを使い果たした!」というエラーメッセージが出て、販売管理システムを再起動し直さなければならなかったりする。
この、問題は以前からかかえていて、あきらめて使っていた。 受注伝票修正するとエラーメッセージが出て、登録されていた受注データが消えていたりする。Setしたオブジェクトはちゃんとnothingしている。どうもDoCmd.OpenReport後、メモリが解放されていないようだ。原因はわかってはいるものの、Accessそのものの問題なので、手の施しようがなかった。この件は64bit版のOfficeを使えば解決するのではないかと考えていた。

Vistaが発売された時、 64bit版が同時発売されていた。 XPも64bitが出ていたので、 Officeも含めて一気に64bit化が進むものと思っていたのだが、Windows7辺りからOSは64bit化したものの、Officeは当面32bit版を推奨という状態だった。

今回、 64bit版のOfficeを調べてみて、 もう導入してもいい時期になったのではないかと思った。
Linux+VirtualBox+WindowsXP+Office2007(32bit)
はそれとして、
Windows10(64bit)+Office2016(64bit)
を試してみることにした。

32bitのaccdbを64bit化しようとすると、 一部コードを書き換えなければならない。
32bit版Officeでも動作するようコンパイル定数VBA7で判断してDeclareするように変更した。
PtrSafeを追加して、引数のポインタはLongからLongPtrに変更した。 また、参照設定しているbioPDFは64bit版をダウンロードしてきた。 その他nmailのdllも64bit版に変更しなければならないのかもしれないが、 現在その部分のコードは使っていないので、 32bit版のままにした。 PostgreSQLのodbcドライバはもちろん64bit版をダウンロードした。

取り敢えずこれだけの変更で64bit版で動作するようになった。 これでメモリ使い果たしのエラーが出るものかどうか確認する。
もし、再度エラーが出るようなら8Gバイトのメモリを16Gに増やしてみようと思う。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
今回、 Windows10+Office365 Soloをインストールしてみたが、 Office365をインストールする時、相変わらずデフォルトでは32bit版になっていた。 やはりまだ、32bit版を推奨している状態は変わっていないのだろうか。実際、コードを修正しなければならないわけだから32bit版を推奨するのは仕方ないのかもしれない。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする