みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつも利用させていただいています。
早速ですが、ファイルメーカーで操作ログを取るにはどうすればいいのでしょうか?
やり方の根本から思いつかずこちらに相談しました。
できれば、ログファイルはファイルメーカーのテーブルに残すのではなく
テキストファイルに出力したいのですが。
出力構成は、
日付時刻 社員コード 社員名 操作内容
みたいな感じになれば助かります。
当方の環境は、
OS:Win7
FM:ファイルメーカー11Pro
です。よろしくお願いします。
操作内容、をどの程度まで取り込むのかで大きく変わるでしょうね。ボタンのクリックやスクリプトを起動、メニューを起動、程度でしたら、そのすべてのスクリプトに、テキストを書き出す様な仕組みを埋め込んでおけば良いですが、そのコマンドの中で何をした(例えば何レコードを削除した)、とか、レコードの内容を変更した、という内容までを書き出させるのでしたら、各機能の中に前後の比較を行わせる様な仕組みが必要で、結構大変かも。
また、書き出しの仕組みも、FM単独では無理でしょうから、event を送信し、外部コマンドを使って、log テキストに append していけばいいでしょうね。
Last edited by Shin (2016-02-11 15:36:01)
Offline
Shin様、返信ありがとうございます。
操作内容、をどの程度まで取り込むのかで大きく変わるでしょうね。ボタンのクリックやスクリプトを起動、メニューを起動、程度でしたら、そのすべてのスクリプトに、テキストを書き出す様な仕組みを埋め込んでおけば良いですが、そのコマンドの中で何をした(例えば何レコードを削除した)、とか、レコードの内容を変更した、という内容までを書き出させるのでしたら、各機能の中に前後の比較を行わせる様な仕組みが必要で、結構大変かも。
また、書き出しの仕組みも、FM単独では無理でしょうから、event を送信し、外部コマンドを使って、log テキストに append していけばいいでしょうね。
なるほどそういった方法になるわけですね。
試しに、以下のファイルを作ってテストしてみました。
テーブル構造は、
テーブル名:テキストテスト
社員CD テキスト グローバル
社員名 テキスト グローバル
内容 テキスト グローバル
日付 タイムスタンプ グローバル
結合 計算 非保存,=日付 & "|" & 社員CD & "|" & 社員名 & "|" & 内容
にして、スクリプトを
例:
フィールド設定[テキストテスト::内容;"変更した。"]
フィールド内容のエキスポート[テキストテスト::結合;「ログ.txt」]
と組んでこれをボタンに設定して、ボタンをクリックしたら
テキストに出力されるように組んでみたんですが、これだと出力はされますが
上書きのためうまくいきませんでした。
ここを、エキスポートではなく『event を送信』にして外部モジュールで書き込みをするように
する訳ですよね。
でも、『結合』の内容を外部モジュールに渡すにはどうすればいいのでしょうか?
ログをFMの別テーブルに残して、
それをテキストファイルに上書きエクスポートすれば簡単では。
Offline
チポ様、返信ありがとうございます。
ログをFMの別テーブルに残して、
それをテキストファイルに上書きエクスポートすれば簡単では。
なるほど。やはり別テーブルを持つしかないのか。
ちょっと、先ほどのテストファイルを手直ししてみたんですけど
見ていただけますか?
テーブル構造は同じです。
スクリプトを
スクリプト名:書き出し
フィールド設定[テキストテスト::内容;Get ( スクリプト引数 )]
フィールド設定[テキストテスト::日付;Get ( タイムスタンプ )]
レコードのエクスポート[ダイアログなし;「ログ.tab」;日本語(Shift-JIS)]
Event を送信[「aevt」;「odoc」;「テキスト書き出し.exe」]
と組みなおして、フィールド『社員CD』『社員名』の『スクリプトトリガ設定』『OnObjectValidate』に
『書き出し』を設定。『オプションのスクリプトパラメータ』に『Get ( アクティブフィールド名 ) & "変更した。"』
を設定。
『書き出し』というボタンを作ってその、ボタン設定にスクリプト『書き出し』を設定。
フィールド同様に『オプションのスクリプトパラメータ』に『"書出しボタン押した。"』と設定しました。
『Event を送信』でキックするEXEファイルはVB6で作ったタブ区切りファイルを1行読んで
テキストに書き出すというファイルです。
これで、ファイルメーカーから書き出した『ログ.tab』を読み込んでテキストに『Append』出力して
ログファイルを作るようにしました。
一応、これで意図している動きは出来たんですが
こんなトリッキーなやり方普通するんでしょうか?
Windows 限定ならPowerShellを使うのがおすすめです。※PowerShellは、Win7に標準搭載なので下準備は、必要ありません。
スクリプト例:
変数を設定 [$PS; 値:"Add-Content c:\Log.txt " & Quote ( Get ( タイムスタンプ ) & "|" & Get ( アカウント名 ))]
Event を送信 [「aevt」; 「odoc」; "PowerShell.exe -Command " & Quote ( $PS )]
Get ( タイムスタンプ ) & "|" & Get ( アカウント名 )
のところを残したいLOGに変更してください。
Offline
書き出すテキストを、パラメーターとして VB のファイルに渡せば、もっとすっきりとすると思いますが。
Offline
qb_dp様、Shin様、返信ありがとうございます。
お二人にお教えいただいた方法を試してみました。
両方とも、こちらが意図している結果を得ることができました。
ありがとうございます。
ただ、2つとも気になる点がありましたので追記します。
qb_dp様の方法では、『Event を送信』の『オプション』で
『対象アプリケーションを手前に表示』にチェックを入れると
『PowerShell』が起動するのが見えますね。
チェックを外してもタスクバーに一瞬ですが『PowerShell』の
アイコンが表示されて消えます。
出来れば、これも表示されない方が望ましいのですが
そうすることは可能でしょうか?
Shin様の方法では、出力されたテキストファイルを見ると
ファイルメーカー側から送られた文字列の前側に『"\"』、
後ろ側に『\""』が表示されてしまいます。
おそらくファイルメーカーとVBとの間の文字セットの違いからくる
文字化けだと思うのですが、ファイルメーカー側でいろいろと
調整してみたんですが変わりませんでした。
ただ、どの文字列を出力しても決まった形のものが出力されるので
VB側でその部分をカットするステップを入れて正しく出力されるように
しています。
こちらできれば、そういったステップを使わないで正しい文字列が
出力されるといいのですが。
追加質問で申し訳ないのですが、よろしくお願いします。
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 543.48 KiB (Peak: 564.02 KiB) ]