みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
FMPadv15 Win10です.
俳句データベースで作者別の検索を考えています.
検索レイアウトで、氏名フィールド(ドロップダウン)の値一覧から選びレコードを抽出するのですが
この値一覧にデータベーステーブルの氏名フィールドを使った値一覧では、単に日本語(50音順?)になります。
氏名には出現度数の多い人から、1回しか出現しない多くの人まであります。
これは使い勝手が悪く、値一覧を出現度数順に表示したいのです.
別に「値一覧用テーブル」みたいなものを作って、List関数など使い、
氏名ごとに、出現度数を計算式で表し、度数で降順ソートみたいなことを試みましたが、うまくいきません.
動的値一覧というのでしょうか、ご教示お願いいたします.
Offline
値一覧を指定順で表示させるには、2番目のフィールドを表示させ、
その2番目フィールドに表示順位を入れておき、それにソート設定します。
・ここで注意は、
値一覧は「昇順」ソートしか出来ない事です。そのため、
2番目フィールドの値を大小関係を倒置しなければならない事です。
(※順番値を負数にするのが簡単です。)
・次の注意は、
2番目フィールドでソートすると、1番目フィールドの値はその2番目フィールド値でソート丸めされ、ユニークな一意値になってしまうことです。これを防ぐためには、順番に何かしらの固有付けが必要です。
(※「あ」で2番目ソートすると、あ行の作者たちの中の1名だけリストされます。)
「ID」計算フィールド(式:Get(レコード ID))を作る。
「度数ID」計算フィールドを作る。その式は、(※計算結果:数値タイプ、非保存)
Let([
#cnt=ExecuteSQL(
"SELECT COUNT(*) FROM ""マスタテーブル"" WHERE ""人名""=?"
; ""; ""; 人名);
#id=ID/10^Length(ID)
];
(#cnt+#id)*(-1) + Left(人名 & 頭文字;0)
)
「頭文字」キーに自己リレーション「マスタテーブル 2」を張る。
目的の動的値一覧「関連作者値一覧」を設定する。
・最初の値 → 「マスタテーブル::作者名」
・2番目の値 → 「マスタテーブル::度数ID」
・関連テーブルの指定 → 「マスタテーブル 2::」
・ソートフィールドの指定 → 「◎2番目のフィールド」
簡単な設定サンプルを添付しておきます。
●「集計順値一覧.fmp12」→ ダウンロード
(※値一覧は右端の「頭文字」フィールドに仕掛けてあります。)
+++++++++
2番目表示を暗視化する#4方式に改修したv1サンプルを一応新規アップしときます。
(※解説は#4をご覧ください。)
●改修版サンプル「集計順値一覧v1.fmp12」→ https://1drv.ms/u/s!AlaCGhTKTWEOqA3C-7K … l?e=IOmUEf
Last edited by Hiro (2020-05-13 00:05:33)
Offline
Hiroさん、いつも高級なご教示ありがとうございます。
Let計算式はなかなか理解できませんが、なんとか挑戦してみます。
サンプルありがとうございます。
「値一覧は右端の「頭文字」フィールドに仕掛けてあります。」で表示されるのは
すべての人名で、目的のものとは異なります。
出現度数順に
あうう
あいい
あああ
かかか
と表示してほしいのです.
厚かましいのですが、よろしくご教示お願いいたします.
Offline
何時も乍ら、早とちりした様で申し訳ありません。
>#1の「探すのが大変!」と「動的値一覧!」と「あいうえお順!」いう暗示から、
頭文字で絞り込みの動的値一覧とてっきり思い込んでしまった様です。
一括リストで良いなら、むしろ非常に簡単で、理想の形で実装できますネ。
主なポイントは、
度数を暗視文字列(ゼロ幅フォント)へ変換利用することで、
ソート目的の2番目フィールド表示をブラインド化します。
(※参照→関連過去ログ:#1305番、#1728番)
システムに追加するのは、「暗視_度数ID」計算フィールドただ一つです。
度数を暗視コード変換する、2番目表示フィールド用で、
その式は、(※FMバージョンによる値一覧の仕様違いに対応してます)
/**** 集計度数とレコードIDを暗視文字コード変換する関数式 ****/
//(※索引の文字コードは → 「Unicode」 へ変更が必須)
//(※ゼロ幅フォントなので計算結果は見えません、計算結果:「テキスト」タイプ指定)
//(※度数の最大桁数を仮に3桁として)
Let([
#hit= //集計度数を降順の暗視文字コードへ変換
Substitute(
Right(Substitute(10^3-1;9;0)& Count(マスタテーブル 3::人名); 3)
;[9;Char(8203)]
;[8;Char(8204)]
;[7;Char(8205)]
;[6;Char(8206)]
;[5;Char(8207)]
;[4;Char(8234)]
;[3;Char(8235)]
;[2;Char(8236)]
;[1;Char(8237)]
;[0;Char(8238)]
);
#id= //レコードIDを昇順の暗視文字コードへ変換、※複数同順混在で、FM13か14?以前のバージョンに必須※
Substitute(
Right(Substitute(10^6-1;9;0)& Get(レコード ID); 6)
;[0;Char(8203)]
;[1;Char(8204)]
;[2;Char(8205)]
;[3;Char(8206)]
;[4;Char(8207)]
;[5;Char(8234)]
;[6;Char(8235)]
;[7;Char(8236)]
;[8;Char(8237)]
;[9;Char(8238)]
)
];
#hit & Case(Get(アプリケーションバージョン)*1<14; #id) //← #id は、FM14?未満のバージョンに必須
)
上式で注目は、集計度数「昇順数字」を「降順文字」へ置換えて順位の倒置転換を実施している点です。
また、同順位に対する2番目フィールドソートの値一覧の仕様がFM14?以降で変更されたのに対応させています。
その次の注意点は、式の計算結果は非保存となり、値一覧の引数値に使えない事です。
これをすり抜ける裏技は、デカルト積[X]リレーションを組みそれの動的値一覧として値一覧設定することです。
(※この設定中に「設定不可の警告」が出ますが、無視して構いません。動作的にはOKですから!)
文章説明は苦手なので、これ以上は簡単な設定サンプルを添付しておきますので、ご覧ください。
内容が大幅に違うので別サンプルv2としました。かなり進化・簡素化したと思います。
※新サンプル「集計順値一覧v2.fmp12」 → ダウンロード
+++++++++++
例:(ID) 人名
(1) あああ
(2) あいい
(3) あいい
(4) あうう
(5) あうう
(6) あうう
(7) かかか
(8) あええ
↓
(4) あうう (降順3度)
(2) あいい (降順2度)
(1) あああ (降順1度、3者同位ID昇順)
(7) かかか (降順1度、3者同位ID昇順)
(8) あええ (降順1度、3者同位ID昇順)
Last edited by Hiro (2020-05-13 00:27:27)
Offline
Hiroさま ありがとうございます.
計算式は難しくて理解できませんが、そのままコピーして使わせていただきます。
一応、解決とさせていただきます.
Offline
Pages: 1
[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 540.51 KiB (Peak: 557.8 KiB) ]