みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
Windows7 FM12Proです。
あるテーブルの計算フィールドにあるテーブルから条件にあった値を持って来たいと考えています。
以下、テーブルとフィールドです。
テーブル:生徒
フィールド:
生徒No(数字)
氏名(テキスト)
ランク(計算)←ランクテーブルから昇降格日が最新のランクを入れたい
昇降格(計算)←ランクテーブルから昇降格日が最新の昇降格を入れたい
昇降格日(計算)←ランクテーブルから最新の昇降格日を入れたい
テーブル:ランク
フィールド:
生徒No(数字)
ランク(数字)
昇降格(テキスト)"昇格"、"降格"
昇降格日(日付)
この二つのテールブルは生徒Noフィールドでリレーションを結んでいます。
ExecuteSQL関数を使えば良いのかと思い、試しに、生徒テーブルのランクの計算式として、以下を指定してみましたが、計算式が間違っているのか「?」と表示されてしまいます。
ExecuteSQL ("
SELECT ランク
FROM ランク
WHERE 生徒no = ? AND
昇降格日 = (
SELECT MAX(昇降格日)
FROM ランク
)
" ; "" ; "" ; 生徒No )
何が問題なのでしょうか?
あるいはもっと良い可決方法がありましたらご教授ください。
なお、この式だけでは無理なのは分っていますが、本当はもしランクテーブルに対応したレコードが一件もない場合は、生徒テーブルの三つの計算フィールドはブランクにしたいと思っています。
よろしくお願いします。
リレーションのランク側に昇降格日で降順ソートを設定すれば、ランク::フィールド名 で最新データを参照できます。
ExecuteSQLでは、英数以外のテーブル/フィールド名は””で囲む必要があります。
WHERE条件にサブクエリが使えたかな?
Offline
リレーションのランク側に昇降格日で降順ソートを設定すれば、ランク::フィールド名 で最新データを参照できます。
できました。この方が単純で楽ですね。
この件は、この方法で解決したいと思います。ありがとうございました。
ExecuteSQLでは、英数以外のテーブル/フィールド名は””で囲む必要があります。
WHERE条件にサブクエリが使えたかな?
そうだったんですね。見落としていました。
ただ、その部分を修正して試してみたのですが、どうもうまく行きません。
例えば、以下の様に、同じ「生徒No」で最大の「昇降格日」を持ってくるという至極単純なものもうまくできませんでした。
ExecuteSQL ("
SELECT MAX(\"昇降格日\")
FROM \"ランク\"
WHERE \"生徒No\" = ?
" ; "" ; "" ; 生徒No )
どこに間違いがあるでしょうか?
自己解決しました。
FROMの後にテーブルオカレンスではなくてテーブル名を直接指定しようとしていたこと、リレーションシップグラフを操作するときにランク(テーブル)を別名のオカレンス名にしていたことが原因でした。
なのでこれを同名にしたところうまく行きました。
また、サブクエリを使った以下の計算式も正常に動作しました。
ExecuteSQL ("
SELECT \"ランク\"
FROM \"ランク\"
WHERE \"生徒no\" = ? AND
\"昇降格日\" = (
SELECT MAX(\"昇降格日\")
FROM \"ランク\"
WHERE \"生徒no\" = ?
)
ありがとうございました。
Pages: 1
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 553.38 KiB (Peak: 581.31 KiB) ]