みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Shinさん
はい、himadaneeさんの書かれている通り、SQL文の読みやすくするためだけのものです。
&が入り込むのが嫌でしたので。
himadaneeさん、ありがとうございます。理解しました!
このように修正することで、解決しました。
Let (
[
TO = "\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗コード ) ; "::" ; "¶" ) ; 1 ) & "\""
;
F1 = "\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗コード ) ; "::" ; "¶" ) ; 2 ) & "\""
;
F2 = "\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗ロケーションID ) ; "::" ; "¶" ) ; 2 ) & "\""
;
SQL = "SELECT @@F1@@ FROM @@TO@@ WHERE @@F2@@ = ?"
;
SQL = Substitute ( SQL ; [ "@@TO@@" ; TO ] ; [ "@@F1@@" ; F1 ] ; [ "@@F2@@" ; F2 ] )
]
;
ExecuteSQL (
SQL
; "" ; "" ; ロケーションId )
)
解決済みとさせていただきます。
ご回答いただきました皆様、ありがとうございました。
micさん、ありがとうございます。
それぞれ試してみましたが、残念ながら結果は ? のままで変わりませんでした。
himadaneeさん、ありがとうございます。
Letの最後の計算式を、SQL とだけにしてSQL文の内容を見てみましたが、
SELECT \"店舗コード\" FROM \"店舗\" WHERE \"店舗ロケーションID\" = ?
となっており、問題がどこにあるのかわかりません・・・。
qb_dpさん、ありがとうございます。
10年以上前の解決法なんですね。とても参考になりました。
このやり方で行こうと思います。
お世話になります。
表題の通り、ExecuteSQL関数を計算フィールドの定義に用いる際、参照先TO名・フィールド名の変更にも対応できるようにしたいと考えています。
例としてセールスサマリーDBから、自身のロケーションIDフィールドと、参照先である店舗DB上の店舗ロケーションIDフィールドが一致するレコードの店舗コードを取得する場合、以下のように計算フィールドの定義をしてみましたが、結果は ? と表示されます。
Let (
[
TO = "\\\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗コード ) ; "::" ; "¶" ) ; 1 ) & "\\\""
;
F1 = "\\\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗コード ) ; "::" ; "¶" ) ; 2 ) & "\\\""
;
F2 = "\\\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗ロケーションID ) ; "::" ; "¶" ) ; 2 ) & "\\\""
;
SQL = "SELECT @@F1@@ FROM @@TO@@ WHERE @@F2@@ = ?"
;
SQL = Substitute ( SQL ; [ "@@TO@@" ; TO ] ; [ "@@F1@@" ; F1 ] ; [ "@@F2@@" ; F2 ] )
]
;
ExecuteSQL (
SQL
; "" ; "" ; ロケーションId )
)
この計算式で修正するべきところをご指摘いただけますでしょうか。
もしくは、よりシンプルで汎用性の高い計算式をご教授いただけると有り難いです。
私が参考にしましたのは、こちらの動画になります(計算フィールド定義ではなく、スクリプト上でのテクニックになりますが)。
https://www.youtube.com/watch?v=9iFSle64iCs
よろしくお願いいたします。
himadaneeさん、関数ヘルプ2のご提示、ありがとうございます。
> フィールド参照を直接引数に指定してるので、''が不要なのは明らか。
すみません、こちらは " ではなく、' が不要という理解であっていますか?
また、2バイト文字誤用の点も発見していただき、ありがとうございます。
問題点を探るため、式を以下のように単純にしてみたところ、ちゃんと意図通りに動作しました。
__________________________________________
Let([
$StaffID="%" & 従業員ID & "%"
;
#SQL=
ExecuteSQL (
"
SELECT COUNT (DISTINCT \"Date\")
FROM \"タイムカードDB\" A
WHERE
A.\"出勤従業員IDリスト\" LIKE ?
"
; "" ; "" ; $StaffID )
];
#SQL
)
__________________________________________
ここから、気をつけて他の条件を足していきます。
himadaneeさん、本当にありがとうございました!
himadaneeさん、一般的な使用に関するご注意もありがとうございます。
>ここに余計なシングルクオートがあるせいでは?
はい、↓のようにシングルクオートが無いものも試したのですが、結果は同じでした。
$StaffID="%" & 従業員ID & "%"
ちなみに、『Claris FileMaker SQLリファレンスガイド』の記載例を見てシングルクオートが必要と思ったのですが、無くても大丈夫なのでしょうか?
https://help.claris.com/ja/sql-reference.pdf 29ページ
himadaneeさん、ありがとうございます!
COUNT DISTINCT を使えば「従業員出勤明細」で構わないことに気づいていませんでした。
やりたかったことはhimadaneeさんの指摘でうまくいきそうですが、本来の疑問である「複数の値が改行区切りで存在」するフィールドとの照合については、私では解決できませんでしたので(ちなみにhimadaneeさんの予想通り、カーソルがグルグル回りました)、トピックは未解決のままにしておきます。
また、備忘のため作った式を書いておきます(意図通りには結果を返しません)。
__________________________________________
Let([
$StaffID="'%" & 従業員ID & "%'"
;
#SQL=
ExecuteSQL (
"
SELECT COUNT (DISTINCT \"Date\")
FROM \"タイムカードDB\" A
WHERE
A.\"出勤従業員IDリスト\" LIKE ?
AND
A.\"Date\" BETWEEN ? AND ?
AND
A.\”曜日番号\” = ?
"
; "" ; "" ; $StaffID ; 集計開始日 ; 集計終了日 ; 1 )
];
If ( not IsEmpty ( #SQL ) ; #SQL ; 0 )
)
__________________________________________
参考にした情報
https://fm-aid.com/bbs2/viewtopic.php?id=11918
https://community.claris.com/ja/s/quest … -likeの記述方法
himadaneeさん、改めてありがとうございました!
WHERE句で、like とワイルドカードを使ったりするんですかね?
試してみます。
himadaneeさん、ありがとうございます。
すみません。私の早とちりで、最初の値ではなく、おっしゃるとおりフィールド全体が照合されていますね。
これを、ファイルメーカーの通常のリレーションのように複数の値の中のいずれかと照合させることは可能なんでしょうか?
具体的には、以下のようになっています。
従業員DB
「従業員ID」 テキストフィールド
「集計開始日」 グローバル日付フィールド
「集計終了日」 グローバル日付フィールド
タイムカードDB
「Date」 日付フィールド
「曜日番号」 計算フィールド(Dateフィールドから、DayOfWeek関数で取得しています)
「出勤従業員IDリスト」 テキストフィールド(関連テーブル「従業員出勤明細」の従業員IDを List 関数で一覧取得して格納してあります)
各従業員の、ある期間内の曜日ごとの出勤日数を算出するため、次の計算フィールドを 従業員DB 上に作成してみました。
「期間内出勤日数_Sunday」 計算フィールド
__________________________________________
Let([
#SQL=
ExecuteSQL (
"
SELECT COUNT (DISTINCT \"Date\")
FROM \"タイムカードDB\" A
WHERE
A.\"出勤従業員IDリスト\" = ?
AND
A.\"Date\" BETWEEN ? AND ?
AND
A.\”曜日番号\” = ?
"
; "" ; "" ; 従業員ID ; 集計開始日 ; 集計終了日 ; 1 )
];
If ( not IsEmpty ( #SQL ) ; #SQL ; 0 )
)
__________________________________________
目論見としては、当該従業員が出勤しているタイムカードDBのレコードを全て照会して欲しかったのですが、
例) 以下の状況でも照会される。
従業員DB「従業員ID」フィールド内容が
0002
タイムカードDB「出勤従業員IDリスト」フィールド内容が
0001
0002
0005
0013
実際にはその従業員のみが出勤している(つまりフィールド内容全体が一致している)レコードしか紹介されませんでした。
例) 以下の状況でしか照会されない。
従業員DB「従業員ID」フィールド内容が
0002
タイムカードDB「出勤従業員IDリスト」フィールド内容が
0002
お世話になります。
ExecuteSQL関数で、WHERE句で参照する先がマルチキーフィールド(複数の値が改行区切りで存在)の場合、最初の値のみが照合されます。
これはそういった仕様で、ファイルメーカーの通常のリレーションのように、入力されているいずれかの値と照合させることはできないのでしょうか?
ご教示、よろしくお願いいたします。
himadanee様
ありがとうございます!
Quote( )でJSON箇所を囲むことで解決しました。
データ($text)に改行は含まれていませんでしたが、含んだ場合でも問題なく通知できました。
最終的な設定内容を以下に記します。
-----------------------------------------------------------------------------------------------------------------------------------------------
変数を設定 [ $text ; 値: 請求書::請求元社名 & "から、" & ¶ & "$" & 請求書::請求額 & "の請求があります。" ]
「URLから挿入」スクリプトの、cURLオプション
"-X POST -H \"Content-Type: application/json\" --data-binary " &
Quote (
JSONSetElement ( "{}" ;
["text"; $text ; JSONString];
["channel"; "#会計処理" ; JSONString];
["username"; "Account Book" ; JSONString] )
)
-----------------------------------------------------------------------------------------------------------------------------------------------
この設定で、「請求元社名」フィールドが "ABC Limited"、「請求額」フィールドが "123.45" の場合、
ABC Limitedから、
$123.45の請求があります。
と通知が来ます。
usernameの"Account Book"も、半角スペースが入った形で表示されました。
himadanee様、本当にありがとうございました!
himadanee様
ご返信ありがとうございます。
ご指摘いただいた通りに、
"-X POST -H \"Content-Type: application/json\" -data-binary " &
と直しました。
データの方も同様とのことですが、具体的にどこの箇所を指しているか教えていただけますか?
ご面倒をおかけしますが、よろしくお願いします。
お世話になります。
当方の環境は、FileMakerServer16(Mac)と FileMakerPro18Advanced(Mac)です。
会計データベースにお客様からの請求書レコードが登録されたタイミングで、FileMakerスクリプトを利用して、支払い担当者にSlackで通知を送りたいと考えています。
請求書テーブルには、「請求元社名」フィールドと「請求額」フィールドがあり、通知の文面は変数$textで以下のように設定してあります。
変数を設定 [ $text ; 値: 請求書::請求元社名 & "から、" & "$" & 請求書::請求額 & "の請求があります。" ]
例として、「請求元社名」フィールドが "ABC Limited"、請求額」フィールドが "123.45" の場合、
「ABC Limitedから、$123.45の請求があります。」
との文面で通知したいわけです。
Slackへのポストですが、「URLから挿入」スクリプトで、以下のようにcURLオプションを指定してあります(channelの"#会計処理"とusernameの"AccountBook"はwebhookのパラメータです)。
"curl -X POST -H Content-Type: application/json -data-binary " &
JSONSetElement ( "{}" ;
["text"; $text ; JSONString];
["channel"; "#会計処理" ; JSONString];
["username"; "AccountBook" ; JSONString]
)
困ったことに、変数$textに格納されるテキストに半角スペースが含まれると、通知に失敗してしまいます。
先ほどの例ですと、「ABC Limited」の中に半角スペースがあるために上手くいきません(試しに、TrimAllでスペースを除去すると通知できました)。
また、参考になるかはわかりませんが、
["username"; "AccountBook" ; JSONString]
を"Account Book"と半角スペースを入れた場合も通知に失敗します。
なにかcURLの構文に不備があるのかと思っていますが、ご教授をいただければ幸いです。
よろしくお願いいたします。
Hiro様
ありがとうございます。
アドバイスを参考に、条件付き書式で
個人明細::レコード番号 = Get ( 対象レコード数 )
→文字色黒(表示)
明細::日付 = GetNthRecord ( 明細::日付 ; 明細::レコード番号 + 1 )
→文字色白(非表示)
というように設定して、解決できました。
「次の場合にオブジェクトを隠す」の条件設定で四苦八苦していましたが、条件付き書式でしたらリストの冒頭から順次評価されるので、
こちらの方がスッキリ設定できました。
ご返信、ありがとうございました!
お世話になります。
使用環境はVer.16以降です。
明細を表示するポータルで、同じ日付のレコードが続く場合、続きレコードの一番下のものにのみ日付を表示させたいと考えています。
現在、明細テーブルに「レコード番号」という非保存の計算フィールドを
Get (レコード番号)
で作成してあり、ポータル内の日付フィールドのオブジェクトを隠すオプションに
明細::日付 = GetNthRecord ( 明細::日付 ; 明細::レコード番号 + 1 )
を設定してあります。
ただこのままでは、ポータルの最後のレコードの日付フィールドが常に非表示になってしまいます。
いろいろ試してみましたが、解決できずにいます。
どうぞお知恵をお貸しください。
Shin様
貴重な情報、ありがとうございます!
前回の投稿より一年以上経ってしまいましたが、報告させていただきます。
結末としては、アンチウイルスソフトはインストールせずに、サーバー専用のネットワークを構築して、他の感染源となり得るクライアントから隔離しました。
参考までに、以下の情報をシェアさせていただきます。
まんじろ様がご紹介くださったトレンドマイクロの製品ですが、当社が海外にある日本人企業のため、同等の海外向け製品を問い合わせたところ、「Small Business Solutions」カテゴリ内の【Worry-Free Services】が該当するとの回答を得ました。
ただ、一年以上前の回答ですし、公開されている情報ではありませんので、導入をお考えの方はご自身でトレンドマイクロさんにご確認ください。
ご回答いただきました皆様、本当にありがとうございました。
タイトルの件については私自身で結果をお伝えできませんでしたので、未解決のままにさせていただきます。
なるほど。
覚えておきます!
>Shinさん
はい、要望通りの動きです。
恥ずかしながら、チェックボックスの特性をちゃんと認識していませんでした。
たしかに、今まで作ったソリューションではそのように利用していました。ボーッと作ってたんですね・・・。
https://support.filemaker.com/s/article … anguage=ja
勉強になりました。ありがとうございます!
>Shinさん
ありがとうございます。顎が外れています・・・。
サンプルのファイルを見てみましたが、狐につままれているような気分です。
「チェック」フィールドの内容が、Tickするごとに完全上書きされるのではなく、ログインユーザー名のみの追記・削除になっているのは、
データ保存用のテーブル「従業員マスター 2」とのリレーションがデカルト積になっているが故の挙動なのでしょうか?
よろしければ、参考になる情報などを教えていただけますでしょうか。
タイトルの質問内容とは合致していませんが、私の望む機能は実現できますので解決とさせていただきます。
ありがとうございました。
>チポさん
ありがとうございます、目から鱗です!
その場合、bcc用グローバルフィールドを用意して、クリックで「 従業員のメールアドレス&"," 」を書き込んでいく。
選択解除の場合は、再クリックでbcc用グローバルフィールドからSubstitute関数で該当するメールアドレスを削除する、というやり方で良さそうですね。
改めて、ありがとうございました!
お世話になります。
使用状況は以下の通りです。
# 従業員データベースをFileMakerServerにてホスト。
# 複数マネージャーA、B、C、D...が、それぞれのアカウントでログインし、従業員データベースを閲覧。
実現したいこと
# マネージャーが従業員データベースにアクセスし、ポータルで表示される各従業員のTickボックスにチェックを入れ、
チェックが入った従業員のメールアドレスをbccに含んだメールを作成する。
解決できない点
従業員データベースに、グローバルフィールドで「Tickフィールド」を作成しても、アクセスするマネージャーごとに異なる値を一時保存はできますが、
全従業員で同じ値が保存されてしまう(当然ですが・・・)。
共有ファイル上でのグローバルフィールドの、「ユーザーごとに違う値を一時保存できる」という特性と、
「レコードごとに異なる値を格納できる」という要求を両立できる方法がありましたら、ご教授ください。
ちなみに別のソリューションでは、繰り返しフィールドと、アクセスするユーザーごとにどの欄を使用するかの設定を使って解決した経緯がありますが、
もっとスマートな方法がないものかと思いまして・・・。お知恵をお貸しください。
まんじろ様
情報ありがとうございます。
トレンドマイクロ社に製品について問い合わせてみます。
きっさん様
ありがとうございます。
ポートを監視・ブロックまでするセキュリティソフトだと大変ですね。
AVGのアンインストールも確実にできるのか保証はないですし、だんだん気が重くなってきました・・・。
[ Generated in 0.009 seconds, 7 queries executed - Memory usage: 704 KiB (Peak: 757.78 KiB) ]