みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
はじめまして、ファイルメーカーでスクリプトを作ったのですが、良く分からない現象が起きたので相談に参りました。
約200レコード程のデータベースなのですが、
1、とあるフィールドをコピー
2、検索モードに切り替え
3、とあるフィールドに貼り付け
というような作業をループして繰り返すスクリプトなのですが、10レコードに1度くらいのペースで、
「指定された検索条件は有効ではありません。…」
というエラーメッセージが出ます。
しかし、「続行」ボタンで強引に進むと、作業は問題無くされています。
毎度毎度、このスクリプトを実行するたびに続行ボタンを連打しているので、原因を探っています。
エラーのタイミングは「3、とあるフィールドに貼り付け」の所だと思うのですが、良く分かりません。
どなたかピンときた方、何卒宜しくお願いします。
追記です
エラーの内容は「指定された検索条件は有効ではありません。次の作業に進む前に有効な検索条件を入力して下さい。」が、フルメッセージです。
バージョンはPro12です。宜しくお願いします。
フィールドが空か、検索演算子が含まれてるとかでは?
コピペしないでも「一致する値を検索」というステップもあります。
ご解答ありがとうございます。
しかしながらフィールドには値があり、計算演算子も含まれておりません。
具体的に、以下のようなスクリプトです。
やりたい事としては、200レコードあるデータベースの、
あるフィールドの値を「ファイル名」フィールドの名前をつけてHTMLファイルとして全てエクスポートしていく、という内容です。
上手いやり方が分からなかったので、下記のような感じで、
「出力ナンバー」フィールドにレコード番号を取り出し、
「出力ナンバーNEXT」フィールドに、「出力ナンバー + 1」の値を入れ、
「出力ナンバー最大値」フィールドに、「出力ナンバー」フィールドの最大値を入れ、
「出力ナンバーNEXT」フィールドが「出力ナンバー最大値」の値を上回ったらループ終了
という方法で実現しています。
-----------------------------------------------------
全レコードを表示
レコード/検索条件/ページへ移動[最初の]
Loop
フィールド設定[出力ナンバー;Get(レコード番号)]
フィールド設定[出力ナンバーNEXT;出力ナンバー+1]
レコード/検索条件/ページへの移動[次の;最後まできたら終了]
End Loop
フィールド設定[出力ナンバー最大値;Max(出力ナンバー)] ←このフィールドはグローバルフィールドです
検索実行[出力ナンバー = 1]
Loop
変数を設定[$$ページ保存先;値:"filewin:" & Get ( ドキュメントパス ) & ファイル名 & ".html"]
レコードのエクスポート[ダイアログなし;「$$ページ保存先」]; Unicode(UTF-8)]
Exit Loop If[出力ナンバーNEXT > 出力ナンバー最大値]
コピー[選択;出力ナンバーNEXT]
検索モードに切り替え[]
貼り付け[選択;出力ナンバー] ← ここでエラーメッセージが出る場合と出ない場合がある
検索実行[]]
End Loop
-----------------------------------------------------
原因以外にも、他にスマートな方法がございましたら是非ご教授願いたいです。
どうぞ宜しくお願いします。
前半は、フィールド値の全置換で済むでしょう。
そのレコード数を変数へ保存しておき、その変数でレコードを検索(検索条件に変数を使っておけば、1行で済みます)し、レコードをエクスポート、変数を1減らして繰り返し、変数が0になれば終了、とすれば良いはずです。
スクリプトそのものは、大きな問題がある様には見えず、エラーが出る原因は推定できませんね。
Offline
検索実行
の前でスクリプトを止めると、
検索条件が見られますよ。
それで原因が分るかも。
スクリプトの考え方はShinさんに賛成ですネ
「出力ナンバーNEXT」フィールド、
「出力ナンバー最大値」フィールド
ともに不要になります。
Offline
Shin様 チポ様
コメントありがとうございます。
大変勉強になります。
>>検索実行
>>の前でスクリプトを止めると、
>>検索条件が見られますよ。
スクリプトの一時停止を検索実行直前に入れて試してみました所、
なぜか「貼り付け」をする前に「検索実行」をしてしまう事があるようです、、
「続行」を連打していると、たまに貼り付けが間に合わず先に検索をしてしまうという、、
こんな事ってあるのでしょうか、、?
どちらにせよ、Shin様よりご提案頂きましたスクリプトに書き換えれば、
このような問題も無くなると思います。
しかし、分からない事がありまして、
私が「変数」というものをあまり使用した事が無く、
設定した変数から1引く、という作業をどのように設定すれば良いのか分かりません。
以下、現在設計中のスクリプトです。
-----------------------------------------------------
全レコードを表示
フィールド内容の全置換[出力ナンバー;Get( レコード番号 )]
フィールド設定[出力ナンバー最大値格納テーブル::出力ナンバー最大値;Max( メインテーブル::出力ナンバー )]
変数を設定[$$検索出力ナンバー; 値:出力ナンバー最大値格納テーブル::出力ナンバー最大値]
Loop
検索実行[ 出力ナンバー = $$検索出力ナンバー ]
変数を設定[$$ページ保存先;値:"filewin:" & Get ( ドキュメントパス ) & ファイル名 & ".html"]
レコードのエクスポート[ダイアログなし;「$$ページ保存先」]; Unicode(UTF-8)]
Exit Loop If[$$検索出力ナンバー = 1 ]
※※※ ここで$$検索出力ナンバーから1引きたい ※※※
End Loop
-----------------------------------------------------
このような場合、どのような設定をすれば良いのでしょうか?
何卒宜しくお願いします。
「続行」を連打していると、たまに貼り付けが間に合わず先に検索をしてしまうという
あり得ないでしょう。
連打では検索条件を見られないですよね。
1ステップずつ、検索条件を見てそれが正しく入力されているかを確認するために止めるんですよ。
新しいスクリプトですが、
フィールド設定[出力ナンバー最大値格納テーブル::出力ナンバー最大値;Max( メインテーブル::出力ナンバー )]
このフィールド、不要でしょう。
全レコードですから、
Get ( レコード総数 )
で得られますから、
これを変数の初期値にして、-1ずつLoopすればいいですね。
-1は
変数 = 変数 - 1
とします。
Offline
「貼り付け」をする前に「検索実行」をしてしまう
貼り付けはUI上の操作なので、ありえないこともないのでは。
「変数を設定」でもできますけど、この場合Ifの中で設定することもできる。
Exit Loop If[Let ($$検索出力ナンバー = $$検索出力ナンバー - 1 ; $$検索出力ナンバー ) = 0 ]
昔はこういう比較では=を使うなと言われたものですが、FMではいいかな
そうか、それが原因かも!
それなら、
貼り付け
の次に
スクリプト一時停止[0.1秒?]
入れてみたらいいかな。
Offline
チポ様 scripter様
ご解答ありがとうございます。
ご教授頂きました通り設定しましたところ、
エラーが無くなっただけでなく、処理速度も格段に向上しました。
本当にありがとうございます。
変数の使い方などを知り、
今後ファイルメーカーを触るのがますます楽しくなりそうです。
コメント頂けた皆様、本当にありがとうございました!
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 546.02 KiB (Peak: 566.55 KiB) ]