みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
お世話になります。
ExecuteSQL関数で、WHERE句で参照する先がマルチキーフィールド(複数の値が改行区切りで存在)の場合、最初の値のみが照合されます。
これはそういった仕様で、ファイルメーカーの通常のリレーションのように、入力されているいずれかの値と照合させることはできないのでしょうか?
ご教示、よろしくお願いいたします。
Last edited by k16 (2023-01-14 18:20:30)
Offline
SQLにマルチキーという概念はないので、フィールド値全体が照合されるはずですが...
「照合」というのはどうやって書いてますか?
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
Last edited by k16 (2023-01-15 09:36:49)
Offline
WHERE句で、like とワイルドカードを使ったりするんですかね?
試してみます。
Last edited by k16 (2023-01-15 09:42:40)
Offline
「出勤従業員IDリスト」 を使わずに「従業員出勤明細」を使えばいいのでは。
LIKEでもできるかもしれませんけど、索引が使えないので無駄に遅くなりそうです。
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さん、改めてありがとうございました!
Last edited by k16 (2023-01-15 18:49:26)
Offline
>$StaffID="'%" & 従業員ID & "%'"
ここに余計なシングルクオートがあるせいでは?
この場合はリスト値の桁数が固定なのでいいかもしれませんが、「りんご」を検索しようとしても「青りんご」もヒットしてしまうので、一般的には無理があります。
himadaneeさん、一般的な使用に関するご注意もありがとうございます。
>ここに余計なシングルクオートがあるせいでは?
はい、↓のようにシングルクオートが無いものも試したのですが、結果は同じでした。
$StaffID="%" & 従業員ID & "%"
ちなみに、『Claris FileMaker SQLリファレンスガイド』の記載例を見てシングルクオートが必要と思ったのですが、無くても大丈夫なのでしょうか?
https://help.claris.com/ja/sql-reference.pdf 29ページ
Offline
そのリファレンスの記述は単にSQLの構文(テキスト定数は''で囲む)なので、ExecuteSQL関数の第3パラメータの使い方は書いてないですよね。
関数ヘルプの例2を見てください。
https://help.claris.com/ja/pro-help/con … tesql.html
フィールド参照を直接引数に指定してるので、''が不要なのは明らか。
それと、ここの記号が違いますね
> A.\”曜日番号\” = ?
”が2バイト文字になってます。結果が得られないというよりSQL文自体がエラーになってませんか?
himadaneeさん、関数ヘルプ2のご提示、ありがとうございます。
> フィールド参照を直接引数に指定してるので、''が不要なのは明らか。
すみません、こちらは " ではなく、' が不要という理解であっていますか?
また、2バイト文字誤用の点も発見していただき、ありがとうございます。
問題点を探るため、式を以下のように単純にしてみたところ、ちゃんと意図通りに動作しました。
__________________________________________
Let([
$StaffID="%" & 従業員ID & "%"
;
#SQL=
ExecuteSQL (
"
SELECT COUNT (DISTINCT \"Date\")
FROM \"タイムカードDB\" A
WHERE
A.\"出勤従業員IDリスト\" LIKE ?
"
; "" ; "" ; $StaffID )
];
#SQL
)
__________________________________________
ここから、気をつけて他の条件を足していきます。
himadaneeさん、本当にありがとうございました!
Offline
[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 595.46 KiB (Peak: 612.37 KiB) ]