みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
Win7 FM12です。
以下のようなことはできるのでしょうか。
フィールド1 に ABCDEFG と入っています。
値一覧に
A
B
C
とある場合、スクリプトでフィールド1を DEFG と置換。
現在テストできる状況にないため質問させていただきました。
よろしくお願いいたします。
一文字単位で消すのですか、つまり
一覧が
A
B
D
だった場合は?
Offline
旅人様 ありがとうございます。
CEFG となります。
実際には一文字ではなく、文字数はランダムです。
よろしくお願いいたします。
GetValue関数とValueListItems関数で値一覧の1行ずつを取り出して
それぞれをSubstitute関数で""に置き換える。
Offline
あ、スクリプトでしたね。
フィールド1を次の式でフィールド設定する。(値一覧が3行の場合)
Substitute ( フィールド1 ;
[GetValue ( ValueListItems (Get ( ファイル名 ) ; "その値一覧名" ) ; 1);"" ] ;
[GetValue ( ValueListItems (Get ( ファイル名 ) ; "その値一覧名" ) ; 2);"" ];
[GetValue ( ValueListItems (Get ( ファイル名 ) ; "その値一覧名" ) ; 3);"" ]
)
Offline
旅人様 ありがとうございます。
理解は出来ました。
値一覧を使用ユーザーに操作してもらうた
その都度フィールド設定を修正できません。
何か自動化できないでしょうか。
自分では思いつかず…
よろしくお願いいたします。
修正したいのはどの部分ですか?
Offline
フィールド1を次の式でフィールド設定する。(値一覧が3行の場合) → 3行がかなり増減する。
Substitute ( フィールド1 ;
[GetValue ( ValueListItems (Get ( ファイル名 ) ; "その値一覧名" ) ; 1);"" ] ;
[GetValue ( ValueListItems (Get ( ファイル名 ) ; "その値一覧名" ) ; 2);"" ];
[GetValue ( ValueListItems (Get ( ファイル名 ) ; "その値一覧名" ) ; 3);"" ] → そのためこのフィールドをいちいち修正できない。
)
といったかんじです。
よろしくお願いいたします。
値一覧名が固定が条件ですが、一覧の中身が変動するということでしたら
一度にSubstituteするのではなく、最初に変数を1にして一覧の1行目でSubstitute
次に変数を+1して一覧の2行目でSubstitute・・・・をLoopしたらいいはず。
Loopを抜けるのは値一覧の行数をValueCountして変数の値と比較しながら。
Offline
ありがとうございます。
なんとなく見えました。
テスト可能な環境になったら組んでみます。
ありがとうございました。一旦解決とさせていただきます。
フィールド設定[そのフィールド ; 下の式]
Let (
[
$vl = ¶ & ValueListItems ( Get ( ファイル名 ) ; "値一覧" ) & ¶ ;
$vt = Substitute ( "Substitute ( $vl ;[ \"\¶" & テーブル::フィールド & "\¶\" ; \¶ ])" ; [ ¶ ; "\¶\" ; \¶ ];[ \"\¶" ] )
] ;
Evaluate ( $vt )
)
でいいかも
https://dl.dropboxusercontent.com/u/926 … 36.fp7.zip
旅人さんの式だと、値一覧の1項目が、他の1項目に内包される(例えば、"A","AB"という場合などに誤動作するかも)
Last edited by Shin (2015-05-17 16:19:12)
Offline
Shin様
ありがとうございます。
テストしたところ、値一覧に登録したキーワードが
全てフィールドに現れただけで、希望する動作をしませんでした。
フィールド1の内容が
値一覧のキーワードA
値一覧のキーワードB
値一覧のキーワードC
値一覧のキーワードD
と改行されて出力されてしまいました。
よろしくお願いいたします。
サンプルファイルでも動きませんでしたか?
Windowsでしたら、エスケープ文字を変更する必要が有ったかも。\を¥に変更してみてください。
Offline
ループ計算式で求める例、
(ただし、値一覧の値の件数は最大でも大凡250件を超えないこと、超過すると?が返る式例)
Let([
$txt=フィールド1;
$lst=ValueListItems(Get(ファイル名); "その値一覧名");
$i=0;
$fnc=
"Case($i=ValueCount($lst)
; $txt
; Let([
$i=$i+1;
$itm=GetValue($lst;$i);
$txt=Substitute($txt; [$itm;\"\"])
]; Evaluate($fnc))
)"
];
Evaluate($fnc)
)
Offline
お世話になっております。
Shin様
サンプルファイルも拝見いたしましたが
どのように流用すればよいか、分かりませんでした。
\を¥に変更も試しましたが挙動は同じでした。
私の力不足です。
Hiro様
希望する動作を確認いたしました。
値一覧が現時点で210ありましたので、
若干不安ではあります。
ある程度の数(500~1000程度)まで
許容できればありがたいのですが…
もし案がございましたらお手数ではございますがよろしくお願いいたします。
サンプルファイルでの動作はいかがでしたか。(今、周囲にWindows環境が無いので)
私のやり方でしたら、数千程度は大丈夫なはずです。
組み込むのはどのようなファイルなのでしょうか。変更する点は、フィールド設定の設定先と、式の中の一部ですが。Hiroさん風に書き直すと、
Let (
[
$txt = フィールド1 ;
$lst = ValueListItems ( Get ( ファイル名 ) ; "その値一覧名" ) ;
$vl = ¶ & $lst & ¶ ;
$vt = Substitute ( "Substitute ( $vl ;[ \"\¶" & $txt & "\¶\" ; \¶ ])" ; [ ¶ ; "\¶\" ; \¶ ];[ \"\¶" ] )
] ;
Evaluate ( $vt )
)
になります。
Last edited by Shin (2015-05-19 15:29:08)
Offline
値一覧の項目数が最大1000項まで計算可能な式。
式は入れ子のループ計算式で、値一覧を200項づつのユニットに分けて分散処理する。
値一覧の項目数が大きいので、処理速度の向上を図るためSubstitute関数での一発処理(実行ルーチン$sub)に前式を改善。
1000項までの制限はこのSubstitute関数の最大引数制限による。
Let([
$unt=200;
$vl=ValueListItems(Get(ファイル名); "その値一覧名");
$vct=ValueCount($vl);
$j=0;
$elm=";[\"<<itm>>\";\"\"]";
$res="";
$fnc=
"Case($vct<=$unt*$j; $res;
Let([
$lst=MiddleValues($vl;$unt*$j+1;$unt);
$n=ValueCount($lst);
$i=0;
$res=$res & Evaluate($sub);
$j=$j+1
]; Evaluate($fnc))
)";
$sub=
"Case($i=$n; $res;
Let([
$i=$i+1;
$itm=GetValue($lst;$i);
$prm=Substitute($elm;[\"<<itm>>\";$itm]);
$res=$res & $prm
]; Evaluate($sub))
)"
];
Evaluate("Substitute(フィールド1" & Evaluate($fnc) & ")")
)
Offline
Shin様
サンプルファイルも拝見いたしましたが
どのように流用すればよいか、分かりませんでした。
式の結果は ? となります。
出力したいフィールドに計算式で設定しています。
Hiro様
新しくご教示いただいた式ですと
反応しませんでした。
どこがおかしいのかが私では理解できず…
大変申し訳ございませんがよろしくお願いいたします。
掲載式をコピーして動作テストしてみましたが、正常に動作しています。
「200」以外の青色文字の箇所は自己の名称と差換えてますよね?
Offline
横から失礼します。
?になるのは、フィールド名もしくは値一覧名を変更し忘れているのではないでしょうか。
Hiroさんの新しい式も私の環境(Win8.1・FM12)では動いたので、式内のフィールド名や値一覧名を確認してみてはどうでしょう。
Win環境なのでShinさんの式を試してみましたが、前後に改行のついた値一覧のリストが結果として返ってきますね。
WinとMacでは何か違うものなんでしょうか……。
式の意味がわからなかったので、式を分解していくつかのフィールドに分けていじってみたところ、↓のようにすれば私の環境ではいけました。
(何故いけたのかは理解していませんが;;)
Let (
[
$txt = フィールド1 ;
$lst = ValueListItems ( Get ( ファイル名 ) ; "その値一覧名" ) ;
$vl = ¶ & $lst & ¶ ;
$vt = Substitute ( "Substitute ( $txt ;[ \"\¶" & $vl & "\¶\" ; \"\" ])" ; [ ¶ ; "\" ; \¶ ];[ \"" ] )
] ;
Evaluate ( $vt )
)
皆様
まことにありがとうございます。
無事動作いたしました。
もちろんコードの書き換えは行っていたのですが、
置換したい元フィールドを1とし
吐き出すフィールド(計算結果のフィールド)を2とした場合
1を確定してやらないと2に反映されませんでした。
なので1を全置換し、完了しました。
ありがとうございました。
Pages: 1
[ Generated in 0.019 seconds, 9 queries executed - Memory usage: 566.25 KiB (Peak: 587.16 KiB) ]