Archive for the 'FileMaker Pro v11' Category

2014/06/28 FMのDBで指定Tableの指定クエリー検索

FileMaker Proのデータベース上で、指定テーブル上に存在するレコードのうち、指定フィールドが条件に該当するものの数をカウントして返すAppleScriptです。

# 初回掲載時に、明示的にリザルトを返していなかったのと、部分一致検索で
# 検索してしまっていたので完全一致に修正しました

FileMaker Pro(以下、FMと省略)はAppleScript対応アプリケーションのうちでも、最初期に対応が行われたものであり、FileMaker Pro v4.xの時代にほぼAppleScript対応機能は完成の域に達していました(逆をいえば、その後の進化がほとんどない、ということでもあります)。

その後、FileMaker Pro v7の時代の大変革を通じて、それまで1データベース書類=1テーブルだったものが、1データベース書類に複数のテーブルを持つようになったり、速度の向上、内蔵のスクリプティングシステムの改良が行われてきました。

一方で、AppleScriptによるプログラム開発において、当初あまりに存在感の大きかったFMへの依存(ソートや抽出などの処理や、GUI作成環境としてのFMへの依存)を減らし、ほぼFMなしでデータベース的な処理が行えるようにサブルーチン群が整備されてきました。また、AppleScript StudioやAppleScriptObjCによりAppleScriptだけで、単体配布可能なGUIベースのアプリケーション開発可能なFMにかわる環境も提供されてきました。

当初(Classic Mac OSの時代に)、FMなしでAppleScriptによる開発を行うことは、安定性や機能面で難しいことでしたが、OS Xへの移行後はFMなしでも十分に安定性と機能性を確保することが可能となりました。

それでもなお、FileMaker Proを併用した方が便利な処理は存在しており、AppleScriptからFileMaker Proをコントロールするためのノウハウも高度化されてきました。

現在、FileMaker Proをコントロールする各種サブルーチンは、部品として使い回すことを念頭に汎用化がすすめられており、本ルーチンにもその方向性が見られます。

本ルーチンにおいては、DB名、テーブル名、検索対象フィールド名(複数)、検索条件データ(複数)を外部からパラメータで与えることにより、同様の検索処理であれば汎用的に使い回すことが可能となっています。

実際の用途は多岐に渡っていますが、データ分析系の処理や……Mac内の全アプリケーションを走査してローカライズ情報をアプリケーションバンドル内から(各国語対応の文字列データを)FMに吸い上げるAppleScriptを作成して運用しています。

スクリプト名:FMのDBで指定Tableの指定クエリー検索

set tmpDataList to {“com.apple.Safari”, “Safari”, “7.0.5″}
set queryCellList to {“bundle_id”, “Name”, “version”}

set aRes to findDataOnDB(“localizedStrings.fp7″, “applications”, tmpDataList, queryCellList)

–指定DB、指定テーブルの指定フィールドが条件に該当するレコードをカウントして返す
on findDataOnDB(dbName, aLayout, aDataList, queryCellList)
  
  
set count1 to length of aDataList
  
set count2 to length of queryCellList
  
if count1 is not equal to count2 then return 0
  
  
tell application “FileMaker Pro”
    
    
tell database dbName
      show layout aLayout
      
      
tell table aLayout
        
        
show every record
        
delete every request
        
        
–指定フィールドが指定条件に該当するレコードを抽出する
        
set aReq to create new request
        
tell aReq
          repeat with i from 1 to count1
            set j1 to contents of item i of queryCellList
            
set j2 to contents of item i of aDataList
            
set cell j1 to “==” & j2 –”==”は、フィールド完全一致指定の演算子
            
set omitted to false
          end repeat
        end tell
        
      end tell
      
      
find
      
    end tell
    
    
tell window 1
      set aCount to count every record
    end tell
    
  end tell
  
  
return aCount
  
end findDataOnDB

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/06/10 FileMaker Proで書き出したTab区切りテキストファイルをExcelで読み込む

FileMaker Proで書き出したTab区切りテキストファイルをExcel 2011で読み込むAppleScriptです。

Tab区切りテキストであればとくにFileMaker Proが書き出したものでなくてもかまいません。

スクリプト名:ExcelでTab区切りテキストを読み込む
set aFile to choose file
set aFile to aFile as string

tell application "Microsoft Excel"
  –指定のTab区切りテキストファイルを読み込む
  
open text file filename aFile data type delimited with tab
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/06/05 FileMaker Proで表示中のレコードのデータ内容をCSV書き出し

FileMaker Pro v11で表示中(検索してレコード数をしぼりこみ中)のレコードのデータ内容をCSV書き出しするAppleScriptです。

FileMaker Proのデータベースで検索を行って、レコード数をしぼりこんで……

fm1.jpg

条件の合うレコードのみにしぼりこみ、

fm2.jpg

本Scriptを実行すると……書き出すファイル名を聞いてくるので、それに答えると、

fm3.jpg

のように、CSV書き出しを行います。最初から、書き出し先のパス情報を、「Macintosh HD:Users:Hiyoko:Desktop:test.csv」のように持っておけば、冒頭のchoose file nameでユーザーに問い合わせる必要はありません。

書き出しを行う対象フィールドは、そのときに表示されていたレイアウトに依存します。つまり、すべてのフィールドを書き出したい場合には、一時的に「すべてのフィールドが配置されているレイアウト」に表示を切り替える必要があります(このあたり、ちょっとめんどう)。

それにしても……最新のFileMaker Pro v11にAppleScriptの資料が同梱されていないとは。資料の内容もあまり分かりやすいとはいえなかったものの、まったく付属していないというのもいささか問題でしょう。

スクリプト名:FileMaker Proで表示中のレコードのデータ内容をCSV書き出し
set aNewFile to choose file name –あくまでサンプルなので。普通はあらかじめパスのテキストを組み立てて渡すべし

–FileMaker Proで現在表示中(検索して絞り込み状態)のレコードのデータを取得する
–得られるフィールドは、表示中にレイアウトに依存する
tell application “FileMaker Pro”
  tell window 1
    set dataList to every record
  end tell
end tell

saveAsCSV(dataList, aNewFile) of me

–CSV書き出し
–ただし、データ内にダブルクォートが入っていた場合に備えてのサニタイズ処理は行っていない
on saveAsCSV(aList, aPath)
  set crlfChar to (ASCII character 13) & (ASCII character 10)
  
set LF to (ASCII character 10)
  
set wholeText to “”
  
repeat with i in aList
    set aLineText to “”
    
set curDelim to AppleScript’s text item delimiters
    
set AppleScript’s text item delimiters to “\”,\”"
    
set aLineList to i as text
    
set AppleScript’s text item delimiters to curDelim
    
    
set aLineText to repChar(aLineList, return, “”) of me –データの途中に改行が入っていた場合には削除する
    
set aLineText to repChar(aLineText, LF, “”) of me –データの途中に改行が入っていた場合には削除する
    
    
set wholeText to wholeText & “\”" & aLineText & “\”" & crlfChar –行ターミネータはCR+LF
  end repeat
  
  
if (aPath as string) does not end with “.csv” then
    set bPath to aPath & “.csv” as Unicode text
  else
    set bPath to aPath as Unicode text
  end if
  
  
write_to_file(wholeText, bPath, false) of me
  
end saveAsCSV

–ファイルの追記ルーチン「write_to_file」
–追記データ、追記対象ファイル、boolean(trueで追記)
on write_to_file(this_data, target_file, append_data)
  try
    set the target_file to the target_file as text
    
set the open_target_file to open for access file target_file with write permission
    
if append_data is false then set eof of the open_target_file to 0
    
write this_data to the open_target_file starting at eof
    
close access the open_target_file
    
return true
  on error error_message
    try
      close access file target_file
    end try
    
return error_message
  end try
end write_to_file

–文字置換
on repChar(origText, targChar, repChar)
  set origText to origText as string
  
set targChar to targChar as string
  
set repChar to repChar as string
  
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to targChar
  
set tmpList to text items of origText
  
set AppleScript’s text item delimiters to repChar
  
set retText to tmpList as string
  
set AppleScript’s text item delimiters to curDelim
  
return retText
end repChar

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に