みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
こんにちは。質問させて下さい。
[使用環境]
Windows7 FM12 adv
条件からランダムに商品番号を一定数取得したいのですが
[フィールド]
商品番号 (A001~A999等)
ブランド名 (A社やB社等)
在庫状況 (有 or 無)
取得フィールド
この4つのフィールドがあり、例えば1つのレコードの商品番号 A234 のブランド名がB社だった場合、
レコード自身のブランド名(B社)+在庫が「有」のものを検索し、検索された結果からランダムに5つのみ選択し、
取得フィールドに選択した5つの商品番号をスペース区切りで取得する事は可能でしょうか?
(例)A234はB社ブランド → B社で在庫「有」を検索 → ランダムに5つ選択 → 取得フィールド=A099 A548 A425 A087 A221
取得フィールドは5つに分けて、まとめるフィールドに 取得1&" "&取得2&" "&取得3&" "&...
としても良いのですが、この自身のブランド名から検索し、結果をランダムに選ぶというやり方が出来ますでしょうか?
方法がありましたら教えて下さい。
お願いします。
対象レコードのレコード番号
Random*対象レコード数 + 1
の商品番号を得る。
これを5回繰り返せばいいのでは。
重複を避ける工夫が必要ですね。
Last edited by チポ (2013-11-29 15:37:23)
Offline
チポさん ご回答ありがとうございます。
回答を参考にし、スクリプトを作っているのですが、
(計算式の作り方が解らなかったのでスクリプトで試してみました)
一致するレコードを検索 [絞込み ; ブランド名]
対象レコードの絞込み ←在庫が「有」のもので絞込み
ここまでは出来たのですが、この後は具体的にどのようにしたらいいでしょうか?
Random*対象レコード数 + 1 が解りませんでした。
重複回避まで行くと私の知識では追いつかない気もするので、
妥協もありかなと思ってます。
↑の追記です。
また、絞込みをしたレコードから「商品番号」を表示するという計算式も解らないのですが
合わせて教えて頂ければ幸いです。
スクリプトステップ
レコードへ移動・計算式で指定
でその計算式
Random * Get ( 対象レコード数 ) + 1
( 小数が有りますが、実用上問題有りません )
とすれば、
対象レコードのうちランダムの一つに移動します。
そこで、
変数か、グローバルフィールドに商品番号を入力すればいいですね。
これを5回繰り返します。
重複を避けるには、そのレコードを対象外にすればいいでしょう。
Offline
チポさん ありがとうございます。
現在お教え頂いたようにしたところ、以下のようになっております。
全レコードを表示
一致するレコードを検索 [絞込み ; ブランド名] //(例)商品番号A234のレコードのB社で検索
対象レコードの絞込み //在庫が「有」のもので絞込み
レコード/検索条件/ページへ移動[ Random * Get ( 対象レコード数 ) + 1]
にてランダムの中から1つに移動というようになりました。
この後、商品番号のA234のレコードに移動した先の送品番号、例えばA525に移動した場合、
どのようにしてA234のレコードの[取得フィールド]にA525と記入することができますでしょうか?
>変数か、グローバルフィールドに商品番号を入力すればいいですね。
勉強不足な私にはこれが理解できませんでしたorz
対象レコードからランダムに選択するスクリプト
変数を設定 [$n; 値:5]
レコード/検索条件/ページへ移動 [最初の]
Loop
複数レコードを対象外に [Random * (Get ( 対象レコード数 ) - $n + 1 )]
レコード/検索条件/ページへ移動 [次の]
ウインドウ内容の再表示 []//状況の確認
Exit Loop If [Get ( レコード番号 ) = $n]
End Loop
If [Get ( 対象レコード数 ) > $n]
レコード/検索条件/ページへ移動 [次の]
複数レコードを対象外に [Get ( 対象レコード数 ) - $n]
End If
変数よりグローバルフィールドの方が分かりやすいかな。
テキストフィールド・グローバル格納(t_gとします)を一つ作り
そのレコードへ移動後のスクリプト
フィールド設定[t_g ; t_g & 商品番号 & " "]
これを繰り返せばいいですね。
ただし、このままでは最後にスペースがつきます。
それと、質問とは離れますが、、
> 全レコードを表示
> 一致するレコードを検索 [絞込み ; ブランド名] //(例)商品番号A234のレコードのB社で検索
一致するレコードを検索[置換]
とすればその上の
全レコードを表示
が不要になります。
finderさん
> レコード/検索条件/ページへ移動 [最初の]
> Loop
> 複数レコードを対象外に [Random * (Get ( 対象レコード数 ) - $n + 1 )]
最初のレコードから複数レコードを対象外
になりますから、これはランダムとは言えないでしょう。
Offline
検索で絞られたレコードがいくつあって、ランダムに取り出す回数も目的も分かりませんが
検索後に新たに作ったフィールドをRandomで全置換して、そのフィールドでソート?して
先頭から5レコード取り出す位でいいのでは。
Offline
>最初のレコードから複数レコードを対象外
その数がランダムで0を含んでるので、最初のレコードが残る場合もちゃんとあります。
「残すレコードをランダムに選択して、その手前までを対象外にする」操作です。
でも、目的が「選択」でなく「番号のリスト化」だから、わかりにくいだけかな。
ランダム = 無作為
ですから作為が有れば非ランダムとなります。
実例を挙げましょう。
今、10レコード有ってそのうち5レコードをランダムに選択するとします。
各レコードは50%の確率で選択されますよね。
ここで、finderさんの方法を使うと、
1回目の選択では
レコードの並び順に0〜5レコードが対象外になりますから、
1番のレコードが残る確率は20%、
80%の確率で対象外になってしまいます。
FMでは、レコードの並び順に作為が有りますから、
これはランダムとは言えないですよね。
旅人さんの方法は、
その並び順を無作為にしていますね、それで十分か^^
Offline
間違えた、
> レコードの並び順に0〜5レコードが対象外になりますから、
> 1番のレコードが残る確率は20%、
> 80%の確率で対象外になってしまいます。
0〜5の6通りですから、
残る確率は16.66%
対象外には83.33%の確率ですね。
Offline
ああ。最初に選択したのを最小とみなしてるから均等にならないんですね。がっくり。
そしたら、取得フィールド(グローバル)に選択した5つの商品番号をスペース区切りで入れる全置換の式
Let ( [
R = Get ( レコード番号 ) ;
$n = Case ( R = 1 ; 5 ; $n ) ;
L = List ( Case ( R > 1 ; 取得 ) ; Case ( Random < $n / ( Get ( 対象レコード数 ) - R ) ; Let ( $n=$n-1 ; 商品番号 ) ) )
] ;
Case ( R = Get ( 対象レコード数 ) ; Substitute ( L ; ¶ ; " " ) ; L )
)
ご返信遅くなり申し訳ございません。
皆様ご回答ありがとうございます。
今からお教え頂いたものを試してみます。
また結果の方書かせていただきますが、取り急ぎお礼のため書き込ませて頂きました。
理解不足からか上手くいきません・・・。
現在スクリプトで以下のようになっております。
そのまま t_g というグローバルフィールドを作りました。
一致するレコードを検索 [置換 ; ブランド名] //(例)商品番号A234のレコードのB社で検索
対象レコードの絞込み //在庫が「有」のもので絞込み
レコード/検索条件/ページへ移動[ ダイアログなし ; Random * Get ( 対象レコード数 ) + 1]
フィールド設定 [ t_g ; t_g & 商品番号 & " " ]
5回 Loopするやり方が色々としても解らなかったのでとりあえず手動でスクリプト5回起動してみました。
結果的に同じブランド名のレコードにジャンプして t_g にそのレコード自体の商品番号を記入と
スクリプトを実行する毎に半角スペース区切りで入っていきました。
やりたい事は類似商品の商品番号をスペース区切りで5つ入れたいので、
5回繰り返し、このt_gに入ったものを元のレコードに移動して、
他の例えば「類似商品番号フィールド」を作り t_g をコピーし、コピーし終わったら
グローバルフィールドの t_g の内容を削除し次のレコードに移るといった感じでしょうか?
またfinderさんの取得フィールド(グローバル)に選択した5つの商品番号をスペース区切りで入れる全置換の式
でも試してみましたが、ブランド名の条件で絞り込んだあとに
計算結果を挿入にてやってみましたが、記入はされませんでした。
理解力不足にて申し訳ありません。
どこがいけないかご教授頂ければ幸いです。
旅人さんの方法が簡単ですよ。
トレーニングのために続けますか、、
Loopのスクリプトの一例です
//検索後
変数 = 1
Loop
レコード/検索条件/ページへ移動[ ダイアログなし ; Random * Get ( 対象レコード数 ) + 1]
Exit Loop If [変数 = 5]
フィールド設定 [ t_g ; t_g & 商品番号 & " " ]
レコードを対象外に
変数 = 変数 + 1
End Loop
フィールド設定 [ t_g ; t_g & 商品番号 ]
これでt_gに商品番号が5つ入ります。
その先は私には理解できていません。
Offline
必要なレコードを対象にした状態(検索絞込みした後)フィールド内容の全置換で使う計算式です。
ご回答からやっと理解ができて、思ったように出来るようになりました。
チポさんの方のループのやり方でも出来ましたし、
finderさんの計算での全置換のやり方でも出来ました。
また旅人さんの方法が簡単というのもやっと理解ができました。
お手数お掛けしましたが、本当にありがとうございました。
Pages: 1
[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 604.98 KiB (Peak: 621.52 KiB) ]