2018年10月5日金曜日

7月のサンプル ダウンロード

マーカー付 スペース区切り複数ワード検索

アカウント admin
パス           123

ダウンロード

検索フィールド内は
バックスペースでインクれます。























FileMakerの集計は遅くないよ!

その前に。。

シリアルNOの初期値化と欠番

のダウンロードを再開しました。

が、注意が必要です。

SerialIncrement ( "001" ; Max ( シリアル初期化_自己リレ::シリアル ))
のように自己リレをして計算式でシリアルを生成する場合なのですが、私のお客様の会社で恐れていたことが何度か発生してしまいました。

クラウドサーバー仕様・10拠点のPOSシステムで、番号の衝突が起こってしまったのです。普通は、頻繁に起こる事は無いのですが、POSを使用するということは現金商売なので常に各拠点でレコードが動くわけです。Max値というのがくせ者で、自己リレだろうがMax値を探す(データをなめる)時間というものが発生し、拠点間でお互いに衝突をしてしまうのです。
当然、計算が変わってきてしまうので、丁重にお詫びして、修正し
この計算は表面上は残し、裏ではフィールドオプションのデフォルトのシリアルに変更しました。(僕はUUIDが嫌いなので・・・笑)

それからは衝突も無く、ちゃぁーんと動いています。




んで、本題の
FileMakerの集計は遅くないよ!

うちのお客さんのところは200万明細超えてもサクサク動いてます。
納品するシステムは商品ですから、ここに紹介するような内容とは、ちょっと違いますが・・・(笑)

重いという方、多分ですが、集計させる側のテーブルのフィールドの計算式が多過ぎなのではないでしょうか。
単純な単価×数量=金額程度でも5万明細を超えてくると、重くはなりますよ。
どうやったってCase分、Let関数やら再起処理なんか入ってくると、そりゃ集計なんかは明らかに遅くなります。これはFileMakerとか、そういう問題ではないです。



極力、集計する側のフィールドは計算式を止め、空の数字フィールドにスクリプトを使用して計算させるか、
見積、売上、請求なんかでも、そのままのテーブルで集計しないで、更新処理で計算式ゼロの別テーブルにデータ転送させ、そのテキストや数字フィールドだけ集まったテーブル側で集計すれば、相当早くなります。(必要の無い索引も外しましょう!)
特にExecuteSQLを使用しての集計は極端に処理が早く感じます。
繰返しフィールドを使用したクロス集計なんかも、違いは実感できます。

(別に分離開発を奨めているわけでもないです)
更新処理という単語が嫌いなお客様もいるので、集計処理とか、とにかく設計段階でいろいろ考えた方がいいかもです。

検索にしてもフィールドに索引が多過ぎると遅くなります。
アプリとデータを分けるファイルの分離というより、
お客様の運用上、見積や売上などのフロント側はいっぱい計算させて、請求時や、集計は計算式の無いデータで行うのが良いのかと思います。(ファイルは分けていますが、一般的に言われている分離とは違うかもです)


前月、前回の締に戻って修正出来るようにすると、自由度は高くなりますが、違うところで歪みが発生します。赤黒処理で対応するなど昔からの方法も悪くはありません。

FileMakerは複数人で開発するようには作られていないので、
あらかじめ、プレハブ建築の様に、各テーブル内フィールドの仕様、それにまつわるスクリプトなどSet化して、依頼によって組合せ調整して開発しています。

出来上がったシステムに更新処理を追加するのは正直しんどいのですが、最初からSetで用意しておけば、さほど開発には時間はかかりません。











2018年7月7日土曜日

デモファイル ダウンロード

前回の「マーカー付 スペース区切り複数ワード検索」
のファイル

動作を確かめるためにデータ入力のアカウント状態での
ダウンロードをできるようにしました。
--------------------
[データ入力のみ]
アカウント user
PASS          123

ダウンロード
--------------------

完全アクセスのアカウント公開はしませんが
コメントかメールにて対応します。

2018年7月5日木曜日

実験 マーカー付 スペース区切り複数ワード検索

マーカー付 ひとつの検索フィールドで複数のワードをスペースで区切って検索する

条件
①Enterで検索(マーカー付)
②Enter後も続けてスペースが入るように文字の後にカーソルが消えない
③1バイト文字はEnterを押さなくても、キー動作で検索
④2バイト文字(日本語)はEnterで発動
⑤③と④は入力時インクリ、デクリ発動
⑥キーワードの数に制限をかけない
⑦キーワードが発動する度にマーカーを付ける
⑧データー量が増えすぎてパフォーマンスが下がった時に
題名の「複数ワードをスペース区切りで検索する」を残し、
若干重い②③④⑤を外しても使えるようにする。


※クイック検索とは関係ありません。



ということで、FileMaker らしからぬ検索をしてみましょう。
スクリプトとかは、コメントによってファイルをダウンロードできるようにします。
(最後に説明)


実は、IT業界の後に外食系のプロデューサーをしておりまして(笑)その時の洋菓子の原材料が1800件くらいあったので使ってます。


上の検索Barの中に検索ワードを入れるという仕様です。


「オレンジ」Enterで検索します。
ほら、材料名にもメーカーにもコメントにも「オレンジ」というワードにマーカーが付きます!(マーカー大好き!)
通常の検索では検索後にはカーソールが消えているはずです。しかし、画像では見えませんが、「オレンジ」の検索の後に「|」のカーソールが残っています。カーソールを維持させています。


次に、スペースを入れます。「 」
「フランス」というワードを追加します。



前のオレンジの件数が1821件中、52件ありました。次の「フランス」で16件に絞り込まれたという事です。マーカーは新しいワードにスポットします。
同じようにスペースを入れて次々にワードで絞り込んでいけます。


例えば、部品屋さんなど型式検索を行う事があると思うのですが、今まではメーカーなどの大分類、使用箇所など中分類、グレードなど小分類で別々のフィールドで絞込されていたことがあったと思いますが、これは早いです。
しかもフィールド関係なしに絞り込まれますので、一度材料名で絞込んだあとに、内容で絞込んで、再び材料名で絞られる!?という働きもしています。


⇐これが、「オレンジ」の後に「マ」を打込んだ結果です。「オレンジ」だけのときは材料名のところにスポットが多くありました、「マ」を入れても材料名にスポットが当たっています。

これは、材料名の検索の後に、再び材料名の検索をしていることになります。

ワードが追加されるたびに6つのフィールドが検索されているということです。











更に数字の40を入れて2件に絞り込まれました。
1バイト文字はEnterキーを押さなくても検索されますので、無い文字の度に「違うよ!」みたいなダイアログが出ます。
めんどくさいと思うでしょうが、業種業態によって半角英数のような1バイト文字の品名や型式が多い場合などは、そのほうが便利です。


このデモファイルは材料id以外の6つを検索対象としていますが、テキストと金額や単位は混在すると目的から離れてしまうので、別フィールドに分けた方がいいかもしれません。



検索フィールドをBackspaceで削っていくと、対象のレコードが増えていきます。
複数のワードなのにインクリメント(文字を足すと・・・)、デクリメント(文字を削ると・・・)検索が動いていることになります。



検索を止めたい時は、適当な文字を追加します(笑)
そうするとダイアログが出ますので、そのままEnterを押すと検索フィールドの文字が消えます。




全レコードを表示したい場合は「*」Enterで全レコードが表示されます。




データを表示しないようにするには適当な文字を入力し、ダイアログを出して
Enterで非表示にできます。




この検索システムはいたって構造がシンプルです。

複雑な事はしていませんし、カスタム関数もプラグインも使っていません。
テーブルも1つでTOも自己リレーションも使いません。
OR検索と、次のワードをOR検索で絞り込む事でAND検索のような働きに
させています。インクリもデクリも2行スクリプトです。カーソール維持も
そんなに難しくはありません。

スクリプトは3つで構成されています。
完成しているファイルは常に検索が動く状態なので5万件を超えたくらいから
動きが鈍くなります。そこで、2つのスクリプトを止めると100万件でも
サクサク動くようになります。(カーソール維持とインクリ・デクリが重くなります)


今回は中身は公開しませんが、コメントを頂けましたらメール添付にてSpace_Sファイルのダウンロードができるようにさせていただきます。



※このサイトの過去(2018年以前)のサンプルのダウンロードは終了させていただきます。どうしてもという方は、コメントを頂ければ、内容を再確認し、メールに添付させていただきます。過去に公開ダウンロードを行っていたのですが、現在は公開ダウンロードは中止しています。








2018年6月9日土曜日

案件ファイル管理


2014年頃にここで作っていた弁護士向けのシステムにも関係してくるんですけど、ファイル管理をもっと細かくパスを利用して、フォルダごとや、ファイルごとに管理できないかということで作ってみました。

案件管理っていろんな分野で使われるので知っておくと便利かもしれません。



さっそく作ってみますか!
僕はwinのFileMakerPro16Advancedで作っています。



たぶん、15でも動くかな


テーブルは
案件管理と関連ファイルの
2つです。

頭にDとか付いているのは
データベースのD
マスタになるテーブルなどには
Mとか付けています。
案件管理は入力や修正などを行うテーブルなのでD、関連ファイルは、事前登録するようなマスタではなく、案件管理と連動してデータが増えていく明細のような働きをするので、これもD、
開発者の癖とかあるので気にしないでください。








テーブルごとにフィールドの設定を行います。
Keyになる案件idなどは
デフォルトのシリアルでも良いのですが、全削除しても1から始まらないので簡単なSQLを使っています。
僕的にはFileMakerでSQLを使うのはこれだけ。
(FMでSQLって好きじゃないんですけど、まぁ、これだけは便利なので・・(笑))

g_フォルダpathというフィールドはテキストのグローバルフィールドです。






関連ファイル側も同様にフィールを設定します。

ファイルpathのフィールドは、ファイルを格納するファイルBOXというオブジェクトフィールドを指定したいので、計算式でGetAsText()を使用します。

あとは、基本的な設定です。









リレーションはkeyになる案件id同士を結びます。

関連ファイル側の作成許可にチェック。
運用の用途によりますが、削除にチェックすると、案件レコードが削除されると関連ファイル側も削除されてしまうので、ここではあまりお勧めしません。









ごくごく単純なレイアウトです。

基本データとポータル
ポータルは関連ファイルのテーブルです。
アイコンの絵はSVGのファイルを沢山追加していますので
このファイルを移植すれば使えます。










ポータルの中のボタンを設定していきます。




×ボタンは+ボタンと重ねており、インスペクタのオブジェクトを隠す項目にスクリプトを入れて制御しています。







+ボタン(追加ボタン)は
Get( ウインドウモード ) = 1 or
not IsEmpty( GetRepetition( D_関連ファイル::ファイルBOX ; 1 ) )


×ボタン(削除ボタン)は
Get( ウインドウモード ) = 1 or
IsEmpty( GetRepetition( D_関連ファイル::ファイルBOX ; 1 ) )

です。








追加ボタンのスクリプトです。

今回は外部保存ではなく、パスを利用した管理なので
ファイルの挿入方法を”参照”に設定しています。
参照にすると、オブジェクトをクリックするとファイルが展開して開きます。

※ファイル名付のアイコンを選択してください。画像ファイルの場合は、その画像はオブジェクトに表示されませんが、参照の場合はこれでOKです。











削除ボタンのスクリプト。

僕個人で使うときはボタンを設定しないでオブジェクトに直接右クリックだの削除だの行うのですが、ここはちゃんとボタン操作で設定してみます。











フォルダパスを取得するスクリプト。

そうなんです。
フォルダパスとファイルパスを別々にしてめんどくさいのですが、説明のためにあえて分けてます。ゆくゆく使っていくと運フォルダパスだけで用が足りるかと思うのですのが・・・。
フォルダパスを取得して、指定のフォルダの中身を閲覧させ、その中身をクリックするとファイルが展開する!便利ですよね。
ファイルを一つ一つ選んでパスを取得するなら、こっちの方が楽なんです。


ここではMiddle関数を使用してパスを取得
Middle ( $path ; 2 ; 50 )
Middle ( テキスト ; 先頭文字位置 ; 文字数 )









フォルダパスからの展開先を作成します。

グローバルフィールドと
webビューアーを使って展開させます。

webビューアーにはしっかりとオブジェクト名を指定してください。















フォルダを開く
スクリプト。

















ファイルを開く
スクリプト。
















Let([
   #path=GetValue(GetAsText(D_関連ファイル::ファイルBOX);2); 

/*絶対ファイルパスの抽出*/
/*この2ってのはパスが2行取得されちゃうので2。3行取得されるときは3*/


   #pos=Position(#path;"/";Length(#path); -1);        
/*逆から数えて1つ目の"/"の位置*/
  
   #path=Left(#path;#pos); 

   #path=Substitute(#path;["image:";"file:/"]; ["filewin:";"file:/"];["imagewin:";"file:/"];["filemac:";"file:/"]) 
                                                
/*fileスキーム変換   ここんところ、多くて勘弁してほしいよね*/

];
   #path  & GetContainerAttribute ( D_関連ファイル::ファイルBOX ;"filename"  )
)

//けっこう強引かも(笑)



この辺はちょっと難しいかもしれませんが、いちを掲載しておきます。






オブジェクトにファイルをドラッグすると、参照ではなく挿入になり、パスが入りません。よく「ドラッグさせてほしい」という要望があるのですが、ひとつのディスプレイでドラッグドロップするには、一旦画面を縮小させてファイルが置かれているフォルダを見える場所に配置して行うので、一見便利そうで使われてない事が多いです。
ちゃんと、ボタンからディレクトリを確認してフォルダやファイルを選ぶのがベストかと思います。







パスが2行表示になるのはFileMakerの仕様です。
1行目が相対パスで
2行目が絶対パスです。
読み込まれるのは絶対パスの方になります。



今回はパスがメインですが、次回はフォルダの場所が変わった場合や、インポートを利用した一括取り込みなども追記していきます。




今日のデモファイル(ダウンロード)

ボタン設定のアイコン、200個くらい入れておきました(笑)






2018年6月7日木曜日

第20回のダウンロード


すみません、いろいろあってダウンロードできなくなってました。


とりあえず 第20回目のダウンロードです。



2014年のファイル 
(元々のファイル)
(ダウンロード)







事件の大分類、中分類、小分類の設定がちと難しいかもしれませんね~
マスタメニューに設定させていないので、
レイアウトから拾って確認してみてください。











先ほど
少しいじった2018年のカレンダースケジュールと連動したファイル
(ダウンロード)




以前作ったものはカレンダーとは連動していなかったのですが、連動させておきました。




製品ではないので、細かいところまでは作り込んでいません。






最適化してますか?

 まるで入院していた患者が退院して元気に復活するような機能。 クラウドを使用するユーザーさんがほとんどなのですが、このゴールデンウィーク中は 最適化のメンテしときます。 データがピチピチしちゃいますよぅ。