伊藤清徳の垂直落下式ムーンサルトプレス

PerlとかPHPとかMySQLとか...がんばっても8割だ。

Category: なでしこ (page 3 of 3)

なでしこからFilemakerへODBC接続

このところFilemakerのなでしこプラグインが出てから、
楽しくなってしまってなでしこばっか触ってます(^-^;



ということで、なでしことFilemakerの連携を考えてODBC接続してみました。

※このページはなでしこプラグインとFilemakerの連携ではなく、
 本家なでしこアプリケーションとFilemakerの連携を想定していますのでご注意ください。

※ODBC接続は、なでしこプラグインでも使えることを確認しました!!
 これチョ~~~~便利!!!

幸い、なでしこにはADO接続機能が備わっているので、比較的簡単に接続ができます。
以下説明はFilemaker9を想定していますが、8、8.5でもOKだと思
います。(多分)

8、8.5はドライバーのバージョンが異なるので、
なでしこの命令に書き込むドライバーの名前が変わることが分かりました。

8.5では「5.5」の部分を「5.4」とバージョンの番号を書き換えるだけで動作しました。
残念ながら8は持っていないので試してません。


また、以下説明はデフォルトの管理者権限を利用しますので、
ユーザーの設定を細かく行っている場合は、都度設定が必要です。

Filemakerの準備

まずFilemakerデータベースをODBC接続できるようにします。

ODBC接続したいデータベースファイルを開き、
メニュー → ファイル → 共有設定 →ODBC/JDBC
をクリックします。

こんな設定ダイアログが出ます。

「現在開いているファイル」の項目で設定したいファイルが反転されているのをチェックしたら、
「ファイルへのODBC/JDBCアクセス」の項目の
「アクセス権セットによってユーザーを指定」のラジオボタンにチェックを入れます。

ラジオボタンにチェックを入れると自動でこんなダイアログが出ます。
もし、出なかったら、「指定」ボタンを押すと表示されます。
このダイアログの「[完全アクセス]」の左のチェックボックスにチェックを入れ、
「OK」をクリック。

共有設定のダイアログの「OK」も押したら、設定完了です。

ちなみに、FilemakerのODBC接続は、Filemakerが起動している状態で、なおかつ、
ODBCの接続設定をしたファイルを起動しておかなければなりません。
注意してください。
(なんて面倒なんだ!!!)


ODBCドライバのインストール

FilemakerのODBCクライアントのインストールについては、
FilemakerのインストールCDに詳細な説明がありますので、そちらをご覧下さい。
一般的なWindows環境で管理者権限ユーザーを使っているならば、
ドライバ用のインストーラーを走らせるだけでOKなはずです。


なでしこでプログラミング

多くのFilemakerへのODBC接続の説明書は、
windowsのODBC管理ツールを使ってDSNの設定を行うのがよいと書いてありますが、
せっかくプログラミングして、単体アプリケーションとして動かすのだから、
わざわざDSNを設定するのは個人的にどうかなぁって思いますので、
WindowsのODBC管理ツールを使わないプログラミング方法です。


connectstrは『DRIVER=DataDirect 32-BIT SequeLink 5.5;
Host=127.0.0.1;
Port=2399;
ServerDataSource=データソース名;
UID=ユーザー名;
PWD=パスワード;』。

connectstrでADO開く。
sqlは、「INSERT INTO "テーブル名" ( "コラム1" , "コラム2" ) VALUES ( '値1' , '値2' )」
sqlで、SQL実行。
DB閉じる。

1~7行目で、ODBCを介したFilemakerへの接続について定義します。

・1行目
DRIVER=DataDirect 32-BIT SequeLink 5.5
はODBCドライバの名前を定義します。
Filemaker9を利用している場合は、上記の通り「DataDirect 32-BIT SequeLink 5.5」ですが、
Filemaker8.5を利用している場合は、「DataDirect 32-BIT SequeLink 5.4」とする必要があります。
インストールしたODBCドライバのバージョンによって最後の数字が変わりますから、
注意してください。

・2行目
Filemakerが実行されているコンピュータのホストを設定します。
通常であれば「127.0.0.1」か「localhost」で大丈夫なはずです。

・3行目
ポート番号を指定します。
「2399」固定です。

・4行目
「ServerDataSource=データソース名;」
「データソース名」のところに、ODBC接続設定をしたファイル名から拡張子を取り除いたものを指定します。
たとえば「test.fp7」というファイルに接続したい場合は「test」と指定します。

注意しなければならないのは、日本語や半角スペースの入ったファイル名です。
これらのファイル名は、そのまま入れたのではうまく動かず、
ファイル名から拡張子を取り除いたものをUTF-8でURLエンコードし、
さらにエンコードした文字列のアルファベットはすべて大文字でなければならない。
というとっても厄介な仕様になっています。

たとえば「日本語 ですよ.fp7」というファイルに接続するのであれば、

「%E6%97%A5%E6%9C%AC%E8%AA%9E%20%E3%81%A7%E3%81%99%E3%82%88」と指定します。

あまり日本語に関して考慮されたシステムではないのかもしれません…orz

・5・6行目
ファイルに設定したユーザーとパスワードを指定します。
このページの通りに設定を行ったのなら、ユーザー名は「admin」パスワードは空欄となります。

8行目以降は、データベースへ接続し、データを操作、そしてデータベースへの接続を切断するという手順です。

・8行目
ここまでで設定した内容で「ADO接続。」命令を出すと、接続します。
実行時ここでエラーがでた場合は、ここまでの設定に誤りがあるか、
ODBCドライバのインストールに失敗している可能性が高いので、
見直してみましょう。

・9・10行目
ここは変数にSQL文を代入し、その変数を使って「SQL実行」命令を使ってSQL文を実行しています。
このあたりは、SQLについて説明した参考書などをご覧下さい。

なお、一般的なSQLから逸脱した構文として、テーブル名・フィールド名が日本語の場合、
それらを「"(ダブルクォート)」でくくってやらなければならないので注意しましょう。
この点はFilemakerの説明書などにも解説がなく悩みました。

SQLを実行して、結果を得たい場合は、
「DB結果全部取得」命令などをつかうことで、
結果を得ることができます。
結果取得の方法はいくつかありますので、
なでしこの公式命令リファレンスをご覧下さい。

・11行目
「DB閉じる」命令で接続を切断します。



ざっとこんな感じです。

FilemakerのGUI機能はかなり!かなり!!かなり!!!軟弱なので、
その辺を補完するアプリケーションの構築

COMポートやUSBからの特定の信号を受け取ったときに、
テーブルへデータをINSERTする

なでしこで作ったアプリケーションが、
特定のウインドウメッセージやCOPYDATAを受信したときに、
テーブルへデータをINSERTする

メールを受信してその内容をテーブルへINSERTする

などなど、結構使えるツールが開発できるはずです。

Filemakerは確かに平易なデータベースアプリケーションですが、
その反面、暴れたくなるほど (^-^; 機能が貧弱なので、
ODBC接続を利用して機能を補完するといろいろウマーなわけです。

ただし!FilemakerはODBCの機能自体もかなり貧弱で、
テーブル設計などの条件によっては、
SELECT文などの実行のパフォーマンスが
データベースアプリケーションとは思えないほど悪いこともあります(T_T)
仕事で使うアプリケーションを作る場合は、
Filemakerデータベースのテーブル構造などを調整しながら使うことを強くオススメします。

ためしてないけど、なでしこプラグインからも接続できるのかな??
できるなら、これはこれでウマーなことが沢山あるんですが。。。

また時間ができたときに試します。

では!

なでしこでCOMポート接続

http://www.999.co.jp/usbcid2-jp/index.html
こいつになでしこから接続して流れてくる文字列を読む必要があったので接続してみた。


まず、WIN32APIから必要な関数をロード。


●CreateFile({参照渡し}filename,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile) = DLL("KERNEL32.DLL",
"HANDLE CreateFileA(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)")

●CloseHandle( hObject ) = DLL( "KERNEL32.DLL" ,
"BOOL CloseHandle(HANDLE hObject)")

●ReadFile(hFile,{参照渡し}pBuffer,nNumberOfBytesToRead,pNumberOfBytesRead,{参照渡し}pOverlapped) = DLL( "KERNEL32.DLL" ,
"BOOL ReadFile(
HANDLE hFile,
LPCVOID pBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD pNumberOfBytesRead,
LPOVERLAPPED pOverlapped
)")

●WriteFile(hFile,{参照渡し}pBuffer,nNumberOfBytesToWrite,pNumberOfBytesWritten,{参照渡し}pOverlapped) = DLL( "KERNEL32.DLL" ,
"BOOL WriteFile(
HANDLE hFile,
LPCVOID pBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD pNumberOfBytesWritten,
LPOVERLAPPED pOverlapped
)")

●SetCommTimeouts(hFile,{参照渡し}lpCommTimeouts) = DLL( "KERNEL32.DLL" ,
"BOOL SetCommTimeouts(
HANDLE hFile,
LPCOMMTIMEOUTS lpCommTimeouts
)")

●GetCommTimeouts(hFile,{参照渡し}lpCommTimeouts) = DLL( "KERNEL32.DLL" ,
"BOOL GetCommTimeouts(
HANDLE hFile,
LPCOMMTIMEOUTS lpCommTimeouts
);")

今回は読むだけなので
「CreateFile」「CloseHandle」「ReadFile」「SetCommTimeouts」
があれば問題ないのだけど一応他のも読み込んでおきました。



接続準備。

□CreateFile用のパラーメータの定数を定義します。


!GENERIC_READ = $80000000。
!GENERIC_WRITE = $40000000。
!OPEN_EXISTING = 3。

□SetCommTimeouts関数用の構造体を定義。

■COMMTIMEOUTSGROUPとは
 ・ReadIntervalTimeout
 ・ReadTotalTimeoutMultiplier
 ・ReadTotalTimeoutConstant
 ・WriteTotalTimeoutMultiplier
 ・WriteTotalTimeoutConstant

COMMTIMEOUTSとはCOMMTIMEOUTSGROUP。
COMMTIMEOUTSのReadIntervalTimeout = 0。
COMMTIMEOUTSのReadTotalTimeoutMultiplier = 1。
COMMTIMEOUTSのReadTotalTimeoutConstant = 50。
COMMTIMEOUTSのWriteTotalTimeoutConstant = 50。
COMMTIMEOUTSのWriteTotalTimeoutMultiplier = 1。
PACK( COMMTIMEOUTS , COMMTIMEOUTS2 , "LONG,LONG,LONG,LONG,LONG")。

この場合「COMMTIMEOUTS2」が作成された構造体です。
構造体の中身ついては、ここを参考にしました。



では接続してみましょう。まずはCreateFile関数を実行します。


h = CreateFile( "COM3" , GENERIC_READ + GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)。

こんな感じです。1番目の引数へCOMポートの名前を入れます。
hへハンドルが代入されます。

では読み込みましょう。ReadFile関数を利用します。


READSIZE = 20。#読み込むバッファサイズ。
BUFとは文字列。#この変数へ読み込んだ内容がセットされる。
BUFにREADSIZEを確保。#ポインタなので必要サイズを確保する。
READEXESIZEとは整数。
RESULT = ReadFile( h , BUF , BUFのバイト数 , POINTER(READEXESIZE) , 0 )。

上記の場合変数BUFにREADSIZEに指定したサイズ分読込みが行われます。
サイズが未確定の場合は、ループやタイマーを使って必要分読み出します。
1番目の引数は、CreateFileで取得したハンドルですね。

最後にCloseHandle関数で切断します。


CloseHandle( h )

この関数においても「h」はハンドルです。



って感じです。このご時世COMポートなぞあまり使いどころがないかもしれませんよね…(^-^;
何かの参考になれば。。。

各WIN32API関数についてはMSDNのサイトなんかを見るとわかるでしょう。
また、なでしこにおいてのWIN32APIの使い方は、
しらたまさんが詳しく説明していらっしゃいます。(非常に分かりやすいです)

なでしこは、WIN32APIを使うような高度なプログラミングも分かりやすく使うことができるので、
高度なプログラミングの学習にも最適です。
DelphiやVBやC#を使うのもいいですが、
これらは、WIN32APIをうまくラップして、
ユーザーが意識することなく利用できるように作成されているため、
根本的な学習はできませんし、
ラップされているので逆に使うのが難しかったりすることもあります。

わたしも過去VC++で挫折してました。
VBに逃げようかと思ったのですが、個人的にVBの文法が大嫌いで、
もうWindowsプログラミングをあきらめていたときに、
なでしこに出会いました。
個人的には、日本発のVBくらいの言語だと思っています。
今後も学習や業務にガンガン利用しますよ。

Newer posts